X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/35a7d633d3f16c1e0539af6ca5d8e7482926cd93..f89517343bf062d299d54408eea2f9387bfefb6d:/lunaix-os/hal/char/uart/16x50_pci.c diff --git a/lunaix-os/hal/char/uart/16x50_pci.c b/lunaix-os/hal/char/uart/16x50_pci.c index 20beda1..bba016f 100644 --- a/lunaix-os/hal/char/uart/16x50_pci.c +++ b/lunaix-os/hal/char/uart/16x50_pci.c @@ -1,5 +1,4 @@ #include -#include #include #include @@ -15,23 +14,14 @@ static DEFINE_LLIST(pci_ports); static void -uart_msi_irq_handler(const struct hart_state* hstate) +uart_msi_irq_handler(irq_t irq, const struct hart_state* hstate) { - int vector; struct uart16550* uart; - vector = hart_vector_stamp(hstate); - uart = (struct uart16550*)isrm_get_payload(hstate); + uart = irq_payload(irq, struct uart16550); assert(uart); - uart_handle_irq(vector, uart); -} - -static void -uart_intx_irq_handler(const struct hart_state* hstate) -{ - int vector = hart_vector_stamp(hstate); - uart_handle_irq_overlap(vector, &pci_ports); + uart_handle_irq(irq, uart); } static bool @@ -56,7 +46,7 @@ pci16x50_pci_create(struct device_def* def, morph_t* obj) struct pci_probe* probe; struct uart16550* uart; struct serial_dev* sdev; - msi_vector_t msiv; + irq_t irq; probe = changeling_reveal(obj, pci_probe_morpher); @@ -102,16 +92,16 @@ pci16x50_pci_create(struct device_def* def, morph_t* obj) sdev = uart_create_serial(uart, &def->class, &pci_ports, "PCI"); - msiv = pci_msi_setup_simple(probe, uart_msi_irq_handler); - isrm_set_payload(msi_vect(msiv), __ptr(uart)); + irq = pci_declare_msi_irq(uart_msi_irq_handler, probe); + irq_set_payload(irq, uart); + pci_assign_msi(probe, irq, NULL); - INFO("base: 0x%x (%s), irq=%d (%s)", + INFO("base: 0x%x (%s), %s", bar->start, pci_bar_mmio_space(bar) ? "mmio" : "pmio", - msi_vect(msiv), pci_capability_msi(probe) ? "msi" : "intx, re-routed"); - uart->iv = msi_vect(msiv); + uart->irq = irq; pci_bind_instance(probe, sdev->dev); }