From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web11.6396.1600309062516603421 for ; Wed, 16 Sep 2020 19:17:42 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=iAqwbM4Y; spf=pass (domain: intel.com, ip: 192.55.52.43, mailfrom: zhichao.gao@intel.com) IronPort-SDR: OxmwppnuTiTaBM0wXYhu712vMHp1rxiX1fKsgHKveDgFEVy1fN8ml3w9EXDDOXgKCcVvWhN+iw y5NLaNfGyaRQ== X-IronPort-AV: E=McAfee;i="6000,8403,9746"; a="244442850" X-IronPort-AV: E=Sophos;i="5.76,434,1592895600"; d="scan'208";a="244442850" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Sep 2020 19:17:41 -0700 IronPort-SDR: Jgt9KUk0tCSp2j4sYjtxM5XWfqjYvyFQfsVqR5nJNetLDsaw0Py2C6/YYlnpzQW+fwKIvZl0Uy zl/QJjlEGbBQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,434,1592895600"; d="scan'208";a="288570326" Received: from fmsmsx605.amr.corp.intel.com ([10.18.126.85]) by fmsmga008.fm.intel.com with ESMTP; 16 Sep 2020 19:17:41 -0700 Received: from fmsmsx601.amr.corp.intel.com (10.18.126.81) by fmsmsx605.amr.corp.intel.com (10.18.126.85) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Wed, 16 Sep 2020 19:17:40 -0700 Received: from fmsedg601.ED.cps.intel.com (10.1.192.135) by fmsmsx601.amr.corp.intel.com (10.18.126.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5 via Frontend Transport; Wed, 16 Sep 2020 19:17:40 -0700 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (104.47.55.170) by edgegateway.intel.com (192.55.55.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.1713.5; Wed, 16 Sep 2020 19:17:35 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KYtY79nzPE+9WC17dMNkQ8nk7laA1dCqf56cHD/kKiPmyjubPXGM/c+0mf6JyzfIys7djZHywoAMiXtdZ+V1bn9TRr3+ggZl961KP+0mTxM79ko47BfI6XzbUwYGYwRbyOsjy1+7nos6lcVbC0ANTe6DMhMA0rlhkdYaaHeNHJ1qz5QDl7kFoGNY/6lPBaOM1hizVLkIL4KcyvH13niij1QnZk4RhuZ6L5nWcYqR6U6YA6o9PbWmLPGHb/rHkiBk6roTLjkfOX5J9OLiQV+mX9pBQhckyKjQmY1wGECBxBN8ZWkWlLpL89B88jyCvCSHTeNbQe+rC9G+djJc2p6B3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8WsfjaF3O4Z+YY2hq1SEt4wZJRPTbZAu4Qo1+e4kYMU=; b=HKaestCixwOAhCJol9I9L5oZleIgm1PiAuyzfH/JiShHosXTnmaQCkufJ/jioq0w4Hbck+wpCb11vkR7zN5AzfQKMZsLRzYrDUFZT5Ukul2r8ORJR0umj9CEAbI7r8kM2+CQWCYEDeN438xwwCZ0TlwSa77Ji11sbizLbY3fvAhZrzOu7vFt+p2rw50hrWhgXiyyujwrbKSfimo7XSDybCXNzy/a7o7h4OmKjNa3UcaiDv3EhrtoaUnQ7TVjy+rCSnbWhyUCouolVJ+qYikT1fOYsXLIiFdWG9T7iLmESf6QpUHT5+otMgebTE0GB//LpG9CuracNtZ88lHPFr+Wjw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8WsfjaF3O4Z+YY2hq1SEt4wZJRPTbZAu4Qo1+e4kYMU=; b=iAqwbM4Yw1o097XoK7MRs1W4v5O1AT/jlf6mj+gab34R1F20WvgfibUN3LbMyIlYimHCto5JVzD0T3NM5wpK91nSypAy+S34Hq3O39Ha4YZUlAC37EytciRcmaQL0ARiIK5R6alisEb2zinAnymlOycDURwuxOPI39WueU3BPRA= Received: from DM6PR11MB4425.namprd11.prod.outlook.com (2603:10b6:5:1d9::31) by DM5PR11MB1868.namprd11.prod.outlook.com (2603:10b6:3:114::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3391.11; Thu, 17 Sep 2020 02:17:34 +0000 Received: from DM6PR11MB4425.namprd11.prod.outlook.com ([fe80::8dc1:7146:874:83f7]) by DM6PR11MB4425.namprd11.prod.outlook.com ([fe80::8dc1:7146:874:83f7%6]) with mapi id 15.20.3370.019; Thu, 17 Sep 2020 02:17:34 +0000 From: "Gao, Zhichao" To: "devel@edk2.groups.io" , "sami.mujawar@arm.com" CC: "Ni, Ray" , "marc.moisson-franckhauser@arm.com" , "Guillaume.Letellier@arm.com" , "Matteo.Carlini@arm.com" , "Ben.Adderson@arm.com" , "nd@arm.com" Subject: Re: [edk2-devel] [PATCH v2 1/1] ShellPkg/AcpiView: HMAT Parser Thread-Topic: [edk2-devel] [PATCH v2 1/1] ShellPkg/AcpiView: HMAT Parser Thread-Index: AQHWes/v96qmm6duqkKQUbNK6vCdKalsN7Cg Date: Thu, 17 Sep 2020 02:17:33 +0000 Message-ID: References: <20200825110651.17652-1-sami.mujawar@arm.com> In-Reply-To: <20200825110651.17652-1-sami.mujawar@arm.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.5.1.3 authentication-results: edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.55.46.36] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 048f95ed-7818-4e2d-bc5f-08d85aafd6c9 x-ms-traffictypediagnostic: DM5PR11MB1868: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8882; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 7FWA6ouc0Evw7gqHAwfkA9XUWN6Wj+CJe8oTSEsyARWLMW4LJ5e9RLv2v8zY3fEUZcIp9iWVPAFwd+0VOjFlJazKNqHoi/Z58QkPmAIYrOv3GM+RlcF6QvKjsrYxMq+EVnLeDFgoVNGKsyCaTLu/ighoYi3ogHYa8k+lbID4s5GyRuwbSCkL3E+g5Yh9KNNwHR793TP6p5U+tHurfCHVzxBQ1FYEw7xMrM/7Y3DWFieZFOeBJdgMVinvy0q15KCj1/RG1Cq7+Sirf/wie+oAqHh2rrN0cEuXmSlYG8cq9ZXXRv7nd4NMuMpc4y9ZZBLaZQNeVphlbkxTSBfg+3Lo6GG3ubNPBfse72Ha5JtWfvGtGsvfJ6Y4d00XLcWO90qeqNz6WLZnEFPHcgZSocTftg== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR11MB4425.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(346002)(136003)(366004)(39860400002)(376002)(396003)(186003)(55016002)(9686003)(966005)(7696005)(45954011)(30864003)(66946007)(76116006)(478600001)(53546011)(86362001)(316002)(2906002)(33656002)(26005)(6506007)(4326008)(66446008)(52536014)(110136005)(8676002)(8936002)(5660300002)(83380400001)(54906003)(71200400001)(64756008)(66476007)(66556008)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: OiBlJxmUtytqC9FNUPZ0lNQNBSGUu+eVOpM1wCwqjxDkGH/lEmNnTfxkJnY7ffv55sDr5fWtMLo05RCqR5jvKqwXUmJLGzJvFO50RPGig5HzzwVmc2yn0MgjXyxhibgu9T9cZas0ydY/WXW2VLjR2PhQ2qtAWa5JP6K+R025t+8SR9RiSlKQqDkrg2yeyePrFQw2saUjIcIUEB+lIYA35tpqG+7D7MtuClekO7sjoaFlKp5y7YCQWKejiSlpKMSBgiuAwBD/EkTzRstGFkdiGoklKK3N5FraBY4gFOdbfRX5vgkqLIzGehnkzemyr4/AFPJcDtq8E8Bd+bbQq9k5vedx+lpJ/MhZdNuqozHDwyeCK0fPZ9W/yJzre0I1GUnJnXo+vuLuT9yCjMjhTcKi4agFFEjfLeaFrAhO4frqW3vGHR+qPnd68JNgGSfCqqxNTrrOS6zeFNww1Uv4Gv/Va21fm9wVYoDazJ4dfudRwjH2/4ITcg68fORLdNHvhccS5H3bLt8WKyoZSZpHAzeBVnjJk92z9DcQMGBvdCVb6p4i5NPhcc3bTztwspe6/pzr2a5FVrzdTtX84k0z63vOo3TgA2HjwO255JNgmKjwSquNvBPWj8QCzbIp5vL1FN7lmwNLiYg5foDXgXCO8Fuk3g== MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB4425.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 048f95ed-7818-4e2d-bc5f-08d85aafd6c9 X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Sep 2020 02:17:34.0198 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: fSztRZ7BP7HhNZ/9g+179zDt8tSx6gJGdOmKgIFJIKCQg45E81SAFtl+oE0QJZSAKTDVWiLyjzWIkSraTDWReQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR11MB1868 Return-Path: zhichao.gao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Sami, Please see below comment. > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Sami > Mujawar > Sent: Tuesday, August 25, 2020 7:07 PM > To: devel@edk2.groups.io > Cc: Sami Mujawar ; Ni, Ray ; Gao= , > Zhichao ; marc.moisson-franckhauser@arm.com; > Guillaume.Letellier@arm.com; Matteo.Carlini@arm.com; > Ben.Adderson@arm.com; nd@arm.com > Subject: [edk2-devel] [PATCH v2 1/1] ShellPkg/AcpiView: HMAT Parser >=20 > From: Marc Moisson-Franckhauser >=20 > Add a new parser for the Heterogeneous Memory Attribute Table. The parse= r > also validates some fields for this table. >=20 > The HMAT table is used to describe the memory attributes such as memory = side > cache attributes and bandwidth and latency details related to memory pro= ximity > domains. The info in the HMAT table can be used by an operating system f= or > optimisation. >=20 > Signed-off-by: Marc Moisson-Franckhauser franckhauser@arm.com> > Signed-off-by: Sami Mujawar > --- >=20 > The changes can be seen at: > https://github.com/samimujawar/edk2/tree/833_hmat_parser_v2 >=20 > Notes: > v2: > - Fixed minor output formatting in DumpCacheAttributes() [SAM= I] >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h = | 28 +- > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h = | 4 > +- > ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Hmat/HmatParser.c > | 641 ++++++++++++++++++++ >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib= .c > | 3 +- >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib= .i > nf | 3 +- >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib= . > uni | 3 +- > 6 files changed, 676 insertions(+), 6 deletions(-) >=20 > diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > index > f81ccac7e118378aa185db4b625e5bcd75f78347..969cc0b371852f01f30c88dc506 > 374a459c9c19e 100644 > --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > @@ -1,7 +1,7 @@ > /** @file > Header file for ACPI parser >=20 > - 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 **/ >=20 > @@ -592,6 +592,32 @@ ParseAcpiGtdt ( > ); >=20 > /** > + 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/AcpiTableParse= r.h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > index > 4f92596b90a6ee422d8d0959881015ffd3de4da0..f8e8b5979f3be041bbc8d17042 > b2db8e0b73f205 100644 > --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > @@ -1,7 +1,7 @@ > /** @file > Header file for ACPI table parser >=20 > - 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 **/ >=20 > @@ -11,7 +11,7 @@ > /** > The maximum number of ACPI table parsers. > */ > -#define MAX_ACPI_TABLE_PARSERS 16 > +#define MAX_ACPI_TABLE_PARSERS 32 >=20 > /** 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..57b93cca6ba24ed77f9dcd7bf > 2f45ba9f0cb9f26 > --- /dev/null > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Hmat/HmatPars > +++ er.c > @@ -0,0 +1,641 @@ > +/** @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 > +#include > +#include > +#include "AcpiParser.h" > +#include "AcpiView.h" > + > +// Maximum Memory Domain matrix print size. > +#define MAX_MEMORY_DOMAIN_TARGET_PRINT_MATRIX 12 > + > +// 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_INFO_ > +FLAGS* > +SllbiFlags; > + > +STATIC CONST UINT8* SllbiDataType; > +STATIC CONST UINT32* NumberSMBIOSHandles; > + > +STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo; > + > +/** > + Names of System Locality Latency Bandwidth Information (SLLBI) data > +types **/ STATIC CONST CHAR16* SllbiNames[] =3D { > + 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_ATTR > IBUTES* > + Attributes; > + > + Attributes =3D > + > + > (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_ATTR > IBUTES* > + Attributes; > + > + Attributes =3D > + > + > (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[] =3D { > + 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[] =3D { > + {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[] =3D { > + {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[] =3D { > + {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[] =3D { > + {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 Doma= in > + Attributes Structure data. > + @param [in] Length Length of the Memory Proximity Domain Attributes > + Structure. > +**/ > +STATIC > +VOID > +DumpMpda ( > + IN UINT8* Ptr, > + IN UINT8 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 Laten= cy and > + Bandwidth Information Structure data. > + @param [in] Length Length of the System Locality Latency and Bandwid= th > + Information Structure. > +**/ > +STATIC > +VOID > +DumpSllbi ( > + IN UINT8* Ptr, > + IN UINT8 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; > + > + Offset =3D ParseAcpi ( > + TRUE, > + 2, > + "System Locality Latency and Bandwidth Information Structu= re", > + Ptr, > + Length, > + PARSER_PARAMS (SllbiParser) > + ); > + > + // Check if the values used to control the parsing logic have been > + // successfully read. > + if ((SllbiFlags =3D=3D NULL) || > + (SllbiDataType =3D=3D NULL) || > + (NumberInitiatorProximityDomain =3D=3D NULL) || > + (NumberTargetProximityDomain =3D=3D NULL)) { > + IncrementErrorCount (); > + Print ( > + L"ERROR: Insufficient remaining table buffer length to read the "= \ > + L"SLLBI structure header. Length =3D %d.\n", > + Length > + ); > + return; > + } > + > + RequiredTableSize =3D (*NumberInitiatorProximityDomain * sizeof (UINT= 32)) + > + (*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 =3D %d. " \ > + L"RequiredTableLength =3D %d.\n", > + Length, > + RequiredTableSize > + ); > + return; > + } > + > + InitiatorProximityDomainList =3D (UINT32*) (Ptr + Offset); > + TargetProximityDomainList =3D InitiatorProximityDomainList + > + *NumberInitiatorProximityDomain; > + LatencyBandwidthMatrix =3D (UINT16*) (TargetProximityDomainList + > + *NumberTargetProximityDomain); > + > + // Display each element of the Initiator Proximity Domain list for > + (Index =3D 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 =3D 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 >=3D ARRAY_SIZE (SllbiNames)) { > + IncrementErrorCount (); > + Print (L"Error: Unkown Data Type. DataType =3D 0x%x.\n", *SllbiData= Type); > + 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 =3D %d.\n", > + SllbiFlags->MemoryHierarchy > + ); > + return; > + } I don't think switch case need the '{' and '}' to indicated the block sect= ion. And refer to APCI spec 6.3 table 5-146. It says for memory hierarchy =3D= =3D 1, 2, 3 or 4, the data type is 'hit'. I am not sure if it is a spec mi= stake in 'Flags' or 'Data Type'. > + } // switch > + > + if (IndexInitiator <=3D MAX_MEMORY_DOMAIN_TARGET_PRINT_MATRIX) { The IndexInitiator is not initialized before use it. And it should not be = the Initiator, it should be the target as the horizontal axis. The IndexInitiator should be *NumberTargetProximityDomain. If I am wrong, = please feel free to point out. > + // Display the latency/bandwidth matrix as a matrix > + UnicodeSPrint ( > + Buffer, > + sizeof (Buffer), > + SecondBuffer, > + L"" > + ); > + PrintFieldName (4, Buffer); > + Print (L"\n\n Initiator ->\nTarget\n|\nV\n"); As mentioned above, the Initiator and Target should be exchanged. > + Print (L" |"); > + > + for (IndexTarget =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + Print (L" %2d", IndexTarget); > + } > + > + Print (L"\n---+"); > + for (IndexTarget =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + Print (L"-------"); > + } > + Print (L"\n"); > + > + for (IndexInitiator =3D 0; > + IndexInitiator < *NumberInitiatorProximityDomain; > + IndexInitiator++) { > + Print (L"%2d |", IndexInitiator); > + for (IndexTarget =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + Print ( > + L" %5d", > + LatencyBandwidthMatrix[IndexInitiator * > + (*NumberTargetProximityDomain + IndexT= arget)] Incorrect index value for the array. It should be "IndexInitiator * (*Numb= erTargetProximityDomain) + IndexTarget". > + ); > + } // for Target > + Print (L"\n"); > + } // for Initiator > + Print (L"\n"); > + } else { > + // Display the latency/bandwidth matrix as a list > + UnicodeSPrint ( > + Buffer, > + sizeof (Buffer), > + SecondBuffer, > + L" [%d][%d]" > + ); > + for (IndexInitiator =3D 0; > + IndexInitiator < *NumberInitiatorProximityDomain; > + IndexInitiator++) { > + for (IndexTarget =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + UnicodeSPrint ( > + Buffer, > + sizeof (Buffer), > + SecondBuffer, > + IndexInitiator, > + IndexTarget > + ); > + > + PrintFieldName (4, Buffer); > + Print ( > + L"%d\n", > + LatencyBandwidthMatrix[IndexInitiator * > + (*NumberTargetProximityDomain + IndexT= arget)] > + ); > + } // for Target > + } // for Initiator > + } > +} > + > +/** > + This function parses the Memory Side Cache Information Structure (Typ= e 2). > + > + @param [in] Ptr Pointer to the start of the Memory Side Cache Inf= ormation > + Structure data. > + @param [in] Length Length of the Memory Side Cache Information Struc= ture. > +**/ > +STATIC > +VOID > +DumpMsci ( > + IN UINT8* Ptr, > + IN UINT8 Length > + ) > +{ > + CONST UINT16* SMBIOSHandlesList; > + CHAR16 Buffer[OUTPUT_FIELD_COLUMN_WIDTH]; > + UINT32 Offset; > + UINT16 Index; > + > + Offset =3D 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 =3D=3D NULL) { > + IncrementErrorCount (); > + Print ( > + L"ERROR: Insufficient remaining table buffer length to read the "= \ > + L"MSCI structure header. Length =3D %d.\n", > + Length > + ); > + return; > + } > + > + if ((*NumberSMBIOSHandles * sizeof (UINT16)) > (Length - Offset)) { > + IncrementErrorCount (); > + Print ( > + L"ERROR: Invalid Number of SMBIOS Handles. SMBIOSHandlesCount =3D= %d." > \ > + L"RemainingBufferLength =3D %d.\n", > + *NumberSMBIOSHandles, > + Length - Offset > + ); > + return; > + } > + > + SMBIOSHandlesList =3D (UINT16*) (Ptr + Offset); > + > + for (Index =3D 0; Index < *NumberSMBIOSHandles; Index++) { > + UnicodeSPrint ( > + Buffer, > + sizeof (Buffer), > + L"SMBIOS Handles [%d]", > + Index > + ); > + > + PrintFieldName (4, Buffer); > + Print ( > + L"0x%x\n", > + SMBIOSHandlesList[Index] > + ); > + } > +} The three dump functions use UINT8 to transfer the length. It should be UI= NT32 refer to the caller and the usage in the function. > + > +/** > + 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 =3D ParseAcpi ( > + Trace, > + 0, > + "HMAT", > + Ptr, > + AcpiTableLength, > + PARSER_PARAMS (HmatParser) > + ); > + > + HmatStructurePtr =3D 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 =3D=3D NULL) || > + (HmatStructureLength =3D=3D NULL)) { > + IncrementErrorCount (); > + Print ( > + L"ERROR: Insufficient remaining table buffer length to read the= " \ > + L"HMAT structure header. Length =3D %d.\n", > + AcpiTableLength - Offset > + ); > + 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 =3D %d, Length =3D %d\n", > + *HmatStructureType, > + *HmatStructureLength > + ); > + } Redundant '{' and '}' for switch case and missing break for 'default'. Please test the patch before send to community. Thanks, Zhichao > + } > + > + HmatStructurePtr +=3D *HmatStructureLength; > + Offset +=3D *HmatStructureLength; > + } // while > +} > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.c > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.c > index > d2f26ff89f12e596702281c38ab0de3729aa68e4..c9e3054a5c413ba95e6420ce3d > 02f0d954e99d90 100644 > --- > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.c > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm > +++ andLib.c > @@ -1,7 +1,7 @@ > /** @file > Main file for 'acpiview' Shell command function. >=20 > - 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 **/ >=20 > @@ -53,6 +53,7 @@ ACPI_TABLE_PARSER ParserList[] =3D { > {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}, >=20 > {EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BA > SE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.inf > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.inf > index > 91459f9ec632635ee453c5ef46f67445cd9eee0c..e970c4259c143b5b06fb1a759d5 > 819e7cb93e749 100644 > --- > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.inf > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm > +++ andLib.inf > @@ -1,7 +1,7 @@ > ## @file > # Provides Shell 'acpiview' command functions # -# 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 # @@ -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/UefiShellAcpiViewCommandL= i > b.uni > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.uni > index > 7cd43d0518fd0a23dc547a5cab0d08b62602a113..6b0537b47a751184e8a68a653 > 0aa85eb28ea33ba 100644 > --- > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.uni > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm > +++ andLib.uni > @@ -1,6 +1,6 @@ > // /** > // > -// 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 // // 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)' >=20 >=20 >=20