From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-002e3701.pphosted.com (mx0a-002e3701.pphosted.com [148.163.147.86]) by mx.groups.io with SMTP id smtpd.web09.8530.1657628517181559676 for ; Tue, 12 Jul 2022 05:21:57 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@hpe.com header.s=pps0720 header.b=YB5fUBWw; spf=permerror, err=parse error for token &{10 18 %{ir}.%{v}.%{d}.spf.has.pphosted.com}: invalid domain name (domain: hpe.com, ip: 148.163.147.86, mailfrom: prvs=0192e24d61=nickle.wang@hpe.com) Received: from pps.filterd (m0134422.ppops.net [127.0.0.1]) by mx0b-002e3701.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26C9n9Ao016448; Tue, 12 Jul 2022 12:21:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hpe.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pps0720; bh=aK8n6O1+LdUOVrqTuXVlg0T0KW6hG1jk4hsp82Ayqfk=; b=YB5fUBWwuJ+L3fCe7KfNVvFQu1G+xobH5IDkzDkH2AI3WdFcUUMAHkUTfyygvhNq5wVe RUc5PPfyDIgL4sApTFNO0LBBqJb4USq0k+DsFs/lSUyYcTwBqdk0WOa5zIoHZ7xurATq KrWfAZ9NFTp6vqfm0SKWGZjYkg+ytt1B2jUHGi8CISVYLo0D92wDp8TeImSdwKzqsw06 uwZ60/HXNyDIkmcvhJ6MBhx4AYs+iDVYrVw2TCjF7UcvEBYsP5QUrUJM8vJb0BnyeWzk fvtudiYgm4iAL7hltS8DpIf+878M/c7/p22saGUFe96k5eVFmsDLtrik+Vx1x8b+FSPN 7g== Received: from p1lg14880.it.hpe.com (p1lg14880.it.hpe.com [16.230.97.201]) by mx0b-002e3701.pphosted.com (PPS) with ESMTPS id 3h96nf175t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 12 Jul 2022 12:21:53 +0000 Received: from p1lg14885.dc01.its.hpecorp.net (unknown [10.119.18.236]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by p1lg14880.it.hpe.com (Postfix) with ESMTPS id CC6BF800223; Tue, 12 Jul 2022 12:21:52 +0000 (UTC) Received: from WAFM3XJD5N.asiapacific.hpqcorp.net (unknown [16.231.227.36]) by p1lg14885.dc01.its.hpecorp.net (Postfix) with ESMTP id CB71A8052F6; Tue, 12 Jul 2022 12:21:51 +0000 (UTC) From: "Nickle Wang" To: devel@edk2.groups.io Cc: Abner Chang , Yang Atom , Nick Ramirez Subject: [edk2-staging][PATCH 06/15] edk2-staging/RedfishClientPkg: Introduce RedfishConfigLangMap driver Date: Tue, 12 Jul 2022 20:21:34 +0800 Message-Id: <20220712122143.1827-7-nickle.wang@hpe.com> X-Mailer: git-send-email 2.32.0.windows.2 In-Reply-To: <20220712122143.1827-1-nickle.wang@hpe.com> References: <20220712122143.1827-1-nickle.wang@hpe.com> MIME-Version: 1.0 X-Proofpoint-GUID: 214F3774W0i7OtcayEue6Nze8WtlJZMB X-Proofpoint-ORIG-GUID: 214F3774W0i7OtcayEue6Nze8WtlJZMB X-HPE-SCL: -1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-12_08,2022-07-12_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 phishscore=0 mlxlogscore=999 mlxscore=0 malwarescore=0 adultscore=0 suspectscore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207120048 Content-Transfer-Encoding: quoted-printable 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. 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/EdkIIRedfishConfigLan= gMapProtocol.h create mode 100644 RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigL= angMapDxe.c create mode 100644 RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigL= angMapDxe.h create mode 100644 RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigL= angMapDxe.inf diff --git a/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapPro= tocol.h b/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtoc= ol.h new file mode 100644 index 0000000000..03d18aa297 --- /dev/null +++ b/RedfishClientPkg/Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h @@ -0,0 +1,88 @@ +/** @file=0D + This file defines the EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL interface.= =0D +=0D + (C) Copyright 2022 Hewlett Packard Enterprise Development LP
=0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#ifndef EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_H_=0D +#define EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_H_=0D +=0D +typedef struct _EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL EDKII_REDFISH_CONFI= G_LANG_MAP_PROTOCOL;=0D +=0D +/**=0D + Definition of REDFISH_CONFIG_LANG_MAP_GET_TYPE=0D + **/=0D +typedef enum {=0D + RedfishGetTypeUri =3D 0,=0D + RedfishGetTypeConfigLang,=0D + RedfishGetTypeMax=0D +} REDFISH_CONFIG_LANG_MAP_GET_TYPE;=0D +=0D +/**=0D + Get string in database by given query string.=0D +=0D + @param[in] This Pointer to EDKII_REDFISH_CONFIG_LAN= G_MAP_PROTOCOL instance.=0D + @param[in] QueryStringType The type of given QueryString.=0D + @param[in] QueryString Query string.=0D + @param[out] ResultString Returned string mapping to give que= ry string.=0D +=0D + @retval EFI_SUCCESS The result is found successfully.=0D + @retval EFI_INVALID_PARAMETER Invalid parameter is given.=0D +=0D +**/=0D +typedef=0D +EFI_STATUS=0D +(EFIAPI *EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_GET) (=0D + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This,=0D + IN REDFISH_CONFIG_LANG_MAP_GET_TYPE QueryStringType,=0D + IN EFI_STRING QueryString,=0D + OUT EFI_STRING *ResultString=0D + );=0D +=0D +/**=0D + Save URI string which maps to given ConfigLang.=0D +=0D + @param[in] This Pointer to EDKII_REDFISH_CONFIG_LANG_MA= P_PROTOCOL instance.=0D + @param[in] ConfigLang Config language to set=0D + @param[in] Uri Uri which is mapping to give ConfigLang= . If Uri is NULL,=0D + the record will be removed.=0D +=0D + @retval EFI_SUCCESS Uri is saved successfully.=0D + @retval Others Some error happened.=0D +=0D +**/=0D +typedef=0D +EFI_STATUS=0D +(EFIAPI *EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_SET) (=0D + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This,=0D + IN EFI_STRING ConfigLang,=0D + IN EFI_STRING Uri OPTIONAL=0D + );=0D +=0D +/**=0D + Refresh the resource map database and save database to variable.=0D +=0D + @param[in] This Pointer to EDKII_REDFISH_CONFIG_LANG_MA= P_PROTOCOL instance.=0D +=0D + @retval EFI_SUCCESS database is saved successfully.=0D + @retval Others Some error happened.=0D +=0D +**/=0D +typedef=0D +EFI_STATUS=0D +(EFIAPI *EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_FLUSH) (=0D + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This=0D + );=0D +=0D +struct _EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL {=0D + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_GET Get;=0D + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_SET Set;=0D + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL_FLUSH Flush;=0D +};=0D +=0D +extern EFI_GUID gEdkIIRedfishConfigLangMapProtocolGuid;=0D +=0D +#endif=0D diff --git a/RedfishClientPkg/RedfishClient.fdf.inc b/RedfishClientPkg/Redf= ishClient.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 specify= the module instances=0D # to be built in the firmware volume.=0D #=0D -# (C) Copyright 2021 Hewlett Packard Enterprise Development LP
=0D +# (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
=0D #=0D # SPDX-License-Identifier: BSD-2-Clause-Patent=0D #=0D @@ -13,6 +13,7 @@ !if $(REDFISH_CLIENT) =3D=3D TRUE=0D INF RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf=0D INF RedfishClientPkg/RedfishETagDxe/RedfishETagDxe.inf=0D + INF RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf= =0D INF RedfishClientPkg/Features/Memory/V1_7_1/Dxe/RedfishMemoryDxe.inf=0D INF RedfishClientPkg/Features/RedfishMemoryCollectionDxe/RedfishMemoryCo= llectionDxe.inf=0D =0D diff --git a/RedfishClientPkg/RedfishClientComponents.dsc.inc b/RedfishClie= ntPkg/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=0D RedfishClientPkg/RedfishFeatureCoreDxe/RedfishFeatureCoreDxe.inf=0D RedfishClientPkg/RedfishETagDxe/RedfishETagDxe.inf=0D + RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf=0D #=0D # Below two modules should be pulled in by build tool.=0D #=0D diff --git a/RedfishClientPkg/RedfishClientPkg.dec b/RedfishClientPkg/Redfi= shClientPkg.dec index c61c581213..7bdab5be0c 100644 --- a/RedfishClientPkg/RedfishClientPkg.dec +++ b/RedfishClientPkg/RedfishClientPkg.dec @@ -38,6 +38,8 @@ gEdkIIRedfishResourceConfigProtocolGuid =3D { 0x6f164c68, 0xfb09, 0x4646= , { 0xa8, 0xd3, 0x24, 0x11, 0x5d, 0xab, 0x3e, 0xe7 } }=0D ## Include/Protocol/EdkiiRedfishETagProtocol.h=0D gEdkIIRedfishETagProtocolGuid =3D { 0x5706d368, 0xaf66, 0x48f5= , { 0x89, 0xfc, 0xa6, 0x61, 0xce, 0xb5, 0xa6, 0xa9 } }=0D + ## Include/Protocol/EdkIIRedfishConfigLangMapProtocol.h=0D + gEdkIIRedfishConfigLangMapProtocolGuid =3D { 0x1d9ba9fe, 0x5d5a, 0x4b= 66, {0x83, 0x5b, 0xe2, 0x5d, 0x13, 0x93, 0x4a, 0x9c } }=0D ## Include/Protocol/EdkIIRedfishInterchangeData.h=0D gEdkIIRedfishFeatureInterchangeDataProtocolGuid =3D { 0x4B8FF71C, 0x4A7B= , 0x9478, { 0xB7, 0x81, 0x35, 0x9B, 0x0A, 0xF2, 0x00, 0x91 } }=0D =0D diff --git a/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapD= xe.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=0D +=0D + (C) Copyright 2022 Hewlett Packard Enterprise Development LP
=0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#include "RedfishConfigLangMapDxe.h"=0D +=0D +REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA *mRedfishConfigLangMapPrivate =3D NU= LL;=0D +=0D +/**=0D + Release REDFISH_CONFIG_LANG_MAP_RECORD resource=0D +=0D + @param[in] Record Pointer to REDFISH_CONFIG_LANG_MAP_RECORD instan= ce=0D +=0D + @retval EFI_SUCCESS REDFISH_CONFIG_LANG_MAP_RECORD is releas= ed successfully.=0D + @retval EFI_INVALID_PARAMETER Record is NULL=0D +=0D +**/=0D +EFI_STATUS=0D +ReleaseConfigLangMapRecord (=0D + IN REDFISH_CONFIG_LANG_MAP_RECORD *Record=0D + )=0D +{=0D + if (Record =3D=3D NULL) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + if (Record->Uri !=3D NULL) {=0D + FreePool (Record->Uri);=0D + }=0D +=0D + if (Record->ConfigLang !=3D NULL) {=0D + FreePool (Record->ConfigLang);=0D + }=0D +=0D + FreePool (Record);=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D + Create new resource map resource.=0D +=0D + @param[in] Uri The URI string matching to this ConfigLang.=0D + @param[in] ConfigLang ConfigLang string.=0D +=0D + @retval REDFISH_CONFIG_LANG_MAP_RECORD * Pointer to newly created confi= g language map.=0D + @retval NULL No memory available.=0D +=0D +**/=0D +REDFISH_CONFIG_LANG_MAP_RECORD *=0D +NewConfigLangMapRecord (=0D + IN EFI_STRING Uri,=0D + IN EFI_STRING ConfigLang=0D + )=0D +{=0D + REDFISH_CONFIG_LANG_MAP_RECORD *NewRecord;=0D + UINTN Size;=0D +=0D + if (IS_EMPTY_STRING (Uri) || IS_EMPTY_STRING (ConfigLang)) {=0D + return NULL;=0D + }=0D +=0D + NewRecord =3D AllocateZeroPool (sizeof (REDFISH_CONFIG_LANG_MAP_RECORD))= ;=0D + if (NewRecord =3D=3D NULL) {=0D + return NULL;=0D + }=0D +=0D + Size =3D StrSize (Uri);=0D + NewRecord->Uri =3D AllocateCopyPool (Size, Uri);=0D + if (NewRecord->Uri =3D=3D NULL) {=0D + goto ON_ERROR;=0D + }=0D +=0D + NewRecord->Size =3D Size;=0D + Size =3D StrSize (ConfigLang);=0D + NewRecord->ConfigLang =3D AllocateCopyPool (Size, ConfigLang);=0D + if (NewRecord->ConfigLang =3D=3D NULL) {=0D + goto ON_ERROR;=0D + }=0D +=0D + NewRecord->Size +=3D Size;=0D + return NewRecord;=0D +=0D +ON_ERROR:=0D +=0D + if (NewRecord !=3D NULL) {=0D + ReleaseConfigLangMapRecord (NewRecord);=0D + }=0D +=0D + return NULL;=0D +}=0D +=0D +/**=0D + Add new config language map by given URI and ConfigLang string to specif= y List.=0D +=0D + @param[in] List Target config language map list to add.=0D + @param[in] Uri The URI string matching to this ConfigLang.=0D + @param[in] ConfigLang ConfigLang string.=0D +=0D + @retval EFI_SUCCESS config language map recourd is added.=0D + @retval Others Fail to add config language map.=0D +=0D +**/=0D +EFI_STATUS=0D +AddConfigLangMapRecord (=0D + IN REDFISH_CONFIG_LANG_MAP_LIST *List,=0D + IN EFI_STRING Uri,=0D + IN EFI_STRING ConfigLang=0D + )=0D +{=0D + REDFISH_CONFIG_LANG_MAP_RECORD *NewRecord;=0D +=0D + if (List =3D=3D NULL || IS_EMPTY_STRING (Uri) || IS_EMPTY_STRING (Config= Lang)) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + NewRecord =3D NewConfigLangMapRecord (Uri, ConfigLang);=0D + if (NewConfigLangMapRecord =3D=3D NULL) {=0D + return EFI_OUT_OF_RESOURCES;=0D + }=0D +=0D + InsertTailList (&List->Listheader, &NewRecord->List);=0D + ++List->Count;=0D + List->TotalSize +=3D NewRecord->Size;=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D + Delete an config language map by given config language map instance.=0D +=0D + @param[in] List Target config language map list to be removed.=0D + @param[in] Record Pointer to the instance to be deleted.=0D +=0D + @retval EFI_SUCCESS config language map recourd is removed.=0D + @retval Others Fail to add config language map.=0D +=0D +**/=0D +EFI_STATUS=0D +DeleteConfigLangMapRecord (=0D + IN REDFISH_CONFIG_LANG_MAP_LIST *List,=0D + IN REDFISH_CONFIG_LANG_MAP_RECORD *Record=0D + )=0D +{=0D + if (List =3D=3D NULL || Record =3D=3D NULL) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + RemoveEntryList (&Record->List);=0D + --List->Count;=0D + List->TotalSize -=3D Record->Size;=0D +=0D + return ReleaseConfigLangMapRecord (Record);=0D +}=0D +=0D +/**=0D + Search on given ListHeader for given ConfigLang string.=0D +=0D + @param[in] ListHeader Target list to search.=0D + @param[in] Query Target string to search.=0D + @param[in] QueryIsUri Query string is URI string or not=0D +=0D + @retval REDFISH_CONFIG_LANG_MAP_RECORD Target in map is found.=0D + @retval NULL No target in map with given quer= y is found.=0D +=0D +**/=0D +REDFISH_CONFIG_LANG_MAP_RECORD *=0D +FindConfigLangMapRecord (=0D + IN LIST_ENTRY *ListHeader,=0D + IN EFI_STRING Query,=0D + IN BOOLEAN QueryIsUri=0D + )=0D +{=0D + LIST_ENTRY *List;=0D + REDFISH_CONFIG_LANG_MAP_RECORD *Record;=0D +=0D + if (IsListEmpty (ListHeader)) {=0D + return NULL;=0D + }=0D +=0D + if (IS_EMPTY_STRING (Query)) {=0D + return NULL;=0D + }=0D +=0D + Record =3D NULL;=0D + List =3D GetFirstNode (ListHeader);=0D + while (!IsNull (ListHeader, List)) {=0D + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List);=0D +=0D + if (QueryIsUri) {=0D + if (StrCmp (Record->Uri, Query) =3D=3D 0) {=0D + return Record;=0D + }=0D + } else {=0D + if (StrCmp (Record->ConfigLang, Query) =3D=3D 0) {=0D + return Record;=0D + }=0D + }=0D +=0D + List =3D GetNextNode (ListHeader, List);=0D + }=0D +=0D + return NULL;=0D +}=0D +=0D +#if CONFIG_LANG_MAP_DEBUG_ENABLED=0D +/**=0D + Debug output the config language map list.=0D +=0D + @param[in] ConfigLangMapList Target list to dump=0D + @param[in] Msg Debug message string.=0D +=0D + @retval EFI_SUCCESS Debug dump finished.=0D + @retval EFI_INVALID_PARAMETER ConfigLangMapList is NULL.=0D +=0D +**/=0D +EFI_STATUS=0D +DumpConfigLangMapList (=0D + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList,=0D + IN EFI_STRING Msg=0D + )=0D +{=0D + LIST_ENTRY *List;=0D + REDFISH_CONFIG_LANG_MAP_RECORD *Record;=0D +=0D + if (ConfigLangMapList =3D=3D NULL) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + if (!IS_EMPTY_STRING (Msg)) {=0D + DEBUG ((DEBUG_ERROR, "%s\n", Msg));=0D + }=0D +=0D + if (IsListEmpty (&ConfigLangMapList->Listheader)) {=0D + DEBUG ((DEBUG_INFO, "ConfigLangMap list is empty\n"));=0D + return EFI_NOT_FOUND;=0D + }=0D +=0D + DEBUG ((DEBUG_INFO, "Count: %d Total Size: %d\n", ConfigLangMapList->Cou= nt, ConfigLangMapList->TotalSize));=0D + Record =3D NULL;=0D + List =3D GetFirstNode (&ConfigLangMapList->Listheader);=0D + while (!IsNull (&ConfigLangMapList->Listheader, List)) {=0D + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List);=0D +=0D + DEBUG ((DEBUG_INFO, "ConfigLang: %s Uri: %s Size: %d\n", Record->Confi= gLang, Record->Uri, Record->Size));=0D +=0D + List =3D GetNextNode (&ConfigLangMapList->Listheader, List);=0D + }=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D + Debug output raw data buffer.=0D +=0D + @param[in] Buffer Debug output data buffer.=0D + @param[in] BufferSize The size of Buffer in byte.=0D +=0D + @retval EFI_SUCCESS Debug dump finished.=0D + @retval EFI_INVALID_PARAMETER Buffer is NULL.=0D +=0D +**/=0D +EFI_STATUS=0D +DumpRawBuffer (=0D + IN UINT8 *Buffer,=0D + IN UINTN BufferSize=0D + )=0D +{=0D + UINTN Index;=0D + CHAR16 *Seeker;=0D +=0D + if (Buffer =3D=3D NULL) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + Index =3D 0;=0D + Seeker =3D (CHAR16 *)Buffer;=0D + DEBUG ((DEBUG_ERROR, "Buffer size: %d\n", BufferSize));=0D + while (Seeker[Index] !=3D '\0') {=0D + DEBUG ((DEBUG_ERROR, "(%d) %c ", (Index + 1), Seeker[Index]));=0D +=0D + ++Index;=0D + }=0D + DEBUG ((DEBUG_ERROR, "\n"));=0D +=0D + return EFI_SUCCESS;=0D +}=0D +#endif=0D +=0D +/**=0D + Release all ConfigLangMap from list.=0D +=0D + @param[in] ConfigLangMapList The list to be released.=0D +=0D + @retval EFI_SUCCESS All config lang is released.=0D + @retval EFI_INVALID_PARAMETER ConfigLangMapList is NULL.=0D +=0D +**/=0D +EFI_STATUS=0D +ReleaseConfigLangMapList (=0D + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList=0D + )=0D +{=0D + LIST_ENTRY *List;=0D + LIST_ENTRY *Next;=0D + REDFISH_CONFIG_LANG_MAP_RECORD *Record;=0D +=0D + if (ConfigLangMapList =3D=3D NULL) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + if (IsListEmpty (&ConfigLangMapList->Listheader)) {=0D + return EFI_SUCCESS;=0D + }=0D +=0D + Record =3D NULL;=0D + Next =3D NULL;=0D + List =3D GetFirstNode (&ConfigLangMapList->Listheader);=0D + while (!IsNull (&ConfigLangMapList->Listheader, List)) {=0D + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List);=0D + Next =3D GetNextNode (&ConfigLangMapList->Listheader, List);=0D +=0D + DeleteConfigLangMapRecord (ConfigLangMapList, Record);=0D +=0D + List =3D Next;=0D + }=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D + Save config lang in list to UEFI variable.=0D +=0D + @param[in] ConfigLangMapList The list to be saved.=0D + @param[in] VariableName The UEFI variable name.=0D +=0D + @retval EFI_SUCCESS All config lang is saved.=0D + @retval EFI_INVALID_PARAMETER VariableName or ConfigLangMapList is NUL= L.=0D +=0D +**/=0D +EFI_STATUS=0D +SaveConfigLangMapList (=0D + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList,=0D + IN EFI_STRING VariableName=0D + )=0D +{=0D + LIST_ENTRY *List;=0D + REDFISH_CONFIG_LANG_MAP_RECORD *Record;=0D + UINT8 *VarData;=0D + VOID *Data;=0D + EFI_STRING Seeker;=0D + UINTN VarSize;=0D + UINTN StringSize;=0D + EFI_STATUS Status;=0D +=0D + if (ConfigLangMapList =3D=3D NULL || IS_EMPTY_STRING (VariableName)) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + if (IsListEmpty (&ConfigLangMapList->Listheader)) {=0D + return EFI_SUCCESS;=0D + }=0D +=0D + //=0D + // Caculate the total size we need to keep ConfigLangMap list.=0D + //=0D + VarSize =3D ConfigLangMapList->TotalSize + sizeof (CHAR16); // terminato= r character=0D + VarData =3D AllocateZeroPool (VarSize);=0D + if (VarData =3D=3D NULL) {=0D + return EFI_OUT_OF_RESOURCES;=0D + }=0D +=0D + Seeker =3D (EFI_STRING)VarData;=0D + Record =3D NULL;=0D + List =3D GetFirstNode (&ConfigLangMapList->Listheader);=0D + while (!IsNull (&ConfigLangMapList->Listheader, List)) {=0D + Record =3D REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST (List);=0D +=0D + StringSize =3D StrSize (Record->Uri);=0D + CopyMem (Seeker, Record->Uri, StringSize);=0D +=0D + Seeker +=3D (StringSize / sizeof (CHAR16) - 1);=0D + *Seeker =3D '|';=0D + ++Seeker;=0D +=0D + StringSize =3D StrSize (Record->ConfigLang);=0D + CopyMem (Seeker, Record->ConfigLang, StringSize);=0D +=0D + Seeker +=3D (StringSize / sizeof (CHAR16) - 1);=0D + *Seeker =3D '\n';=0D +=0D + ++Seeker;=0D +=0D + List =3D GetNextNode (&ConfigLangMapList->Listheader, List);;=0D + }=0D +=0D + *Seeker =3D '\0';=0D +=0D +#if CONFIG_LANG_MAP_DEBUG_ENABLED=0D + DumpRawBuffer (VarData, VarSize);=0D +#endif=0D +=0D + ASSERT (((UINTN)Seeker - (UINTN)VarData + sizeof (CHAR16)) =3D=3D VarSiz= e);=0D +=0D + //=0D + // Check if variable exists already. If yes, remove it first.=0D + //=0D + Status =3D GetVariable2 (=0D + VariableName,=0D + &mRedfishVariableGuid,=0D + (VOID *)&Data,=0D + NULL=0D + );=0D + if (!EFI_ERROR (Status)) {=0D + FreePool (Data);=0D + gRT->SetVariable (VariableName, &mRedfishVariableGuid, VARIABLE_ATTRIB= UTE_NV_BS, 0, NULL);=0D + }=0D +=0D +=0D + return gRT->SetVariable (VariableName, &mRedfishVariableGuid, VARIABLE_A= TTRIBUTE_NV_BS, VarSize, (VOID *)VarData);=0D +}=0D +=0D +/**=0D + Read config lang map from UEFI variable if it exists.=0D +=0D + @param[in] ConfigLangMapList The list to be loaded.=0D + @param[in] VariableName The UEFI variable name.=0D +=0D + @retval EFI_SUCCESS All config lang is read successfully.=0D + @retval EFI_INVALID_PARAMETER VariableName or ConfigLangMapList is NUL= L.=0D + @retval EFI_NOT_FOUND No config lang is found on UEFI variable= .=0D +=0D +**/=0D +EFI_STATUS=0D +InitialConfigLangMapList (=0D + IN REDFISH_CONFIG_LANG_MAP_LIST *ConfigLangMapList,=0D + IN EFI_STRING VariableName=0D + )=0D +{=0D + UINT8 *VarData;=0D + EFI_STRING UriPointer;=0D + EFI_STRING ConfigLangPointer;=0D + EFI_STRING Seeker;=0D + UINTN VariableSize;=0D + EFI_STATUS Status;=0D +=0D + if (ConfigLangMapList =3D=3D NULL || IS_EMPTY_STRING (VariableName)) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + //=0D + // Check if variable exists already.=0D + //=0D + Status =3D GetVariable2 (=0D + VariableName,=0D + &mRedfishVariableGuid,=0D + (VOID *)&VarData,=0D + &VariableSize=0D + );=0D + if (EFI_ERROR (Status)) {=0D + return EFI_NOT_FOUND;=0D + }=0D +=0D + Seeker =3D (EFI_STRING)VarData;=0D + UriPointer =3D (EFI_STRING)VarData;=0D + ConfigLangPointer =3D (EFI_STRING)VarData;=0D + while (*Seeker !=3D '\0') {=0D +=0D + //=0D + // Find URI=0D + //=0D + Seeker =3D StrStr (UriPointer, L"|");=0D + if (Seeker =3D=3D NULL) {=0D + DEBUG ((DEBUG_ERROR, "%a, data corrupted\n", __FUNCTION__));=0D + Status =3D EFI_DEVICE_ERROR;=0D + goto ON_ERROR;=0D + }=0D +=0D + *Seeker =3D '\0';=0D + ConfigLangPointer =3D ++Seeker;=0D +=0D + //=0D + // Find config language map=0D + //=0D + Seeker =3D StrStr (ConfigLangPointer, L"\n");=0D + if (Seeker =3D=3D NULL) {=0D + DEBUG ((DEBUG_ERROR, "%a, data corrupted\n", __FUNCTION__));=0D + Status =3D EFI_DEVICE_ERROR;=0D + goto ON_ERROR;=0D + }=0D +=0D + *Seeker =3D '\0';=0D +=0D + AddConfigLangMapRecord (ConfigLangMapList, UriPointer, ConfigLangPoint= er);=0D +=0D + UriPointer =3D ++Seeker;=0D + }=0D +=0D +#if CONFIG_LANG_MAP_DEBUG_ENABLED=0D + DumpConfigLangMapList (ConfigLangMapList, L"Initial ConfigLangMap List f= rom Variable");=0D +#endif=0D +=0D + Status =3D EFI_SUCCESS;=0D +=0D +ON_ERROR:=0D +=0D + FreePool (VarData);=0D +=0D + return Status;=0D +}=0D +=0D +/**=0D + Get string in database by given query string.=0D +=0D + @param[in] This Pointer to EDKII_REDFISH_CONFIG_LAN= G_MAP_PROTOCOL instance.=0D + @param[in] QueryStringType The type of given QueryString.=0D + @param[in] QueryString Query string.=0D + @param[out] ResultString Returned string mapping to give que= ry string.=0D +=0D + @retval EFI_SUCCESS The result is found successfully.=0D + @retval EFI_INVALID_PARAMETER Invalid parameter is given.=0D +=0D +**/=0D +EFI_STATUS=0D +RedfishConfigLangMapGet (=0D + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This,=0D + IN REDFISH_CONFIG_LANG_MAP_GET_TYPE QueryStringType,=0D + IN EFI_STRING QueryString,=0D + OUT EFI_STRING *ResultString=0D + )=0D +{=0D + REDFISH_CONFIG_LANG_MAP_RECORD *Target;=0D + REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA *Private;=0D + EFI_STRING Result;=0D +=0D + if (This =3D=3D NULL || IS_EMPTY_STRING (QueryString) || ResultString = =3D=3D NULL || QueryStringType >=3D RedfishGetTypeMax) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + Private =3D REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS (This);=0D +=0D + *ResultString =3D NULL;=0D +=0D + Target =3D FindConfigLangMapRecord (&Private->ConfigLangList.Listheader,= QueryString, (QueryStringType =3D=3D RedfishGetTypeUri));=0D + if (Target =3D=3D NULL) {=0D +#if CONFIG_LANG_MAP_DEBUG_ENABLED=0D + DumpConfigLangMapList (&Private->ConfigLangList, L"EFI_NOT_FOUND");=0D +#endif=0D + return EFI_NOT_FOUND;=0D + }=0D +=0D + Result =3D (QueryStringType =3D=3D RedfishGetTypeUri ? Target->ConfigLan= g : Target->Uri);=0D + *ResultString =3D AllocateCopyPool (StrSize (Result), Result);=0D + if (*ResultString =3D=3D NULL) {=0D + return EFI_OUT_OF_RESOURCES;=0D + }=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +=0D +/**=0D + Save URI string which maps to given ConfigLang.=0D +=0D + @param[in] This Pointer to EDKII_REDFISH_CONFIG_LANG_MA= P_PROTOCOL instance.=0D + @param[in] ConfigLang Config language to set=0D + @param[in] Uri Uri which is mapping to give ConfigLang= . If Uri is NULL,=0D + the record will be removed.=0D +=0D + @retval EFI_SUCCESS Uri is saved successfully.=0D + @retval Others Some error happened.=0D +=0D +**/=0D +EFI_STATUS=0D +RedfishConfigLangMapSet (=0D + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This,=0D + IN EFI_STRING ConfigLang,=0D + IN EFI_STRING Uri OPTIONAL=0D + )=0D +{=0D + REDFISH_CONFIG_LANG_MAP_RECORD *Target;=0D + REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA *Private;=0D + EFI_STATUS Status;=0D +=0D + if (This =3D=3D NULL || IS_EMPTY_STRING (ConfigLang)) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + Private =3D REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS (This);=0D +=0D + Status =3D EFI_NOT_FOUND;=0D + Target =3D FindConfigLangMapRecord (&Private->ConfigLangList.Listheader,= ConfigLang, FALSE);=0D + if (Target !=3D NULL) {=0D + //=0D + // Remove old one and create new one.=0D + //=0D + Status =3D DeleteConfigLangMapRecord (&Private->ConfigLangList, Target= );=0D + }=0D +=0D + //=0D + // When Uri is NULL, it means that we want to remov this record.=0D + //=0D + if (Uri =3D=3D NULL) {=0D + return Status;=0D + }=0D +=0D + return AddConfigLangMapRecord (&Private->ConfigLangList, Uri, ConfigLang= );=0D +}=0D +=0D +/**=0D + Refresh the resource map database and save database to variable.=0D +=0D + @param[in] This Pointer to EDKII_REDFISH_CONFIG_LANG_MA= P_PROTOCOL instance.=0D +=0D + @retval EFI_SUCCESS This handler has been stoped successful= ly.=0D + @retval Others Some error happened.=0D +=0D +**/=0D +EFI_STATUS=0D +RedfishConfigLangMapFlush (=0D + IN EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL *This=0D + )=0D +{=0D + REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA *Private;=0D + EFI_STATUS Status;=0D +=0D + if (This =3D=3D NULL) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + Private =3D REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS (This);=0D +=0D + Status =3D SaveConfigLangMapList (&Private->ConfigLangList, Private->Var= iableName);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_ERROR, "%a, save ConfigLangMap list to variable: %s fail= ed: %r\n", __FUNCTION__, Private->VariableName, Status));=0D + }=0D +=0D + return Status;=0D +}=0D +=0D +/**=0D + Callback function executed when the ExitBootService event group is signa= led.=0D +=0D + @param[in] Event Event whose notification function is being invoked= .=0D + @param[out] Context Pointer to the Context buffer=0D +=0D +**/=0D +VOID=0D +EFIAPI=0D +RedfishConfigLangMapOnExitBootService (=0D + IN EFI_EVENT Event,=0D + OUT VOID *Context=0D + )=0D +{=0D + //=0D + // Memory is about to be released. Keep list into variable.=0D + //=0D + RedfishConfigLangMapFlush (&mRedfishConfigLangMapPrivate->Protocol);=0D +}=0D +=0D +/**=0D + Unloads an image.=0D +=0D + @param[in] ImageHandle Handle that identifies the image to be= unloaded.=0D +=0D + @retval EFI_SUCCESS The image has been unloaded.=0D + @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +RedfishConfigLangMapDriverUnload (=0D + IN EFI_HANDLE ImageHandle=0D + )=0D +{=0D + EFI_STATUS Status;=0D +=0D + if (mRedfishConfigLangMapPrivate !=3D NULL) {=0D +=0D + Status =3D gBS->UninstallProtocolInterface (=0D + mRedfishConfigLangMapPrivate->ImageHandle,=0D + &gEdkIIRedfishConfigLangMapProtocolGuid,=0D + (VOID*)&mRedfishConfigLangMapPrivate->Protocol=0D + );=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_ERROR, "%a, can not uninstall gEdkIIRedfishConfigLangM= apProtocolGuid: %r\n", __FUNCTION__, Status));=0D + ASSERT (FALSE);=0D + }=0D +=0D + ReleaseConfigLangMapList (&mRedfishConfigLangMapPrivate->ConfigLangLis= t);=0D +=0D + if (mRedfishConfigLangMapPrivate->VariableName !=3D NULL) {=0D + FreePool (mRedfishConfigLangMapPrivate->VariableName);=0D + }=0D +=0D + if (mRedfishConfigLangMapPrivate->ExitBootEvent !=3D NULL) {=0D + gBS->CloseEvent (mRedfishConfigLangMapPrivate->ExitBootEvent);=0D + }=0D +=0D + if (mRedfishConfigLangMapPrivate->ProvisionEvent !=3D NULL) {=0D + gBS->CloseEvent (mRedfishConfigLangMapPrivate->ProvisionEvent);=0D + }=0D +=0D + FreePool (mRedfishConfigLangMapPrivate);=0D + mRedfishConfigLangMapPrivate =3D NULL;=0D + }=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +//=0D +// EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL.=0D +//=0D +EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL mRedfishConfigLangMapProtocol =3D {= =0D + RedfishConfigLangMapGet,=0D + RedfishConfigLangMapSet,=0D + RedfishConfigLangMapFlush=0D +};=0D +=0D +/**=0D + This is the declaration of an EFI image entry point. This entry point is= =0D + the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers includ= ing=0D + both device drivers and bus drivers.=0D +=0D + @param[in] ImageHandle The firmware allocated handle for the UEFI= image.=0D + @param[in] SystemTable A pointer to the EFI System Table.=0D +=0D + @retval EFI_SUCCESS The operation completed successfully.=0D + @retval Others An unexpected error occurred.=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +RedfishConfigLangMapDriverEntryPoint (=0D + IN EFI_HANDLE ImageHandle,=0D + IN EFI_SYSTEM_TABLE *SystemTable=0D + )=0D +{=0D + EFI_STATUS Status;=0D +=0D + mRedfishConfigLangMapPrivate =3D AllocateZeroPool (sizeof (REDFISH_CONFI= G_LANG_MAP_PRIVATE_DATA));=0D + if (mRedfishConfigLangMapPrivate =3D=3D NULL) {=0D + return EFI_OUT_OF_RESOURCES;=0D + }=0D +=0D + InitializeListHead (&mRedfishConfigLangMapPrivate->ConfigLangList.Listhe= ader);=0D + mRedfishConfigLangMapPrivate->VariableName =3D AllocateCopyPool (StrSize= (CONFIG_LANG_MAP_VARIABLE_NAME), CONFIG_LANG_MAP_VARIABLE_NAME);=0D + if (mRedfishConfigLangMapPrivate->VariableName =3D=3D NULL) {=0D + goto ON_ERROR;=0D + }=0D +=0D + mRedfishConfigLangMapPrivate->ImageHandle =3D ImageHandle;=0D + CopyMem (&mRedfishConfigLangMapPrivate->Protocol, &mRedfishConfigLangMap= Protocol, sizeof (EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL));=0D +=0D + Status =3D gBS->InstallProtocolInterface (=0D + &ImageHandle,=0D + &gEdkIIRedfishConfigLangMapProtocolGuid,=0D + EFI_NATIVE_INTERFACE,=0D + (VOID*)&mRedfishConfigLangMapPrivate->Protocol=0D + );=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_ERROR, "%a, can not install gEdkIIRedfishConfigLangMapPr= otocolGuid: %r\n", __FUNCTION__, Status));=0D + ASSERT (FALSE);=0D + goto ON_ERROR;=0D + }=0D +=0D + //=0D + // Create Exit Boot Service event.=0D + //=0D + Status =3D gBS->CreateEventEx (=0D + EVT_NOTIFY_SIGNAL,=0D + TPL_CALLBACK,=0D + RedfishConfigLangMapOnExitBootService,=0D + NULL,=0D + &gEfiEventExitBootServicesGuid,=0D + &mRedfishConfigLangMapPrivate->ExitBootEvent=0D + );=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_ERROR, "%a: Fail to register Exit Boot Service event.", = __FUNCTION__));=0D + goto ON_ERROR;=0D + }=0D +=0D + //=0D + // Read existing record from variable.=0D + //=0D + Status =3D InitialConfigLangMapList (&mRedfishConfigLangMapPrivate->Conf= igLangList, mRedfishConfigLangMapPrivate->VariableName);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_INFO, "%a, Initial ConfigLangMap List: %r\n", __FUNCTION= __, Status));=0D + }=0D +=0D + //=0D + // Register after provisioning event=0D + //=0D + Status =3D CreateAfterProvisioningEvent (=0D + RedfishConfigLangMapOnExitBootService,=0D + NULL,=0D + &mRedfishConfigLangMapPrivate->ProvisionEvent=0D + );=0D +=0D + return EFI_SUCCESS;=0D +=0D +ON_ERROR:=0D +=0D + RedfishConfigLangMapDriverUnload (ImageHandle);=0D +=0D + return Status;=0D +}=0D diff --git a/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapD= xe.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=0D + Common header file for RedfishConfigLangMapDxe driver.=0D +=0D + (C) Copyright 2022 Hewlett Packard Enterprise Development LP
=0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#ifndef REDFISH_CONFIG_LANG_MAP_DXE_H_=0D +#define REDFISH_CONFIG_LANG_MAP_DXE_H_=0D +=0D +#include =0D +#include =0D +=0D +//=0D +// Libraries=0D +//=0D +#include =0D +#include =0D +#include =0D +=0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +=0D +#include =0D +=0D +#define CONFIG_LANG_MAP_VARIABLE_NAME L"RedfishConfigLangMap"=0D +#define CONFIG_LANG_MAP_DEBUG_ENABLED 0x00=0D +=0D +//=0D +// Definition of REDFISH_CONFIG_LANG_MAP_RECORD=0D +//=0D +typedef struct {=0D + LIST_ENTRY List;=0D + EFI_STRING Uri;=0D + EFI_STRING ConfigLang;=0D + UINTN Size;=0D +} REDFISH_CONFIG_LANG_MAP_RECORD;=0D +=0D +#define REDFISH_CONFIG_LANG_MAP_RECORD_FROM_LIST(a) BASE_CR (a, REDFISH_C= ONFIG_LANG_MAP_RECORD, List)=0D +=0D +//=0D +// Definition of REDFISH_CONFIG_LANG_MAP_LIST=0D +//=0D +typedef struct {=0D + LIST_ENTRY Listheader;=0D + UINTN TotalSize;=0D + UINTN Count;=0D +} REDFISH_CONFIG_LANG_MAP_LIST;=0D +=0D +//=0D +// Definition of REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA=0D +//=0D +typedef struct {=0D + EFI_HANDLE ImageHandle;=0D + REDFISH_CONFIG_LANG_MAP_LIST ConfigLangList;=0D + EDKII_REDFISH_CONFIG_LANG_MAP_PROTOCOL Protocol;=0D + EFI_STRING VariableName;=0D + EFI_EVENT ExitBootEvent;=0D + EFI_EVENT ProvisionEvent;=0D +} REDFISH_CONFIG_LANG_MAP_PRIVATE_DATA;=0D +=0D +#define REDFISH_CONFIG_LANG_MAP_PRIVATE_FROM_THIS(a) BASE_CR (a, REDFISH_= CONFIG_LANG_MAP_PRIVATE_DATA, Protocol)=0D +=0D +#endif=0D diff --git a/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapD= xe.inf b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.i= nf new file mode 100644 index 0000000000..9f19533815 --- /dev/null +++ b/RedfishClientPkg/RedfishConfigLangMapDxe/RedfishConfigLangMapDxe.inf @@ -0,0 +1,46 @@ +## @file=0D +#=0D +# (C) Copyright 2022 Hewlett Packard Enterprise Development LP
=0D +#=0D +# SPDX-License-Identifier: BSD-2-Clause-Patent=0D +#=0D +##=0D +=0D +[Defines]=0D + INF_VERSION =3D 0x0001000b=0D + BASE_NAME =3D RedfishConfigLangMapDxe=0D + FILE_GUID =3D F4121E32-454D-4E51-AB4B-DAA577833E95=0D + MODULE_TYPE =3D DXE_DRIVER=0D + VERSION_STRING =3D 1.0=0D + ENTRY_POINT =3D RedfishConfigLangMapDriverEntryPoint=0D + UNLOAD_IMAGE =3D RedfishConfigLangMapDriverUnload=0D +=0D +[Packages]=0D + MdePkg/MdePkg.dec=0D + MdeModulePkg/MdeModulePkg.dec=0D + RedfishPkg/RedfishPkg.dec=0D + RedfishClientPkg/RedfishClientPkg.dec=0D +=0D +[Sources]=0D + RedfishConfigLangMapDxe.h=0D + RedfishConfigLangMapDxe.c=0D +=0D +[LibraryClasses]=0D + BaseLib=0D + BaseMemoryLib=0D + DebugLib=0D + MemoryAllocationLib=0D + UefiLib=0D + UefiBootServicesTableLib=0D + UefiRuntimeServicesTableLib=0D + UefiDriverEntryPoint=0D + RedfishEventLib=0D +=0D +[Protocols]=0D + gEdkIIRedfishConfigLangMapProtocolGuid ## PRODUCED ##=0D +=0D +[Guids]=0D + gEfiEventExitBootServicesGuid ## CONSUMED ##=0D +=0D +[Depex]=0D + TRUE=0D --=20 2.32.0.windows.2