Reviewed-by: Zhichao Gao <zhichao....@intel.com> Thanks, Zhichao
> -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Vijayenthiran > Subramaniam > Sent: Thursday, January 28, 2021 10:04 PM > To: devel@edk2.groups.io; Sami Mujawar <sami.muja...@arm.com> > Cc: Ni, Ray <ray...@intel.com>; Gao, Zhichao <zhichao....@intel.com>; > matteo.carl...@arm.com; ben.adder...@arm.com; n...@arm.com; Thomas > Abraham <thomas.abra...@arm.com> > Subject: Re: [edk2-devel] [PATCH v4 1/1] ShellPkg/AcpiView: HMAT Parser > > Hi, > > On Wed, Nov 4, 2020 at 11:17 AM Sami Mujawar <sami.muja...@arm.com> > wrote: > > > > From: Marc Moisson-Franckhauser <marc.moisson-franckhau...@arm.com> > > > > Bugzilla: 3045 (https://bugzilla.tianocore.org/show_bug.cgi?id=3045) > > > > Add a new parser for the Heterogeneous Memory Attribute Table. The > > parser also validates some fields for this table. > > > > The HMAT table is used to describe the memory attributes such as > > memory side cache attributes and bandwidth and latency details related > > to memory proximity domains. The info in the HMAT table can be used by > > an operating system for optimisation. > > > > Signed-off-by: Marc Moisson-Franckhauser > > <marc.moisson-franckhau...@arm.com> > > Signed-off-by: Sami Mujawar <sami.muja...@arm.com> > > Tested this patch on Arm's reference design platform with the patch series > https://edk2.groups.io/g/devel/message/70847 applied. > > Tested-by: Vijayenthiran Subramaniam <vijayenthiran.subraman...@arm.com> > > > --- > > > > The changes can be seen at: > > https://github.com/samimujawar/edk2/tree/833_hmat_parser_v4 > > > > Notes: > > v4: > > - Fix data type used for the SMBIOS handle count variable [SAMI] > > to match the field width. > > Ref: https://edk2.groups.io/g/devel/message/66196 > > > > v3: > > - Updates based on review comments, minor updates to output [SAMI] > > formatting and added additional checks. > > > > v2: > > - Fixed minor output formatting in DumpCacheAttributes() [SAMI] > > > > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > > | 28 +- > > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > > | 4 > +- > > ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Hmat/HmatParser.c > | 650 ++++++++++++++++++++ > > > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c > | 3 +- > > > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.i > nf | 3 +- > > > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib. > uni | 3 +- > > 6 files changed, 685 insertions(+), 6 deletions(-) > > > > diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > > index > > > f81ccac7e118378aa185db4b625e5bcd75f78347..969cc0b371852f01f30c88dc506 > 3 > > 74a459c9c19e 100644 > > --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > > @@ -1,7 +1,7 @@ > > /** @file > > Header file for ACPI parser > > > > - Copyright (c) 2016 - 2020, ARM Limited. All rights reserved. > > + Copyright (c) 2016 - 2020, Arm Limited. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent **/ > > > > @@ -592,6 +592,32 @@ ParseAcpiGtdt ( > > ); > > > > /** > > + This function parses the ACPI HMAT table. > > + When trace is enabled this function parses the HMAT table and > > + traces the ACPI table fields. > > + > > + This function parses the following HMAT structures: > > + - Memory Proximity Domain Attributes Structure (Type 0) > > + - System Locality Latency and Bandwidth Info Structure (Type 1) > > + - Memory Side Cache Info structure (Type 2) > > + > > + This function also performs validation of the ACPI table fields. > > + > > + @param [in] Trace If TRUE, trace the ACPI fields. > > + @param [in] Ptr Pointer to the start of the buffer. > > + @param [in] AcpiTableLength Length of the ACPI table. > > + @param [in] AcpiTableRevision Revision of the ACPI table. > > +**/ > > +VOID > > +EFIAPI > > +ParseAcpiHmat ( > > + IN BOOLEAN Trace, > > + IN UINT8* Ptr, > > + IN UINT32 AcpiTableLength, > > + IN UINT8 AcpiTableRevision > > + ); > > + > > +/** > > This function parses the ACPI IORT table. > > When trace is enabled this function parses the IORT table and > > traces the ACPI fields. > > diff --git > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > > index > > > 4f92596b90a6ee422d8d0959881015ffd3de4da0..f8e8b5979f3be041bbc8d17042 > b2 > > db8e0b73f205 100644 > > --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > > @@ -1,7 +1,7 @@ > > /** @file > > Header file for ACPI table parser > > > > - Copyright (c) 2016 - 2018, ARM Limited. All rights reserved. > > + Copyright (c) 2016 - 2018, Arm Limited. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent **/ > > > > @@ -11,7 +11,7 @@ > > /** > > The maximum number of ACPI table parsers. > > */ > > -#define MAX_ACPI_TABLE_PARSERS 16 > > +#define MAX_ACPI_TABLE_PARSERS 32 > > > > /** An invalid/NULL signature value. > > */ > > diff --git > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Hmat/HmatParser > > .c > > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Hmat/HmatParser > > .c > > new file mode 100644 > > index > > > 0000000000000000000000000000000000000000..1d1bc4bdc343e65a8c2fd5f98 > 3b2 > > 078311452329 > > --- /dev/null > > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Hmat/HmatPa > > +++ rser.c > > @@ -0,0 +1,650 @@ > > +/** @file > > + HMAT table parser > > + > > + Copyright (c) 2020, Arm Limited. > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > + @par Reference(s): > > + - ACPI 6.3 Specification - January 2019 > > + > > + @par Glossary: > > + - MPDA - Memory Proximity Domain Attributes > > + - SLLBI - System Locality Latency and Bandwidth Information > > + - MSCI - Memory Side Cache Information > > + - Dom - Domain > > +**/ > > + > > +#include <Library/PrintLib.h> > > +#include <Library/BaseLib.h> > > +#include <Library/UefiLib.h> > > +#include "AcpiParser.h" > > +#include "AcpiView.h" > > + > > +// Maximum Memory Domain matrix print size. > > +#define MAX_MEMORY_DOMAIN_TARGET_PRINT_MATRIX 10 > > + > > +// Local variables > > +STATIC CONST UINT16* HmatStructureType; STATIC CONST UINT32* > > +HmatStructureLength; > > + > > +STATIC CONST UINT32* NumberInitiatorProximityDomain; STATIC CONST > > +UINT32* NumberTargetProximityDomain; STATIC CONST > > > +EFI_ACPI_6_3_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BAND > WIDTH_INF > > +O_FLAGS* > > +SllbiFlags; > > + > > +STATIC CONST UINT8* SllbiDataType; > > +STATIC CONST UINT16* NumberSMBIOSHandles; > > + > > +STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo; > > + > > +/** > > + Names of System Locality Latency Bandwidth Information (SLLBI) data > > +types **/ STATIC CONST CHAR16* SllbiNames[] = { > > + L"Access %sLatency%s", > > + L"Read %sLatency%s", > > + L"Write %sLatency%s", > > + L"Access %sBandwidth%s", > > + L"Read %sBandwidth%s", > > + L"Write %sBandwidth%s" > > +}; > > + > > +/** > > + This function validates the Cache Attributes field. > > + > > + @param [in] Ptr Pointer to the start of the field data. > > + @param [in] Context Pointer to context specific information e.g. this > > + could be a pointer to the ACPI table header. > > +**/ > > +STATIC > > +VOID > > +EFIAPI > > +ValidateCacheAttributes ( > > + IN UINT8* Ptr, > > + IN VOID* Context > > + ) > > +{ > > + > > > +EFI_ACPI_6_3_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATT > RIBUTES* > > + Attributes; > > + > > + Attributes = > > + > > + > (EFI_ACPI_6_3_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATT > RIBUTES > > + *)Ptr; > > + > > + if (Attributes->TotalCacheLevels > 0x3) { > > + IncrementErrorCount (); > > + Print ( > > + L"\nERROR: Attributes bits [3:0] have invalid value: 0x%x", > > + Attributes->TotalCacheLevels > > + ); > > + } > > + if (Attributes->CacheLevel > 0x3) { > > + IncrementErrorCount (); > > + Print ( > > + L"\nERROR: Attributes bits [7:4] have invalid value: 0x%x", > > + Attributes->CacheLevel > > + ); > > + } > > + if (Attributes->CacheAssociativity > 0x2) { > > + IncrementErrorCount (); > > + Print ( > > + L"\nERROR: Attributes bits [11:8] have invalid value: 0x%x", > > + Attributes->CacheAssociativity > > + ); > > + } > > + if (Attributes->WritePolicy > 0x2) { > > + IncrementErrorCount (); > > + Print ( > > + L"\nERROR: Attributes bits [15:12] have invalid value: 0x%x", > > + Attributes->WritePolicy > > + ); > > + } > > +} > > + > > +/** > > + Dumps the cache attributes field > > + > > + @param [in] Format Optional format string for tracing the data. > > + @param [in] Ptr Pointer to the start of the buffer. > > +**/ > > +STATIC > > +VOID > > +EFIAPI > > +DumpCacheAttributes ( > > + IN CONST CHAR16* Format OPTIONAL, > > + IN UINT8* Ptr > > + ) > > +{ > > + > > > +EFI_ACPI_6_3_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATT > RIBUTES* > > + Attributes; > > + > > + Attributes = > > + > > + > (EFI_ACPI_6_3_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATT > RIBUTES > > + *)Ptr; > > + > > + Print (L"\n"); > > + PrintFieldName (4, L"Total Cache Levels"); > > + Print (L"%d\n", Attributes->TotalCacheLevels); > > + PrintFieldName (4, L"Cache Level"); > > + Print (L"%d\n", Attributes->CacheLevel); > > + PrintFieldName (4, L"Cache Associativity"); > > + Print (L"%d\n", Attributes->CacheAssociativity); > > + PrintFieldName (4, L"Write Policy"); > > + Print (L"%d\n", Attributes->WritePolicy); > > + PrintFieldName (4, L"Cache Line Size"); > > + Print (L"%d\n", Attributes->CacheLineSize); } > > + > > +/** > > + An ACPI_PARSER array describing the ACPI HMAT Table. > > +*/ > > +STATIC CONST ACPI_PARSER HmatParser[] = { > > + PARSE_ACPI_HEADER (&AcpiHdrInfo), > > + {L"Reserved", 4, 36, NULL, NULL, NULL, NULL, NULL} }; > > + > > +/** > > + An ACPI_PARSER array describing the HMAT structure header. > > +*/ > > +STATIC CONST ACPI_PARSER HmatStructureHeaderParser[] = { > > + {L"Type", 2, 0, NULL, NULL, (VOID**)&HmatStructureType, NULL, > > +NULL}, > > + {L"Reserved", 2, 2, NULL, NULL, NULL, NULL, NULL}, > > + {L"Length", 4, 4, NULL, NULL, (VOID**)&HmatStructureLength, NULL, > > +NULL} }; > > + > > +/** > > + An ACPI PARSER array describing the Memory Proximity Domain > > +Attributes > > + Structure - Type 0. > > +*/ > > +STATIC CONST ACPI_PARSER MemProximityDomainAttributeParser[] = { > > + {L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Reserved", 2, 2, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Length", 4, 4, L"%d", NULL, NULL, NULL, NULL}, > > + {L"Flags", 2, 8, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Reserved", 2, 10, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Proximity Dom for initiator", 4, 12, L"0x%x", NULL, NULL, NULL, > > +NULL}, > > + {L"Proximity Dom for memory", 4, 16, L"0x%x", NULL, NULL, NULL, > > +NULL}, > > + {L"Reserved", 4, 20, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Reserved", 8, 24, L"0x%lx", NULL, NULL, NULL, NULL}, > > + {L"Reserved", 8, 32, L"0x%lx", NULL, NULL, NULL, NULL} }; > > + > > +/** > > + An ACPI PARSER array describing the System Locality Latency and > > +Bandwidth > > + Information Structure - Type 1. > > +*/ > > +STATIC CONST ACPI_PARSER SllbiParser[] = { > > + {L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Reserved", 2, 2, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Length", 4, 4, L"%d", NULL, NULL, NULL, NULL}, > > + {L"Flags", 1, 8, L"0x%x", NULL, (VOID**)&SllbiFlags, NULL, NULL}, > > + {L"Data type", 1, 9, L"0x%x", NULL, (VOID**)&SllbiDataType, NULL, > > +NULL}, > > + {L"Reserved", 2, 10, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Initiator Proximity Dom Count", 4, 12, L"%d", NULL, > > + (VOID**)&NumberInitiatorProximityDomain, NULL, NULL}, > > + {L"Target Proximity Dom Count", 4, 16, L"%d", NULL, > > + (VOID**)&NumberTargetProximityDomain, NULL, NULL}, > > + {L"Reserved", 4, 20, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Entry Base Unit", 8, 24, L"0x%lx", NULL, NULL, NULL, NULL} > > + // initiator Proximity Domain list ... > > + // target Proximity Domain list ... > > + // Latency/Bandwidth matrix ... > > +}; > > + > > +/** > > + An ACPI PARSER array describing the Memory Side Cache Information > > + Structure - Type 2. > > +*/ > > +STATIC CONST ACPI_PARSER MemSideCacheInfoParser[] = { > > + {L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Reserved", 2, 2, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Length", 4, 4, L"%d", NULL, NULL, NULL, NULL}, > > + {L"Proximity Dom for memory", 4, 8, L"0x%x", NULL, NULL, NULL, > > +NULL}, > > + {L"Reserved", 4, 12, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"Memory Side Cache Size", 8, 16, L"0x%lx", NULL, NULL, NULL, > > +NULL}, > > + {L"Cache Attributes", 4, 24, NULL, DumpCacheAttributes, NULL, > > + ValidateCacheAttributes, NULL}, > > + {L"Reserved", 2, 28, L"0x%x", NULL, NULL, NULL, NULL}, > > + {L"SMBIOS Handle Count", 2, 30, L"%d", NULL, > > + (VOID**)&NumberSMBIOSHandles, NULL, NULL} > > + // SMBIOS handles List ... > > +}; > > + > > +/** > > + This function parses the Memory Proximity Domain Attributes > > + Structure (Type 0). > > + > > + @param [in] Ptr Pointer to the start of the Memory Proximity Domain > > + Attributes Structure data. > > + @param [in] Length Length of the Memory Proximity Domain Attributes > > + Structure. > > +**/ > > +STATIC > > +VOID > > +DumpMpda ( > > + IN UINT8* Ptr, > > + IN UINT32 Length > > + ) > > +{ > > + ParseAcpi ( > > + TRUE, > > + 2, > > + "Memory Proximity Domain Attributes Structure", > > + Ptr, > > + Length, > > + PARSER_PARAMS (MemProximityDomainAttributeParser) > > + ); > > +} > > + > > +/** > > + This function parses the System Locality Latency and Bandwidth > > +Information > > + Structure (Type 1). > > + > > + @param [in] Ptr Pointer to the start of the System Locality Latency > > and > > + Bandwidth Information Structure data. > > + @param [in] Length Length of the System Locality Latency and Bandwidth > > + Information Structure. > > +**/ > > +STATIC > > +VOID > > +DumpSllbi ( > > + IN UINT8* Ptr, > > + IN UINT32 Length > > + ) > > +{ > > + CONST UINT32* InitiatorProximityDomainList; > > + CONST UINT32* TargetProximityDomainList; > > + CONST UINT16* LatencyBandwidthMatrix; > > + UINT32 Offset; > > + CHAR16 Buffer[OUTPUT_FIELD_COLUMN_WIDTH]; > > + CHAR16 SecondBuffer[OUTPUT_FIELD_COLUMN_WIDTH]; > > + UINT32 RequiredTableSize; > > + UINT32 Index; > > + UINT32 IndexInitiator; > > + UINT32 IndexTarget; > > + UINT32 TargetStartOffset; > > + > > + Offset = ParseAcpi ( > > + TRUE, > > + 2, > > + "System Locality Latency and Bandwidth Information Structure", > > + Ptr, > > + Length, > > + PARSER_PARAMS (SllbiParser) > > + ); > > + > > + // Check if the values used to control the parsing logic have been > > + // successfully read. > > + if ((SllbiFlags == NULL) || > > + (SllbiDataType == NULL) || > > + (NumberInitiatorProximityDomain == NULL) || > > + (NumberTargetProximityDomain == NULL)) { > > + IncrementErrorCount (); > > + Print ( > > + L"ERROR: Insufficient remaining table buffer length to read the " \ > > + L"SLLBI structure header. Length = %d.\n", > > + Length > > + ); > > + return; > > + } > > + > > + RequiredTableSize = (*NumberInitiatorProximityDomain * sizeof (UINT32)) + > > + (*NumberTargetProximityDomain * sizeof (UINT32)) + > > + (*NumberInitiatorProximityDomain * > > + *NumberTargetProximityDomain * sizeof (UINT16)) + > > + Offset; > > + > > + if (RequiredTableSize > Length) { > > + IncrementErrorCount (); > > + Print ( > > + L"ERROR: Insufficient System Locality Latency and Bandwidth" \ > > + L"Information Structure length. TableLength = %d. " \ > > + L"RequiredTableLength = %d.\n", > > + Length, > > + RequiredTableSize > > + ); > > + return; > > + } > > + > > + InitiatorProximityDomainList = (UINT32*) (Ptr + Offset); > > + TargetProximityDomainList = InitiatorProximityDomainList + > > + *NumberInitiatorProximityDomain; > > + LatencyBandwidthMatrix = (UINT16*) (TargetProximityDomainList + > > + *NumberTargetProximityDomain); > > + > > + // Display each element of the Initiator Proximity Domain list for > > + (Index = 0; Index < *NumberInitiatorProximityDomain; Index++) { > > + UnicodeSPrint ( > > + Buffer, > > + sizeof (Buffer), > > + L"Initiator Proximity Dom [%d]", > > + Index > > + ); > > + > > + PrintFieldName (4, Buffer); > > + Print ( > > + L"0x%x\n", > > + InitiatorProximityDomainList[Index] > > + ); > > + } > > + > > + // Display each element of the Target Proximity Domain list for > > + (Index = 0; Index < *NumberTargetProximityDomain; Index++) { > > + UnicodeSPrint ( > > + Buffer, > > + sizeof (Buffer), > > + L"Target Proximity Dom [%d]", > > + Index > > + ); > > + > > + PrintFieldName (4, Buffer); > > + Print ( > > + L"0x%x\n", > > + TargetProximityDomainList[Index] > > + ); > > + } > > + > > + // Create base name depending on Data Type in this Structure if > > + (*SllbiDataType >= ARRAY_SIZE (SllbiNames)) { > > + IncrementErrorCount (); > > + Print (L"Error: Unkown Data Type. DataType = 0x%x.\n", *SllbiDataType); > > + return; > > + } > > + StrCpyS (Buffer, sizeof (Buffer), SllbiNames[*SllbiDataType]); > > + > > + // Adjust base name depending on Memory Hierarchy in this Structure > > + switch (SllbiFlags->MemoryHierarchy) { > > + case 0: > > + UnicodeSPrint ( > > + SecondBuffer, > > + sizeof (SecondBuffer), > > + Buffer, > > + L"", > > + L"%s" > > + ); > > + break; > > + case 1: > > + case 2: > > + case 3: > > + UnicodeSPrint ( > > + SecondBuffer, > > + sizeof (SecondBuffer), > > + Buffer, > > + L"Hit ", > > + L"%s" > > + ); > > + break; > > + default: > > + IncrementErrorCount (); > > + Print ( > > + L"Error: Invalid Memory Hierarchy. MemoryHierarchy = %d.\n", > > + SllbiFlags->MemoryHierarchy > > + ); > > + return; > > + > > + } // switch > > + > > + if (*NumberTargetProximityDomain <= > MAX_MEMORY_DOMAIN_TARGET_PRINT_MATRIX) { > > + // Display the latency/bandwidth matrix as a matrix > > + UnicodeSPrint ( > > + Buffer, > > + sizeof (Buffer), > > + SecondBuffer, > > + L"" > > + ); > > + PrintFieldName (4, Buffer); > > + > > + Print (L"\n Target : X-axis (Horizontal)"); > > + Print (L"\n Initiator : Y-axis (Vertical)"); > > + Print (L"\n |"); > > + > > + for (IndexTarget = 0; > > + IndexTarget < *NumberTargetProximityDomain; > > + IndexTarget++) { > > + Print (L" %2d", IndexTarget); > > + } > > + > > + Print (L"\n ---+"); > > + for (IndexTarget = 0; > > + IndexTarget < *NumberTargetProximityDomain; > > + IndexTarget++) { > > + Print (L"------"); > > + } > > + Print (L"\n"); > > + > > + TargetStartOffset = 0; > > + for (IndexInitiator = 0; > > + IndexInitiator < *NumberInitiatorProximityDomain; > > + IndexInitiator++) { > > + Print (L" %2d |", IndexInitiator); > > + for (IndexTarget = 0; > > + IndexTarget < *NumberTargetProximityDomain; > > + IndexTarget++) { > > + Print ( > > + L" %5d", > > + LatencyBandwidthMatrix[TargetStartOffset + IndexTarget] > > + ); > > + } // for Target > > + Print (L"\n"); > > + TargetStartOffset += (*NumberTargetProximityDomain); > > + } // for Initiator > > + Print (L"\n"); > > + } else { > > + // Display the latency/bandwidth matrix as a list > > + UnicodeSPrint ( > > + Buffer, > > + sizeof (Buffer), > > + SecondBuffer, > > + L" [%d][%d]" > > + ); > > + > > + TargetStartOffset = 0; > > + for (IndexInitiator = 0; > > + IndexInitiator < *NumberInitiatorProximityDomain; > > + IndexInitiator++) { > > + for (IndexTarget = 0; > > + IndexTarget < *NumberTargetProximityDomain; > > + IndexTarget++) { > > + UnicodeSPrint ( > > + SecondBuffer, > > + sizeof (SecondBuffer), > > + Buffer, > > + IndexInitiator, > > + IndexTarget > > + ); > > + > > + PrintFieldName (4, SecondBuffer); > > + Print ( > > + L"%d\n", > > + LatencyBandwidthMatrix[TargetStartOffset + IndexTarget] > > + ); > > + } // for Target > > + TargetStartOffset += (*NumberTargetProximityDomain); > > + } // for Initiator > > + } > > +} > > + > > +/** > > + This function parses the Memory Side Cache Information Structure (Type > > 2). > > + > > + @param [in] Ptr Pointer to the start of the Memory Side Cache > > Information > > + Structure data. > > + @param [in] Length Length of the Memory Side Cache Information > > Structure. > > +**/ > > +STATIC > > +VOID > > +DumpMsci ( > > + IN UINT8* Ptr, > > + IN UINT32 Length > > + ) > > +{ > > + CONST UINT16* SMBIOSHandlesList; > > + CHAR16 Buffer[OUTPUT_FIELD_COLUMN_WIDTH]; > > + UINT32 Offset; > > + UINT16 Index; > > + > > + Offset = ParseAcpi ( > > + TRUE, > > + 2, > > + "Memory Side Cache Information Structure", > > + Ptr, > > + Length, > > + PARSER_PARAMS (MemSideCacheInfoParser) > > + ); > > + > > + // Check if the values used to control the parsing logic have been > > + // successfully read. > > + if (NumberSMBIOSHandles == NULL) { > > + IncrementErrorCount (); > > + Print ( > > + L"ERROR: Insufficient remaining table buffer length to read the " \ > > + L"MSCI structure header. Length = %d.\n", > > + Length > > + ); > > + return; > > + } > > + > > + if ((*NumberSMBIOSHandles * sizeof (UINT16)) > (Length - Offset)) { > > + IncrementErrorCount (); > > + Print ( > > + L"ERROR: Invalid Number of SMBIOS Handles. SMBIOSHandlesCount > = %d." \ > > + L"RemainingBufferLength = %d.\n", > > + *NumberSMBIOSHandles, > > + Length - Offset > > + ); > > + return; > > + } > > + > > + SMBIOSHandlesList = (UINT16*) (Ptr + Offset); > > + > > + for (Index = 0; Index < *NumberSMBIOSHandles; Index++) { > > + UnicodeSPrint ( > > + Buffer, > > + sizeof (Buffer), > > + L"SMBIOS Handles [%d]", > > + Index > > + ); > > + > > + PrintFieldName (4, Buffer); > > + Print ( > > + L"0x%x\n", > > + SMBIOSHandlesList[Index] > > + ); > > + } > > +} > > + > > +/** > > + This function parses the ACPI HMAT table. > > + When trace is enabled this function parses the HMAT table and > > + traces the ACPI table fields. > > + > > + This function parses the following HMAT structures: > > + - Memory Proximity Domain Attributes Structure (Type 0) > > + - System Locality Latency and Bandwidth Info Structure (Type 1) > > + - Memory Side Cache Info structure (Type 2) > > + > > + This function also performs validation of the ACPI table fields. > > + > > + @param [in] Trace If TRUE, trace the ACPI fields. > > + @param [in] Ptr Pointer to the start of the buffer. > > + @param [in] AcpiTableLength Length of the ACPI table. > > + @param [in] AcpiTableRevision Revision of the ACPI table. > > +**/ > > +VOID > > +EFIAPI > > +ParseAcpiHmat ( > > + IN BOOLEAN Trace, > > + IN UINT8* Ptr, > > + IN UINT32 AcpiTableLength, > > + IN UINT8 AcpiTableRevision > > + ) > > +{ > > + UINT32 Offset; > > + UINT8* HmatStructurePtr; > > + > > + if (!Trace) { > > + return; > > + } > > + > > + Offset = ParseAcpi ( > > + Trace, > > + 0, > > + "HMAT", > > + Ptr, > > + AcpiTableLength, > > + PARSER_PARAMS (HmatParser) > > + ); > > + > > + HmatStructurePtr = Ptr + Offset; > > + > > + while (Offset < AcpiTableLength) { > > + // Parse HMAT Structure Header to obtain Type and Length. > > + ParseAcpi ( > > + FALSE, > > + 0, > > + NULL, > > + HmatStructurePtr, > > + AcpiTableLength - Offset, > > + PARSER_PARAMS (HmatStructureHeaderParser) > > + ); > > + > > + // Check if the values used to control the parsing logic have been > > + // successfully read. > > + if ((HmatStructureType == NULL) || > > + (HmatStructureLength == NULL)) { > > + IncrementErrorCount (); > > + Print ( > > + L"ERROR: Insufficient remaining table buffer length to read the " \ > > + L"HMAT structure header. Length = %d.\n", > > + AcpiTableLength - Offset > > + ); > > + return; > > + } > > + > > + // Validate HMAT Structure length. > > + if ((*HmatStructureLength == 0) || > > + ((Offset + (*HmatStructureLength)) > AcpiTableLength)) { > > + IncrementErrorCount (); > > + Print ( > > + L"ERROR: Invalid HMAT Structure length. " \ > > + L"Length = %d. Offset = %d. AcpiTableLength = %d.\n", > > + *HmatStructureLength, > > + Offset, > > + AcpiTableLength > > + ); > > + return; > > + } > > + > > + switch (*HmatStructureType) { > > + case > EFI_ACPI_6_3_HMAT_TYPE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES: > > + DumpMpda ( > > + HmatStructurePtr, > > + *HmatStructureLength > > + ); > > + break; > > + case > EFI_ACPI_6_3_HMAT_TYPE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_I > NFO: > > + DumpSllbi ( > > + HmatStructurePtr, > > + *HmatStructureLength > > + ); > > + break; > > + case EFI_ACPI_6_3_HMAT_TYPE_MEMORY_SIDE_CACHE_INFO: > > + DumpMsci ( > > + HmatStructurePtr, > > + *HmatStructureLength > > + ); > > + break; > > + default: > > + IncrementErrorCount (); > > + Print ( > > + L"ERROR: Unknown HMAT structure:" > > + L" Type = %d, Length = %d\n", > > + *HmatStructureType, > > + *HmatStructureLength > > + ); > > + break; > > + } // switch > > + > > + HmatStructurePtr += *HmatStructureLength; > > + Offset += *HmatStructureLength; > > + } // while > > +} > > diff --git > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.c > > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.c index > > > d2f26ff89f12e596702281c38ab0de3729aa68e4..c9e3054a5c413ba95e6420ce3d > 02 > > f0d954e99d90 100644 > > --- > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.c > > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCo > > +++ mmandLib.c > > @@ -1,7 +1,7 @@ > > /** @file > > Main file for 'acpiview' Shell command function. > > > > - Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.<BR> > > + Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.<BR> > > SPDX-License-Identifier: BSD-2-Clause-Patent **/ > > > > @@ -53,6 +53,7 @@ ACPI_TABLE_PARSER ParserList[] = { > > {EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE, > ParseAcpiFacs}, > > {EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, > ParseAcpiFadt}, > > {EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, > > ParseAcpiGtdt}, > > + > {EFI_ACPI_6_3_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE, > > + ParseAcpiHmat}, > > {EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE, ParseAcpiIort}, > > {EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, > ParseAcpiMadt}, > > > > > {EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BA > SE_ADDRE > > SS_DESCRIPTION_TABLE_SIGNATURE, diff --git > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.inf > > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.inf index > > > 91459f9ec632635ee453c5ef46f67445cd9eee0c..e970c4259c143b5b06fb1a759d5 > 8 > > 19e7cb93e749 100644 > > --- > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.inf > > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCo > > +++ mmandLib.inf > > @@ -1,7 +1,7 @@ > > ## @file > > # Provides Shell 'acpiview' command functions # -# Copyright (c) > > 2016 - 2020, ARM Limited. All rights reserved.<BR> > > +# Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.<BR> > > # > > # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -33,6 +33,7 @@ > > [Sources.common] > > Parsers/Facs/FacsParser.c > > Parsers/Fadt/FadtParser.c > > Parsers/Gtdt/GtdtParser.c > > + Parsers/Hmat/HmatParser.c > > Parsers/Iort/IortParser.c > > Parsers/Madt/MadtParser.c > > Parsers/Madt/MadtParser.h > > diff --git > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.uni > > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.uni index > > > 7cd43d0518fd0a23dc547a5cab0d08b62602a113..6b0537b47a751184e8a68a653 > 0aa > > 85eb28ea33ba 100644 > > --- > > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComman > > dLib.uni > > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCo > > +++ mmandLib.uni > > @@ -1,6 +1,6 @@ > > // /** > > // > > -// Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.<BR> > > +// Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.<BR> > > // SPDX-License-Identifier: BSD-2-Clause-Patent // // Module Name: > > @@ -84,6 +84,7 @@ > > " DSDT - Differentiated System Description Table\r\n" > > " FACP - Fixed ACPI Description Table (FADT)\r\n" > > " GTDT - Generic Timer Description Table\r\n" > > +" HMAT - Heterogeneous Memory Attributes Table\r\n" > > " IORT - IO Remapping Table\r\n" > > " MCFG - Memory Mapped Config Space Base Address Description > Table\r\n" > > " PPTT - Processor Properties Topology Table\r\n" > > -- > > 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#70991): https://edk2.groups.io/g/devel/message/70991 Mute This Topic: https://groups.io/mt/78026691/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-