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

Liu, Jing2 jing2.liu at linux.intel.com
Mon Aug 27 04:22:35 CEST 2018


Hi Marcel,

On 8/25/2018 11:59 PM, Marcel Apfelbaum wrote:
> 
> 
> On 08/24/2018 11:53 AM, 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");
>> +        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;
> 
> I am sorry for the late review.
> Did you drop the above line in purpose?
> 
Thanks for the review!

I replaced the above report to following phase.
Check the vendor-id and device-id respectively.

+    if (pci_config_readw(bdf, PCI_VENDOR_ID) != PCI_VENDOR_ID_REDHAT) {
+        dprintf(3, "PCI: This is non-QEMU bridge.\n");
+        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;
+    }

Thanks,
Jing

> Thanks,
> Marcel



More information about the SeaBIOS mailing list