From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mx.groups.io with SMTP id smtpd.web11.13676.1600224230237037543 for ; Tue, 15 Sep 2020 19:43:51 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=KQJe3/Ef; spf=pass (domain: intel.com, ip: 134.134.136.100, mailfrom: zhichao.gao@intel.com) IronPort-SDR: akA154/Opbp0ltWLIoUCb31wThR0099+bbGzKsimnlc0fzfpkiYxaMlSvARHvk9zDl+x/LJ9ld 8y7vuO+cz0WA== X-IronPort-AV: E=McAfee;i="6000,8403,9745"; a="223571951" X-IronPort-AV: E=Sophos;i="5.76,430,1592895600"; d="scan'208";a="223571951" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Sep 2020 19:43:49 -0700 IronPort-SDR: ua8+weaHzdl7AqHvJ5K9bEDgHZYzLVhEGDYGVOd5uuxmnlZdLSJUFxzuBn+x+h8VyyNFQ6PLZj YR89e2NOmzjw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,430,1592895600"; d="scan'208";a="346077939" Received: from fmsmsx606.amr.corp.intel.com ([10.18.126.86]) by orsmga007.jf.intel.com with ESMTP; 15 Sep 2020 19:43:49 -0700 Received: from fmsmsx606.amr.corp.intel.com (10.18.126.86) by fmsmsx606.amr.corp.intel.com (10.18.126.86) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Tue, 15 Sep 2020 19:43:48 -0700 Received: from fmsedg602.ED.cps.intel.com (10.1.192.136) by fmsmsx606.amr.corp.intel.com (10.18.126.86) 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, 15 Sep 2020 19:43:48 -0700 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (104.47.55.100) 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, 15 Sep 2020 19:43:48 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CAVjMCNdfi9dCWcPl6/T2nTI6XKtvG4d5Y2O2ss41IGjq+dIxGRfelfF4OWeWwOMMjoz4lhPtxDHo86ceEMMG7y1LAxyoT6+H+HS0TiOywkf365v/HC5fSQ7ZQPIE7+wFxuJWOmkTZU0+ukGbx2D0bsaZDVVdwUB6/6B4dXYoRtZ7i/1Gjp63TY2KkrTk6U5RkR2oSD0HdJCTqaOGUQS1OTvVA6TNZVJkjadWKjLeuPkIuUbsJum/AN9MPlpojvNp6uawCu5C+mKxKLfYnsAgTKomUDDeR422mtvYAX+v54K+bSR/j/v1NsZxj5c8D692FOMJ9s1LEV0P94n9kNaGA== 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=2Tnvfnfh9f4itWF9E39ewNxjHZPMM2E4S1FFCe8c/+E=; b=GvO/TaYJyO5zfC3qsvXfvZgtkY+4Qku1CI7H3SdX9v+k8LRg02JCveVI+n2AoTj1bvg6U8/ScMuLm+s/D7oIvoL1AXJpxc7Om8vK8IgHP9x+mxzdGt5Uc2XlHyq5N3d2xMp1XOhkC7hvsAF2TG9BruS/4vuRN4PrKhQqfqX2/n0kkf5uFcR1LYtmo4EHpSSO+G3Rqo9HGcmTUijLHlcGvvI562APXENQl47WWjERvGys2N5MsfJezHXADmRY0VHD2upxUph9sXABHZnX0h+PpVh+7hu28RurolEnaZ4dySjyCM/H42SKgrlnSbgcgYN+q3ZagxtwCBMs1Bwc5TKadQ== 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=2Tnvfnfh9f4itWF9E39ewNxjHZPMM2E4S1FFCe8c/+E=; b=KQJe3/Ef6AIi+oXQUANdyWpmdRmxC6UBsMbgjw5NEVWFpzFAQQcsPXIicVrYFoZ8xCFwSaUgf3gIBKRZDPyED582fahzKxyLVUjkl9zpQC6gWKycWWQcw8gBn9hRSmigcQFsGMOjMZ7DgJT77Ja964KxZQEAKCCXCp0xBylT+WY= Received: from DM6PR11MB4425.namprd11.prod.outlook.com (2603:10b6:5:1d9::31) by DM5PR11MB1834.namprd11.prod.outlook.com (2603:10b6:3:113::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3370.19; Wed, 16 Sep 2020 02:43:47 +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; Wed, 16 Sep 2020 02:43:47 +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 v1 1/1] ShellPkg/AcpiView: PCCT Parser Thread-Topic: [edk2-devel] [PATCH v1 1/1] ShellPkg/AcpiView: PCCT Parser Thread-Index: AQHWegCyO1Jy3CIG+kOJnzygkU+KW6lqqvUQ Date: Wed, 16 Sep 2020 02:43:47 +0000 Message-ID: References: <20200824102303.38968-1-sami.mujawar@arm.com> In-Reply-To: <20200824102303.38968-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.37] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 8b0973ca-4dbf-4e88-527e-08d859ea5613 x-ms-traffictypediagnostic: DM5PR11MB1834: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:10000; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: wMZ7ZdhG+9dQL6on+XuNQ4qP5SzatVtFEAkkh8UrD4tKZ4F9FDdHBrtZFDXyNO9yU9yrQjJZSsn1MUK8lM63TB/KAC5sMXpilKT6BB4EEuOf8Ybiy8HF3yS/HFyEJFVBNnJ1IM3loDmLSbLTdADCHIM94RsPzNH/WGs7CkQzHERxNIiXS170YUcdl9Z8wLbWVhjGdQlGJzgbkPITAAKqYoGk7fVmxJV5iiKezfXuZUWlcQzAR5aquOUJLLthWYBtb2UUqBq/d2J3lvvVeFWoVlxRsgJjD2ZOkAg/xBl5aPefvtW22DZqotzSa3otbW1KmODiyD4KD/7qg8l+cpXHm7Ehuu99Vfw+5fYo3G3+S55TPNyBpC/9tdNaT7/TG2C4g0ShVe8ay/OjgrKdzusbZw== 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)(376002)(366004)(346002)(396003)(39860400002)(136003)(55016002)(8676002)(966005)(4326008)(9686003)(110136005)(86362001)(54906003)(30864003)(33656002)(2906002)(7696005)(19627235002)(6506007)(52536014)(26005)(83380400001)(53546011)(316002)(186003)(8936002)(66476007)(71200400001)(66446008)(478600001)(5660300002)(64756008)(66946007)(66556008)(76116006)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: njcnRlZ2NykStXwWV+aDbQxlP6tIvx4iLLDUgmYxsxRW3EMghurWvd19Md3cRes2NlZ4EnbeoqdIFJGx4XOlsQDKacmVAIMZl7t/2yQ8gPR+hs8rfEGawA7w8ZbwrdTVqlWh6IhigJxDHeKSpN5ItjfdJ/fXpgLjcKIdB41yd1je760SiZf4wrNvlQkeVROEa95eOIXygEYsa1iez53R1krPAyYo8RoWhSJhgSoTLXo5KXXmL7lq8riXgt+cjave5gSLNJm1ygDUIXdLM9MLMLpdce2StYBt0NfLsSPrkPaTL+oyzH+I2FrEDDtS3Nqnz0zy6bEZ5/ej+DCMN3PbkCrxE5F4IwAJqrcN4lnR2Zx0Ock6E2mK0UMqJkstln6xySZXBY8XIP4z6l0sjUEZNFuODBpE2WdyLXe4FW+q3E48uxMp74WB2LJbkmlBh9o8dcmHelxFHZdc4ibCb4FMXNfkp4mro1K14RBrGusfJJ75kGN4NnmDvIK05zs7BZkd8V+oNWfEC8rvMFwvcZ1wqjB1rkW7o1uawKhCMUblnZVN5XH9WSPu1QajaHKEOR6hAw2GYLonAcWn9R8pAK4SPLcmhpP/kfK5D0C77fpReDoIVArkT4XgIHc/LWLK6rG+LZn10UUQo4cdoM9M2au+0g== 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: 8b0973ca-4dbf-4e88-527e-08d859ea5613 X-MS-Exchange-CrossTenant-originalarrivaltime: 16 Sep 2020 02:43:47.3821 (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: PQGou3J8qfyJPmDMNXLOWvYuH1yyRjb/wQg6wbpVgJKlcwq4NUgWda8nCCCQd/QfE239PS2UrZ9qWmKP8xwBRw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR11MB1834 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, Sorry for the delay review. Please see below. > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Sami > Mujawar > Sent: Monday, August 24, 2020 6:23 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 v1 1/1] ShellPkg/AcpiView: PCCT Parser >=20 > From: Marc Moisson-Franckhauser >=20 > Create a new parser for the PCCT Table. >=20 > The PCCT Table is used to describe how the OSPM can communicate with ent= ities > outside the platform. It describes which memory spaces correspond to whi= ch > entity as well as a few of the needed information to handle the communic= ations. >=20 > This new PCCT parser dumps the values and names of the table fields. It = also > performs some validation on the table's fields. >=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/840_pcct_parser_v1 >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h = | 24 +- > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h = | 4 > +- > ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c = | > 494 ++++++++++++++++++++ > ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.h = | > 33 ++ >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib= .c > | 4 +- >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib= .i > nf | 4 +- > 6 files changed, 558 insertions(+), 5 deletions(-) >=20 > diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > index > f81ccac7e118378aa185db4b625e5bcd75f78347..051fdf807abb1067a264c136364 > bb6d145b38dab 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 > @@ -671,6 +671,28 @@ ParseAcpiMcfg ( > ); >=20 > /** > + This function parses the ACPI PCCT table including its sub-structures > + of type 0 through 4. > + When trace is enabled this function parses the PCCT table and traces > + the ACPI table fields. > + > + 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 > +ParseAcpiPcct ( > + IN BOOLEAN Trace, > + IN UINT8* Ptr, > + IN UINT32 AcpiTableLength, > + IN UINT8 AcpiTableRevision > + ); > + > +/** > This function parses the ACPI PPTT table. > When trace is enabled this function parses the PPTT table and > traces the ACPI table fields. > diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParse= r.h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h > index > 4f92596b90a6ee422d8d0959881015ffd3de4da0..19265d0b763f8a810759a2cef0 > 9ce2cc2d7bec03 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 - 2020, 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 17 >=20 > /** An invalid/NULL signature value. > */ > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..526cb7b79aa7aa6eee098246 > 00b6c7eac0ab67e2 > --- /dev/null > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctPars > +++ er.c > @@ -0,0 +1,494 @@ > +/** @file > + PCCT table parser > + > + Copyright (c) 2020, Arm Limited. > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > + @par Reference(s): > + - ACPI 6.3 Specification - January 2019 **/ > + > +#include > +#include > +#include "AcpiParser.h" > +#include "AcpiView.h" > +#include "AcpiViewConfig.h" > +#include "PcctParser.h" > + > +// Local variables > +STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo; > + > +STATIC UINT8* PccSubspaceLength; > +STATIC UINT8* PccSubspaceType; > + > +/** > + This function validates the length coded on 4 bytes of a shared > +memory range > + > + @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 > +ValidateRangeLength4 ( > + IN UINT8* Ptr, > + IN VOID* Context > + ) > +{ > + if (*(UINT32*)Ptr < MIN_EXT_PCC_SUBSPACE_MEM_RANGE_LEN) { > + IncrementErrorCount (); > + Print ( > + L"\nError: Shared memory range length is too short.\n" > + L"Length is %u when it should be greater than or equal to %u", > + *(UINT32*)Ptr, > + MIN_EXT_PCC_SUBSPACE_MEM_RANGE_LEN > + ); > + } > +} > + > +/** > + This function validates the length coded on 8 bytes of a shared > +memory range > + > + @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 > +ValidateRangeLength8 ( > + IN UINT8* Ptr, > + IN VOID* Context > + ) > +{ > + if (*(UINT64*)Ptr <=3D MIN_MEMORY_RANGE_LENGTH) { > + IncrementErrorCount (); > + Print ( > + L"\nError: Shared memory range length is too short.\n" > + L"Length is %u when it should be greater than %u", > + *(UINT64*)Ptr, > + MIN_MEMORY_RANGE_LENGTH > + ); > + } > +} > + > +/** > + This function validates address space for type 0 structure. > + > + @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 > +ValidatePccType0Gas ( > + IN UINT8* Ptr, > + IN VOID* Context > + ) > +{ > + switch (*(UINT8*)Ptr) { > +#if !(defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) > + case EFI_ACPI_6_3_SYSTEM_IO: > +#endif //if not (defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) Why doesn't ARM arch need this check? Is there any doc that descripts this= ? Just curious. > + case EFI_ACPI_6_3_SYSTEM_MEMORY: > + return; > + default: > + IncrementErrorCount (); > + Print (L"\nError: Invalid address space"); > + } > +} > + > +/** > + This function validates address space for structures of types other t= han 0. > + > + @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 > +ValidatePccGas ( > + IN UINT8* Ptr, > + IN VOID* Context > + ) > +{ > + switch (*(UINT8*)Ptr) { > +#if !(defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) > + case EFI_ACPI_6_3_SYSTEM_IO: > +#endif //if not (defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) > + case EFI_ACPI_6_3_FUNCTIONAL_FIXED_HARDWARE: > + case EFI_ACPI_6_3_SYSTEM_MEMORY: > + return; > + default: > + IncrementErrorCount (); > + Print (L"\nError: Invalid address space"); > + } > +} This function is used for subspace type1, 2, 3 and 4. But refer the ACPI 6= .3, the field for type4 is optional. If it is not supported, the field woul= d be filled with 0x0 value. So I think we should put the type into consider= ation. > + > +/** > + An ACPI_PARSER array describing the ACPI PCCT Table. > +*/ > +STATIC CONST ACPI_PARSER PcctParser[] =3D { > + PARSE_ACPI_HEADER (&AcpiHdrInfo), > + {L"Flags", 4, 36, NULL, NULL, NULL, NULL, NULL}, > + {L"Reserved", 8, 40, NULL, NULL, NULL, NULL, NULL} }; > + > +/** > + An ACPI_PARSER array describing the platform communications channel > +subspace > + structure header. > +*/ > +STATIC CONST ACPI_PARSER PccSubspaceHeaderParser[] =3D { > + PCC_SUBSPACE_HEADER () > + // ... Type Specific Fields ... > +}; > + > +/** > + An ACPI_PARSER array describing the Generic Communications Subspace - > +Type 0 */ STATIC CONST ACPI_PARSER PccSubspaceType0Parser[] =3D { > + PCC_SUBSPACE_HEADER (), > + {L"Reserved", 6, 2, L"%x %x %x %x %x %x", Dump6Chars, NULL, NULL, > +NULL}, > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Memory Range Length", 8, 16, L"0x%lx", NULL, NULL, > ValidateRangeLength8, > + NULL}, > + {L"Doorbell Register", 12, 24, NULL, DumpGas, NULL, ValidatePccType0G= as, > + NULL}, > + {L"Doorbell Preserve", 8, 36, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Doorbell Write", 8, 44, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Nominal Latency", 4, 52, L"%u", NULL, NULL, NULL, NULL}, > + {L"Maximum Periodic Access Rate", 4, 56, L"%u", NULL, NULL, NULL, > +NULL}, > + {L"Minimum Request Turnaround Time", 2, 60, L"%u", NULL, NULL, NULL, > +NULL} }; > + > +/** > + An ACPI_PARSER array describing the HW-Reduced Communications > +Subspace > + - Type 1 > +*/ > +STATIC CONST ACPI_PARSER PccSubspaceType1Parser[] =3D { > + PCC_SUBSPACE_HEADER (), > + {L"Platform Interrupt", 4, 2, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Platform Interrupt Flags", 1, 6, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Reserved", 1, 7, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Memory Range Length", 8, 16, L"0x%lx", NULL, NULL, > ValidateRangeLength8, > + NULL}, > + {L"Doorbell Register", 12, 24, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Doorbell Preserve", 8, 36, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Doorbell Write", 8, 44, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Nominal Latency", 4, 52, L"%u", NULL, NULL, NULL, NULL}, > + {L"Maximum Periodic Access Rate", 4, 56, L"%u", NULL, NULL, NULL, > +NULL}, > + {L"Minimum Request Turnaround Time", 2, 60, L"%u", NULL, NULL, NULL, > +NULL} }; > + > +/** > + An ACPI_PARSER array describing the HW-Reduced Communications > +Subspace > + - Type 2 > +*/ > +STATIC CONST ACPI_PARSER PccSubspaceType2Parser[] =3D { > + PCC_SUBSPACE_HEADER (), > + {L"Platform Interrupt", 4, 2, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Platform Interrupt Flags", 1, 6, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Reserved", 1, 7, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Memory Range Length", 8, 16, L"0x%lx", NULL, NULL, > ValidateRangeLength8, > + NULL}, > + {L"Doorbell Register", 12, 24, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Doorbell Preserve", 8, 36, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Doorbell Write", 8, 44, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Nominal Latency", 4, 52, L"%u", NULL, NULL, NULL, NULL}, > + {L"Maximum Periodic Access Rate", 4, 56, L"%u", NULL, NULL, NULL, > +NULL}, > + {L"Minimum Request Turnaround Time", 2, 60, L"%u", NULL, NULL, NULL, > +NULL}, > + {L"Platform Interrupt Ack Register", 12, 62, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Platform Interrupt Ack Preserve", 8, 74, L"0x%lx", NULL, NULL, > +NULL, NULL}, > + {L"Platform Interrupt Ack Write", 8, 82, L"0x%lx", NULL, NULL, > + NULL, NULL}, > +}; > + > +/** > + An ACPI_PARSER array describing the Extended PCC Subspaces - Type 3/4 > +*/ STATIC CONST ACPI_PARSER PccSubspaceType3Parser[] =3D { > + PCC_SUBSPACE_HEADER (), > + {L"Platform Interrupt", 4, 2, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Platform Interrupt Flags", 1, 6, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Reserved", 1, 7, L"0x%x", NULL, NULL, NULL, NULL}, > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, The offset definition in APCI 6.3 Table 14-368 is different. Seems it is a= spec mistake. Others are OK to me. Thanks, Zhichao > + {L"Memory Range Length", 4, 16, L"0x%x", NULL, NULL, > ValidateRangeLength4, > + NULL}, > + {L"Doorbell Register", 12, 20, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Doorbell Preserve", 8, 32, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Doorbell Write", 8, 40, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Nominal Latency", 4, 48, L"%u", NULL, NULL, NULL, NULL}, > + {L"Maximum Periodic Access Rate", 4, 52, L"%u", NULL, NULL, NULL, > +NULL}, > + {L"Minimum Request Turnaround Time", 4, 56, L"%u", NULL, NULL, NULL, > +NULL}, > + {L"Platform Interrupt Ack Register", 12, 60, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Platform Interrupt Ack Preserve", 8, 72, L"0x%lx", NULL, NULL, > +NULL, NULL}, > + {L"Platform Interrupt Ack Set", 8, 80, L"0x%lx", NULL, NULL, NULL, > +NULL}, > + {L"Reserved", 8, 88, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Cmd Complete Check Reg Addr", 12, 96, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Cmd Complete Check Mask", 8, 108, L"0x%lx", NULL, NULL, NULL, > +NULL}, > + {L"Cmd Update Reg Addr", 12, 116, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Cmd Update Preserve mask", 8, 128, L"0x%lx", NULL, NULL, NULL, > +NULL}, > + {L"Cmd Update Set mask", 8, 136, L"0x%lx", NULL, NULL, NULL, NULL}, > + {L"Error Status Register", 12, 144, NULL, DumpGas, NULL, > + ValidatePccGas, NULL}, > + {L"Error Status Mask", 8, 156, L"0x%lx", NULL, NULL, NULL, NULL}, }; > + > +/** > + This function parses the PCC Subspace type 0. > + > + @param [in] Ptr Pointer to the start of Subspace Structure. > + @param [in] Length Length of the Subspace Structure. > +**/ > +STATIC > +VOID > +DumpPccSubspaceType0 ( > + IN UINT8* Ptr, > + IN UINT8 Length > + ) > +{ > + ParseAcpi ( > + TRUE, > + 2, > + "Subspace Type 0", > + Ptr, > + Length, > + PARSER_PARAMS (PccSubspaceType0Parser) > + ); > +} > + > +/** > + This function parses the PCC Subspace type 1. > + > + @param [in] Ptr Pointer to the start of the Subspace Structure. > + @param [in] Length Length of the Subspace Structure. > +**/ > +STATIC > +VOID > +DumpPccSubspaceType1 ( > + IN UINT8* Ptr, > + IN UINT8 Length > + ) > +{ > + ParseAcpi ( > + TRUE, > + 2, > + "Subspace Type 1", > + Ptr, > + Length, > + PARSER_PARAMS (PccSubspaceType1Parser) > + ); > +} > + > +/** > + This function parses the PCC Subspace type 2. > + > + @param [in] Ptr Pointer to the start of the Subspace Structure. > + @param [in] Length Length of the Subspace Structure. > +**/ > +STATIC > +VOID > +DumpPccSubspaceType2 ( > + IN UINT8* Ptr, > + IN UINT8 Length > + ) > +{ > + ParseAcpi ( > + TRUE, > + 2, > + "Subspace Type 2", > + Ptr, > + Length, > + PARSER_PARAMS (PccSubspaceType2Parser) > + ); > +} > + > +/** > + This function parses the PCC Subspace type 3. > + > + @param [in] Ptr Pointer to the start of the Subspace Structure. > + @param [in] Length Length of the Subspace Structure. > +**/ > +STATIC > +VOID > +DumpPccSubspaceType3 ( > + IN UINT8* Ptr, > + IN UINT8 Length > + ) > +{ > + ParseAcpi ( > + TRUE, > + 2, > + "Subspace Type 3", > + Ptr, > + Length, > + PARSER_PARAMS (PccSubspaceType3Parser) > + ); > +} > + > +/** > + This function parses the PCC Subspace type 4. > + > + @param [in] Ptr Pointer to the start of the Subspace Structure. > + @param [in] Length Length of the Subspace Structure. > +**/ > +STATIC > +VOID > +DumpPccSubspaceType4 ( > + IN UINT8* Ptr, > + IN UINT8 Length > + ) > +{ > + ParseAcpi ( > + TRUE, > + 2, > + "Subspace Type 4", > + Ptr, > + Length, > + PARSER_PARAMS (PccSubspaceType3Parser) > + ); > +} > + > +/** > + This function parses the ACPI PCCT table including its sub-structures > + of type 0 through 4. > + When trace is enabled this function parses the PCCT table and > + traces the ACPI table fields. > + > + 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 > +ParseAcpiPcct ( > + IN BOOLEAN Trace, > + IN UINT8* Ptr, > + IN UINT32 AcpiTableLength, > + IN UINT8 AcpiTableRevision > + ) > +{ > + UINT32 Offset; > + UINT8* PccSubspacePtr; > + UINTN SubspaceCount; > + > + if (!Trace) { > + return; > + } > + > + Offset =3D ParseAcpi ( > + TRUE, > + 0, > + "PCCT", > + Ptr, > + AcpiTableLength, > + PARSER_PARAMS (PcctParser) > + ); > + > + PccSubspacePtr =3D Ptr + Offset; > + > + SubspaceCount =3D 0; > + while (Offset < AcpiTableLength) { > + // Parse common structure header to obtain Type and Length. > + ParseAcpi ( > + FALSE, > + 0, > + NULL, > + PccSubspacePtr, > + AcpiTableLength - Offset, > + PARSER_PARAMS (PccSubspaceHeaderParser) > + ); > + > + // Check if the values used to control the parsing logic have been > + // successfully read. > + if ((PccSubspaceType =3D=3D NULL) || > + (PccSubspaceLength =3D=3D NULL)) { > + IncrementErrorCount (); > + Print ( > + L"ERROR: Insufficient remaining table buffer length to read the= " \ > + L"structure header. Length =3D %u.\n", > + AcpiTableLength - Offset > + ); > + return; > + } > + > + // Validate Structure length > + if ((*PccSubspaceLength =3D=3D 0) || > + ((Offset + (*PccSubspaceLength)) > AcpiTableLength)) { > + IncrementErrorCount (); > + Print ( > + L"ERROR: Invalid Structure length. " \ > + L"Length =3D %u. Offset =3D %u. AcpiTableLength =3D %u.\n", > + *PccSubspaceLength, > + Offset, > + AcpiTableLength > + ); > + return; > + } > + > + switch (*PccSubspaceType) { > + case EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_GENERIC: > + DumpPccSubspaceType0 ( > + PccSubspacePtr, > + *PccSubspaceLength > + ); > + break; > + case > EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_1_HW_REDUCED_COMMUNICATIONS: > + DumpPccSubspaceType1 ( > + PccSubspacePtr, > + *PccSubspaceLength > + ); > + break; > + case > EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_2_HW_REDUCED_COMMUNICATIONS: > + DumpPccSubspaceType2 ( > + PccSubspacePtr, > + *PccSubspaceLength > + ); > + break; > + case EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_3_EXTENDED_PCC: > + DumpPccSubspaceType3 ( > + PccSubspacePtr, > + *PccSubspaceLength > + ); > + break; > + case EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC: > + DumpPccSubspaceType4 ( > + PccSubspacePtr, > + *PccSubspaceLength > + ); > + break; > + default: > + IncrementErrorCount (); > + Print ( > + L"ERROR: Unknown PCC subspace structure:" > + L" Type =3D %u, Length =3D %u\n", > + PccSubspaceType, > + *PccSubspaceLength > + ); > + } > + > + PccSubspacePtr +=3D *PccSubspaceLength; > + Offset +=3D *PccSubspaceLength; > + SubspaceCount++; > + } // while > + > + if (SubspaceCount > MAX_PCC_SUBSPACES) { > + IncrementErrorCount (); > + Print (L"ERROR: Too many PCC subspaces."); > + } > +} > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.h > new file mode 100644 > index > 0000000000000000000000000000000000000000..278dc83c5de8860cbb2b1e2b2 > e277aa7c6c58698 > --- /dev/null > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctPars > +++ er.h > @@ -0,0 +1,33 @@ > +/** @file > + Header file for PCCT parser > + > + Copyright (c) 2020, Arm Limited. > + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > + > +#ifndef PCCT_PARSER_H_ > +#define PCCT_PARSER_H_ > + > +/** > + Minimum value for the 'length' field in subspaces of types 0, 1 and 2= . > +*/ > +#define MIN_MEMORY_RANGE_LENGTH 8 > + > +/** > + Minimum value for the 'length' field in subspaces of types 3 and 4. > +*/ > +#define MIN_EXT_PCC_SUBSPACE_MEM_RANGE_LEN 16 > + > +/** > + Maximum number of PCC subspaces. > +*/ > +#define MAX_PCC_SUBSPACES 256 > + > +/** > + Parser for the header of any type of PCC subspace. > +*/ > +#define PCC_SUBSPACE_HEADER() = \ > + {L"Type", 1, 0, L"0x%x", NULL, (VOID**)&PccSubspaceType, NULL, NULL},= \ > + {L"Length", 1, 1, L"%u", NULL, (VOID**)&PccSubspaceLength, NULL, > +NULL} > + > +#endif // PCCT_PARSER_H_ > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.c > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.c > index > d2f26ff89f12e596702281c38ab0de3729aa68e4..feb80661cddc420670edb2d8c7a > 570b0a89272d8 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 > @@ -57,6 +57,8 @@ ACPI_TABLE_PARSER ParserList[] =3D { > {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, > ParseAcpiMcfg}, > + > {EFI_ACPI_6_2_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE, > + ParseAcpiPcct}, >=20 > {EFI_ACPI_6_2_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGN > ATURE, > ParseAcpiPptt}, > {RSDP_TABLE_INFO, ParseAcpiRsdp}, > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.inf > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandL= i > b.inf > index > 91459f9ec632635ee453c5ef46f67445cd9eee0c..efa9c8784a6670e5a4f500e0ae5 > 59a4938852f95 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 # @@ -37,6 +37,8 @@ > [Sources.common] > Parsers/Madt/MadtParser.c > Parsers/Madt/MadtParser.h > Parsers/Mcfg/McfgParser.c > + Parsers/Pcct/PcctParser.c > + Parsers/Pcct/PcctParser.h > Parsers/Pptt/PpttParser.c > Parsers/Pptt/PpttParser.h > Parsers/Rsdp/RsdpParser.c > -- > 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' >=20 >=20 >=20