From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 938A1941395 for ; Wed, 10 Apr 2024 08:16:50 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=riuRPZkLuEoeQyBuAZKFuPwg+2XSqSHDXnznNldNwNs=; c=relaxed/simple; d=groups.io; h=From:To:CC:Subject:Thread-Topic:Thread-Index:Date:Message-ID:References:In-Reply-To:Accept-Language:msip_labels:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Language:Content-Type:Content-Transfer-Encoding; s=20240206; t=1712737009; v=1; b=ZRpJbCNCW204UCbx2uRssBmX+Itx7uMDha/P9dI9LiR1NQRlLJ6k7NmYvqV1BjiyZZ8+JzKT L+WHGyiZMCvCt8N0q8TeqB3G2VxgzulD3KwYCnFcHVERYnN0VhBpUCfV/L+n34d4I6sgLxhpmcM 2GJvhct59Gc2XWdGmmfqemdu5pVKBfvDQF2FyOnA8UzkIVrE/gya5+sQ8O7IRWHBuAJ6VJAQ5OD HLW4+79AZUml/dSQhkNApSBCqUZr876ITIrZ2lx8x2kdpU8l3fyIs5kSd0ETaRn5h1ImIakJjqH jAdSwHyoEnQhw3y6xNYjXAVdn3GWhcDjYFJQ333ef25QQ== X-Received: by 127.0.0.2 with SMTP id L03vYY7687511x0RA6tWSv2i; Wed, 10 Apr 2024 01:16:49 -0700 X-Received: from NAM02-BN1-obe.outbound.protection.outlook.com (NAM02-BN1-obe.outbound.protection.outlook.com [40.107.212.115]) by mx.groups.io with SMTP id smtpd.web11.161738.1712737008120501606 for ; Wed, 10 Apr 2024 01:16:48 -0700 X-Received: from MW4PR12MB7031.namprd12.prod.outlook.com (2603:10b6:303:1ef::6) by MW6PR12MB8834.namprd12.prod.outlook.com (2603:10b6:303:23c::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Wed, 10 Apr 2024 08:16:43 +0000 X-Received: from MW4PR12MB7031.namprd12.prod.outlook.com ([fe80::fef9:2c9c:21b5:6f50]) by MW4PR12MB7031.namprd12.prod.outlook.com ([fe80::fef9:2c9c:21b5:6f50%2]) with mapi id 15.20.7409.042; Wed, 10 Apr 2024 08:16:42 +0000 From: "Nickle Wang via groups.io" To: "devel@edk2.groups.io" , "abner.chang@amd.com" CC: Igor Kulchytskyy , Nick Ramirez Subject: Re: [edk2-devel] [edk2-redfish-client][PATCH v2 1/2] RedfishClientPkg/Features: support Redfish Secure Boot Thread-Topic: [edk2-devel] [edk2-redfish-client][PATCH v2 1/2] RedfishClientPkg/Features: support Redfish Secure Boot Thread-Index: AQHahD9zzKUQJgz1j0+ppnGEjgb6CbFgwzWggABxyKA= Date: Wed, 10 Apr 2024 08:16:42 +0000 Message-ID: References: <20240401141748.38451-1-nicklew@nvidia.com> In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ActionId=f2c7ff1e-2202-4c70-a663-1324cf62605e;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=0;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Enabled=true;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Method=Standard;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Name=General;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SetDate=2024-04-10T01:24:37Z;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SiteId=3dd8961f-e488-4e60-8e11-a82d994e183d; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MW4PR12MB7031:EE_|MW6PR12MB8834:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam-message-info: aHu+2MJTQ3DxUMaPwLrg86Y4VxCc50q0PkD+tSGxYFB0hgkQ4o3+RfwYw9lRgjXZJUZ4tsXkUfE46qzom8FQoBNBu5fu7+O/g8b81qnQ0oxdfffqQD5q93IJ1w7vhgZ21sTHPyS9USxvvXgz9eHSMltGMjGJt6dKWxJmN9BcAEFjhh3wuVUKFiEJSgJj2P8Hs0zsNISIP13dj9Irbiqtg+fD7po8VWIQzLQ9PopmvudYHAxDzBpSa14m7Z3blQiZLaG5QY+zOL5c8fz4THYxJt3B9UaI0dzCcsvzM47btSNts3VUHxw1tCQiCe2mdRrkXg2zz1OQ1NcuAyOQ1a3z5f/5ccDCJrUABW+pcqqUDpESr9Pv5/RD0iUMIvl1FmF0XBBv8NJqOtdZj894xv2GPgAidLaAQKj7RLLq5bVkyTRihin87ZS3H9+oT0ShqHZlSbWfieEdH89QKaIZODZ53lywNWI9JF4XPMf9ZS1bRPlD3b1oLFanQRv5n7cRQ4mX2JXgncMCGku997OyFqX3pWqJh3sUckRf2nzCi4ffxmfY6kl4pHWxn+i12Vehpao3b2C8hZ/msuQGCGOEPKjiTCkKJJRVjoRXZevZXh5Bk3axkwpNV49A1xmaZc7gVkzF0/u5BX2GW7AwIHpkkpzmMre1zGwIZDbOmL5abd1okq4= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?BvC7UTRlbopIDb1vkFGhyuzYpQAmVBdGDo1tv8vJmqMxgJPIl91qE/NxQjb4?= =?us-ascii?Q?/0VBPgdJfG4TdAkJo45as6fAsUiZ0046/2p3lC8mKdGPKOGI3rYXRB2+go9X?= =?us-ascii?Q?7LaB3337Fopr6sR7SjcqAO4wv0lN6H5ZNVCSYDJD6fwDpAmIEEwPn+QQK/Ij?= =?us-ascii?Q?UXNKfUVDT/Vyinuq2bkUOwXyezyD7Zf9Pf58jllp3KLhDIRVc61Ldy5565XR?= =?us-ascii?Q?ynesXoD7uSxqp8D+Em6nUw/OcxAefVfz11jYYHp1IDvSFVHU5OJOse6Dtw8z?= =?us-ascii?Q?3BO4yoglnrSHxDk8zMaC71JmvsrQRmjoMAKypl1z8uf4xP8mOA2PGc0jkIQP?= =?us-ascii?Q?pF2lfHxsj/QU1yb2QZTlD6igPYiH9YBeSRbFJSI+q75JGEe6SxyC/b6D8kii?= =?us-ascii?Q?kq4dKoKgspklF/OAFvTOC1RB0So89K99IlfD0g0RfVzuVHwVHEjeh0JHBcXJ?= =?us-ascii?Q?Vo/R5N3zMYQJJbuslVDRIgCO8svK5OHOHX40uQZelStJl6bZ003gwppAglVg?= =?us-ascii?Q?7XlJ3dXVXum1ylhmZqCCW9cqhM4S20hq3c1g2xe8bI4Xxd6POmTtbkIdg4LA?= =?us-ascii?Q?ocx7NTeuNQ/nyE080d12sEgHpq2NLO4q1FmzvIN+iHXQ1syYW8+E+Acc2tY3?= =?us-ascii?Q?VjlT53okoQhee9P2TpDADKBY4jcQXkscXwiYKLLcqH6xRiClR41hrUFDraw6?= =?us-ascii?Q?zIltT8DA1lPixuByXOQBQ27ckvHlLkOaz0Ktcl4HI9P6D9f3S1b6rRcjSO8G?= =?us-ascii?Q?XAkVdswzuDfqEq499RMPkzE35gBZ0hBzgJyNzXm6AVU7UbBS+oiw/OdRKN08?= =?us-ascii?Q?Q6qliITma0xZnnb+ssy8I/o21/Vkcpp7mTZ3OhrnJGwopdlycppm9MrKXFHp?= =?us-ascii?Q?7J2AfUGJXf9bTae/EbnWoaJB4/Yh0nGzXSFjyKrU7IBGzvhqOG9eLSdFgmz3?= =?us-ascii?Q?2FBH2/G3ju6vGtNkzBTlpsSntPjZmQEnHVFA6JOmJ7cewT5SYBC4OiIEySx/?= =?us-ascii?Q?5oLnue/wkaT+EJrgNJ/k9raH1Zl1DE8DSpY18f9wStSPMjSDJOOJuqnPck6e?= =?us-ascii?Q?RCfAArOCqX4M6oHLPGZK4Ei+dPJH5tbv3otuwKLcUhkkPYLpD2uKfxsbHkYV?= =?us-ascii?Q?toEutQBXZzWa5QzSENjiSv5EzsF0luKfswv41HgcZBeq/lUITDX/EENWJ5Lu?= =?us-ascii?Q?kJpzEtlyFD9JA4Mm/R9zZJS2FrGaVF150W1fvXLEFZGE99x8/Nx6XCsffyyA?= =?us-ascii?Q?kNjzJiz36vJW5oumh8YO4NIckspjHHYfehPpxTJ0VCGFeIVGJK6KyYpv7MeT?= =?us-ascii?Q?DkjD+F7A6aB8vWILihp3UAGo33jbHXu5KF6JxbTPbsn/JjFRrZKL3Z66k9rc?= =?us-ascii?Q?cfw0ddlP12WwWBm7rwOFgsfynlwhvZrIg6J8mDDwJhoeagQ3Q4S+10E8a4rv?= =?us-ascii?Q?mcfE37wUxKRfDaHziwsGDv1rPAjffiMCbUG2NREEyvldmfbQ2kJ6zt6lU8bd?= =?us-ascii?Q?Ipye5XqJU4TruqK71jcPnVkGIn3iD7ymKOk+O/y0i0WrnS3eqQNrbWWHHvvg?= =?us-ascii?Q?xiqucKPquZ2yBaMBnaAmiE28DSzf/4xASfi28aZq8fcInNQclGJsw1cedI2l?= =?us-ascii?Q?JJOt4JAlblU92KQ7TIe0nymA3Q6gRgycCedxirt1b+wM?= MIME-Version: 1.0 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW4PR12MB7031.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 769a4386-f542-4567-26b1-08dc59368e03 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Apr 2024 08:16:42.5416 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: TXUg3T5rj3rCHqZ3FnfS542/LkErNe4mNbPXoUjLDTkJIh/xrOyKshJ/70phXAiwa/qmEXLdqtuU+Dnr09diHQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB8834 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Resent-Date: Wed, 10 Apr 2024 01:16:48 -0700 Resent-From: nicklew@nvidia.com Reply-To: devel@edk2.groups.io,nicklew@nvidia.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: 3LapIILY010sj76ALbDXTXjyx7686176AA= Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=ZRpJbCNC; dmarc=pass (policy=none) header.from=groups.io; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io Thanks for your review, Abner! The reason why I keep HPE copyright statement is because I create this feat= ure driver by copying existing one and modifying it. Since I still leverage= some functions contributed by HPE, I think I am supposed to keep HPE copyr= ight statement. Regards, Nickle > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Chang, Abn= er > via groups.io > Sent: Wednesday, April 10, 2024 9:43 AM > To: Nickle Wang ; devel@edk2.groups.io > Cc: Igor Kulchytskyy ; Nick Ramirez > Subject: Re: [edk2-devel] [edk2-redfish-client][PATCH v2 1/2] > RedfishClientPkg/Features: support Redfish Secure Boot >=20 > External email: Use caution opening links or attachments >=20 >=20 > [AMD Official Use Only - General] >=20 > Hi Nickle, > I don't see the obvious coding error in this patch. However, I think we c= an remove > HPE copyright from Redfish secure boot feature driver, as this is a new f= eature > driver and HPE doesn't have contributions to these files, right? If so, t= hen please > remove it. >=20 > Thanks >=20 > Reviewed-by: Abner Chang >=20 > > -----Original Message----- > > From: Nickle Wang > > Sent: Monday, April 1, 2024 10:18 PM > > To: devel@edk2.groups.io > > Cc: Chang, Abner ; Igor Kulchytskyy > > ; Nick Ramirez > > Subject: [edk2-redfish-client][PATCH v2 1/2] RedfishClientPkg/Features: > > support Redfish Secure Boot > > > > Caution: This message originated from an External Source. Use proper > > caution when opening attachments, clicking links, or responding. > > > > > > Introduce SecureBoot driver to support > > /redfish/v1/Systems/SYS/SecureBoot resource. > > > > Signed-off-by: Nickle Wang > > Cc: Abner Chang > > Cc: Igor Kulchytskyy > > Cc: Nick Ramirez > > --- > > .../RedfishClientComponents.dsc.inc | 2 + > > RedfishClientPkg/RedfishClientLibs.dsc.inc | 4 + > > .../SecureBoot/v1_1_0/Dxe/SecureBootDxe.inf | 60 ++ > > .../v1_1_0/Common/SecureBootCommon.h | 40 + > > .../v1_1_0/Common/SecureBootCommon.c | 765 +++++++++++++++++ > > .../SecureBoot/v1_1_0/Dxe/SecureBootDxe.c | 809 ++++++++++++++++++ > > RedfishClientPkg/RedfishClient.fdf.inc | 1 + > > 7 files changed, 1681 insertions(+) > > create mode 100644 > > RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.inf > > create mode 100644 > > RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCommo > > n.h > > create mode 100644 > > RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCommo > > n.c > > create mode 100644 > > RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.c > > > > diff --git a/RedfishClientPkg/RedfishClientComponents.dsc.inc > > b/RedfishClientPkg/RedfishClientComponents.dsc.inc > > index ae2a4b025..42fc0c299 100644 > > --- a/RedfishClientPkg/RedfishClientComponents.dsc.inc > > +++ b/RedfishClientPkg/RedfishClientComponents.dsc.inc > > @@ -34,6 +34,7 @@ > > RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.inf > > > > RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe.= in > > f > > RedfishClientPkg/Features/BootOption/v1_0_4/Dxe/BootOptionDxe.inf > > + RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.inf > > > > !include RedfishClientPkg/RedfishJsonStructureDxe.dsc.inc > > > > @@ -47,3 +48,4 @@ > > RedfishClientPkg/Converter/Bios/v1_0_9/RedfishBios_V1_0_9_Dxe.inf > > > > RedfishClientPkg/Converter/BootOptionCollection/RedfishBootOptionCollec= ti > > on_Dxe.inf > > > > RedfishClientPkg/Converter/BootOption/v1_0_4/RedfishBootOption_V1_0_4_ > > Dxe.inf > > + > > RedfishClientPkg/Converter/SecureBoot/v1_1_0/RedfishSecureBoot_V1_1_0_ > > Dxe.inf > > diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc > > b/RedfishClientPkg/RedfishClientLibs.dsc.inc > > index 6599926ab..9126465df 100644 > > --- a/RedfishClientPkg/RedfishClientLibs.dsc.inc > > +++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc > > @@ -25,6 +25,8 @@ > > > > BiosV1_0_9Lib|RedfishClientPkg/ConverterLib/edk2library/Bios/v1_0_9/Lib= .in > > f > > > > BootOptionCollectionLib|RedfishClientPkg/ConverterLib/edk2library/BootO= p > > tionCollection/Lib.inf > > > > BootOptionV1_0_4Lib|RedfishClientPkg/ConverterLib/edk2library/BootOptio > > n/v1_0_4/Lib.inf > > + > > SecureBootV1_1_0Lib|RedfishClientPkg/ConverterLib/edk2library/SecureBoo= t > > /v1_1_0/Lib.inf > > + > > # > > # Above modules should be pulled in by build tool. > > # > > @@ -42,3 +44,5 @@ > > > > RedfishAddendumLib|RedfishClientPkg/Library/RedfishAddendumLib/Redfis > > hAddendumLib.inf > > RedfishDebugLib|RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.i= nf > > RedfishHttpLib|RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf > > + > > SecureBootVariableLib|SecurityPkg/Library/SecureBootVariableLib/SecureB= o > > otVariableLib.inf > > + > > PlatformPKProtectionLib|SecurityPkg/Library/PlatformPKProtectionLibVarP= olic > > y/PlatformPKProtectionLibVarPolicy.inf > > diff --git > > a/RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.inf > > b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.inf > > new file mode 100644 > > index 000000000..1ad8c623f > > --- /dev/null > > +++ b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.inf > > @@ -0,0 +1,60 @@ > > +## @file > > +# > > +# (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP > > +# Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All right= s > > reserved. > > +# > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > +# > > +## > > + > > + > > +[Defines] > > + INF_VERSION =3D 0x00010005 > > + BASE_NAME =3D SecureBootDxe > > + FILE_GUID =3D 5E4025F8-DA42-468A-853E-6A1091D35052 > > + MODULE_TYPE =3D DXE_DRIVER > > + VERSION_STRING =3D 1.0 > > + ENTRY_POINT =3D RedfishResourceEntryPoint > > + UNLOAD_IMAGE =3D RedfishResourceUnload > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + MdeModulePkg/MdeModulePkg.dec > > + SecurityPkg/SecurityPkg.dec > > + RedfishPkg/RedfishPkg.dec > > + RedfishClientPkg/RedfishClientPkg.dec > > + > > +[Sources] > > + ../Common/SecureBootCommon.h > > + ../Common/SecureBootCommon.c > > + SecureBootDxe.c > > + > > +[LibraryClasses] > > + BaseMemoryLib > > + DebugLib > > + EdkIIRedfishResourceConfigLib > > + RedfishFeatureUtilityLib > > + RedfishVersionLib > > + RedfishResourceIdentifyLib > > + SecureBootVariableLib > > + UefiLib > > + UefiDriverEntryPoint > > + RedfishAddendumLib > > + UefiRuntimeServicesTableLib > > + > > +[Protocols] > > + gEdkIIRedfishConfigHandlerProtocolGuid ## PRODUCED > > + gEfiRestJsonStructureProtocolGuid ## CONSUMED > > + gEdkIIRedfishResourceConfigProtocolGuid ## PRODUCED > > + gEdkIIRedfishFeatureProtocolGuid ## CONSUMED > > + > > +[Guids] > > + gEfiSecureBootEnableDisableGuid ## CONSUMED > > + > > +[Pcd] > > + gEfiRedfishClientPkgTokenSpaceGuid.PcdMaxRedfishSchemaStringSize > > + gEfiRedfishClientPkgTokenSpaceGuid.PcdMaxRedfishSchemaVersionSize > > + gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootRequired > > + > > +[Depex] > > + TRUE > > diff --git > > a/RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCom > > mon.h > > b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCom > > mon.h > > new file mode 100644 > > index 000000000..0d1824160 > > --- /dev/null > > +++ > > b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCom > > mon.h > > @@ -0,0 +1,40 @@ > > +/** @file > > + > > + Redfish feature driver implementation - internal header file > > + (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP > > + Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights > > reserved. > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#ifndef EFI_REDFISH_SECUREBOOT_COMMON_H_ > > +#define EFI_REDFISH_SECUREBOOT_COMMON_H_ > > + > > +#include > > +#include > > +#include > > +#include > > > > +#include > > +#include > > +#include > > +#include > > + > > +// > > +// Schema information. > > +// > > +#define REDFISH_MANAGED_URI L"Systems/{}/SecureBoot" > > +#define REDFISH_DUMMY_CONFIG_LANG L"Systems/{1}/SecureBoot" > > +#define MAX_URI_LENGTH 256 > > +#define RESOURCE_SCHEMA "SecureBoot" > > +#define RESOURCE_SCHEMA_MAJOR "1" > > +#define RESOURCE_SCHEMA_MINOR "1" > > +#define RESOURCE_SCHEMA_ERRATA "0" > > +#define RESOURCE_SCHEMA_VERSION "v1_1_0" > > +#define SECURE_BOOT_SETUP_MODE "SetupMode" > > +#define SECURE_BOOT_USER_MODE "UserMode" > > +#define SECURE_BOOT_ENABLED "Enabled" > > +#define SECURE_BOOT_DISABLED "Disabled" > > +#define SECURE_BOOT_MODE_STR_LEN 16 > > + > > +#endif > > diff --git > > a/RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCom > > mon.c > > b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCom > > mon.c > > new file mode 100644 > > index 000000000..adee31b87 > > --- /dev/null > > +++ > > b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Common/SecureBootCom > > mon.c > > @@ -0,0 +1,765 @@ > > +/** @file > > + Redfish feature driver implementation - common functions > > + > > + (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP > > + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > > reserved. > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#include "SecureBootCommon.h" > > + > > +CHAR8 SecureBootEmptyJson[] =3D "{\"@odata.id\": \"\", \"@odata.type\= ": > > \"#SecureBoot.v1_1_0.SecureBoot\", \"Id\": \"\", \"Name\": \"\", > > \"Attributes\":{}}"; > > + > > +REDFISH_RESOURCE_COMMON_PRIVATE *mRedfishResourcePrivate > > =3D NULL; > > +EFI_HANDLE mRedfishResourceConfigProtocolHandle > > =3D NULL; > > +CHAR16 > > *mSecureBootSupportedAttributes[SECURE_BOOT_MODE_STR_LEN] =3D { > > + L"SecureBootCurrentBoot", > > + L"SecureBootEnable", > > + L"SecureBootMode" > > +}; > > + > > +/** > > + Read EFI_SECURE_BOOT_ENABLE_NAME variable and return its value to > > caller. > > + > > + @retval BOOLEAN TRUE when EFI_SECURE_BOOT_ENABLE_NAME value > > is SECURE_BOOT_ENABLE > > + FALSE when EFI_SECURE_BOOT_ENABLE_NAME value is > > SECURE_BOOT_DISABLE > > +**/ > > +BOOLEAN > > +RedfishReadSecureBootEnable ( > > + VOID > > + ) > > +{ > > + UINT8 *Buffer; > > + BOOLEAN SecureBootEnableValue; > > + > > + Buffer =3D NULL; > > + SecureBootEnableValue =3D FALSE; > > + > > + GetVariable2 ( > > + EFI_SECURE_BOOT_ENABLE_NAME, > > + &gEfiSecureBootEnableDisableGuid, > > + (VOID **)&Buffer, > > + NULL > > + ); > > + > > + if (Buffer !=3D NULL) { > > + if (*Buffer =3D=3D SECURE_BOOT_ENABLE) { > > + SecureBootEnableValue =3D TRUE; > > + } > > + > > + FreePool (Buffer); > > + } > > + > > + return SecureBootEnableValue; > > +} > > + > > +/** > > + Write EFI_SECURE_BOOT_ENABLE_NAME variable with given value. > > + > > + @param[in] SecureBootEnableValue Value to write. TRUE is > > SECURE_BOOT_ENABLE. > > + FALSE is SECURE_BOOT_DISABLE. > > + > > + @retval EFI_SUCCESS Write value successfully. > > + @retval Others Some error happened. > > +**/ > > +EFI_STATUS > > +RedfishWriteSecureBootEnable ( > > + BOOLEAN SecureBootEnableValue > > + ) > > +{ > > + EFI_STATUS Status; > > + UINT8 VarValue; > > + > > + VarValue =3D (SecureBootEnableValue ? SECURE_BOOT_ENABLE : > > SECURE_BOOT_DISABLE); > > + Status =3D gRT->SetVariable ( > > + EFI_SECURE_BOOT_ENABLE_NAME, > > + &gEfiSecureBootEnableDisableGuid, > > + EFI_VARIABLE_NON_VOLATILE | > > EFI_VARIABLE_BOOTSERVICE_ACCESS, > > + sizeof (VarValue), > > + &VarValue > > + ); > > + > > + return Status; > > +} > > + > > +/** > > + Consume Redfish resource in given Json data. > > + > > + @param[in] This Pointer to > > REDFISH_RESOURCE_COMMON_PRIVATE instance. > > + @param[in] Json The JSON to consume. > > + @param[in] HeaderEtag The Etag string returned in HTTP he= ader. > > + > > + @retval EFI_SUCCESS Consume Redfish attribute successfu= lly. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +RedfishConsumeResourceCommon ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private, > > + IN CHAR8 *Json, > > + IN CHAR8 *HeaderEtag OPTIONAL > > + ) > > +{ > > + EFI_STATUS Status; > > + EFI_REDFISH_SECUREBOOT_V1_1_0 *SecureBoot; > > + EFI_REDFISH_SECUREBOOT_V1_1_0_CS *SecureBootCs; > > + BOOLEAN SecureBootEnableDisable; > > + > > + if ((Private =3D=3D NULL) || IS_EMPTY_STRING (Json)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + SecureBoot =3D NULL; > > + SecureBootCs =3D NULL; > > + SecureBootEnableDisable =3D RedfishReadSecureBootEnable (); > > + > > + Status =3D Private->JsonStructProtocol->ToStructure ( > > + Private->JsonStructProtocol, > > + NULL, > > + Json, > > + (EFI_REST_JSON_STRUCTURE_HEA= DER > > **)&SecureBoot > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: ToStructure() failed: %r\n", __func__, > > Status)); > > + return Status; > > + } > > + > > + SecureBootCs =3D SecureBoot->SecureBoot; > > + > > + // > > + // Check ETAG to see if we need to consume it > > + // > > + if (CheckEtag (Private->Uri, HeaderEtag, SecureBootCs->odata_etag)) = { > > + // > > + // No change > > + // > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: ETAG: %s has no change, ignore > > consume action\n", __func__, Private->Uri)); > > + Status =3D EFI_ALREADY_STARTED; > > + goto ON_RELEASE; > > + } > > + > > + // > > + // Secure boot enable > > + // > > + if (SecureBootCs->SecureBootEnable !=3D NULL) { > > + if (SecureBootEnableDisable !=3D *SecureBootCs->SecureBootEnable) = { > > + // > > + // Write value to "SecureBootEnable" variable. AuthVariableLib w= ill > > enable or disable secure boot > > + // based on "SecureBootEnable" value. > > + // > > + Status =3D RedfishWriteSecureBootEnable (*SecureBootCs- > > >SecureBootEnable); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: write secure boot enable disable fai= led: > > %r\n", __func__, Status)); > > + } else { > > + REDFISH_ENABLE_SYSTEM_REBOOT (); > > + } > > + } else { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: secure boot mode is not > > changed\n", __func__)); > > + } > > + } > > + > > +ON_RELEASE: > > + > > + // > > + // Release resource. > > + // > > + Private->JsonStructProtocol->DestoryStructure ( > > + Private->JsonStructProtocol, > > + (EFI_REST_JSON_STRUCTURE_HEADER *)Sec= ureBoot > > + ); > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Provision Redfish resource. This function reads secure boot variable= and > > convert it > > + to Redfish attribute. > > + > > + @param[in] JsonStructProtocol Pointer to Json structure protocol. > > + @param[in] InputJson Jason data on input. > > + @param[in] ResourceId Resource ID. This is optional. > > + @param[in] ConfigureLang Configure language for this Redfish > > resource. > > + @param[in] ProvisionMode TRUE when this is to provision Redf= ish > > attribute to > > + Redfish service. FALSE is to update= Redfish attribute > > + to Redfish service. > > + @param[out] ResultJson Json data on output. > > + > > + @retval EFI_SUCCESS Provision Redfish attribute success= fully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +ProvisioningSecureBootProperties ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *JsonStructProtocol, > > + IN CHAR8 *InputJson, > > + IN CHAR8 *ResourceId OPTIONAL, > > + IN EFI_STRING ConfigureLang, > > + IN BOOLEAN ProvisionMode, > > + OUT CHAR8 **ResultJson > > + ) > > +{ > > + EFI_REDFISH_SECUREBOOT_V1_1_0 *SecureBoot; > > + EFI_REDFISH_SECUREBOOT_V1_1_0_CS *SecureBootCs; > > + EFI_STATUS Status; > > + BOOLEAN PropertyChanged; > > + CHAR8 *AsciiStringValue; > > + INT32 *IntegerValue; > > + UINT8 SetupMode; > > + BOOLEAN SecureBootEnabled; > > + BOOLEAN SecureBootEnableDisable; > > + > > + if ((JsonStructProtocol =3D=3D NULL) || (ResultJson =3D=3D NULL) || > > IS_EMPTY_STRING (InputJson) || IS_EMPTY_STRING (ConfigureLang)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s with: %s\n", > > __func__, ConfigureLang, (ProvisionMode ? L"Provision resource" : L"Upd= ate > > resource"))); > > + > > + *ResultJson =3D NULL; > > + PropertyChanged =3D FALSE; > > + AsciiStringValue =3D NULL; > > + IntegerValue =3D NULL; > > + SecureBootEnableDisable =3D RedfishReadSecureBootEnable (); > > + SecureBootEnabled =3D IsSecureBootEnabled (); > > + > > + SecureBoot =3D NULL; > > + Status =3D JsonStructProtocol->ToStructure ( > > + JsonStructProtocol, > > + NULL, > > + InputJson, > > + (EFI_REST_JSON_STRUCTURE_HEADER > > **)&SecureBoot > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: ToStructure failure: %r\n", __func__, > > Status)); > > + return Status; > > + } > > + > > + SecureBootCs =3D SecureBoot->SecureBoot; > > + > > + // > > + // ID > > + // > > + if (SecureBootCs->Id !=3D NULL) { > > + SecureBootCs->Id =3D NULL; > > + } > > + > > + // > > + // Name > > + // > > + if (SecureBootCs->Name !=3D NULL) { > > + SecureBootCs->Name =3D NULL; > > + } > > + > > + // > > + // Secure boot variables that we will handle here > > + // > > + // EFI_SETUP_MODE_NAME (gEfiGlobalVariableGuid) > > + // EFI_SECURE_BOOT_MODE_NAME (gEfiGlobalVariableGuid) > > + // EFI_SECURE_BOOT_ENABLE_NAME (gEfiSecureBootEnableDisableGuid) > > + // > > + > > + // > > + // Current Boot > > + // > > + if (PropertyChecker (SecureBootCs->SecureBootCurrentBoot, > > ProvisionMode)) { > > + AsciiStringValue =3D AllocateZeroPool (SECURE_BOOT_MODE_STR_LEN * > > sizeof (CHAR8)); > > + if (AsciiStringValue !=3D NULL) { > > + AsciiSPrint (AsciiStringValue, SECURE_BOOT_MODE_STR_LEN, "%a", > > (SecureBootEnabled ? SECURE_BOOT_ENABLED : SECURE_BOOT_DISABLED)); > > + if (ProvisionMode || (AsciiStrCmp (SecureBootCs- > > >SecureBootCurrentBoot, AsciiStringValue) !=3D 0)) { > > + SecureBootCs->SecureBootCurrentBoot =3D AsciiStringValue; > > + PropertyChanged =3D TRUE; > > + } else { > > + FreePool (AsciiStringValue); > > + } > > + } else { > > + DEBUG ((DEBUG_ERROR, "%a: out of resource\n", __func__)); > > + } > > + } > > + > > + // > > + // Secure boot enable > > + // > > + if (PropertyChecker (SecureBootCs->SecureBootEnable, ProvisionMode))= { > > + if (ProvisionMode || (*SecureBootCs->SecureBootEnable !=3D > > SecureBootEnableDisable)) { > > + IntegerValue =3D AllocatePool (sizeof (*IntegerValue)); > > + if (IntegerValue !=3D NULL) { > > + *IntegerValue =3D (SecureBootEnableDisable ? = 0x01 : 0x00); > > + SecureBootCs->SecureBootEnable =3D IntegerValue; > > + PropertyChanged =3D TRUE; > > + } else { > > + DEBUG ((DEBUG_ERROR, "%a: out of resource\n", __func__)); > > + } > > + } > > + } > > + > > + // > > + // Secure boot mode > > + // > > + if (PropertyChecker (SecureBootCs->SecureBootMode, ProvisionMode)) { > > + Status =3D GetSetupMode (&SetupMode); > > + if (!EFI_ERROR (Status)) { > > + AsciiStringValue =3D AllocateZeroPool (SECURE_BOOT_MODE_STR_LEN > > *sizeof (CHAR8)); > > + if (AsciiStringValue !=3D NULL) { > > + AsciiSPrint (AsciiStringValue, SECURE_BOOT_MODE_STR_LEN *sizeo= f > > (CHAR8), "%a", (SetupMode =3D=3D USER_MODE ? SECURE_BOOT_USER_MODE : > > SECURE_BOOT_SETUP_MODE)); > > + if (ProvisionMode || (AsciiStrCmp (SecureBootCs->SecureBootMod= e, > > AsciiStringValue) !=3D 0)) { > > + SecureBootCs->SecureBootMode =3D AsciiStringValue; > > + PropertyChanged =3D TRUE; > > + } else { > > + FreePool (AsciiStringValue); > > + } > > + } > > + } else { > > + DEBUG ((DEBUG_ERROR, "%a: cannot read setup mode: %r\n", > > __func__, Status)); > > + } > > + } > > + > > + // > > + // Convert C structure back to JSON text. > > + // > > + Status =3D JsonStructProtocol->ToJson ( > > + JsonStructProtocol, > > + (EFI_REST_JSON_STRUCTURE_HEADER *)Sec= ureBoot, > > + ResultJson > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: ToJson() failed: %r\n", __func__, Status= )); > > + } > > + > > + // > > + // Release resource. > > + // > > + JsonStructProtocol->DestoryStructure ( > > + JsonStructProtocol, > > + (EFI_REST_JSON_STRUCTURE_HEADER *)SecureBoot > > + ); > > + > > + if (EFI_ERROR (Status)) { > > + return Status; > > + } > > + > > + return (PropertyChanged ? EFI_SUCCESS : EFI_NOT_FOUND); > > +} > > + > > +/** > > + Provision Redfish resource and upload data to Redfish service. This > > function > > + checks OEM data and platform addendum data before sending data to > > Redfish service. > > + > > + @param[in] Private Pointer to private data. > > + > > + @retval EFI_SUCCESS Provision Redfish resource successf= ully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +ProvisioningSecureBootResource ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private > > + ) > > +{ > > + EFI_STATUS Status; > > + CHAR8 *Json; > > + CHAR8 *JsonWithAddendum; > > + REDFISH_RESPONSE Response; > > + > > + if (Private =3D=3D NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + ZeroMem (&Response, sizeof (REDFISH_RESPONSE)); > > + Json =3D NULL; > > + > > + Status =3D ProvisioningSecureBootProperties ( > > + Private->JsonStructProtocol, > > + SecureBootEmptyJson, > > + NULL, > > + REDFISH_DUMMY_CONFIG_LANG, > > + TRUE, > > + &Json > > + ); > > + if (EFI_ERROR (Status)) { > > + if (Status =3D=3D EFI_NOT_FOUND) { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: provisioning existing resource= for > > %s ignored. Nothing changed\n", __func__, > > REDFISH_DUMMY_CONFIG_LANG)); > > + Status =3D EFI_SUCCESS; > > + } else { > > + DEBUG ((DEBUG_ERROR, "%a: provisioning existing resource for %s > > failed: %r\n", __func__, REDFISH_DUMMY_CONFIG_LANG, Status)); > > + } > > + > > + goto ON_RELEASE; > > + } > > + > > + // > > + // Check and see if platform has OEM data or not > > + // > > + Status =3D RedfishGetOemData ( > > + Private->Uri, > > + RESOURCE_SCHEMA, > > + RESOURCE_SCHEMA_VERSION, > > + Json, > > + &JsonWithAddendum > > + ); > > + if (!EFI_ERROR (Status) && (JsonWithAddendum !=3D NULL)) { > > + FreePool (Json); > > + Json =3D JsonWithAddendum; > > + JsonWithAddendum =3D NULL; > > + } > > + > > + // > > + // Check and see if platform has addendum data or not > > + // > > + Status =3D RedfishGetAddendumData ( > > + Private->Uri, > > + RESOURCE_SCHEMA, > > + RESOURCE_SCHEMA_VERSION, > > + Json, > > + &JsonWithAddendum > > + ); > > + if (!EFI_ERROR (Status) && (JsonWithAddendum !=3D NULL)) { > > + FreePool (Json); > > + Json =3D JsonWithAddendum; > > + JsonWithAddendum =3D NULL; > > + } > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: provisioning existing resource for > > %s\n", __func__, REDFISH_DUMMY_CONFIG_LANG)); > > + > > + // > > + // PATCH back to instance > > + // > > + Status =3D RedfishHttpPatchResource (Private->RedfishService, Privat= e->Uri, > > Json, &Response); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: patch resource for %s failed: %r\n", > > __func__, REDFISH_DUMMY_CONFIG_LANG, Status)); > > + } > > + > > +ON_RELEASE: > > + > > + if (Json !=3D NULL) { > > + FreePool (Json); > > + } > > + > > + RedfishHttpFreeResponse (&Response); > > + > > + return Status; > > +} > > + > > +/** > > + Provisioning redfish resource to Redfish service. > > + > > + @param[in] Private Pointer to private data. > > + @param[in] ResourceExist This is not used in Redfish secure > > + boot resource. > > + > > + @retval EFI_SUCCESS Provision resource successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +RedfishProvisioningResourceCommon ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private, > > + IN BOOLEAN ResourceExist > > + ) > > +{ > > + if (Private =3D=3D NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + return ProvisioningSecureBootResource (Private); > > +} > > + > > +/** > > + Check resource from given Json data. > > + > > + @param[in] This Pointer to > > REDFISH_RESOURCE_COMMON_PRIVATE instance. > > + @param[in] Json The JSON data to check. > > + @param[in] HeaderEtag The Etag string returned in HTTP he= ader. > > + > > + @retval EFI_SUCCESS Check resource successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +RedfishCheckResourceCommon ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private, > > + IN CHAR8 *Json, > > + IN CHAR8 *HeaderEtag OPTIONAL > > + ) > > +{ > > + UINTN Index; > > + EFI_STATUS Status; > > + UINTN Count; > > + EFI_STRING Property; > > + > > + if ((Private =3D=3D NULL) || IS_EMPTY_STRING (Json)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Check ETAG to see if we need to check it > > + // > > + if (CheckEtag (Private->Uri, HeaderEtag, NULL)) { > > + // > > + // No change > > + // > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: ETAG: %s has no change, ignore > > check action\n", __func__, Private->Uri)); > > + return EFI_SUCCESS; > > + } > > + > > + Count =3D sizeof (mSecureBootSupportedAttributes) / sizeof > > (mSecureBootSupportedAttributes[0]); > > + if (Count =3D=3D 0) { > > + return EFI_UNSUPPORTED; > > + } > > + > > + Status =3D EFI_SUCCESS; > > + for (Index =3D 0; Index < Count; Index++) { > > + Property =3D mSecureBootSupportedAttributes[Index]; > > + if (Property =3D=3D NULL) { > > + continue; > > + } > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: [%d] check attribute for: %s\n", > > __func__, Index, Property)); > > + if (!MatchPropertyWithJsonContext (Property, Json)) { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: property is missing: %s\n", > > __func__, Property)); > > + Status =3D EFI_NOT_FOUND; > > + break; > > + } > > + } > > + > > + return Status; > > +} > > + > > +/** > > + Update resource to Redfish service. > > + > > + @param[in] Private Pointer to > > REDFISH_RESOURCE_COMMON_PRIVATE instance. > > + @param[in] Json The JSON data to be updated. > > + > > + @retval EFI_SUCCESS Update resource successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +RedfishUpdateResourceCommon ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private, > > + IN CHAR8 *InputJson > > + ) > > +{ > > + EFI_STATUS Status; > > + CHAR8 *Json; > > + CHAR8 *JsonWithAddendum; > > + REDFISH_RESPONSE Response; > > + > > + if ((Private =3D=3D NULL) || IS_EMPTY_STRING (InputJson)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + ZeroMem (&Response, sizeof (REDFISH_RESPONSE)); > > + Json =3D NULL; > > + > > + Status =3D ProvisioningSecureBootProperties ( > > + Private->JsonStructProtocol, > > + SecureBootEmptyJson, > > + NULL, > > + REDFISH_DUMMY_CONFIG_LANG, > > + TRUE, > > + &Json > > + ); > > + if (EFI_ERROR (Status)) { > > + if (Status =3D=3D EFI_NOT_FOUND) { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: update resource for %s ignored= . > > Nothing changed\n", __func__, REDFISH_DUMMY_CONFIG_LANG)); > > + Status =3D EFI_SUCCESS; > > + } else { > > + DEBUG ((DEBUG_ERROR, "%a: update resource for %s failed: %r\n", > > __func__, REDFISH_DUMMY_CONFIG_LANG, Status)); > > + } > > + > > + goto ON_RELEASE; > > + } > > + > > + // > > + // Check and see if platform has OEM data or not > > + // > > + Status =3D RedfishGetOemData ( > > + Private->Uri, > > + RESOURCE_SCHEMA, > > + RESOURCE_SCHEMA_VERSION, > > + Json, > > + &JsonWithAddendum > > + ); > > + if (!EFI_ERROR (Status) && (JsonWithAddendum !=3D NULL)) { > > + FreePool (Json); > > + Json =3D JsonWithAddendum; > > + JsonWithAddendum =3D NULL; > > + } > > + > > + // > > + // Check and see if platform has addendum data or not > > + // > > + Status =3D RedfishGetAddendumData ( > > + Private->Uri, > > + RESOURCE_SCHEMA, > > + RESOURCE_SCHEMA_VERSION, > > + Json, > > + &JsonWithAddendum > > + ); > > + if (!EFI_ERROR (Status) && (JsonWithAddendum !=3D NULL)) { > > + FreePool (Json); > > + Json =3D JsonWithAddendum; > > + JsonWithAddendum =3D NULL; > > + } > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: update resource for %s\n", > > __func__, REDFISH_DUMMY_CONFIG_LANG)); > > + > > + // > > + // PATCH back to instance > > + // > > + Status =3D RedfishHttpPatchResource (Private->RedfishService, Privat= e->Uri, > > Json, &Response); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: patch resource for %s failed: %r\n", > > __func__, REDFISH_DUMMY_CONFIG_LANG, Status)); > > + } > > + > > +ON_RELEASE: > > + > > + if (Json !=3D NULL) { > > + FreePool (Json); > > + } > > + > > + RedfishHttpFreeResponse (&Response); > > + > > + return Status; > > +} > > + > > +/** > > + Identify resource in given Json data. > > + > > + @param[in] Private Pointer to > > REDFISH_RESOURCE_COMMON_PRIVATE instance. > > + @param[in] Json The JSON to be identified. > > + > > + @retval EFI_SUCCESS Identify resource successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +RedfishIdentifyResourceCommon ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private, > > + IN CHAR8 *Json > > + ) > > +{ > > + BOOLEAN Supported; > > + > > + Supported =3D RedfishIdentifyResource (Private->Uri, Private->Json); > > + if (Supported) { > > + // > > + // Keep URI and ConfigLang mapping > > + // > > + RedfishSetRedfishUri (REDFISH_DUMMY_CONFIG_LANG, Private->Uri); > > + } > > + > > + return (Supported ? EFI_SUCCESS : EFI_UNSUPPORTED); > > +} > > + > > +/** > > + Handle Redfish resource in Uri. > > + > > + @param[in] Private Pointer to > > REDFISH_RESOURCE_COMMON_PRIVATE instance. > > + @param[in] Uri URI to Redfish resource that we lik= e to process. > > + > > + @retval EFI_SUCCESS Handle resource successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +HandleResource ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private, > > + IN EFI_STRING Uri > > + ) > > +{ > > + EFI_STATUS Status; > > + REDFISH_SCHEMA_INFO SchemaInfo; > > + EFI_STRING ConfigLang; > > + > > + if ((Private =3D=3D NULL) || IS_EMPTY_STRING (Uri)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Resource match > > + // > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: process resource for: %s\n", > > __func__, Uri)); > > + > > + Status =3D GetRedfishSchemaInfo (Private->RedfishService, Private- > > >JsonStructProtocol, Uri, NULL, &SchemaInfo); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to get schema information from: %= s > > %r\n", __func__, Uri, Status)); > > + return Status; > > + } > > + > > + // > > + // Check and see if this is target resource that we want to handle. > > + // Some resource is handled by other provider so we have to make sur= e > > this first. > > + // > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: Identify for %s\n", __func__, Uri)= ); > > + ConfigLang =3D RedfishGetConfigLanguage (Uri); > > + if (ConfigLang =3D=3D NULL) { > > + Status =3D EdkIIRedfishResourceConfigIdentify (&SchemaInfo, Uri, N= ULL, > > Private->InformationExchange); > > + if (EFI_ERROR (Status)) { > > + if (Status =3D=3D EFI_UNSUPPORTED) { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: \"%s\" is not handled by us\= n", > > __func__, Uri)); > > + return EFI_SUCCESS; > > + } else if (Status =3D=3D EFI_NOT_FOUND) { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: \"%s\" has nothing to > > handle\n", __func__, Uri)); > > + return EFI_SUCCESS; > > + } > > + > > + DEBUG ((DEBUG_ERROR, "%a: fail to identify resource: \"%s\": %r\= n", > > __func__, Uri, Status)); > > + return Status; > > + } > > + } else { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: history record found: %s\n", > > __func__, ConfigLang)); > > + FreePool (ConfigLang); > > + } > > + > > + // > > + // Check and see if target property exist or not even when collectio= n > > member exists. > > + // If not, we still do provision. > > + // > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a Check for %s\n", __func__, Uri)); > > + Status =3D EdkIIRedfishResourceConfigCheck (&SchemaInfo, Uri, NULL); > > + if (EFI_ERROR (Status)) { > > + if (Status =3D=3D EFI_UNSUPPORTED) { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: \"%s\" is not handled by us\n"= , > > __func__, Uri)); > > + return EFI_SUCCESS; > > + } > > + > > + // > > + // The target property does not exist, do the provision to create = property. > > + // > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, > > Uri)); > > + Status =3D EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, Ur= i, NULL, > > Private->InformationExchange, FALSE); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to provision with GET mode: %r\= n", > > __func__, Status)); > > + } > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: process resource for: %s > > finished\n", __func__, Uri)); > > + > > + return Status; > > + } > > + > > + // > > + // Consume first. > > + // > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a consume for %s\n", __func__, Uri)); > > + Status =3D EdkIIRedfishResourceConfigConsume (&SchemaInfo, Uri, NULL= ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to consume resource for: %s: %r\n= ", > > __func__, Uri, Status)); > > + } > > + > > + // > > + // Patch. > > + // > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a update for %s\n", __func__, Uri)); > > + Status =3D EdkIIRedfishResourceConfigUpdate (&SchemaInfo, Uri, NULL)= ; > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to update resource for: %s: %r\n"= , > > __func__, Uri, Status)); > > + } > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: process resource for: %s > > finished\n", __func__, Uri)); > > + > > + return Status; > > +} > > diff --git > > a/RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.c > > b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.c > > new file mode 100644 > > index 000000000..31801ac72 > > --- /dev/null > > +++ b/RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.c > > @@ -0,0 +1,809 @@ > > +/** @file > > + Redfish feature driver implementation - SecureBoot > > + > > + (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP > > + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > > reserved. > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#include "../Common/SecureBootCommon.h" > > + > > +extern REDFISH_RESOURCE_COMMON_PRIVATE *mRedfishResourcePrivate; > > +extern EFI_HANDLE mRedfishResourceConfigProtocol= Handle; > > + > > +EFI_STATUS > > +HandleResource ( > > + IN REDFISH_RESOURCE_COMMON_PRIVATE *Private, > > + IN EFI_STRING Uri > > + ); > > + > > +/** > > + Provisioning redfish resource by given URI. > > + > > + @param[in] This Pointer to EFI_HP_REDFISH_HII_PROTO= COL > > instance. > > + @param[in] Uri Target URI to create resource. > > + @param[in] PostMode TRUE if the resource does not exist= , post > > method is used. > > + FALSE if the resource exist but pro= perty is missing, > > patch method is used. > > + > > + @retval EFI_SUCCESS Value is returned successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceProvisioningResource ( > > + IN EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL *This, > > + IN EFI_STRING Uri, > > + IN BOOLEAN PostMode > > + ) > > +{ > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + EFI_STATUS Status; > > + REDFISH_RESPONSE Response; > > + > > + if ((This =3D=3D NULL) || IS_EMPTY_STRING (Uri)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: provisioning in %s mode\n", > > __func__, (PostMode ? L"POST" : L"PATCH"))); > > + > > + ZeroMem (&Response, sizeof (REDFISH_RESPONSE)); > > + Private =3D > > > REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTOCOL > > (This); > > + > > + if (Private->RedfishService =3D=3D NULL) { > > + return EFI_NOT_READY; > > + } > > + > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, NUL= L, > > &Response, TRUE); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func_= _, > > Uri)); > > + return Status; > > + } > > + > > + Private->Uri =3D Uri; > > + Private->Payload =3D Response.Payload; > > + ASSERT (Private->Payload !=3D NULL); > > + > > + Status =3D RedfishProvisioningResourceCommon (Private, !PostMode); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to provision resource to: %s: %r\= n", > > __func__, Uri, Status)); > > + } else { > > + // > > + // Get latest ETag on URI and keep it in variable. > > + // > > + SetEtagFromUri (Private->RedfishService, Private->Uri, TRUE); > > + } > > + > > + // > > + // Release resource > > + // > > + RedfishHttpFreeResponse (&Response); > > + Private->Payload =3D NULL; > > + > > + return Status; > > +} > > + > > +/** > > + Consume resource from given URI. > > + > > + @param[in] This Pointer to EFI_HP_REDFISH_HII_PROTO= COL > > instance. > > + @param[in] Uri The target URI to consume. > > + > > + @retval EFI_SUCCESS Value is returned successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceConsumeResource ( > > + IN EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL *This, > > + IN EFI_STRING Uri > > + ) > > +{ > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + EFI_STATUS Status; > > + REDFISH_RESPONSE Response; > > + EFI_STRING PendingSettingUri; > > + REDFISH_RESPONSE PendingSettingResponse; > > + REDFISH_RESPONSE *ExpectedResponse; > > + CHAR8 *Etag; > > + > > + if ((This =3D=3D NULL) || IS_EMPTY_STRING (Uri)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + ZeroMem (&Response, sizeof (REDFISH_RESPONSE)); > > + ZeroMem (&PendingSettingResponse, sizeof (REDFISH_RESPONSE)); > > + Private =3D > > > REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTOCOL > > (This); > > + > > + if (Private->RedfishService =3D=3D NULL) { > > + return EFI_NOT_READY; > > + } > > + > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, NUL= L, > > &Response, TRUE); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func_= _, > > Uri)); > > + return Status; > > + } > > + > > + // > > + // Check and see if "@Redfish.Settings" exist or not. > > + // > > + PendingSettingUri =3D NULL; > > + Status =3D GetPendingSettings ( > > + Private->RedfishService, > > + Response.Payload, > > + &PendingSettingResponse, > > + &PendingSettingUri > > + ); > > + if (!EFI_ERROR (Status)) { > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a: @Redfish.Settings found: %s\n", > > __func__, PendingSettingUri)); > > + SetRedfishSettingsObjectsUri (Uri, PendingSettingUri); > > + Private->Uri =3D PendingSettingUri; > > + ExpectedResponse =3D &PendingSettingResponse; > > + } else { > > + Private->Uri =3D Uri; > > + ExpectedResponse =3D &Response; > > + } > > + > > + Private->Payload =3D ExpectedResponse->Payload; > > + ASSERT (Private->Payload !=3D NULL); > > + > > + Private->Json =3D JsonDumpString (RedfishJsonInPayload (Private->Pay= load), > > EDKII_JSON_COMPACT); > > + ASSERT (Private->Json !=3D NULL); > > + > > + // > > + // Searching for etag in HTTP response header > > + // > > + Etag =3D NULL; > > + Status =3D GetHttpResponseEtag (ExpectedResponse, &Etag); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n", > > __func__)); > > + } > > + > > + Status =3D RedfishConsumeResourceCommon (Private, Private->Json, Eta= g); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to consume resource from: %s: > > %r\n", __func__, Private->Uri, Status)); > > + } > > + > > + // > > + // Release resource > > + // > > + RedfishHttpFreeResponse (&Response); > > + RedfishHttpFreeResponse (&PendingSettingResponse); > > + Private->Payload =3D NULL; > > + > > + if (Private->Json !=3D NULL) { > > + FreePool (Private->Json); > > + Private->Json =3D NULL; > > + } > > + > > + if (Etag !=3D NULL) { > > + FreePool (Etag); > > + } > > + > > + if (PendingSettingUri !=3D NULL) { > > + FreePool (PendingSettingUri); > > + } > > + > > + return Status; > > +} > > + > > +/** > > + Get information about this protocol. > > + > > + @param[in] This Pointer to EFI_HP_REDFISH_HII_PROTO= COL > > instance. > > + @param[out] Schema Supported schema. > > + @param[out] Major Supported major number. > > + @param[out] Minor Supported minor number. > > + @param[out] Errata Supported errata number. > > + > > + @retval EFI_SUCCESS Value is returned successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceGetInfo ( > > + IN EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL *This, > > + OUT REDFISH_SCHEMA_INFO *Info > > + ) > > +{ > > + if ((This =3D=3D NULL) || (Info =3D=3D NULL)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + AsciiStrCpyS (Info->Schema, REDFISH_SCHEMA_STRING_SIZE, > > RESOURCE_SCHEMA); > > + AsciiStrCpyS (Info->Major, REDFISH_SCHEMA_VERSION_SIZE, > > RESOURCE_SCHEMA_MAJOR); > > + AsciiStrCpyS (Info->Minor, REDFISH_SCHEMA_VERSION_SIZE, > > RESOURCE_SCHEMA_MINOR); > > + AsciiStrCpyS (Info->Errata, REDFISH_SCHEMA_VERSION_SIZE, > > RESOURCE_SCHEMA_ERRATA); > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Update resource to given URI. > > + > > + @param[in] This Pointer to EFI_HP_REDFISH_HII_PROTO= COL > > instance. > > + @param[in] Uri The target URI to consume. > > + > > + @retval EFI_SUCCESS Value is returned successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceUpdate ( > > + IN EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL *This, > > + IN EFI_STRING Uri > > + ) > > +{ > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + EFI_STATUS Status; > > + REDFISH_RESPONSE Response; > > + > > + if ((This =3D=3D NULL) || IS_EMPTY_STRING (Uri)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + ZeroMem (&Response, sizeof (REDFISH_RESPONSE)); > > + Private =3D > > > REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTOCOL > > (This); > > + > > + if (Private->RedfishService =3D=3D NULL) { > > + return EFI_NOT_READY; > > + } > > + > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, NUL= L, > > &Response, TRUE); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func_= _, > > Uri)); > > + return Status; > > + } > > + > > + Private->Uri =3D Uri; > > + Private->Payload =3D Response.Payload; > > + ASSERT (Private->Payload !=3D NULL); > > + > > + Private->Json =3D JsonDumpString (RedfishJsonInPayload (Private->Pay= load), > > EDKII_JSON_COMPACT); > > + ASSERT (Private->Json !=3D NULL); > > + > > + Status =3D RedfishUpdateResourceCommon (Private, Private->Json); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to update resource to: %s: %r\n", > > __func__, Uri, Status)); > > + } else { > > + // > > + // Get latest ETag on URI and keep it in variable. > > + // > > + SetEtagFromUri (Private->RedfishService, Private->Uri, TRUE); > > + } > > + > > + // > > + // Release resource > > + // > > + RedfishHttpFreeResponse (&Response); > > + Private->Payload =3D NULL; > > + > > + if (Private->Json !=3D NULL) { > > + FreePool (Private->Json); > > + Private->Json =3D NULL; > > + } > > + > > + return Status; > > +} > > + > > +/** > > + Check resource on given URI. > > + > > + @param[in] This Pointer to EFI_HP_REDFISH_HII_PROTO= COL > > instance. > > + @param[in] Uri The target URI to consume. > > + > > + @retval EFI_SUCCESS Value is returned successfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceCheck ( > > + IN EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL *This, > > + IN EFI_STRING Uri > > + ) > > +{ > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + EFI_STATUS Status; > > + REDFISH_RESPONSE Response; > > + CHAR8 *Etag; > > + > > + if ((This =3D=3D NULL) || IS_EMPTY_STRING (Uri)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + ZeroMem (&Response, sizeof (REDFISH_RESPONSE)); > > + Private =3D > > > REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTOCOL > > (This); > > + > > + if (Private->RedfishService =3D=3D NULL) { > > + return EFI_NOT_READY; > > + } > > + > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, NUL= L, > > &Response, TRUE); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func_= _, > > Uri)); > > + return Status; > > + } > > + > > + Private->Uri =3D Uri; > > + Private->Payload =3D Response.Payload; > > + ASSERT (Private->Payload !=3D NULL); > > + > > + Private->Json =3D JsonDumpString (RedfishJsonInPayload (Private->Pay= load), > > EDKII_JSON_COMPACT); > > + ASSERT (Private->Json !=3D NULL); > > + > > + // > > + // Find etag in HTTP response header > > + // > > + Etag =3D NULL; > > + Status =3D GetHttpResponseEtag (&Response, &Etag); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n", > > __func__)); > > + } > > + > > + Status =3D RedfishCheckResourceCommon (Private, Private->Json, Etag)= ; > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to check resource from: %s: %r\n"= , > > __func__, Uri, Status)); > > + } > > + > > + // > > + // Release resource > > + // > > + if (Etag !=3D NULL) { > > + FreePool (Etag); > > + } > > + > > + RedfishHttpFreeResponse (&Response); > > + Private->Payload =3D NULL; > > + > > + if (Private->Json !=3D NULL) { > > + FreePool (Private->Json); > > + Private->Json =3D NULL; > > + } > > + > > + return Status; > > +} > > + > > +/** > > + Identify resource on given URI. > > + > > + @param[in] This Pointer to > > EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL instance. > > + @param[in] Uri The target URI to consume. > > + > > + @retval EFI_SUCCESS This is target resource which we wa= nt to > > handle. > > + @retval EFI_UNSUPPORTED This is not the target resource. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceIdentify ( > > + IN EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL *This, > > + IN EFI_STRING Uri > > + ) > > +{ > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + EFI_STATUS Status; > > + REDFISH_RESPONSE Response; > > + > > + if ((This =3D=3D NULL) || IS_EMPTY_STRING (Uri)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + ZeroMem (&Response, sizeof (REDFISH_RESPONSE)); > > + Private =3D > > > REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_RESOURCE_PROTOCOL > > (This); > > + > > + if (Private->RedfishService =3D=3D NULL) { > > + return EFI_NOT_READY; > > + } > > + > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, NUL= L, > > &Response, TRUE); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n", __func_= _, > > Uri)); > > + return Status; > > + } > > + > > + Private->Uri =3D Uri; > > + Private->Payload =3D Response.Payload; > > + ASSERT (Private->Payload !=3D NULL); > > + > > + Private->Json =3D JsonDumpString (RedfishJsonInPayload (Private->Pay= load), > > EDKII_JSON_COMPACT); > > + ASSERT (Private->Json !=3D NULL); > > + > > + Status =3D RedfishIdentifyResourceCommon (Private, Private->Json); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: identify %s failed: %r\n", __func__, Uri= , > > Status)); > > + } > > + > > + // > > + // Release resource > > + // > > + RedfishHttpFreeResponse (&Response); > > + Private->Payload =3D NULL; > > + > > + if (Private->Json !=3D NULL) { > > + FreePool (Private->Json); > > + Private->Json =3D NULL; > > + } > > + > > + return Status; > > +} > > + > > +EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL mRedfishResourceConfig =3D { > > + RedfishResourceProvisioningResource, > > + RedfishResourceConsumeResource, > > + RedfishResourceUpdate, > > + RedfishResourceCheck, > > + RedfishResourceIdentify, > > + RedfishResourceGetInfo > > +}; > > + > > +/** > > + Initialize a Redfish configure handler. > > + > > + This function will be called by the Redfish config driver to initial= ize each > > Redfish configure > > + handler. > > + > > + @param[in] This Pointer to > > EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL instance. > > + @param[in] RedfishConfigServiceInfo Redfish service information. > > + > > + @retval EFI_SUCCESS The handler has been initialize= d > > successfully. > > + @retval EFI_DEVICE_ERROR Failed to create or configure t= he REST > > EX protocol instance. > > + @retval EFI_ALREADY_STARTED This handler has already been > > initialized. > > + @retval Other Error happens during the initia= lization. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceInit ( > > + IN EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL *This, > > + IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo > > + ) > > +{ > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + > > + Private =3D > > REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_CONFIG_PROTOCOL > > (This); > > + > > + Private->RedfishService =3D RedfishCreateService (RedfishConfigServi= ceInfo); > > + if (Private->RedfishService =3D=3D NULL) { > > + return EFI_DEVICE_ERROR; > > + } > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Stop a Redfish configure handler. > > + > > + @param[in] This Pointer to > > EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL instance. > > + > > + @retval EFI_SUCCESS This handler has been stoped succes= sfully. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceStop ( > > + IN EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL *This > > + ) > > +{ > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + > > + Private =3D > > REDFISH_RESOURCE_COMMON_PRIVATE_DATA_FROM_CONFIG_PROTOCOL > > (This); > > + > > + if (Private->Event !=3D NULL) { > > + gBS->CloseEvent (Private->Event); > > + Private->Event =3D NULL; > > + } > > + > > + if (Private->RedfishService !=3D NULL) { > > + RedfishCleanupService (Private->RedfishService); > > + Private->RedfishService =3D NULL; > > + } > > + > > + return EFI_SUCCESS; > > +} > > + > > +EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL mRedfishConfigHandler =3D { > > + RedfishResourceInit, > > + RedfishResourceStop > > +}; > > + > > +/** > > + Callback function when gEfiRestJsonStructureProtocolGuid is installe= d. > > + > > + @param[in] Event Event whose notification function is being invok= ed. > > + @param[in] Context Pointer to the notification function's context. > > +**/ > > +VOID > > +EFIAPI > > +EfiRestJsonStructureProtocolIsReady ( > > + IN EFI_EVENT Event, > > + IN VOID *Context > > + ) > > +{ > > + EFI_STATUS Status; > > + > > + if (mRedfishResourcePrivate =3D=3D NULL) { > > + return; > > + } > > + > > + if (mRedfishResourcePrivate->JsonStructProtocol !=3D NULL) { > > + return; > > + } > > + > > + Status =3D gBS->LocateProtocol ( > > + &gEfiRestJsonStructureProtocolGuid, > > + NULL, > > + (VOID **)&mRedfishResourcePrivate->JsonStructProtoco= l > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to locate > > gEfiRestJsonStructureProtocolGuid: %r\n", __func__, Status)); > > + } > > + > > + gBS->CloseEvent (Event); > > +} > > + > > +/** > > + Unloads an image. > > + > > + @param ImageHandle Handle that identifies the image to be > > unloaded. > > + > > + @retval EFI_SUCCESS The image has been unloaded. > > + @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image > > handle. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceUnload ( > > + IN EFI_HANDLE ImageHandle > > + ) > > +{ > > + EFI_STATUS Status; > > + EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL *ConfigHandler; > > + > > + if (mRedfishResourcePrivate =3D=3D NULL) { > > + return EFI_NOT_READY; > > + } > > + > > + ConfigHandler =3D NULL; > > + > > + // > > + // Firstly, find ConfigHandler Protocol interface in this ImageHandl= e. > > + // > > + Status =3D gBS->OpenProtocol ( > > + ImageHandle, > > + &gEdkIIRedfishConfigHandlerProtocolGuid, > > + (VOID **)&ConfigHandler, > > + NULL, > > + NULL, > > + EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL > > + ); > > + if (EFI_ERROR (Status) || (ConfigHandler =3D=3D NULL)) { > > + return Status; > > + } > > + > > + ConfigHandler->Stop (ConfigHandler); > > + > > + // > > + // Last, uninstall ConfigHandler Protocol and resource protocol. > > + // > > + Status =3D gBS->UninstallMultipleProtocolInterfaces ( > > + ImageHandle, > > + &gEdkIIRedfishConfigHandlerProtocolGuid, > > + ConfigHandler, > > + &gEdkIIRedfishResourceConfigProtocolGuid, > > + &mRedfishResourcePrivate->RedfishResourceConfig, > > + NULL > > + ); > > + > > + FreePool (mRedfishResourcePrivate); > > + mRedfishResourcePrivate =3D NULL; > > + > > + return Status; > > +} > > + > > +/** > > + The callback function provided by Redfish Feature driver. > > + > > + @param[in] This Pointer to EDKII_REDFISH_FEATURE_= PROTOCOL > > instance. > > + @param[in] FeatureAction The action Redfish feature driver= should > > take. > > + @param[in] Uri The collection URI. > > + @param[in] Context The context of Redfish feature dr= iver. > > + @param[in,out] InformationExchange The pointer to > > RESOURCE_INFORMATION_EXCHANGE > > + > > + @retval EFI_SUCCESS Redfish feature driver callback is = executed > > successfully. > > + @retval Others Some errors happened. > > + > > + @retval EFI_SUCCESS Redfish feature driver callback is = executed > > successfully. > > + @retval Others Some errors happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishExternalResourceResourceFeatureCallback ( > > + IN EDKII_REDFISH_FEATURE_PROTOCOL *This, > > + IN FEATURE_CALLBACK_ACTION FeatureAction, > > + IN VOID *Context, > > + IN OUT RESOURCE_INFORMATION_EXCHANGE *InformationExchange > > + ) > > +{ > > + EFI_STATUS Status; > > + REDFISH_SERVICE RedfishService; > > + REDFISH_RESOURCE_COMMON_PRIVATE *Private; > > + EFI_STRING ResourceUri; > > + EFI_STRING SecureBootUri; > > + > > + if (FeatureAction !=3D CallbackActionStartOperation) { > > + return EFI_UNSUPPORTED; > > + } > > + > > + Private =3D (REDFISH_RESOURCE_COMMON_PRIVATE *)Context; > > + > > + RedfishService =3D Private->RedfishService; > > + if (RedfishService =3D=3D NULL) { > > + DEBUG ((DEBUG_ERROR, "%a: no Redfish service configured\n", > > __func__)); > > + return EFI_NOT_READY; > > + } > > + > > + // > > + // Save in private structure. > > + // > > + Private->InformationExchange =3D InformationExchange; > > + > > + // > > + // Find Redfish version on Redfish ser > > + // > > + Private->RedfishVersion =3D RedfishGetVersion (RedfishService); > > + > > + // > > + // Create the full URI from Redfish service root. > > + // > > + ResourceUri =3D (EFI_STRING)AllocateZeroPool (MAX_URI_LENGTH * sizeo= f > > (CHAR16)); > > + if (ResourceUri =3D=3D NULL) { > > + DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for full URI.\n"= , > > __func__)); > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + StrCatS (ResourceUri, MAX_URI_LENGTH, Private->RedfishVersion); > > + StrCatS (ResourceUri, MAX_URI_LENGTH, InformationExchange- > > >SendInformation.FullUri); > > + > > + // > > + // Initialize collection path > > + // > > + SecureBootUri =3D RedfishGetUri (ResourceUri); > > + if (SecureBootUri =3D=3D NULL) { > > + ASSERT (FALSE); > > + FreePool (ResourceUri); > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + Status =3D HandleResource (Private, SecureBootUri); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: process external resource: %s failed: %r= \n", > > __func__, SecureBootUri, Status)); > > + } > > + > > + FreePool (SecureBootUri); > > + FreePool (ResourceUri); > > + return Status; > > +} > > + > > +/** > > + Callback function when gEdkIIRedfishFeatureProtocolGuid is installed= . > > + > > + @param[in] Event Event whose notification function is being invok= ed. > > + @param[in] Context Pointer to the notification function's context. > > +**/ > > +VOID > > +EFIAPI > > +EdkIIRedfishFeatureProtocolIsReady ( > > + IN EFI_EVENT Event, > > + IN VOID *Context > > + ) > > +{ > > + EFI_STATUS Status; > > + EDKII_REDFISH_FEATURE_PROTOCOL *FeatureProtocol; > > + > > + if (mRedfishResourcePrivate =3D=3D NULL) { > > + return; > > + } > > + > > + if (mRedfishResourcePrivate->FeatureProtocol !=3D NULL) { > > + return; > > + } > > + > > + Status =3D gBS->LocateProtocol ( > > + &gEdkIIRedfishFeatureProtocolGuid, > > + NULL, > > + (VOID **)&FeatureProtocol > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to locate > > gEdkIIRedfishFeatureProtocolGuid: %r\n", __func__, Status)); > > + gBS->CloseEvent (Event); > > + return; > > + } > > + > > + Status =3D FeatureProtocol->Register ( > > + FeatureProtocol, > > + REDFISH_MANAGED_URI, > > + RedfishExternalResourceResourceFeatureCa= llback, > > + (VOID *)mRedfishResourcePrivate > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: failed to register %s: %r\n", __func__, > > REDFISH_MANAGED_URI, Status)); > > + } > > + > > + mRedfishResourcePrivate->FeatureProtocol =3D FeatureProtocol; > > + > > + gBS->CloseEvent (Event); > > +} > > + > > +/** > > + This is the declaration of an EFI image entry point. This entry poin= t is > > + the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers > > including > > + both device drivers and bus drivers. It initialize the global variab= les and > > + publish the driver binding protocol. > > + > > + @param[in] ImageHandle The firmware allocated handle for the = UEFI > > image. > > + @param[in] SystemTable A pointer to the EFI System Table. > > + > > + @retval EFI_SUCCESS The operation completed successfully. > > + @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL > was > > installed unexpectedly. > > + @retval Others Other errors as indicated. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RedfishResourceEntryPoint ( > > + IN EFI_HANDLE ImageHandle, > > + IN EFI_SYSTEM_TABLE *SystemTable > > + ) > > +{ > > + EFI_STATUS Status; > > + VOID *Registration; > > + > > + if (mRedfishResourcePrivate !=3D NULL) { > > + return EFI_ALREADY_STARTED; > > + } > > + > > + mRedfishResourceConfigProtocolHandle =3D ImageHandle; > > + > > + mRedfishResourcePrivate =3D AllocateZeroPool (sizeof > > (REDFISH_RESOURCE_COMMON_PRIVATE)); > > + CopyMem (&mRedfishResourcePrivate->ConfigHandler, > > &mRedfishConfigHandler, sizeof > > (EDKII_REDFISH_CONFIG_HANDLER_PROTOCOL)); > > + CopyMem (&mRedfishResourcePrivate->RedfishResourceConfig, > > &mRedfishResourceConfig, sizeof > > (EDKII_REDFISH_RESOURCE_CONFIG_PROTOCOL)); > > + > > + // > > + // Publish config handler protocol and resource protocol. > > + // > > + Status =3D gBS->InstallMultipleProtocolInterfaces ( > > + &ImageHandle, > > + &gEdkIIRedfishConfigHandlerProtocolGuid, > > + &mRedfishResourcePrivate->ConfigHandler, > > + &gEdkIIRedfishResourceConfigProtocolGuid, > > + &mRedfishResourcePrivate->RedfishResourceConfig, > > + NULL > > + ); > > + > > + EfiCreateProtocolNotifyEvent ( > > + &gEfiRestJsonStructureProtocolGuid, > > + TPL_CALLBACK, > > + EfiRestJsonStructureProtocolIsReady, > > + NULL, > > + &Registration > > + ); > > + > > + EfiCreateProtocolNotifyEvent ( > > + &gEdkIIRedfishFeatureProtocolGuid, > > + TPL_CALLBACK, > > + EdkIIRedfishFeatureProtocolIsReady, > > + (VOID *)mRedfishResourcePrivate, > > + &Registration > > + ); > > + > > + return Status; > > +} > > diff --git a/RedfishClientPkg/RedfishClient.fdf.inc > > b/RedfishClientPkg/RedfishClient.fdf.inc > > index 59b8acba1..154f641b2 100644 > > --- a/RedfishClientPkg/RedfishClient.fdf.inc > > +++ b/RedfishClientPkg/RedfishClient.fdf.inc > > @@ -25,6 +25,7 @@ > > INF RedfishClientPkg/HiiToRedfishBiosDxe/HiiToRedfishBiosDxe.inf > > INF > > RedfishClientPkg/Features/BootOptionCollection/BootOptionCollectionDxe.= in > > f > > INF RedfishClientPkg/Features/BootOption/v1_0_4/Dxe/BootOptionDxe.in= f > > + INF RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.in= f > > > > !include RedfishClientPkg/RedfishJsonStructureDxe.fdf.inc > > # > > -- > > 2.34.1 >=20 >=20 >=20 >=20 >=20 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117581): https://edk2.groups.io/g/devel/message/117581 Mute This Topic: https://groups.io/mt/105265011/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-