From d07df715ebc2896a1ebd5a461fb1f2b20eec084f Mon Sep 17 00:00:00 2001 From: jhb Date: Tue, 11 Nov 2003 18:12:12 +0000 Subject: Add an acpi_OverrideInterruptLevel() method that OSPM can use to override the InterruptLevel used for the SCI. --- sys/dev/acpica/Osd/OsdInterrupt.c | 18 ++++++++++++++++++ sys/dev/acpica/acpivar.h | 1 + 2 files changed, 19 insertions(+) (limited to 'sys/dev/acpica') diff --git a/sys/dev/acpica/Osd/OsdInterrupt.c b/sys/dev/acpica/Osd/OsdInterrupt.c index d848145..d4b01c7 100644 --- a/sys/dev/acpica/Osd/OsdInterrupt.c +++ b/sys/dev/acpica/Osd/OsdInterrupt.c @@ -46,6 +46,8 @@ ACPI_MODULE_NAME("INTERRUPT") static void InterruptWrapper(void *arg); static OSD_HANDLER InterruptHandler; +static UINT32 InterruptOverride = 0; + /* * XXX this does not correctly free resources in the case of partically successful * attachment. @@ -81,6 +83,12 @@ AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine return_ACPI_STATUS(AE_ALREADY_EXISTS); } sc->acpi_irq_rid = 0; + if (InterruptOverride != 0) { + device_printf(sc->acpi_dev, + "Overriding SCI Interrupt from IRQ %u to IRQ %u\n", + InterruptNumber, InterruptOverride); + InterruptNumber = InterruptOverride; + } bus_set_resource(sc->acpi_dev, SYS_RES_IRQ, 0, InterruptNumber, 1); if ((sc->acpi_irq = bus_alloc_resource(sc->acpi_dev, SYS_RES_IRQ, &sc->acpi_irq_rid, 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE)) == NULL) { @@ -123,6 +131,16 @@ AcpiOsRemoveInterruptHandler (UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine return_ACPI_STATUS(AE_OK); } +ACPI_STATUS +acpi_OverrideInterruptLevel(UINT32 InterruptNumber) +{ + + if (InterruptOverride != 0) + return_ACPI_STATUS(AE_ALREADY_EXISTS); + InterruptOverride = InterruptNumber; + return_ACPI_STATUS(AE_OK); +} + /* * Interrupt handler wrapper. */ diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h index 77e36ad..dad5165 100644 --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -184,6 +184,7 @@ extern ACPI_STATUS acpi_FindIndexedResource(ACPI_BUFFER *buf, int index, ACPI_RESOURCE **resp); extern ACPI_STATUS acpi_AppendBufferResource(ACPI_BUFFER *buf, ACPI_RESOURCE *res); +extern ACPI_STATUS acpi_OverrideInterruptLevel(UINT32 InterruptNumber); extern ACPI_STATUS acpi_SetIntrModel(int model); extern ACPI_STATUS acpi_SetSleepState(struct acpi_softc *sc, int state); extern ACPI_STATUS acpi_Enable(struct acpi_softc *sc); -- cgit v1.1