extern bool pci_irq_map_handler (pci_irq_t *irq, vector_handler handler, uint8 destmask, IOAPIC_destination_mode_t destmode, IOAPIC_delivery_mode_t delivmode) { u8 vector = find_unused_vector (MINIMUM_VECTOR_PRIORITY); DLOG ("vector=0x%X", vector); if (!vector) return FALSE; if (!pci_irq_map (irq, vector, destmask, destmode, delivmode)) return FALSE; set_vector_handler (vector, handler); return TRUE; }
void acpi_secondary_init(void) { ACPI_STATUS Status; ACPI_STATUS DisplayOneDevice (ACPI_HANDLE, UINT32, void *, void **); /* Complete the ACPICA initialization sequence */ Status = AcpiInitializeSubsystem (); if (ACPI_FAILURE (Status)) { DLOG_COM1 ("Failed to initialize ACPI.\n"); } Status = AcpiReallocateRootTable (); if (ACPI_FAILURE (Status)) { DLOG_COM1 ("Failed: AcpiReallocateRootTable %d.\n", Status); } Status = AcpiLoadTables (); if (ACPI_FAILURE (Status)) { DLOG_COM1 ("Failed: AcpiLoadTables.\n"); } Status = AcpiEnableSubsystem (ACPI_FULL_INITIALIZATION); if (ACPI_FAILURE (Status)) { DLOG_COM1 ("Failed: AcpiEnableSubsystem.\n"); } Status = AcpiInitializeObjects (ACPI_FULL_INITIALIZATION); if (ACPI_FAILURE (Status)) { DLOG_COM1 ("Failed: AcpiInitializeObjects.\n"); } /* Must enable IOAPIC before checking any PCI routing tables. */ acpi_enable_IOAPIC (); /* Install System Control Interrupt */ u8 vector = find_unused_vector (MINIMUM_VECTOR_PRIORITY); if (vector) { u64 flags = IOAPIC_DELIVERY_FIXED | IOAPIC_DESTINATION_LOGICAL; u8 gsi = acpi_sci_irq; /* SCI defaults to LEVEL/LOW in IO-APIC mode. */ if ((acpi_sci_flags & ACPI_MADT_POLARITY_MASK) == ACPI_MADT_POLARITY_ACTIVE_HIGH) flags |= IOAPIC_POLARITY_HIGH; else flags |= IOAPIC_POLARITY_LOW; if ((acpi_sci_flags & ACPI_MADT_TRIGGER_MASK) == ACPI_MADT_TRIGGER_EDGE) flags |= IOAPIC_TRIGGER_EDGE; else flags |= IOAPIC_TRIGGER_LEVEL; if (IOAPIC_map_GSI (gsi, vector, 0x0100000000000000ULL | flags) != -1) { set_vector_handler (vector, acpi_irq_handler); DLOG ("ACPI: mapped GSI 0x%X to vector 0x%X (%s, %s)\n", gsi, vector, flags & IOAPIC_TRIGGER_LEVEL ? "level" : "edge", flags & IOAPIC_POLARITY_LOW ? "low" : "high"); } else DLOG ("ACPI: failed to map GSI\n"); } else DLOG ("ACPI: failed to find unused vector\n"); DLOG ("AcpiEnableEvent returned %d\n", AcpiEnableEvent (ACPI_EVENT_POWER_BUTTON, 0)); DLOG ("AcpiInstallFixedEventHandler returned %d\n", AcpiInstallFixedEventHandler (ACPI_EVENT_POWER_BUTTON, acpi_power_button, NULL)); DLOG ("AcpiInstallNotifyHandler returned %d\n", AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, acpi_notify_handler, NULL)); DLOG ("AcpiInstallNotifyHandler returned %d\n", AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY, acpi_notify_handler, NULL)); extern u8 AcpiGbl_OsiData; AcpiGbl_OsiData=0; /* Walk the System Bus "\_SB_" and output info about each object * found. */ #if 0 ACPI_HANDLE SysBusHandle; AcpiGetHandle (ACPI_ROOT_OBJECT, ACPI_NS_SYSTEM_BUS, &SysBusHandle); AcpiWalkNamespace (ACPI_TYPE_ANY, SysBusHandle, INT_MAX, DisplayOneDevice, NULL, NULL); #else AcpiGetDevices (NULL, DisplayOneDevice, NULL, NULL); #endif }