Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/acpitools/acpidump Add support for decoding Platfor...
details: https://anonhg.NetBSD.org/src/rev/b511158d7786
branches: trunk
changeset: 957834:b511158d7786
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Sat Dec 12 16:08:39 2020 +0000
description:
Add support for decoding Platform Communications Channel Tables ("PCCT").
diffstat:
usr.sbin/acpitools/acpidump/acpi.c | 223 ++++++++++++++++++++++++++++++++++++-
1 files changed, 221 insertions(+), 2 deletions(-)
diffs (258 lines):
diff -r 7db8c19f2723 -r b511158d7786 usr.sbin/acpitools/acpidump/acpi.c
--- a/usr.sbin/acpitools/acpidump/acpi.c Sat Dec 12 16:06:27 2020 +0000
+++ b/usr.sbin/acpitools/acpidump/acpi.c Sat Dec 12 16:08:39 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi.c,v 1.47 2020/12/06 18:38:58 jmcneill Exp $ */
+/* $NetBSD: acpi.c,v 1.48 2020/12/12 16:08:39 jmcneill Exp $ */
/*-
* Copyright (c) 1998 Doug Rabson
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: acpi.c,v 1.47 2020/12/06 18:38:58 jmcneill Exp $");
+__RCSID("$NetBSD: acpi.c,v 1.48 2020/12/12 16:08:39 jmcneill Exp $");
#include <sys/param.h>
#include <sys/endian.h>
@@ -103,6 +103,7 @@
static void acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp);
static void acpi_handle_hpet(ACPI_TABLE_HEADER *sdp);
static void acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp);
+static void acpi_handle_pcct(ACPI_TABLE_HEADER *sdp);
static void acpi_handle_pptt(ACPI_TABLE_HEADER *sdp);
static void acpi_handle_sbst(ACPI_TABLE_HEADER *sdp);
static void acpi_handle_slit(ACPI_TABLE_HEADER *sdp);
@@ -2532,6 +2533,222 @@
}
static void
+acpi_print_pcct_subspace(ACPI_PCCT_SUBSPACE *subspace)
+{
+ printf("\tType=Generic Subspace\n");
+ printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
+ printf("\tLength=%jd\n", subspace->Length);
+ printf("\tDoorbell Address=");
+ acpi_print_gas(&subspace->DoorbellRegister);
+ printf("\n");
+ printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
+ printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
+ printf("\tLatency=%u us\n", subspace->Latency);
+ printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
+ printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
+}
+
+static void
+acpi_print_pcct_hw_reduced(ACPI_PCCT_HW_REDUCED *subspace)
+{
+ printf("\tType=HW-reduced Subspace\n");
+ printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
+ printf(", Edge triggered");
+ } else {
+ printf(", Level triggered");
+ }
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
+ printf(", Active low");
+ } else {
+ printf(", Active high");
+ }
+ printf("\n");
+ printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
+ printf("\tLength=%jd\n", subspace->Length);
+ printf("\tDoorbell Register=");
+ acpi_print_gas(&subspace->DoorbellRegister);
+ printf("\n");
+ printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
+ printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
+ printf("\tLatency=%u us\n", subspace->Latency);
+ printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
+ printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
+}
+
+static void
+acpi_print_pcct_hw_reduced_type2(ACPI_PCCT_HW_REDUCED_TYPE2 *subspace)
+{
+ printf("\tType=HW-reduced Subspace Type 2\n");
+ printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
+ printf(", Edge triggered");
+ } else {
+ printf(", Level triggered");
+ }
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
+ printf(", Active low");
+ } else {
+ printf(", Active high");
+ }
+ printf("\n");
+ printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
+ printf("\tLength=%jd\n", subspace->Length);
+ printf("\tDoorbell Register=");
+ acpi_print_gas(&subspace->DoorbellRegister);
+ printf("\n");
+ printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
+ printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
+ printf("\tLatency=%u us\n", subspace->Latency);
+ printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
+ printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
+ printf("\tPlatform Interrupt Ack Register=");
+ acpi_print_gas(&subspace->PlatformAckRegister);
+ printf("\n");
+ printf("\tPlatform Interrupt Ack Preserve=0x%016jx\n", subspace->AckPreserveMask);
+ printf("\tPlatform Interrupt Ack Write=0x%016jx\n", subspace->AckWriteMask);
+}
+
+static void
+acpi_print_pcct_ext_pcc_master(ACPI_PCCT_EXT_PCC_MASTER *subspace)
+{
+ printf("\tType=Extended PCC Master Subspace\n");
+ printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
+ printf(", Edge triggered");
+ } else {
+ printf(", Level triggered");
+ }
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
+ printf(", Active low");
+ } else {
+ printf(", Active high");
+ }
+ printf("\n");
+ printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
+ printf("\tLength=%d\n", subspace->Length);
+ printf("\tDoorbell Register=");
+ acpi_print_gas(&subspace->DoorbellRegister);
+ printf("\n");
+ printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
+ printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
+ printf("\tLatency=%u us\n", subspace->Latency);
+ printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
+ printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
+ printf("\tPlatform Interrupt Ack Register=");
+ acpi_print_gas(&subspace->PlatformAckRegister);
+ printf("\n");
+ printf("\tPlatform Interrupt Ack Preserve=0x%016jx\n", subspace->AckPreserveMask);
+ printf("\tPlatform Interrupt Ack Set=0x%016jx\n", subspace->AckSetMask);
+ printf("\tCommand Complete Register=");
+ acpi_print_gas(&subspace->CmdCompleteRegister);
+ printf("\n");
+ printf("\tCommand Complete Mask=0x%016jx\n", subspace->CmdCompleteMask);
+ printf("\tCommand Update Register=");
+ acpi_print_gas(&subspace->CmdUpdateRegister);
+ printf("\n");
+ printf("\tCommand Update Preserve Mask=0x%016jx\n", subspace->CmdUpdatePreserveMask);
+ printf("\tCommand Update Set MAsk=0x%016jx\n", subspace->CmdUpdateSetMask);
+ printf("\tError Status Register=");
+ acpi_print_gas(&subspace->ErrorStatusRegister);
+ printf("\n");
+ printf("\tError Status Mask=0x%016jx\n", subspace->ErrorStatusMask);
+}
+
+static void
+acpi_print_pcct_ext_pcc_slave(ACPI_PCCT_EXT_PCC_SLAVE *subspace)
+{
+ printf("\tType=Extended PCC Slave Subspace\n");
+ printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
+ printf(", Edge triggered");
+ } else {
+ printf(", Level triggered");
+ }
+ if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
+ printf(", Active low");
+ } else {
+ printf(", Active high");
+ }
+ printf("\n");
+ printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
+ printf("\tLength=%d\n", subspace->Length);
+ printf("\tDoorbell Register=");
+ acpi_print_gas(&subspace->DoorbellRegister);
+ printf("\n");
+ printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
+ printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
+ printf("\tLatency=%u us\n", subspace->Latency);
+ printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
+ printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
+ printf("\tPlatform Interrupt Ack Register=");
+ acpi_print_gas(&subspace->PlatformAckRegister);
+ printf("\n");
+ printf("\tPlatform Interrupt Ack Preserve=0x%016jx\n", subspace->AckPreserveMask);
+ printf("\tPlatform Interrupt Ack Set=0x%016jx\n", subspace->AckSetMask);
+ printf("\tCommand Complete Register=");
+ acpi_print_gas(&subspace->CmdCompleteRegister);
+ printf("\n");
+ printf("\tCommand Complete Mask=0x%016jx\n", subspace->CmdCompleteMask);
+ printf("\tCommand Update Register=");
+ acpi_print_gas(&subspace->CmdUpdateRegister);
+ printf("\n");
+ printf("\tCommand Update Preserve Mask=0x%016jx\n", subspace->CmdUpdatePreserveMask);
+ printf("\tCommand Update Set MAsk=0x%016jx\n", subspace->CmdUpdateSetMask);
+ printf("\tError Status Register=");
+ acpi_print_gas(&subspace->ErrorStatusRegister);
+ printf("\n");
+ printf("\tError Status Mask=0x%016jx\n", subspace->ErrorStatusMask);
+}
+
+static void
+acpi_print_pcct(ACPI_SUBTABLE_HEADER *hdr)
+{
+ switch (hdr->Type) {
+ case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
+ acpi_print_pcct_subspace((ACPI_PCCT_SUBSPACE *)hdr);
+ break;
+ case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
+ acpi_print_pcct_hw_reduced((ACPI_PCCT_HW_REDUCED *)hdr);
+ break;
+ case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
+ acpi_print_pcct_hw_reduced_type2((ACPI_PCCT_HW_REDUCED_TYPE2 *)hdr);
+ break;
+ case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
+ acpi_print_pcct_ext_pcc_master((ACPI_PCCT_EXT_PCC_MASTER *)hdr);
+ break;
+ case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
+ acpi_print_pcct_ext_pcc_slave((ACPI_PCCT_EXT_PCC_SLAVE *)hdr);
+ break;
+ default:
+ printf("\tUnknown structure"
+ "(type = %hhu, length = %hhu)\n",
+ hdr->Type, hdr->Length);
+ break;
+ }
+}
+
+static void
+acpi_handle_pcct(ACPI_TABLE_HEADER *sdp)
+{
+ ACPI_TABLE_PCCT *pcct;
+
+ printf(BEGIN_COMMENT);
+ acpi_print_sdt(sdp);
+
+ pcct = (ACPI_TABLE_PCCT *)sdp;
+#define PRINTFLAG(var, flag) printflag((var), ACPI_PCCT_## flag, #flag)
+ printf("\tFlags=");
+ PRINTFLAG(pcct->Flags, DOORBELL);
+ PRINTFLAG_END();
+#undef PRINTFLAG
+
+ acpi_walk_subtables(sdp, (pcct + 1), acpi_print_pcct);
+
+ printf(END_COMMENT);
+}
+
+static void
acpi_print_pptt_processor(ACPI_PPTT_PROCESSOR *processor)
{
uint32_t *private;
@@ -4309,6 +4526,8 @@
acpi_handle_lpit(sdp);
else if (!memcmp(sdp->Signature, ACPI_SIG_MCFG, 4))
acpi_handle_mcfg(sdp);
+ else if (!memcmp(sdp->Signature, ACPI_SIG_PCCT, 4))
+ acpi_handle_pcct(sdp);
else if (!memcmp(sdp->Signature, ACPI_SIG_PPTT, 4))
acpi_handle_pptt(sdp);
else if (!memcmp(sdp->Signature, ACPI_SIG_SBST, 4))
Home |
Main Index |
Thread Index |
Old Index