[U-Boot] [PATCH v3 03/13] fdtdec: Add fdt_{addr, size}_unpack() helpers

Thierry Reding thierry.reding at gmail.com
Fri Mar 22 08:31:17 UTC 2019


On Fri, Mar 22, 2019 at 03:53:00PM +0800, Simon Glass wrote:
> Hi Thierry,
> 
> On Fri, 22 Mar 2019 at 02:10, Thierry Reding <thierry.reding at gmail.com> wrote:
> >
> > From: Thierry Reding <treding at nvidia.com>
> >
> > These helpers can be used to unpack variables of type fdt_addr_t and
> > fdt_size_t into a pair of 32-bit variables. This is useful in cases
> > where such variables need to be written to properties (such as "reg")
> > of a device tree node where they need to be split into cells.
> >
> > Signed-off-by: Thierry Reding <treding at nvidia.com>
> > ---
> > Changes in v2:
> > - new patch
> >
> >  include/fdtdec.h | 25 +++++++++++++++++++++++++
> >  1 file changed, 25 insertions(+)
> >
> > diff --git a/include/fdtdec.h b/include/fdtdec.h
> > index a965c33157c9..a0ba57c6318b 100644
> > --- a/include/fdtdec.h
> > +++ b/include/fdtdec.h
> > @@ -23,6 +23,31 @@
> >   */
> >  typedef phys_addr_t fdt_addr_t;
> >  typedef phys_size_t fdt_size_t;
> > +
> > +static inline fdt32_t fdt_addr_unpack(fdt_addr_t addr, fdt32_t *upper)
> > +{
> > +       if (upper)
> > +#ifdef CONFIG_PHYS_64BIT
> 
> Could we use 'if IS_ENABLED()' instead?

Are you suggesting to use IS_ENABLED() in a preprocessor #if or a
compiler if (IS_ENABLED(...)) { ... } construct? For the former, yes we
could certainly do that.

The latter would probably work as well if we did something like this:

> > +               *upper = addr >> 32;

		*upper = upper_32_bits(addr);

where upper_32_bits() is a macro such as the one defined in Linux'
include/linux/kernel.h. That prevents the right-shift of 32 bits for
32-bit quantities to not produce a warning.

That said, I see that we already have that macro in U-Boot's kernel.h
header file, so I could switch to using that. With that I think we could
even leave out the conditional. The compiler would hopefully optimize it
(the upper_32_bits() invocation) out by itself.

I'll do some testing and respin if that works out.

Thierry

> > +#else
> > +               *upper = 0;
> > +#endif
> > +
> > +       return addr;
> > +}
> > +
> > +static inline fdt32_t fdt_size_unpack(fdt_size_t size, fdt32_t *upper)
> > +{
> > +       if (upper)
> > +#ifdef CONFIG_PHYS_64BIT
> > +               *upper = size >> 32;
> > +#else
> > +               *upper = 0;
> > +#endif
> > +
> > +       return size;
> > +}
> > +
> >  #ifdef CONFIG_PHYS_64BIT
> >  #define FDT_ADDR_T_NONE (-1U)
> >  #define fdt_addr_to_cpu(reg) be64_to_cpu(reg)
> > --
> > 2.21.0
> >
> 
> Regards,
> Simon
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190322/bcb0f362/attachment.sig>


More information about the U-Boot mailing list