From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (EUR05-DB8-obe.outbound.protection.outlook.com [40.107.20.83]) by mx.groups.io with SMTP id smtpd.web10.11507.1663254919553859347 for ; Thu, 15 Sep 2022 08:15:20 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=aMn8ma0K; spf=pass (domain: arm.com, ip: 40.107.20.83, mailfrom: sami.mujawar@arm.com) ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=inzsKj1JcSwGMdgNqGqqr57Rhl8QklgSmrqF8d2iJDygU7zXYaCJmj3J4vT9Jn45bfACNCyKdBhZ7R5dkHtl5kZ1Ts9HDU4dCge87q9kgAw4s3Qa0rdYjkH23eWwRwfxU6jXEU4M9cS+63Aee6sV06dXFi5qO+I9vw3gB/XSudIsKx+N11bBYbix3un5RRvUQlzJtXsfs15m6ZvuOG0WIITSrq9TCBzwPQYpYWuUqGSdYCkwaB3SgMEi7bmDOJGf2tgJHT79YTWcGrANJXPXWL1Hp7p/Jjk1fiDTGr9R6LHLN/uIX1O9/PMeLjkKL4qasHqrqXvrjXGfaAJ9Z7RKUA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZKrA+j/rf24IzrfD6EQ60+zUXaRDTUtc9NOzxoULBhk=; b=Or7TP6jS/5Vjql+SBne64DH3yJO9CvFLVK/zPj2+i2X9Y6CaU3V0MJd942VTUJj1CV65FBntU/PAVaeOsdvvqlumboLaUdpPt0a9fDyiMUnrgRfAmsWeV36iC4YEwJHsjGFSBORuPhlBqlCpqIMKBTJS1QRSg8QWrwASEapQLrA1Am+/rBIEsO4a7PxuT0FAPvswU94YX3zHZG0IYSXYi9rQmMuAJryOdOoBRT4LTA5SlFqBRtOCmbAztgJJFeXZehNos/QnJ3HlTek9prCxrelH8Y3mTtoUV4vGTzpIVuG4EjxQvJdm5hNvVJm4hGFB7xaAWJz1ygEmC0fgo/4qIQ== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZKrA+j/rf24IzrfD6EQ60+zUXaRDTUtc9NOzxoULBhk=; b=aMn8ma0KV02sSrCdPfzB0Yiv45pBv/apRtSTAuF4S1YqaHNcpit69h2C/zXkeDGHzoROz0Kk63ayd8gbcYJWQdewdsDKa5gd+u/4drEdkVxEqIZXnPrzXs9VaOsp35xc4nKLKp5zdSt26jTS7eJZ1230YZTqdV0aNQq+C35l7NE= Received: from AM5PR0701CA0008.eurprd07.prod.outlook.com (2603:10a6:203:51::18) by AS2PR08MB9738.eurprd08.prod.outlook.com (2603:10a6:20b:606::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5632.14; Thu, 15 Sep 2022 15:15:06 +0000 Received: from AM7EUR03FT040.eop-EUR03.prod.protection.outlook.com (2603:10a6:203:51:cafe::db) by AM5PR0701CA0008.outlook.office365.com (2603:10a6:203:51::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.6 via Frontend Transport; Thu, 15 Sep 2022 15:15:06 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM7EUR03FT040.mail.protection.outlook.com (100.127.140.128) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5632.12 via Frontend Transport; Thu, 15 Sep 2022 15:15:05 +0000 Received: ("Tessian outbound 9236804a5e9b:v124"); Thu, 15 Sep 2022 15:15:05 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: b1ec74d9f255bf03 X-CR-MTA-TID: 64aa7808 Received: from 1123bffe3ac5.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 1181DB08-271F-4A05-B91A-F0F9D19FAF12.1; Thu, 15 Sep 2022 15:14:55 +0000 Received: from EUR04-DB3-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 1123bffe3ac5.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 15 Sep 2022 15:14:55 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k3/KpaqYaAiPi5nbHHYn9kNsjc5Z3KJ7fsGSUigFTAnFpFEcaIfntsZsjPcqrr+G9Y2sb18Sr6xnfeQ8dWEOeXa2nU/xWlzfCHfMeIJH+FsErW/rxW6e685AlnOHr2UkvkZR0bxQD/PXusrCbglhGxhPf/3YYxS+jnUh+TLtf8z0U3AhWobGYtwx7FSnqVQis7ZyanSwcM0oANegyw0nLBJvlNNeB1PXnFRogkbpM6xGoSm0KYnNDbTDhUesTLJC4wW3Kx3bkMtoPDcVtpHUqq/NuuPe38Rk7YNNXTNODniXLF/hsbe4kVwQ4o3YJhOqavGrG8Gpn0vnPYf7A4pCgg== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZKrA+j/rf24IzrfD6EQ60+zUXaRDTUtc9NOzxoULBhk=; b=C5qBKgqpdHZjS+/HN9B7DNJ8nc61yUK/jeTmXPcaE2St9MkJiaZTKeDcTR4wWkmkAL+41TeAPMYk72wW6ldrseCBI+1WPiAfviv991Ik2s0fDvs1IcoO9HmiNCKGZnqOUDwdIcv7BYrmSYVBWkMukPCa8jhdsSCVgFtnV6NMvBuTBcAdmaALMWXn3jF9sCuWDYbSkRBdYAL72jS6IxOMfQv689BBhUM0GjYPvAN++2Bg2PJuAYGlWTkLfnVJMUef1jPt1vciE0UpVEU8frQ9wv2CtkxznsdV14ar/P7lJ+MiPekv7iZyEZ3lq1oJK3gRD+TqnhDLpGWTIwmqxx0CEw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZKrA+j/rf24IzrfD6EQ60+zUXaRDTUtc9NOzxoULBhk=; b=aMn8ma0KV02sSrCdPfzB0Yiv45pBv/apRtSTAuF4S1YqaHNcpit69h2C/zXkeDGHzoROz0Kk63ayd8gbcYJWQdewdsDKa5gd+u/4drEdkVxEqIZXnPrzXs9VaOsp35xc4nKLKp5zdSt26jTS7eJZ1230YZTqdV0aNQq+C35l7NE= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) by DB9PR08MB8204.eurprd08.prod.outlook.com (2603:10a6:10:39f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.14; Thu, 15 Sep 2022 15:14:53 +0000 Received: from AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::b480:677a:ac9b:8f24]) by AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::b480:677a:ac9b:8f24%7]) with mapi id 15.20.5612.022; Thu, 15 Sep 2022 15:14:53 +0000 Message-ID: Date: Thu, 15 Sep 2022 16:14:51 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.2.2 Subject: Re: [PATCH v3 1/3] DynamicTablesPkg: Add CM_ARM_CPC_INFO object To: Jeff Brasen , devel@edk2.groups.io Cc: ardb+tianocore@kernel.org, Alexei.Fedorov@arm.com, pierre.gondois@arm.com, "nd@arm.com" References: From: "Sami Mujawar" In-Reply-To: X-ClientProxiedBy: LO2P265CA0423.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a0::27) To AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR08MB6806:EE_|DB9PR08MB8204:EE_|AM7EUR03FT040:EE_|AS2PR08MB9738:EE_ X-MS-Office365-Filtering-Correlation-Id: 5399e0eb-c668-4d71-0ad4-08da972d122f X-LD-Processed: f34e5979-57d9-4aaa-ad4d-b122a662184d,ExtAddr x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: LYMPQBsK35Tu0omLDytUuDYcKk2Yx2SQDQzBnvcNFJuOFEY4VzgPvF11deVm8zG6tdZbvlxc9o3BnqEgTJZyDb4l7m5WbCctcWF0QKrLnYuTGblbKoZwc3vEN3cpfaKnTRhw4Mfzsi64WxnTXzVTPSp+TgKoknxYOoJs3H2IAIPWXOxNq+BT1Vkc4naCbWCHef7PgG62q3UBM1EIYJM6BkJWfUtZk/Rik8pynk3TqSsWu9ivVxeqPIfXxz/kPVfq/rxvDpY5cu4M1K+NBdIL4pjzAyCvRneYi4tNiOA1E9d5Lnhjjqxfj8WpayC+63KrnYZEu/9qI6nQlzBiB88iEfxlTlHTKi4udGWADEpKtZWKTE29gnmEE5SVyljI9UWl/8jUb35KldeND7JUJpn+4C/k1nmNpWk2pUWf4150h2eq33B9DgsVTd1KRRwxktD8lHgotT9oghJrpNUjUExybEFNrFCP/RgpMb8SN5h9VeMllMft9T70MOfMflTrqR5V+HLW80ixx4jvIA/AjkqkCJ7bc6sGoDc1huijUgAx/U5pBQilGxGvLd8xFB6aHKtsUYrUqJ6g8qG6S60O1DfXwjgZb83sFXUraUYRHl9Jap+dZhQbRxdj9QoVyGly0/NQoxMTuNJxHC+MLLsxk3D5LJIgwNM4qjKOrGwy4BKeMMmyHdWT3zm6fPmPbazwZlLiT26CMGgD6kmFhkxRm4MPTY0OUzPdzU8D6i4fAMsPZIAQe863x5OjD7qm5owUgv7nUOO9CBM+NMFJ8Cn5mkdax72Hdm4BrUocmP6JUIz6V3U= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR08MB6806.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(376002)(39860400002)(136003)(396003)(366004)(346002)(451199015)(31686004)(36756003)(33964004)(6486002)(316002)(186003)(38100700002)(53546011)(44832011)(41300700001)(478600001)(31696002)(8676002)(6512007)(2616005)(66476007)(6506007)(26005)(30864003)(4326008)(66946007)(2906002)(66556008)(8936002)(83380400001)(86362001)(5660300002)(45980500001)(43740500002)(579004);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB8204 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Return-Path: Sami.Mujawar@arm.com X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM7EUR03FT040.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 777aee59-1304-47cc-e7b6-08da972d0a77 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: J2w1o4+O8gMtreQVP9T2emTEfMQSiFf1Xe8LHOisPrqvqLemwJFR0cfvCBS/WIAH33Av8CXnoWElWjKfU9tXO7FBB2rgSQqH2CnF3rcQ3/AFRtFaAA8HkEwQ5fXL8QUEEA3uqGlZGZwlGtHP7iuPtQer2KTMWK+oMGw5UdlT8mW7pxMQgeaEl2lEf4USS/YgD0fzJYuIC5ZbSC+dnvknksvLbdZUw4ZQHEBc0yRt9ZXp1W3pEVpMXdy+70Y2dU99xzUuRfPdOEO3XxkmKLi3UWQdfOxYQpJECpbyBnV1QUWXWOPvVgAcAWX5NwaTfVEDAt4XjK6vnRKO6jNJ73jdAMY6iRO7Pbab5J2KHIZB3R0g/gRdmTxwG5W1SZCOLbzEdxYS5xlzRN+GlkiIm4oLuv27r1+tKl3FMhqHpiI2bX9Gk91S2GsLS92hLgFdvq1yKMMv1f61SbCQdYBOTFY1f1+P2/gw7qJ0ZnNfFVG9CBWEl0uXTdUQtFpOYJLCpvETfznaPzeAMBhZgAcG2W01GqhvDZtNZRHz/Nq6StReac95SV4ytuFD1tB+uGzmhfizQqWGg5hqXKGDTuyt9cMIcPyulEIYHoyoleZ0Rbcv1DSNHElPLfKklZWjPAjz38TENkOFdS/AYRJ8rj7DHY5ilTm+C7A2gpxJiQp6Ul+XmAW0IAA2kxxnbkW8CfoJlhgEf90h4MzXuBZUsuJMhthrkhS86zIsC1U8o0YyrZy5D96zXxIPRpwXNGH80X4zDxm7aA4qnM9T5NUN5txWvJy9OMlG9qW46/0sETje7VYLdVs2bCT4i7AzVmw3UupUf95f X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230022)(4636009)(396003)(346002)(136003)(39860400002)(376002)(451199015)(46966006)(36840700001)(40470700004)(40480700001)(26005)(53546011)(33964004)(6512007)(6506007)(41300700001)(316002)(478600001)(6486002)(36756003)(36860700001)(82740400003)(40460700003)(81166007)(336012)(47076005)(186003)(2616005)(356005)(31696002)(86362001)(82310400005)(83380400001)(31686004)(44832011)(5660300002)(30864003)(8936002)(70206006)(8676002)(2906002)(70586007)(4326008)(43740500002)(579004);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Sep 2022 15:15:05.9960 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5399e0eb-c668-4d71-0ad4-08da972d122f X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM7EUR03FT040.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS2PR08MB9738 Content-Type: multipart/alternative; boundary="------------ZnB5mHjZassJiJ8OIx6eZnZZ" --------------ZnB5mHjZassJiJ8OIx6eZnZZ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Jeff, Please find my feedback inline marked [SAMI]. Regards, Sami Mujawar On 15/09/2022 02:10 pm, Jeff Brasen wrote: > Introduce the CM_ARM_CPC_INFO CmObj in the ArmNameSpaceObjects. > > This allows to describe CPC information, as described in ACPI 6.4, > > s8.4.7.1 "_CPC (Continuous Performance Control)". > > > > Signed-off-by: Jeff Brasen > > --- > > .../Include/ArmNameSpaceObjects.h | 148 ++++++++++++++++-- > > .../ConfigurationManagerObjectParser.c | 80 ++++++++++ > > 2 files changed, 211 insertions(+), 17 deletions(-) > > > > diff --git a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h > > index 102e0f96be..d76cc08e14 100644 > > --- a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h > > +++ b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h > > @@ -63,6 +63,7 @@ typedef enum ArmObjectID { > > EArmObjPciInterruptMapInfo, ///< 39 - Pci Interrupt Map Info > > EArmObjRmr, ///< 40 - Reserved Memory Range Node > > EArmObjMemoryRangeDescriptor, ///< 41 - Memory Range Descriptor > > + EArmObjCpcInfo, ///< 42 - Continuous Performance Control Info > > EArmObjMax > > } EARM_OBJECT_ID; > > > > @@ -97,99 +98,105 @@ typedef struct CmArmPowerManagementProfileInfo { > > */ > > typedef struct CmArmGicCInfo { > > /// The GIC CPU Interface number. > > - UINT32 CPUInterfaceNumber; > > + UINT32 CPUInterfaceNumber; > > > > /** The ACPI Processor UID. This must match the > > _UID of the CPU Device object information described > > in the DSDT/SSDT for the CPU. > > */ > > - UINT32 AcpiProcessorUid; > > + UINT32 AcpiProcessorUid; > > > > /** The flags field as described by the GICC structure > > in the ACPI Specification. > > */ > > - UINT32 Flags; > > + UINT32 Flags; > > > > /** The parking protocol version field as described by > > the GICC structure in the ACPI Specification. > > */ > > - UINT32 ParkingProtocolVersion; > > + UINT32 ParkingProtocolVersion; > > > > /** The Performance Interrupt field as described by > > the GICC structure in the ACPI Specification. > > */ > > - UINT32 PerformanceInterruptGsiv; > > + UINT32 PerformanceInterruptGsiv; > > > > /** The CPU Parked address field as described by > > the GICC structure in the ACPI Specification. > > */ > > - UINT64 ParkedAddress; > > + UINT64 ParkedAddress; > > > > /** The base address for the GIC CPU Interface > > as described by the GICC structure in the > > ACPI Specification. > > */ > > - UINT64 PhysicalBaseAddress; > > + UINT64 PhysicalBaseAddress; > > > > /** The base address for GICV interface > > as described by the GICC structure in the > > ACPI Specification. > > */ > > - UINT64 GICV; > > + UINT64 GICV; > > > > /** The base address for GICH interface > > as described by the GICC structure in the > > ACPI Specification. > > */ > > - UINT64 GICH; > > + UINT64 GICH; > > > > /** The GICV maintenance interrupt > > as described by the GICC structure in the > > ACPI Specification. > > */ > > - UINT32 VGICMaintenanceInterrupt; > > + UINT32 VGICMaintenanceInterrupt; > > > > /** The base address for GICR interface > > as described by the GICC structure in the > > ACPI Specification. > > */ > > - UINT64 GICRBaseAddress; > > + UINT64 GICRBaseAddress; > > > > /** The MPIDR for the CPU > > as described by the GICC structure in the > > ACPI Specification. > > */ > > - UINT64 MPIDR; > > + UINT64 MPIDR; > > > > /** The Processor Power Efficiency class > > as described by the GICC structure in the > > ACPI Specification. > > */ > > - UINT8 ProcessorPowerEfficiencyClass; > > + UINT8 ProcessorPowerEfficiencyClass; > > > > /** Statistical Profiling Extension buffer overflow GSIV. Zero if > > unsupported by this processor. This field was introduced in > > ACPI 6.3 (MADT revision 5) and is therefore ignored when > > generating MADT revision 4 or lower. > > */ > > - UINT16 SpeOverflowInterrupt; > > + UINT16 SpeOverflowInterrupt; > > > > /** The proximity domain to which the logical processor belongs. > > This field is used to populate the GICC affinity structure > > in the SRAT table. > > */ > > - UINT32 ProximityDomain; > > + UINT32 ProximityDomain; > > > > /** The clock domain to which the logical processor belongs. > > This field is used to populate the GICC affinity structure > > in the SRAT table. > > */ > > - UINT32 ClockDomain; > > + UINT32 ClockDomain; > > > > /** The GICC Affinity flags field as described by the GICC Affinity structure > > in the SRAT table. > > */ > > - UINT32 AffinityFlags; > > + UINT32 AffinityFlags; > > + > > + /** Optional field: Reference Token for the Cpc info of this processor. > > + Token identifying a CM_ARM_OBJ_REF structure, itself referencing > > + CM_ARM_CPC_INFO objects. > > + */ > > + CM_OBJECT_TOKEN CpcToken; > > } CM_ARM_GICC_INFO; > > > > /** A structure that describes the > > @@ -1070,6 +1077,113 @@ typedef struct CmArmRmrDescriptor { > > UINT64 Length; > > } CM_ARM_MEMORY_RANGE_DESCRIPTOR; > > > > +/** A structure that describes the Cpc information. > > + > > + Continuous Performance Control is described in DSDT/SSDT and associated > > + to cpus/clusters in the cpu topology. > > + > > + Unsupported Optional registers should be encoded with NULL resource > > + Register {(SystemMemory, 0, 0, 0, 0)} > > + > > + For values that support Integer or Buffer, integer will be used > > + if buffer is NULL resource. > > + If resource is not NULL then Integer must be 0 > > + > > + Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control) > > + > > + ID: EArmObjCpcInfo > > +*/ > > +typedef struct CmArmCpcInfo { > > + /// The revision number of the _CPC package format. > > + UINT32 Revision; > > + > > + /// Indicates the highest level of performance the processor > > + /// is theoretically capable of achieving. > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE HighestPerformanceBuffer; > > + UINT32 HighestPerformanceInteger; > > + > > + /// Indicates the highest sustained performance level of the processor. > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE NominalPerformanceBuffer; > > + UINT32 NominalPerformanceInteger; > > + > > + /// Indicates the lowest performance level of the processor with non-linear power savings. > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE LowestNonlinearPerformanceBuffer; > > + UINT32 LowestNonlinearPerformanceInteger; > > + > > + /// Indicates the lowest performance level of the processor.. > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE LowestPerformanceBuffer; > > + UINT32 LowestPerformanceInteger; > > + > > + /// Guaranteed Performance Register Buffer. > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE GuaranteedPerformanceRegister; > > + > > + /// Desired Performance Register Buffer. > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE DesiredPerformanceRegister; > > + > > + /// Minimum Performance Register Buffer. > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE MinimumPerformanceRegister; > > + > > + /// Maximum Performance Register Buffer. > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE MaximumPerformanceRegister; > > + > > + /// Performance Reduction Tolerance Register. > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE PerformanceReductionToleranceRegister; > > + > > + /// Time Window Register. > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE TimeWindowRegister; > > + > > + /// Counter Wraparound Time > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE CounterWraparoundTimeBuffer; > > + UINT32 CounterWraparoundTimeInteger; > > + > > + /// Reference Performance Counter Register > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE ReferencePerformanceCounterRegister; > > + > > + /// Delivered Performance Counter Register > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE DeliveredPerformanceCounterRegister; > > + > > + /// Performance Limited Register > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE PerformanceLimitedRegister; > > + > > + /// CPPC EnableRegister > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE CPPCEnableRegister; > > + > > + /// Autonomous Selection Enable > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE AutonomousSelectionEnableBuffer; > > + UINT32 AutonomousSelectionEnableInteger; > > + > > + /// AutonomousActivity-WindowRegister > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE AutonomousActivityWindowRegister; > > + > > + /// EnergyPerformance-PreferenceRegister > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE EnergyPerformancePreferenceRegister; > > + > > + /// Reference Performance > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE ReferencePerformanceBuffer; > > + UINT32 ReferencePerformanceInteger; > > + > > + /// Lowest Frequency > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE LowestFrequencyBuffer; > > + UINT32 LowestFrequencyInteger; > > + > > + /// Nominal Frequency > > + /// Optional > > + EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE NominalFrequencyBuffer; > > + UINT32 NominalFrequencyInteger; > > +} CM_ARM_CPC_INFO; [SAMI] I think the number of parameters to AmlCreateCpcNode () can be reduced if we pass the CPC information using a structure. For this I think we can do the following 1. Create a new file called DynamicTablesPkg/Include/Library/AmlCpcInfo.h 2. AmlCpcInfo.h shall define a structure as below /** A structure that describes the Cpc information.   Continuous Performance Control is described in DSDT/SSDT and associated   to cpus/clusters in the cpu topology.   Unsupported Optional registers should be encoded with NULL resource   Register {(SystemMemory, 0, 0, 0, 0)}   For values that support Integer or Buffer, integer will be used   if buffer is NULL resource.   If resource is not NULL then Integer must be 0   Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control) */    typedef struct AmlCpcInfo {    // Copy all the contents of the CM_ARM_CPC_INFO structure above.   } AML_CPC_INFO; 3. In DynamicTablesPkg\Include\ArmNameSpaceObjects.h       #include and replace the definition for CM_ARM_CPC_INFO as /** A structure that describes the Cpc information.   Continuous Performance Control is described in DSDT/SSDT and associated   to cpus/clusters in the cpu topology.   Unsupported Optional registers should be encoded with NULL resource   Register {(SystemMemory, 0, 0, 0, 0)}   For values that support Integer or Buffer, integer will be used   if buffer is NULL resource.   If resource is not NULL then Integer must be 0   Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control) ID:EArmObjCpcInfo */ typedefAML_CPC_INFO CM_ARM_CPC_INFO; [/SAMI] > > + > > #pragma pack() > > > > #endif // ARM_NAMESPACE_OBJECTS_H_ > > diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c > > index c1b21d24a4..c7e0d51397 100644 > > --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c > > +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c > > @@ -423,6 +423,84 @@ STATIC CONST CM_OBJ_PARSER CmPciInterruptMapInfoParser[] = { > > ARRAY_SIZE (CmArmGenericInterruptParser) }, > > }; > > > > +/** A parser for EArmObjCpcInfo. > > +*/ > > +STATIC CONST CM_OBJ_PARSER CmArmCpcInfoParser[] = { > > + { "Revision", 4, "0x%llx", NULL }, [SAMI] I believe the format specifiers need to be updated to "0x%x" as the field width is 32 bits. > > + { "HighestPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "HighestPerformanceInteger", 4, "0x%llx", NULL }, > > + { "NominalPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "NominalPerformanceInteger", 4, "0x%llx", NULL }, > > + { "LowestNonlinearPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "LowestNonlinearPerformanceInteger", 4, "0x%llx", NULL }, > > + { "LowestPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "LowestPerformanceInteger", 4, "0x%llx", NULL }, > > + { "GuaranteedPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "DesiredPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "MinimumPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "MaximumPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "PerformanceReductionToleranceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "TimeWindowRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "CounterWraparoundTimeBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "CounterWraparoundTimeInteger", 4, "0x%llx", NULL }, > > + { "ReferencePerformanceCounterRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "DeliveredPerformanceCounterRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "PerformanceLimitedRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "CPPCEnableRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "AutonomousSelectionEnableBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "AutonomousSelectionEnableInteger", 4, "0x%llx", NULL }, > > + { "AutonomousActivityWindowRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "EnergyPerformancePreferenceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "ReferencePerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "ReferencePerformanceInteger", 4, "0x%llx", NULL }, > > + { "LowestFrequencyBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "LowestFrequencyInteger", 4, "0x%llx", NULL }, > > + { "NominalFrequencyBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), > > + NULL, NULL, AcpiGenericAddressParser, > > + ARRAY_SIZE (AcpiGenericAddressParser) }, > > + { "NominalFrequencyInteger", 4, "0x%llx", NULL }, > > +}; > > + > > /** A parser for Arm namespace objects. > > */ > > STATIC CONST CM_OBJ_PARSER_ARRAY ArmNamespaceObjectParser[] = { > > @@ -501,6 +579,8 @@ STATIC CONST CM_OBJ_PARSER_ARRAY ArmNamespaceObjectParser[] = { > > ARRAY_SIZE (CmArmPciAddressMapInfoParser) }, > > { "EArmObjPciInterruptMapInfo", CmPciInterruptMapInfoParser, > > ARRAY_SIZE (CmPciInterruptMapInfoParser) }, > > + { "EArmObjCpcInfo", CmArmCpcInfoParser, > > + ARRAY_SIZE (CmArmCpcInfoParser) }, > > { "EArmObjMax", NULL, 0 }, > > }; > > > --------------ZnB5mHjZassJiJ8OIx6eZnZZ Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi Jeff,

Please find my feedback inline marked [SAMI].

Regards,

Sami Mujawar

On 15/09/2022 02:10 pm, Jeff Brasen wrote:
Introduce the CM_ARM_CPC_INFO CmObj in the ArmNameSpaceObjects.

This allows to describe CPC information, as described in ACPI 6.4,

s8.4.7.1 "_CPC (Continuous Performance Control)".



Signed-off-by: Jeff Brasen <jbrasen@nvidia.com>

---

 .../Include/ArmNameSpaceObjects.h             | 148 ++++++++++++++++--

 .../ConfigurationManagerObjectParser.c        |  80 ++++++++++

 2 files changed, 211 insertions(+), 17 deletions(-)



diff --git a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h

index 102e0f96be..d76cc08e14 100644

--- a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h

+++ b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h

@@ -63,6 +63,7 @@ typedef enum ArmObjectID {

   EArmObjPciInterruptMapInfo,          ///< 39 - Pci Interrupt Map Info

   EArmObjRmr,                          ///< 40 - Reserved Memory Range Node

   EArmObjMemoryRangeDescriptor,        ///< 41 - Memory Range Descriptor

+  EArmObjCpcInfo,                      ///< 42 - Continuous Performance Control Info

   EArmObjMax

 } EARM_OBJECT_ID;

 

@@ -97,99 +98,105 @@ typedef struct CmArmPowerManagementProfileInfo {

 */

 typedef struct CmArmGicCInfo {

   /// The GIC CPU Interface number.

-  UINT32    CPUInterfaceNumber;

+  UINT32             CPUInterfaceNumber;

 

   /** The ACPI Processor UID. This must match the

       _UID of the CPU Device object information described

       in the DSDT/SSDT for the CPU.

   */

-  UINT32    AcpiProcessorUid;

+  UINT32             AcpiProcessorUid;

 

   /** The flags field as described by the GICC structure

       in the ACPI Specification.

   */

-  UINT32    Flags;

+  UINT32             Flags;

 

   /** The parking protocol version field as described by

     the GICC structure in the ACPI Specification.

   */

-  UINT32    ParkingProtocolVersion;

+  UINT32             ParkingProtocolVersion;

 

   /** The Performance Interrupt field as described by

       the GICC structure in the ACPI Specification.

   */

-  UINT32    PerformanceInterruptGsiv;

+  UINT32             PerformanceInterruptGsiv;

 

   /** The CPU Parked address field as described by

       the GICC structure in the ACPI Specification.

   */

-  UINT64    ParkedAddress;

+  UINT64             ParkedAddress;

 

   /** The base address for the GIC CPU Interface

       as described by the GICC structure in the

       ACPI Specification.

   */

-  UINT64    PhysicalBaseAddress;

+  UINT64             PhysicalBaseAddress;

 

   /** The base address for GICV interface

       as described by the GICC structure in the

       ACPI Specification.

   */

-  UINT64    GICV;

+  UINT64             GICV;

 

   /** The base address for GICH interface

       as described by the GICC structure in the

       ACPI Specification.

   */

-  UINT64    GICH;

+  UINT64             GICH;

 

   /** The GICV maintenance interrupt

       as described by the GICC structure in the

       ACPI Specification.

   */

-  UINT32    VGICMaintenanceInterrupt;

+  UINT32             VGICMaintenanceInterrupt;

 

   /** The base address for GICR interface

       as described by the GICC structure in the

       ACPI Specification.

   */

-  UINT64    GICRBaseAddress;

+  UINT64             GICRBaseAddress;

 

   /** The MPIDR for the CPU

       as described by the GICC structure in the

       ACPI Specification.

   */

-  UINT64    MPIDR;

+  UINT64             MPIDR;

 

   /** The Processor Power Efficiency class

       as described by the GICC structure in the

       ACPI Specification.

   */

-  UINT8     ProcessorPowerEfficiencyClass;

+  UINT8              ProcessorPowerEfficiencyClass;

 

   /** Statistical Profiling Extension buffer overflow GSIV. Zero if

       unsupported by this processor. This field was introduced in

       ACPI 6.3 (MADT revision 5) and is therefore ignored when

       generating MADT revision 4 or lower.

   */

-  UINT16    SpeOverflowInterrupt;

+  UINT16             SpeOverflowInterrupt;

 

   /** The proximity domain to which the logical processor belongs.

       This field is used to populate the GICC affinity structure

       in the SRAT table.

   */

-  UINT32    ProximityDomain;

+  UINT32             ProximityDomain;

 

   /** The clock domain to which the logical processor belongs.

       This field is used to populate the GICC affinity structure

       in the SRAT table.

   */

-  UINT32    ClockDomain;

+  UINT32             ClockDomain;

 

   /** The GICC Affinity flags field as described by the GICC Affinity structure

       in the SRAT table.

   */

-  UINT32    AffinityFlags;

+  UINT32             AffinityFlags;

+

+  /** Optional field: Reference Token for the Cpc info of this processor.

+      Token identifying a CM_ARM_OBJ_REF structure, itself referencing

+      CM_ARM_CPC_INFO objects.

+  */

+  CM_OBJECT_TOKEN    CpcToken;

 } CM_ARM_GICC_INFO;

 

 /** A structure that describes the

@@ -1070,6 +1077,113 @@ typedef struct CmArmRmrDescriptor {

   UINT64    Length;

 } CM_ARM_MEMORY_RANGE_DESCRIPTOR;

 

+/** A structure that describes the Cpc information.

+

+  Continuous Performance Control is described in DSDT/SSDT and associated

+  to cpus/clusters in the cpu topology.

+

+  Unsupported Optional registers should be encoded with NULL resource

+  Register {(SystemMemory, 0, 0, 0, 0)}

+

+  For values that support Integer or Buffer, integer will be used

+  if buffer is NULL resource.

+  If resource is not NULL then Integer must be 0

+

+  Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control)

+

+  ID: EArmObjCpcInfo

+*/

+typedef struct CmArmCpcInfo {

+  /// The revision number of the _CPC package format.

+  UINT32                                    Revision;

+

+  /// Indicates the highest level of performance the processor

+  /// is theoretically capable of achieving.

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    HighestPerformanceBuffer;

+  UINT32                                    HighestPerformanceInteger;

+

+  /// Indicates the highest sustained performance level of the processor.

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    NominalPerformanceBuffer;

+  UINT32                                    NominalPerformanceInteger;

+

+  /// Indicates the lowest performance level of the processor with non-linear power savings.

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    LowestNonlinearPerformanceBuffer;

+  UINT32                                    LowestNonlinearPerformanceInteger;

+

+  /// Indicates the lowest performance level of the processor..

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    LowestPerformanceBuffer;

+  UINT32                                    LowestPerformanceInteger;

+

+  /// Guaranteed Performance Register Buffer.

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    GuaranteedPerformanceRegister;

+

+  /// Desired Performance Register Buffer.

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    DesiredPerformanceRegister;

+

+  /// Minimum Performance Register Buffer.

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    MinimumPerformanceRegister;

+

+  /// Maximum Performance Register Buffer.

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    MaximumPerformanceRegister;

+

+  /// Performance Reduction Tolerance Register.

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    PerformanceReductionToleranceRegister;

+

+  /// Time Window Register.

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    TimeWindowRegister;

+

+  /// Counter Wraparound Time

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    CounterWraparoundTimeBuffer;

+  UINT32                                    CounterWraparoundTimeInteger;

+

+  /// Reference Performance Counter Register

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    ReferencePerformanceCounterRegister;

+

+  /// Delivered Performance Counter Register

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    DeliveredPerformanceCounterRegister;

+

+  /// Performance Limited Register

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    PerformanceLimitedRegister;

+

+  /// CPPC EnableRegister

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    CPPCEnableRegister;

+

+  /// Autonomous Selection Enable

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    AutonomousSelectionEnableBuffer;

+  UINT32                                    AutonomousSelectionEnableInteger;

+

+  /// AutonomousActivity-WindowRegister

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    AutonomousActivityWindowRegister;

+

+  /// EnergyPerformance-PreferenceRegister

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    EnergyPerformancePreferenceRegister;

+

+  /// Reference Performance

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    ReferencePerformanceBuffer;

+  UINT32                                    ReferencePerformanceInteger;

+

+  /// Lowest Frequency

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    LowestFrequencyBuffer;

+  UINT32                                    LowestFrequencyInteger;

+

+  /// Nominal Frequency

+  /// Optional

+  EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE    NominalFrequencyBuffer;

+  UINT32                                    NominalFrequencyInteger;

+} CM_ARM_CPC_INFO;

[SAMI] I think the number of parameters to AmlCreateCpcNode () can be reduced if we pass the CPC information using a structure. For this I think we can do the following

1. Create a new file called DynamicTablesPkg/Include/Library/AmlCpcInfo.h

2. AmlCpcInfo.h shall define a structure as below

   /** A structure that describes the Cpc information.

  Continuous Performance Control is described in DSDT/SSDT and associated
  to cpus/clusters in the cpu topology.
  Unsupported Optional registers should be encoded with NULL resource
  Register {(SystemMemory, 0, 0, 0, 0)}
  For values that support Integer or Buffer, integer will be used
  if buffer is NULL resource.
  If resource is not NULL then Integer must be 0
  Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control)
*/

   typedef struct AmlCpcInfo {

   // Copy all the contents of the CM_ARM_CPC_INFO structure above.

  } AML_CPC_INFO;

3. In DynamicTablesPkg\Include\ArmNameSpaceObjects.h

      #include <Library/AmlCpcInfo.h>

and replace the definition for CM_ARM_CPC_INFO as

   /** A structure that describes the Cpc information.

  Continuous Performance Control is described in DSDT/SSDT and associated
  to cpus/clusters in the cpu topology.
  Unsupported Optional registers should be encoded with NULL resource
  Register {(SystemMemory, 0, 0, 0, 0)}
  For values that support Integer or Buffer, integer will be used
  if buffer is NULL resource.
  If resource is not NULL then Integer must be 0
  Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control)
  ID: EArmObjCpcInfo
*/
typedef AML_CPC_INFO CM_ARM_CPC_INFO;
[/SAMI]

+

 #pragma pack()

 

 #endif // ARM_NAMESPACE_OBJECTS_H_

diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c

index c1b21d24a4..c7e0d51397 100644

--- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c

+++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c

@@ -423,6 +423,84 @@ STATIC CONST CM_OBJ_PARSER  CmPciInterruptMapInfoParser[] = {

     ARRAY_SIZE (CmArmGenericInterruptParser) },

 };

 

+/** A parser for EArmObjCpcInfo.

+*/

+STATIC CONST CM_OBJ_PARSER  CmArmCpcInfoParser[] = {

+  { "Revision",                              4,                                               "0x%llx", NULL },
[SAMI] I believe the format specifiers need to be updated to "0x%x" as the field width is 32 bits.

+  { "HighestPerformanceBuffer",              sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "HighestPerformanceInteger",             4,                                               "0x%llx", NULL },

+  { "NominalPerformanceBuffer",              sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "NominalPerformanceInteger",             4,                                               "0x%llx", NULL },

+  { "LowestNonlinearPerformanceBuffer",      sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "LowestNonlinearPerformanceInteger",     4,                                               "0x%llx", NULL },

+  { "LowestPerformanceBuffer",               sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "LowestPerformanceInteger",              4,                                               "0x%llx", NULL },

+  { "GuaranteedPerformanceRegister",         sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "DesiredPerformanceRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "MinimumPerformanceRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "MaximumPerformanceRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "PerformanceReductionToleranceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "TimeWindowRegister",                    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "CounterWraparoundTimeBuffer",           sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "CounterWraparoundTimeInteger",          4,                                               "0x%llx", NULL },

+  { "ReferencePerformanceCounterRegister",   sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "DeliveredPerformanceCounterRegister",   sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "PerformanceLimitedRegister",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "CPPCEnableRegister",                    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "AutonomousSelectionEnableBuffer",       sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "AutonomousSelectionEnableInteger",      4,                                               "0x%llx", NULL },

+  { "AutonomousActivityWindowRegister",      sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "EnergyPerformancePreferenceRegister",   sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "ReferencePerformanceBuffer",            sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "ReferencePerformanceInteger",           4,                                               "0x%llx", NULL },

+  { "LowestFrequencyBuffer",                 sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "LowestFrequencyInteger",                4,                                               "0x%llx", NULL },

+  { "NominalFrequencyBuffer",                sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),

+    NULL, NULL, AcpiGenericAddressParser,

+    ARRAY_SIZE (AcpiGenericAddressParser) },

+  { "NominalFrequencyInteger",               4,                                               "0x%llx", NULL },

+};

+

 /** A parser for Arm namespace objects.

 */

 STATIC CONST CM_OBJ_PARSER_ARRAY  ArmNamespaceObjectParser[] = {

@@ -501,6 +579,8 @@ STATIC CONST CM_OBJ_PARSER_ARRAY  ArmNamespaceObjectParser[] = {

     ARRAY_SIZE (CmArmPciAddressMapInfoParser) },

   { "EArmObjPciInterruptMapInfo",          CmPciInterruptMapInfoParser,

     ARRAY_SIZE (CmPciInterruptMapInfoParser) },

+  { "EArmObjCpcInfo",                      CmArmCpcInfoParser,

+    ARRAY_SIZE (CmArmCpcInfoParser) },

   { "EArmObjMax",                          NULL,                                  0                                },

 };

 

--------------ZnB5mHjZassJiJ8OIx6eZnZZ--