Index: usr.sbin/acpi/acpidump/acpi.c =================================================================== --- usr.sbin/acpi/acpidump/acpi.c +++ usr.sbin/acpi/acpidump/acpi.c @@ -70,6 +70,8 @@ static void acpi_print_srat(ACPI_SUBTABLE_HEADER *srat); static void acpi_handle_srat(ACPI_TABLE_HEADER *sdp); static void acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp); +static void acpi_print_nfit(ACPI_NFIT_HEADER *nfit); +static void acpi_handle_nfit(ACPI_TABLE_HEADER *sdp); static void acpi_print_sdt(ACPI_TABLE_HEADER *sdp); static void acpi_print_fadt(ACPI_TABLE_HEADER *sdp); static void acpi_print_facs(ACPI_TABLE_FACS *facs); @@ -79,6 +81,8 @@ static void acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp); static void acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first, void (*action)(ACPI_SUBTABLE_HEADER *)); +static void acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first, + void (*action)(ACPI_NFIT_HEADER *)); /* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */ static int addr_size; @@ -270,6 +274,8 @@ end = (char *)table + table->Length; while ((char *)subtable < end) { printf("\n"); + if (subtable->Length == 0) + errx(1, "Subtable length is 0"); action(subtable); subtable = (ACPI_SUBTABLE_HEADER *)((char *)subtable + subtable->Length); @@ -277,6 +283,23 @@ } static void +acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first, + void (*action)(ACPI_NFIT_HEADER *)) +{ + ACPI_NFIT_HEADER *subtable; + char *end; + + subtable = first; + end = (char *)table + table->Length; + while ((char *)subtable < end) { + printf("\n"); + action(subtable); + subtable = (ACPI_NFIT_HEADER *)((char *)subtable + + subtable->Length); + } +} + +static void acpi_print_cpu(u_char cpu_id) { @@ -1123,6 +1146,144 @@ printf(END_COMMENT); } +static const char *nfit_types[] = { "System Address", "Memory Map", + "Interleave", "SMBIOS", + "Control Region", "Data Region", + "Flush Address" }; + +static void +acpi_print_nfit(ACPI_NFIT_HEADER *nfit) +{ + ACPI_NFIT_SYSTEM_ADDRESS *sysaddr; + ACPI_NFIT_MEMORY_MAP *mmap; + ACPI_NFIT_INTERLEAVE *ileave; + ACPI_NFIT_SMBIOS *smbios; + ACPI_NFIT_CONTROL_REGION *ctlreg; + ACPI_NFIT_DATA_REGION *datareg; + ACPI_NFIT_FLUSH_ADDRESS *fladdr; + + if (nfit->Type < nitems(nfit_types)) + printf("\tType=%s\n", nfit_types[nfit->Type]); + else + printf("\tType=%d (unknown)\n", nfit->Type); + switch (nfit->Type) { + case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: + sysaddr = (ACPI_NFIT_SYSTEM_ADDRESS *)nfit; + printf("\tRangeIndex=%d\n", (u_int)sysaddr->RangeIndex); + printf("\tProximityDomain=%d\n", (u_int)sysaddr->ProximityDomain); + printf("\tRangeGuid[16]%d\n", (u_int)sysaddr->RangeGuid[16]); + printf("\tAddress=0x%08x\n", (u_int)sysaddr->Address); + printf("\tLength=%d\n", (u_int)sysaddr->Length); + printf("\tMemoryMapping=0x%08x\n", (u_int)sysaddr->MemoryMapping); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(sysaddr->Flags, ADD_ONLINE_ONLY); + PRINTFLAG(sysaddr->Flags, PROXIMITY_VALID); + PRINTFLAG_END(); + +#undef PRINTFLAG + + break; + case ACPI_NFIT_TYPE_MEMORY_MAP: + mmap = (ACPI_NFIT_MEMORY_MAP *)nfit; + printf("\tDeviceHandle=%d\n", (u_int)mmap->DeviceHandle); + printf("\tPhysicalId=%d\n", (u_int)mmap->PhysicalId); + printf("\tRegionId=%d\n", (u_int)mmap->RegionId); + printf("\tRangeIndex=%d\n", (u_int)mmap->RangeIndex); + printf("\tRegionIndex=%d\n", (u_int)mmap->RegionIndex); + printf("\tRegionSize=%d\n", (u_int)mmap->RegionSize); + printf("\tRegionOffset=%d\n", (u_int)mmap->RegionOffset); + printf("\tAddress=0x%08x\n", (u_int)mmap->Address); + printf("\tInterleaveIndex=%d\n", (u_int)mmap->InterleaveIndex); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_MEM_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(mmap->Flags, SAVE_FAILED); + PRINTFLAG(mmap->Flags, RESTORE_FAILED); + PRINTFLAG(mmap->Flags, FLUSH_FAILED); + PRINTFLAG(mmap->Flags, NOT_ARMED); + PRINTFLAG(mmap->Flags, HEALTH_OBSERVED); + PRINTFLAG(mmap->Flags, HEALTH_ENABLED); + PRINTFLAG(mmap->Flags, MAP_FAILED); + PRINTFLAG_END(); + +#undef PRINTFLAG + + break; + case ACPI_NFIT_TYPE_INTERLEAVE: + ileave = (ACPI_NFIT_INTERLEAVE *)nfit; + printf("\tInterleaveIndex=%d\n", (u_int)ileave->InterleaveIndex); + printf("\tLineCount=%d\n", (u_int)ileave->LineCount); + printf("\tLineSize=%d\n", (u_int)ileave->LineSize); + printf("\tLineOffset[1]=%d\n", (u_int)ileave->LineOffset[1]); + break; + case ACPI_NFIT_TYPE_SMBIOS: + smbios = (ACPI_NFIT_SMBIOS *)nfit; + printf("\tData[1]=%d\n", (u_int)smbios->Data[1]); + break; + case ACPI_NFIT_TYPE_CONTROL_REGION: + ctlreg = (ACPI_NFIT_CONTROL_REGION *)nfit; + printf("\tRegionIndex=%d\n", (u_int)ctlreg->RegionIndex); + printf("\tVendorId=%d\n", (u_int)ctlreg->VendorId); + printf("\tDeviceId=%d\n", (u_int)ctlreg->DeviceId); + printf("\tRevisionId=%d\n", (u_int)ctlreg->RevisionId); + printf("\tSubsystemVendorId=%d\n", (u_int)ctlreg->SubsystemVendorId); + printf("\tSubsystemDeviceId=%d\n", (u_int)ctlreg->SubsystemDeviceId); + printf("\tSubsystemRevisionId=%d\n", (u_int)ctlreg->SubsystemRevisionId); + printf("\tValidFields=%d\n", (u_int)ctlreg->ValidFields); + printf("\tManufacturingLocation=%d\n", (u_int)ctlreg->ManufacturingLocation); + printf("\tManufacturingDate=%d\n", (u_int)ctlreg->ManufacturingDate); + printf("\tSerialNumber=%d\n", (u_int)ctlreg->SerialNumber); + printf("\tWindows=%d\n", (u_int)ctlreg->Windows); + printf("\tWindowSize=%d\n", (u_int)ctlreg->WindowSize); + printf("\tCommandOffset=%d\n", (u_int)ctlreg->CommandOffset); + printf("\tCommandSize=%d\n", (u_int)ctlreg->CommandSize); + printf("\tStatusOffset=%d\n", (u_int)ctlreg->StatusOffset); + printf("\tStatusSize=%d\n", (u_int)ctlreg->StatusSize); + +#define PRINTFLAG(var, flag) printflag((var), ACPI_NFIT_## flag, #flag) + + printf("\tFlags="); + PRINTFLAG(mmap->Flags, ADD_ONLINE_ONLY); + PRINTFLAG(mmap->Flags, PROXIMITY_VALID); + PRINTFLAG_END(); + +#undef PRINTFLAG + + break; + case ACPI_NFIT_TYPE_DATA_REGION: + datareg = (ACPI_NFIT_DATA_REGION *)nfit; + printf("\tRegionIndex=%d\n", (u_int)datareg->RegionIndex); + printf("\tWindows=%d\n", (u_int)datareg->Windows); + printf("\tOffset=%d\n", (u_int)datareg->Offset); + printf("\tSize=%d\n", (u_int)datareg->Size); + printf("\tCapacity=%d\n", (u_int)datareg->Capacity); + printf("\tStartAddress=0x%08x\n", (u_int)datareg->StartAddress); + break; + case ACPI_NFIT_TYPE_FLUSH_ADDRESS: + fladdr = (ACPI_NFIT_FLUSH_ADDRESS *)nfit; + printf("\tDeviceHandle=%d\n", (u_int)fladdr->DeviceHandle); + printf("\tHintCount=%d\n", (u_int)fladdr->HintCount); + printf("\tHintAddress[1]=0x%08x\n", (u_int)fladdr->HintAddress[1]); + break; + } +} + +static void +acpi_handle_nfit(ACPI_TABLE_HEADER *sdp) +{ + ACPI_TABLE_NFIT *nfit; + + printf(BEGIN_COMMENT); + acpi_print_sdt(sdp); + nfit = (ACPI_TABLE_NFIT *)sdp; + acpi_walk_nfit(sdp, (nfit + 1), acpi_print_nfit); + printf(END_COMMENT); +} + static void acpi_print_sdt(ACPI_TABLE_HEADER *sdp) { @@ -1438,6 +1599,8 @@ acpi_handle_tcpa(sdp); else if (!memcmp(sdp->Signature, ACPI_SIG_DMAR, 4)) acpi_handle_dmar(sdp); + else if (!memcmp(sdp->Signature, ACPI_SIG_NFIT, 4)) + acpi_handle_nfit(sdp); else { printf(BEGIN_COMMENT); acpi_print_sdt(sdp);