11 #include <hw/ide/pci.h>
12 #include <hw/ide/ahci.h>
14 static int pci_ich9_ahci_initfn(PCIDevice
*dev
)
16 struct AHCIPCIState
*d
;
17 d
= DO_UPCAST(struct AHCIPCIState
, card
, dev
);
19 pci_config_set_vendor_id(d
->card
.config
, PCI_VENDOR_ID_INTEL
);
20 pci_config_set_device_id(d
->card
.config
, PCI_DEVICE_ID_INTEL_82801IR
);
22 pci_config_set_class(d
->card
.config
, PCI_CLASS_STORAGE_SATA
);
23 pci_config_set_revision(d
->card
.config
, 0x02);
24 pci_config_set_prog_interface(d
->card
.config
, AHCI_PROGMODE_MAJOR_REV_1
);
26 d
->card
.config
[PCI_CACHE_LINE_SIZE
] = 0x08; /* Cache line size */
27 d
->card
.config
[PCI_LATENCY_TIMER
] = 0x00; /* Latency timer */
28 pci_config_set_interrupt_pin(d
->card
.config
, 1);
30 /* XXX Software should program this register */
31 d
->card
.config
[0x90] = 1 << 6; /* Address Map Register - AHCI mode */
33 qemu_register_reset(ahci_reset
, d
);
35 /* XXX BAR size should be 1k, but that breaks, so bump it to 4k for now */
36 pci_register_bar(&d
->card
, 5, 0x1000, PCI_BASE_ADDRESS_SPACE_MEMORY
,
39 msi_init(dev
, 0x50, 1, true, false);
41 ahci_init(&d
->ahci
, &dev
->qdev
);
42 d
->ahci
.irq
= d
->card
.irq
[0];
47 static PCIDeviceInfo ich_ahci_info
[] = {
49 .qdev
.name
= "ich9-ahci",
50 .qdev
.size
= sizeof(AHCIPCIState
),
51 .init
= pci_ich9_ahci_initfn
,
57 static void ich_ahci_register(void)
59 pci_qdev_register_many(ich_ahci_info
);
61 device_init(ich_ahci_register
);