[U-Boot] [PATCH 3/5] x86: Add an API for finding pci devices in the early phase

Simon Glass sjg at chromium.org
Fri Dec 19 22:53:43 CET 2014


Hi Bin,

On 19 December 2014 at 00:19, Bin Meng <bmeng.cn at gmail.com> wrote:
> This new API pci_early_find_devices() is derived from the generic
> version of pci_find_devices() with modifications required in the
> early phase (like hose, config space access routines).
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
>  arch/x86/cpu/pci.c         | 41 +++++++++++++++++++++++++++++++++++++++++
>  arch/x86/include/asm/pci.h |  2 ++
>  2 files changed, 43 insertions(+)
>
> diff --git a/arch/x86/cpu/pci.c b/arch/x86/cpu/pci.c
> index 1eee08b..cdfb981 100644
> --- a/arch/x86/cpu/pci.c
> +++ b/arch/x86/cpu/pci.c
> @@ -111,3 +111,44 @@ void pci_write_config32(pci_dev_t dev, unsigned where, unsigned value)
>  {
>         pci_hose_write_config_dword(get_hose(), dev, where, value);
>  }
> +
> +pci_dev_t pci_early_find_devices(struct pci_device_id *ids, int index)

Can't we just call the normal function? We have an early 'hose'...

> +{
> +       struct pci_controller *hose = gd->arch.hose;
> +       u16 vendor, device;
> +       u8 header_type;
> +       pci_dev_t bdf;
> +       int i, bus, found_multi = 0;
> +
> +       for (bus = hose->first_busno; bus <= hose->last_busno; bus++)
> +               for (bdf = PCI_BDF(bus, 0, 0);
> +                    bdf < PCI_BDF(bus + 1, 0, 0);
> +                    bdf += PCI_BDF(0, 0, 1)) {
> +                       if (pci_skip_dev(hose, bdf))
> +                               continue;
> +
> +                       if (!PCI_FUNC(bdf)) {
> +                               header_type = pci_read_config8(bdf,
> +                                                              PCI_HEADER_TYPE);
> +
> +                               found_multi = header_type & 0x80;
> +                       } else {
> +                               if (!found_multi)
> +                                       continue;
> +                       }
> +
> +                       vendor = pci_read_config16(bdf, PCI_VENDOR_ID);
> +                       device = pci_read_config16(bdf, PCI_DEVICE_ID);
> +
> +                       for (i = 0; ids[i].vendor != 0; i++) {
> +                               if (vendor == ids[i].vendor &&
> +                                   device == ids[i].device) {
> +                                       if (index <= 0)
> +                                               return bdf;
> +                                       index--;
> +                               }
> +                       }
> +               }
> +
> +       return -1;
> +}
> diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
> index ac1a808..a3550fb 100644
> --- a/arch/x86/include/asm/pci.h
> +++ b/arch/x86/include/asm/pci.h
> @@ -49,4 +49,6 @@ void pci_write_config8(pci_dev_t dev, unsigned where, unsigned value);
>  void pci_write_config16(pci_dev_t dev, unsigned where, unsigned value);
>  void pci_write_config32(pci_dev_t dev, unsigned where, unsigned value);
>
> +pci_dev_t pci_early_find_devices(struct pci_device_id *ids, int index);
> +
>  #endif

Regards,
Simon


More information about the U-Boot mailing list