[OpenBIOS] [PATCH 07/13] pci: implement simba_config_cb() for programming device ranges

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Sat Jul 8 22:35:54 CEST 2017


The SUN,simba device doesn't have a ranges properties and so Linux will
calculate the PCI memory/IO ranges by probing the PBM "Memory Address Map"
and "I/O Address Map" registers (see apb_fake_ranges()).

Set sensible default values for both SUNW,simba devices during PCI
configuration and document accordingly.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
 drivers/pci.c          |   37 +++++++++++++++++++++++++++++++++++++
 drivers/pci_database.c |    2 +-
 drivers/pci_database.h |    1 +
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/drivers/pci.c b/drivers/pci.c
index ec637d9..510ebb7 100644
--- a/drivers/pci.c
+++ b/drivers/pci.c
@@ -553,6 +553,43 @@ int bridge_config_cb(const pci_config_t *config)
 	return 0;
 }
 
+int simba_config_cb(const pci_config_t *config)
+{
+    bridge_config_cb(config);
+
+    /* Configure the simba ranges as per the mostly undocumented
+       PCI config register in Linux's apb_fake_ranges():
+      
+       pci at 1,1 (pciA):
+           IO: 0x1fe02000000-0x1fe027fffff
+          MEM: 0x1ff20000000-0x1ff5fffffff
+          
+       pci at 1 (pciB):
+           IO: 0x1fe02800000-0x1fe02ffffff
+          MEM: 0x1ff60000000-0x1ff9fffffff
+    */
+
+    switch (PCI_FN(config->dev)) {
+    case 1:
+        /* IO: 0x1fe02000000-0x1fe027fffff */
+        pci_config_write8(config->dev, 0xde, 0x0f);
+
+        /* MEM: 0x1ff20000000-0x1ff5fffffff */
+        pci_config_write8(config->dev, 0xdf, 0x06);
+        break;
+
+    case 0:
+        /* IO: 0x1fe02800000-0x1fe02ffffff */
+        pci_config_write8(config->dev, 0xde, 0xf0);
+
+        /* MEM: 0x1ff60000000-0x1ff9fffffff */
+        pci_config_write8(config->dev, 0xdf, 0x18);
+        break;
+    }
+
+    return 0;
+}
+
 int ide_config_cb2 (const pci_config_t *config)
 {
 	ob_ide_init(config->path,
diff --git a/drivers/pci_database.c b/drivers/pci_database.c
index b220586..3155ee3 100644
--- a/drivers/pci_database.c
+++ b/drivers/pci_database.c
@@ -371,7 +371,7 @@ static const pci_dev_t PCIbrg_devices[] = {
         PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_SIMBA, NULL,
         "pci", "SUNW,simba", "pci108e,5000\0pciclass,060400\0",
         3, 2, 1,
-        bridge_config_cb, NULL,
+        simba_config_cb, NULL,
     },
     {
         0xFFFF, 0xFFFF,
diff --git a/drivers/pci_database.h b/drivers/pci_database.h
index 1cc1e56..241bac3 100644
--- a/drivers/pci_database.h
+++ b/drivers/pci_database.h
@@ -36,6 +36,7 @@ extern int vga_config_cb(const pci_config_t *config);
 extern int host_config_cb(const pci_config_t *config);
 extern int sabre_config_cb(const pci_config_t *config);
 extern int bridge_config_cb(const pci_config_t *config);
+extern int simba_config_cb(const pci_config_t *config);
 extern int ebus_config_cb(const pci_config_t *config);
 extern int i82378_config_cb(const pci_config_t *config);
 extern int usb_ohci_config_cb(const pci_config_t *config);
-- 
1.7.10.4




More information about the OpenBIOS mailing list