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 40C39D801B0 for ; Wed, 10 Apr 2024 08:25:24 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=ORC9Xf1W4bMQBrwlGLCczcJrfomPU3fp7B/oruWjJLo=; 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=1712737522; v=1; b=0GCFwEN1ALrBdIxPx3CisI7i+5hoqY/CZmFQMQSZZNPO720tdIDEsUD2fby+oclHqRGVspfS 9Yt0vzkm3BpPdGRL2U0PW9Mti9/LtiwGNpeJDRSG4EaqWely2/r+QJ+xW3NFrfz2leYlXBWJQux oc07zPAzNKUWkLHzj7UrHBrWURgQYxSdyd9vj4ZooG1f8jUSkx3hutWPEg9LPAf9ItCr/yDG/9g u9B/BwKXXjauIMzWdTlXdn8tShRGgT4Oj5nG2w83vJm8xFxCriB4yFNkGctiLS4hMdB0HNR0gWy aLUoRsyvb+OK6f3/EO1vJq8egd4nVRyh+I1bSNTgQme7Q== X-Received: by 127.0.0.2 with SMTP id NrH3YY7687511xZpXszEn1vy; Wed, 10 Apr 2024 01:25:22 -0700 X-Received: from NAM02-BN1-obe.outbound.protection.outlook.com (NAM02-BN1-obe.outbound.protection.outlook.com [40.107.212.135]) by mx.groups.io with SMTP id smtpd.web11.161831.1712737521659916743 for ; Wed, 10 Apr 2024 01:25:22 -0700 X-Received: from LV8PR12MB9452.namprd12.prod.outlook.com (2603:10b6:408:200::8) by CY8PR12MB7681.namprd12.prod.outlook.com (2603:10b6:930:84::19) 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:25:17 +0000 X-Received: from LV8PR12MB9452.namprd12.prod.outlook.com ([fe80::e006:4173:de2c:aca0]) by LV8PR12MB9452.namprd12.prod.outlook.com ([fe80::e006:4173:de2c:aca0%5]) with mapi id 15.20.7409.042; Wed, 10 Apr 2024 08:25:16 +0000 From: "Chang, Abner via groups.io" 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 Thread-Topic: [edk2-devel] [edk2-redfish-client][PATCH v2 1/2] RedfishClientPkg/Features: support Redfish Secure Boot Thread-Index: AQHahD9zzKUQJgz1j0+ppnGEjgb6CbFgwzWggABxyKCAAAOXcA== Date: Wed, 10 Apr 2024 08:25:16 +0000 Message-ID: References: <20240401141748.38451-1-nicklew@nvidia.com> In-Reply-To: Accept-Language: en-US, zh-CN 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: LV8PR12MB9452:EE_|CY8PR12MB7681:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam-message-info: DlzsTAkRqm4gZgnhHldNg7SG2UFrPpB3hmelZUd4Lec+bprdBBH3XX3cuPZRHVlxxUJpT1UGBxU4vUcwDb3MfwT1ovAMjM6KSTSzhWQ2J1b+ewr43dlBqM1NxdmCEwqdz4thk73VCSd1yE5gya03xiVOArkgdNANAH+xb8lkIQm6AtiRwhZs33nAFOxf/pnL0T5GfCFevgFigo+mvNYe3ZFpcy351hjz3GB5/LS0P77NE7aiEika2Dpr08GdXjmdJDaOrvRftbkyLoxtpwZ11BwUcYHs6SkxPo33I4ZER8wTN2KOrrxifoeVwj+HiE2SIvA1fFYmv+fOFFlWZxkh0jbrNiomUt7dVxAmP92cVbSBX+qPMkGB5tEmB3c54vjF6XJ/z+6Td56KtmP8OhcjKxN+/vYK5R0rMl4TY7uSuKBUpbnSDZyallTbX9hmKN0tfANKnVFik/AYW1uITGAmpw09K+GGq5qFSibGABxrfc97SXYF7BOE70lr48rTfOZf3f0F4NVOPLYT7+AXqh4D9Cgb3kHZ9i0/qBdGQdMi98eNygI0aEvd1WOj26OY1wMSnksPa5FhB9s3wDI8X1EqdTlzk/EwdTUD30LaR65GcYGnrZEKNUJd42vA6Zxg1qh7+q2t2Yz/8/Pl/7ZlcRLTCpjxEqn5P0dPmNB9vF2QwF8= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?/euojtHm3ZaAY8viBPR+yUxsB1PGEmgBXZhGweE4t+0e7H2ZnO/7Tbp6ongf?= =?us-ascii?Q?fT1Q/JFmR5Q2h4DmDCWildnkEUXerNiohjQBvg3voB6ZpdkW04grXLPs6ICx?= =?us-ascii?Q?CDtJrqTYTqZc0NZ+/6k55voguCXAEGfJf5utU3bPPGsH4VkvUhSq8iLLQ5kz?= =?us-ascii?Q?kzeuLTLRCDLAUuTN9p0zSHw8mpaB75DXMuXIkkpYZoQCZpKmwjS7xU4y2j4f?= =?us-ascii?Q?AZvIQ8JZxnVzkgguJM+CQi+lsWenH3/gq/aqxggNDCJCdPKQW6VZFSSHnlZv?= =?us-ascii?Q?R7GC5dj/7znuz8V6CTYOEvGgkatYatmr1WcdMj4XLqZ6EdaGlNMAX4ipFk7k?= =?us-ascii?Q?HNoWELgAmIY3wLEPYy4KST/hANeytU763AD5+PL+4Ya61GeEZG4GDeCKs7/W?= =?us-ascii?Q?16t6Z8tGbjVbaC5ITC0R/LeFOBcF1WsHzljY2lFDHAARARk6ixyEAQPPsSD0?= =?us-ascii?Q?SYcsG4Nq+cB0qyGqOIoYbpNutFvpTmZddSSTPd+Yp7N7qjLORdPwzHNc+69o?= =?us-ascii?Q?0mKy6UU40Bj0OHD4GQN9AnahAt4ufhEtOVKTYZCpiqR6mDvqqVooBGjCfsjQ?= =?us-ascii?Q?8EQTifQmLsfZFqrGMTv9RbqkUXy7D1wofAM58Ew3y/7TYcrVqA2PSnD5ckmy?= =?us-ascii?Q?1GZwZ0avxT1LnWuM+L0B37KRmlWvkxIP3zh8A/f9JqEbBgvo2Xi65tYL5xj0?= =?us-ascii?Q?DKaZDoruRHJSBm5l8qJ4bi/VRmuF/A0R27hy6pRS/hJJbfszQWaNfM3wntRV?= =?us-ascii?Q?t6wcuz6N40vjx6pPtVdQ8Urs1LpISJS2zxJM0wqBA3hJYQDR3l4jhtNqWCHb?= =?us-ascii?Q?TXTFk1NkNKS6c7zOabfs3+pGI3sTac97mFusZ9lyiV9g7ejPS9ozMhAS/Txc?= =?us-ascii?Q?u+zZsP3071ClvNHAIL+WcfybusRGG48dGuS70aNa0e44GpQk7RYfSk2Qy+rH?= =?us-ascii?Q?7XnF6o7P694lGAke43htOufVNi3f0DS/+wn52dWLvC9Y/9eu17uBQC1aTJYZ?= =?us-ascii?Q?n/wLTIFSjj09RPCpe0fPxVBf4ba6dZqIwIU60nU+93toV8plfANOYHXq0YOd?= =?us-ascii?Q?eMgMc59BhiQUrmi8EihGYJeujIttVbj6PF6jNpYEV2UeHDFPLt3pu8FtmxzT?= =?us-ascii?Q?ce5BS1p0VZ52Z8oM4mbJuoTyuT6vvUXapBvQEQYC4MerlMQ11tJoRyEGYCH3?= =?us-ascii?Q?OObhMsPXJQT3Cbeb6FuEvrlUuWLbdKUCe9j1Cq88ftZGvbT1CfkqfQTu/xep?= =?us-ascii?Q?BKWe+HBZ1mEAWTvXjjPghIDVNdvLHURERzk8lAecrYuqQzKJ5dihZHy6/RCj?= =?us-ascii?Q?g7KqBhBdpqwlfefaO0xehFISjPwDX4yubWs6yGJZY90S/yUURQQfBUB178Wj?= =?us-ascii?Q?uKeqd4EzIUqTpRlpT2F907V9nU5Q3OW8Z/tVy6+AydG05QSlFfD+G6Fn7XL4?= =?us-ascii?Q?K+7P8wtWHLj6yuCRXQYR6dUz6M9fxOAbKkimECXmRA4LDlT5PfKBUNnP79TU?= =?us-ascii?Q?XuoWQLAyWY+IcYnm6MJOA8pvMjSY7kLHvrckRXKGlbDFRKkJBK9ZfEuNmg+P?= =?us-ascii?Q?+m1k9Snrdoz0/6Tp7v8=3D?= MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: LV8PR12MB9452.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ef5b188a-ace8-44fd-d559-08dc5937c096 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Apr 2024 08:25:16.8383 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: R1JZlqY9f+TOQEnktiMBvQJ7rmfTwqpJHKF+S2otGeHnc0Tv0uPpRgg2JzWjl1F6Xy4tSgLdIFehoBlhcJ6D3Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7681 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:25:22 -0700 Resent-From: abner.chang@amd.com Reply-To: devel@edk2.groups.io,abner.chang@amd.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: lhXYAfyelzjF1eeZzDG2P2Btx7686176AA= 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=0GCFwEN1; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=pass (policy=none) header.from=groups.io [AMD Official Use Only - General] Ok, then you can just merge this patch set. thanks Abner > -----Original Message----- > From: Nickle Wang > Sent: Wednesday, April 10, 2024 4:17 PM > To: devel@edk2.groups.io; Chang, Abner > Cc: Igor Kulchytskyy ; Nick Ramirez > Subject: RE: [edk2-devel] [edk2-redfish-client][PATCH v2 1/2] > RedfishClientPkg/Features: support Redfish Secure Boot > > [AMD Official Use Only - General] > > Caution: This message originated from an External Source. Use proper caut= ion > when opening attachments, clicking links, or responding. > > > Thanks for your review, Abner! > > The reason why I keep HPE copyright statement is because I create this fe= ature > driver by copying existing one and modifying it. Since I still leverage s= ome > functions contributed by HPE, I think I am supposed to keep HPE copyright > statement. > > Regards, > Nickle > > > -----Original Message----- > > From: devel@edk2.groups.io On Behalf Of Chang, > Abner > > 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 > > > > External email: Use caution opening links or attachments > > > > > > [AMD Official Use Only - General] > > > > Hi Nickle, > > I don't see the obvious coding error in this patch. However, I think we= can > remove > > HPE copyright from Redfish secure boot feature driver, as this is a new= feature > > driver and HPE doesn't have contributions to these files, right? If so,= then > please > > remove it. > > > > Thanks > > > > Reviewed-by: Abner Chang > > > > > -----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/Feature= s: > > > 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/RedfishBootOptionCollecti > > > 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.i= n > > > f > > > > > > > BootOptionCollectionLib|RedfishClientPkg/ConverterLib/edk2library/BootOp > > > tionCollection/Lib.inf > > > > > > > BootOptionV1_0_4Lib|RedfishClientPkg/ConverterLib/edk2library/BootOptio > > > n/v1_0_4/Lib.inf > > > + > > > > SecureBootV1_1_0Lib|RedfishClientPkg/ConverterLib/edk2library/SecureBoot > > > /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= .inf > > > RedfishHttpLib|RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.in= f > > > + > > > > SecureBootVariableLib|SecurityPkg/Library/SecureBootVariableLib/SecureBo > > > otVariableLib.inf > > > + > > > > PlatformPKProtectionLib|SecurityPkg/Library/PlatformPKProtectionLibVarPol= ic > > > 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 rig= hts > > > 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 righ= ts > > > 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 righ= ts > > > reserved. > > > + > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > + > > > +**/ > > > + > > > +#include "SecureBootCommon.h" > > > + > > > +CHAR8 SecureBootEmptyJson[] =3D "{\"@odata.id\": \"\", \"@odata.typ= e\": > > > \"#SecureBoot.v1_1_0.SecureBoot\", \"Id\": \"\", \"Name\": \"\", > > > \"Attributes\":{}}"; > > > + > > > +REDFISH_RESOURCE_COMMON_PRIVATE *mRedfishResourcePrivate > > > =3D NULL; > > > +EFI_HANDLE mRedfishResourceConfigProtocolHandl= e > > > =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 = header. > > > + > > > + @retval EFI_SUCCESS Consume Redfish attribute success= fully. > > > + @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->JsonStructProtoco= l, > > > + NULL, > > > + Json, > > > + (EFI_REST_JSON_STRUCTURE_H= EADER > > > **)&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= will > > > 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 > failed: > > > %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 *)S= ecureBoot > > > + ); > > > + > > > + return EFI_SUCCESS; > > > +} > > > + > > > +/** > > > + Provision Redfish resource. This function reads secure boot variab= le and > > > convert it > > > + to Redfish attribute. > > > + > > > + @param[in] JsonStructProtocol Pointer to Json structure protoco= l. > > > + @param[in] InputJson Jason data on input. > > > + @param[in] ResourceId Resource ID. This is optional. > > > + @param[in] ConfigureLang Configure language for this Redfi= sh > > > resource. > > > + @param[in] ProvisionMode TRUE when this is to provision Re= dfish > > > attribute to > > > + Redfish service. FALSE is to upda= te Redfish attribute > > > + to Redfish service. > > > + @param[out] ResultJson Json data on output. > > > + > > > + @retval EFI_SUCCESS Provision Redfish attribute succe= ssfully. > > > + @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"U= pdate > > > 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_LE= N > > > *sizeof (CHAR8)); > > > + if (AsciiStringValue !=3D NULL) { > > > + AsciiSPrint (AsciiStringValue, SECURE_BOOT_MODE_STR_LEN *siz= eof > > > (CHAR8), "%a", (SetupMode =3D=3D USER_MODE ? > SECURE_BOOT_USER_MODE : > > > SECURE_BOOT_SETUP_MODE)); > > > + if (ProvisionMode || (AsciiStrCmp (SecureBootCs->SecureBootM= ode, > > > 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 *)S= ecureBoot, > > > + ResultJson > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: ToJson() failed: %r\n", __func__, Stat= us)); > > > + } > > > + > > > + // > > > + // 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. Thi= s > > > 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 succes= sfully. > > > + @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 resour= ce > 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 f= or > > > %s\n", __func__, REDFISH_DUMMY_CONFIG_LANG)); > > > + > > > + // > > > + // PATCH back to instance > > > + // > > > + Status =3D RedfishHttpPatchResource (Private->RedfishService, Priv= ate->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 secur= e > > > + 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 = header. > > > + > > > + @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, Priv= ate->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 l= ike 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 s= ure > > > 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,= NULL, > > > 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 collect= ion > > > 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 creat= e property. > > > + // > > > + DEBUG ((REDFISH_DEBUG_TRACE, "%a provision for %s\n", __func__, > > > Uri)); > > > + Status =3D EdkIIRedfishResourceConfigProvisioning (&SchemaInfo, = Uri, > 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, NU= LL); > > > + 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, NUL= L); > > > + 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 righ= ts > > > reserved. > > > + > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > + > > > +**/ > > > + > > > +#include "../Common/SecureBootCommon.h" > > > + > > > +extern REDFISH_RESOURCE_COMMON_PRIVATE > *mRedfishResourcePrivate; > > > +extern EFI_HANDLE mRedfishResourceConfigProtoc= olHandle; > > > + > > > +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_PRO= TOCOL > > > instance. > > > + @param[in] Uri Target URI to create resource. > > > + @param[in] PostMode TRUE if the resource does not exi= st, post > > > method is used. > > > + FALSE if the resource exist but p= roperty 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_PROTOCO > L > > > (This); > > > + > > > + if (Private->RedfishService =3D=3D NULL) { > > > + return EFI_NOT_READY; > > > + } > > > + > > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, N= ULL, > > > &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_PRO= TOCOL > > > 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_PROTOCO > L > > > (This); > > > + > > > + if (Private->RedfishService =3D=3D NULL) { > > > + return EFI_NOT_READY; > > > + } > > > + > > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, N= ULL, > > > &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->P= ayload), > > > 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, E= tag); > > > + 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_PRO= TOCOL > > > 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_PRO= TOCOL > > > 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_PROTOCO > L > > > (This); > > > + > > > + if (Private->RedfishService =3D=3D NULL) { > > > + return EFI_NOT_READY; > > > + } > > > + > > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, N= ULL, > > > &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->P= ayload), > > > 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_PRO= TOCOL > > > 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_PROTOCO > L > > > (This); > > > + > > > + if (Private->RedfishService =3D=3D NULL) { > > > + return EFI_NOT_READY; > > > + } > > > + > > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, N= ULL, > > > &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->P= ayload), > > > 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, Eta= g); > > > + 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 = want 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_PROTOCO > L > > > (This); > > > + > > > + if (Private->RedfishService =3D=3D NULL) { > > > + return EFI_NOT_READY; > > > + } > > > + > > > + Status =3D RedfishHttpGetResource (Private->RedfishService, Uri, N= ULL, > > > &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->P= ayload), > > > 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__, U= ri, > > > 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 initi= alize 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 initiali= zed > > > successfully. > > > + @retval EFI_DEVICE_ERROR Failed to create or configure= the > REST > > > EX protocol instance. > > > + @retval EFI_ALREADY_STARTED This handler has already been > > > initialized. > > > + @retval Other Error happens during the init= ialization. > > > + > > > +**/ > > > +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 > (RedfishConfigServiceInfo); > > > + 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 succ= essfully. > > > + @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 instal= led. > > > + > > > + @param[in] Event Event whose notification function is being inv= oked. > > > + @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->JsonStructProto= col > > > + ); > > > + 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 ImageHan= dle. > > > + // > > > + 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 driv= er should > > > take. > > > + @param[in] Uri The collection URI. > > > + @param[in] Context The context of Redfish feature = driver. > > > + @param[in,out] InformationExchange The pointer to > > > RESOURCE_INFORMATION_EXCHANGE > > > + > > > + @retval EFI_SUCCESS Redfish feature driver callback i= s executed > > > successfully. > > > + @retval Others Some errors happened. > > > + > > > + @retval EFI_SUCCESS Redfish feature driver callback i= s 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 * siz= eof > > > (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 install= ed. > > > + > > > + @param[in] Event Event whose notification function is being inv= oked. > > > + @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, > > > + RedfishExternalResourceResourceFeature= Callback, > > > + (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 po= int is > > > + the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers > > > including > > > + both device drivers and bus drivers. It initialize the global vari= ables and > > > + publish the driver binding protocol. > > > + > > > + @param[in] ImageHandle The firmware allocated handle for th= e > 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.= inf > > > + INF > RedfishClientPkg/Features/SecureBoot/v1_1_0/Dxe/SecureBootDxe.inf > > > > > > !include RedfishClientPkg/RedfishJsonStructureDxe.fdf.inc > > > # > > > -- > > > 2.34.1 > > > > > > > >=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 (#117582): https://edk2.groups.io/g/devel/message/117582 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-