#include "cmos.h" // inb_cmos
#include "pic.h" // enable_hwirq
#include "biosvar.h" // GET_EBDA
-#include "pci.h" // foreachbdf
+#include "pci.h" // foreachpci
#include "pci_ids.h" // PCI_CLASS_STORAGE_OTHER
#include "pci_regs.h" // PCI_INTERRUPT_LINE
#include "boot.h" // boot_add_hd
// 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);
, (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.
// 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));
}
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);
}
// 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) {
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)
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[] = {
static void
ata_init(void)
{
- // Scan PCI bus for ATA adapters
- int pcicount=0;
- int bdf, max;
- foreachbdf(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);
}
}