Hi Simon, On Mon, Nov 25, 2019 at 12:11 PM Simon Glass <s...@chromium.org> wrote: > > Early in boot it is necessary to decode the PCI device/function values for > particular peripherals in the device tree or of-platdata. This is needed > in TPL where CONFIG_PCI is not defined. > > To handle this, move pci_get_devfn() into a file that is built even when > CONFIG_PCI is not defined. > > Also add a function for use by of-platdata, to convert a reg property to > a pci_dev_t. > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > Changes in v5: None > Changes in v4: > - Add more documentation for pci_ofplat_get_devfn() > - Mention that the return value is pci_dev_t > - Rename pci_x86_ofplat_get_devfn() to pci_ofplat_get_devfn() > > Changes in v3: > - Move the function to a common file instead of duplicating it > - Update device type to pci_dev_t > > Changes in v2: None > > drivers/core/util.c | 20 +++++++++++++++++++ > drivers/pci/pci-uclass.c | 16 --------------- > include/dm/pci.h | 43 ++++++++++++++++++++++++++++++++++++++++ > include/pci.h | 12 ++--------- > 4 files changed, 65 insertions(+), 26 deletions(-) > create mode 100644 include/dm/pci.h > > diff --git a/drivers/core/util.c b/drivers/core/util.c > index 7dc1a2af02..69f83755f0 100644 > --- a/drivers/core/util.c > +++ b/drivers/core/util.c > @@ -4,7 +4,9 @@ > */ > > #include <common.h> > +#include <dm/device.h> > #include <dm/ofnode.h> > +#include <dm/read.h> > #include <dm/util.h> > #include <linux/libfdt.h> > #include <vsprintf.h> > @@ -58,3 +60,21 @@ bool dm_ofnode_pre_reloc(ofnode node) > #endif > } > #endif > + > +#if !CONFIG_IS_ENABLED(OF_PLATDATA) > +int pci_get_devfn(struct udevice *dev) > +{ > + struct fdt_pci_addr addr; > + int ret; > + > + /* Extract the devfn from fdt_pci_addr */ > + ret = ofnode_read_pci_addr(dev_ofnode(dev), FDT_PCI_SPACE_CONFIG, > + "reg", &addr); > + if (ret) { > + if (ret != -ENOENT) > + return -EINVAL; > + } > + > + return addr.phys_hi & 0xff00; > +} > +#endif > diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c > index b09fb4f993..3863262ebe 100644 > --- a/drivers/pci/pci-uclass.c > +++ b/drivers/pci/pci-uclass.c > @@ -1018,22 +1018,6 @@ static int pci_uclass_post_probe(struct udevice *bus) > return 0; > } > > -int pci_get_devfn(struct udevice *dev) > -{ > - struct fdt_pci_addr addr; > - int ret; > - > - /* Extract the devfn from fdt_pci_addr */ > - ret = ofnode_read_pci_addr(dev_ofnode(dev), FDT_PCI_SPACE_CONFIG, > - "reg", &addr); > - if (ret) { > - if (ret != -ENOENT) > - return -EINVAL; > - } > - > - return addr.phys_hi & 0xff00; > -} > - > static int pci_uclass_child_post_bind(struct udevice *dev) > { > struct pci_child_platdata *pplat; > diff --git a/include/dm/pci.h b/include/dm/pci.h > new file mode 100644 > index 0000000000..4faf09f05f > --- /dev/null > +++ b/include/dm/pci.h > @@ -0,0 +1,43 @@ > +/* SPDX-License-Identifier: GPL-2.0+ */ > +/* > + * Copyright (c) 2019 Google, Inc > + */ > + > +#ifndef __DM_PCI_H > +#define __DM_PCI_H > + > +struct udevice; > + > +/** > + * pci_get_devfn() - Extract the devfn from fdt_pci_addr of the device > + * > + * Get devfn from fdt_pci_addr of the specified device > + * > + * This returns an int to avoid a dependency on pci.h > + * > + * @dev: PCI device > + * @return devfn in bits 15...8 if found (pci_dev_t format), or -ENODEV if > not > + * found > + */ > +int pci_get_devfn(struct udevice *dev); > + > +/** > + * pci_x86_ofplat_get_devfn() - Get the PCI dev/fn from of-platdata
This should be: pci_ofplat_get_devfn() > + * > + * This function is used to obtain a PCI device/function from of-platdata > + * register data. In this case the first cell of the 'reg' property contains > + * the required information. > + * > + * This returns an int to avoid a dependency on pci.h > + * > + * @reg: reg value from dt-platdata.c array (first member). This is not a > + * pointer type, since the caller may use fdt32_t or fdt64_t depending on > + * the address sizes. > + * @return device/function for that device (pci_dev_t format) > + */ > +static inline int pci_ofplat_get_devfn(u32 reg) > +{ > + return reg & 0xff00; > +} > + > +#endif > diff --git a/include/pci.h b/include/pci.h > index de17d0ffba..8c761d8da3 100644 > --- a/include/pci.h > +++ b/include/pci.h > @@ -482,6 +482,8 @@ > > #ifndef __ASSEMBLY__ > > +#include <dm/pci.h> > + > #ifdef CONFIG_SYS_PCI_64BIT > typedef u64 pci_addr_t; > typedef u64 pci_size_t; > @@ -1619,16 +1621,6 @@ int sandbox_pci_get_emul(struct udevice *bus, > pci_dev_t find_devfn, > */ > int sandbox_pci_get_client(struct udevice *emul, struct udevice **devp); > > -/** > - * pci_get_devfn() - Extract the devfn from fdt_pci_addr of the device > - * > - * Get devfn from fdt_pci_addr of the specified device > - * > - * @dev: PCI device > - * @return devfn in bits 15...8 if found, -ENODEV if not found > - */ > -int pci_get_devfn(struct udevice *dev); > - > #endif /* CONFIG_DM_PCI */ > > /** > -- Other than that, Reviewed-by: Bin Meng <bmeng...@gmail.com> Regards, Bin _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot