From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (NAM12-BN8-obe.outbound.protection.outlook.com [40.107.237.55]) by mx.groups.io with SMTP id smtpd.web08.27906.1658972654039912759 for ; Wed, 27 Jul 2022 18:44:14 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=YFEfammq; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.237.55, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ie/qvyzVIe6nZPOnXAM59FHebIVtJSzpz5q/YwC1FvuKYvh0+YMUDh/2GQidTQPhmoEDPE3TgP1DL9uonO95WGxZFR/OcR2k6mpHdgXFPfOmFSdz+uKgOd+MXRi+w+s1hFQ9BQPvU1wdu0I9v0um0hdWVZT8SUTv9xHXmMR3WR0JuXD0Z4qGF2Y5i3yN/pkPb4J3GWdvJJOnvqP2cDJsYoM+0LMP8tZ9FfUHffGZCsOxzui5RHtaOBjHavGWvXoI3FZCe1KS4PwLb2QL9LC6QNKIYZqyDMBKMdM2lcGJA/8SNyGcYFAzuFXXuksNanmH00pIbDicI7sN6OaKcJ/GKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=G3FBizwAb2qYuLR7bPbqJta0aRwyl/ATCHUzJr9ca2k=; b=IgZAGhsWXeBO9TBY5ola3jn2KVSTOLDS+dIHxcDU9j4NcdHRotFtzc76m2XXCgrrkDqqNbtnoL021DEXcMTsKXHg09ShQiqi8zHps1u9nMFNhXD2YNW20ThpedaCY5FfhQm8yg908KsLDeOqQsyegC70Z2Q9gc2XUnj9uuuZJuVe5+Us/DcuLS4e0qOrvXTCCCNs4wew6sABv+GAPV794wjrHAHrGc1k+8WOoZkyZwxJFxL4kmb8Ve0xCScCMOse1ZKxBtCvQQylB3mROTN9vV4zOnXnKurWv64SdcoxGJznD9UE+Q3NVSaSurz3XFmxiD84xYfu+smpxC8dFt6VCQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=G3FBizwAb2qYuLR7bPbqJta0aRwyl/ATCHUzJr9ca2k=; b=YFEfammqsV21gDkkvNm8fhF9mlQgI84wBS+coNAv7Jo1aLGas1lWJH7jDI+nQbj0Ed5fDpxPbowthRfT0Vz2X7M+pAyqxZxXkbQVQLr+jnp+MIs51RxZ/ZGHIWCG0mVsKA0BsZL7lUCYl6hwyFdFdu8nH4h/HQGIPkeR5t0Ff0w= Received: from MN2PR12MB3966.namprd12.prod.outlook.com (2603:10b6:208:165::18) by BN9PR12MB5258.namprd12.prod.outlook.com (2603:10b6:408:11f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.19; Thu, 28 Jul 2022 01:44:10 +0000 Received: from MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::605a:11f4:fc16:8b06]) by MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::605a:11f4:fc16:8b06%5]) with mapi id 15.20.5458.025; Thu, 28 Jul 2022 01:44:10 +0000 From: "Chang, Abner" To: Nickle Wang , "devel@edk2.groups.io" CC: "Yang, Atom" , Nick Ramirez Subject: Re: [edk2-staging][PATCH v3 06/15] edk2-staging/RedfishClientPkg: Introduce RedfishConfigLangMap driver Thread-Topic: [edk2-staging][PATCH v3 06/15] edk2-staging/RedfishClientPkg: Introduce RedfishConfigLangMap driver Thread-Index: AQHYoVmMQr9tgy43yEGk4a+aYpYVqa2TBEOA Date: Thu, 28 Jul 2022 01:44:10 +0000 Message-ID: References: <20220727013802.247-1-nickle.wang@hpe.com> <20220727013802.247-7-nickle.wang@hpe.com> In-Reply-To: <20220727013802.247-7-nickle.wang@hpe.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Enabled=true; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SetDate=2022-07-28T01:44:06Z; 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_SiteId=3dd8961f-e488-4e60-8e11-a82d994e183d; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ActionId=0cecb0b5-bd1e-4bdf-b7d4-e189b767f7b9; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=1 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: f214313f-6a91-487e-a096-08da703aaafa x-ms-traffictypediagnostic: BN9PR12MB5258:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: k+0ccfiWP4Nsui3AF9EJHHwAsYblrcr++YM5av1Sg+7BVvUys6Kr9l6sajt9d3MMFrwPp+8QTxVXo27HFZGoAQwS5iZN9YW7+vZ4tkR4PVZQu16+kXLd2JIvps4pEkmBOOsmyTlh6FiCbRLUba8OTO5VATnQ+7TVbi3dmHpY7J0/QWHZLrJhrBrDa/Za3YcLODsteaQxjBs0bw9cTQoQbuuWPqBIq7ecSpUiR7EvTKZMn3CfYnwS4CtkkQ5GEQSduvnyfKHCv+F0b9KJ1l2nSZ7tirBJFpIakeKpP19/JP5AqNPoXbXLZnpQyltxFNiVssH1/mOPwCFh/CNUywstU5IWj9P5Z055nY7VjVuHSTFqQZ9qM4Ezy61hRfAaUyY4cP24bnsJIUhxyHNW/6Y3FU3K73axqD6whw9AqiQUYTIbMSkfqGX7EREuBd+5hsbQ+U4H0YmwbRyh6TdIQN56pG2oPo2Mxb75mxuEBz7wEhloogE3/nRpQpM38d/cPH+csV3BiwJ20Uo+dvFKgqYjJJE+W4uKBhdEqI7iDKcTU0+UNxxw5RHTato/Wwyhp4XJMq2n9EXEsoQc1KItgGaef2x2GPkycxVEa9NCBRSQwmDzF0Fz9Q1mPIQ3eF5N3M/XRze10QTQrIo5msmBRFuYTLkI9eWX4FTgjoyFDTh05lfm+yGigbDOGsm49gFbulheuM2aB9kIBCgFWFFLlQMr13hO2D3OiJpFQNAJgGFCpcPI2Q1+wS+a61TxczCiq0mNAKqCEPLRqW1k1KfhAlLLfrN2rzFA1uWS+ZYvr5vd+ZzQiXUANZcm8KBsnxqXNaeZ x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB3966.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(396003)(376002)(39860400002)(346002)(136003)(366004)(122000001)(33656002)(86362001)(26005)(2906002)(52536014)(38070700005)(38100700002)(83380400001)(41300700001)(53546011)(7696005)(478600001)(54906003)(9686003)(66946007)(6506007)(296002)(8936002)(186003)(110136005)(316002)(66476007)(71200400001)(4326008)(5660300002)(64756008)(8676002)(66446008)(30864003)(66556008)(76116006)(55016003)(559001)(579004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?Ldchckt/HFxcb7W/Sz2vGvk3/vsxEEUyx5Iucvq8vwaFyW47fZYXcV1K//W8?= =?us-ascii?Q?tbRald9ySKFFiGYOutiK1ACADR2FviB9WXoPQMHl2qWgvzDE3y2ag0CPYC9S?= =?us-ascii?Q?1/A1GPFI+E3cHLQpYr7fR9c642V/Nd/+rIFScJIDqe4ds40eD94sawuiDmmK?= =?us-ascii?Q?hlcD03zezFRHbna1vfxo6R+uFfNjNx2DyL/g2l2NYXL94EBozb25/7sGrbLo?= =?us-ascii?Q?HEqX9JDQ/J/aZdTsQ10cIFAzwA/m4Woy0Sv2BIv6XZ7p4Zk9+3LRSepdrHTK?= =?us-ascii?Q?I0s9RF/kpwQqRzbfY9enCy+ercjA4P/7n4NLbZrAH0eh4GfK2sBBHfUP4z5g?= =?us-ascii?Q?ZwfmjfhOuZ/zkXncGPxpOOr8xd/rh4TBSBr/U3w7g3ehCLsC4uVRNhwDiwha?= =?us-ascii?Q?s/tuEulbaltsub9aR9Ctbx04gLKt/8/iGC1Wo+TCsOAhSwGoZlbQtxMBhevi?= =?us-ascii?Q?M1ckB7IOn0q8c2JmoJVoKFcXaUyjl3wrtFG3KO33nHrviFSULHzgjurRDUoD?= =?us-ascii?Q?th3WYfJqqT3YupIZyKPK8cd5DZvqRpEH01wk9+B6DE3j49O8epOWEOexlWO+?= =?us-ascii?Q?jcn4livz9h9z//r16kkyNzWrn2oFT+VXBva2BCfZE88oW/iIB7rnrnYXp1RQ?= =?us-ascii?Q?YFJzF+K8I08IvrOWSaDDalE8gxis33dnbq6NEn5Pb1Hj0EY/s6J+J9zk6kyR?= =?us-ascii?Q?cVevuXJ5gcAWrsC5cmsXHydQFgCSKzx89cq46e5gCOHcYKc+sBwQpm7IV8kN?= =?us-ascii?Q?ApHwCtqsWVYsS4V09+YaowInTRAcPX+Lb99Gu0dD1Su5lJUnXagMVQR5uTzB?= =?us-ascii?Q?WLLSanCR+TWDLn+eC6fdIEB2Tfp+PxBsfMmtRStC5tbuIT2uP9X7BxpeczCj?= =?us-ascii?Q?dNTyoZkI3yAJlmBImQcNhx4B5hyyP3So5u2cUAmjz+SrAOgBDphTZ5Gnugu3?= =?us-ascii?Q?UxkQe9ir78+Y59Rzms8v5EUEciIuEZ2t+9N5Paw8pC4qApGwKjU87NiLIlNY?= =?us-ascii?Q?p78c/ekY3rubBuHOmm4G+cZxwG4PRCH5iPXwCZiuLsRRoplu6ETlF9FL6yod?= =?us-ascii?Q?PNfCgwQ0jcdk39G30GiLstL57FQvmrvmhyfWsuoWsH7A2BGGrAEETb9Jl7Gs?= =?us-ascii?Q?VUhdFN/Q5ahqEAUb3hGCfUUAjeqx5ToAjiWsg8lP6qP5nrZAeeDCyjpmLX7D?= =?us-ascii?Q?ZNv5uQB867Kmp084OaU9adzK00iB5JU8hXCVfGoX2WxKWd9u8c7h8lmuE9GV?= =?us-ascii?Q?MgLgDFByE/1Smuz7B3UafvsdlSZ0IxHBxU22snLBKDW7iMR2QCwNOjdkS/Rs?= =?us-ascii?Q?vcBijlb/gpPZ6Nl4lWE9tzj4qPvnLkCLNbXlZREkOIKwMd+S03hnp+QVdt67?= =?us-ascii?Q?tP03dsBWkp5XmGF4iJA3U+lICAWt7r7KsNZJGS2O6fXdazHTDPuO0bMS5dH7?= =?us-ascii?Q?gdlv+sbxN7eY79YoYxwbv/Bhve1hWB9xXsOWqNdz3XtQDotK5w/9RAuqFKTK?= =?us-ascii?Q?2SfTm9/mszuSFb4iEQ5jqh7pdvnzLFfxdt463i5b06Zp7mIC9iaoNS8eQAxH?= =?us-ascii?Q?5csicpKuusHwLouYobk=3D?= MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3966.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f214313f-6a91-487e-a096-08da703aaafa X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Jul 2022 01:44:10.5156 (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: HC/Zb+lUSaIwTiKt7jrpFIRgrPH65PbxWQfvC1hq4yh0KKaemXOs3KqHCcN3klZPRdj+IYJHWyyDkcR9++dpZw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN9PR12MB5258 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable [AMD Official Use Only - General] Reviewed-by: Abner Chang > -----Original Message----- > From: Nickle Wang > Sent: Wednesday, July 27, 2022 9:38 AM > To: devel@edk2.groups.io > Cc: Chang, Abner ; Yang, Atom > ; Nick Ramirez > Subject: [edk2-staging][PATCH v3 06/15] edk2-staging/RedfishClientPkg: > Introduce RedfishConfigLangMap driver >=20 > [CAUTION: External Email] >=20 > Introduce Redfish configure language map driver. This driver keeps the > mapping between configure language and Redfish URI for internal use. > This saves the communication time between feature drivers and Redfish > service. It also provides the history records so that feature drivers can= do > provisioning, consuming and updating efficiently. >=20 > Signed-off-by: Nickle Wang > Cc: Abner Chang > Cc: Yang Atom > Cc: Nick Ramirez > --- > .../EdkIIRedfishConfigLangMapProtocol.h | 88 ++ > RedfishClientPkg/RedfishClient.fdf.inc | 3 +- > .../RedfishClientComponents.dsc.inc | 1 + > RedfishClientPkg/RedfishClientPkg.dec | 2 + > .../RedfishConfigLangMapDxe.c | 810 ++++++++++++++++++ > .../RedfishConfigLangMapDxe.h | 71 ++ > .../RedfishConfigLangMapDxe.inf | 46 + > 7 files changed, 1020 insertions(+), 1 deletion(-) create mode 100644 > RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h > create mode 100644 > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.c > create mode 100644 > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.h > create mode 100644 > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf >=20 > diff --git > a/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h > b/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h > new file mode 100644 > index 0000000000..03d18aa297 > --- /dev/null > +++ > b/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtoco > +++ l.h > @@ -0,0 +1,88 @@ > +/** @file > + This file defines the EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL > interface. > + > + (C) Copyright 2022 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_H_ > +#define EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_H_ > + > +typedef struct _EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL > +EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL; > + > +/** > + Definition of REDFISH_CONFIG_LANG_MAP_GET_TYPE **/ typedef enum > { > + RedfishGetTypeUri =3D 0, > + RedfishGetTypeConfigLang, > + RedfishGetTypeMax > +} REDFISH_CONFIG_LANG_MAP_GET_TYPE; > + > +/** > + Get string in database by given query string. > + > + @param[in] This Pointer to > EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL instance. > + @param[in] QueryStringType The type of given QueryString. > + @param[in] QueryString Query string. > + @param[out] ResultString Returned string mapping to give q= uery > string. > + > + @retval EFI_SUCCESS The result is found successfully. > + @retval EFI_INVALID_PARAMETER Invalid parameter is given. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_GET) ( > + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This, > + IN REDFISH_CONFIG_LANG_MAP_GET_TYPE QueryStringType, > + IN EFI_STRING QueryString, > + OUT EFI_STRING *ResultString > + ); > + > +/** > + Save URI string which maps to given ConfigLang. > + > + @param[in] This Pointer to > EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL instance. > + @param[in] ConfigLang Config language to set > + @param[in] Uri Uri which is mapping to give ConfigLa= ng. If Uri is > NULL, > + the record will be removed. > + > + @retval EFI_SUCCESS Uri is saved successfully. > + @retval Others Some error happened. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_SET) ( > + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This, > + IN EFI_STRING ConfigLang, > + IN EFI_STRING Uri OPTIONAL > + ); > + > +/** > + Refresh the resource map database and save database to variable. > + > + @param[in] This Pointer to > EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL instance. > + > + @retval EFI_SUCCESS database is saved successfully. > + @retval Others Some error happened. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_FLUSH) ( > + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This > + ); > + > +struct _EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL { > + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_GET Get; > + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_SET Set; > + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_FLUSH Flush; }; > + > +extern EFI_GUID gEdkIIRedfishConfigLangMapProtocolGuid; > + > +#endif > diff --git a/RedfishClientPkg/RedfishClient.fdf.inc > b/RedfishClientPkg/RedfishClient.fdf.inc > index d5d04e4c6c..6292de4e81 100644 > --- a/RedfishClientPkg/RedfishClient.fdf.inc > +++ b/RedfishClientPkg/RedfishClient.fdf.inc > @@ -5,7 +5,7 @@ > # by using "!include RedfishClientPkg/RedfisClientLibs.fdf.inc" to speci= fy the > module instances # to be built in the firmware volume. > # > -# (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> +# (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
> # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -13,6 +13,7 @@ > !if $(REDFISH_CLIENT) =3D=3D TRUE > INF RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf > INF RedfishClientPkg/RedfishETagDxe/RedfishETagDxe.inf > + INF > + > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf > INF > RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.inf > INF > RedfishClientPkg/Features/RedfishMemoryCollectionDxe/RedfishMemoryC > ollectionDxe.inf >=20 > diff --git a/RedfishClientPkg/RedfishClientComponents.dsc.inc > b/RedfishClientPkg/RedfishClientComponents.dsc.inc > index b89df12c6f..ee4602fe79 100644 > --- a/RedfishClientPkg/RedfishClientComponents.dsc.inc > +++ b/RedfishClientPkg/RedfishClientComponents.dsc.inc > @@ -15,6 +15,7 @@ > !if $(REDFISH_CLIENT) =3D=3D TRUE > RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf > RedfishClientPkg/RedfishETagDxe/RedfishETagDxe.inf > + > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf > # > # Below two modules should be pulled in by build tool. > # > diff --git a/RedfishClientPkg/RedfishClientPkg.dec > b/RedfishClientPkg/RedfishClientPkg.dec > index c61c581213..7bdab5be0c 100644 > --- a/RedfishClientPkg/RedfishClientPkg.dec > +++ b/RedfishClientPkg/RedfishClientPkg.dec > @@ -38,6 +38,8 @@ > gEdkIIRedfishResourceConfigProtocolGuid =3D { 0x6f164c68, 0xfb09, 0x46= 46, > { 0xa8, 0xd3, 0x24, 0x11, 0x5d, 0xab, 0x3e, 0xe7 } } > ## Include/Protocol/EdkiiRedfishETagProtocol.h > gEdkIIRedfishETagProtocolGuid =3D { 0x5706d368, 0xaf66, 0x48= f5, { 0x89, > 0xfc, 0xa6, 0x61, 0xce, 0xb5, 0xa6, 0xa9 } } > + ## Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h > + gEdkIIRedfishConfigLangMapProtocolGuid =3D { 0x1d9ba9fe, 0x5d5a, > 0x4b66, {0x83, 0x5b, 0xe2, 0x5d, 0x13, 0x93, 0x4a, 0x9c } } > ## Include/Protocol/EdkIIRedfishInterchangeData.h > gEdkIIRedfishFeatureInterchangeDataProtocolGuid =3D { 0x4B8FF71C, 0x4A= 7B, > 0x9478, { 0xB7, 0x81, 0x35, 0x9B, 0x0A, 0xF2, 0x00, 0x91 } } >=20 > diff --git > a/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.c > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.c > new file mode 100644 > index 0000000000..2762bbefab > --- /dev/null > +++ > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.c > @@ -0,0 +1,810 @@ > +/** @file > + > + (C) Copyright 2022 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "RedfishConfigLangMapDxe.h" > + > +REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA > *mRedfishConfigLangMapPrivate =3D > +NULL; > + > +/** > + Release REDFISH_CONFIG_LANG_MAP_RECORD resource > + > + @param[in] Record Pointer to REDFISH_CONFIG_LANG_MAP_RECORD > instance > + > + @retval EFI_SUCCESS REDFISH_CONFIG_LANG_MAP_RECORD is > released successfully. > + @retval EFI_INVALID_PARAMETER Record is NULL > + > +**/ > +EFI_STATUS > +ReleaseConfigLangMapRecord ( > + IN REDFISH_CONFIG_LANG_MAP_RECORD *Record > + ) > +{ > + if (Record =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (Record->Uri !=3D NULL) { > + FreePool (Record->Uri); > + } > + > + if (Record->ConfigLang !=3D NULL) { > + FreePool (Record->ConfigLang); > + } > + > + FreePool (Record); > + > + return EFI_SUCCESS; > +} > + > +/** > + Create new resource map resource. > + > + @param[in] Uri The URI string matching to this ConfigLang. > + @param[in] ConfigLang ConfigLang string. > + > + @retval REDFISH_CONFIG_LANG_MAP_RECORD * Pointer to newly > created config language map. > + @retval NULL No memory available. > + > +**/ > +REDFISH_CONFIG_LANG_MAP_RECORD * > +NewConfigLangMapRecord ( > + IN EFI_STRING Uri, > + IN EFI_STRING ConfigLang > + ) > +{ > + REDFISH_CONFIG_LANG_MAP_RECORD *NewRecord; > + UINTN Size; > + > + if (IS_EMPTY_STRING (Uri) || IS_EMPTY_STRING (ConfigLang)) { > + return NULL; > + } > + > + NewRecord =3D AllocateZeroPool (sizeof > + (REDFISH_CONFIG_LANG_MAP_RECORD)); > + if (NewRecord =3D=3D NULL) { > + return NULL; > + } > + > + Size =3D StrSize (Uri); > + NewRecord->Uri =3D AllocateCopyPool (Size, Uri); if (NewRecord->Uri = =3D=3D > + NULL) { > + goto ON_ERROR; > + } > + > + NewRecord->Size =3D Size; > + Size =3D StrSize (ConfigLang); > + NewRecord->ConfigLang =3D AllocateCopyPool (Size, ConfigLang); if > + (NewRecord->ConfigLang =3D=3D NULL) { > + goto ON_ERROR; > + } > + > + NewRecord->Size +=3D Size; > + return NewRecord; > + > +ON_ERROR: > + > + if (NewRecord !=3D NULL) { > + ReleaseConfigLangMapRecord (NewRecord); } > + > + return NULL; > +} > + > +/** > + Add new config language map by given URI and ConfigLang string to > specify List. > + > + @param[in] List Target config language map list to add. > + @param[in] Uri The URI string matching to this ConfigLang. > + @param[in] ConfigLang ConfigLang string. > + > + @retval EFI_SUCCESS config language map recourd is added. > + @retval Others Fail to add config language map. > + > +**/ > +EFI_STATUS > +AddConfigLangMapRecord ( > + IN REDFISH_CONFIG_LANG_MAP_LIST *List, > + IN EFI_STRING Uri, > + IN EFI_STRING ConfigLang > + ) > +{ > + REDFISH_CONFIG_LANG_MAP_RECORD *NewRecord; > + > + if (List =3D=3D NULL || IS_EMPTY_STRING (Uri) || IS_EMPTY_STRING > (ConfigLang)) { > + return EFI_INVALID_PARAMETER; > + } > + > + NewRecord =3D NewConfigLangMapRecord (Uri, ConfigLang); if > + (NewConfigLangMapRecord =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + InsertTailList (&List->Listheader, &NewRecord->List); ++List->Count; > + List->TotalSize +=3D NewRecord->Size; > + > + return EFI_SUCCESS; > +} > + > +/** > + Delete an config language map by given config language map instance. > + > + @param[in] List Target config language map list to be removed. > + @param[in] Record Pointer to the instance to be deleted. > + > + @retval EFI_SUCCESS config language map recourd is removed. > + @retval Others Fail to add config language map. > + > +**/ > +EFI_STATUS > +DeleteConfigLangMapRecord ( > + IN REDFISH_CONFIG_LANG_MAP_LIST *List, > + IN REDFISH_CONFIG_LANG_MAP_RECORD *Record > + ) > +{ > + if (List =3D=3D NULL || Record =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + RemoveEntryList (&Record->List); > + --List->Count; > + List->TotalSize -=3D Record->Size; > + > + return ReleaseConfigLangMapRecord (Record); } > + > +/** > + Search on given ListHeader for given ConfigLang string. > + > + @param[in] ListHeader Target list to search. > + @param[in] Query Target string to search. > + @param[in] QueryIsUri Query string is URI string or not > + > + @retval REDFISH_CONFIG_LANG_MAP_RECORD Target in map is found. > + @retval NULL No target in map with given qu= ery is found. > + > +**/ > +REDFISH_CONFIG_LANG_MAP_RECORD * > +FindConfigLangMapRecord ( > + IN LIST_ENTRY *ListHeader, > + IN EFI_STRING Query, > + IN BOOLEAN QueryIsUri > + ) > +{ > + LIST_ENTRY *List; > + REDFISH_CONFIG_LANG_MAP_RECORD *Record; > + > + if (IsListEmpty (ListHeader)) { > + return NULL; > + } > + > + if (IS_EMPTY_STRING (Query)) { > + return NULL; > + } > + > + Record =3D NULL; > + List =3D GetFirstNode (ListHeader); > + while (!IsNull (ListHeader, List)) { > + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List); > + > + if (QueryIsUri) { > + if (StrCmp (Record->Uri, Query) =3D=3D 0) { > + return Record; > + } > + } else { > + if (StrCmp (Record->ConfigLang, Query) =3D=3D 0) { > + return Record; > + } > + } > + > + List =3D GetNextNode (ListHeader, List); } > + > + return NULL; > +} > + > +#if CONFIG_LANG_MAP_DEBUG_ENABLED > +/** > + Debug output the config language map list. > + > + @param[in] ConfigLangMapList Target list to dump > + @param[in] Msg Debug message string. > + > + @retval EFI_SUCCESS Debug dump finished. > + @retval EFI_INVALID_PARAMETER ConfigLangMapList is NULL. > + > +**/ > +EFI_STATUS > +DumpConfigLangMapList ( > + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList, > + IN EFI_STRING Msg > + ) > +{ > + LIST_ENTRY *List; > + REDFISH_CONFIG_LANG_MAP_RECORD *Record; > + > + if (ConfigLangMapList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (!IS_EMPTY_STRING (Msg)) { > + DEBUG ((DEBUG_ERROR, "%s\n", Msg)); } > + > + if (IsListEmpty (&ConfigLangMapList->Listheader)) { > + DEBUG ((DEBUG_INFO, "ConfigLangMap list is empty\n")); > + return EFI_NOT_FOUND; > + } > + > + DEBUG ((DEBUG_INFO, "Count: %d Total Size: %d\n", > + ConfigLangMapList->Count, ConfigLangMapList->TotalSize)); Record =3D > + NULL; List =3D GetFirstNode (&ConfigLangMapList->Listheader); while > + (!IsNull (&ConfigLangMapList->Listheader, List)) { > + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List); > + > + DEBUG ((DEBUG_INFO, "ConfigLang: %s Uri: %s Size: %d\n", > + Record->ConfigLang, Record->Uri, Record->Size)); > + > + List =3D GetNextNode (&ConfigLangMapList->Listheader, List); } > + > + return EFI_SUCCESS; > +} > + > +/** > + Debug output raw data buffer. > + > + @param[in] Buffer Debug output data buffer. > + @param[in] BufferSize The size of Buffer in byte. > + > + @retval EFI_SUCCESS Debug dump finished. > + @retval EFI_INVALID_PARAMETER Buffer is NULL. > + > +**/ > +EFI_STATUS > +DumpRawBuffer ( > + IN UINT8 *Buffer, > + IN UINTN BufferSize > + ) > +{ > + UINTN Index; > + CHAR16 *Seeker; > + > + if (Buffer =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Index =3D 0; > + Seeker =3D (CHAR16 *)Buffer; > + DEBUG ((DEBUG_ERROR, "Buffer size: %d\n", BufferSize)); while > + (Seeker[Index] !=3D '\0') { > + DEBUG ((DEBUG_ERROR, "(%d) %c ", (Index + 1), Seeker[Index])); > + > + ++Index; > + } > + DEBUG ((DEBUG_ERROR, "\n")); > + > + return EFI_SUCCESS; > +} > +#endif > + > +/** > + Release all ConfigLangMap from list. > + > + @param[in] ConfigLangMapList The list to be released. > + > + @retval EFI_SUCCESS All config lang is released. > + @retval EFI_INVALID_PARAMETER ConfigLangMapList is NULL. > + > +**/ > +EFI_STATUS > +ReleaseConfigLangMapList ( > + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList > + ) > +{ > + LIST_ENTRY *List; > + LIST_ENTRY *Next; > + REDFISH_CONFIG_LANG_MAP_RECORD *Record; > + > + if (ConfigLangMapList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (&ConfigLangMapList->Listheader)) { > + return EFI_SUCCESS; > + } > + > + Record =3D NULL; > + Next =3D NULL; > + List =3D GetFirstNode (&ConfigLangMapList->Listheader); while (!IsNul= l > + (&ConfigLangMapList->Listheader, List)) { > + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List); > + Next =3D GetNextNode (&ConfigLangMapList->Listheader, List); > + > + DeleteConfigLangMapRecord (ConfigLangMapList, Record); > + > + List =3D Next; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Save config lang in list to UEFI variable. > + > + @param[in] ConfigLangMapList The list to be saved. > + @param[in] VariableName The UEFI variable name. > + > + @retval EFI_SUCCESS All config lang is saved. > + @retval EFI_INVALID_PARAMETER VariableName or ConfigLangMapList is > NULL. > + > +**/ > +EFI_STATUS > +SaveConfigLangMapList ( > + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList, > + IN EFI_STRING VariableName > + ) > +{ > + LIST_ENTRY *List; > + REDFISH_CONFIG_LANG_MAP_RECORD *Record; > + UINT8 *VarData; > + VOID *Data; > + EFI_STRING Seeker; > + UINTN VarSize; > + UINTN StringSize; > + EFI_STATUS Status; > + > + if (ConfigLangMapList =3D=3D NULL || IS_EMPTY_STRING (VariableName)) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (&ConfigLangMapList->Listheader)) { > + return EFI_SUCCESS; > + } > + > + // > + // Caculate the total size we need to keep ConfigLangMap list. > + // > + VarSize =3D ConfigLangMapList->TotalSize + sizeof (CHAR16); // > + terminator character VarData =3D AllocateZeroPool (VarSize); if > + (VarData =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Seeker =3D (EFI_STRING)VarData; > + Record =3D NULL; > + List =3D GetFirstNode (&ConfigLangMapList->Listheader); while (!IsNul= l > + (&ConfigLangMapList->Listheader, List)) { > + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List); > + > + StringSize =3D StrSize (Record->Uri); > + CopyMem (Seeker, Record->Uri, StringSize); > + > + Seeker +=3D (StringSize / sizeof (CHAR16) - 1); > + *Seeker =3D '|'; > + ++Seeker; > + > + StringSize =3D StrSize (Record->ConfigLang); > + CopyMem (Seeker, Record->ConfigLang, StringSize); > + > + Seeker +=3D (StringSize / sizeof (CHAR16) - 1); > + *Seeker =3D '\n'; > + > + ++Seeker; > + > + List =3D GetNextNode (&ConfigLangMapList->Listheader, List);; } > + > + *Seeker =3D '\0'; > + > +#if CONFIG_LANG_MAP_DEBUG_ENABLED > + DumpRawBuffer (VarData, VarSize); > +#endif > + > + ASSERT (((UINTN)Seeker - (UINTN)VarData + sizeof (CHAR16)) =3D=3D > + VarSize); > + > + // > + // Check if variable exists already. If yes, remove it first. > + // > + Status =3D GetVariable2 ( > + VariableName, > + &mRedfishVariableGuid, > + (VOID *)&Data, > + NULL > + ); > + if (!EFI_ERROR (Status)) { > + FreePool (Data); > + gRT->SetVariable (VariableName, &mRedfishVariableGuid, > + VARIABLE_ATTRIBUTE_NV_BS, 0, NULL); } > + > + > + return gRT->SetVariable (VariableName, &mRedfishVariableGuid, > +VARIABLE_ATTRIBUTE_NV_BS, VarSize, (VOID *)VarData); } > + > +/** > + Read config lang map from UEFI variable if it exists. > + > + @param[in] ConfigLangMapList The list to be loaded. > + @param[in] VariableName The UEFI variable name. > + > + @retval EFI_SUCCESS All config lang is read successfully. > + @retval EFI_INVALID_PARAMETER VariableName or ConfigLangMapList is > NULL. > + @retval EFI_NOT_FOUND No config lang is found on UEFI variab= le. > + > +**/ > +EFI_STATUS > +InitialConfigLangMapList ( > + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList, > + IN EFI_STRING VariableName > + ) > +{ > + UINT8 *VarData; > + EFI_STRING UriPointer; > + EFI_STRING ConfigLangPointer; > + EFI_STRING Seeker; > + UINTN VariableSize; > + EFI_STATUS Status; > + > + if (ConfigLangMapList =3D=3D NULL || IS_EMPTY_STRING (VariableName)) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Check if variable exists already. > + // > + Status =3D GetVariable2 ( > + VariableName, > + &mRedfishVariableGuid, > + (VOID *)&VarData, > + &VariableSize > + ); > + if (EFI_ERROR (Status)) { > + return EFI_NOT_FOUND; > + } > + > + Seeker =3D (EFI_STRING)VarData; > + UriPointer =3D (EFI_STRING)VarData; > + ConfigLangPointer =3D (EFI_STRING)VarData; while (*Seeker !=3D '\0') = { > + > + // > + // Find URI > + // > + Seeker =3D StrStr (UriPointer, L"|"); > + if (Seeker =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, data corrupted\n", __FUNCTION__)); > + Status =3D EFI_DEVICE_ERROR; > + goto ON_ERROR; > + } > + > + *Seeker =3D '\0'; > + ConfigLangPointer =3D ++Seeker; > + > + // > + // Find config language map > + // > + Seeker =3D StrStr (ConfigLangPointer, L"\n"); > + if (Seeker =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, data corrupted\n", __FUNCTION__)); > + Status =3D EFI_DEVICE_ERROR; > + goto ON_ERROR; > + } > + > + *Seeker =3D '\0'; > + > + AddConfigLangMapRecord (ConfigLangMapList, UriPointer, > + ConfigLangPointer); > + > + UriPointer =3D ++Seeker; > + } > + > +#if CONFIG_LANG_MAP_DEBUG_ENABLED > + DumpConfigLangMapList (ConfigLangMapList, L"Initial ConfigLangMap > +List from Variable"); #endif > + > + Status =3D EFI_SUCCESS; > + > +ON_ERROR: > + > + FreePool (VarData); > + > + return Status; > +} > + > +/** > + Get string in database by given query string. > + > + @param[in] This Pointer to > EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL instance. > + @param[in] QueryStringType The type of given QueryString. > + @param[in] QueryString Query string. > + @param[out] ResultString Returned string mapping to give q= uery > string. > + > + @retval EFI_SUCCESS The result is found successfully. > + @retval EFI_INVALID_PARAMETER Invalid parameter is given. > + > +**/ > +EFI_STATUS > +RedfishConfigLangMapGet ( > + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This, > + IN REDFISH_CONFIG_LANG_MAP_GET_TYPE QueryStringType, > + IN EFI_STRING QueryString, > + OUT EFI_STRING *ResultString > + ) > +{ > + REDFISH_CONFIG_LANG_MAP_RECORD *Target; > + REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA *Private; > + EFI_STRING Result; > + > + if (This =3D=3D NULL || IS_EMPTY_STRING (QueryString) || ResultString = =3D=3D > NULL || QueryStringType >=3D RedfishGetTypeMax) { > + return EFI_INVALID_PARAMETER; > + } > + > + Private =3D REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS (This); > + > + *ResultString =3D NULL; > + > + Target =3D FindConfigLangMapRecord > +(&Private->ConfigLangList.Listheader, QueryString, (QueryStringType =3D= =3D > +RedfishGetTypeUri)); > + if (Target =3D=3D NULL) { > +#if CONFIG_LANG_MAP_DEBUG_ENABLED > + DumpConfigLangMapList (&Private->ConfigLangList, L"EFI_NOT_FOUND"); > +#endif > + return EFI_NOT_FOUND; > + } > + > + Result =3D (QueryStringType =3D=3D RedfishGetTypeUri ? Target->ConfigL= ang : > + Target->Uri); *ResultString =3D AllocateCopyPool (StrSize (Result), > + Result); if (*ResultString =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + return EFI_SUCCESS; > +} > + > + > +/** > + Save URI string which maps to given ConfigLang. > + > + @param[in] This Pointer to > EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL instance. > + @param[in] ConfigLang Config language to set > + @param[in] Uri Uri which is mapping to give ConfigLa= ng. If Uri is > NULL, > + the record will be removed. > + > + @retval EFI_SUCCESS Uri is saved successfully. > + @retval Others Some error happened. > + > +**/ > +EFI_STATUS > +RedfishConfigLangMapSet ( > + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This, > + IN EFI_STRING ConfigLang, > + IN EFI_STRING Uri OPTIONAL > + ) > +{ > + REDFISH_CONFIG_LANG_MAP_RECORD *Target; > + REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA *Private; > + EFI_STATUS Status; > + > + if (This =3D=3D NULL || IS_EMPTY_STRING (ConfigLang)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Private =3D REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS (This); > + > + Status =3D EFI_NOT_FOUND; > + Target =3D FindConfigLangMapRecord > + (&Private->ConfigLangList.Listheader, ConfigLang, FALSE); if (Target != =3D > NULL) { > + // > + // Remove old one and create new one. > + // > + Status =3D DeleteConfigLangMapRecord (&Private->ConfigLangList, > + Target); } > + > + // > + // When Uri is NULL, it means that we want to remov this record. > + // > + if (Uri =3D=3D NULL) { > + return Status; > + } > + > + return AddConfigLangMapRecord (&Private->ConfigLangList, Uri, > +ConfigLang); } > + > +/** > + Refresh the resource map database and save database to variable. > + > + @param[in] This Pointer to > EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL instance. > + > + @retval EFI_SUCCESS This handler has been stoped successf= ully. > + @retval Others Some error happened. > + > +**/ > +EFI_STATUS > +RedfishConfigLangMapFlush ( > + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This > + ) > +{ > + REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA *Private; > + EFI_STATUS Status; > + > + if (This =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Private =3D REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS (This); > + > + Status =3D SaveConfigLangMapList (&Private->ConfigLangList, > + Private->VariableName); if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, save ConfigLangMap list to variable: %s > + failed: %r\n", __FUNCTION__, Private->VariableName, Status)); } > + > + return Status; > +} > + > +/** > + Callback function executed when the ExitBootService event group is > signaled. > + > + @param[in] Event Event whose notification function is being invok= ed. > + @param[out] Context Pointer to the Context buffer > + > +**/ > +VOID > +EFIAPI > +RedfishConfigLangMapOnExitBootService ( > + IN EFI_EVENT Event, > + OUT VOID *Context > + ) > +{ > + // > + // Memory is about to be released. Keep list into variable. > + // > + RedfishConfigLangMapFlush (&mRedfishConfigLangMapPrivate->Protocol); > +} > + > +/** > + Unloads an image. > + > + @param[in] 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 > +RedfishConfigLangMapDriverUnload ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + EFI_STATUS Status; > + > + if (mRedfishConfigLangMapPrivate !=3D NULL) { > + > + Status =3D gBS->UninstallProtocolInterface ( > + mRedfishConfigLangMapPrivate->ImageHandle, > + &gEdkIIRedfishConfigLangMapProtocolGuid, > + (VOID*)&mRedfishConfigLangMapPrivate->Protocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, can not uninstall > gEdkIIRedfishConfigLangMapProtocolGuid: %r\n", __FUNCTION__, Status)); > + ASSERT (FALSE); > + } > + > + ReleaseConfigLangMapList > + (&mRedfishConfigLangMapPrivate->ConfigLangList); > + > + if (mRedfishConfigLangMapPrivate->VariableName !=3D NULL) { > + FreePool (mRedfishConfigLangMapPrivate->VariableName); > + } > + > + if (mRedfishConfigLangMapPrivate->ExitBootEvent !=3D NULL) { > + gBS->CloseEvent (mRedfishConfigLangMapPrivate->ExitBootEvent); > + } > + > + if (mRedfishConfigLangMapPrivate->ProvisionEvent !=3D NULL) { > + gBS->CloseEvent (mRedfishConfigLangMapPrivate->ProvisionEvent); > + } > + > + FreePool (mRedfishConfigLangMapPrivate); > + mRedfishConfigLangMapPrivate =3D NULL; } > + > + return EFI_SUCCESS; > +} > + > +// > +// EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL. > +// > +EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL > mRedfishConfigLangMapProtocol =3D > +{ > + RedfishConfigLangMapGet, > + RedfishConfigLangMapSet, > + RedfishConfigLangMapFlush > +}; > + > +/** > + This is the declaration of an EFI image entry point. This entry point > +is > + the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers > +including > + both device drivers and bus drivers. > + > + @param[in] ImageHandle The firmware allocated handle for the UE= FI > image. > + @param[in] SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval Others An unexpected error occurred. > +**/ > +EFI_STATUS > +EFIAPI > +RedfishConfigLangMapDriverEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + mRedfishConfigLangMapPrivate =3D AllocateZeroPool (sizeof > + (REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA)); > + if (mRedfishConfigLangMapPrivate =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + InitializeListHead > + (&mRedfishConfigLangMapPrivate->ConfigLangList.Listheader); > + mRedfishConfigLangMapPrivate->VariableName =3D AllocateCopyPool > + (StrSize (CONFIG_LANG_MAP_VARIABLE_NAME), > CONFIG_LANG_MAP_VARIABLE_NAME); if > (mRedfishConfigLangMapPrivate->VariableName =3D=3D NULL) { > + goto ON_ERROR; > + } > + > + mRedfishConfigLangMapPrivate->ImageHandle =3D ImageHandle; > CopyMem > + (&mRedfishConfigLangMapPrivate->Protocol, > + &mRedfishConfigLangMapProtocol, sizeof > + (EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL)); > + > + Status =3D gBS->InstallProtocolInterface ( > + &ImageHandle, > + &gEdkIIRedfishConfigLangMapProtocolGuid, > + EFI_NATIVE_INTERFACE, > + (VOID*)&mRedfishConfigLangMapPrivate->Protocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, can not install > gEdkIIRedfishConfigLangMapProtocolGuid: %r\n", __FUNCTION__, Status)); > + ASSERT (FALSE); > + goto ON_ERROR; > + } > + > + // > + // Create Exit Boot Service event. > + // > + Status =3D gBS->CreateEventEx ( > + EVT_NOTIFY_SIGNAL, > + TPL_CALLBACK, > + RedfishConfigLangMapOnExitBootService, > + NULL, > + &gEfiEventExitBootServicesGuid, > + &mRedfishConfigLangMapPrivate->ExitBootEvent > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Fail to register Exit Boot Service event."= , > __FUNCTION__)); > + goto ON_ERROR; > + } > + > + // > + // Read existing record from variable. > + // > + Status =3D InitialConfigLangMapList > + (&mRedfishConfigLangMapPrivate->ConfigLangList, > + mRedfishConfigLangMapPrivate->VariableName); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_INFO, "%a, Initial ConfigLangMap List: %r\n", > + __FUNCTION__, Status)); } > + > + // > + // Register after provisioning event > + // > + Status =3D CreateAfterProvisioningEvent ( > + RedfishConfigLangMapOnExitBootService, > + NULL, > + &mRedfishConfigLangMapPrivate->ProvisionEvent > + ); > + > + return EFI_SUCCESS; > + > +ON_ERROR: > + > + RedfishConfigLangMapDriverUnload (ImageHandle); > + > + return Status; > +} > diff --git > a/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.h > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe. > h > new file mode 100644 > index 0000000000..d053921068 > --- /dev/null > +++ > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe. > h > @@ -0,0 +1,71 @@ > +/** @file > + Common header file for RedfishConfigLangMapDxe driver. > + > + (C) Copyright 2022 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef REDFISH_CONFIG_LANG_MAP_DXE_H_ > +#define REDFISH_CONFIG_LANG_MAP_DXE_H_ > + > +#include > +#include > + > +// > +// Libraries > +// > +#include > +#include > +#include > + > +#include #include > + > +#include #include > +#include > +#include > +#include > + > +#include > + > +#define CONFIG_LANG_MAP_VARIABLE_NAME > L"RedfishConfigLangMap" > +#define CONFIG_LANG_MAP_DEBUG_ENABLED 0x00 > + > +// > +// Definition of REDFISH_CONFIG_LANG_MAP_RECORD // typedef struct { > + LIST_ENTRY List; > + EFI_STRING Uri; > + EFI_STRING ConfigLang; > + UINTN Size; > +} REDFISH_CONFIG_LANG_MAP_RECORD; > + > +#define REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST(a) BASE_CR > (a, > +REDFISH_CONFIG_LANG_MAP_RECORD, List) > + > +// > +// Definition of REDFISH_CONFIG_LANG_MAP_LIST // typedef struct { > + LIST_ENTRY Listheader; > + UINTN TotalSize; > + UINTN Count; > +} REDFISH_CONFIG_LANG_MAP_LIST; > + > +// > +// Definition of REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA > +// > +typedef struct { > + EFI_HANDLE ImageHandle; > + REDFISH_CONFIG_LANG_MAP_LIST ConfigLangList; > + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL Protocol; > + EFI_STRING VariableName; > + EFI_EVENT ExitBootEvent; > + EFI_EVENT ProvisionEvent; > +} REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA; > + > +#define REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS(a) BASE_CR > (a, > +REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA, Protocol) > + > +#endif > diff --git > a/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.i > nf > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.i > nf > new file mode 100644 > index 0000000000..9f19533815 > --- /dev/null > +++ > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.i > +++ nf > @@ -0,0 +1,46 @@ > +## @file > +# > +# (C) Copyright 2022 Hewlett Packard Enterprise Development LP
# # > +SPDX-License-Identifier: BSD-2-Clause-Patent # ## > + > +[Defines] > + INF_VERSION =3D 0x0001000b > + BASE_NAME =3D RedfishConfigLangMapDxe > + FILE_GUID =3D F4121E32-454D-4E51-AB4B-DAA577833E95 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + ENTRY_POINT =3D RedfishConfigLangMapDriverEntryPoint > + UNLOAD_IMAGE =3D RedfishConfigLangMapDriverUnload > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + RedfishPkg/RedfishPkg.dec > + RedfishClientPkg/RedfishClientPkg.dec > + > +[Sources] > + RedfishConfigLangMapDxe.h > + RedfishConfigLangMapDxe.c > + > +[LibraryClasses] > + BaseLib > + BaseMemoryLib > + DebugLib > + MemoryAllocationLib > + UefiLib > + UefiBootServicesTableLib > + UefiRuntimeServicesTableLib > + UefiDriverEntryPoint > + RedfishEventLib > + > +[Protocols] > + gEdkIIRedfishConfigLangMapProtocolGuid ## PRODUCED ## > + > +[Guids] > + gEfiEventExitBootServicesGuid ## CONSUMED ## > + > +[Depex] > + TRUE > -- > 2.32.0.windows.2