1 #include <lunaix/spike.h>
2 #include <lunaix/status.h>
4 #include <hal/ahci/ahci.h>
8 ahci_pci_create(struct device_def* def, morph_t* morphed)
10 struct pci_probe* probe;
12 struct pci_base_addr* bar6;
13 struct ahci_driver* ahci_drv;
16 probe = changeling_try_reveal(morphed, pci_probe_morpher);
21 bar6 = pci_device_bar(probe, 5);
22 assert_msg(pci_bar_mmio_space(bar6), "AHCI: BAR#6 is not MMIO.");
25 pci_cmd_set_bus_master(&cmd);
26 pci_cmd_set_mmio(&cmd);
27 pci_cmd_set_msi(&cmd);
28 pci_apply_command(probe, cmd);
30 assert(pci_capability_msi(probe));
32 irq = pci_declare_msi_irq(ahci_hba_isr, probe);
33 pci_assign_msi(probe, irq, NULL);
35 struct ahci_driver_param param = {
36 .mmio_base = bar6->start,
37 .mmio_size = bar6->size,
41 ahci_drv = ahci_driver_init(¶m);
42 dev = device_allocvol(NULL, ahci_drv);
44 device_setname(dev_meta(dev),
45 "pci-ahci%d", devclass_mkvar(&def->class));
47 pci_bind_instance(probe, dev);
53 ahci_pci_compat(struct pci_probe* probe)
55 return pci_device_class(probe) == AHCI_HBA_CLASS;
59 ahci_pci_register(struct device_def* def)
61 return !pci_register_driver(def, ahci_pci_compat);
65 static struct device_def ahcidef =
67 def_device_class(GENERIC, STORAGE, SATA),
68 def_device_name("Generic AHCI (pci-bus)"),
70 def_on_register(ahci_pci_register),
71 def_on_create(ahci_pci_create),
75 EXPORT_DEVICE(ahci, &ahcidef, load_postboot);