
Hi Simon,
On Mon, Nov 25, 2019 at 12:11 PM Simon Glass sjg@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 sjg@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.cn@gmail.com
Regards, Bin