diff options
author | obrien <obrien@FreeBSD.org> | 2013-02-08 16:10:16 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2013-02-08 16:10:16 +0000 |
commit | 3028e3f8aba938dfd0bf9fda987b8a72140b8027 (patch) | |
tree | b2f038222ff8a70f687652441df00d2b564c8abe /usr.sbin/acpi | |
parent | 952a6d5a7cd3d3f9007acfa06805262fc04a105f (diff) | |
parent | 1d08d5f677c1dfa810e381073590adbae19cc69f (diff) | |
download | FreeBSD-src-3028e3f8aba938dfd0bf9fda987b8a72140b8027.zip FreeBSD-src-3028e3f8aba938dfd0bf9fda987b8a72140b8027.tar.gz |
Sync with HEAD.
Diffstat (limited to 'usr.sbin/acpi')
-rw-r--r-- | usr.sbin/acpi/acpidb/Makefile | 32 | ||||
-rw-r--r-- | usr.sbin/acpi/acpidump/acpi.c | 275 | ||||
-rw-r--r-- | usr.sbin/acpi/acpidump/acpidump.8 | 1 | ||||
-rw-r--r-- | usr.sbin/acpi/iasl/Makefile | 36 |
4 files changed, 299 insertions, 45 deletions
diff --git a/usr.sbin/acpi/acpidb/Makefile b/usr.sbin/acpi/acpidb/Makefile index eab9e38..9eccb4d 100644 --- a/usr.sbin/acpi/acpidb/Makefile +++ b/usr.sbin/acpi/acpidb/Makefile @@ -4,13 +4,14 @@ PROG= acpidb SRCS= acpidb.c # components/debugger -SRCS+= dbcmds.c dbdisply.c dbexec.c dbfileio.c dbhistry.c \ - dbinput.c dbmethod.c dbnames.c dbstats.c dbutils.c \ - dbxface.c +SRCS+= dbcmds.c dbconvert.c dbdisply.c dbexec.c dbfileio.c \ + dbhistry.c dbinput.c dbmethod.c dbnames.c dbstats.c \ + dbutils.c dbxface.c # components/disassembler -SRCS+= dmbuffer.c dmnames.c dmobject.c dmopcode.c dmresrc.c \ - dmresrcl.c dmresrcl2.c dmresrcs.c dmutils.c dmwalk.c +SRCS+= dmbuffer.c dmdeferred.c dmnames.c dmobject.c dmopcode.c \ + dmresrc.c dmresrcl.c dmresrcl2.c dmresrcs.c dmutils.c \ + dmwalk.c # components/dispatcher SRCS+= dsargs.c dscontrol.c dsfield.c dsinit.c dsmethod.c \ @@ -19,8 +20,8 @@ SRCS+= dsargs.c dscontrol.c dsfield.c dsinit.c dsmethod.c \ # components/events SRCS+= evevent.c evglock.c evgpe.c evgpeblk.c evgpeinit.c \ - evgpeutil.c evmisc.c evregion.c evrgnini.c evsci.c \ - evxface.c evxfevnt.c evxfregn.c + evgpeutil.c evhandler.c evmisc.c evregion.c evrgnini.c \ + evsci.c evxface.c evxfevnt.c evxfregn.c # components/executer SRCS+= exconfig.c exconvrt.c excreate.c exdebug.c exdump.c \ @@ -36,19 +37,20 @@ SRCS+= hwacpi.c hwesleep.c hwgpe.c hwpci.c hwregs.c hwsleep.c \ # components/namespace SRCS+= nsaccess.c nsalloc.c nsdump.c nseval.c nsinit.c \ nsload.c nsnames.c nsobject.c nsparse.c nspredef.c \ - nsrepair.c nsrepair2.c nssearch.c nsutils.c nswalk.c \ - nsxfeval.c nsxfname.c nsxfobj.c + nsprepkg.c nsrepair.c nsrepair2.c nssearch.c nsutils.c \ + nswalk.c nsxfeval.c nsxfname.c nsxfobj.c # components/parser -SRCS+= psargs.c psloop.c psopcode.c psparse.c psscope.c \ - pstree.c psutils.c pswalk.c psxface.c +SRCS+= psargs.c psloop.c psobject.c psopcode.c psopinfo.c \ + psparse.c psscope.c pstree.c psutils.c pswalk.c \ + psxface.c # components/os_specific/service_layers SRCS+= osunixxf.c # components/resources -SRCS+= rsaddr.c rscalc.c rscreate.c rsdump.c rsinfo.c \ - rsio.c rsirq.c rslist.c rsmemory.c rsmisc.c \ +SRCS+= rsaddr.c rscalc.c rscreate.c rsdump.c rsdumpinfo.c \ + rsinfo.c rsio.c rsirq.c rslist.c rsmemory.c rsmisc.c \ rsserial.c rsutils.c rsxface.c # components/tables @@ -59,8 +61,8 @@ SRCS+= tbfadt.c tbfind.c tbinstal.c tbutils.c tbxface.c \ SRCS+= utaddress.c utalloc.c utcache.c utcopy.c utdebug.c \ utdecode.c utdelete.c uteval.c utexcep.c utglobal.c \ utids.c utinit.c utlock.c utmath.c utmisc.c utmutex.c \ - utobject.c utosi.c utresrc.c utstate.c uttrack.c \ - utxface.c utxferror.c utxfinit.c + utobject.c utosi.c utownerid.c utresrc.c utstate.c \ + utstring.c uttrack.c utxface.c utxferror.c utxfinit.c MAN= acpidb.8 WARNS?= 2 diff --git a/usr.sbin/acpi/acpidump/acpi.c b/usr.sbin/acpi/acpidump/acpi.c index b0a751c..c7f5bd8 100644 --- a/usr.sbin/acpi/acpidump/acpi.c +++ b/usr.sbin/acpi/acpidump/acpi.c @@ -123,6 +123,31 @@ static const char *TCPA_pcclient_strings[] = { "Table of Devices", }; +#define PRINTFLAG_END() printflag_end() + +static char pf_sep = '{'; + +static void +printflag_end(void) +{ + + if (pf_sep != '{') { + printf("}"); + pf_sep = '{'; + } + printf("\n"); +} + +static void +printflag(uint64_t var, uint64_t mask, const char *name) +{ + + if (var & mask) { + printf("%c%s", pf_sep, name); + pf_sep = ','; + } +} + static void acpi_print_string(char *s, size_t length) { @@ -729,6 +754,238 @@ acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp) printf(END_COMMENT); } +static const char * +devscope_type2str(int type) +{ + static char typebuf[16]; + + switch (type) { + case 1: + return ("PCI Endpoint Device"); + case 2: + return ("PCI Sub-Hierarchy"); + case 3: + return ("IOAPIC"); + case 4: + return ("HPET"); + default: + snprintf(typebuf, sizeof(typebuf), "%d", type); + return (typebuf); + } +} + +static int +acpi_handle_dmar_devscope(void *addr, int remaining) +{ + char sep; + int pathlen; + ACPI_DMAR_PCI_PATH *path, *pathend; + ACPI_DMAR_DEVICE_SCOPE *devscope = addr; + + if (remaining < (int)sizeof(ACPI_DMAR_DEVICE_SCOPE)) + return (-1); + + if (remaining < devscope->Length) + return (-1); + + printf("\n"); + printf("\t\tType=%s\n", devscope_type2str(devscope->EntryType)); + printf("\t\tLength=%d\n", devscope->Length); + printf("\t\tEnumerationId=%d\n", devscope->EnumerationId); + printf("\t\tStartBusNumber=%d\n", devscope->Bus); + + path = (ACPI_DMAR_PCI_PATH *)(devscope + 1); + pathlen = devscope->Length - sizeof(ACPI_DMAR_DEVICE_SCOPE); + pathend = path + pathlen / sizeof(ACPI_DMAR_PCI_PATH); + if (path < pathend) { + sep = '{'; + printf("\t\tPath="); + do { + printf("%c%d:%d", sep, path->Device, path->Function); + sep=','; + path++; + } while (path < pathend); + printf("}\n"); + } + + return (devscope->Length); +} + +static void +acpi_handle_dmar_drhd(ACPI_DMAR_HARDWARE_UNIT *drhd) +{ + char *cp; + int remaining, consumed; + + printf("\n"); + printf("\tType=DRHD\n"); + printf("\tLength=%d\n", drhd->Header.Length); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(drhd->Flags, INCLUDE_ALL); + PRINTFLAG_END(); + +#undef PRINTFLAG + + printf("\tSegment=%d\n", drhd->Segment); + printf("\tAddress=0x%0jx\n", drhd->Address); + + remaining = drhd->Header.Length - sizeof(ACPI_DMAR_HARDWARE_UNIT); + if (remaining > 0) + printf("\tDevice Scope:"); + while (remaining > 0) { + cp = (char *)drhd + drhd->Header.Length - remaining; + consumed = acpi_handle_dmar_devscope(cp, remaining); + if (consumed <= 0) + break; + else + remaining -= consumed; + } +} + +static void +acpi_handle_dmar_rmrr(ACPI_DMAR_RESERVED_MEMORY *rmrr) +{ + char *cp; + int remaining, consumed; + + printf("\n"); + printf("\tType=RMRR\n"); + printf("\tLength=%d\n", rmrr->Header.Length); + printf("\tSegment=%d\n", rmrr->Segment); + printf("\tBaseAddress=0x%0jx\n", rmrr->BaseAddress); + printf("\tLimitAddress=0x%0jx\n", rmrr->EndAddress); + + remaining = rmrr->Header.Length - sizeof(ACPI_DMAR_RESERVED_MEMORY); + if (remaining > 0) + printf("\tDevice Scope:"); + while (remaining > 0) { + cp = (char *)rmrr + rmrr->Header.Length - remaining; + consumed = acpi_handle_dmar_devscope(cp, remaining); + if (consumed <= 0) + break; + else + remaining -= consumed; + } +} + +static void +acpi_handle_dmar_atsr(ACPI_DMAR_ATSR *atsr) +{ + char *cp; + int remaining, consumed; + + printf("\n"); + printf("\tType=ATSR\n"); + printf("\tLength=%d\n", atsr->Header.Length); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(atsr->Flags, ALL_PORTS); + PRINTFLAG_END(); + +#undef PRINTFLAG + + printf("\tSegment=%d\n", atsr->Segment); + + remaining = atsr->Header.Length - sizeof(ACPI_DMAR_ATSR); + if (remaining > 0) + printf("\tDevice Scope:"); + while (remaining > 0) { + cp = (char *)atsr + atsr->Header.Length - remaining; + consumed = acpi_handle_dmar_devscope(cp, remaining); + if (consumed <= 0) + break; + else + remaining -= consumed; + } +} + +static void +acpi_handle_dmar_rhsa(ACPI_DMAR_RHSA *rhsa) +{ + + printf("\n"); + printf("\tType=RHSA\n"); + printf("\tLength=%d\n", rhsa->Header.Length); + printf("\tBaseAddress=0x%0jx\n", rhsa->BaseAddress); + printf("\tProximityDomain=0x%08x\n", rhsa->ProximityDomain); +} + +static int +acpi_handle_dmar_remapping_structure(void *addr, int remaining) +{ + ACPI_DMAR_HEADER *hdr = addr; + + if (remaining < (int)sizeof(ACPI_DMAR_HEADER)) + return (-1); + + if (remaining < hdr->Length) + return (-1); + + switch (hdr->Type) { + case ACPI_DMAR_TYPE_HARDWARE_UNIT: + acpi_handle_dmar_drhd(addr); + break; + case ACPI_DMAR_TYPE_RESERVED_MEMORY: + acpi_handle_dmar_rmrr(addr); + break; + case ACPI_DMAR_TYPE_ATSR: + acpi_handle_dmar_atsr(addr); + break; + case ACPI_DMAR_HARDWARE_AFFINITY: + acpi_handle_dmar_rhsa(addr); + break; + default: + printf("\n"); + printf("\tType=%d\n", hdr->Type); + printf("\tLength=%d\n", hdr->Length); + break; + } + return (hdr->Length); +} + +#ifndef ACPI_DMAR_X2APIC_OPT_OUT +#define ACPI_DMAR_X2APIC_OPT_OUT (0x2) +#endif + +static void +acpi_handle_dmar(ACPI_TABLE_HEADER *sdp) +{ + char *cp; + int remaining, consumed; + ACPI_TABLE_DMAR *dmar; + + printf(BEGIN_COMMENT); + acpi_print_sdt(sdp); + dmar = (ACPI_TABLE_DMAR *)sdp; + printf("\tHost Address Width=%d\n", dmar->Width + 1); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_DMAR_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(dmar->Flags, INTR_REMAP); + PRINTFLAG(dmar->Flags, X2APIC_OPT_OUT); + PRINTFLAG_END(); + +#undef PRINTFLAG + + remaining = sdp->Length - sizeof(ACPI_TABLE_DMAR); + while (remaining > 0) { + cp = (char *)sdp + sdp->Length - remaining; + consumed = acpi_handle_dmar_remapping_structure(cp, remaining); + if (consumed <= 0) + break; + else + remaining -= consumed; + } + + printf(END_COMMENT); +} + static void acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp) { @@ -854,7 +1111,6 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp) { ACPI_TABLE_FADT *fadt; const char *pm; - char sep; fadt = (ACPI_TABLE_FADT *)sdp; printf(BEGIN_COMMENT); @@ -914,25 +1170,17 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp) printf("\tDAY_ALRM=%d, MON_ALRM=%d, CENTURY=%d\n", fadt->DayAlarm, fadt->MonthAlarm, fadt->Century); -#define PRINTFLAG(var, flag) do { \ - if ((var) & ACPI_FADT_## flag) { \ - printf("%c%s", sep, #flag); sep = ','; \ - } \ -} while (0) +#define PRINTFLAG(var, flag) printflag((var), ACPI_FADT_## flag, #flag) printf("\tIAPC_BOOT_ARCH="); - sep = '{'; PRINTFLAG(fadt->BootFlags, LEGACY_DEVICES); PRINTFLAG(fadt->BootFlags, 8042); PRINTFLAG(fadt->BootFlags, NO_VGA); PRINTFLAG(fadt->BootFlags, NO_MSI); PRINTFLAG(fadt->BootFlags, NO_ASPM); - if (fadt->BootFlags != 0) - printf("}"); - printf("\n"); + PRINTFLAG_END(); printf("\tFlags="); - sep = '{'; PRINTFLAG(fadt->Flags, WBINVD); PRINTFLAG(fadt->Flags, WBINVD_FLUSH); PRINTFLAG(fadt->Flags, C1_SUPPORTED); @@ -953,8 +1201,7 @@ acpi_print_fadt(ACPI_TABLE_HEADER *sdp) PRINTFLAG(fadt->Flags, REMOTE_POWER_ON); PRINTFLAG(fadt->Flags, APIC_CLUSTER); PRINTFLAG(fadt->Flags, APIC_PHYSICAL); - if (fadt->Flags != 0) - printf("}\n"); + PRINTFLAG_END(); #undef PRINTFLAG @@ -1127,6 +1374,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp) acpi_handle_srat(sdp); else if (!memcmp(sdp->Signature, ACPI_SIG_TCPA, 4)) acpi_handle_tcpa(sdp); + else if (!memcmp(sdp->Signature, ACPI_SIG_DMAR, 4)) + acpi_handle_dmar(sdp); else { printf(BEGIN_COMMENT); acpi_print_sdt(sdp); diff --git a/usr.sbin/acpi/acpidump/acpidump.8 b/usr.sbin/acpi/acpidump/acpidump.8 index 1401e38..f1c7a18 100644 --- a/usr.sbin/acpi/acpidump/acpidump.8 +++ b/usr.sbin/acpi/acpidump/acpidump.8 @@ -97,6 +97,7 @@ flag, the utility dumps contents of the following tables: .Pp .Bl -tag -offset indent -width 12345 -compact +.It DMAR .It DSDT .It ECDT .It FACS diff --git a/usr.sbin/acpi/iasl/Makefile b/usr.sbin/acpi/iasl/Makefile index 6c263ce..b348141 100644 --- a/usr.sbin/acpi/iasl/Makefile +++ b/usr.sbin/acpi/iasl/Makefile @@ -10,25 +10,26 @@ SRCS+= ahpredef.c dmextern.c dmrestag.c dmtable.c dmtbdump.c \ # compiler SRCS+= aslanalyze.c aslbtypes.c aslcodegen.c aslcompile.c \ aslcompiler.y.h aslcompilerlex.c aslcompilerparse.c \ - aslerror.c aslfiles.c aslfold.c asllength.c \ - asllisting.c aslload.c asllookup.c aslmain.c aslmap.c \ - aslopcodes.c asloperands.c aslopt.c aslpredef.c \ - aslresource.c aslrestype1.c aslrestype1i.c \ - aslrestype2.c aslrestype2d.c aslrestype2e.c \ - aslrestype2q.c aslrestype2s.c aslrestype2w.c \ - aslstartup.c aslstubs.c asltransform.c asltree.c \ - aslutils.c asluuid.c aslwalks.c dtcompile.c dtexpress.c \ - dtfield.c dtio.c dtparser.y.h dtparserlex.c \ - dtparserparse.c dtsubtable.c dttable.c dttemplate.c \ - dtutils.c prexpress.c prmacros.c prparser.y.h \ - prparserlex.c prparserparse.c prscan.c prutils.c + aslerror.c aslfileio.c aslfiles.c aslfold.c aslhex.c \ + asllength.c asllisting.c aslload.c asllookup.c \ + aslmain.c aslmap.c aslmethod.c aslnamesp.c aslopcodes.c \ + asloperands.c aslopt.c aslpredef.c aslresource.c \ + aslrestype1.c aslrestype1i.c aslrestype2.c \ + aslrestype2d.c aslrestype2e.c aslrestype2q.c \ + aslrestype2s.c aslrestype2w.c aslstartup.c aslstubs.c \ + asltransform.c asltree.c aslutils.c asluuid.c \ + aslwalks.c aslxref.c dtcompile.c dtexpress.c dtfield.c \ + dtio.c dtparser.y.h dtparserlex.c dtparserparse.c \ + dtsubtable.c dttable.c dttemplate.c dtutils.c \ + prexpress.c prmacros.c prparser.y.h prparserlex.c \ + prparserparse.c prscan.c prutils.c # components/debugger SRCS+= dbfileio.c # components/disassembler -SRCS+= dmbuffer.c dmnames.c dmopcode.c dmresrc.c dmresrcl.c \ - dmresrcl2.c dmresrcs.c dmutils.c dmwalk.c +SRCS+= dmbuffer.c dmdeferred.c dmnames.c dmopcode.c dmresrc.c \ + dmresrcl.c dmresrcl2.c dmresrcs.c dmutils.c dmwalk.c # components/dispatcher SRCS+= dsargs.c dscontrol.c dsfield.c dsobject.c dsopcode.c \ @@ -42,8 +43,8 @@ SRCS+= exconvrt.c excreate.c exdump.c exmisc.c exmutex.c \ exstoren.c exstorob.c exsystem.c exutils.c # components/parser -SRCS+= psargs.c psloop.c psopcode.c psparse.c psscope.c \ - pstree.c psutils.c pswalk.c +SRCS+= psargs.c psloop.c psobject.c psopcode.c psopinfo.c \ + psparse.c psscope.c pstree.c psutils.c pswalk.c # components/namespace SRCS+= nsaccess.c nsalloc.c nsdump.c nsnames.c nsobject.c \ @@ -56,7 +57,8 @@ SRCS+= tbfadt.c tbinstal.c tbutils.c tbxface.c SRCS+= utaddress.c utalloc.c utcache.c utcopy.c utdebug.c \ utdecode.c utdelete.c utexcep.c utglobal.c utinit.c \ utlock.c utmath.c utmisc.c utmutex.c utobject.c \ - utresrc.c utstate.c utxface.c utxferror.c + utownerid.c utresrc.c utstate.c utstring.c utxface.c \ + utxferror.c # os_specific/service_layers SRCS+= osunixxf.c |