aboutsummaryrefslogtreecommitdiffstats
path: root/src/fw/pciinit.c
diff options
context:
space:
mode:
authorJing Liu <jing2.liu@linux.intel.com>2018-08-24 16:53:01 +0800
committerGerd Hoffmann <kraxel@redhat.com>2018-09-05 08:37:18 +0200
commitbcd82420a32d1fe597a88e601959e9d5fe4c70df (patch)
tree4377649cc2bec4b9801cde7933eb622337fd33f2 /src/fw/pciinit.c
parent478bc3e99394601f28a9cbb9f61cb41628962ac7 (diff)
downloadseabios-bcd82420a32d1fe597a88e601959e9d5fe4c70df.tar.gz
pci: recognize RH PCI legacy bridge resource reservation capability
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@linux.intel.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Marcel Apfelbaum<marcel.apfelbaum@gmail.com> Message-id: 1535100781-3910-4-git-send-email-jing2.liu@linux.intel.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'src/fw/pciinit.c')
-rw-r--r--src/fw/pciinit.c50
1 files changed, 29 insertions, 21 deletions
diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
index 62a32f1e..c0634bcb 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;
+ dprintf(1, "PCI: QEMU resource reserve cap not found\n");
}
+ return cap;
}
/****************************************************************