[U-Boot] [PATCH v2 1/6] pci: Add helper for implementing memory-mapped config space accesses

Bin Meng bmeng.cn at gmail.com
Wed Sep 20 05:01:40 UTC 2017


Hi Tuomas,

On Wed, Sep 20, 2017 at 4:18 AM, Tuomas Tynkkynen
<tuomas.tynkkynen at iki.fi> wrote:
> This sort of pattern for implementing memory-mapped PCI config space
> accesses appears in U-Boot twice already, and a third user is coming up.
> So add helper functions to avoid code duplication, similar to how Linux
> has pci_generic_config_write and pci_generic_config_read.
>
> Signed-off-by: Tuomas Tynkkynen <tuomas.tynkkynen at iki.fi>
> ---
>  drivers/pci/pci-uclass.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/pci.h            | 51 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 109 insertions(+)
>
> diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
> index 86df141d60..5a24eb6428 100644
> --- a/drivers/pci/pci-uclass.c
> +++ b/drivers/pci/pci-uclass.c
> @@ -518,6 +518,64 @@ int pci_auto_config_devices(struct udevice *bus)
>         return sub_bus;
>  }
>
> +int pci_generic_mmap_write_config(
> +       struct udevice *bus,
> +       int (*addr_f)(struct udevice *bus, pci_dev_t bdf, uint offset, void **addrp),
> +       pci_dev_t bdf,
> +       uint offset,
> +       ulong value,
> +       enum pci_size_t size)
> +{
> +       void *address;
> +
> +       if (addr_f(bus, bdf, offset, &address) < 0)
> +               return 0;
> +
> +       switch (size) {
> +       case PCI_SIZE_8:
> +               writeb(value, address);
> +               return 0;
> +       case PCI_SIZE_16:
> +               writew(value, address);
> +               return 0;
> +       case PCI_SIZE_32:
> +               writel(value, address);
> +               return 0;
> +       default:
> +               return -EINVAL;
> +       }
> +}
> +
> +int pci_generic_mmap_read_config(
> +       struct udevice *bus,
> +       int (*addr_f)(struct udevice *bus, pci_dev_t bdf, uint offset, void **addrp),
> +       pci_dev_t bdf,
> +       uint offset,
> +       ulong *valuep,
> +       enum pci_size_t size)
> +{
> +       void *address;
> +
> +       if (addr_f(bus, bdf, offset, &address) < 0) {
> +               *valuep = pci_get_ff(size);
> +               return 0;
> +       }
> +
> +       switch (size) {
> +       case PCI_SIZE_8:
> +               *valuep = readb(address);
> +               return 0;
> +       case PCI_SIZE_16:
> +               *valuep = readw(address);
> +               return 0;
> +       case PCI_SIZE_32:
> +               *valuep = readl(address);
> +               return 0;
> +       default:
> +               return -EINVAL;
> +       }
> +}
> +
>  int dm_pci_hose_probe_bus(struct udevice *bus)
>  {
>         int sub_bus;
> diff --git a/include/pci.h b/include/pci.h
> index c8ef997d0d..7adc04301c 100644
> --- a/include/pci.h
> +++ b/include/pci.h
> @@ -1086,6 +1086,57 @@ int pci_read_config32(pci_dev_t pcidev, int offset, u32 *valuep);
>  int pci_read_config16(pci_dev_t pcidev, int offset, u16 *valuep);
>  int pci_read_config8(pci_dev_t pcidev, int offset, u8 *valuep);
>
> +/**
> + * pci_generic_mmap_write_config() - Generic helper for writing to
> + * memory-mapped PCI configuration space.

nits: suggest adding one blank line here.

> + * @bus: Pointer to the PCI bus
> + * @addr_f: Callback for calculating the config space address
> + * @bdf: Identifies the PCI device to access
> + * @offset: The offset into the device's configuration space
> + * @value: The value to write
> + * @size: Indicates the size of access to perform
> + *
> + * Write the value @value of size @size from offset @offset within the
> + * configuration space of the device identified by the bus, device & function
> + * numbers in @bdf on the PCI bus @bus. The callback function @addr_f is
> + * responsible for calculating the CPU address of the respective configuration
> + * space offset.
> + *
> + * Return: 0 on success, else -EINVAL
> + */
> +int pci_generic_mmap_write_config(
> +       struct udevice *bus,
> +       int (*addr_f)(struct udevice *bus, pci_dev_t bdf, uint offset, void **addrp),
> +       pci_dev_t bdf,
> +       uint offset,
> +       ulong value,
> +       enum pci_size_t size);
> +
> +/**
> + * pci_generic_mmap_read_config() - Generic helper for reading from
> + * memory-mapped PCI configuration space.

nits: suggest adding one blank line here.

> + * @bus: Pointer to the PCI bus
> + * @addr_f: Callback for calculating the config space address
> + * @bdf: Identifies the PCI device to access
> + * @offset: The offset into the device's configuration space
> + * @valuep: A pointer at which to store the read value
> + * @size: Indicates the size of access to perform
> + *
> + * Read a value of size @size from offset @offset within the configuration
> + * space of the device identified by the bus, device & function numbers in @bdf
> + * on the PCI bus @bus. The callback function @addr_f is responsible for
> + * calculating the CPU address of the respective configuration space offset.
> + *
> + * Return: 0 on success, else -EINVAL
> + */
> +int pci_generic_mmap_read_config(
> +       struct udevice *bus,
> +       int (*addr_f)(struct udevice *bus, pci_dev_t bdf, uint offset, void **addrp),
> +       pci_dev_t bdf,
> +       uint offset,
> +       ulong *valuep,
> +       enum pci_size_t size);
> +
>  #ifdef CONFIG_DM_PCI_COMPAT
>  /* Compatibility with old naming */
>  static inline int pci_write_config_dword(pci_dev_t pcidev, int offset,
> --

Other than above nits:

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>

Regards,
Bin


More information about the U-Boot mailing list