[SeaBIOS] [PATCH v3 3/3] pci: recognize RH PCI legacy bridge resource reservation capability

Laszlo Ersek lersek at redhat.com
Fri Aug 24 11:12:47 CEST 2018


On 08/24/18 10:53, Jing Liu wrote:
> Enable the firmware recognizing RedHat legacy PCI bridge device ID,
> so QEMU can reserve additional PCI bridge resource capability.
> Change the debug level lower to 3 when it is non-QEMU bridge.
> 
> Signed-off-by: Jing Liu <jing2.liu at linux.intel.com>
> ---
>  src/fw/pciinit.c | 50 +++++++++++++++++++++++++++++---------------------
>  src/hw/pci_ids.h |  1 +
>  2 files changed, 30 insertions(+), 21 deletions(-)
> 
> diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
> index 62a32f1..c0634bc 100644
> --- a/src/fw/pciinit.c
> +++ b/src/fw/pciinit.c
> @@ -525,30 +525,38 @@ static void pci_bios_init_platform(void)
>  
>  static u8 pci_find_resource_reserve_capability(u16 bdf)
>  {
> -    if (pci_config_readw(bdf, PCI_VENDOR_ID) == PCI_VENDOR_ID_REDHAT &&
> -        pci_config_readw(bdf, PCI_DEVICE_ID) ==
> -                PCI_DEVICE_ID_REDHAT_ROOT_PORT) {
> -        u8 cap = 0;
> -        do {
> -            cap = pci_find_capability(bdf, PCI_CAP_ID_VNDR, cap);
> -        } while (cap &&
> -                 pci_config_readb(bdf, cap + PCI_CAP_REDHAT_TYPE_OFFSET) !=
> -                        REDHAT_CAP_RESOURCE_RESERVE);
> -        if (cap) {
> -            u8 cap_len = pci_config_readb(bdf, cap + PCI_CAP_FLAGS);
> -            if (cap_len < RES_RESERVE_CAP_SIZE) {
> -                dprintf(1, "PCI: QEMU resource reserve cap length %d is invalid\n",
> -                        cap_len);
> -                return 0;
> -            }
> -        } else {
> -            dprintf(1, "PCI: QEMU resource reserve cap not found\n");
> +    u16 device_id;
> +
> +    if (pci_config_readw(bdf, PCI_VENDOR_ID) != PCI_VENDOR_ID_REDHAT) {
> +        dprintf(3, "PCI: This is non-QEMU bridge.\n");

I think I liked the previous language slightly more ("PCI: QEMU resource
reserve cap vendor ID doesn't match."), but that shouldn't be a problem.

Series
Reviewed-by: Laszlo Ersek <lersek at redhat.com>

Thanks
Laszlo


> +        return 0;
> +    }
> +
> +    device_id = pci_config_readw(bdf, PCI_DEVICE_ID);
> +
> +    if (device_id != PCI_DEVICE_ID_REDHAT_ROOT_PORT &&
> +        device_id != PCI_DEVICE_ID_REDHAT_BRIDGE) {
> +        dprintf(1, "PCI: QEMU resource reserve cap device ID doesn't match.\n");
> +        return 0;
> +    }
> +    u8 cap = 0;
> +
> +    do {
> +        cap = pci_find_capability(bdf, PCI_CAP_ID_VNDR, cap);
> +    } while (cap &&
> +             pci_config_readb(bdf, cap + PCI_CAP_REDHAT_TYPE_OFFSET) !=
> +                              REDHAT_CAP_RESOURCE_RESERVE);
> +    if (cap) {
> +        u8 cap_len = pci_config_readb(bdf, cap + PCI_CAP_FLAGS);
> +        if (cap_len < RES_RESERVE_CAP_SIZE) {
> +            dprintf(1, "PCI: QEMU resource reserve cap length %d is invalid\n",
> +                    cap_len);
> +            return 0;
>          }
> -        return cap;
>      } else {
> -        dprintf(1, "PCI: QEMU resource reserve cap VID or DID doesn't match.\n");
> -        return 0;
> +        dprintf(1, "PCI: QEMU resource reserve cap not found\n");
>      }
> +    return cap;
>  }
>  
>  /****************************************************************
> diff --git a/src/hw/pci_ids.h b/src/hw/pci_ids.h
> index 38fa2ca..1096461 100644
> --- a/src/hw/pci_ids.h
> +++ b/src/hw/pci_ids.h
> @@ -2265,6 +2265,7 @@
>  
>  #define PCI_VENDOR_ID_REDHAT		0x1b36
>  #define PCI_DEVICE_ID_REDHAT_ROOT_PORT	0x000C
> +#define PCI_DEVICE_ID_REDHAT_BRIDGE	0x0001
>  
>  #define PCI_VENDOR_ID_TEKRAM		0x1de1
>  #define PCI_DEVICE_ID_TEKRAM_DC290	0xdc29
> 




More information about the SeaBIOS mailing list