Message ID | 20200724100856.1482324-2-sr@denx.de |
---|---|
State | Superseded |
Delegated to: | Stefan Roese |
Headers | show |
Series | arm: Introduce Marvell/Cavium OcteonTX/TX2 | expand |
On Fri, 24 Jul 2020 at 04:09, Stefan Roese <sr@denx.de> wrote: > > From: Suneel Garapati <sgarapati@marvell.com> > > Add fdtdec_get_pci_bus_range to read bus-range property > values. > > Signed-off-by: Suneel Garapati <sgarapati@marvell.com> > Cc: Simon Glass <sjg@chromium.org> > > Signed-off-by: Stefan Roese <sr@denx.de> > --- > > Changes in v1: > - Added return value description to function prototype in header > - Changed from using be32_to_cpup() to fdt32_to_cpu() > > include/fdtdec.h | 13 +++++++++++++ > lib/fdtdec.c | 16 ++++++++++++++++ > 2 files changed, 29 insertions(+) Reviewed-by: Simon Glass <sjg@chromium.org> Is the address always 32-bit? > > diff --git a/include/fdtdec.h b/include/fdtdec.h > index 760b392bdf..f6759c7f8e 100644 > --- a/include/fdtdec.h > +++ b/include/fdtdec.h > @@ -444,6 +444,19 @@ int fdtdec_get_pci_vendev(const void *blob, int node, > int fdtdec_get_pci_bar32(const struct udevice *dev, struct fdt_pci_addr *addr, > u32 *bar); > > +/** > + * Look at the bus range property of a device node and return the pci bus > + * range for this node. > + * The property must hold one fdt_pci_addr with a length. > + * @param blob FDT blob > + * @param node node to examine > + * @param res the resource structure to return the bus range > + * @return 0 if ok, negative on error > + */ > + > +int fdtdec_get_pci_bus_range(const void *blob, int node, > + struct fdt_resource *res); > + > /** > * Look up a 32-bit integer property in a node and return it. The property > * must have at least 4 bytes of data. The value of the first cell is > diff --git a/lib/fdtdec.c b/lib/fdtdec.c > index 78576b530f..0b40fa374a 100644 > --- a/lib/fdtdec.c > +++ b/lib/fdtdec.c > @@ -242,6 +242,22 @@ int fdtdec_get_pci_bar32(const struct udevice *dev, struct fdt_pci_addr *addr, > > return 0; > } > + > +int fdtdec_get_pci_bus_range(const void *blob, int node, > + struct fdt_resource *res) > +{ > + const u32 *values; > + int len; > + > + values = fdt_getprop(blob, node, "bus-range", &len); > + if (!values || len < sizeof(*values) * 2) > + return -EINVAL; > + > + res->start = fdt32_to_cpu(*values++); > + res->end = fdt32_to_cpu(*values); > + > + return 0; > +} > #endif > > uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name, > -- > 2.27.0 >
Hi Simon, On 28.07.20 21:01, Simon Glass wrote: > On Fri, 24 Jul 2020 at 04:09, Stefan Roese <sr@denx.de> wrote: >> >> From: Suneel Garapati <sgarapati@marvell.com> >> >> Add fdtdec_get_pci_bus_range to read bus-range property >> values. >> >> Signed-off-by: Suneel Garapati <sgarapati@marvell.com> >> Cc: Simon Glass <sjg@chromium.org> >> >> Signed-off-by: Stefan Roese <sr@denx.de> >> --- >> >> Changes in v1: >> - Added return value description to function prototype in header >> - Changed from using be32_to_cpup() to fdt32_to_cpu() >> >> include/fdtdec.h | 13 +++++++++++++ >> lib/fdtdec.c | 16 ++++++++++++++++ >> 2 files changed, 29 insertions(+) > > Reviewed-by: Simon Glass <sjg@chromium.org> > > Is the address always 32-bit? Yes, I think so. Its done in a similar way in the Linux kernel. Thanks, Stefan > >> >> diff --git a/include/fdtdec.h b/include/fdtdec.h >> index 760b392bdf..f6759c7f8e 100644 >> --- a/include/fdtdec.h >> +++ b/include/fdtdec.h >> @@ -444,6 +444,19 @@ int fdtdec_get_pci_vendev(const void *blob, int node, >> int fdtdec_get_pci_bar32(const struct udevice *dev, struct fdt_pci_addr *addr, >> u32 *bar); >> >> +/** >> + * Look at the bus range property of a device node and return the pci bus >> + * range for this node. >> + * The property must hold one fdt_pci_addr with a length. >> + * @param blob FDT blob >> + * @param node node to examine >> + * @param res the resource structure to return the bus range >> + * @return 0 if ok, negative on error >> + */ >> + >> +int fdtdec_get_pci_bus_range(const void *blob, int node, >> + struct fdt_resource *res); >> + >> /** >> * Look up a 32-bit integer property in a node and return it. The property >> * must have at least 4 bytes of data. The value of the first cell is >> diff --git a/lib/fdtdec.c b/lib/fdtdec.c >> index 78576b530f..0b40fa374a 100644 >> --- a/lib/fdtdec.c >> +++ b/lib/fdtdec.c >> @@ -242,6 +242,22 @@ int fdtdec_get_pci_bar32(const struct udevice *dev, struct fdt_pci_addr *addr, >> >> return 0; >> } >> + >> +int fdtdec_get_pci_bus_range(const void *blob, int node, >> + struct fdt_resource *res) >> +{ >> + const u32 *values; >> + int len; >> + >> + values = fdt_getprop(blob, node, "bus-range", &len); >> + if (!values || len < sizeof(*values) * 2) >> + return -EINVAL; >> + >> + res->start = fdt32_to_cpu(*values++); >> + res->end = fdt32_to_cpu(*values); >> + >> + return 0; >> +} >> #endif >> >> uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name, >> -- >> 2.27.0 >> Viele Grüße, Stefan
diff --git a/include/fdtdec.h b/include/fdtdec.h index 760b392bdf..f6759c7f8e 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -444,6 +444,19 @@ int fdtdec_get_pci_vendev(const void *blob, int node, int fdtdec_get_pci_bar32(const struct udevice *dev, struct fdt_pci_addr *addr, u32 *bar); +/** + * Look at the bus range property of a device node and return the pci bus + * range for this node. + * The property must hold one fdt_pci_addr with a length. + * @param blob FDT blob + * @param node node to examine + * @param res the resource structure to return the bus range + * @return 0 if ok, negative on error + */ + +int fdtdec_get_pci_bus_range(const void *blob, int node, + struct fdt_resource *res); + /** * Look up a 32-bit integer property in a node and return it. The property * must have at least 4 bytes of data. The value of the first cell is diff --git a/lib/fdtdec.c b/lib/fdtdec.c index 78576b530f..0b40fa374a 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -242,6 +242,22 @@ int fdtdec_get_pci_bar32(const struct udevice *dev, struct fdt_pci_addr *addr, return 0; } + +int fdtdec_get_pci_bus_range(const void *blob, int node, + struct fdt_resource *res) +{ + const u32 *values; + int len; + + values = fdt_getprop(blob, node, "bus-range", &len); + if (!values || len < sizeof(*values) * 2) + return -EINVAL; + + res->start = fdt32_to_cpu(*values++); + res->end = fdt32_to_cpu(*values); + + return 0; +} #endif uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name,