summaryrefslogtreecommitdiffstats
path: root/usr.sbin/acpi
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2003-09-10 22:00:45 +0000
committernjl <njl@FreeBSD.org>2003-09-10 22:00:45 +0000
commita77d2b18b17c2cf45ea9e65f62501845f5ebf231 (patch)
treea277df0f8a7cae54374e63822c7e505ff10680ab /usr.sbin/acpi
parent5b7162679021b8172dbaed25aa7e46235bc50eb3 (diff)
downloadFreeBSD-src-a77d2b18b17c2cf45ea9e65f62501845f5ebf231.zip
FreeBSD-src-a77d2b18b17c2cf45ea9e65f62501845f5ebf231.tar.gz
o Workaround a bug where my T23 reports that it is ACPI 2.0x compatible
but has invalid 64 bit pointers for FACS and DSDT. o Finish work to print all of the FADT and FACS. o Resort the comment generating functions. Submitted by: marcel Courtesy of: BSDcon back wall
Diffstat (limited to 'usr.sbin/acpi')
-rw-r--r--usr.sbin/acpi/acpidump/acpi.c95
-rw-r--r--usr.sbin/acpi/acpidump/acpidump.h4
2 files changed, 70 insertions, 29 deletions
diff --git a/usr.sbin/acpi/acpidump/acpi.c b/usr.sbin/acpi/acpidump/acpi.c
index f241f7e..92be215 100644
--- a/usr.sbin/acpi/acpidump/acpi.c
+++ b/usr.sbin/acpi/acpidump/acpi.c
@@ -56,7 +56,7 @@ static void acpi_print_intr(u_int32_t intr, u_int16_t mps_flags);
static void acpi_print_apic(struct MADT_APIC *mp);
static void acpi_handle_apic(struct ACPIsdt *sdp);
static void acpi_handle_hpet(struct ACPIsdt *sdp);
-static void acpi_print_sdt(struct ACPIsdt *sdp, int endcomment);
+static void acpi_print_sdt(struct ACPIsdt *sdp);
static void acpi_print_fadt(struct FADTbody *fadt);
static void acpi_print_facs(struct FACSbody *facs);
static void acpi_print_dsdt(struct ACPIsdt *dsdp);
@@ -64,9 +64,7 @@ static struct ACPIsdt *acpi_map_sdt(vm_offset_t pa);
static void acpi_print_rsd_ptr(struct ACPIrsdp *rp);
static void acpi_handle_rsdt(struct ACPIsdt *rsdp);
-/*
- * Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up.
- */
+/* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */
static int addr_size;
static void
@@ -89,30 +87,30 @@ acpi_print_gas(struct ACPIgas *gas)
{
switch(gas->address_space_id) {
case ACPI_GAS_MEMORY:
- printf("0x%08lx:%u[%u] (Memory)\n", (u_long)gas->address,
+ printf("0x%08lx:%u[%u] (Memory)", (u_long)gas->address,
gas->bit_offset, gas->bit_width);
break;
case ACPI_GAS_IO:
- printf("0x%08lx:%u[%u] (IO)\n", (u_long)gas->address,
+ printf("0x%08lx:%u[%u] (IO)", (u_long)gas->address,
gas->bit_offset, gas->bit_width);
break;
case ACPI_GAS_PCI:
- printf("%x:%x+%#x (PCI)\n", (uint16_t)(gas->address >> 32),
+ printf("%x:%x+%#x (PCI)", (uint16_t)(gas->address >> 32),
(uint16_t)((gas->address >> 16) & 0xffff),
(uint16_t)gas->address);
break;
/* XXX How to handle these below? */
case ACPI_GAS_EMBEDDED:
- printf("0x%#x:%u[%u] (EC)\n", (uint16_t)gas->address,
+ printf("0x%#x:%u[%u] (EC)", (uint16_t)gas->address,
gas->bit_offset, gas->bit_width);
break;
case ACPI_GAS_SMBUS:
- printf("0x%#x:%u[%u] (SMBus)\n", (uint16_t)gas->address,
+ printf("0x%#x:%u[%u] (SMBus)", (uint16_t)gas->address,
gas->bit_offset, gas->bit_width);
break;
case ACPI_GAS_FIXED:
default:
- printf("0x%08lx (?)\n", (u_long)gas->address);
+ printf("0x%08lx (?)", (u_long)gas->address);
break;
}
}
@@ -125,12 +123,27 @@ acpi_handle_fadt(struct FADTbody *fadt)
acpi_print_fadt(fadt);
- facs = (struct FACSbody *)acpi_map_sdt(fadt->facs_ptr);
+ /*
+ * My T23 is revision 2 but the 64 bit addresses are invalid.
+ * If revision 2 and the 32 bit address is non-zero but the 32
+ * and 64 bit versions don't match, prefer the 32 bit version.
+ */
+ if (addr_size == 4 ||
+ (addr_size == 8 && fadt->facs_ptr != 0 &&
+ (fadt->x_facs_ptr & 0xffffffff) != fadt->facs_ptr))
+ facs = (struct FACSbody *)acpi_map_sdt(fadt->facs_ptr);
+ else
+ facs = (struct FACSbody *)acpi_map_sdt(fadt->x_facs_ptr);
if (memcmp(facs->signature, "FACS", 4) != 0 || facs->len < 64)
errx(1, "FACS is corrupt");
acpi_print_facs(facs);
- dsdp = (struct ACPIsdt *)acpi_map_sdt(fadt->dsdt_ptr);
+ if (addr_size == 4 ||
+ (addr_size == 8 && fadt->dsdt_ptr != 0 &&
+ (fadt->x_dsdt_ptr & 0xffffffff) != fadt->dsdt_ptr))
+ dsdp = (struct ACPIsdt *)acpi_map_sdt(fadt->dsdt_ptr);
+ else
+ dsdp = (struct ACPIsdt *)acpi_map_sdt(fadt->x_dsdt_ptr);
if (acpi_checksum(dsdp, dsdp->len))
errx(1, "DSDT is corrupt");
acpi_print_dsdt(dsdp);
@@ -283,7 +296,8 @@ acpi_handle_apic(struct ACPIsdt *sdp)
struct MADTbody *madtp;
struct MADT_APIC *madt_apicp;
- acpi_print_sdt(sdp, /*endcomment*/0);
+ printf(BEGIN_COMMENT);
+ acpi_print_sdt(sdp);
madtp = (struct MADTbody *) sdp->body;
printf("\tLocal APIC ADDR=0x%08x\n", madtp->lapic_addr);
printf("\tFlags={");
@@ -305,7 +319,8 @@ acpi_handle_hpet(struct ACPIsdt *sdp)
{
struct HPETbody *hpetp;
- acpi_print_sdt(sdp, /*endcomment*/0);
+ printf(BEGIN_COMMENT);
+ acpi_print_sdt(sdp);
hpetp = (struct HPETbody *) sdp->body;
printf("\tHPET Number=%d\n", hpetp->hpet_number);
printf("\tADDR=0x%08x\n", hpetp->base_addr);
@@ -323,9 +338,9 @@ acpi_handle_hpet(struct ACPIsdt *sdp)
}
static void
-acpi_print_sdt(struct ACPIsdt *sdp, int endcomment)
+acpi_print_sdt(struct ACPIsdt *sdp)
{
- printf(BEGIN_COMMENT " ");
+ printf(" ");
acpi_print_string(sdp->signature, 4);
printf(": Length=%d, Revision=%d, Checksum=%d,\n",
sdp->len, sdp->rev, sdp->check);
@@ -337,8 +352,6 @@ acpi_print_sdt(struct ACPIsdt *sdp, int endcomment)
printf("\tCreator ID=");
acpi_print_string(sdp->creator, 4);
printf(", Creator Revision=0x%x\n", sdp->crerev);
- if (endcomment)
- printf(END_COMMENT);
}
static void
@@ -347,7 +360,8 @@ acpi_print_rsdt(struct ACPIsdt *rsdp)
int i, entries;
u_long addr;
- acpi_print_sdt(rsdp, /*endcomment*/0);
+ printf(BEGIN_COMMENT);
+ acpi_print_sdt(rsdp);
entries = (rsdp->len - SIZEOF_SDT_HDR) / addr_size;
printf("\tEntries={ ");
for (i = 0; i < entries; i++) {
@@ -477,6 +491,27 @@ acpi_print_fadt(struct FADTbody *fadt)
acpi_print_gas(&fadt->reset_reg);
printf(", RESET_VALUE=%#x\n", fadt->reset_value);
}
+ if (addr_size == 8) {
+ printf("\tX_FACS=0x%08lx, ", (u_long)fadt->x_facs_ptr);
+ printf("X_DSDT=0x%08lx\n", (u_long)fadt->x_dsdt_ptr);
+ printf("\tX_PM1A_EVT_BLK=");
+ acpi_print_gas(&fadt->x_pm1a_evt_blk);
+ printf("\n\tX_PM1B_EVT_BLK=");
+ acpi_print_gas(&fadt->x_pm1b_evt_blk);
+ printf("\n\tX_PM1A_CNT_BLK=");
+ acpi_print_gas(&fadt->x_pm1a_cnt_blk);
+ printf("\n\tX_PM1B_CNT_BLK=");
+ acpi_print_gas(&fadt->x_pm1b_cnt_blk);
+ printf("\n\tX_PM2_CNT_BLK=");
+ acpi_print_gas(&fadt->x_pm2_cnt_blk);
+ printf("\n\tX_PM_TMR_BLK=");
+ acpi_print_gas(&fadt->x_pm_tmr_blk);
+ printf("\n\tX_GPE0_BLK=");
+ acpi_print_gas(&fadt->x_gpe0_blk);
+ printf("\n\tX_GPE1_BLK=");
+ acpi_print_gas(&fadt->x_gpe1_blk);
+ printf("\n");
+ }
printf(END_COMMENT);
}
@@ -489,24 +524,25 @@ acpi_print_facs(struct FACSbody *facs)
printf("HwSig=0x%08x, ", facs->hw_sig);
printf("Firm_Wake_Vec=0x%08x\n", facs->firm_wake_vec);
- printf("\tGlobal_Lock={");
+ printf("\tGlobal_Lock=");
if (facs->global_lock != 0) {
if (facs->global_lock & FACS_FLAG_LOCK_PENDING)
printf("PENDING,");
if (facs->global_lock & FACS_FLAG_LOCK_OWNED)
printf("OWNED");
}
- printf("}\n");
+ printf("\n");
- printf("\tFlags={");
+ printf("\tFlags=");
if (facs->flags & FACS_FLAG_S4BIOS_F)
printf("S4BIOS");
- printf("}\n");
+ printf("\n");
if (facs->x_firm_wake_vec != 0) {
printf("\tX_Firm_Wake_Vec=%08lx\n",
(u_long)facs->x_firm_wake_vec);
}
+ printf("\tVersion=%u\n", facs->version);
printf(END_COMMENT);
}
@@ -514,7 +550,9 @@ acpi_print_facs(struct FACSbody *facs)
static void
acpi_print_dsdt(struct ACPIsdt *dsdp)
{
- acpi_print_sdt(dsdp, /*endcomment*/1);
+ printf(BEGIN_COMMENT);
+ acpi_print_sdt(dsdp);
+ printf(END_COMMENT);
}
int
@@ -547,7 +585,7 @@ acpi_print_rsd_ptr(struct ACPIrsdp *rp)
printf(BEGIN_COMMENT);
printf(" RSD PTR: OEM=");
acpi_print_string(rp->oem, 6);
- printf(", ACPI_Rev=%s (%d)\n", rp->revision < 2 ? "1.x" : "2.x",
+ printf(", ACPI_Rev=%s (%d)\n", rp->revision < 2 ? "1.0x" : "2.0x",
rp->revision);
if (rp->revision < 2) {
printf("\tRSDT=0x%08x, cksum=%u\n", rp->rsdt_addr, rp->sum);
@@ -588,8 +626,11 @@ acpi_handle_rsdt(struct ACPIsdt *rsdp)
acpi_handle_apic(sdp);
else if (!memcmp(sdp->signature, "HPET", 4))
acpi_handle_hpet(sdp);
- else
- acpi_print_sdt(sdp, /*endcomment*/1);
+ else {
+ printf(BEGIN_COMMENT);
+ acpi_print_sdt(sdp);
+ printf(END_COMMENT);
+ }
}
}
diff --git a/usr.sbin/acpi/acpidump/acpidump.h b/usr.sbin/acpi/acpidump/acpidump.h
index 09ebfce..783fc6d 100644
--- a/usr.sbin/acpi/acpidump/acpidump.h
+++ b/usr.sbin/acpi/acpidump/acpidump.h
@@ -134,8 +134,8 @@ struct FADTbody {
struct ACPIgas reset_reg;
u_int8_t reset_value;
u_int8_t reserved5[3];
- u_int64_t x_firmware_ctrl;
- u_int64_t x_dsdt;
+ u_int64_t x_facs_ptr;
+ u_int64_t x_dsdt_ptr;
struct ACPIgas x_pm1a_evt_blk;
struct ACPIgas x_pm1b_evt_blk;
struct ACPIgas x_pm1a_cnt_blk;
OpenPOWER on IntegriCloud