[SeaBIOS] [RFC v2 3/3] pci: filter undesired domain when traversing pci
Zihan Yang
whois.zihan.yang at gmail.com
Thu Aug 9 07:43:54 CEST 2018
Since pci devices could reside in different domains now, we should judge
the domain of pci devices when traversing them. Original devices still
use domain 0 for compatibility
Signed-off-by: Zihan Yang <whois.zihan.yang at gmail.com>
---
src/fw/mptable.c | 1 +
src/fw/pciinit.c | 10 ++++------
src/hw/ahci.c | 1 +
src/hw/ata.c | 1 +
src/hw/esp-scsi.c | 1 +
src/hw/lsi-scsi.c | 1 +
src/hw/megasas.c | 1 +
src/hw/mpt-scsi.c | 1 +
src/hw/nvme.c | 1 +
src/hw/pcidevice.c | 3 +++
src/hw/pcidevice.h | 4 ++++
src/hw/pvscsi.c | 1 +
src/hw/sdcard.c | 1 +
src/hw/usb-ehci.c | 1 +
src/hw/usb-ohci.c | 1 +
src/hw/usb-uhci.c | 1 +
src/hw/usb-xhci.c | 1 +
src/hw/virtio-blk.c | 1 +
src/hw/virtio-scsi.c | 1 +
src/optionroms.c | 3 +++
20 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/src/fw/mptable.c b/src/fw/mptable.c
index 47385cc..3989cb6 100644
--- a/src/fw/mptable.c
+++ b/src/fw/mptable.c
@@ -110,6 +110,7 @@ mptable_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
u16 bdf = pci->bdf;
if (pci_bdf_to_bus(bdf) != 0)
break;
diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
index fcdcd38..834540f 100644
--- a/src/fw/pciinit.c
+++ b/src/fw/pciinit.c
@@ -427,8 +427,7 @@ static void pci_bios_init_devices(int domain_nr)
{
struct pci_device *pci;
foreachpci(pci) {
- if (pci->domain_nr != domain_nr)
- continue;
+ filter_domain(pci, domain_nr);
pci_bios_init_device(pci);
}
}
@@ -438,6 +437,7 @@ static void pci_enable_default_vga(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (is_pci_vga(pci)) {
dprintf(1, "PCI: Using %pP for primary VGA\n", pci);
return;
@@ -545,8 +545,7 @@ static void pci_bios_init_platform(int domain_nr)
{
struct pci_device *pci;
foreachpci(pci) {
- if (pci->domain_nr != domain_nr)
- continue;
+ filter_domain(pci, domain_nr);
pci_init_device(pci_platform_tbl, pci, NULL);
}
}
@@ -884,8 +883,7 @@ static int pci_bios_check_devices(struct pci_bus *busses, int domain_nr)
// Calculate resources needed for regular (non-bus) devices.
struct pci_device *pci;
foreachpci(pci) {
- if (pci->domain_nr != domain_nr)
- continue;
+ filter_domain(pci, domain_nr);
if (pci->class == PCI_CLASS_BRIDGE_PCI)
busses[pci->secondary_bus].bus_dev = pci;
diff --git a/src/hw/ahci.c b/src/hw/ahci.c
index 1746e7a..f825992 100644
--- a/src/hw/ahci.c
+++ b/src/hw/ahci.c
@@ -677,6 +677,7 @@ ahci_scan(void)
// Scan PCI bus for ATA adapters
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->class != PCI_CLASS_STORAGE_SATA)
continue;
if (pci->prog_if != 1 /* AHCI rev 1 */)
diff --git a/src/hw/ata.c b/src/hw/ata.c
index b6e073c..2273326 100644
--- a/src/hw/ata.c
+++ b/src/hw/ata.c
@@ -1024,6 +1024,7 @@ ata_scan(void)
// Scan PCI bus for ATA adapters
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
pci_init_device(pci_ata_tbl, pci, NULL);
}
}
diff --git a/src/hw/esp-scsi.c b/src/hw/esp-scsi.c
index ffd86d0..17436d5 100644
--- a/src/hw/esp-scsi.c
+++ b/src/hw/esp-scsi.c
@@ -233,6 +233,7 @@ esp_scsi_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor != PCI_VENDOR_ID_AMD
|| pci->device != PCI_DEVICE_ID_AMD_SCSI)
continue;
diff --git a/src/hw/lsi-scsi.c b/src/hw/lsi-scsi.c
index d5fc3e4..5748d1f 100644
--- a/src/hw/lsi-scsi.c
+++ b/src/hw/lsi-scsi.c
@@ -213,6 +213,7 @@ lsi_scsi_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor != PCI_VENDOR_ID_LSI_LOGIC
|| pci->device != PCI_DEVICE_ID_LSI_53C895A)
continue;
diff --git a/src/hw/megasas.c b/src/hw/megasas.c
index d267580..1d84771 100644
--- a/src/hw/megasas.c
+++ b/src/hw/megasas.c
@@ -386,6 +386,7 @@ megasas_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor != PCI_VENDOR_ID_LSI_LOGIC &&
pci->vendor != PCI_VENDOR_ID_DELL)
continue;
diff --git a/src/hw/mpt-scsi.c b/src/hw/mpt-scsi.c
index 1faede6..e89316b 100644
--- a/src/hw/mpt-scsi.c
+++ b/src/hw/mpt-scsi.c
@@ -310,6 +310,7 @@ mpt_scsi_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor == PCI_VENDOR_ID_LSI_LOGIC
&& (pci->device == PCI_DEVICE_ID_LSI_53C1030
|| pci->device == PCI_DEVICE_ID_LSI_SAS1068
diff --git a/src/hw/nvme.c b/src/hw/nvme.c
index e6d739d..d7b5183 100644
--- a/src/hw/nvme.c
+++ b/src/hw/nvme.c
@@ -633,6 +633,7 @@ nvme_scan(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->class != PCI_CLASS_STORAGE_NVME)
continue;
if (pci->prog_if != 2 /* as of NVM 1.0e */) {
diff --git a/src/hw/pcidevice.c b/src/hw/pcidevice.c
index ec21ec1..44dc05a 100644
--- a/src/hw/pcidevice.c
+++ b/src/hw/pcidevice.c
@@ -91,6 +91,7 @@ pci_find_device(u16 vendid, u16 devid)
{
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor == vendid && pci->device == devid)
return pci;
}
@@ -103,6 +104,7 @@ pci_find_class(u16 classid)
{
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->class == classid)
return pci;
}
@@ -130,6 +132,7 @@ pci_find_init_device(const struct pci_device_id *ids, void *arg)
{
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci_init_device(ids, pci, arg) == 0)
return pci;
}
diff --git a/src/hw/pcidevice.h b/src/hw/pcidevice.h
index 951e005..4518e77 100644
--- a/src/hw/pcidevice.h
+++ b/src/hw/pcidevice.h
@@ -32,6 +32,10 @@ static inline u32 pci_classprog(struct pci_device *pci) {
#define foreachpci(PCI) \
hlist_for_each_entry(PCI, &PCIDevices, node)
+#define filter_domain(PCI, DOMAIN) \
+ if ((PCI)->domain_nr != (DOMAIN)) \
+ continue;
+
#define PCI_ANY_ID (~0)
struct pci_device_id {
u32 vendid;
diff --git a/src/hw/pvscsi.c b/src/hw/pvscsi.c
index d62d0a0..d0f6dac 100644
--- a/src/hw/pvscsi.c
+++ b/src/hw/pvscsi.c
@@ -325,6 +325,7 @@ pvscsi_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor != PCI_VENDOR_ID_VMWARE
|| pci->device != PCI_DEVICE_ID_VMWARE_PVSCSI)
continue;
diff --git a/src/hw/sdcard.c b/src/hw/sdcard.c
index 6410340..f3782f2 100644
--- a/src/hw/sdcard.c
+++ b/src/hw/sdcard.c
@@ -564,6 +564,7 @@ sdcard_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->class != PCI_CLASS_SYSTEM_SDHCI || pci->prog_if >= 2)
// Not an SDHCI controller following SDHCI spec
continue;
diff --git a/src/hw/usb-ehci.c b/src/hw/usb-ehci.c
index 7eca55b..60b73b2 100644
--- a/src/hw/usb-ehci.c
+++ b/src/hw/usb-ehci.c
@@ -331,6 +331,7 @@ ehci_setup(void)
return;
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_EHCI)
ehci_controller_setup(pci);
}
diff --git a/src/hw/usb-ohci.c b/src/hw/usb-ohci.c
index 90f60e6..c25745f 100644
--- a/src/hw/usb-ohci.c
+++ b/src/hw/usb-ohci.c
@@ -302,6 +302,7 @@ ohci_setup(void)
return;
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_OHCI)
ohci_controller_setup(pci);
}
diff --git a/src/hw/usb-uhci.c b/src/hw/usb-uhci.c
index 075ed02..f92b417 100644
--- a/src/hw/usb-uhci.c
+++ b/src/hw/usb-uhci.c
@@ -275,6 +275,7 @@ uhci_setup(void)
return;
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_UHCI)
uhci_controller_setup(pci);
}
diff --git a/src/hw/usb-xhci.c b/src/hw/usb-xhci.c
index 08d1e32..9293720 100644
--- a/src/hw/usb-xhci.c
+++ b/src/hw/usb-xhci.c
@@ -631,6 +631,7 @@ xhci_setup(void)
return;
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_XHCI)
xhci_controller_setup(pci);
}
diff --git a/src/hw/virtio-blk.c b/src/hw/virtio-blk.c
index 88d7e54..2a98303 100644
--- a/src/hw/virtio-blk.c
+++ b/src/hw/virtio-blk.c
@@ -202,6 +202,7 @@ virtio_blk_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor != PCI_VENDOR_ID_REDHAT_QUMRANET ||
(pci->device != PCI_DEVICE_ID_VIRTIO_BLK_09 &&
pci->device != PCI_DEVICE_ID_VIRTIO_BLK_10))
diff --git a/src/hw/virtio-scsi.c b/src/hw/virtio-scsi.c
index a87cad8..b77680e 100644
--- a/src/hw/virtio-scsi.c
+++ b/src/hw/virtio-scsi.c
@@ -211,6 +211,7 @@ virtio_scsi_setup(void)
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->vendor != PCI_VENDOR_ID_REDHAT_QUMRANET ||
(pci->device != PCI_DEVICE_ID_VIRTIO_SCSI_09 &&
pci->device != PCI_DEVICE_ID_VIRTIO_SCSI_10))
diff --git a/src/optionroms.c b/src/optionroms.c
index fc992f6..527b7cb 100644
--- a/src/optionroms.c
+++ b/src/optionroms.c
@@ -350,6 +350,7 @@ optionrom_setup(void)
// Find and deploy PCI roms.
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->class == PCI_CLASS_DISPLAY_VGA ||
pci->class == PCI_CLASS_DISPLAY_OTHER ||
pci->have_driver)
@@ -409,6 +410,7 @@ static void try_setup_display_other(void)
dprintf(1, "No VGA found, scan for other display\n");
foreachpci(pci) {
+ filter_domain(pci, 0);
if (pci->class != PCI_CLASS_DISPLAY_OTHER)
continue;
struct rom_header *rom = map_pcirom(pci);
@@ -445,6 +447,7 @@ vgarom_setup(void)
// Find and deploy PCI VGA rom.
struct pci_device *pci;
foreachpci(pci) {
+ filter_domain(pci, 0);
if (!is_pci_vga(pci))
continue;
vgahook_setup(pci);
--
2.7.4
More information about the SeaBIOS
mailing list