onboard pci_rom
authorYinghai Lu <yinghailu@gmail.com>
Thu, 13 Jan 2005 03:36:38 +0000 (03:36 +0000)
committerYinghai Lu <yinghailu@gmail.com>
Thu, 13 Jan 2005 03:36:38 +0000 (03:36 +0000)
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1860 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/devices/pci_device.c
src/devices/pci_rom.c
src/drivers/pci/onboard/onboard.c
src/include/device/device.h

index 5b038e4a8d6a255791463f9f375b5ae4322bbdd5..55049230b2f2aac28bd526a145a71d4932dcd431 100644 (file)
@@ -273,8 +273,10 @@ static void pci_read_bases(struct device *dev, unsigned int howmany, unsigned lo
                resource = pci_get_resource(dev, index);
                index += (resource->flags & IORESOURCE_PCI64)?8:4;
        }
-       if (rom)
-               pci_get_rom_resource(dev, rom);
+       if (rom) {
+               if ((!dev->on_mainboard) || (dev->rom_address == 0))
+                       pci_get_rom_resource(dev, rom);
+       }
 
        compact_resources(dev);
 }
index cbeaf857433f5704bb6dd0ad5ad354a14d7d91db..a2e31668024e1d252fdeec4ca899433f1db2c7fe 100644 (file)
@@ -4,16 +4,23 @@
 #include <device/pci_ids.h>
 #include <device/pci_ops.h>
 
+#include "../drivers/pci/onboard/chip.h"
+
 struct rom_header * pci_rom_probe(struct device *dev)
 {
        unsigned long rom_address;
        struct rom_header *rom_header;
        struct pci_data *rom_data;
 
+        if (dev->on_mainboard && (dev->rom_address != 0) ) {
+                rom_address = dev->rom_address;
+        }
+        else {
+                rom_address = pci_read_config32(dev, PCI_ROM_ADDRESS);
+        }
+
        rom_address = pci_read_config32(dev, PCI_ROM_ADDRESS);
        if (rom_address == 0x00000000 || rom_address == 0xffffffff) {
-               /* FixME: search in the LinuxBIOS Image for integrated
-                * devices? */
                return NULL;
        }
 
index c5059323fa8a531dc6ab9fdc84e5f1e64695e10f..09ee9bdb918edc4c67567676ab9dbced5afa5bb0 100644 (file)
 #include <device/pci_ops.h>
 #include "chip.h"
 
+static void onboard_enable(device_t dev) 
+{
+       struct drivers_pci_onboard_config *conf;
+        conf = dev->chip_info;
+       dev->rom_address = conf->rom_address;
+}
 
 struct chip_operations drivers_pci_onboard_ops = {
 #if CONFIG_CHIP_NAME == 1
        CHIP_NAME("Onboard PCI")
 #endif
+       .enable_dev = onboard_enable,
 };
index 8df71b2bebef815df885f2bf4ce2f5bf5fe0b14f..75e1189e0306f9c63788d6fcc1c94ec7d0ebb1b3 100644 (file)
@@ -72,6 +72,7 @@ struct device {
        unsigned int    initialized : 1; /* set if we have initialized the device */
        unsigned int    have_resources : 1; /* Set if we have read the devices resources */
        unsigned int    on_mainboard : 1;
+       unsigned long   rom_address;
 
        uint8_t command;