From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (NAM10-DM6-obe.outbound.protection.outlook.com [40.107.93.133]) by mx.groups.io with SMTP id smtpd.web12.14738.1631120497342676203 for ; Wed, 08 Sep 2021 10:01:37 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@os.amperecomputing.com header.s=selector2 header.b=nFLOln/Y; spf=pass (domain: os.amperecomputing.com, ip: 40.107.93.133, mailfrom: nhi@os.amperecomputing.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nM+rwhWIETxNFVB/TT1h/v+hZNbndcH1m1k8oLvsa9EfGdWwAWGg4IPc5Z8vDNMgz13enTU5ijQxVHWaSl+z9/MvBOI60qRLlfwYCjG7Npi6NvVb4ngwxbPYXU86wR8ELEtjvewUAUOkwtJQ2GESWgDg9U8ZBvqe/bs6UCSSd8hVqNTNiJXk+PId6WuNgm6Ovv7YE04qxqf/KGLDp2k6ZiNCPu5vmS2IFAb+3a/u4JJgzybktSFO0hcmL+XGFYm+EowdavYJnAdXybAeR7cCD5zRAIwY0VNUecrC62mO6In+Qv1m/giINMBVHhmzgFOPq2xTWjHONsBtnvh1aJkvjA== 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; bh=ux2DKwn5qJnFZ+3TbGCiO0pEHznCdYh9GUjgKRsyQaE=; b=jvQxEQ5dg/Kprm3U3TneASct79a9+WyC0gytU+rk3dd8tKOxWZ20qxPv/WeJZ6kLQhppb8jvQF3lnAvdb0jBhQuoF7MqKqcZfYviHhZTvIDpgP3GP74rJX+IqEhdKCjohbg4MjOkybPxJWqkEq7SliwsRrXeCgjaQo/SFvh0uNzMYftD7vzw77JgCYMbUbg9qSEqT0nQ+IQy6ULRBmFa8XNhKiNbTJKFs26lccnlGnK006kpql/q9/40fH8swsrw/kvPEi5BfMLm1/Mvm/92UTedIx/eC0UDm0V1ECULasVZEzLk+GKCx0rqvtzlBkI4nOl8s86/nw0ytiQAmR8ZuQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none header.from=os.amperecomputing.com; dkim=pass header.d=os.amperecomputing.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=os.amperecomputing.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ux2DKwn5qJnFZ+3TbGCiO0pEHznCdYh9GUjgKRsyQaE=; b=nFLOln/Ym/O+UfpeusigDA7DxKJtjIvfJSQCBg2gSwuOtwI2Rga2aeaJwzAzkdq6BQl8w4L1JebNyeF6IIFKeq+LvCpqLVXlO5B72f8Av7boqt33wfMBrHVwNmqLDdOJZS1N4Izdvn/vHk01FGuyoqX378XR1/smf+X+dLm9k18= Authentication-Results: hpe.com; dkim=none (message not signed) header.d=none;hpe.com; dmarc=none action=none header.from=os.amperecomputing.com; Received: from DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) by DM8PR01MB6981.prod.exchangelabs.com (2603:10b6:8:16::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4478.21; Wed, 8 Sep 2021 17:01:35 +0000 Received: from DM6PR01MB5849.prod.exchangelabs.com ([fe80::8eb:704f:2ba7:9bc3]) by DM6PR01MB5849.prod.exchangelabs.com ([fe80::8eb:704f:2ba7:9bc3%4]) with mapi id 15.20.4500.015; Wed, 8 Sep 2021 17:01:35 +0000 Subject: Re: [PATCH v2 1/1] EmbeddedPkg/AcpiLib: Add more helper functions To: Leif Lindholm Cc: devel@edk2.groups.io, patches@amperecomputing.com, Ard Biesheuvel , Abner Chang , Daniel Schaefer References: <20210903154423.32619-1-nhi@os.amperecomputing.com> <20210907180030.mtcghb264iu6m4zn@leviathan> From: "Nhi Pham" Message-ID: <6fdef409-bdba-9a78-0143-3b93319c989d@os.amperecomputing.com> Date: Thu, 9 Sep 2021 00:01:26 +0700 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 In-Reply-To: <20210907180030.mtcghb264iu6m4zn@leviathan> X-ClientProxiedBy: HK2PR02CA0136.apcprd02.prod.outlook.com (2603:1096:202:16::20) To DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) Return-Path: nhi@os.amperecomputing.com MIME-Version: 1.0 Received: from [192.168.1.7] (116.110.42.117) by HK2PR02CA0136.apcprd02.prod.outlook.com (2603:1096:202:16::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4500.14 via Frontend Transport; Wed, 8 Sep 2021 17:01:33 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b5bed492-5ffe-4586-bfaf-08d972ea50b9 X-MS-TrafficTypeDiagnostic: DM8PR01MB6981: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:3968; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WMwsuhA0zApjYTZy1cRDJdcy4nr4ZMtTjP+JoOIfLRnKueVyuQPmw7yRKJRjAnFicQK1plAiGKHYZCZYukDymQVLyyO3smSOVxKnyLOuqu57I69ExsTM6MW2rcVw5JeiILVAcKNJ0D8+InAxZ7sZ+rx5TcQrlaUHnHmrLwvLFNbr7Bdac2UxWhcZ9SmAh60YVgFs0Y13lk6esF0Ib07TLuGSVe2O8Tg+1gok+rpk9O/h/Gow6TrOllmQayG/CHzTenqhYTW+yPRMrNTicL2/X/ozzJBKdfqu99mTIu4HBEXCVf140ik8XheI4D4DrZIJHn4lHh9d0cs/hIXQHPmAc8MFOAo8HVntW/wQA4jOh2RRYFWadp1L3APdM9ExOvRx57ROQgpgSk7vojaJqVNtwk9YH4SsgBPYYwi95lek+iAhMsQbcj8jhczi4g97cfRL27nmC74IhdGVejeD6eXCJEljJXGsy9NaJ1INB/d6k/qteyqsJwOKuN+/aQFqYnpo6JmKhyqrcvFu1FdEVz+v+NwT/rFA26i7ZrR4RfOnwuECxkxjTqtoWWIkTp/VuKxigOOhmtqAcr66G1q1SWJNDdeY0ho9QwFLZxtcDtxlDaui33Sky5bfJfRaNK6Jxazrwa4gIMR9b8HHqcM8Ld2C2eCOd0wpMaReoNAVZ4nXEMRJLd/8diXKGLcAyHUes/264P3Ma0hT+Wva3ErEIm/5/k0Q0a39TZLw3owWhLzsm7w+ErDNIdUx5NmhuHQqLZm3EjZ3SwvIhy1yD4t7fEv3EQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR01MB5849.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(4636009)(396003)(376002)(346002)(39850400004)(366004)(136003)(66946007)(2906002)(66556008)(186003)(38350700002)(4326008)(54906003)(478600001)(30864003)(38100700002)(296002)(5660300002)(6486002)(19627235002)(8936002)(86362001)(66476007)(956004)(31686004)(8676002)(2616005)(83380400001)(53546011)(52116002)(6666004)(26005)(6916009)(316002)(16576012)(31696002)(45980500001)(43740500002);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?R21tTWRqZEpacHBYdTY4eTVWTWlIWDhsSFA4VFNwMitMVWl3eis3T2plZmo2?= =?utf-8?B?dWRjdllJdUtVaFoxSHRZeHd2S3VDS3YySDB3L05DNGlDQXprc09pZDBkTk12?= =?utf-8?B?MTNZSHk5Z2VqSHpvVHdYRnVFTWM4RHFRNDhUc1pVMlBWU0EyVHhhYmdOTnZI?= =?utf-8?B?SGs0QnZlU1VaNEE4YkZNU28wakZzRnU0OGhQQllseGxabXIzRlNuZ2oxVjRv?= =?utf-8?B?NGI0QU51Qmd5YVVoaWFwcnorc25yeGxyRW1STDVPV2tvR3FZbEFtdkVUbzBz?= =?utf-8?B?ZzdwdGxSSkFLU0Fad2tzV0ViQXhFbTZVblRVL3Y2bytVenJWMnZOcFQycmdj?= =?utf-8?B?YnFoWmNHS09sZzRxSnRNeHlLUDhRT3kzMFYrWWp1c3J4S2dyZ04xTTVnOTVa?= =?utf-8?B?S0VQQ0g2NFp4di8xUDJmNW14UTFBb2gzRWFxaWQrL2FpTzlWQ1RIbTlIU3kx?= =?utf-8?B?Q2NXTCtxSjlacE5iM1NKSytIa3F1OCtKRkpLRDZvdCsyeU9mOUpsN0FDTlJG?= =?utf-8?B?bDJSY1BXcHlJUUNsQkIrRldGYnV5dEp3cU5PNzlaTnZIbjV0YjVsZSs1S3hW?= =?utf-8?B?eU02Nm95dlpkT3pwUWFkZWJ3dFBlK2haT1dlWmZ2emwwOS9wbWVuTHNQTkJ3?= =?utf-8?B?dmRHWm1kT0EyNGJLKytYTDR3dkYzZGRLQTZqMjc4dmIyd0thM01hM0xzRVpa?= =?utf-8?B?Y3VqRWcxUFpVblQ5ekV0bEYwYkdXQ1NkMWFDK2JiOGNVWmZvTXdlWllBUjVt?= =?utf-8?B?a0RPeVQ4RlpqRjQ0alQyY2Q5MFV5eTl3enpXWUV6K2Vjd0tBaGdKV1FaLytw?= =?utf-8?B?VFRRL21MdTUzWmcyL1U1MzZwekR0QnlqeUpiMXRYTUJKeVl6NnZSK2oyYkF2?= =?utf-8?B?TDBCVlJZVnFyRGlxNEo1aXVLUWhobjVORTZvTXpRb2R4OUpFTzNscVozR3FI?= =?utf-8?B?SEpvUWZwY0FxbzJYZHEvYmJuamNNWFBEVjQ4VVNoY05Pc3p4d0FseHlqbHQr?= =?utf-8?B?UEpoS1dIeHcxczQ3OFZSMmlqandVTkd2QU52eWI5SVZOcUJyQlZaL2pDZ0tO?= =?utf-8?B?RjlWU09YVzB2UnlBVjVLdXUxNTVReENzWUhqOXBVendwVHpVQjRsckxPbE1j?= =?utf-8?B?emJvQWw0b2xuWjh0L2srMXYxRXBvU3RHMzBMQ2ZTQ1YzWm5NT1dYSVEveEVl?= =?utf-8?B?NldwK1V4QS9WQXhjYnlNRlZ4OXVhbnMwRXpjam1TaEY4ZERjNDVTK1g3YjQr?= =?utf-8?B?UmxBOVJvOFZzYzBkSTA3SmdxL0Nwa1RMdWdjaVFRMEJ4QXpPN2xwRXA1ZERh?= =?utf-8?B?NFV2eVBmODhzbHl5S2RHN1dyeU15ZkJrQWZnTWh6WEx6OEJvdk1nUVdsM0lx?= =?utf-8?B?NEFsSjVHdmFlYTRSQlZxZnd1M3l0cE1KSVNxMUkrTmp6NUYwVzVTdE5zaUR5?= =?utf-8?B?UEptS0piQWV4bS9iWGFHd1NUZHhXbmJReGFzWG1HeERBcy9Eam5uV0I2azM3?= =?utf-8?B?NDNpODdQdVdLTFREVkptTExsb2ZqNEpYcjl2Q0I0S2t1bm5mN0VzNXF1cmxv?= =?utf-8?B?eHFtSDZWOTl0Z3dZUEc3WjhrT3BhWTY3L2U4dWw0UEt5c0YvL2xnckJudUJk?= =?utf-8?B?V1I3TEJ1UU1DNllBYitCK0srTjQ2K2NtbWc3dms1Ym1KSFpsUjhmMHVKYmJJ?= =?utf-8?B?K0ZzVm11MmFEV1doNWhiNWVGOHczOVcwMDFSdVhKQWZqdWxma0tQem9rOU1o?= =?utf-8?Q?PU7xEKodG7rTbTUn1R2O+tp+FUfb/UyQkyfjSnn?= X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-Network-Message-Id: b5bed492-5ffe-4586-bfaf-08d972ea50b9 X-MS-Exchange-CrossTenant-AuthSource: DM6PR01MB5849.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Sep 2021 17:01:35.5248 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: WcHp5e52KlijlMnUTgdGDol7TTwUNtuBtXEKQNfBRetH0z8lv+ibz76R1Ol9rcJ0Pnog0YeKfhnwkPYBHxVb/2sJxHz8olrgpe4XVs0qL0U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR01MB6981 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Hi Leif, Thanks for your reviewing. These functions in this patch are consumed in Ampere Mt. Jade platform. We can defer merging this patch until I send the v3 of Ampere Mt. Jade patchset out. Best regards, Nhi On 08/09/2021 01:00, Leif Lindholm wrote: > Hi Nhi, > > On Fri, Sep 03, 2021 at 22:44:23 +0700, Nhi Pham wrote: >> This adds more helper functions that assist in calculating the checksum, >> locating an ACPI table by signature, and updating an AML integer object. >> >> Cc: Leif Lindholm >> Cc: Ard Biesheuvel >> Cc: Abner Chang >> Cc: Daniel Schaefer >> Signed-off-by: Nhi Pham > Ideally, I'd like to have some code that makes use of these new > functions (even if in edk2-platforms) so that *someone* can verify > that these functions do what they're supposed to do before we merge > them. > > Acked-by: Leif Lindholm > > / > Leif > >> --- >> Changes since v1: >> + Add copyright [Abner] >> + Improve the AcpiLocateTableBySignature function to remove the caution >> for the usage of SSDT table. [Abner] >> + AcpiAmlObjectUpdateInteger: Use the AcpiSdtProtocol->SetOption to update >> the value of data object. [Abner] >> >> EmbeddedPkg/Library/AcpiLib/AcpiLib.inf | 3 + >> EmbeddedPkg/Include/Library/AcpiLib.h | 69 +++++++ >> EmbeddedPkg/Library/AcpiLib/AcpiLib.c | 214 ++++++++++++++++++++ >> 3 files changed, 286 insertions(+) >> >> diff --git a/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf b/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf >> index 538fe09cca29..01b12c9423a9 100644 >> --- a/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf >> +++ b/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf >> @@ -1,6 +1,7 @@ >> #/** @file >> # >> # Copyright (c) 2014, ARM Ltd. All rights reserved. >> +# Copyright (c) 2021, Ampere Computing LLC. All rights reserved. >> # >> # SPDX-License-Identifier: BSD-2-Clause-Patent >> # >> @@ -23,6 +24,8 @@ [Packages] >> EmbeddedPkg/EmbeddedPkg.dec >> >> [LibraryClasses] >> + BaseLib >> + BaseMemoryLib >> DebugLib >> UefiBootServicesTableLib >> >> diff --git a/EmbeddedPkg/Include/Library/AcpiLib.h b/EmbeddedPkg/Include/Library/AcpiLib.h >> index c142446d9d59..933582b7f607 100644 >> --- a/EmbeddedPkg/Include/Library/AcpiLib.h >> +++ b/EmbeddedPkg/Include/Library/AcpiLib.h >> @@ -2,6 +2,7 @@ >> Helper Library for ACPI >> >> Copyright (c) 2014-2016, ARM Ltd. All rights reserved. >> + Copyright (c) 2021, Ampere Computing LLC. All rights reserved. >> >> SPDX-License-Identifier: BSD-2-Clause-Patent >> >> @@ -13,6 +14,7 @@ >> #include >> >> #include >> +#include >> >> // >> // Macros for the Generic Address Space >> @@ -128,4 +130,71 @@ LocateAndInstallAcpiFromFv ( >> IN CONST EFI_GUID* AcpiFile >> ); >> >> +/** >> + This function calculates and updates a UINT8 checksum >> + in an ACPI description table header. >> + >> + @param Buffer Pointer to buffer to checksum >> + @param Size Number of bytes to checksum >> + >> + @retval EFI_SUCCESS The function completed successfully. >> + @retval EFI_INVALID_PARAMETER Invalid parameter. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +AcpiUpdateChecksum ( >> + IN OUT UINT8 *Buffer, >> + IN UINTN Size >> + ); >> + >> +/** >> + This function uses the ACPI SDT protocol to locate an ACPI table >> + with a given signature that only have a single instance. >> + >> + @param AcpiTableSdtProtocol Pointer to ACPI SDT protocol. >> + @param TableSignature ACPI table signature. >> + @param Index The zero-based index of the table where to search the table. >> + @param Table Pointer to the table. >> + @param TableKey Pointer to the table key. >> + >> + @return EFI_SUCCESS The function completed successfully. >> + @return EFI_INVALID_PARAMETER At least one of parameters is invalid. >> + @retval EFI_NOT_FOUND The requested index is too large and a table was not found. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +AcpiLocateTableBySignature ( >> + IN EFI_ACPI_SDT_PROTOCOL *AcpiSdtProtocol, >> + IN UINT32 TableSignature, >> + IN OUT UINTN *Index, >> + OUT EFI_ACPI_DESCRIPTION_HEADER **Table, >> + OUT UINTN *TableKey >> + ); >> + >> +/** >> + This function updates the integer value of an AML Object. >> + >> + @param AcpiTableSdtProtocol Pointer to ACPI SDT protocol. >> + @param TableHandle Points to the table representing the starting point >> + for the object path search. >> + @param AsciiObjectPath Pointer to the ACPI path of the object being updated. >> + @param Value New value to write to the object. >> + >> + @return EFI_SUCCESS The function completed successfully. >> + @return EFI_INVALID_PARAMETER At least one of parameters is invalid or the data type >> + of the ACPI object is not an integer value. >> + @retval EFI_NOT_FOUND The object is not found with the given path. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +AcpiAmlObjectUpdateInteger ( >> + IN EFI_ACPI_SDT_PROTOCOL *AcpiSdtProtocol, >> + IN EFI_ACPI_HANDLE TableHandle, >> + IN CHAR8 *AsciiObjectPath, >> + IN UINTN Value >> + ); >> + >> #endif // __ACPI_LIB_H__ >> diff --git a/EmbeddedPkg/Library/AcpiLib/AcpiLib.c b/EmbeddedPkg/Library/AcpiLib/AcpiLib.c >> index ff7d678433d5..393133f54381 100644 >> --- a/EmbeddedPkg/Library/AcpiLib/AcpiLib.c >> +++ b/EmbeddedPkg/Library/AcpiLib/AcpiLib.c >> @@ -1,6 +1,7 @@ >> /** @file >> * >> * Copyright (c) 2014-2015, ARM Limited. All rights reserved. >> +* Copyright (c) 2021, Ampere Computing LLC. All rights reserved. >> * >> * SPDX-License-Identifier: BSD-2-Clause-Patent >> * >> @@ -9,9 +10,12 @@ >> #include >> >> #include >> +#include >> +#include >> #include >> #include >> >> +#include >> #include >> #include >> >> @@ -170,3 +174,213 @@ LocateAndInstallAcpiFromFv ( >> { >> return LocateAndInstallAcpiFromFvConditional (AcpiFile, NULL); >> } >> + >> +/** >> + This function calculates and updates a UINT8 checksum >> + in an ACPI description table header. >> + >> + @param Buffer Pointer to buffer to checksum >> + @param Size Number of bytes to checksum >> + >> + @retval EFI_SUCCESS The function completed successfully. >> + @retval EFI_INVALID_PARAMETER Invalid parameter. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +AcpiUpdateChecksum ( >> + IN OUT UINT8 *Buffer, >> + IN UINTN Size >> + ) >> +{ >> + UINTN ChecksumOffset; >> + >> + if (Buffer == NULL || Size == 0) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); >> + >> + // >> + // Set checksum to 0 first >> + // >> + Buffer[ChecksumOffset] = 0; >> + >> + // >> + // Update checksum value >> + // >> + Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Size); >> + >> + return EFI_SUCCESS; >> +} >> + >> +/** >> + This function uses the ACPI SDT protocol to locate an ACPI table >> + with a given signature that only have a single instance. >> + >> + @param AcpiTableSdtProtocol Pointer to ACPI SDT protocol. >> + @param TableSignature ACPI table signature. >> + @param Index The zero-based index of the table where to search the table. >> + @param Table Pointer to the table. >> + @param TableKey Pointer to the table key. >> + >> + @return EFI_SUCCESS The function completed successfully. >> + @return EFI_INVALID_PARAMETER At least one of parameters is invalid. >> + @retval EFI_NOT_FOUND The requested index is too large and a table was not found. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +AcpiLocateTableBySignature ( >> + IN EFI_ACPI_SDT_PROTOCOL *AcpiSdtProtocol, >> + IN UINT32 TableSignature, >> + IN OUT UINTN *Index, >> + OUT EFI_ACPI_DESCRIPTION_HEADER **Table, >> + OUT UINTN *TableKey >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_SDT_HEADER *TempTable; >> + EFI_ACPI_TABLE_VERSION TableVersion; >> + UINTN TableIndex; >> + >> + if (AcpiSdtProtocol == NULL >> + || Table == NULL >> + || TableKey == NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + Status = EFI_SUCCESS; >> + >> + // >> + // Search for ACPI Table with matching signature >> + // >> + TableVersion = 0; >> + TableIndex = *Index; >> + while (!EFI_ERROR (Status)) { >> + Status = AcpiSdtProtocol->GetAcpiTable ( >> + TableIndex, >> + &TempTable, >> + &TableVersion, >> + TableKey >> + ); >> + if (!EFI_ERROR (Status)) { >> + TableIndex++; >> + >> + if (((EFI_ACPI_DESCRIPTION_HEADER *)TempTable)->Signature == TableSignature) { >> + *Table = (EFI_ACPI_DESCRIPTION_HEADER *)TempTable; >> + *Index = TableIndex; >> + break; >> + } >> + } >> + } >> + >> + return Status; >> +} >> + >> +/** >> + This function updates the integer value of an AML Object. >> + >> + @param AcpiTableSdtProtocol Pointer to ACPI SDT protocol. >> + @param TableHandle Points to the table representing the starting point >> + for the object path search. >> + @param AsciiObjectPath Pointer to the ACPI path of the object being updated. >> + @param Value New value to write to the object. >> + >> + @return EFI_SUCCESS The function completed successfully. >> + @return EFI_INVALID_PARAMETER At least one of parameters is invalid or the data type >> + of the ACPI object is not an integer value. >> + @retval EFI_NOT_FOUND The object is not found with the given path. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +AcpiAmlObjectUpdateInteger ( >> + IN EFI_ACPI_SDT_PROTOCOL *AcpiSdtProtocol, >> + IN EFI_ACPI_HANDLE TableHandle, >> + IN CHAR8 *AsciiObjectPath, >> + IN UINTN Value >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_HANDLE ObjectHandle; >> + EFI_ACPI_HANDLE DataHandle; >> + EFI_ACPI_DATA_TYPE DataType; >> + UINT8 *Buffer; >> + UINTN BufferSize; >> + UINTN DataSize; >> + >> + if (AcpiSdtProtocol == NULL || AsciiObjectPath == NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + ObjectHandle = NULL; >> + Status = AcpiSdtProtocol->FindPath (TableHandle, AsciiObjectPath, &ObjectHandle); >> + if (EFI_ERROR (Status)) { >> + return Status; >> + } >> + >> + Status = AcpiSdtProtocol->GetOption (ObjectHandle, 0, &DataType, (VOID *)&Buffer, &BufferSize); >> + if (EFI_ERROR (Status)) { >> + Status = EFI_NOT_FOUND; >> + goto Exit; >> + } >> + ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE); >> + ASSERT (Buffer != NULL); >> + >> + if (Buffer[0] != AML_NAME_OP) { >> + Status = EFI_NOT_FOUND; >> + goto Exit; >> + } >> + >> + // >> + // Get handle of data object >> + // >> + DataHandle = NULL; >> + Status = AcpiSdtProtocol->GetChild (ObjectHandle, &DataHandle); >> + ASSERT_EFI_ERROR (Status); >> + >> + Status = AcpiSdtProtocol->GetOption (DataHandle, 0, &DataType, (VOID *)&Buffer, &BufferSize); >> + ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE); >> + ASSERT (Buffer != NULL); >> + >> + if (Buffer[0] == AML_ZERO_OP || Buffer[0] == AML_ONE_OP) { >> + Status = AcpiSdtProtocol->SetOption (DataHandle, 0, (VOID *)&Value, sizeof (UINT8)); >> + ASSERT_EFI_ERROR (Status); >> + } else { >> + // >> + // Check the size of data object >> + // >> + switch (Buffer[0]) { >> + case AML_BYTE_PREFIX: >> + DataSize = sizeof (UINT8); >> + break; >> + >> + case AML_WORD_PREFIX: >> + DataSize = sizeof (UINT16); >> + break; >> + >> + case AML_DWORD_PREFIX: >> + DataSize = sizeof (UINT32); >> + break; >> + >> + case AML_QWORD_PREFIX: >> + DataSize = sizeof (UINT64); >> + break; >> + >> + default: >> + // The data type of the ACPI object is not an integer >> + Status = EFI_INVALID_PARAMETER; >> + goto Exit; >> + } >> + >> + Status = AcpiSdtProtocol->SetOption (DataHandle, 1, (VOID *)&Value, DataSize); >> + ASSERT_EFI_ERROR (Status); >> + } >> + >> +Exit: >> + AcpiSdtProtocol->Close (DataHandle); >> + AcpiSdtProtocol->Close (ObjectHandle); >> + >> + return Status; >> +} >> -- >> 2.17.1 >>