[U-Boot] [PATCH v5 005/101] dm: pci: Move pci_get_devfn() into a common file
Bin Meng
bmeng.cn at gmail.com
Mon Nov 25 14:54:26 UTC 2019
Hi Simon,
On Mon, Nov 25, 2019 at 12:11 PM Simon Glass <sjg at 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 at 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 at gmail.com>
Regards,
Bin
More information about the U-Boot
mailing list