On Tue, Nov 17, 2015 at 11:53 AM, Simon Glass <s...@chromium.org> wrote: > Use the driver model version of the function to find the BAR. This updates > the fdtdec function, of which ns16550 is the only user. > > The fdtdec_get_pci_bdf() function is dropped for several reasons: > - with driver model we should use 'struct udevice *' rather than passing the > device tree offset explicitly > - there are no other users in the tree > - the function parses for information which is already available in the PCI > device structure (specifically struct pci_child_platdata which is available > at dev_get_parent_platdata(dev) > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > drivers/serial/ns16550.c | 3 +-- > include/fdtdec.h | 23 +++----------------- > lib/fdtdec.c | 55 > ++++-------------------------------------------- > 3 files changed, 8 insertions(+), 73 deletions(-) > > diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c > index 6433844..364531e 100644 > --- a/drivers/serial/ns16550.c > +++ b/drivers/serial/ns16550.c > @@ -386,8 +386,7 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) > return ret; > } > > - ret = fdtdec_get_pci_bar32(gd->fdt_blob, dev->of_offset, > - &pci_addr, &bar); > + ret = fdtdec_get_pci_bar32(dev, &pci_addr, &bar); > if (ret) > return ret; > > diff --git a/include/fdtdec.h b/include/fdtdec.h > index 8e0f592..6afd53d 100644 > --- a/include/fdtdec.h > +++ b/include/fdtdec.h > @@ -445,32 +445,15 @@ int fdtdec_get_pci_vendev(const void *blob, int node, > > /** > * Look at the pci address of a device node that represents a PCI device > - * and parse the bus, device and function number from it. For some cases > - * like the bus number encoded in reg property is not correct after pci > - * enumeration, this function looks through the node's compatible strings > - * to get these numbers extracted instead. > - * > - * @param blob FDT blob > - * @param node node to examine > - * @param addr pci address in the form of fdt_pci_addr > - * @param bdf returns bus, device, function triplet > - * @return 0 if ok, negative on error > - */ > -int fdtdec_get_pci_bdf(const void *blob, int node, > - struct fdt_pci_addr *addr, pci_dev_t *bdf); > - > -/** > - * Look at the pci address of a device node that represents a PCI device > * and return base address of the pci device's registers. > * > - * @param blob FDT blob > - * @param node node to examine > + * @param dev device to examine > * @param addr pci address in the form of fdt_pci_addr > * @param bar returns base address of the pci device's registers > * @return 0 if ok, negative on error > */ > -int fdtdec_get_pci_bar32(const void *blob, int node, > - struct fdt_pci_addr *addr, u32 *bar); > +int fdtdec_get_pci_bar32(struct udevice *dev, struct fdt_pci_addr *addr, > + u32 *bar); > > /** > * Look up a 32-bit integer property in a node and return it. The property > diff --git a/lib/fdtdec.c b/lib/fdtdec.c > index 4534177..4b9f196 100644 > --- a/lib/fdtdec.c > +++ b/lib/fdtdec.c > @@ -5,6 +5,7 @@ > > #ifndef USE_HOSTCC > #include <common.h> > +#include <dm.h> > #include <errno.h> > #include <serial.h> > #include <libfdt.h> > @@ -283,58 +284,10 @@ int fdtdec_get_pci_vendev(const void *blob, int node, > u16 *vendor, u16 *device) > return -ENOENT; > } > > -int fdtdec_get_pci_bdf(const void *blob, int node, > - struct fdt_pci_addr *addr, pci_dev_t *bdf) > +int fdtdec_get_pci_bar32(struct udevice *dev, struct fdt_pci_addr *addr, > + u32 *bar) > { > - u16 dt_vendor, dt_device, vendor, device; > - int ret; > - > - /* get vendor id & device id from the compatible string */ > - ret = fdtdec_get_pci_vendev(blob, node, &dt_vendor, &dt_device); > - if (ret) > - return ret; > - > - /* extract the bdf from fdt_pci_addr */ > - *bdf = addr->phys_hi & 0xffff00; > - > - /* read vendor id & device id based on bdf */ > - pci_read_config_word(*bdf, PCI_VENDOR_ID, &vendor); > - pci_read_config_word(*bdf, PCI_DEVICE_ID, &device); > - > - /* > - * Note there are two places in the device tree to fully describe > - * a pci device: one is via compatible string with a format of > - * "pciVVVV,DDDD" and the other one is the bdf numbers encoded in > - * the device node's reg address property. We read the vendor id > - * and device id based on bdf and compare the values with the > - * "VVVV,DDDD". If they are the same, then we are good to use bdf > - * to read device's bar. But if they are different, we have to rely > - * on the vendor id and device id extracted from the compatible > - * string and locate the real bdf by pci_find_device(). This is > - * because normally we may only know device's device number and > - * function number when writing device tree. The bus number is > - * dynamically assigned during the pci enumeration process. > - */ > - if ((dt_vendor != vendor) || (dt_device != device)) { > - *bdf = pci_find_device(dt_vendor, dt_device, 0); > - if (*bdf == -1) > - return -ENODEV; > - } > - > - return 0; > -} > - > -int fdtdec_get_pci_bar32(const void *blob, int node, > - struct fdt_pci_addr *addr, u32 *bar) > -{ > - pci_dev_t bdf; > int barnum; > - int ret; > - > - /* get pci devices's bdf */ > - ret = fdtdec_get_pci_bdf(blob, node, addr, &bdf); > - if (ret) > - return ret; > > /* extract the bar number from fdt_pci_addr */ > barnum = addr->phys_hi & 0xff; > @@ -342,7 +295,7 @@ int fdtdec_get_pci_bar32(const void *blob, int node, > return -EINVAL; > > barnum = (barnum - PCI_BASE_ADDRESS_0) / 4; > - *bar = pci_read_bar32(pci_bus_to_hose(PCI_BUS(bdf)), bdf, barnum); > + *bar = dm_pci_read_bar32(dev, barnum); > > return 0; > } > --
Reviewed-by: Bin Meng <bmeng...@gmail.com> _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot