From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mx.groups.io with SMTP id smtpd.web10.1597.1602639836029191799 for ; Tue, 13 Oct 2020 18:43:56 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=zznHn+iJ; spf=pass (domain: intel.com, ip: 192.55.52.120, mailfrom: zhichao.gao@intel.com) IronPort-SDR: EnhDv3QHc2JeWV1JHvizFpAZPWC2E9VcDnss6l8VzEcoHd1KBR5DIsRlsqAMYdttn8g/ic26Tl BGap/sb52B+A== X-IronPort-AV: E=McAfee;i="6000,8403,9773"; a="163380253" X-IronPort-AV: E=Sophos;i="5.77,373,1596524400"; d="scan'208";a="163380253" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Oct 2020 18:43:54 -0700 IronPort-SDR: CvZ8QY5EpOYdrXzykd3jCpQ4Dz4SlngA+tOfoXOjwJWyBIPS2iGhFj7gFqMptY1hiuDl8jDGhI WFYzn52jldpw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,373,1596524400"; d="scan'208";a="356464618" Received: from fmsmsx604.amr.corp.intel.com ([10.18.126.84]) by FMSMGA003.fm.intel.com with ESMTP; 13 Oct 2020 18:43:53 -0700 Received: from fmsmsx612.amr.corp.intel.com (10.18.126.92) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Tue, 13 Oct 2020 18:43:52 -0700 Received: from fmsmsx609.amr.corp.intel.com (10.18.126.89) by fmsmsx612.amr.corp.intel.com (10.18.126.92) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Tue, 13 Oct 2020 18:43:51 -0700 Received: from fmsedg602.ED.cps.intel.com (10.1.192.136) by fmsmsx609.amr.corp.intel.com (10.18.126.89) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5 via Frontend Transport; Tue, 13 Oct 2020 18:43:51 -0700 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (104.47.70.108) by edgegateway.intel.com (192.55.55.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.1713.5; Tue, 13 Oct 2020 18:43:50 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iRbUDs+jpIzmZmnyw6JcmSbHvEwQH5FWlk/p5VgqCTOAkMVCgtL2SmUUXsFeUBWtGNxqprV6bj3vlnrPS96TGdlTTWuqAo6T+pmzafhDFLr52a06DvSyPK49Xf0wY0x9/WxFqy966q8hrd0jU/7vsSIcXAX1Hj31+FX7zN5Nm5wrolsXuEhB42toc7E7en2SHn6/RGmodItmpntS9pglC5BoJmL64m5cJGMR/oNW8rvpX0n9CKhe8ODLGc/UvNb0DrQiQ/rVohw19jtpJRpAuDu+Vr0jCMhA8vmh+0IBVDw4T1N0wtvzVj0OhAaPjBkvnYICp1K1PR1yTp7AzKNCyA== 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=5+uA/FmwkbITlKTeGMTS2cngShADSPDEIKby6KURFo4=; b=htyXhX++tmWT48rZf5laqAju1pOF8zkojwWb8CTe+m5YKnuN7WwCAiHtoKhnGKuODD0fxCBkKttDXnQbifeeSfhSGDD7Ta0jP5wTZ1pge/MlDVnWK9ewq7E/5wHwhcbqPAici277RTFn9jT0qlFn8AWJX/wMAUTg76I87090AVD748co93D3nylCGOeUyO9uprfk6RkjdPjZYeoQZsApNpTfFOGJ8SXf+1lFTySs1sJKVJrtCS1FceI9M599Y82SexO74Dwfmpf6HMiLRW2cLe+Flm/t2IQcjKuBQFEaV3hOtHGY4RLUF5p8fksPB5+m0o4JG6MFXzY4HOIWIvl5yw== 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=5+uA/FmwkbITlKTeGMTS2cngShADSPDEIKby6KURFo4=; b=zznHn+iJvKCMi8fnpZQe8R2aWySp310nbWk4m3F/uNouAAdprtUeVUnifgGmBRdZ5cG4zP4606aZAoGcc+kCCg4ZTUjklrUz6mmM10/ZWi9w7uNm6vOa/Tl66RK2yVKpkO85Hmq9Ipel0pS9NiZagzDAGo9byssY8P+R6nt8V8s= Received: from MWHPR11MB1647.namprd11.prod.outlook.com (2603:10b6:301:d::12) by MWHPR11MB1359.namprd11.prod.outlook.com (2603:10b6:300:20::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3477.21; Wed, 14 Oct 2020 01:43:48 +0000 Received: from MWHPR11MB1647.namprd11.prod.outlook.com ([fe80::b96a:621b:54b6:c8ea]) by MWHPR11MB1647.namprd11.prod.outlook.com ([fe80::b96a:621b:54b6:c8ea%8]) with mapi id 15.20.3455.031; Wed, 14 Oct 2020 01:43:48 +0000 From: "Gao, Zhichao" To: "devel@edk2.groups.io" , "sami.mujawar@arm.com" CC: "Ni, Ray" , "Matteo.Carlini@arm.com" , "Ben.Adderson@arm.com" , "nd@arm.com" Subject: Re: [edk2-devel] [PATCH v3 1/1] ShellPkg/AcpiView: HMAT Parser Thread-Topic: [edk2-devel] [PATCH v3 1/1] ShellPkg/AcpiView: HMAT Parser Thread-Index: AQHWkQqp1ZvUkX/bxEOYHmTbTPsIqqmWc+uA Date: Wed, 14 Oct 2020 01:43:47 +0000 Message-ID: References: <20200922180125.50448-1-sami.mujawar@arm.com> In-Reply-To: <20200922180125.50448-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.102.204.38] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 992e247f-83d0-493e-0534-08d86fe2983c x-ms-traffictypediagnostic: MWHPR11MB1359: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:4941; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: JGYnYyuJPaWBDHVxIfy8gx9lyVrt3q13j0WPDh5jvLPH6r3RvcgMfEX4mstsQroanXcP4Gnhdi0LRZrQPbV/Z+3GhtIWfKlL3p8LS0UqGGeIO56St/2ujPSTuj15WbhVSBwa5fFFT3PwHTBlK0/InsZXAEOjAVRII/t+Qlx49s8zIshf4IZ590adIKQ2P1RYcN+8rsVXxZgad9dmqdDyHoMjKErwjBDkZUoPdwmDZdT1RnoXs7bwkrI9qdGHolXggFiEwaVyPhA7k0obQxVbtCP/WdQ4V82ISmxw5klb+v7fxAK3HVGK1meLt4JpW6EX0xznOMgruwhAK9DVcwqQoIj44QZVgdUOoxw9+IeMixE18Oleqisf9gBtGp9QuwyF+FFZ7yMxcwTSthwsGlpiLg== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR11MB1647.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(39860400002)(136003)(346002)(396003)(376002)(8676002)(54906003)(478600001)(30864003)(316002)(6506007)(9686003)(110136005)(53546011)(5660300002)(45954011)(8936002)(4326008)(71200400001)(7696005)(966005)(52536014)(66556008)(66446008)(76116006)(64756008)(66476007)(2906002)(66946007)(86362001)(33656002)(55016002)(83380400001)(186003)(26005)(83080400001)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: 6U+vlZ/ImlQk2+jlW5jQmlf3rzLLHzRRQrHpsKee8C8YEa+ZRLaC2dU6RheZi4VNM5v7v/2+WATPOaWi3MPe491qHjB2mPiLu0EZ3TtdfzGq5K2cNeYCT6yNf20ttaFtEYzkEjRA3tnXeT59qKmqq+TocKtlWmWDYqBhTsBqRWpegZ/Gc+5nAgmsEQlsg/dbzK+7mAKqp0k/XdJbkQQP3HpAjBAYXbVdWvdZVOAKHd0YRC8vzhOHIYTa1vcKro87YRK5c33ZO0aexNrPuYFdUL4+QyJidO53YPB19oKo5Se+AxeTQa6ofGgXxJBmCQWBkJlCVJkZVU7Ht+0BEccNT+BpZbf+gxhMFcMFMw24XXnDFN2v8HVAlvf1T54J/wizCCB7xzy7jNrUnd+vLkzXjNy4KFE3beFWxUb0mvjtZJd4VtqI3wej6EvIfPSjxE1eExWB24Vb6ICcNM0zHgdQ6v5rx88rzNM1cS+qqqo21AcFQOp9aXwqmpT0wW5vE0ixvNYO1eyGk+BZW2dlOii9XeUGXJaS8mip/FepNvw4HuPWac8GNddPIL9C6OVcYpeAge5eLxbMquA5Kk1YTknbCiP0bg2TTS4J6Jb6vINYf2ypXQ0JTlPUJHnIT05ULd/oonkgKfqIk0C40SejW3K1BA== MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MWHPR11MB1647.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 992e247f-83d0-493e-0534-08d86fe2983c X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Oct 2020 01:43:47.8828 (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: WDFQJqlLMH2xIO3IHLR31p4CS630e2mRAG6/8llwFXgPadWDZbcGRMe5+UMPvNJmXTAxybRWs1gZMfo2A07Yxg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1359 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 The patch looks good to me. Before take my R-B, have you tested the patch. = It is better to get another Tested-by. By the way, it is highly recommended to add one BZ to descript the change = and keep a good history. Thanks, Zhichao > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Sami > Mujawar > Sent: Wednesday, September 23, 2020 2:01 AM > To: devel@edk2.groups.io > Cc: Sami Mujawar ; Ni, Ray ; Gao= , > Zhichao ; Matteo.Carlini@arm.com; > Ben.Adderson@arm.com; nd@arm.com > Subject: [edk2-devel] [PATCH v3 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_v3 >=20 > Notes: > v3: > - Updates based on review comments, minor updates to output [SAM= I] > formatting and added additional checks. >=20 > 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 > | 650 ++++++++++++++++++++ >=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, 685 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..4cbbb64bc7d97b9896269ca18 > 2a7cf4916a0a43e > --- /dev/null > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Hmat/HmatPars > +++ er.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 > +#include > +#include > +#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_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 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 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 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 =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; > + > + } // switch > + > + if (*NumberTargetProximityDomain <=3D > 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 =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + Print (L" %2d", IndexTarget); > + } > + > + Print (L"\n ---+"); > + for (IndexTarget =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + Print (L"------"); > + } > + Print (L"\n"); > + > + TargetStartOffset =3D 0; > + for (IndexInitiator =3D 0; > + IndexInitiator < *NumberInitiatorProximityDomain; > + IndexInitiator++) { > + Print (L" %2d |", IndexInitiator); > + for (IndexTarget =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + Print ( > + L" %5d", > + LatencyBandwidthMatrix[TargetStartOffset + IndexTarget] > + ); > + } // for Target > + Print (L"\n"); > + TargetStartOffset +=3D (*NumberTargetProximityDomain); > + } // for Initiator > + Print (L"\n"); > + } else { > + // Display the latency/bandwidth matrix as a list > + UnicodeSPrint ( > + Buffer, > + sizeof (Buffer), > + SecondBuffer, > + L" [%d][%d]" > + ); > + > + TargetStartOffset =3D 0; > + for (IndexInitiator =3D 0; > + IndexInitiator < *NumberInitiatorProximityDomain; > + IndexInitiator++) { > + for (IndexTarget =3D 0; > + IndexTarget < *NumberTargetProximityDomain; > + IndexTarget++) { > + UnicodeSPrint ( > + SecondBuffer, > + sizeof (SecondBuffer), > + Buffer, > + IndexInitiator, > + IndexTarget > + ); > + > + PrintFieldName (4, SecondBuffer); > + Print ( > + L"%d\n", > + LatencyBandwidthMatrix[TargetStartOffset + IndexTarget] > + ); > + } // for Target > + TargetStartOffset +=3D (*NumberTargetProximityDomain); > + } // 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 UINT32 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] > + ); > + } > +} > + > +/** > + 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; > + } > + > + // Validate HMAT Structure length. > + if ((*HmatStructureLength =3D=3D 0) || > + ((Offset + (*HmatStructureLength)) > AcpiTableLength)) { > + IncrementErrorCount (); > + Print ( > + L"ERROR: Invalid HMAT Structure length. " \ > + L"Length =3D %d. Offset =3D %d. AcpiTableLength =3D %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 =3D %d, Length =3D %d\n", > + *HmatStructureType, > + *HmatStructureLength > + ); > + break; > + } // switch > + > + 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 >=20 >=20