summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaket Dumbre <97769119+sacdintel@users.noreply.github.com>2023-05-10 11:22:48 -0700
committerGitHub <noreply@github.com>2023-05-10 11:22:48 -0700
commit71abb8cff8e8adaef61f0e11eed42dda64892c1d (patch)
treeef5aed5eb59edaa93cb4c41f3f7ea501350b91ee
parent3a526a6d94d3ab6798c95f62ebaff36f5344586a (diff)
parentef7cf185a046d76119b631f16e7c991543c80edc (diff)
downloadacpica-71abb8cff8e8adaef61f0e11eed42dda64892c1d.tar.gz
Merge pull request #864 from jmarinho/master
Add support for Interrupt in acpiexec
-rw-r--r--source/components/debugger/dbcmds.c60
-rw-r--r--source/components/debugger/dbinput.c8
-rw-r--r--source/include/acdebug.h4
-rw-r--r--source/include/acglobal.h1
-rw-r--r--source/include/aclocal.h9
-rw-r--r--source/include/acnames.h1
-rw-r--r--source/tools/acpiexec/aeinstall.c118
7 files changed, 199 insertions, 2 deletions
diff --git a/source/components/debugger/dbcmds.c b/source/components/debugger/dbcmds.c
index b8c2b4228..6636f7b97 100644
--- a/source/components/debugger/dbcmds.c
+++ b/source/components/debugger/dbcmds.c
@@ -156,7 +156,7 @@
#include "acnamesp.h"
#include "acresrc.h"
#include "actables.h"
-
+#include "limits.h"
#define _COMPONENT ACPI_CA_DEBUGGER
ACPI_MODULE_NAME ("dbcmds")
@@ -1291,6 +1291,64 @@ AcpiDbDisplayResources (
}
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGenerateGed
+ *
+ * PARAMETERS: GedArg - Raw GED number, ascii string
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Simulate firing of a GED
+ *
+ ******************************************************************************/
+
+void
+AcpiDbGenerateInterrupt (
+ char *GsivArg)
+{
+ UINT32 GsivNumber;
+ ACPI_GED_HANDLER_INFO *GedInfo = AcpiGbl_GedHandlerList;
+
+ if (!GedInfo) {
+ AcpiOsPrintf ("No GED handling present\n");
+ }
+
+ GsivNumber = strtoul (GsivArg, NULL, 0);
+
+ while (GedInfo) {
+
+ if (GedInfo->IntId == GsivNumber) {
+ ACPI_OBJECT_LIST ArgList;
+ ACPI_OBJECT Arg0;
+ ACPI_HANDLE EvtHandle = GedInfo->EvtMethod;
+ ACPI_STATUS Status;
+
+ AcpiOsPrintf ("Evaluate GED _EVT (GSIV=%d)\n", GsivNumber);
+
+ if (!EvtHandle) {
+ AcpiOsPrintf ("Undefined _EVT method\n");
+ return;
+ }
+
+ Arg0.Integer.Type = ACPI_TYPE_INTEGER;
+ Arg0.Integer.Value = GsivNumber;
+
+ ArgList.Count = 1;
+ ArgList.Pointer = &Arg0;
+
+ Status = AcpiEvaluateObject (EvtHandle, NULL, &ArgList, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not evaluate _EVT\n");
+ return;
+ }
+
+ }
+ GedInfo = GedInfo->Next;
+ }
+}
+
#if (!ACPI_REDUCED_HARDWARE)
/*******************************************************************************
*
diff --git a/source/components/debugger/dbinput.c b/source/components/debugger/dbinput.c
index 5e5c62893..d98c24870 100644
--- a/source/components/debugger/dbinput.c
+++ b/source/components/debugger/dbinput.c
@@ -264,6 +264,7 @@ enum AcpiExDebuggerCommands
CMD_THREADS,
CMD_TEST,
+ CMD_INTERRUPT,
#endif
};
@@ -345,6 +346,7 @@ static const ACPI_DB_COMMAND_INFO AcpiGbl_DbCommands[] =
{"THREADS", 3},
{"TEST", 1},
+ {"INTERRUPT", 1},
#endif
{NULL, 0}
};
@@ -461,6 +463,7 @@ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandHelp[] =
{1, " Gpes", "Display info on all GPE devices\n"},
{1, " Sci", "Generate an SCI\n"},
{1, " Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"},
+ {1, " Interrupt <GSIV>", "Simulate an interrupt\n"},
#endif
{0, NULL, NULL}
};
@@ -1263,6 +1266,11 @@ AcpiDbCommandDispatch (
AcpiOsPrintf ("Event command not implemented\n");
break;
+ case CMD_INTERRUPT:
+
+ AcpiDbGenerateInterrupt (AcpiGbl_DbArgs[1]);
+ break;
+
case CMD_GPE:
AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
diff --git a/source/include/acdebug.h b/source/include/acdebug.h
index c1596ee89..054de129e 100644
--- a/source/include/acdebug.h
+++ b/source/include/acdebug.h
@@ -619,4 +619,8 @@ AcpiDbUint32ToHexString (
UINT32 Value,
char *Buffer);
+void
+AcpiDbGenerateInterrupt (
+ char *GsivArg);
+
#endif /* __ACDEBUG_H__ */
diff --git a/source/include/acglobal.h b/source/include/acglobal.h
index 28fc6514b..9df72a576 100644
--- a/source/include/acglobal.h
+++ b/source/include/acglobal.h
@@ -268,6 +268,7 @@ ACPI_GLOBAL (ACPI_TABLE_HANDLER, AcpiGbl_TableHandler);
ACPI_GLOBAL (void *, AcpiGbl_TableHandlerContext);
ACPI_GLOBAL (ACPI_INTERFACE_HANDLER, AcpiGbl_InterfaceHandler);
ACPI_GLOBAL (ACPI_SCI_HANDLER_INFO *, AcpiGbl_SciHandlerList);
+ACPI_GLOBAL (ACPI_GED_HANDLER_INFO *, AcpiGbl_GedHandlerList);
/* Owner ID support */
diff --git a/source/include/aclocal.h b/source/include/aclocal.h
index 2d7c8355a..99459a8b8 100644
--- a/source/include/aclocal.h
+++ b/source/include/aclocal.h
@@ -767,6 +767,15 @@ typedef struct acpi_field_info
} ACPI_FIELD_INFO;
+/* Information about the interrupt ID and _EVT of a GED device */
+
+typedef struct acpi_ged_handler_info
+{
+ struct acpi_ged_handler_info *Next;
+ UINT32 IntId; /* The interrupt ID that triggers the execution ofthe EvtMethod. */
+ ACPI_NAMESPACE_NODE *EvtMethod; /* The _EVT method to be executed when an interrupt with ID = IntID is received */
+
+} ACPI_GED_HANDLER_INFO;
/*****************************************************************************
*
diff --git a/source/include/acnames.h b/source/include/acnames.h
index a6cdd2e2c..e9f0af8c8 100644
--- a/source/include/acnames.h
+++ b/source/include/acnames.h
@@ -164,6 +164,7 @@
#define METHOD_NAME__DDN "_DDN"
#define METHOD_NAME__DIS "_DIS"
#define METHOD_NAME__DMA "_DMA"
+#define METHOD_NAME__EVT "_EVT"
#define METHOD_NAME__HID "_HID"
#define METHOD_NAME__INI "_INI"
#define METHOD_NAME__PLD "_PLD"
diff --git a/source/tools/acpiexec/aeinstall.c b/source/tools/acpiexec/aeinstall.c
index 9e1940c3f..b855fcbce 100644
--- a/source/tools/acpiexec/aeinstall.c
+++ b/source/tools/acpiexec/aeinstall.c
@@ -176,6 +176,13 @@ AeInstallPciHandler (
void *Context,
void **ReturnValue);
+static ACPI_STATUS
+AeInstallGedHandler (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
BOOLEAN AcpiGbl_DisplayRegionAccess = FALSE;
ACPI_CONNECTION_INFO AeMyContext;
@@ -343,6 +350,110 @@ AeInstallRegionHandlers (
}
}
+/*******************************************************************************
+ *
+ * FUNCTION: AeInstallGedHandler
+ *
+ * PARAMETERS: ACPI_WALK_NAMESPACE callback
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk entire namespace, install a handler for every GED
+ * device found.
+ *
+ ******************************************************************************/
+static ACPI_STATUS
+AeInstallGedHandler (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+
+ ACPI_BUFFER ReturnBuffer;
+ ACPI_STATUS Status;
+ ACPI_RESOURCE *ResourceList;
+ ACPI_RESOURCE_EXTENDED_IRQ *extended_irq_rsc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_NAMESPACE_NODE *EvtMethodNode;
+
+ ACPI_FUNCTION_ENTRY();
+
+ /* Obtain the Namespace Node of this GED object handle. */
+ Node = AcpiNsValidateHandle (ObjHandle);
+ if (!Node)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * A GED device must have one _EVT method.
+ * Obtain the _EVT method and store it in the global
+ * GED register.
+ */
+ Status = AcpiNsSearchOneScope (
+ *ACPI_CAST_PTR (ACPI_NAME, METHOD_NAME__EVT),
+ Node,
+ ACPI_TYPE_METHOD,
+ &EvtMethodNode
+ );
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Failed to obtain _EVT method for the GED device.\n");
+ return Status;
+ }
+
+ ReturnBuffer.Pointer = NULL;
+ ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
+ Status = AcpiGetCurrentResources (ObjHandle, &ReturnBuffer);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
+ AcpiFormatException (Status));
+ return Status;
+ }
+
+ /* Traverse the _CRS resource list */
+ ResourceList = ACPI_CAST_PTR (ACPI_RESOURCE, ReturnBuffer.Pointer);
+ while (ResourceList->Type != ACPI_RESOURCE_TYPE_END_TAG) {
+
+ switch (ResourceList->Type) {
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: {
+
+ /*
+ * Found an Interrupt resource. Link the interrupt resource
+ * and the _EVT method of this GED device in the GED event handler list.
+ */
+ ACPI_GED_HANDLER_INFO *GedHandler =
+ ACPI_ALLOCATE (sizeof (ACPI_SCI_HANDLER_INFO));
+ if (!GedHandler)
+ {
+ return AE_NO_MEMORY;
+ }
+
+ GedHandler->Next = AcpiGbl_GedHandlerList;
+ AcpiGbl_GedHandlerList = GedHandler;
+
+ extended_irq_rsc = &ResourceList->Data.ExtendedIrq;
+
+ GedHandler->IntId = extended_irq_rsc->Interrupts[0];
+ GedHandler->EvtMethod = EvtMethodNode;
+
+ AcpiOsPrintf ("Interrupt ID %d\n", extended_irq_rsc->Interrupts[0]);
+
+ break;
+ }
+ default:
+
+ AcpiOsPrintf ("Resource type %X\n", ResourceList->Type);
+ }
+
+ ResourceList = ACPI_NEXT_RESOURCE (ResourceList);
+ }
+
+ return AE_OK;
+}
/*******************************************************************************
*
@@ -352,7 +463,7 @@ AeInstallRegionHandlers (
*
* RETURN: Status
*
- * DESCRIPTION: Install handlers for all EC and PCI devices in the namespace
+ * DESCRIPTION: Install handlers for all EC, PCI and GED devices in the namespace
*
******************************************************************************/
@@ -368,6 +479,11 @@ AeInstallDeviceHandlers (
/* Install a PCI handler */
AcpiGetDevices ("PNP0A08", AeInstallPciHandler, NULL, NULL);
+
+ /* Install a GED handler */
+
+ AcpiGetDevices ("ACPI0013", AeInstallGedHandler, NULL, NULL);
+
return (AE_OK);
}