From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (NAM10-DM6-obe.outbound.protection.outlook.com [40.107.93.41]) by mx.groups.io with SMTP id smtpd.web11.6399.1683682192357724751 for ; Tue, 09 May 2023 18:29:52 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=f8D37Dop; 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.93.41, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZFKYsqmUy55qbsllDcZ/zy8QYPYQOre0YBYF0FE2eqfY/gDkKt/2FaVfVZSMZ6k2YenyEKzu6/D4hKvsb5COUtjW6KQJ1tkeiwaEUxs5929fEL2wo9xuu+5sN3Kf+VgIRO3qhRch1dQWA2cMQ+ercGI7wHX8zneEO7NWJwLVV9dByRJFfcrAlf9664gyj1ZXNTV9f5krz15lImS7A5oi69znJCs9x0EFGCOw1szb66nzjYtbaKBJX/hV027zlbYuTw3d47acxBv3f6CCid553qHmh4bB3TaMQqpFMJIxJixU+pivighnkoTo7zuJqkKsWb+gTIdJp3ndAN4tLkFZjA== 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=ScCzyiw5/mbZ3FCUJCZ2rnhD7GqxV9+HC4l3H0P+Fgs=; b=VWmpk2Hhmiun0g9W9p8f09Y9Qe5SblOfFiJrpKTNaOuOsQdZVBHQTwdD5M/etxabm78m3OX9aYCoEcBa5St/gCdTtgl9224sZJsI5zT/YFyIYdFaDBMZAexoCo9kGIfaLlTvzaYy7WaEqQmtG3Qxy7Ndr2rvzP00bpEfL/iitfNGYtEzGhCXn7lmt1fOP7wpSm9mgQvxMm3Xqz6w3U1xOP6kVZkjX+RQbJka+mZfUT08fgdRYdjLKcJcPKB8DKCdtxhmdoOgE//SVUD16BQ7OfDgktm6a8SmL/VjP2eQjxMsy40Hz1ahVltD9iR5fK8VwCrj/Ouml8a32qlOl0j/TQ== 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=ScCzyiw5/mbZ3FCUJCZ2rnhD7GqxV9+HC4l3H0P+Fgs=; b=f8D37DopJQWAcZkwPuAiJFBWEBCUEUeArXfpZcOKYt/KTMDwJahjFgcPMi3qoHk9hm8Ab+vR/U/WpIPK7JQ1PQ5yILNSx0vOIGSd6q890ntAK+Sz6N7GrsiMIhHTTo+cuHafsl/9gb5ToFGTC2m4+GGZ/jWBrJwbdJPz8uEWhXo= Received: from MN2PR12MB3966.namprd12.prod.outlook.com (2603:10b6:208:165::18) by CY5PR12MB6550.namprd12.prod.outlook.com (2603:10b6:930:42::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.33; Wed, 10 May 2023 01:29:49 +0000 Received: from MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::46f1:bdce:a4bc:29e3]) by MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::46f1:bdce:a4bc:29e3%3]) with mapi id 15.20.6363.032; Wed, 10 May 2023 01:29:49 +0000 From: "Chang, Abner" To: Nickle Wang , "devel@edk2.groups.io" CC: Igor Kulchytskyy Subject: Re: [edk2-redfish-client][PATCH 6/6] RedfishClientPkg: Introduce RedfishConfigLangMap driver Thread-Topic: [edk2-redfish-client][PATCH 6/6] RedfishClientPkg: Introduce RedfishConfigLangMap driver Thread-Index: AQHZgn59Mj7EhuryMEWOrzdG8vx5fa9SuNBg Date: Wed, 10 May 2023 01:29:49 +0000 Message-ID: References: <20230509135920.7313-1-nicklew@nvidia.com> In-Reply-To: <20230509135920.7313-1-nicklew@nvidia.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=2023-05-10T01:29:46Z; 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=118be7e9-bcee-495c-a3b8-0a8a0a4c41d5; 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-traffictypediagnostic: MN2PR12MB3966:EE_|CY5PR12MB6550:EE_ x-ms-office365-filtering-correlation-id: 008b7708-b71a-41ff-11ea-08db50f60be6 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: lIIQRoFYwzcSpdn6fCBOBWrzHWbRX9wnQqh8WhW4TtKIS2Z7lKxVRKvfoQD8pSDYGX6H4H4WXOG59G7KRmMo/cuIHj1/VLRTL6yeJOaWYMh3uhLy/Qv8CeqBInfnhdvQ+5CnP5K146EmS1PzN0RwXlALFyfG5LJ5OIeayxMvBE6EDBOUZ/Gpq5qku6B5wbfdm/6MqM4V2YiX34s3dBljrSj/O9vDOi8Bcecfh/dkVpAmaCpbZ1Na8dwhcNZLf2FMGnR9lWoTxsJtupA8phwJAnhG+wsesBA+B1PjJl0fhO1Qd5eEGOhFruteN1cQ2wapzPaJ9M8IFp72Aqrok4ad6mJL1Xa959Ez8PZHym2jMpAlnTeBsgHsYakD2O6lMAJ5kc9jEQQlyvXbQ8F3zvXCHNWFE6ty19XU3mKB12/Kc7D1b8tnfGqWjFYzZSdtS/hgWSuCC3AR53IQW6YH9X5zkkvLQ/bB3FKqAt9S1RdVJ1QCqmrM2Bf3mFJlScpyYadrV1/xfyQakqHC03nn04D5Ew72v7dTo6z3frNHWRsXjxx3JRAdQAZhLuGoZwaZOhFWrzfu83brWGK2LWtRLQmmLSmuW+KY0zkItmMUEkvf3JY3Nk5dUaXKDymk+noKYvyy 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:(13230028)(4636009)(39860400002)(366004)(396003)(136003)(346002)(376002)(451199021)(2906002)(86362001)(83380400001)(38070700005)(186003)(4326008)(41300700001)(66476007)(66946007)(76116006)(66446008)(64756008)(66556008)(9686003)(6506007)(26005)(53546011)(30864003)(5660300002)(33656002)(7696005)(38100700002)(52536014)(71200400001)(55016003)(122000001)(110136005)(316002)(8676002)(8936002)(478600001)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?DWEpJKWT2GARUgRBQbMgWIuGUrdaV0ims2IwkjTlwfbBP1B3uzAgo+Kgrdvk?= =?us-ascii?Q?JPNOfd4P42JtKD+gsRqdBEu4HSBQ8vRCv/1u3VcEz0HSWSiB7dz3qYp4THkk?= =?us-ascii?Q?3uTMlDkeQyE0Swm2fMFM4mS6Jy4hR3A2QlrDiZsER1coVNE3UjYNq+SeMGG5?= =?us-ascii?Q?Le60gPEXpTcutnb0uqmMjy/u57TaWlJSSZ3XuzTl7zlDbogmL2rXC0o1Au4U?= =?us-ascii?Q?/ihQDp3SZx8JkvpkOohsZfoFcS74NAPuZpmcktz/1SoX2fjgOSrFP8Z9kQez?= =?us-ascii?Q?VknbIrfF0wl8HU5waPUf2ZuFvLkI0e+0vbmNb7SAsktLkgFXtQArTtkyOUOW?= =?us-ascii?Q?1v+GBQbjnFxDJJTjwJ1NLYDk895BQG6/3cXUJX3RewJ8cWAgUrxL5KmgwKMf?= =?us-ascii?Q?rgN06jXj30AGJqMg/chC//ziPffJ5HOv0py+eLc13oGIaLWjDZILxSNOKak/?= =?us-ascii?Q?cxRlZBHlmo54kdm7u1/u6zN6mWWiP+t//bFT1PxzMrEES3+wKlzTx+pPRHWG?= =?us-ascii?Q?7RAFG2w4+iK7YFuuRAWRxmYO++oSJkxkKsXt1cd57MopZTiGgMITjjwtbGnx?= =?us-ascii?Q?GyhM8uq/qMpCZtZ2A3lfMQB+Ug8A/p5mMP9hfISByFlopzS01Kfq3eqpLlp/?= =?us-ascii?Q?Prv8ik8DZmBlxdPwJi1v3inCbc8jyk08a3zaRTJOly54TOzRF8AsfUWgyJcJ?= =?us-ascii?Q?lXvcIFimFIkZ4xv98EFDUQsFKX3CQb5mYBFg1wf7IRzWrlbr6KmeyHz1tNRm?= =?us-ascii?Q?9UhVigmF4iHtYtULZO0r4BVMV/TVY9V0b3ZLswr34TlQC5GeR7MQ4wSRO7lA?= =?us-ascii?Q?DJLDdg0xyzKh1tU7z3WSQQEY4iUJGO4DMlCcnGKoMP58oAfQoFCS5m2hch2t?= =?us-ascii?Q?u+hNzDK69b9O4vyMKOo7ktLWIKkqWjukRPSvMsnKYYzPdasJYyRFo1nCkJNX?= =?us-ascii?Q?EHaGuGdZYso5byRLAE9lO5Gi+2pEKTnwTeOFuiv335s1xIT6iSn67riR+Fn6?= =?us-ascii?Q?I86K2RQkECoLQxyTRyumey3lWay8DaV/tKexxVBFdyTABoIyHU8I9KG5TVWH?= =?us-ascii?Q?8+fPjK3CQfUqHn2veyyRkGkdGRYOgrMb5YCgfx/sOphCzqEZvYnsT8swvXWm?= =?us-ascii?Q?ZcZFugx3r1WXztaPCfVpif1Tqm8ja2Br9EKInbUya70fmbx+g6UVqKtOfR66?= =?us-ascii?Q?dJhng2KtK0etVG7i5GfLrXUxNpqKFwJAdygST5JTDPb8RnGV6OWPKsM15Ci6?= =?us-ascii?Q?4hpMa1k4yM6wdEmqDZcgdfFnG4n7OMXN/842ZHiQE+fO+qlQo4MisWA71Kxl?= =?us-ascii?Q?SxK4jpYgzK3Ht+Wl6V3y/kYPt70dYFppLM6UDWvgjQV+Zr0Fb6PkZ+ueTEtp?= =?us-ascii?Q?/+VYZYwsbE7/5twABaEkOD/o/GwI1b8XYxmqDvn27N7VwYSgKq6oWwWCQqhN?= =?us-ascii?Q?L/sgMkcKw1Wh7Mu1KFYJ2vs8g3DwpeqMqOpMHFwusEI2cy/MenimAhnagZz8?= =?us-ascii?Q?Bx7PMId8esUHhsbnrnj4EEpSiz+L/eVfp2veIPfBzEvqSwNbFpiw5xCYpX7+?= =?us-ascii?Q?iz5sYgXNCl2XmmgamBycAZAb5LVKAeQxlaX++b3R?= 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: 008b7708-b71a-41ff-11ea-08db50f60be6 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 May 2023 01:29:49.4645 (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: +rQfANAtnefDCzfugsA3/rhIDSUDSTjCd3DAh7vjep0HUCQWD7rbiKabXqwlZz7j1cK5zWNq9NvpL2kQQl1tvQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6550 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: Tuesday, May 9, 2023 9:59 PM > To: devel@edk2.groups.io > Cc: Chang, Abner ; Igor Kulchytskyy > > Subject: [edk2-redfish-client][PATCH 6/6] RedfishClientPkg: Introduce > RedfishConfigLangMap driver >=20 > Caution: This message originated from an External Source. Use proper > caution when opening attachments, clicking links, or responding. >=20 >=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: Igor Kulchytskyy > --- > RedfishClientPkg/RedfishClientPkg.dec | 2 + > .../RedfishClientComponents.dsc.inc | 1 + > .../RedfishConfigLangMapDxe.inf | 46 + > .../EdkIIRedfishConfigLangMapProtocol.h | 88 ++ > .../RedfishConfigLangMapDxe.h | 71 ++ > .../RedfishConfigLangMapDxe.c | 809 ++++++++++++++++++ > RedfishClientPkg/RedfishClient.fdf.inc | 3 +- > 7 files changed, 1019 insertions(+), 1 deletion(-) create mode 100644 > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf > create mode 100644 > RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h > create mode 100644 > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.h > create mode 100644 > RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.c >=20 > diff --git a/RedfishClientPkg/RedfishClientPkg.dec > b/RedfishClientPkg/RedfishClientPkg.dec > index c61c5812..7bdab5be 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/RedfishClientComponents.dsc.inc > b/RedfishClientPkg/RedfishClientComponents.dsc.inc > index b89df12c..ee4602fe 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/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.i > nf > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.i > nf > new file mode 100644 > index 00000000..9f195338 > --- /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 > diff --git > a/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h > b/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h > new file mode 100644 > index 00000000..89846d06 > --- /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/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.h > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe. > h > new file mode 100644 > index 00000000..efa27d4d > --- /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.c > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.c > new file mode 100644 > index 00000000..cea61f90 > --- /dev/null > +++ > b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.c > @@ -0,0 +1,809 @@ > +/** @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 (!IsNull (&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 (!IsNull (&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) || (ResultStri= ng =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->= ConfigLang : > 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/RedfishClient.fdf.inc > b/RedfishClientPkg/RedfishClient.fdf.inc > index d5d04e4c..6292de4e 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 > -- > 2.17.1