X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fata.c;h=76e4f20d2f9cd6b35a078d9e2200a8ef21969c7d;hb=31eabf9ba842612e7c525489ab2a6b60bba10ea0;hp=95e1352f8b3bc1ee9c549bad31f84125ae019fbf;hpb=b9457ec8818db62cf13cbcc791103720e5730edb;p=seabios.git diff --git a/src/ata.c b/src/ata.c index 95e1352..76e4f20 100644 --- a/src/ata.c +++ b/src/ata.c @@ -776,7 +776,7 @@ init_drive_atapi(struct atadrive_s *dummy, u16 *buffer) // fill cdidmap if (iscd) { - int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_bdf, + int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_tmp, adrive_g->chan_gf->chanid, adrive_g->slave); boot_add_cd(&adrive_g->drive, desc, prio); @@ -826,7 +826,7 @@ init_drive_ata(struct atadrive_s *dummy, u16 *buffer) , (u32)adjsize, adjprefix); dprintf(1, "%s\n", desc); - int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_bdf, + int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_tmp, adrive_g->chan_gf->chanid, adrive_g->slave); // Register with bcv system. @@ -941,7 +941,8 @@ ata_detect(void *data) // Initialize an ata controller and detect its drives. static void -init_controller(int bdf, int irq, u32 port1, u32 port2, u32 master) +init_controller(struct pci_device *pci, int irq + , u32 port1, u32 port2, u32 master) { static int chanid = 0; struct ata_channel_s *chan_gf = malloc_fseg(sizeof(*chan_gf)); @@ -951,12 +952,13 @@ init_controller(int bdf, int irq, u32 port1, u32 port2, u32 master) } chan_gf->chanid = chanid++; chan_gf->irq = irq; - chan_gf->pci_bdf = bdf; + chan_gf->pci_bdf = pci ? pci->bdf : -1; + chan_gf->pci_tmp = pci; chan_gf->iobase1 = port1; chan_gf->iobase2 = port2; chan_gf->iomaster = master; dprintf(1, "ATA controller %d at %x/%x/%x (irq %d dev %x)\n" - , chanid, port1, port2, master, irq, bdf); + , chanid, port1, port2, master, irq, chan_gf->pci_bdf); run_thread(ata_detect, chan_gf); } @@ -965,8 +967,10 @@ init_controller(int bdf, int irq, u32 port1, u32 port2, u32 master) // Handle controllers on an ATA PCI device. static void -init_pciata(u16 bdf, u8 prog_if) +init_pciata(struct pci_device *pci, u8 prog_if) { + pci->have_driver = 1; + u16 bdf = pci->bdf; u8 pciirq = pci_config_readb(bdf, PCI_INTERRUPT_LINE); int master = 0; if (CONFIG_ATA_DMA && prog_if & 0x80) { @@ -990,7 +994,7 @@ init_pciata(u16 bdf, u8 prog_if) port2 = PORT_ATA1_CTRL_BASE; irq = IRQ_ATA1; } - init_controller(bdf, irq, port1, port2, master); + init_controller(pci, irq, port1, port2, master); if (prog_if & 4) { port1 = (pci_config_readl(bdf, PCI_BASE_ADDRESS_2) @@ -1003,22 +1007,22 @@ init_pciata(u16 bdf, u8 prog_if) port2 = PORT_ATA2_CTRL_BASE; irq = IRQ_ATA2; } - init_controller(bdf, irq, port1, port2, master ? master + 8 : 0); + init_controller(pci, irq, port1, port2, master ? master + 8 : 0); } static void -found_genericata(u16 bdf, void *arg) +found_genericata(struct pci_device *pci, void *arg) { - init_pciata(bdf, pci_config_readb(bdf, PCI_CLASS_PROG)); + init_pciata(pci, pci->prog_if); } static void -found_compatibleahci(u16 bdf, void *arg) +found_compatibleahci(struct pci_device *pci, void *arg) { if (CONFIG_AHCI) // Already handled directly via native ahci interface. return; - init_pciata(bdf, 0x8f); + init_pciata(pci, 0x8f); } static const struct pci_device_id pci_ata_tbl[] = { @@ -1032,21 +1036,20 @@ static const struct pci_device_id pci_ata_tbl[] = { static void ata_init(void) { - // Scan PCI bus for ATA adapters - int pcicount=0; - int bdf, max; - foreachpci(bdf, max) { - pcicount++; - pci_init_device(pci_ata_tbl, bdf, NULL); - } - - if (!CONFIG_COREBOOT && !pcicount) { + if (!CONFIG_COREBOOT && !PCIDevices) { // No PCI devices found - probably a QEMU "-M isapc" machine. // Try using ISA ports for ATA controllers. - init_controller(-1, IRQ_ATA1 + init_controller(NULL, IRQ_ATA1 , PORT_ATA1_CMD_BASE, PORT_ATA1_CTRL_BASE, 0); - init_controller(-1, IRQ_ATA2 + init_controller(NULL, IRQ_ATA2 , PORT_ATA2_CMD_BASE, PORT_ATA2_CTRL_BASE, 0); + return; + } + + // Scan PCI bus for ATA adapters + struct pci_device *pci; + foreachpci(pci) { + pci_init_device(pci_ata_tbl, pci, NULL); } }