summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2003-11-11 18:12:12 +0000
committerjhb <jhb@FreeBSD.org>2003-11-11 18:12:12 +0000
commitd07df715ebc2896a1ebd5a461fb1f2b20eec084f (patch)
treeb20c7ad0a9099848d4ffc0289d9d0222a3370919 /sys/dev/acpica
parentdb726f026bf78f402dba4404d952954e6e31c245 (diff)
downloadFreeBSD-src-d07df715ebc2896a1ebd5a461fb1f2b20eec084f.zip
FreeBSD-src-d07df715ebc2896a1ebd5a461fb1f2b20eec084f.tar.gz
Add an acpi_OverrideInterruptLevel() method that OSPM can use to override
the InterruptLevel used for the SCI.
Diffstat (limited to 'sys/dev/acpica')
-rw-r--r--sys/dev/acpica/Osd/OsdInterrupt.c18
-rw-r--r--sys/dev/acpica/acpivar.h1
2 files changed, 19 insertions, 0 deletions
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);
OpenPOWER on IntegriCloud