aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Apfelbaum <marcel@redhat.com>2018-01-11 22:15:12 +0200
committerGerd Hoffmann <kraxel@redhat.com>2018-03-19 10:10:43 +0100
commita7aa43e97e97904531499f85e0d7517105f5b96d (patch)
tree132f3a4ee283978af2912c445835c41c8beca601
parent0e739f2b980dd954535aa85090b6375eab267c8f (diff)
downloadseabios-a7aa43e97e97904531499f85e0d7517105f5b96d.zip
seabios-a7aa43e97e97904531499f85e0d7517105f5b96d.tar.gz
seabios-a7aa43e97e97904531499f85e0d7517105f5b96d.tar.bz2
pci: fix 'io hints' capability for RedHat PCI bridges
Commit ec6cb17f (pci: enable RedHat PCI bridges to reserve additional resources on PCI init) added a new vendor specific PCI capability for RedHat PCI bridges allowing them to reserve additional buses and/or IO/MEM space. When adding the IO hints PCI capability to the pcie-root-port without specifying a value for bus reservation, the subordinate bus computation is wrong and the guest kernel gets messed up. Fix it by returning to prev code if the value for bus reservation is not set. Removed also a wrong debug print "PCI: invalid QEMU resource reserve cap offset" which appears if the 'IO hints' capability is not present. Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Marcel Apfelbaum <marcel@redhat.com> (cherry picked from commit 14d91c353e19b7085fdbb7b2dcc43f3355665670)
-rw-r--r--src/fw/pciinit.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
index 7f0e439..3a2f747 100644
--- a/src/fw/pciinit.c
+++ b/src/fw/pciinit.c
@@ -540,8 +540,6 @@ static u8 pci_find_resource_reserve_capability(u16 bdf)
dprintf(1, "PCI: QEMU resource reserve cap length %d is invalid\n",
cap_len);
}
- } else {
- dprintf(1, "PCI: invalid QEMU resource reserve cap offset\n");
}
return cap;
} else {
@@ -619,13 +617,11 @@ pci_bios_init_bus_rec(int bus, u8 *pci_bus)
res_bus);
res_bus = 0;
}
- }
- if (secbus + res_bus > *pci_bus) {
- dprintf(1, "PCI: QEMU resource reserve cap: bus = %u\n",
- res_bus);
- res_bus = secbus + res_bus;
- } else {
- res_bus = *pci_bus;
+ if (secbus + res_bus > *pci_bus) {
+ dprintf(1, "PCI: QEMU resource reserve cap: bus = %u\n",
+ res_bus);
+ res_bus = secbus + res_bus;
+ }
}
}
dprintf(1, "PCI: subordinate bus = 0x%x -> 0x%x\n",