Rename FACP to FADT throughout.

Update FADT for new fields including pm_profile, pstate_cnt, and cst_cnt.
Add acpi_print_gas() for printing various address formats.
Print FACS contents.
Remove unused code.
This commit is contained in:
Nate Lawson 2003-09-09 08:31:58 +00:00
parent 0dd872f5bb
commit 8e6a8737d7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=119912
4 changed files with 206 additions and 111 deletions

View File

@ -44,7 +44,8 @@
#define END_COMMENT " */\n"
static void acpi_print_string(char *s, size_t length);
static void acpi_handle_facp(struct FACPbody *facp);
static void acpi_print_gas(struct ACPIgas *gas);
static void acpi_handle_fadt(struct FADTbody *fadt);
static void acpi_print_cpu(u_char cpu_id);
static void acpi_print_local_apic(u_char cpu_id, u_char apic_id,
u_int32_t flags);
@ -56,7 +57,8 @@ 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_facp(struct FACPbody *facp);
static void acpi_print_fadt(struct FADTbody *fadt);
static void acpi_print_facs(struct FACSbody *facs);
static void acpi_print_dsdt(struct ACPIsdt *dsdp);
static struct ACPIsdt *
acpi_map_sdt(vm_offset_t pa);
@ -79,12 +81,52 @@ acpi_print_string(char *s, size_t length)
}
static void
acpi_handle_facp(struct FACPbody *facp)
acpi_print_gas(struct ACPIgas *gas)
{
struct ACPIsdt *dsdp;
switch(gas->address_space_id) {
case ACPI_GAS_MEMORY:
printf("0x%08lx:%u[%u] (Memory)\n", (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,
gas->bit_offset, gas->bit_width);
break;
case ACPI_GAS_PCI:
printf("%x:%x+%#x (PCI)\n", (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,
gas->bit_offset, gas->bit_width);
break;
case ACPI_GAS_SMBUS:
printf("0x%#x:%u[%u] (SMBus)\n", (uint16_t)gas->address,
gas->bit_offset, gas->bit_width);
break;
case ACPI_GAS_FIXED:
default:
printf("0x%08lx (?)\n", (u_long)gas->address);
break;
}
}
acpi_print_facp(facp);
dsdp = (struct ACPIsdt *)acpi_map_sdt(facp->dsdt_ptr);
static void
acpi_handle_fadt(struct FADTbody *fadt)
{
struct ACPIsdt *dsdp;
struct FACSbody *facs;
acpi_print_fadt(fadt);
facs = (struct FACSbody *)acpi_map_sdt(fadt->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 (acpi_checksum(dsdp, dsdp->len))
errx(1, "DSDT is corrupt");
acpi_print_dsdt(dsdp);
@ -312,83 +354,144 @@ acpi_print_rsdt(struct ACPIsdt *rsdp)
printf(END_COMMENT);
}
static const char *acpi_pm_profiles[] = {
"Unspecified", "Desktop", "Mobile", "Workstation",
"Enterprise Server", "SOHO Server", "Appliance PC"
};
static void
acpi_print_facp(struct FACPbody *facp)
acpi_print_fadt(struct FADTbody *fadt)
{
char sep;
const char *pm;
char sep;
printf(BEGIN_COMMENT);
printf(" FACP:\tDSDT=0x%x\n", facp->dsdt_ptr);
printf("\tINT_MODEL=%s\n", facp->int_model ? "APIC" : "PIC");
printf("\tSCI_INT=%d\n", facp->sci_int);
printf("\tSMI_CMD=0x%x, ", facp->smi_cmd);
printf("ACPI_ENABLE=0x%x, ", facp->acpi_enable);
printf("ACPI_DISABLE=0x%x, ", facp->acpi_disable);
printf("S4BIOS_REQ=0x%x\n", facp->s4biosreq);
if (facp->pm1a_evt_blk)
printf(" FADT:\tFACS=0x%x, DSDT=0x%x\n", fadt->facs_ptr,
fadt->dsdt_ptr);
printf("\tINT_MODEL=%s\n", fadt->int_model ? "APIC" : "PIC");
if (fadt->pm_profile >= sizeof(acpi_pm_profiles) / sizeof(char *))
pm = "Reserved";
else
pm = acpi_pm_profiles[fadt->pm_profile];
printf("\tPreferred_PM_Profile=%s (%d)\n", pm, fadt->pm_profile);
printf("\tSCI_INT=%d\n", fadt->sci_int);
printf("\tSMI_CMD=0x%x, ", fadt->smi_cmd);
printf("ACPI_ENABLE=0x%x, ", fadt->acpi_enable);
printf("ACPI_DISABLE=0x%x, ", fadt->acpi_disable);
printf("S4BIOS_REQ=0x%x\n", fadt->s4biosreq);
printf("\tPSTATE_CNT=0x%x\n", fadt->pstate_cnt);
if (fadt->pm1a_evt_blk != 0)
printf("\tPM1a_EVT_BLK=0x%x-0x%x\n",
facp->pm1a_evt_blk,
facp->pm1a_evt_blk + facp->pm1_evt_len - 1);
if (facp->pm1b_evt_blk)
fadt->pm1a_evt_blk,
fadt->pm1a_evt_blk + fadt->pm1_evt_len - 1);
if (fadt->pm1b_evt_blk != 0)
printf("\tPM1b_EVT_BLK=0x%x-0x%x\n",
facp->pm1b_evt_blk,
facp->pm1b_evt_blk + facp->pm1_evt_len - 1);
if (facp->pm1a_cnt_blk)
fadt->pm1b_evt_blk,
fadt->pm1b_evt_blk + fadt->pm1_evt_len - 1);
if (fadt->pm1a_cnt_blk != 0)
printf("\tPM1a_CNT_BLK=0x%x-0x%x\n",
facp->pm1a_cnt_blk,
facp->pm1a_cnt_blk + facp->pm1_cnt_len - 1);
if (facp->pm1b_cnt_blk)
fadt->pm1a_cnt_blk,
fadt->pm1a_cnt_blk + fadt->pm1_cnt_len - 1);
if (fadt->pm1b_cnt_blk != 0)
printf("\tPM1b_CNT_BLK=0x%x-0x%x\n",
facp->pm1b_cnt_blk,
facp->pm1b_cnt_blk + facp->pm1_cnt_len - 1);
if (facp->pm2_cnt_blk)
fadt->pm1b_cnt_blk,
fadt->pm1b_cnt_blk + fadt->pm1_cnt_len - 1);
if (fadt->pm2_cnt_blk != 0)
printf("\tPM2_CNT_BLK=0x%x-0x%x\n",
facp->pm2_cnt_blk,
facp->pm2_cnt_blk + facp->pm2_cnt_len - 1);
if (facp->pm_tmr_blk)
fadt->pm2_cnt_blk,
fadt->pm2_cnt_blk + fadt->pm2_cnt_len - 1);
if (fadt->pm_tmr_blk != 0)
printf("\tPM2_TMR_BLK=0x%x-0x%x\n",
facp->pm_tmr_blk,
facp->pm_tmr_blk + facp->pm_tmr_len - 1);
if (facp->gpe0_blk)
printf("\tPM2_GPE0_BLK=0x%x-0x%x\n",
facp->gpe0_blk,
facp->gpe0_blk + facp->gpe0_len - 1);
if (facp->gpe1_blk)
printf("\tPM2_GPE1_BLK=0x%x-0x%x, GPE1_BASE=%d\n",
facp->gpe1_blk,
facp->gpe1_blk + facp->gpe1_len - 1,
facp->gpe1_base);
fadt->pm_tmr_blk,
fadt->pm_tmr_blk + fadt->pm_tmr_len - 1);
if (fadt->gpe0_blk != 0)
printf("\tGPE0_BLK=0x%x-0x%x\n",
fadt->gpe0_blk,
fadt->gpe0_blk + fadt->gpe0_len - 1);
if (fadt->gpe1_blk != 0)
printf("\tGPE1_BLK=0x%x-0x%x, GPE1_BASE=%d\n",
fadt->gpe1_blk,
fadt->gpe1_blk + fadt->gpe1_len - 1,
fadt->gpe1_base);
if (fadt->cst_cnt != 0)
printf("\tCST_CNT=0x%x\n", fadt->cst_cnt);
printf("\tP_LVL2_LAT=%dms, P_LVL3_LAT=%dms\n",
facp->p_lvl2_lat, facp->p_lvl3_lat);
fadt->p_lvl2_lat, fadt->p_lvl3_lat);
printf("\tFLUSH_SIZE=%d, FLUSH_STRIDE=%d\n",
facp->flush_size, facp->flush_stride);
fadt->flush_size, fadt->flush_stride);
printf("\tDUTY_OFFSET=%d, DUTY_WIDTH=%d\n",
facp->duty_off, facp->duty_width);
fadt->duty_off, fadt->duty_width);
printf("\tDAY_ALRM=%d, MON_ALRM=%d, CENTURY=%d\n",
facp->day_alrm, facp->mon_alrm, facp->century);
printf("\tFlags=");
sep = '{';
fadt->day_alrm, fadt->mon_alrm, fadt->century);
#define PRINTFLAG(xx) do { \
if (facp->flags & ACPI_FACP_FLAG_## xx) { \
printf("%c%s", sep, #xx); sep = ','; \
} \
#define PRINTFLAG(var, flag) do { \
if ((var) & FADT_FLAG_## flag) { \
printf("%c%s", sep, #flag); sep = ','; \
} \
} while (0)
PRINTFLAG(WBINVD);
PRINTFLAG(WBINVD_FLUSH);
PRINTFLAG(PROC_C1);
PRINTFLAG(P_LVL2_UP);
PRINTFLAG(PWR_BUTTON);
PRINTFLAG(SLP_BUTTON);
PRINTFLAG(FIX_RTC);
PRINTFLAG(RTC_S4);
PRINTFLAG(TMR_VAL_EXT);
PRINTFLAG(DCK_CAP);
printf("\tIAPC_BOOT_ARCH=");
sep = '{';
PRINTFLAG(fadt->iapc_boot_arch, LEGACY_DEV);
PRINTFLAG(fadt->iapc_boot_arch, 8042);
printf("}\n");
printf("\tFlags=");
sep = '{';
PRINTFLAG(fadt->flags, WBINVD);
PRINTFLAG(fadt->flags, WBINVD_FLUSH);
PRINTFLAG(fadt->flags, PROC_C1);
PRINTFLAG(fadt->flags, P_LVL2_UP);
PRINTFLAG(fadt->flags, PWR_BUTTON);
PRINTFLAG(fadt->flags, SLP_BUTTON);
PRINTFLAG(fadt->flags, FIX_RTC);
PRINTFLAG(fadt->flags, RTC_S4);
PRINTFLAG(fadt->flags, TMR_VAL_EXT);
PRINTFLAG(fadt->flags, DCK_CAP);
PRINTFLAG(fadt->flags, RESET_REG);
PRINTFLAG(fadt->flags, SEALED_CASE);
PRINTFLAG(fadt->flags, HEADLESS);
PRINTFLAG(fadt->flags, CPU_SW_SLP);
printf("}\n");
#undef PRINTFLAG
if (fadt->flags & FADT_FLAG_RESET_REG) {
printf("\tRESET_REG=");
acpi_print_gas(&fadt->reset_reg);
printf(", RESET_VALUE=%#x\n", fadt->reset_value);
}
printf(END_COMMENT);
}
static void
acpi_print_facs(struct FACSbody *facs)
{
printf(BEGIN_COMMENT);
printf(" FACS:\tLength=%u, ", facs->len);
printf("HwSig=0x%08x, ", facs->hw_sig);
printf("Firm_Wake_Vec=0x%08x\n", facs->firm_wake_vec);
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("\tFlags={");
if (facs->flags & FACS_FLAG_S4BIOS_F)
printf("S4BIOS");
printf("}\n");
if (facs->x_firm_wake_vec != 0) {
printf("\tX_Firm_Wake_Vec=%08lx\n",
(u_long)facs->x_firm_wake_vec);
}
printf(END_COMMENT);
}
@ -447,7 +550,7 @@ acpi_handle_rsdt(struct ACPIsdt *rsdp)
if (acpi_checksum(sdp, sdp->len))
errx(1, "RSDT entry %d is corrupt", i);
if (!memcmp(sdp->signature, "FACP", 4))
acpi_handle_facp((struct FACPbody *) sdp->body);
acpi_handle_fadt((struct FADTbody *) sdp->body);
else if (!memcmp(sdp->signature, "APIC", 4))
acpi_handle_apic(sdp);
else if (!memcmp(sdp->signature, "HPET", 4))
@ -565,11 +668,11 @@ sdt_from_rsdt(struct ACPIsdt *rsdt, const char *sig)
}
struct ACPIsdt *
dsdt_from_facp(struct FACPbody *facp)
dsdt_from_fadt(struct FADTbody *fadt)
{
struct ACPIsdt *sdt;
sdt = (struct ACPIsdt *)acpi_map_sdt(facp->dsdt_ptr);
sdt = (struct ACPIsdt *)acpi_map_sdt(fadt->dsdt_ptr);
if (acpi_checksum(sdt, sdt->len))
errx(1, "DSDT is corrupt\n");
return (sdt);

View File

@ -151,7 +151,7 @@ Verbose messages are enabled.
.Sh BUGS
In the current implementation,
.Nm
doesn't dump the Firmware ACPI Control Structure (FACS),
doesn't dump the
Secondary System Descriptor Table (SSDT),
Embedded Controller Descriptor Table (ECDT),
or BOOT structures.

View File

@ -116,7 +116,7 @@ main(int argc, char *argv[])
/* Translate RSDT to DSDT pointer */
if (dsdt_input_file == NULL) {
sdt = sdt_from_rsdt(sdt, "FACP");
sdt = dsdt_from_facp((struct FACPbody *)sdt->body);
sdt = dsdt_from_fadt((struct FADTbody *)sdt->body);
}
/* Dump the DSDT to a file */

View File

@ -39,9 +39,9 @@ struct ACPIgas {
#define ACPI_GAS_EMBEDDED 3
#define ACPI_GAS_SMBUS 4
#define ACPI_GAS_FIXED 0x7f
u_int8_t register_bit_width;
u_int8_t register_bit_offset;
u_int8_t res;
u_int8_t bit_width;
u_int8_t bit_offset;
u_int8_t _reserved;
u_int64_t address;
} __packed;
@ -74,19 +74,19 @@ struct ACPIsdt {
} __packed;
/* Fixed ACPI Description Table (body) */
struct FACPbody {
struct FADTbody {
u_int32_t facs_ptr;
u_int32_t dsdt_ptr;
u_int8_t int_model;
#define ACPI_FACP_INTMODEL_PIC 0 /* Standard PC-AT PIC */
#define ACPI_FACP_INTMODEL_APIC 1 /* Multiple APIC */
u_char reserved1;
#define ACPI_FADT_INTMODEL_PIC 0 /* Standard PC-AT PIC */
#define ACPI_FADT_INTMODEL_APIC 1 /* Multiple APIC */
u_int8_t pm_profile;
u_int16_t sci_int;
u_int32_t smi_cmd;
u_int8_t acpi_enable;
u_int8_t acpi_disable;
u_int8_t s4biosreq;
u_int8_t reserved2;
u_int8_t pstate_cnt;
u_int32_t pm1a_evt_blk;
u_int32_t pm1b_evt_blk;
u_int32_t pm1a_cnt_blk;
@ -102,7 +102,7 @@ struct FACPbody {
u_int8_t gpe0_len;
u_int8_t gpe1_len;
u_int8_t gpe1_base;
u_int8_t reserved3;
u_int8_t cst_cnt;
u_int16_t p_lvl2_lat;
u_int16_t p_lvl3_lat;
u_int16_t flush_size;
@ -113,18 +113,24 @@ struct FACPbody {
u_int8_t mon_alrm;
u_int8_t century;
u_int16_t iapc_boot_arch;
#define FADT_FLAG_LEGACY_DEV 1 /* System has legacy devices */
#define FADT_FLAG_8042 2 /* 8042 keyboard controller */
u_char reserved4[1];
u_int32_t flags;
#define ACPI_FACP_FLAG_WBINVD 1 /* WBINVD is correctly supported */
#define ACPI_FACP_FLAG_WBINVD_FLUSH 2 /* WBINVD flushes caches */
#define ACPI_FACP_FLAG_PROC_C1 4 /* C1 power state supported */
#define ACPI_FACP_FLAG_P_LVL2_UP 8 /* C2 power state works on SMP */
#define ACPI_FACP_FLAG_PWR_BUTTON 16 /* Power button uses control method */
#define ACPI_FACP_FLAG_SLP_BUTTON 32 /* Sleep button uses control method */
#define ACPI_FACP_FLAG_FIX_RTC 64 /* RTC wakeup not supported */
#define ACPI_FACP_FLAG_RTC_S4 128 /* RTC can wakeup from S4 state */
#define ACPI_FACP_FLAG_TMR_VAL_EXT 256 /* TMR_VAL is 32bit */
#define ACPI_FACP_FLAG_DCK_CAP 512 /* Can support docking */
#define FADT_FLAG_WBINVD 1 /* WBINVD is correctly supported */
#define FADT_FLAG_WBINVD_FLUSH 2 /* WBINVD flushes caches */
#define FADT_FLAG_PROC_C1 4 /* C1 power state supported */
#define FADT_FLAG_P_LVL2_UP 8 /* C2 power state works on SMP */
#define FADT_FLAG_PWR_BUTTON 16 /* Power button uses control method */
#define FADT_FLAG_SLP_BUTTON 32 /* Sleep button uses control method */
#define FADT_FLAG_FIX_RTC 64 /* RTC wakeup not supported */
#define FADT_FLAG_RTC_S4 128 /* RTC can wakeup from S4 state */
#define FADT_FLAG_TMR_VAL_EXT 256 /* TMR_VAL is 32bit */
#define FADT_FLAG_DCK_CAP 512 /* Can support docking */
#define FADT_FLAG_RESET_REG 1024 /* Supports RESET_REG */
#define FADT_FLAG_SEALED_CASE 2048 /* Case cannot be opened */
#define FADT_FLAG_HEADLESS 4096 /* No monitor */
#define FADT_FLAG_CPU_SW_SLP 8192 /* Supports CPU software sleep */
struct ACPIgas reset_reg;
u_int8_t reset_value;
u_int8_t reserved5[3];
@ -141,22 +147,23 @@ struct FACPbody {
} __packed;
/* Firmware ACPI Control Structure */
struct FACS {
struct FACSbody {
u_char signature[4];
u_int32_t len;
u_char hard_sig[4];
u_int32_t hw_sig;
/*
* NOTE This should be filled with physical address below 1MB!!
* sigh....
*/
u_int32_t firm_wake_vec;
u_int32_t g_lock; /* bit field */
/* 5.2.6.1 Global Lock */
#define ACPI_GLOBAL_LOCK_PENDING 1
#define ACPI_GLOBAL_LOCK_OWNED 2
u_int32_t flags; /* bit field */
#define ACPI_FACS_FLAG_S4BIOS_F 1 /* Supports S4BIOS_SEQ */
char reserved[40];
u_int32_t global_lock;
#define FACS_FLAG_LOCK_PENDING 1 /* 5.2.6.1 Global Lock */
#define FACS_FLAG_LOCK_OWNED 2
u_int32_t flags;
#define FACS_FLAG_S4BIOS_F 1 /* Supports S4BIOS_SEQ */
u_int64_t x_firm_wake_vec;
u_int8_t version;
char reserved[31];
} __packed;
struct MADT_local_apic {
@ -277,21 +284,6 @@ struct HPETbody {
u_int16_t clock_tick __packed;
} __packed;
#if 0
void *acpi_map_physical(vm_offset_t, size_t);
struct ACPIrsdp *acpi_find_rsd_ptr(void);
int acpi_checksum(void *, size_t);
struct ACPIsdt *acpi_map_sdt(vm_offset_t);
void acpi_print_rsd_ptr(struct ACPIrsdp *);
void acpi_print_sdt(struct ACPIsdt *);
void acpi_print_rsdt(struct ACPIsdt *);
void acpi_print_facp(struct FACPbody *);
void acpi_print_dsdt(struct ACPIsdt *);
void acpi_handle_rsdt(struct ACPIsdt *);
void acpi_load_dsdt(char *, u_int8_t **, u_int8_t **);
void acpi_dump_dsdt(u_int8_t *, u_int8_t *);
#endif
/* Find and map the RSD PTR structure and return it for parsing */
struct ACPIsdt *sdt_load_devmem(void);
@ -314,7 +306,7 @@ void aml_disassemble(struct ACPIsdt *);
struct ACPIrsdp *acpi_find_rsd_ptr(void);
void * acpi_map_physical(vm_offset_t, size_t);
struct ACPIsdt *sdt_from_rsdt(struct ACPIsdt *, const char *);
struct ACPIsdt *dsdt_from_facp(struct FACPbody *);
struct ACPIsdt *dsdt_from_fadt(struct FADTbody *);
int acpi_checksum(void *, size_t);
/* Command line flags */