Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Mar 2011 13:43:34 +0900
From:      Takanori Watanabe <takawata@init-main.com>
To:        acpi@freebsd.org
Subject:   Review: Add support for additional ACPI table dump for acpidump(8)
Message-ID:  <201103220443.p2M4hYiZ032166@sana.init-main.com>

next in thread | raw e-mail | index | archive | help
This patch adds support capability to dump Alert Standard Format(ASF!)
and Simple Boot format(BOOT) table to acpidump(8).

How about this?


Index: acpidump.h
===================================================================
--- acpidump.h	(revision 219256)
+++ acpidump.h	(working copy)
@@ -33,6 +33,7 @@
 #include <contrib/dev/acpica/include/acpi.h>
 #include <contrib/dev/acpica/include/acconfig.h>
 #include <contrib/dev/acpica/include/actbl1.h>
+#include <contrib/dev/acpica/include/actbl2.h>
 
 /* GAS address space ID constants. */
 #define	ACPI_GAS_MEMORY		0
Index: acpi.c
===================================================================
--- acpi.c	(revision 219256)
+++ acpi.c	(working copy)
@@ -743,7 +743,97 @@
 	}
 }
 
+
 static void
+acpi_handle_boot(ACPI_TABLE_HEADER *sdp)
+{
+	ACPI_TABLE_BOOT *boot = (ACPI_TABLE_BOOT *) sdp;
+	
+	printf(BEGIN_COMMENT);
+	acpi_print_sdt(sdp);
+	printf("\tCMOS Index: %02x\n", boot->CmosIndex);
+	printf(END_COMMENT);
+}
+
+static void
+acpi_handle_asf(ACPI_TABLE_HEADER *sdp)
+{
+	char *p, *q, *r;
+	int i;
+	ACPI_ASF_HEADER *asf;
+	ACPI_ASF_INFO *asfinfo;
+	ACPI_ASF_ALERT *asfalert;
+	ACPI_ASF_REMOTE *asfcontrol;
+	ACPI_ASF_RMCP *asfboot;
+	ACPI_ASF_ADDRESS *asfaddr;
+	ACPI_ASF_CONTROL_DATA *cdata;
+
+	printf(BEGIN_COMMENT);
+	acpi_print_sdt(sdp);
+	p = (char *) sdp + sizeof(ACPI_TABLE_HEADER);
+	q = (char *) sdp + sdp->Length;
+	while(p < q){
+		asf = (ACPI_ASF_HEADER *)p;
+		switch(asf->Type&0x7f){
+		case ACPI_ASF_TYPE_INFO:
+			asfinfo = (ACPI_ASF_INFO *)asf;
+			printf("\tASF_INFO:MinResetValue:%d MinPollInterval:%d\n",asfinfo->MinResetValue, asfinfo->MinPollInterval);
+			printf("\t         MfgId:%08x Flags:%x\n",
+			      asfinfo->MfgId, asfinfo->Flags);
+			break;
+		case ACPI_ASF_TYPE_ALERT:
+			asfalert = (ACPI_ASF_ALERT *)asf;
+			printf("\tASF_ALERT:AssertMask %02x DeassertMask %02x\n",
+			       asfalert->AssertMask, asfalert->DeassertMask);
+			printf("\t            Alerts:%x, Length%x\n", asfalert->Alerts, asfalert->DataLength);
+			break;
+		case ACPI_ASF_TYPE_CONTROL:
+			asfcontrol = (ACPI_ASF_REMOTE *)asf;
+			r = (char *)asf + sizeof(ACPI_ASF_REMOTE);
+
+			printf("\tASF_RCTL:Controls %02x DataLength %02x\n",
+			       asfcontrol->Controls, asfcontrol->DataLength);
+			for(i = 0; i < asfcontrol->Controls; i++){
+				cdata = (ACPI_ASF_CONTROL_DATA *)r ; 
+				printf("\t\tFunc:%02x, Addr %02x, Cmd %02x, Data %02x\n", cdata->Function, cdata->Address, cdata->Command, cdata->Value);
+				r += asfcontrol->DataLength;
+			}
+			break;
+		case ACPI_ASF_TYPE_BOOT:
+			asfboot = (ACPI_ASF_RMCP *)asf;
+			printf("\tASF_RMCP:Capabilities%02x%02x%02x%02x%02x%02x%02x\n", 
+			       asfboot->Capabilities[0],
+			       asfboot->Capabilities[1],
+			       asfboot->Capabilities[2],
+			       asfboot->Capabilities[3],
+			       asfboot->Capabilities[4],
+			       asfboot->Capabilities[5],
+			       asfboot->Capabilities[6]);
+			printf("\t        CompletionCode %02x, EnterpriseId %08x, Command %02x\n",
+			       asfboot->CompletionCode, asfboot->EnterpriseId,
+			       asfboot->Command);
+			printf("\t        Parameter %04x, BootOptions %04x, OemParameters %04x\n",
+			       asfboot->Parameter, asfboot->BootOptions,
+			       asfboot->OemParameters);
+			break;
+		case ACPI_ASF_TYPE_ADDRESS:
+			asfaddr = (ACPI_ASF_ADDRESS *)asf;
+			printf("\tASF_ADDR:EpromAddress %02x Devices %02x\n",
+			       asfaddr->EpromAddress, asfaddr->Devices);
+			break;
+		default:
+			printf("\tType:%02x Length:%04x\n", 
+			       asf->Type&0x7f, asf->Length);
+		}
+		if(asf->Type&0x80)
+			break;
+		p += asf->Length;
+	}
+
+	printf(END_COMMENT);
+}
+
+static void
 acpi_handle_srat(ACPI_TABLE_HEADER *sdp)
 {
 	ACPI_TABLE_SRAT *srat;
@@ -1088,6 +1178,10 @@
 			acpi_handle_srat(sdp);
 		else if (!memcmp(sdp->Signature, ACPI_SIG_TCPA, 4))
 			acpi_handle_tcpa(sdp);
+		else if (!memcmp(sdp->Signature, ACPI_SIG_ASF, 4))
+			acpi_handle_asf(sdp);
+		else if (!memcmp(sdp->Signature, ACPI_SIG_BOOT, 4))
+			acpi_handle_boot(sdp);
 		else {
 			printf(BEGIN_COMMENT);
 			acpi_print_sdt(sdp);




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103220443.p2M4hYiZ032166>