From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-002e3701.pphosted.com (mx0b-002e3701.pphosted.com [148.163.143.35]) by mx.groups.io with SMTP id smtpd.web11.23957.1658719743855335331 for ; Sun, 24 Jul 2022 20:29:04 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@hpe.com header.s=pps0720 header.b=owJuvDzF; 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.143.35, mailfrom: prvs=0205fca832=nickle.wang@hpe.com) Received: from pps.filterd (m0134425.ppops.net [127.0.0.1]) by mx0b-002e3701.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26P2VuxQ009487; Mon, 25 Jul 2022 03:29:01 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hpe.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-transfer-encoding : mime-version; s=pps0720; bh=oyDtOmrjvLieVFOrbMMGYtgTl4zekRIpwCiTEif4XkA=; b=owJuvDzFoVDmhDmQQB4WyMEz8hZQ8hQESig5ThMi/T0dLc9Kv6bU30fniaY8bS0s/fPB AcFFiAz7S7VMqoU1A3dYJWhMhxv2SswQi1GCXk7/a1Dp0hFZWq3HmYbTxvpihuDOexwg yYqaX4hkIVgPs7Mx7o7bfnll6rZ4rkGw25FGS1I/vTfiNLXMrPy9tB9vcgWgJOGAa1/h iaqcmm++U2yUopn/Hll0MK1BiMoT7/cFPrOxdbh/m6tKrup3PxV+HJjZKfxozf4+/eit fET7HpifyhJ2F14C8pjs6r7fgMS0l1AGFeHt+Ws15Rid+x4HO3Ye3pZvIVhyGFnFc/Ew Nw== Received: from p1lg14881.it.hpe.com (p1lg14881.it.hpe.com [16.230.97.202]) by mx0b-002e3701.pphosted.com (PPS) with ESMTPS id 3hhhr88hy1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 03:29:00 +0000 Received: from p1wg14924.americas.hpqcorp.net (unknown [10.119.18.113]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by p1lg14881.it.hpe.com (Postfix) with ESMTPS id 7331A801713; Mon, 25 Jul 2022 03:28:59 +0000 (UTC) Received: from p1wg14924.americas.hpqcorp.net (10.119.18.113) by p1wg14924.americas.hpqcorp.net (10.119.18.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.15; Sun, 24 Jul 2022 15:27:58 -1200 Received: from P1WG14918.americas.hpqcorp.net (16.230.19.121) by p1wg14924.americas.hpqcorp.net (10.119.18.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.15 via Frontend Transport; Sun, 24 Jul 2022 15:27:58 -1200 Received: from NAM04-DM6-obe.outbound.protection.outlook.com (192.58.206.38) by edge.it.hpe.com (16.230.19.121) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.15; Mon, 25 Jul 2022 03:25:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hOODEO6kJvrYS4INGAEpjeNJ7Pz70VLt6aywYpJC5CPfcJRKlFyhsWXdVwiSUsYyxTMLzLerVBRaMuS4I/v8ZvTs/ijbQmjfzsT9sxs5G6TtSdsDDnBwUk7b1ysSkk+bpw+ZGgZ+C4rcZ5R3f50EN95+Y4SkIqV1/obNyRyItRiWvSWhFzXRBH0vwE0c92oF2DTw13S6rxXoLeRsOoeXQTffo6zGeRF7GVz5p+qJg5bQncrTWLZorGzjG3FIBdCO4tDYJHqIZP3k8vItE/woFfTUTbjZgLhl5ugfyKhhcrfc7vefYk/2wdK6yr6XP/N87TS+HEYeELYhX3GTE0Wj6g== 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=oyDtOmrjvLieVFOrbMMGYtgTl4zekRIpwCiTEif4XkA=; b=g9IYk5GwzshDEpoGOHlm45NE2PbSKlycTmp2Xxk4tDlFpzLiItD5aQul280DnORMdOjaqueThQrhfq5pCmoK8VlN5qDEB9hcHeWwMMqRyM8zV+dBbrIWCSPj9O7NU9bNST2yB4V5RVWwI/lrP+fWk8s7J8z6QLuAeaHf1THjdLX/Y4jIlgfkHQ9w2TEl/B8/dULM4tI8xpcltPnAX4OpXCnMRiJlhdHj2xwp8D8HoNDnmSdfoXwCRyQJdtTuc2jF/qQK1dHII3q3QScaOi3HO06B0dGjsELSThLmpJY9H2UQiVwKocFF7cW7rW5yHzbvXkpEVhHXWNOKnP2qu8arLg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=hpe.com; dmarc=pass action=none header.from=hpe.com; dkim=pass header.d=hpe.com; arc=none Received: from MW4PR84MB1729.NAMPRD84.PROD.OUTLOOK.COM (2603:10b6:303:1a4::16) by DM4PR84MB1901.NAMPRD84.PROD.OUTLOOK.COM (2603:10b6:8:4c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5438.24; Mon, 25 Jul 2022 03:25:05 +0000 Received: from MW4PR84MB1729.NAMPRD84.PROD.OUTLOOK.COM ([fe80::7925:4fe2:1b5b:9019]) by MW4PR84MB1729.NAMPRD84.PROD.OUTLOOK.COM ([fe80::7925:4fe2:1b5b:9019%6]) with mapi id 15.20.5458.024; Mon, 25 Jul 2022 03:25:05 +0000 From: "Nickle Wang" To: "Chang, Abner" , "devel@edk2.groups.io" CC: "Yang, Atom" , Nick Ramirez Subject: Re: [edk2-staging][PATCH v2 1/1] edk2/RedfishPkg: Update Redfish Platform Config Protocol Thread-Topic: [edk2-staging][PATCH v2 1/1] edk2/RedfishPkg: Update Redfish Platform Config Protocol Thread-Index: AQHYn2APTt4F4rdU70yoBK412qSNLa2Nh8pAgADll8A= Date: Mon, 25 Jul 2022 03:25:04 +0000 Message-ID: References: <20220724131940.714-1-nickle.wang@hpe.com> In-Reply-To: Accept-Language: en-US, zh-TW 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-24T13:46:09Z; 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=cb6e989e-2dca-406e-b496-e044d6b8a704; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 275c9cd8-b774-45af-24b6-08da6ded4466 x-ms-traffictypediagnostic: DM4PR84MB1901:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: rsKSbPz+xTKSBM0uW5Y3xY093K+8fGQGVhN4Eg2zc+DhzL4J0sXow0zStEn+k0dcy8b/i6qBOBIsID78BYRX2R6O+k6iI0tHRwG172LR6JqCafrauR1FTeJr8KpMGcmfsb8IbVWizCXNQt+s0Fj9E42xbeU3Kjpme5qtCk66kn0FR6a4J5jdBLUu26gAz5/dnMzf6gHu4Dq65IfwPQ55L+q95nkIdYsROsA3HrO6LYmNozuq4UMGUKR688UlQXBpY/ADDk5dFl7awvdNzUojYOzUWZTk5HCcF0x85TRRziZD61E49nh2PbJZmfxGiyIT5GueNGhUprgpavs5I4a8nzaXegPnQCKlstd5uXe+VgWR2FE5XaCXdyhsXcp1shWZXBONbdEuBg22gfXTcwr0Iu6jCKwPmugRiXe9gS8kTrr+sBCxKhD/19Ag1nTEFumSFvmpc0B31tNQSnU+U4MLcg3eiLm4UPN51oAZ0d3YyQvxD6ldqF36LA0YuaQ05YIUtsguyR1/rvD0L+IDqYs8sNqGQOL3bzrhgQxqzcKA2B/dMKlGbF5DDwbdOuR/ybJU4g471nMHkR0a0Ogv19Ui5AK74aPkQa6qe+NuClFoi2Itonbz1ZhsFWPl3sgs3d82DdDVzM0bKZaZKYfEA4GwQVhGjLU/GT6A+C4nL2Q04hzTTKtIyCWK2V/VnXWleGOCOS33cQ6FxApwZC3L+6gZB00SWLQ+a5LO9i1CkWw7mnYv4goQHkqn8LLpzsOwwK2T7A/HdlOkoP1/QrqYn5GhOCf47yy5AH64BOvqhUcjz6OFDda37EAbQ8CzzUHiMzwK91msHv54AI8QLGuEvi+s8h9EuSWBbUrUlrBKNhiG5zE= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW4PR84MB1729.NAMPRD84.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230016)(346002)(376002)(366004)(396003)(39860400002)(136003)(71200400001)(6506007)(7696005)(41300700001)(9686003)(55236004)(66556008)(478600001)(19627235002)(64756008)(110136005)(4326008)(66476007)(76116006)(66446008)(30864003)(52536014)(55016003)(15650500001)(8936002)(2906002)(53546011)(8676002)(83380400001)(82960400001)(122000001)(33656002)(5660300002)(316002)(66946007)(38070700005)(86362001)(186003)(38100700002)(26005)(54906003)(290074003)(403724002)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?dHzeiPlj2VL46q9mYZ7VUMz2mGDXODhFGbeBx3NkZbwRTNTCFaR8W2Dk5ZeC?= =?us-ascii?Q?zD/QGBlpJHx6CMlOzVsubmWz25Rj3VQybeeV5DRZm6SGyII2Re2q/MJgSjNg?= =?us-ascii?Q?55V6TAdpbrQtSn435fSMJTTqx1mcY1mdgC2/5R2b3CPpnE4+CGFOACsfe2Zr?= =?us-ascii?Q?0a6cKaZK02mYEBL6bTyW1eJa8SLGSsEKV/+EEWEz6yEZS1TEdsTsSrSM+Ytr?= =?us-ascii?Q?aSJ8bPmYP6R/lIrK0pxUPlWUEmrZgPeQbC28eIB6e2YqX//2IUUKqmOpsA6K?= =?us-ascii?Q?X84CqMhl7dfWyYU56q2sWrf9I4FhddYXSO6W95jRDk9dWz535Vu89lmMa8N6?= =?us-ascii?Q?Q0Rejhz5BAjDleuzmslEnTUy3bHo61HQekAzL/+sRsAXh7t6l6ghm0QSP+mE?= =?us-ascii?Q?UKMNMB0RLZFF45TpbU7hvd9rsE3i7VUjNakwNeaNM0p3xssWpXgCWjg2fuPY?= =?us-ascii?Q?2qUaE64eLKEeSvEoSo2EbYWuX3bWSgPXrwxhikQRRwQXLm7o5U7liTlml/dr?= =?us-ascii?Q?4Z3BZX2JD2s5x/9krRucWz6WryQg/9tzTlD6LdwM++Va9a/rKIDspts33E+5?= =?us-ascii?Q?s3PRbh8xyklqsgkXCj22ZIHLgg8FUmk1DxXibxY4cu40r85juVhjK9h3xVY7?= =?us-ascii?Q?G5YB1IX2RFktUQuecKVNasF52DYzDFJrDr0Ka5KWZ/FViPNEY4odmr8+HpFG?= =?us-ascii?Q?flWiBKKyxUEmVuFjZhfjS+A85E9+aRoR6P7q0vv56IkzlNXftEN39ERjGJ5r?= =?us-ascii?Q?uCrxWZCwoBLZjhiKModZ7unoLTX1It1d4zuWk0rDmVW0QaaHWnEuq+0/HPcV?= =?us-ascii?Q?R7XB88xDEaLTm+NnusSp5qzXWhvKxoya4S2nyekyG78cVudkSEGIofjvYRs6?= =?us-ascii?Q?LsRrhNq6QkomuiJdQ88AjoOk/YboLV+z7s4/+Q+KjdfPjjH4wJFE61WfeyYg?= =?us-ascii?Q?4f+HKcEhQn7ZJkkFBJW2A4j9dfTerMSCi5HHv+9Q8Lf6KAE2797wJ39yuaF7?= =?us-ascii?Q?qlHUo4a6lzHZWrrL16Uy/0wi96F/WXc2eCl0tHRHG3Na4F9rddh22tCvFxI/?= =?us-ascii?Q?bGuDDN+1Dl78xswDnQ60UFXsG+ILXv2vBukFIbSRSEgyKMhLFXDXcR6y8EZo?= =?us-ascii?Q?RxSn0QJmMDAS4N2mdSmRD733kjZnBszL6u9jfTuwN6d2eFOK1T9lKiOftR7E?= =?us-ascii?Q?JJ3nQTk7hviiek8VNnZKS/Qq8XGiYRR460svGHYnEz21zHPC3ueMl/0KMSPG?= =?us-ascii?Q?IuDlp8dBj8kFjzSr7aP9h23O+SX8MVZigWShAlTtXcxuIjzuMbIk6GJ8ob78?= =?us-ascii?Q?a1F0lORiu+06BFxrY1QW5WRioxJolAudTYo78PDvdyjLSVWY6igSUvwGjAAQ?= =?us-ascii?Q?paQdwq++7SMWetV+Izbve1dareRuyHub0li37snrNEpc2wbXhFXnfoDGvsAg?= =?us-ascii?Q?i+cQBj5+ewUzrR4rxzNIm/MRYjZyyFDJiLSSs+RXJaouJ45jBBRTR0XimK6M?= =?us-ascii?Q?x5AKTlNQa1AFSOEaUGBT+Sk3ZQrkZ3TeSYkRP3bnjkVRUemQ5bgST3Z85b+2?= =?us-ascii?Q?GS0qX75jHJTUl9yuTh0uRUMY73FnwAJP+Yl1NdzH?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW4PR84MB1729.NAMPRD84.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 275c9cd8-b774-45af-24b6-08da6ded4466 X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Jul 2022 03:25:04.7943 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: OnCXOOcY2kqn40S42HrBINVnv3KrsIMMIdB8aHJo1OjAKGwQgeEkIH4o2cEpe3+3hjllLass8XHOb9XodReD9Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR84MB1901 X-OriginatorOrg: hpe.com X-Proofpoint-ORIG-GUID: lest3vJxYixdfoiiNE1feYWkOE-SUUwr X-Proofpoint-GUID: lest3vJxYixdfoiiNE1feYWkOE-SUUwr 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-23_02,2022-07-21_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 phishscore=0 spamscore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207250013 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Thanks Abner! Fixed in version 3. Nickle -----Original Message----- From: Chang, Abner =20 Sent: Sunday, July 24, 2022 9:46 PM To: Wang, Nickle (Server BIOS) ; devel@edk2.groups.io Cc: Yang, Atom ; Nick Ramirez Subject: RE: [edk2-staging][PATCH v2 1/1] edk2/RedfishPkg: Update Redfish P= latform Config Protocol [AMD Official Use Only - General] Thanks Nickle. Two comments in the below. > -----Original Message----- > From: Nickle Wang > Sent: Sunday, July 24, 2022 9:20 PM > To: devel@edk2.groups.io > Cc: Chang, Abner ; Yang, Atom > ; Nick Ramirez > Subject: [edk2-staging][PATCH v2 1/1] edk2/RedfishPkg: Update Redfish > Platform Config Protocol >=20 > [CAUTION: External Email] >=20 > Update EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL and add array type > of > value support to EDKII_REDFISH_VALUE in order to support ordered list > op-code in HII. Modify corresponding function to support new type of > data structure. >=20 > Signed-off-by: Nickle Wang > Cc: Abner Chang > Cc: Yang Atom > Cc: Nick Ramirez > --- > .../Protocol/EdkIIRedfishPlatformConfig.h | 301 +- > .../RedfishPlatformConfigDxe.c | 3087 ++++++++++------- > .../RedfishPlatformConfigDxe.h | 128 +- > .../RedfishPlatformConfigDxe.inf | 104 +- > .../RedfishPlatformConfigImpl.c | 2528 +++++++------- > .../RedfishPlatformConfigImpl.h | 571 +-- > 6 files changed, 3638 insertions(+), 3081 deletions(-) >=20 > diff --git a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h > b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h > index 895b010227..bbbab90b03 100644 > --- a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h > +++ b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h > @@ -1,147 +1,154 @@ > -/** @file > - This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL > interface. > - > - (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > - > -#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_ > -#define EDKII_REDFISH_PLATFORM_CONFIG_H_ > - > -typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL; > - > -/** > - Definition of EDKII_REDFISH_TYPE_VALUE > - **/ > -typedef union { > - INT64 Integer; > - BOOLEAN Boolean; > - CHAR8 *Buffer; > -} EDKII_REDFISH_TYPE_VALUE; > - > -/** > - Definition of EDKII_REDFISH_VALUE_TYPES > - **/ > -typedef enum { > - REDFISH_VALUE_TYPE_UNKNOWN =3D 0, > - REDFISH_VALUE_TYPE_INTEGER, > - REDFISH_VALUE_TYPE_BOOLEAN, > - REDFISH_VALUE_TYPE_STRING, > - REDFISH_VALUE_TYPE_MAX > -} EDKII_REDFISH_VALUE_TYPES; > - > -/** > - Definition of EDKII_REDFISH_VALUE > - **/ > -typedef struct { > - EDKII_REDFISH_VALUE_TYPES Type; > - EDKII_REDFISH_TYPE_VALUE Value; > -} EDKII_REDFISH_VALUE; > - > -/** > - Get Redfish value with the given Schema and Configure Language. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] Schema The Redfish schema to query. > - @param[in] Version The Redfish version to query. > - @param[in] ConfigureLang The target value which match this con= figure > Language. > - @param[out] Value The returned value. > - > - @retval EFI_SUCCESS Value is returned successfully. > - @retval Others Some error happened. > - > -**/ > -typedef > -EFI_STATUS > -(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN CHAR8 *Schema, > - IN CHAR8 *Version, > - IN EFI_STRING ConfigureLang, > - OUT EDKII_REDFISH_VALUE *Value > - ); > - > -/** > - Set Redfish value with the given Schema and Configure Language. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] Schema The Redfish schema to query. > - @param[in] Version The Redfish version to query. > - @param[in] ConfigureLang The target value which match this con= figure > Language. > - @param[in] Value The value to set. > - > - @retval EFI_SUCCESS Value is returned successfully. > - @retval Others Some error happened. > - > -**/ > -typedef > -EFI_STATUS > -(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN CHAR8 *Schema, > - IN CHAR8 *Version, > - IN EFI_STRING ConfigureLang, > - IN EDKII_REDFISH_VALUE Value > - ); > - > -/** > - Get the list of Configure Language from platform configuration by the = given > Schema and Pattern. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] Schema The Redfish schema to query. > - @param[in] Version The Redfish version to query. > - @param[in] Pattern The target Configure Language pattern= . > - @param[out] ConfigureLangList The list of Configure Language. > - @param[out] Count The number of Configure Language in > ConfigureLangList. > - > - @retval EFI_SUCCESS ConfigureLangList is returned success= fully. > - @retval Others Some error happened. > - > -**/ > -typedef > -EFI_STATUS > -(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN CHAR8 *Schema, > - IN CHAR8 *Version, > - IN EFI_STRING Pattern, > - OUT EFI_STRING **ConfigureLangList, > - OUT UINTN *Count > - ); > - > - > -/** > - Get the list of supported Redfish schema from platform configuration o= n > the give HII handle. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] HiiHandle The target handle to search. If handl= e is NULL, > - this function returns all schema from= HII database. > - @param[out] SupportedSchema The supported schema list which is > separated by ';'. > - For example: "x-uefi-redfish-Memory.v= 1_7_1;x-uefi- > redfish-Boot.v1_0_1" > - The SupportedSchema is allocated by t= he callee. It's caller's > - responsibility to free this buffer us= ing FreePool(). > - > - @retval EFI_SUCCESS Schema is returned successfully. > - @retval Others Some error happened. > - > -**/ > -typedef > -EFI_STATUS > -(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA) > ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN EFI_HII_HANDLE HiiHandle, OPTI= ONAL > - OUT CHAR8 **SupportedSchema > - ); > - > -struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL { > - EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue; > - EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue; > - EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG > GetConfigureLang; > - EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA > GetSupportedSchema; > -}; > - > -extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid; > - > -#endif > +/** @file > + This file defines the EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL > interface. > + > + (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef EDKII_REDFISH_PLATFORM_CONFIG_H_ > +#define EDKII_REDFISH_PLATFORM_CONFIG_H_ > + > +typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL; > + > +/** > + Definition of EDKII_REDFISH_TYPE_VALUE > + **/ > +typedef union { > + INT64 Integer; > + BOOLEAN Boolean; > + CHAR8 *Buffer; > + CHAR8 **StringArray; > + INT64 *IntegerArray; > + BOOLEAN *BooleanArray; > +} EDKII_REDFISH_TYPE_VALUE; > + > +/** > + Definition of EDKII_REDFISH_VALUE_TYPES > + **/ > +typedef enum { > + REDFISH_VALUE_TYPE_UNKNOWN =3D 0, > + REDFISH_VALUE_TYPE_INTEGER, > + REDFISH_VALUE_TYPE_BOOLEAN, > + REDFISH_VALUE_TYPE_STRING, > + REDFISH_VALUE_TYPE_STRING_ARRAY, > + REDFISH_VALUE_TYPE_INTEGER_ARRAY, > + REDFISH_VALUE_TYPE_BOOLEAN_ARRAY, > + REDFISH_VALUE_TYPE_MAX > +} EDKII_REDFISH_VALUE_TYPES; > + > +/** > + Definition of EDKII_REDFISH_VALUE > + **/ > +typedef struct { > + EDKII_REDFISH_VALUE_TYPES Type; > + EDKII_REDFISH_TYPE_VALUE Value; > + UINTN ArrayCount; > +} EDKII_REDFISH_VALUE; > + > +/** > + Get Redfish value with the given Schema and Configure Language. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] Schema The Redfish schema to query. > + @param[in] Version The Redfish version to query. > + @param[in] ConfigureLang The target value which match this con= figure > Language. > + @param[out] Value The returned value. > + > + @retval EFI_SUCCESS Value is returned successfully. > + @retval Others Some error happened. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE) ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN CHAR8 *Schema, > + IN CHAR8 *Version, > + IN EFI_STRING ConfigureLang, > + OUT EDKII_REDFISH_VALUE *Value > + ); > + > +/** > + Set Redfish value with the given Schema and Configure Language. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] Schema The Redfish schema to query. > + @param[in] Version The Redfish version to query. > + @param[in] ConfigureLang The target value which match this con= figure > Language. > + @param[in] Value The value to set. > + > + @retval EFI_SUCCESS Value is returned successfully. > + @retval Others Some error happened. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE) ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN CHAR8 *Schema, > + IN CHAR8 *Version, > + IN EFI_STRING ConfigureLang, > + IN EDKII_REDFISH_VALUE Value > + ); > + > +/** > + Get the list of Configure Language from platform configuration by the > given Schema and RegexPattern. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] Schema The Redfish schema to query. > + @param[in] Version The Redfish version to query. > + @param[in] RegexPattern The target Configure Language pattern= . > This is used for regular expression matching. > + @param[out] ConfigureLangList The list of Configure Language. > + @param[out] Count The number of Configure Language in > ConfigureLangList. > + > + @retval EFI_SUCCESS ConfigureLangList is returned success= fully. > + @retval Others Some error happened. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG) ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN CHAR8 *Schema, > + IN CHAR8 *Version, > + IN EFI_STRING RegexPattern, > + OUT EFI_STRING **ConfigureLangList, > + OUT UINTN *Count > + ); > + > + > +/** > + Get the list of supported Redfish schema from platform configuration o= n > the give HII handle. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] HiiHandle The target handle to search. If handl= e is NULL, > + this function returns all schema from= HII database. > + @param[out] SupportedSchema The supported schema list which is > separated by ';'. > + For example: "x-uefi-redfish-Memory.v= 1_7_1;x-uefi- > redfish-Boot.v1_0_1" > + The SupportedSchema is allocated by t= he callee. It's > caller's > + responsibility to free this buffer us= ing FreePool(). > + > + @retval EFI_SUCCESS Schema is returned successfully. > + @retval Others Some error happened. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA) > ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN EFI_HII_HANDLE HiiHandle, OPTI= ONAL > + OUT CHAR8 **SupportedSchema > + ); > + > +struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL { > + EDKII_REDFISH_PLATFORM_CONFIG_GET_VALUE GetValue; > + EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE SetValue; > + EDKII_REDFISH_PLATFORM_CONFIG_GET_CONFIG_LANG > GetConfigureLang; > + EDKII_REDFISH_PLATFORM_CONFIG_GET_SUPPORTED_SCHEMA > GetSupportedSchema; > +}; > + > +extern EFI_GUID gEdkIIRedfishPlatformConfigProtocolGuid; > + > +#endif > diff --git > a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c > b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c > index 67818cccd2..971035f27d 100644 > --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c > +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c > @@ -1,1304 +1,1783 @@ > -/** @file > - > - The implementation of EDKII Redfidh Platform Config Protocol. > - > - (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > - > -#include "RedfishPlatformConfigDxe.h" > -#include "RedfishPlatformConfigImpl.h" > - > -REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =3D > NULL; > - > -/** > - Compare two value in HII statement format. > - > - @param[in] Value1 Firt value to compare. > - @param[in] Value2 Second value to be compared. > - > - @retval UINTN 0 is retuned when two values are equal. > - 1 is returned when first value is greater than s= econd value. > - -1 is returned when second value is greater than= first value. > - > -**/ > -UINTN > -CompareHiiStatementValue ( > - IN HII_STATEMENT_VALUE *Value1, > - IN HII_STATEMENT_VALUE *Value2 > - ) > -{ > - INTN Result; > - UINT64 Data1; > - UINT64 Data2; > - > - if (Value1 =3D=3D NULL || Value2 =3D=3D NULL) { > - return 0xFF; > - } > - > - switch (Value1->Type) { > - case EFI_IFR_TYPE_NUM_SIZE_8: > - Data1 =3D Value1->Value.u8; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_16: > - Data1 =3D Value1->Value.u16; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_32: > - Data1 =3D Value1->Value.u32; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_64: > - Data1 =3D Value1->Value.u64; > - break; > - case EFI_IFR_TYPE_BOOLEAN: > - Data1 =3D (Value1->Value.b ? 1 : 0); > - break; > - default: > - return 0xFF; > - } > - > - switch (Value2->Type) { > - case EFI_IFR_TYPE_NUM_SIZE_8: > - Data2 =3D Value2->Value.u8; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_16: > - Data2 =3D Value2->Value.u16; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_32: > - Data2 =3D Value2->Value.u32; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_64: > - Data2 =3D Value2->Value.u64; > - break; > - case EFI_IFR_TYPE_BOOLEAN: > - Data2 =3D (Value2->Value.b ? 1 : 0); > - break; > - default: > - return 0xFF; > - } > - > - Result =3D (Data1 =3D=3D Data2 ? 0 : (Data1 > Data2 ? 1 : -1)); > - > - return Result; > -} > - > -/** > - Convert HII value to the string in HII one-of opcode. > - > - @param[in] Statement Statement private instance > - > - @retval EFI_STRING_ID The string ID in HII database. > - 0 is returned when something goes wrong. > - > -**/ > -EFI_STRING_ID > -HiiValueToOneOfOptionStringId ( > - IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement > - ) > -{ > - LIST_ENTRY *Link; > - HII_QUESTION_OPTION *Option; > - > - if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) { > - return 0; > - } > - > - if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) { > - return 0; > - } > - > - Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead); > - while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) { > - Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > - > - if (CompareHiiStatementValue (&Statement->HiiStatement->Value, > &Option->Value) =3D=3D 0) { > - return Option->Text; > - } > - > - Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link= ); > - } > - > - return 0; > -} > - > -/** > - Convert HII string to the value in HII one-of opcode. > - > - @param[in] Statement Statement private instance > - @param[in] Schema Schema string > - @param[in] HiiString Input string > - @param[out] Value Value returned > - > - @retval EFI_SUCCESS HII value is returned successfully. > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -HiiStringToOneOfOptionValue ( > - IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement, > - IN CHAR8 *Schema, > - IN EFI_STRING HiiString, > - OUT HII_STATEMENT_VALUE *Value > - ) > -{ > - LIST_ENTRY *Link; > - HII_QUESTION_OPTION *Option; > - EFI_STRING TmpString; > - BOOLEAN Found; > - > - if (Statement =3D=3D NULL || IS_EMPTY_STRING (HiiString) || Value =3D= =3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) { > - return EFI_UNSUPPORTED; > - } > - > - if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) { > - return EFI_NOT_FOUND; > - } > - > - Found =3D FALSE; > - Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead); > - while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) { > - Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > - > - TmpString =3D HiiGetRedfishString (Statement->ParentForm- > >ParentFormset->HiiHandle, Schema, Option->Text); > - if (TmpString !=3D NULL) { > - if (StrCmp (TmpString, HiiString) =3D=3D 0) { > - CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE)); > - Found =3D TRUE; > - } > - FreePool (TmpString); > - } > - > - if (Found) { > - return EFI_SUCCESS; > - } > - > - Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link= ); > - } > - > - return EFI_NOT_FOUND; > -} > - > -/** > - Convert HII value to numeric value in Redfish format. > - > - @param[in] Value Value to be converted. > - @param[out] RedfishValue Value in Redfish format. > - > - @retval EFI_SUCCESS Redfish value is returned successfully. > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -HiiValueToRedfishNumeric ( > - IN HII_STATEMENT_VALUE *Value, > - OUT EDKII_REDFISH_VALUE *RedfishValue > - ) > -{ > - if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - switch (Value->Type) { > - case EFI_IFR_TYPE_NUM_SIZE_8: > - RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > - RedfishValue->Value.Integer =3D (INT64)Value->Value.u8; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_16: > - RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > - RedfishValue->Value.Integer =3D (INT64)Value->Value.u16; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_32: > - RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > - RedfishValue->Value.Integer =3D (INT64)Value->Value.u32; > - break; > - case EFI_IFR_TYPE_NUM_SIZE_64: > - RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > - RedfishValue->Value.Integer =3D (INT64)Value->Value.u64; > - break; > - case EFI_IFR_TYPE_BOOLEAN: > - RedfishValue->Type =3D REDFISH_VALUE_TYPE_BOOLEAN; > - RedfishValue->Value.Boolean =3D Value->Value.b; > - break; > - default: > - RedfishValue->Type =3D REDFISH_VALUE_TYPE_UNKNOWN; > - break; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Convert numeric value in Redfish format to HII value. > - > - @param[in] RedfishValue Value in Redfish format to be converted. > - @param[out] Value HII value returned. > - > - @retval EFI_SUCCESS HII value is returned successfully. > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -RedfishNumericToHiiValue ( > - IN EDKII_REDFISH_VALUE *RedfishValue, > - OUT HII_STATEMENT_VALUE *Value > - ) > -{ > - if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - switch (RedfishValue->Type) { > - case REDFISH_VALUE_TYPE_INTEGER: > - Value->Type =3D EFI_IFR_TYPE_NUM_SIZE_64; > - Value->Value.u64 =3D (UINT64)RedfishValue->Value.Integer; > - break; > - case REDFISH_VALUE_TYPE_BOOLEAN: > - Value->Type =3D EFI_IFR_TYPE_BOOLEAN; > - Value->Value.b =3D RedfishValue->Value.Boolean; > - break; > - default: > - Value->Type =3D EFI_IFR_TYPE_UNDEFINED; > - break; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Return the full Redfish schema string from the given Schema and Versio= n. > - > - Returned schema string is: Schema + '.' + Version > - > - @param[in] Schema Schema string > - @param[in] Version Schema version string > - > - @retval CHAR8 * Schema string. NULL when errors occur. > - > -**/ > -CHAR8 * > -GetFullSchemaString ( > - IN CHAR8 *Schema, > - IN CHAR8 *Version > - ) > -{ > - UINTN Size; > - CHAR8 *FullName; > - > - if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) { > - return NULL; > - } > - > - Size =3D AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize (Schem= a) > + AsciiStrSize (Version); > - > - FullName =3D AllocatePool (Size); > - if (FullName =3D=3D NULL) { > - DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__)); > - return NULL; > - } > - > - AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX, > Schema, Version); > - > - return FullName; > -} > - > -/** > - Common implementation to get statement private instance. > - > - @param[in] RedfishPlatformConfigPrivate Private instance. > - @param[in] Schema Redfish schema string. > - @param[in] ConfigureLang Configure language that re= fers to this > statement. > - @param[out] Statement Statement instance > - > - @retval EFI_SUCCESS HII value is returned successfully. > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -RedfishPlatformConfigGetStatementCommon ( > - IN REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate, > - IN CHAR8 *Schema, > - IN EFI_STRING ConfigureLang, > - OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement > - ) > -{ > - EFI_STATUS Status; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement; > - > - if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schem= a) > || IS_EMPTY_STRING (ConfigureLang) || Statement =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - *Statement =3D NULL; > - > - Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > - return Status; > - } > - > - TargetStatement =3D GetStatementPrivateByConfigureLang > (&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang); > - if (TargetStatement =3D=3D NULL) { > - DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the > given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema)); > - return EFI_NOT_FOUND; > - } > - > - // > - // Find current HII question value. > - // > - Status =3D GetQuestionValue ( > - TargetStatement->ParentForm->ParentFormset->HiiFormSet, > - TargetStatement->ParentForm->HiiForm, > - TargetStatement->HiiStatement, > - GetSetValueWithHiiDriver > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n= ", > __FUNCTION__, Status)); > - return Status; > - } > - > - > - if (TargetStatement->HiiStatement->Value.Type =3D=3D > EFI_IFR_TYPE_UNDEFINED) { > - return EFI_DEVICE_ERROR; > - } > - > - // > - // Return Value. > - // > - *Statement =3D TargetStatement; > - > - return EFI_SUCCESS; > -} > - > -/** > - Get Redfish value with the given Schema and Configure Language. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] Schema The Redfish schema to query. > - @param[in] Version The Redfish version to query. > - @param[in] ConfigureLang The target value which match this con= figure > Language. > - @param[out] Value The returned value. > - > - @retval EFI_SUCCESS Value is returned successfully. > - @retval Others Some error happened. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishPlatformConfigProtocolGetValue ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN CHAR8 *Schema, > - IN CHAR8 *Version, > - IN EFI_STRING ConfigureLang, > - OUT EDKII_REDFISH_VALUE *Value > - ) > -{ > - EFI_STATUS Status; > - REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement; > - EFI_STRING_ID StringId; > - CHAR8 *FullSchema; > - EFI_STRING HiiString; > - UINTN Size; > - > - if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING > (Version) || IS_EMPTY_STRING (ConfigureLang) || Value =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > - Value->Type =3D REDFISH_VALUE_TYPE_UNKNOWN; > - FullSchema =3D NULL; > - HiiString =3D NULL; > - > - FullSchema =3D GetFullSchemaString (Schema, Version); > - if (FullSchema =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Status =3D RedfishPlatformConfigGetStatementCommon > (RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, > &TargetStatement); > - if (EFI_ERROR (Status)) { > - goto RELEASE_RESOURCE; > - } > - > - switch (TargetStatement->HiiStatement->Operand) { > - case EFI_IFR_ONE_OF_OP: > - StringId =3D HiiValueToOneOfOptionStringId (TargetStatement); > - if (StringId =3D=3D 0) { > - ASSERT (FALSE); > - Status =3D EFI_DEVICE_ERROR; > - goto RELEASE_RESOURCE; > - } > - > - HiiString =3D HiiGetRedfishString (TargetStatement->ParentForm- > >ParentFormset->HiiHandle, FullSchema, StringId); > - if (HiiString =3D=3D NULL) { > - DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n= ", > __FUNCTION__, StringId, FullSchema)); > - Status =3D EFI_NOT_FOUND; > - goto RELEASE_RESOURCE; > - } > - > - Size =3D StrLen (HiiString) + 1; > - Value->Value.Buffer =3D AllocatePool (Size); > - if (Value->Value.Buffer =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto RELEASE_RESOURCE; > - } > - > - UnicodeStrToAsciiStrS (HiiString, Value->Value.Buffer, Size); > - Value->Type =3D REDFISH_VALUE_TYPE_STRING; > - > - break; > - case EFI_IFR_STRING_OP: > - if (TargetStatement->HiiStatement->Value.Type !=3D > EFI_IFR_TYPE_STRING) { > - ASSERT (FALSE); > - Status =3D EFI_DEVICE_ERROR; > - goto RELEASE_RESOURCE; > - } > - > - Value->Type =3D REDFISH_VALUE_TYPE_STRING; > - Value->Value.Buffer =3D AllocateCopyPool (StrSize ((CHAR16 > *)TargetStatement->HiiStatement->Value.Buffer), TargetStatement- > >HiiStatement->Value.Buffer); > - if (Value->Value.Buffer =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto RELEASE_RESOURCE; > - } > - break; > - case EFI_IFR_CHECKBOX_OP: > - case EFI_IFR_NUMERIC_OP: > - Status =3D HiiValueToRedfishNumeric (&TargetStatement->HiiStatemen= t- > >Value, Value); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish > value: %r\n", __FUNCTION__, Status)); > - goto RELEASE_RESOURCE; > - } > - break; > - default: > - DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please > contact with author if we need to support this type.\n", __FUNCTION__, > TargetStatement->HiiStatement->Operand)); > - ASSERT (FALSE); > - Status =3D EFI_UNSUPPORTED; > - goto RELEASE_RESOURCE; > - } > - > -RELEASE_RESOURCE: > - > - if (FullSchema !=3D NULL) { > - FreePool (FullSchema); > - } > - > - if (HiiString !=3D NULL) { > - FreePool (HiiString); > - } > - > - return Status; > -} > - > -/** > - Function to save question value into HII database. > - > - @param[in] HiiFormset HII form-set instance > - @param[in] HiiForm HII form instance > - @param[in] HiiStatement HII statement that keeps new value. > - @param[in] Value New value to applyu. > - > - @retval EFI_SUCCESS HII value is returned successfully. > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -RedfishPlatformConfigSaveQuestionValue ( > - IN HII_FORMSET *HiiFormset, > - IN HII_FORM *HiiForm, > - IN HII_STATEMENT *HiiStatement, > - IN HII_STATEMENT_VALUE *Value > - ) > -{ > - EFI_STATUS Status; > - > - if (HiiFormset =3D=3D NULL || HiiForm =3D=3D NULL || HiiStatement =3D= =3D NULL || > Value =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Status =3D SetQuestionValue ( > - HiiFormset, > - HiiForm, > - HiiStatement, > - Value > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n", > __FUNCTION__, Status)); > - return Status; > - } > - > - Status =3D SubmitForm (HiiFormset, HiiForm); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n", > __FUNCTION__, Status)); > - return Status; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Common implementation to set statement private instance. > - > - @param[in] RedfishPlatformConfigPrivate Private instance. > - @param[in] Schema Redfish schema string. > - @param[in] ConfigureLang Configure language that re= fers to this > statement. > - @param[in] Statement Statement instance > - > - @retval EFI_SUCCESS HII value is returned successfully. > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -RedfishPlatformConfigSetStatementCommon ( > - IN REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate, > - IN CHAR8 *Schema, > - IN EFI_STRING ConfigureLang, > - IN HII_STATEMENT_VALUE *StatementValue > - ) > -{ > - EFI_STATUS Status; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement; > - EFI_STRING TempBuffer; > - > - if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schem= a) > || IS_EMPTY_STRING (ConfigureLang) || StatementValue =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - TempBuffer =3D NULL; > - > - Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > - return Status; > - } > - > - TargetStatement =3D GetStatementPrivateByConfigureLang > (&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang); > - if (TargetStatement =3D=3D NULL) { > - DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the > given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema)); > - return EFI_NOT_FOUND; > - } > - > - if (StatementValue->Type !=3D TargetStatement->HiiStatement->Value.Typ= e) > { > - // > - // We treat one-of type as string in Redfish. But one-of statement i= s not > - // in string format from HII point of view. Do a patch here. > - // > - if (TargetStatement->HiiStatement->Operand =3D=3D EFI_IFR_ONE_OF_OP > && StatementValue->Type =3D=3D EFI_IFR_TYPE_STRING) { > - TempBuffer =3D AllocatePool (StatementValue->BufferLen * sizeof > (CHAR16)); > - if (TempBuffer =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - AsciiStrToUnicodeStrS (StatementValue->Buffer, TempBuffer, > StatementValue->BufferLen); > - FreePool (StatementValue->Buffer); > - StatementValue->Buffer =3D NULL; > - StatementValue->BufferLen =3D 0; > - > - Status =3D HiiStringToOneOfOptionValue (TargetStatement, Schema, > TempBuffer, StatementValue); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the giv= en > %s\n", __FUNCTION__, TempBuffer)); > - FreePool (TempBuffer); > - return EFI_NOT_FOUND; > - } > - > - FreePool (TempBuffer); > - } else if (TargetStatement->HiiStatement->Operand =3D=3D > EFI_IFR_NUMERIC_OP && StatementValue->Type =3D=3D > EFI_IFR_TYPE_NUM_SIZE_64) { > - // > - // Redfish only has numeric value type and it does not care about = the > value size. > - // Do a patch here so we have proper value size applied. > - // > - StatementValue->Type =3D TargetStatement->HiiStatement->Value.Type= ; > - } else { > - DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type: > 0x%x but target value type: 0x%x\n", __FUNCTION__, StatementValue- > >Type, TargetStatement->HiiStatement->Value.Type)); > - ASSERT (FALSE); > - } > - } > - > - Status =3D RedfishPlatformConfigSaveQuestionValue ( > - TargetStatement->ParentForm->ParentFormset->HiiFormSet, > - TargetStatement->ParentForm->HiiForm, > - TargetStatement->HiiStatement, > - StatementValue > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n", > __FUNCTION__, Status)); > - return Status; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Set Redfish value with the given Schema and Configure Language. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] Schema The Redfish schema to query. > - @param[in] Version The Redfish version to query. > - @param[in] ConfigureLang The target value which match this con= figure > Language. > - @param[in] Value The value to set. > - > - @retval EFI_SUCCESS Value is returned successfully. > - @retval Others Some error happened. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishPlatformConfigProtocolSetValue ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN CHAR8 *Schema, > - IN CHAR8 *Version, > - IN EFI_STRING ConfigureLang, > - IN EDKII_REDFISH_VALUE Value > - ) > -{ > - EFI_STATUS Status; > - REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > - CHAR8 *FullSchema; > - HII_STATEMENT_VALUE NewValue; > - > - if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING > (Version) || IS_EMPTY_STRING (ConfigureLang)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (Value.Type =3D=3D REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=3D > REDFISH_VALUE_TYPE_MAX) { > - return EFI_INVALID_PARAMETER; > - } > - > - RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > - FullSchema =3D NULL; > - > - FullSchema =3D GetFullSchemaString (Schema, Version); > - if (FullSchema =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE)); > - > - switch (Value.Type) { > - case REDFISH_VALUE_TYPE_INTEGER: > - case REDFISH_VALUE_TYPE_BOOLEAN: > - Status =3D RedfishNumericToHiiValue (&Value, &NewValue); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii > value: %r\n", __FUNCTION__, Status)); > - goto RELEASE_RESOURCE; > - } > - break; > - case REDFISH_VALUE_TYPE_STRING: > - NewValue.Type =3D EFI_IFR_TYPE_STRING; > - NewValue.BufferLen =3D (UINT16)AsciiStrSize (Value.Value.Buffer); > - NewValue.Buffer =3D AllocateCopyPool (NewValue.BufferLen, > Value.Value.Buffer); > - if (NewValue.Buffer =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto RELEASE_RESOURCE; > - } > - break; > - default: > - ASSERT (FALSE); > - break; > - } > - > - Status =3D RedfishPlatformConfigSetStatementCommon > (RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, &NewValue); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n", > __FUNCTION__, Status)); > - } > - > -RELEASE_RESOURCE: > - > - if (FullSchema !=3D NULL) { > - FreePool (FullSchema); > - } > - > - return Status; > -} > - > -/** > - Get the list of Configure Language from platform configuration by the = given > Schema and Pattern. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] Schema The Redfish schema to query. > - @param[in] Version The Redfish version to query. > - @param[in] Pattern The target Configure Language pattern= . > - @param[out] ConfigureLangList The list of Configure Language. > - @param[out] Count The number of Configure Language in > ConfigureLangList. > - > - @retval EFI_SUCCESS ConfigureLangList is returned success= fully. > - @retval Others Some error happened. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishPlatformConfigProtocolGetConfigureLang ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN CHAR8 *Schema, > - IN CHAR8 *Version, > - IN EFI_STRING Pattern, > - OUT EFI_STRING **ConfigureLangList, > - OUT UINTN *Count > - ) > -{ > - REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > - EFI_STATUS Status; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef; > - LIST_ENTRY *NextLink; > - EFI_STRING TmpString; > - EFI_STRING *TmpConfigureLangList; > - UINTN Index; > - CHAR8 *FullSchema; > - > - if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING > (Version) || Count =3D=3D NULL || ConfigureLangList =3D=3D NULL || > IS_EMPTY_STRING (Pattern)) { > - return EFI_INVALID_PARAMETER; > - } > - > - *Count =3D 0; > - *ConfigureLangList =3D NULL; > - FullSchema =3D NULL; > - RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > - > - Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > - return Status; > - } > - > - FullSchema =3D GetFullSchemaString (Schema, Version); > - if (FullSchema =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Status =3D GetStatementPrivateByConfigureLangRegex ( > - RedfishPlatformConfigPrivate->RegularExpressionProtocol, > - &RedfishPlatformConfigPrivate->FormsetList, > - FullSchema, > - Pattern, > - &StatementList > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, > GetStatementPrivateByConfigureLangRegex failure: %r\n", __FUNCTION__, > Status)); > - goto RELEASE_RESOURCE; > - } > - > - if (!IsListEmpty (&StatementList.StatementList)) { > - > - TmpConfigureLangList =3D AllocateZeroPool (sizeof (CHAR16 *) * > StatementList.Count); > - if (TmpConfigureLangList =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto RELEASE_RESOURCE; > - } > - > - Index =3D 0; > - NextLink =3D GetFirstNode (&StatementList.StatementList); > - while (!IsNull (&StatementList.StatementList, NextLink)) { > - StatementRef =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink); > - NextLink =3D GetNextNode (&StatementList.StatementList, NextLink); > - > - ASSERT (StatementRef->Statement->Description !=3D 0); > - if (StatementRef->Statement->Description !=3D 0) { > - TmpString =3D HiiGetRedfishString (StatementRef->Statement- > >ParentForm->ParentFormset->HiiHandle, FullSchema, StatementRef- > >Statement->Description); > - ASSERT (TmpString !=3D NULL); > - if (TmpString !=3D NULL) { > - TmpConfigureLangList[Index] =3D AllocateCopyPool (StrSize (Tmp= String), > TmpString); > - ASSERT (TmpConfigureLangList[Index] !=3D NULL); > - FreePool (TmpString); > - ++Index; > - } > - } > - } > - } > - > - *Count =3D StatementList.Count; > - *ConfigureLangList =3D TmpConfigureLangList; > - > -RELEASE_RESOURCE: > - > - if (FullSchema !=3D NULL) { > - FreePool (FullSchema); > - } > - > - ReleaseStatementList (&StatementList); > - > - return Status; > -} > - > - > -/** > - Get the list of supported Redfish schema from paltform configuration o= n > give HII handle. > - > - @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > - @param[in] HiiHandle The target handle to search. If handl= e is NULL, > - this function return all schema from = HII database. > - @param[out] SupportedSchema The supported schema list which is > separated by ';'. > - The SupportedSchema is allocated by t= he callee. It's caller's > - responsibility to free this buffer us= ing FreePool(). > - > - @retval EFI_SUCCESS Schema is returned successfully. > - @retval Others Some error happened. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishPlatformConfigProtocolGetSupportedSchema ( > - IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > - IN EFI_HII_HANDLE HiiHandle, OPTIO= NAL > - OUT CHAR8 **SupportedSchema > - ) > -{ > - REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > - EFI_STATUS Status; > - LIST_ENTRY *HiiFormsetLink; > - LIST_ENTRY *HiiFormsetNextLink; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > - UINTN Index; > - UINTN StringSize; > - CHAR8 *StringBuffer; > - UINTN StringIndex; > - > - if (This =3D=3D NULL || SupportedSchema =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - *SupportedSchema =3D NULL; > - > - RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > - > - Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > - return Status; > - } > - > - if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) { > - return EFI_NOT_FOUND; > - } > - > - // > - // Calculate for string buffer size. > - // > - StringSize =3D 0; > - HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate- > >FormsetList); > - while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, > HiiFormsetLink)) { > - HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate- > >FormsetList, HiiFormsetLink); > - HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > - > - if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHand= le) { > - HiiFormsetLink =3D HiiFormsetNextLink; > - continue; > - } > - > - if (HiiFormsetPrivate->SupportedSchema.Count > 0) { > - for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count= ; > Index++) { > - StringSize +=3D AsciiStrSize (HiiFormsetPrivate- > >SupportedSchema.SchemaList[Index]); > - } > - } > - > - HiiFormsetLink =3D HiiFormsetNextLink; > - } > - > - if (StringSize =3D=3D 0) { > - return EFI_NOT_FOUND; > - } > - > - StringBuffer =3D AllocatePool (StringSize); > - if (StringBuffer =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - StringIndex =3D 0; > - HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate- > >FormsetList); > - while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, > HiiFormsetLink)) { > - HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate- > >FormsetList, HiiFormsetLink); > - HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > - > - if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHand= le) { > - HiiFormsetLink =3D HiiFormsetNextLink; > - continue; > - } > - > - if (HiiFormsetPrivate->SupportedSchema.Count > 0) { > - for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count= ; > Index++) { > - AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringIn= dex), > HiiFormsetPrivate->SupportedSchema.SchemaList[Index]); > - StringIndex +=3D AsciiStrLen (HiiFormsetPrivate- > >SupportedSchema.SchemaList[Index]); > - StringBuffer[StringIndex] =3D ';'; > - ++StringIndex; > - } > - } > - > - HiiFormsetLink =3D HiiFormsetNextLink; > - } > - > - StringBuffer[--StringIndex] =3D '\0'; > - > - *SupportedSchema =3D StringBuffer; > - > - return EFI_SUCCESS; > -} > - > -/** > - Functions which are registered to receive notification of > - database events have this prototype. The actual event is encoded > - in NotifyType. The following table describes how PackageType, > - PackageGuid, Handle, and Package are used for each of the > - notification types. > - > - @param[in] PackageType Package type of the notification. > - @param[in] PackageGuid If PackageType is > - EFI_HII_PACKAGE_TYPE_GUID, then this is > - the pointer to the GUID from the Guid > - field of EFI_HII_PACKAGE_GUID_HEADER. > - Otherwise, it must be NULL. > - @param[in] Package Points to the package referred to by the > - notification Handle The handle of the package > - list which contains the specified package. > - @param[in] Handle The HII handle. > - @param[in] NotifyType The type of change concerning the > - database. See > - EFI_HII_DATABASE_NOTIFY_TYPE. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishPlatformConfigFormUpdateNotify ( > - IN UINT8 PackageType, > - IN CONST EFI_GUID *PackageGuid, > - IN CONST EFI_HII_PACKAGE_HEADER *Package, > - IN EFI_HII_HANDLE Handle, > - IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType > - ) > -{ > - EFI_STATUS Status; > - > - if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType > =3D=3D EFI_HII_DATABASE_NOTIFY_ADD_PACK) { > - // > - // HII formset on this handle is updated by driver during run-time. = The > formset needs to be reloaded. > - // > - Status =3D NotifyFormsetUpdate (Handle, &mRedfishPlatformConfigPriva= te- > >PendingList); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII > handle: 0x%x\n", __FUNCTION__, Handle)); > - return Status; > - } > - } else if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) { > - // > - // HII resource is removed. The formset is no longer exist. > - // > - Status =3D NotifyFormsetDeleted (Handle, > &mRedfishPlatformConfigPrivate->PendingList); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII > handle: 0x%x\n", __FUNCTION__, Handle)); > - return Status; > - } > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - This is a EFI_HII_STRING_PROTOCOL notification event handler. > - > - Install HII package notification. > - > - @param[in] Event Event whose notification function is being invoked= . > - @param[in] Context Pointer to the notification function's context. > - > -**/ > -VOID > -EFIAPI > -HiiStringProtocolInstalled ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - EFI_STATUS Status; > - > - // > - // Locate HII database protocol. > - // > - Status =3D gBS->LocateProtocol ( > - &gEfiHiiStringProtocolGuid, > - NULL, > - (VOID **)&mRedfishPlatformConfigPrivate->HiiString > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure: > %r\n", __FUNCTION__, Status)); > - return; > - } > - > - gBS->CloseEvent (Event); > - mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D NULL; > -} > - > -/** > - This is a EFI_HII_DATABASE_PROTOCOL notification event handler. > - > - Install HII package notification. > - > - @param[in] Event Event whose notification function is being invoked= . > - @param[in] Context Pointer to the notification function's context. > - > -**/ > -VOID > -EFIAPI > -HiiDatabaseProtocolInstalled ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - EFI_STATUS Status; > - > - // > - // Locate HII database protocol. > - // > - Status =3D gBS->LocateProtocol ( > - &gEfiHiiDatabaseProtocolGuid, > - NULL, > - (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL > failure: %r\n", __FUNCTION__, Status)); > - return; > - } > - > - // > - // Register package notification when new form package is installed. > - // > - Status =3D mRedfishPlatformConfigPrivate->HiiDatabase- > >RegisterPackageNotify ( > - mRedfishPlatformConfigPriva= te->HiiDatabase, > - EFI_HII_PACKAGE_FORMS, > - NULL, > - RedfishPlatformConfigFormUp= dateNotify, > - EFI_HII_DATABASE_NOTIFY_NEW= _PACK, > - &mRedfishPlatformConfigPriv= ate->NotifyHandle > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for > EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__, > Status)); > - } > - > - // > - // Register package notification when new form package is updated. > - // > - Status =3D mRedfishPlatformConfigPrivate->HiiDatabase- > >RegisterPackageNotify ( > - mRedfishPlatformConfigPriva= te->HiiDatabase, > - EFI_HII_PACKAGE_FORMS, > - NULL, > - RedfishPlatformConfigFormUp= dateNotify, > - EFI_HII_DATABASE_NOTIFY_ADD= _PACK, > - &mRedfishPlatformConfigPriv= ate->NotifyHandle > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for > EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__, > Status)); > - } > - > -#if REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET > - // > - // Register package notification when new form package is removed. > - // > - Status =3D mRedfishPlatformConfigPrivate->HiiDatabase- > >RegisterPackageNotify ( > - mRedfishPlatformConfigPriva= te->HiiDatabase, > - EFI_HII_PACKAGE_FORMS, > - NULL, > - RedfishPlatformConfigFormUp= dateNotify, > - EFI_HII_DATABASE_NOTIFY_REM= OVE_PACK, > - &mRedfishPlatformConfigPriv= ate->NotifyHandle > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for > EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__, > Status)); > - } > -#endif > - > - gBS->CloseEvent (Event); > - mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D NULL; > - > -} > - > -/** > - This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler. > - > - @param[in] Event Event whose notification function is being invoked= . > - @param[in] Context Pointer to the notification function's context. > - > -**/ > -VOID > -EFIAPI > -RegexProtocolInstalled ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - EFI_STATUS Status; > - > - // > - // Locate regular expression protocol. > - // > - Status =3D gBS->LocateProtocol ( > - &gEfiRegularExpressionProtocolGuid, > - NULL, > - (VOID **)&mRedfishPlatformConfigPrivate- > >RegularExpressionProtocol > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, locate > EFI_REGULAR_EXPRESSION_PROTOCOL failure: %r\n", __FUNCTION__, > Status)); > - return; > - } > - > - gBS->CloseEvent (Event); > - mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D NULL; > - > -} > - > -/** > - Unloads an image. > - > - @param ImageHandle Handle that identifies the image to be > unloaded. > - > - @retval EFI_SUCCESS The image has been unloaded. > - @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishPlatformConfigDxeUnload ( > - IN EFI_HANDLE ImageHandle > - ) > -{ > - EFI_STATUS Status; > - > - if (mRedfishPlatformConfigPrivate !=3D NULL) { > - Status =3D gBS->UninstallProtocolInterface ( > - mRedfishPlatformConfigPrivate->ImageHandle, > - &gEdkIIRedfishPlatformConfigProtocolGuid, > - (VOID*)&mRedfishPlatformConfigPrivate->Protocol > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, can not uninstall > gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status)); > - ASSERT (FALSE); > - } > - > - // > - // Close events > - // > - if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent !=3D NU= LL) { > - gBS->CloseEvent (mRedfishPlatformConfigPrivate- > >HiiDbNotify.ProtocolEvent); > - } > - if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent != =3D NULL) > { > - gBS->CloseEvent (mRedfishPlatformConfigPrivate- > >HiiStringNotify.ProtocolEvent); > - } > - if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent !=3D NU= LL) { > - gBS->CloseEvent (mRedfishPlatformConfigPrivate- > >RegexNotify.ProtocolEvent); > - } > - > - // > - // Unregister package notification. > - // > - if (mRedfishPlatformConfigPrivate->NotifyHandle !=3D NULL) { > - mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotif= y > ( > - mRedfishPlatformConfigPrivate-= >HiiDatabase, > - mRedfishPlatformConfigPrivate-= >NotifyHandle > - ); > - } > - > - ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList); > - FreePool (mRedfishPlatformConfigPrivate); > - mRedfishPlatformConfigPrivate =3D NULL; > - } > - > - return EFI_SUCCESS; > -} > - > - > -/** > - 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 incl= uding > - both device drivers and bus drivers. > - > - @param ImageHandle The firmware allocated handle for the UE= FI > image. > - @param SystemTable A pointer to the EFI System Table. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval Others An unexpected error occurred. > -**/ > -EFI_STATUS > -EFIAPI > -RedfishPlatformConfigDxeEntryPoint ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - EFI_STATUS Status; > - > - mRedfishPlatformConfigPrivate =3D (REDFISH_PLATFORM_CONFIG_PRIVATE > *)AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE)); > - if (mRedfishPlatformConfigPrivate =3D=3D NULL) { > - DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for > REDFISH_PLATFORM_CONFIG_PRIVATE\n", __FUNCTION__)); > - ASSERT (FALSE); > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Protocol initialization > - // > - mRedfishPlatformConfigPrivate->ImageHandle =3D ImageHandle; > - mRedfishPlatformConfigPrivate->Protocol.GetValue =3D > RedfishPlatformConfigProtocolGetValue; > - mRedfishPlatformConfigPrivate->Protocol.SetValue =3D > RedfishPlatformConfigProtocolSetValue; > - mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =3D > RedfishPlatformConfigProtocolGetConfigureLang; > - mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =3D > RedfishPlatformConfigProtocolGetSupportedSchema; > - > - InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList); > - InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList); > - > - Status =3D gBS->InstallProtocolInterface ( > - &ImageHandle, > - &gEdkIIRedfishPlatformConfigProtocolGuid, > - EFI_NATIVE_INTERFACE, > - (VOID*)&mRedfishPlatformConfigPrivate->Protocol > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, can not install > gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status)); > - ASSERT (FALSE); > - } > - > - // > - // Install protocol notification if HII database protocol is installed= . > - // > - mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D > EfiCreateProtocolNotifyEvent ( > - &gEfiHiiDa= tabaseProtocolGuid, > - TPL_CALLBA= CK, > - HiiDatabas= eProtocolInstalled, > - NULL, > - &mRedfishP= latformConfigPrivate- > >HiiDbNotify.Registration > - ); > - if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D=3D NU= LL) { > - DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for > gEfiHiiDatabaseProtocolGuid\n", __FUNCTION__)); > - ASSERT (FALSE); > - } > - > - // > - // Install protocol notification if HII string protocol is installed. > - // > - mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D > EfiCreateProtocolNotifyEvent ( > - &gEfiH= iiStringProtocolGuid, > - TPL_CA= LLBACK, > - HiiStr= ingProtocolInstalled, > - NULL, > - &mRedf= ishPlatformConfigPrivate- > >HiiStringNotify.Registration > - ); > - if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D= =3D NULL) > { > - DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for > gEfiHiiStringProtocolGuid\n", __FUNCTION__)); > - ASSERT (FALSE); > - } > - > - // > - // Install protocol notification if regular expression protocol is ins= talled. > - // > - mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D > EfiCreateProtocolNotifyEvent ( > - &gEfiRegul= arExpressionProtocolGuid, > - TPL_CALLBA= CK, > - RegexProto= colInstalled, > - NULL, > - &mRedfishP= latformConfigPrivate- > >RegexNotify.Registration > - ); > - if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D=3D NU= LL) { > - DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for > gEfiRegularExpressionProtocolGuid\n", __FUNCTION__)); > - ASSERT (FALSE); > - } > - > - return EFI_SUCCESS; > -} > +/** @file > + > + The implementation of EDKII Redfidh Platform Config Protocol. > + > + (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "RedfishPlatformConfigDxe.h" > +#include "RedfishPlatformConfigImpl.h" > + > +REDFISH_PLATFORM_CONFIG_PRIVATE *mRedfishPlatformConfigPrivate =3D > NULL; > + > + > +/** > + Zero extend integer/boolean to UINT64 for comparing. > + > + @param Value HII Value to be converted. > + > +**/ > +UINT64 > +ExtendHiiValueToU64 ( > + IN HII_STATEMENT_VALUE *Value > + ) > +{ > + UINT64 Temp; > + > + Temp =3D 0; > + switch (Value->Type) { > + case EFI_IFR_TYPE_NUM_SIZE_8: > + Temp =3D Value->Value.u8; > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_16: > + Temp =3D Value->Value.u16; > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_32: > + Temp =3D Value->Value.u32; > + break; > + > + case EFI_IFR_TYPE_BOOLEAN: > + Temp =3D Value->Value.b; > + break; > + > + case EFI_IFR_TYPE_TIME: > + case EFI_IFR_TYPE_DATE: > + default: > + break; > + } > + > + return Temp; > +} > + > +/** > + Set value of a data element in an Array by its Index in ordered list b= uffer. > + > + @param Array The data array. > + @param Type Type of the data in this array. > + @param Index Zero based index for data in this array= . > + @param Value The value to be set. > + > +**/ > +VOID > +OrderedListSetArrayData ( > + IN VOID *Array, > + IN UINT8 Type, > + IN UINTN Index, > + IN UINT64 Value > + ) > +{ > + > + ASSERT (Array !=3D NULL); > + > + switch (Type) { > + case EFI_IFR_TYPE_NUM_SIZE_8: > + *(((UINT8 *) Array) + Index) =3D (UINT8) Value; > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_16: > + *(((UINT16 *) Array) + Index) =3D (UINT16) Value; > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_32: > + *(((UINT32 *) Array) + Index) =3D (UINT32) Value; > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_64: > + *(((UINT64 *) Array) + Index) =3D (UINT64) Value; > + break; > + > + default: > + break; > + } > +} > + > +/** > + Return data element in an Array by its Index in ordered list array buf= fer. > + > + @param Array The data array. > + @param Type Type of the data in this array. > + @param Index Zero based index for data in this array= . > + > + @retval Value The data to be returned > + > +**/ > +UINT64 > +OrderedListGetArrayData ( > + IN VOID *Array, > + IN UINT8 Type, > + IN UINTN Index > + ) > +{ > + UINT64 Data; > + > + ASSERT (Array !=3D NULL); > + > + Data =3D 0; > + switch (Type) { > + case EFI_IFR_TYPE_NUM_SIZE_8: > + Data =3D (UINT64) *(((UINT8 *) Array) + Index); > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_16: > + Data =3D (UINT64) *(((UINT16 *) Array) + Index); > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_32: > + Data =3D (UINT64) *(((UINT32 *) Array) + Index); > + break; > + > + case EFI_IFR_TYPE_NUM_SIZE_64: > + Data =3D (UINT64) *(((UINT64 *) Array) + Index); > + break; > + > + default: > + break; > + } > + > + return Data; > +} > + > +/** > + Find string ID of option if its value equals to given value. > + > + @param[in] HiiStatement Statement to search. > + @param[in] Value Target value. > + > + @retval EFI_SUCCESS HII value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STRING_ID > +OrderedListOptionValueToStringId ( > + IN HII_STATEMENT *HiiStatement, > + IN UINT64 Value > + ) > +{ > + LIST_ENTRY *Link; > + HII_QUESTION_OPTION *Option; > + BOOLEAN Found; > + UINT64 CurrentValue; > + > + if (HiiStatement =3D=3D NULL) { > + return 0; > + } > + > + if (HiiStatement->Operand !=3D EFI_IFR_ORDERED_LIST_OP) { > + return 0; > + } > + > + if (IsListEmpty (&HiiStatement->OptionListHead)) { > + return 0; > + } > + > + Found =3D FALSE; > + Link =3D GetFirstNode (&HiiStatement->OptionListHead); > + while (!IsNull (&HiiStatement->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + > + CurrentValue =3D ExtendHiiValueToU64 (&Option->Value); > + if (Value =3D=3D CurrentValue) { > + return Option->Text; > + } > + > + Link =3D GetNextNode (&HiiStatement->OptionListHead, Link); > + } > + > + return 0; > +} > + > +/** > + Compare two value in HII statement format. > + > + @param[in] Value1 Firt value to compare. > + @param[in] Value2 Second value to be compared. > + > + @retval INTN 0 is retuned when two values are equal. > + 1 is returned when first value is greater than s= econd value. > + -1 is returned when second value is greater than= first value. > + > +**/ > +INTN > +CompareHiiStatementValue ( > + IN HII_STATEMENT_VALUE *Value1, > + IN HII_STATEMENT_VALUE *Value2 > + ) > +{ > + INTN Result; > + UINT64 Data1; > + UINT64 Data2; > + > + if (Value1 =3D=3D NULL || Value2 =3D=3D NULL) { > + return -1; > + } > + > + switch (Value1->Type) { > + case EFI_IFR_TYPE_NUM_SIZE_8: > + Data1 =3D Value1->Value.u8; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_16: > + Data1 =3D Value1->Value.u16; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_32: > + Data1 =3D Value1->Value.u32; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_64: > + Data1 =3D Value1->Value.u64; > + break; > + case EFI_IFR_TYPE_BOOLEAN: > + Data1 =3D (Value1->Value.b ? 1 : 0); > + break; > + default: > + return -1; > + } > + > + switch (Value2->Type) { > + case EFI_IFR_TYPE_NUM_SIZE_8: > + Data2 =3D Value2->Value.u8; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_16: > + Data2 =3D Value2->Value.u16; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_32: > + Data2 =3D Value2->Value.u32; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_64: > + Data2 =3D Value2->Value.u64; > + break; > + case EFI_IFR_TYPE_BOOLEAN: > + Data2 =3D (Value2->Value.b ? 1 : 0); > + break; > + default: > + return -1; > + } > + > + Result =3D (Data1 =3D=3D Data2 ? 0 : (Data1 > Data2 ? 1 : -1)); > + > + return Result; > +} > + > +/** > + Convert HII value to the string in HII one-of opcode. > + > + @param[in] Statement Statement private instance > + > + @retval EFI_STRING_ID The string ID in HII database. > + 0 is returned when something goes wrong. > + > +**/ > +EFI_STRING_ID > +HiiValueToOneOfOptionStringId ( > + IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement > + ) > +{ > + LIST_ENTRY *Link; > + HII_QUESTION_OPTION *Option; > + > + if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) { > + return 0; > + } > + > + if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) { > + return 0; > + } > + > + Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead); > + while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + > + if (CompareHiiStatementValue (&Statement->HiiStatement->Value, > &Option->Value) =3D=3D 0) { > + return Option->Text; > + } > + > + Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link= ); > + } > + > + return 0; > +} > + > +/** > + Convert HII string to the value in HII one-of opcode. > + > + @param[in] Statement Statement private instance > + @param[in] Schema Schema string > + @param[in] HiiString Input string > + @param[out] Value Value returned > + > + @retval EFI_SUCCESS HII value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +HiiStringToOneOfOptionValue ( > + IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement, > + IN CHAR8 *Schema, > + IN EFI_STRING HiiString, > + OUT HII_STATEMENT_VALUE *Value > + ) > +{ > + LIST_ENTRY *Link; > + HII_QUESTION_OPTION *Option; > + EFI_STRING TmpString; > + BOOLEAN Found; > + > + if (Statement =3D=3D NULL || IS_EMPTY_STRING (HiiString) || Value =3D= =3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (Statement->HiiStatement->Operand !=3D EFI_IFR_ONE_OF_OP) { > + return EFI_UNSUPPORTED; > + } > + > + if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) { > + return EFI_NOT_FOUND; > + } > + > + Found =3D FALSE; > + Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead); > + while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + > + TmpString =3D HiiGetRedfishString (Statement->ParentForm- > >ParentFormset->HiiHandle, Schema, Option->Text); > + if (TmpString !=3D NULL) { > + if (StrCmp (TmpString, HiiString) =3D=3D 0) { > + CopyMem (Value, &Option->Value, sizeof (HII_STATEMENT_VALUE)); > + Found =3D TRUE; > + } > + FreePool (TmpString); > + } > + > + if (Found) { > + return EFI_SUCCESS; > + } > + > + Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link= ); > + } > + > + return EFI_NOT_FOUND; > +} > + > +/** > + Convert HII value to numeric value in Redfish format. > + > + @param[in] Value Value to be converted. > + @param[out] RedfishValue Value in Redfish format. > + > + @retval EFI_SUCCESS Redfish value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +HiiValueToRedfishNumeric ( > + IN HII_STATEMENT_VALUE *Value, > + OUT EDKII_REDFISH_VALUE *RedfishValue > + ) > +{ > + if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (Value->Type) { > + case EFI_IFR_TYPE_NUM_SIZE_8: > + RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > + RedfishValue->Value.Integer =3D (INT64)Value->Value.u8; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_16: > + RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > + RedfishValue->Value.Integer =3D (INT64)Value->Value.u16; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_32: > + RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > + RedfishValue->Value.Integer =3D (INT64)Value->Value.u32; > + break; > + case EFI_IFR_TYPE_NUM_SIZE_64: > + RedfishValue->Type =3D REDFISH_VALUE_TYPE_INTEGER; > + RedfishValue->Value.Integer =3D (INT64)Value->Value.u64; > + break; > + case EFI_IFR_TYPE_BOOLEAN: > + RedfishValue->Type =3D REDFISH_VALUE_TYPE_BOOLEAN; > + RedfishValue->Value.Boolean =3D Value->Value.b; > + break; > + default: > + RedfishValue->Type =3D REDFISH_VALUE_TYPE_UNKNOWN; > + break; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Convert numeric value in Redfish format to HII value. > + > + @param[in] RedfishValue Value in Redfish format to be converted. > + @param[out] Value HII value returned. > + > + @retval EFI_SUCCESS HII value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +RedfishNumericToHiiValue ( > + IN EDKII_REDFISH_VALUE *RedfishValue, > + OUT HII_STATEMENT_VALUE *Value > + ) > +{ > + if (Value =3D=3D NULL || RedfishValue =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + switch (RedfishValue->Type) { > + case REDFISH_VALUE_TYPE_INTEGER: > + Value->Type =3D EFI_IFR_TYPE_NUM_SIZE_64; > + Value->Value.u64 =3D (UINT64)RedfishValue->Value.Integer; > + break; > + case REDFISH_VALUE_TYPE_BOOLEAN: > + Value->Type =3D EFI_IFR_TYPE_BOOLEAN; > + Value->Value.b =3D RedfishValue->Value.Boolean; > + break; > + default: > + Value->Type =3D EFI_IFR_TYPE_UNDEFINED; > + break; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Dump the value in ordered list buffer. > + > + @param[in] OrderedListStatement Ordered list statement. > + > +**/ > +VOID > +DumpOrderedListValue ( > + IN HII_STATEMENT *OrderedListStatement > + ) > +{ > + UINT8 *Value8; > + UINT16 *Value16; > + UINT32 *Value32; > + UINT64 *Value64; > + UINTN Count; > + UINTN Index; > + > + if (OrderedListStatement =3D=3D NULL || OrderedListStatement->Operand = !=3D > EFI_IFR_ORDERED_LIST_OP) { > + return; > + } > + > + DEBUG ((DEBUG_ERROR, "Value.Type=3D 0x%x\n", OrderedListStatement- > >Value.Type)); > + DEBUG ((DEBUG_ERROR, "Value.BufferValueType=3D 0x%x\n", > OrderedListStatement->Value.BufferValueType)); > + DEBUG ((DEBUG_ERROR, "Value.BufferLen=3D 0x%x\n", > OrderedListStatement->Value.BufferLen)); > + DEBUG ((DEBUG_ERROR, "Value.Buffer=3D 0x%x\n", OrderedListStatement- > >Value.Buffer)); > + DEBUG ((DEBUG_ERROR, "Value.MaxContainers=3D 0x%x\n", > OrderedListStatement->ExtraData.OrderListData.MaxContainers)); > + DEBUG ((DEBUG_ERROR, "StorageWidth=3D 0x%x\n", > OrderedListStatement->StorageWidth)); > + > + if (OrderedListStatement->Value.Buffer =3D=3D NULL) { > + return; > + } > + > + Value8 =3D NULL; > + Value16 =3D NULL; > + Value32 =3D NULL; > + Value64 =3D NULL; > + Count =3D 0; > + > + switch (OrderedListStatement->Value.BufferValueType) { > + case EFI_IFR_TYPE_NUM_SIZE_8: > + Value8 =3D (UINT8 *)OrderedListStatement->Value.Buffer; > + Count =3D OrderedListStatement->StorageWidth / sizeof (UINT8); > + for (Index =3D 0; Index < Count; Index++) { > + DEBUG ((DEBUG_ERROR, "%d ", Value8[Index])); > + } > + break; > + case EFI_IFR_TYPE_NUM_SIZE_16: > + Value16 =3D (UINT16 *)OrderedListStatement->Value.Buffer; > + Count =3D OrderedListStatement->StorageWidth / sizeof (UINT16); > + for (Index =3D 0; Index < Count; Index++) { > + DEBUG ((DEBUG_ERROR, "%d ", Value16[Index])); > + } > + break; > + case EFI_IFR_TYPE_NUM_SIZE_32: > + Value32 =3D (UINT32 *)OrderedListStatement->Value.Buffer; > + Count =3D OrderedListStatement->StorageWidth / sizeof (UINT32); > + for (Index =3D 0; Index < Count; Index++) { > + DEBUG ((DEBUG_ERROR, "%d ", Value32[Index])); > + } > + break; > + case EFI_IFR_TYPE_NUM_SIZE_64: > + Value64 =3D (UINT64 *)OrderedListStatement->Value.Buffer; > + Count =3D OrderedListStatement->StorageWidth / sizeof (UINT64); > + for (Index =3D 0; Index < Count; Index++) { > + DEBUG ((DEBUG_ERROR, "%d ", Value64[Index])); > + } > + break; > + default: > + Value8 =3D (UINT8 *)OrderedListStatement->Value.Buffer; > + Count =3D OrderedListStatement->StorageWidth / sizeof (UINT8); > + for (Index =3D 0; Index < Count; Index++) { > + DEBUG ((DEBUG_ERROR, "%d ", Value8[Index])); > + } > + break; > + } > + > + DEBUG ((DEBUG_ERROR, "\n")); > +} > + > +/** > + Convert HII value to the string in HII ordered list opcode. It's calle= r's > + responsibility to free returned buffer using FreePool(). > + > + @param[in] Statement Statement private instance > + @param[out] ReturnSize The size of returned array > + > + @retval EFI_STRING_ID The string ID array for options in ordered l= ist. > + > +**/ > +EFI_STRING_ID * > +HiiValueToOrderedListOptionStringId ( > + IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement, > + OUT UINTN *ReturnSize > + ) > +{ > + LIST_ENTRY *Link; > + HII_QUESTION_OPTION *Option; > + UINTN OptionCount; > + EFI_STRING_ID *ReturnedArray; > + UINTN Index; > + UINT64 Value; > + > + if (Statement =3D=3D NULL || ReturnSize =3D=3D NULL) { > + return NULL; > + } > + > + *ReturnSize =3D 0; > + > + if (Statement->HiiStatement->Operand !=3D EFI_IFR_ORDERED_LIST_OP) { > + return NULL; > + } > + > + if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) { > + return NULL; > + } > + > + DEBUG_CODE ( > + DumpOrderedListValue (Statement->HiiStatement); > + ); > + > + OptionCount =3D 0; > + Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead); > + while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + > + ++OptionCount; > + > + Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link= ); > + } > + > + *ReturnSize =3D OptionCount; > + ReturnedArray =3D AllocatePool (sizeof (EFI_STRING_ID) * OptionCount); > + if (ReturnedArray =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__)); > + *ReturnSize =3D 0; > + return NULL; > + } > + > + for (Index =3D 0; Index < OptionCount; Index++) { > + Value =3D OrderedListGetArrayData (Statement->HiiStatement- > >Value.Buffer, Statement->HiiStatement->Value.BufferValueType, Index); > + ReturnedArray[Index] =3D OrderedListOptionValueToStringId (Statement= - > >HiiStatement, Value); > + } > + > + return ReturnedArray; > +} > + > +/** > + Convert HII string to the value in HII ordered list opcode. > + > + @param[in] Statement Statement private instance > + @param[in] Schema Schema string > + @param[in] HiiString Input string > + @param[out] Value Value returned > + > + @retval EFI_SUCCESS HII value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +HiiStringToOrderedListOptionValue ( > + IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement, > + IN CHAR8 *Schema, > + IN EFI_STRING HiiString, > + OUT UINT64 *Value > + ) > +{ > + LIST_ENTRY *Link; > + HII_QUESTION_OPTION *Option; > + EFI_STRING TmpString; > + BOOLEAN Found; > + > + if (Statement =3D=3D NULL || IS_EMPTY_STRING (HiiString) || Value =3D= =3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + *Value =3D 0; > + > + if (Statement->HiiStatement->Operand !=3D EFI_IFR_ORDERED_LIST_OP) { > + return EFI_UNSUPPORTED; > + } > + > + if (IsListEmpty (&Statement->HiiStatement->OptionListHead)) { > + return EFI_NOT_FOUND; > + } > + > + Found =3D FALSE; > + Link =3D GetFirstNode (&Statement->HiiStatement->OptionListHead); > + while (!IsNull (&Statement->HiiStatement->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + > + TmpString =3D HiiGetRedfishString (Statement->ParentForm- > >ParentFormset->HiiHandle, Schema, Option->Text); > + if (TmpString !=3D NULL) { > + if (StrCmp (TmpString, HiiString) =3D=3D 0) { > + *Value =3D ExtendHiiValueToU64 (&Option->Value); > + Found =3D TRUE; > + } > + FreePool (TmpString); > + } > + > + if (Found) { > + return EFI_SUCCESS; > + } > + > + Link =3D GetNextNode (&Statement->HiiStatement->OptionListHead, Link= ); > + } > + > + return EFI_NOT_FOUND; > +} > + > +/** > + Convert input ascii string to unicode string. It's caller's > + responsibility to free returned buffer using FreePool(). > + > + @param[in] AsciiString Ascii string to be converted. > + > + @retval CHAR16 * Unicode string on return. > + > +**/ > +EFI_STRING > +StrToUnicodeStr ( > + IN CHAR8 *AsciiString > + ) > +{ > + UINTN StringLen; > + EFI_STRING Buffer; > + EFI_STATUS Status; > + > + if (AsciiString =3D=3D NULL || AsciiString[0] =3D=3D '\0') { > + return NULL; > + } > + > + StringLen =3D AsciiStrLen (AsciiString) + 1; > + Buffer =3D AllocatePool (StringLen * sizeof (CHAR16)); > + if (Buffer =3D=3D NULL) { > + return NULL; > + } > + > + Status =3D AsciiStrToUnicodeStrS (AsciiString, Buffer, StringLen); > + if (EFI_ERROR (Status)) { > + FreePool (Buffer); > + return NULL; > + } > + > + return Buffer; > +} > + > +/** > + Return the full Redfish schema string from the given Schema and Versio= n. > + > + Returned schema string is: Schema + '.' + Version > + > + @param[in] Schema Schema string > + @param[in] Version Schema version string > + > + @retval CHAR8 * Schema string. NULL when errors occur. > + > +**/ > +CHAR8 * > +GetFullSchemaString ( > + IN CHAR8 *Schema, > + IN CHAR8 *Version > + ) > +{ > + UINTN Size; > + CHAR8 *FullName; > + > + if (IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING (Version)) { > + return NULL; > + } > + > + Size =3D AsciiStrSize(CONFIGURE_LANGUAGE_PREFIX) + AsciiStrSize > (Schema) + AsciiStrSize (Version); > + > + FullName =3D AllocatePool (Size); > + if (FullName =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, out-of-resource\n", __FUNCTION__)); > + return NULL; > + } > + > + AsciiSPrint (FullName, Size, "%a%a.%a", CONFIGURE_LANGUAGE_PREFIX, > Schema, Version); > + > + return FullName; > +} > + > +/** > + Common implementation to get statement private instance. > + > + @param[in] RedfishPlatformConfigPrivate Private instance. > + @param[in] Schema Redfish schema string. > + @param[in] ConfigureLang Configure language that re= fers to this > statement. > + @param[out] Statement Statement instance > + > + @retval EFI_SUCCESS HII value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +RedfishPlatformConfigGetStatementCommon ( > + IN REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate, > + IN CHAR8 *Schema, > + IN EFI_STRING ConfigureLang, > + OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE **Statement > + ) > +{ > + EFI_STATUS Status; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement; > + > + if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schem= a) > || IS_EMPTY_STRING (ConfigureLang) || Statement =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + *Statement =3D NULL; > + > + Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + TargetStatement =3D GetStatementPrivateByConfigureLang > (&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang); > + if (TargetStatement =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the > given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema)); > + return EFI_NOT_FOUND; > + } > + > + // > + // Find current HII question value. > + // > + Status =3D GetQuestionValue ( > + TargetStatement->ParentForm->ParentFormset->HiiFormSet, > + TargetStatement->ParentForm->HiiForm, > + TargetStatement->HiiStatement, > + GetSetValueWithHiiDriver > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to get question current value: %r\n= ", > __FUNCTION__, Status)); > + return Status; > + } > + > + > + if (TargetStatement->HiiStatement->Value.Type =3D=3D > EFI_IFR_TYPE_UNDEFINED) { > + return EFI_DEVICE_ERROR; > + } > + > + // > + // Return Value. > + // > + *Statement =3D TargetStatement; > + > + return EFI_SUCCESS; > +} > + > +/** > + Get Redfish value with the given Schema and Configure Language. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] Schema The Redfish schema to query. > + @param[in] Version The Redfish version to query. > + @param[in] ConfigureLang The target value which match this con= figure > Language. > + @param[out] Value The returned value. > + > + @retval EFI_SUCCESS Value is returned successfully. > + @retval Others Some error happened. > + > +**/ > +EFI_STATUS > +EFIAPI > +RedfishPlatformConfigProtocolGetValue ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN CHAR8 *Schema, > + IN CHAR8 *Version, > + IN EFI_STRING ConfigureLang, > + OUT EDKII_REDFISH_VALUE *Value > + ) > +{ > + EFI_STATUS Status; > + REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement; > + EFI_STRING_ID StringId; > + EFI_STRING_ID *StringIdArray; > + CHAR8 *FullSchema; > + EFI_STRING HiiString; > + UINTN Count; > + UINTN Index; > + > + if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING > (Version) || IS_EMPTY_STRING (ConfigureLang) || Value =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > + Value->Type =3D REDFISH_VALUE_TYPE_UNKNOWN; > + Value->ArrayCount =3D 0; > + Count =3D 0; > + FullSchema =3D NULL; > + HiiString =3D NULL; > + StringIdArray =3D NULL; > + > + FullSchema =3D GetFullSchemaString (Schema, Version); > + if (FullSchema =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Status =3D RedfishPlatformConfigGetStatementCommon > (RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, > &TargetStatement); > + if (EFI_ERROR (Status)) { > + goto RELEASE_RESOURCE; > + } > + > + switch (TargetStatement->HiiStatement->Operand) { > + case EFI_IFR_ONE_OF_OP: > + StringId =3D HiiValueToOneOfOptionStringId (TargetStatement); > + if (StringId =3D=3D 0) { > + ASSERT (FALSE); > + Status =3D EFI_DEVICE_ERROR; > + goto RELEASE_RESOURCE; > + } > + > + Value->Value.Buffer =3D HiiGetRedfishAsciiString (TargetStatement- > >ParentForm->ParentFormset->HiiHandle, FullSchema, StringId); > + if (Value->Value.Buffer =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto RELEASE_RESOURCE; > + } > + > + Value->Type =3D REDFISH_VALUE_TYPE_STRING; > + break; > + case EFI_IFR_STRING_OP: > + if (TargetStatement->HiiStatement->Value.Type !=3D > EFI_IFR_TYPE_STRING) { > + ASSERT (FALSE); > + Status =3D EFI_DEVICE_ERROR; > + goto RELEASE_RESOURCE; > + } > + > + Value->Type =3D REDFISH_VALUE_TYPE_STRING; > + Value->Value.Buffer =3D AllocatePool (StrLen ((CHAR16 > *)TargetStatement->HiiStatement->Value.Buffer) + 1); > + UnicodeStrToAsciiStrS ((CHAR16 *)TargetStatement->HiiStatement- > >Value.Buffer, Value->Value.Buffer, StrLen ((CHAR16 *)TargetStatement- > >HiiStatement->Value.Buffer) + 1); > + break; > + case EFI_IFR_CHECKBOX_OP: > + case EFI_IFR_NUMERIC_OP: > + Status =3D HiiValueToRedfishNumeric (&TargetStatement->HiiStatemen= t- > >Value, Value); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to convert HII value to Redfish > value: %r\n", __FUNCTION__, Status)); > + goto RELEASE_RESOURCE; > + } > + break; > + case EFI_IFR_ACTION_OP: > + if (TargetStatement->HiiStatement->Value.Type !=3D > EFI_IFR_TYPE_ACTION) { > + ASSERT (FALSE); > + Status =3D EFI_DEVICE_ERROR; > + goto RELEASE_RESOURCE; > + } > + > + // > + // Action has no value. Just return unknown type. > + // > + Value->Type =3D REDFISH_VALUE_TYPE_UNKNOWN; > + break; > + case EFI_IFR_ORDERED_LIST_OP: > + StringIdArray =3D HiiValueToOrderedListOptionStringId (TargetState= ment, > &Count); > + if (StringIdArray =3D=3D NULL) { > + ASSERT (FALSE); > + Status =3D EFI_DEVICE_ERROR; > + goto RELEASE_RESOURCE; > + } > + > + Value->Value.StringArray =3D AllocatePool (sizeof (CHAR8 *) * Coun= t); > + if (Value->Value.StringArray =3D=3D NULL) { > + ASSERT (FALSE); > + Status =3D EFI_OUT_OF_RESOURCES; > + goto RELEASE_RESOURCE; > + } > + > + for (Index =3D 0; Index < Count; Index++) { > + ASSERT (StringIdArray[Index] !=3D 0); > + Value->Value.StringArray[Index] =3D HiiGetRedfishAsciiString > (TargetStatement->ParentForm->ParentFormset->HiiHandle, FullSchema, > StringIdArray[Index]); > + } > + > + Value->ArrayCount =3D Count; > + Value->Type =3D REDFISH_VALUE_TYPE_STRING_ARRAY; > + break; > + default: > + DEBUG ((DEBUG_ERROR, "%a, catch unsupported type: 0x%x! Please > contact with author if we need to support this type.\n", __FUNCTION__, > TargetStatement->HiiStatement->Operand)); > + ASSERT (FALSE); > + Status =3D EFI_UNSUPPORTED; > + goto RELEASE_RESOURCE; > + } > + > +RELEASE_RESOURCE: > + > + if (FullSchema !=3D NULL) { > + FreePool (FullSchema); > + } > + > + if (HiiString !=3D NULL) { > + FreePool (HiiString); > + } > + > + if (StringIdArray !=3D NULL) { > + FreePool (StringIdArray); > + } > + > + return Status; > +} > + > +/** > + Function to save question value into HII database. > + > + @param[in] HiiFormset HII form-set instance > + @param[in] HiiForm HII form instance > + @param[in] HiiStatement HII statement that keeps new value. > + @param[in] Value New value to applyu. > + > + @retval EFI_SUCCESS HII value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +RedfishPlatformConfigSaveQuestionValue ( > + IN HII_FORMSET *HiiFormset, > + IN HII_FORM *HiiForm, > + IN HII_STATEMENT *HiiStatement, > + IN HII_STATEMENT_VALUE *Value > + ) > +{ > + EFI_STATUS Status; > + > + if (HiiFormset =3D=3D NULL || HiiForm =3D=3D NULL || HiiStatement =3D= =3D NULL || > Value =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status =3D SetQuestionValue ( > + HiiFormset, > + HiiForm, > + HiiStatement, > + Value > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to set question value: %r\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + Status =3D SubmitForm (HiiFormset, HiiForm); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to submit form: %r\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Common implementation to set statement private instance. > + > + @param[in] RedfishPlatformConfigPrivate Private instance. > + @param[in] Schema Redfish schema string. > + @param[in] ConfigureLang Configure language that re= fers to this > statement. > + @param[in] Statement Statement instance > + > + @retval EFI_SUCCESS HII value is returned successfully. > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +RedfishPlatformConfigSetStatementCommon ( > + IN REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate, > + IN CHAR8 *Schema, > + IN EFI_STRING ConfigureLang, > + IN HII_STATEMENT_VALUE *StatementValue > + ) > +{ > + EFI_STATUS Status; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *TargetStatement; > + EFI_STRING TempBuffer; > + UINT8 *StringArray; > + UINTN Index; > + UINT64 Value; > + CHAR8 **CharArray; > + > + if (RedfishPlatformConfigPrivate =3D=3D NULL || IS_EMPTY_STRING (Schem= a) > || IS_EMPTY_STRING (ConfigureLang) || StatementValue =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + TempBuffer =3D NULL; > + StringArray =3D NULL; > + > + Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + TargetStatement =3D GetStatementPrivateByConfigureLang > (&RedfishPlatformConfigPrivate->FormsetList, Schema, ConfigureLang); > + if (TargetStatement =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, No match HII statement is found by the > given %s in schema %a\n", __FUNCTION__, ConfigureLang, Schema)); > + return EFI_NOT_FOUND; > + } > + > + if (StatementValue->Type !=3D TargetStatement->HiiStatement- > >Value.Type) { > + // > + // We treat one-of type as string in Redfish. But one-of statement i= s not > + // in string format from HII point of view. Do a patch here. > + // > + if (TargetStatement->HiiStatement->Operand =3D=3D EFI_IFR_ONE_OF_OP > && StatementValue->Type =3D=3D EFI_IFR_TYPE_STRING) { > + > + TempBuffer =3D StrToUnicodeStr ((CHAR8 *)StatementValue->Buffer); > + if (TempBuffer =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + FreePool (StatementValue->Buffer); > + StatementValue->Buffer =3D NULL; > + StatementValue->BufferLen =3D 0; > + > + Status =3D HiiStringToOneOfOptionValue (TargetStatement, Schema, > TempBuffer, StatementValue); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to find option value by the giv= en > %s\n", __FUNCTION__, TempBuffer)); > + FreePool (TempBuffer); > + return EFI_NOT_FOUND; > + } > + > + FreePool (TempBuffer); > + } else if (TargetStatement->HiiStatement->Operand =3D=3D > EFI_IFR_ORDERED_LIST_OP && StatementValue->Type =3D=3D > EFI_IFR_TYPE_STRING) { > + // > + // We treat ordered list type as string in Redfish. But ordered li= st > statement is not > + // in string format from HII point of view. Do a patch here. > + // > + StringArray =3D AllocateZeroPool (TargetStatement->HiiStatement- > >StorageWidth); > + if (StringArray =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Arrage new option order from input string array > + // > + CharArray =3D (CHAR8 **)StatementValue->Buffer; > + for (Index =3D 0; Index < StatementValue->BufferLen; Index++) { > + TempBuffer =3D StrToUnicodeStr (CharArray[Index]); > + if (TempBuffer =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Status =3D HiiStringToOrderedListOptionValue (TargetStatement, S= chema, > TempBuffer, &Value); > + if (EFI_ERROR (Status)) { > + ASSERT (FALSE); > + continue; > + } > + FreePool (TempBuffer); > + OrderedListSetArrayData (StringArray, TargetStatement->HiiStatem= ent- > >Value.BufferValueType, Index, Value); > + } > + > + StatementValue->Type =3D EFI_IFR_TYPE_BUFFER; > + StatementValue->Buffer =3D StringArray; > + StatementValue->BufferLen =3D TargetStatement->HiiStatement- > >StorageWidth; > + StatementValue->BufferValueType =3D TargetStatement->HiiStatement- > >Value.BufferValueType; > + } else if (TargetStatement->HiiStatement->Operand =3D=3D > EFI_IFR_NUMERIC_OP && StatementValue->Type =3D=3D > EFI_IFR_TYPE_NUM_SIZE_64) { > + // > + // Redfish only has numeric value type and it does not care about = the > value size. > + // Do a patch here so we have proper value size applied. > + // > + StatementValue->Type =3D TargetStatement->HiiStatement->Value.Type= ; > + } else { > + DEBUG ((DEBUG_ERROR, "%a, catch value type mismatch! input type: > 0x%x but target value type: 0x%x\n", __FUNCTION__, StatementValue- > >Type, TargetStatement->HiiStatement->Value.Type)); > + ASSERT (FALSE); > + } > + } > + > + Status =3D RedfishPlatformConfigSaveQuestionValue ( > + TargetStatement->ParentForm->ParentFormset->HiiFormSet, > + TargetStatement->ParentForm->HiiForm, > + TargetStatement->HiiStatement, > + StatementValue > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to save question value: %r\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Set Redfish value with the given Schema and Configure Language. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] Schema The Redfish schema to query. > + @param[in] Version The Redfish version to query. > + @param[in] ConfigureLang The target value which match this con= figure > Language. > + @param[in] Value The value to set. > + > + @retval EFI_SUCCESS Value is returned successfully. > + @retval Others Some error happened. > + > +**/ > +EFI_STATUS > +EFIAPI > +RedfishPlatformConfigProtocolSetValue ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN CHAR8 *Schema, > + IN CHAR8 *Version, > + IN EFI_STRING ConfigureLang, > + IN EDKII_REDFISH_VALUE Value > + ) > +{ > + EFI_STATUS Status; > + REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > + CHAR8 *FullSchema; > + HII_STATEMENT_VALUE NewValue; > + > + if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING > (Version) || IS_EMPTY_STRING (ConfigureLang)) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (Value.Type =3D=3D REDFISH_VALUE_TYPE_UNKNOWN || Value.Type >=3D > REDFISH_VALUE_TYPE_MAX) { > + return EFI_INVALID_PARAMETER; > + } > + > + RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > + FullSchema =3D NULL; > + > + FullSchema =3D GetFullSchemaString (Schema, Version); > + if (FullSchema =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE)); > + > + switch (Value.Type) { > + case REDFISH_VALUE_TYPE_INTEGER: > + case REDFISH_VALUE_TYPE_BOOLEAN: > + Status =3D RedfishNumericToHiiValue (&Value, &NewValue); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to convert Redfish value to Hii > value: %r\n", __FUNCTION__, Status)); > + goto RELEASE_RESOURCE; > + } > + break; > + case REDFISH_VALUE_TYPE_STRING: > + NewValue.Type =3D EFI_IFR_TYPE_STRING; > + NewValue.BufferLen =3D (UINT16)AsciiStrSize (Value.Value.Buffer); > + NewValue.Buffer =3D AllocateCopyPool (NewValue.BufferLen, > Value.Value.Buffer); > + if (NewValue.Buffer =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto RELEASE_RESOURCE; > + } > + break; > + case REDFISH_VALUE_TYPE_STRING_ARRAY: > + NewValue.Type =3D EFI_IFR_TYPE_STRING; > + NewValue.BufferLen =3D (UINT16)Value.ArrayCount; > + NewValue.Buffer =3D (UINT8 *)Value.Value.StringArray; > + break; > + default: > + ASSERT (FALSE); > + break; > + } > + > + Status =3D RedfishPlatformConfigSetStatementCommon > (RedfishPlatformConfigPrivate, FullSchema, ConfigureLang, &NewValue); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to set value to statement: %r\n", > __FUNCTION__, Status)); > + } > + > +RELEASE_RESOURCE: > + > + if (FullSchema !=3D NULL) { > + FreePool (FullSchema); > + } > + > + return Status; > +} > + > +/** > + Get the list of Configure Language from platform configuration by the > given Schema and RegexPattern. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] Schema The Redfish schema to query. > + @param[in] Version The Redfish version to query. > + @param[in] RegexPattern The target Configure Language pattern= . > This is used for regular expression matching. > + @param[out] ConfigureLangList The list of Configure Language. > + @param[out] Count The number of Configure Language in > ConfigureLangList. > + > + @retval EFI_SUCCESS ConfigureLangList is returned success= fully. > + @retval Others Some error happened. > + > +**/ > +EFI_STATUS > +EFIAPI > +RedfishPlatformConfigProtocolGetConfigureLang ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN CHAR8 *Schema, > + IN CHAR8 *Version, > + IN EFI_STRING RegexPattern, > + OUT EFI_STRING **ConfigureLangList, > + OUT UINTN *Count > + ) > +{ > + REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > + EFI_STATUS Status; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST StatementList; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF > *StatementRef; > + LIST_ENTRY *NextLink; > + EFI_STRING TmpString; > + EFI_STRING *TmpConfigureLangList; > + UINTN Index; > + CHAR8 *FullSchema; > + > + if (This =3D=3D NULL || IS_EMPTY_STRING (Schema) || IS_EMPTY_STRING > (Version) || Count =3D=3D NULL || ConfigureLangList =3D=3D NULL || > IS_EMPTY_STRING (RegexPattern)) { > + return EFI_INVALID_PARAMETER; > + } > + > + *Count =3D 0; > + *ConfigureLangList =3D NULL; > + FullSchema =3D NULL; > + RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > + > + Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + FullSchema =3D GetFullSchemaString (Schema, Version); > + if (FullSchema =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Status =3D GetStatementPrivateByConfigureLangRegex ( > + RedfishPlatformConfigPrivate->RegularExpressionProtocol, > + &RedfishPlatformConfigPrivate->FormsetList, > + FullSchema, > + RegexPattern, > + &StatementList > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, > GetStatementPrivateByConfigureLangRegex failure: %r\n", __FUNCTION__, > Status)); > + goto RELEASE_RESOURCE; > + } > + > + if (!IsListEmpty (&StatementList.StatementList)) { > + > + TmpConfigureLangList =3D AllocateZeroPool (sizeof (CHAR16 *) * > StatementList.Count); > + if (TmpConfigureLangList =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto RELEASE_RESOURCE; > + } > + > + Index =3D 0; > + NextLink =3D GetFirstNode (&StatementList.StatementList); > + while (!IsNull (&StatementList.StatementList, NextLink)) { > + StatementRef =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink); > + NextLink =3D GetNextNode (&StatementList.StatementList, NextLink); > + > + ASSERT (StatementRef->Statement->Description !=3D 0); > + if (StatementRef->Statement->Description !=3D 0) { > + TmpString =3D HiiGetRedfishString (StatementRef->Statement- > >ParentForm->ParentFormset->HiiHandle, FullSchema, StatementRef- > >Statement->Description); > + ASSERT (TmpString !=3D NULL); > + if (TmpString !=3D NULL) { > + TmpConfigureLangList[Index] =3D AllocateCopyPool (StrSize (Tmp= String), > TmpString); > + ASSERT (TmpConfigureLangList[Index] !=3D NULL); > + FreePool (TmpString); > + ++Index; > + } > + } > + } > + } > + > + *Count =3D StatementList.Count; > + *ConfigureLangList =3D TmpConfigureLangList; > + > +RELEASE_RESOURCE: > + > + if (FullSchema !=3D NULL) { > + FreePool (FullSchema); > + } > + > + ReleaseStatementList (&StatementList); > + > + return Status; > +} > + > +/** > + Get the list of supported Redfish schema from paltform configuration o= n > give HII handle. > + > + @param[in] This Pointer to > EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instance. > + @param[in] HiiHandle The target handle to search. If handl= e is NULL, > + this function return all schema from = HII database. > + @param[out] SupportedSchema The supported schema list which is > separated by ';'. > + The SupportedSchema is allocated by t= he callee. It's > caller's > + responsibility to free this buffer us= ing FreePool(). > + > + @retval EFI_SUCCESS Schema is returned successfully. > + @retval Others Some error happened. > + > +**/ > +EFI_STATUS > +EFIAPI > +RedfishPlatformConfigProtocolGetSupportedSchema ( > + IN EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *This, > + IN EFI_HII_HANDLE HiiHandle, OPTIO= NAL > + OUT CHAR8 **SupportedSchema > + ) > +{ > + REDFISH_PLATFORM_CONFIG_PRIVATE > *RedfishPlatformConfigPrivate; > + EFI_STATUS Status; > + LIST_ENTRY *HiiFormsetLink; > + LIST_ENTRY *HiiFormsetNextLink; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > + UINTN Index; > + UINTN StringSize; > + CHAR8 *StringBuffer; > + UINTN StringIndex; > + > + if (This =3D=3D NULL || SupportedSchema =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + *SupportedSchema =3D NULL; > + > + RedfishPlatformConfigPrivate =3D > REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS (This); > + > + Status =3D ProcessPendingList (&RedfishPlatformConfigPrivate->FormsetL= ist, > &RedfishPlatformConfigPrivate->PendingList); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, ProcessPendingList failure: %r\n", > __FUNCTION__, Status)); > + return Status; > + } > + > + if (IsListEmpty (&RedfishPlatformConfigPrivate->FormsetList)) { > + return EFI_NOT_FOUND; > + } > + > + // > + // Calculate for string buffer size. > + // > + StringSize =3D 0; > + HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate- > >FormsetList); > + while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, > HiiFormsetLink)) { > + HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate- > >FormsetList, HiiFormsetLink); > + HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > + > + if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHand= le) { > + HiiFormsetLink =3D HiiFormsetNextLink; > + continue; > + } > + > + if (HiiFormsetPrivate->SupportedSchema.Count > 0) { > + for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count= ; > Index++) { > + StringSize +=3D AsciiStrSize (HiiFormsetPrivate- > >SupportedSchema.SchemaList[Index]); > + } > + } > + > + HiiFormsetLink =3D HiiFormsetNextLink; > + } > + > + if (StringSize =3D=3D 0) { > + return EFI_NOT_FOUND; > + } > + > + StringBuffer =3D AllocatePool (StringSize); > + if (StringBuffer =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + StringIndex =3D 0; > + HiiFormsetLink =3D GetFirstNode (&RedfishPlatformConfigPrivate- > >FormsetList); > + while (!IsNull (&RedfishPlatformConfigPrivate->FormsetList, > HiiFormsetLink)) { > + HiiFormsetNextLink =3D GetNextNode (&RedfishPlatformConfigPrivate- > >FormsetList, HiiFormsetLink); > + HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > + > + if (HiiHandle !=3D NULL && HiiHandle !=3D HiiFormsetPrivate->HiiHand= le) { > + HiiFormsetLink =3D HiiFormsetNextLink; > + continue; > + } > + > + if (HiiFormsetPrivate->SupportedSchema.Count > 0) { > + for (Index =3D 0; Index < HiiFormsetPrivate->SupportedSchema.Count= ; > Index++) { > + AsciiStrCpyS (&StringBuffer[StringIndex], (StringSize - StringIn= dex), > HiiFormsetPrivate->SupportedSchema.SchemaList[Index]); > + StringIndex +=3D AsciiStrLen (HiiFormsetPrivate- > >SupportedSchema.SchemaList[Index]); > + StringBuffer[StringIndex] =3D ';'; > + ++StringIndex; > + } > + } > + > + HiiFormsetLink =3D HiiFormsetNextLink; > + } > + > + StringBuffer[--StringIndex] =3D '\0'; > + > + *SupportedSchema =3D StringBuffer; > + > + return EFI_SUCCESS; > +} > + > +/** > + Functions which are registered to receive notification of > + database events have this prototype. The actual event is encoded > + in NotifyType. The following table describes how PackageType, > + PackageGuid, Handle, and Package are used for each of the > + notification types. > + > + @param[in] PackageType Package type of the notification. > + @param[in] PackageGuid If PackageType is > + EFI_HII_PACKAGE_TYPE_GUID, then this is > + the pointer to the GUID from the Guid > + field of EFI_HII_PACKAGE_GUID_HEADER. > + Otherwise, it must be NULL. > + @param[in] Package Points to the package referred to by the > + notification Handle The handle of the package > + list which contains the specified package. > + @param[in] Handle The HII handle. > + @param[in] NotifyType The type of change concerning the > + database. See > + EFI_HII_DATABASE_NOTIFY_TYPE. > + > +**/ > +EFI_STATUS > +EFIAPI > +RedfishPlatformConfigFormUpdateNotify ( > + IN UINT8 PackageType, > + IN CONST EFI_GUID *PackageGuid, > + IN CONST EFI_HII_PACKAGE_HEADER *Package, > + IN EFI_HII_HANDLE Handle, > + IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType > + ) > +{ > + EFI_STATUS Status; > + > + if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_NEW_PACK || NotifyType > =3D=3D EFI_HII_DATABASE_NOTIFY_ADD_PACK) { > + // > + // HII formset on this handle is updated by driver during run-time. = The > formset needs to be reloaded. > + // > + Status =3D NotifyFormsetUpdate (Handle, > &mRedfishPlatformConfigPrivate->PendingList); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to notify updated formset of HII > handle: 0x%x\n", __FUNCTION__, Handle)); > + return Status; > + } > + } else if (NotifyType =3D=3D EFI_HII_DATABASE_NOTIFY_REMOVE_PACK) { > + // > + // HII resource is removed. The formset is no longer exist. > + // > + Status =3D NotifyFormsetDeleted (Handle, > &mRedfishPlatformConfigPrivate->PendingList); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to notify deleted formset of HII > handle: 0x%x\n", __FUNCTION__, Handle)); > + return Status; > + } > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + This is a EFI_HII_STRING_PROTOCOL notification event handler. > + > + Install HII package notification. > + > + @param[in] Event Event whose notification function is being invoked= . > + @param[in] Context Pointer to the notification function's context. > + > +**/ > +VOID > +EFIAPI > +HiiStringProtocolInstalled ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + EFI_STATUS Status; > + > + // > + // Locate HII database protocol. > + // > + Status =3D gBS->LocateProtocol ( > + &gEfiHiiStringProtocolGuid, > + NULL, > + (VOID **)&mRedfishPlatformConfigPrivate->HiiString > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_STRING_PROTOCOL failure: > %r\n", __FUNCTION__, Status)); > + return; > + } > + > + gBS->CloseEvent (Event); > + mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D NULL; > +} > + > +/** > + This is a EFI_HII_DATABASE_PROTOCOL notification event handler. > + > + Install HII package notification. > + > + @param[in] Event Event whose notification function is being invoked= . > + @param[in] Context Pointer to the notification function's context. > + > +**/ > +VOID > +EFIAPI > +HiiDatabaseProtocolInstalled ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + EFI_STATUS Status; > + > + // > + // Locate HII database protocol. > + // > + Status =3D gBS->LocateProtocol ( > + &gEfiHiiDatabaseProtocolGuid, > + NULL, > + (VOID **)&mRedfishPlatformConfigPrivate->HiiDatabase > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, locate EFI_HII_DATABASE_PROTOCOL > failure: %r\n", __FUNCTION__, Status)); > + return; > + } > + > + // > + // Register package notification when new form package is installed. > + // > + Status =3D mRedfishPlatformConfigPrivate->HiiDatabase- > >RegisterPackageNotify ( > + mRedfishPlatformConfigPriva= te->HiiDatabase, > + EFI_HII_PACKAGE_FORMS, > + NULL, > + RedfishPlatformConfigFormUp= dateNotify, > + EFI_HII_DATABASE_NOTIFY_NEW= _PACK, > + &mRedfishPlatformConfigPriv= ate->NotifyHandle > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for > EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__, > Status)); > + } > + > + // > + // Register package notification when new form package is updated. > + // > + Status =3D mRedfishPlatformConfigPrivate->HiiDatabase- > >RegisterPackageNotify ( > + mRedfishPlatformConfigPriva= te->HiiDatabase, > + EFI_HII_PACKAGE_FORMS, > + NULL, > + RedfishPlatformConfigFormUp= dateNotify, > + EFI_HII_DATABASE_NOTIFY_ADD= _PACK, > + &mRedfishPlatformConfigPriv= ate->NotifyHandle > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, RegisterPackageNotify for > EFI_HII_DATABASE_NOTIFY_NEW_PACK failure: %r\n", __FUNCTION__, > Status)); > + } > + > + gBS->CloseEvent (Event); > + mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D NULL; > + > +} > + > +/** > + This is a EFI_REGULAR_EXPRESSION_PROTOCOL notification event handler. > + > + @param[in] Event Event whose notification function is being invoked= . > + @param[in] Context Pointer to the notification function's context. > + > +**/ > +VOID > +EFIAPI > +RegexProtocolInstalled ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + EFI_STATUS Status; > + > + // > + // Locate regular expression protocol. > + // > + Status =3D gBS->LocateProtocol ( > + &gEfiRegularExpressionProtocolGuid, > + NULL, > + (VOID **)&mRedfishPlatformConfigPrivate- > >RegularExpressionProtocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, locate > EFI_REGULAR_EXPRESSION_PROTOCOL failure: %r\n", __FUNCTION__, > Status)); > + return; > + } > + > + gBS->CloseEvent (Event); > + mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D NULL; > + > +} > + > +/** > + Unloads an image. > + > + @param ImageHandle Handle that identifies the image to be > unloaded. > + > + @retval EFI_SUCCESS The image has been unloaded. > + @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image > handle. > + > +**/ > +EFI_STATUS > +EFIAPI > +RedfishPlatformConfigDxeUnload ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + EFI_STATUS Status; > + > + if (mRedfishPlatformConfigPrivate !=3D NULL) { > + Status =3D gBS->UninstallProtocolInterface ( > + mRedfishPlatformConfigPrivate->ImageHandle, > + &gEdkIIRedfishPlatformConfigProtocolGuid, > + (VOID*)&mRedfishPlatformConfigPrivate->Protocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, can not uninstall > gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status)); > + ASSERT (FALSE); > + } > + > + // > + // Close events > + // > + if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent !=3D NU= LL) { > + gBS->CloseEvent (mRedfishPlatformConfigPrivate- > >HiiDbNotify.ProtocolEvent); > + } > + if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent != =3D > NULL) { > + gBS->CloseEvent (mRedfishPlatformConfigPrivate- > >HiiStringNotify.ProtocolEvent); > + } > + if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent !=3D NU= LL) > { > + gBS->CloseEvent (mRedfishPlatformConfigPrivate- > >RegexNotify.ProtocolEvent); > + } > + > + // > + // Unregister package notification. > + // > + if (mRedfishPlatformConfigPrivate->NotifyHandle !=3D NULL) { > + mRedfishPlatformConfigPrivate->HiiDatabase->UnregisterPackageNotif= y > ( > + mRedfishPlatformConfigPrivate-= >HiiDatabase, > + mRedfishPlatformConfigPrivate-= >NotifyHandle > + ); > + } > + > + ReleaseFormsetList (&mRedfishPlatformConfigPrivate->FormsetList); > + FreePool (mRedfishPlatformConfigPrivate); > + mRedfishPlatformConfigPrivate =3D NULL; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + 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 incl= uding > + both device drivers and bus drivers. > + > + @param ImageHandle The firmware allocated handle for the UE= FI > image. > + @param SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval Others An unexpected error occurred. > +**/ > +EFI_STATUS > +EFIAPI > +RedfishPlatformConfigDxeEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + mRedfishPlatformConfigPrivate =3D (REDFISH_PLATFORM_CONFIG_PRIVATE > *)AllocateZeroPool (sizeof (REDFISH_PLATFORM_CONFIG_PRIVATE)); > + if (mRedfishPlatformConfigPrivate =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, can not allocate pool for > REDFISH_PLATFORM_CONFIG_PRIVATE\n", __FUNCTION__)); > + ASSERT (FALSE); > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Protocol initialization > + // > + mRedfishPlatformConfigPrivate->ImageHandle =3D ImageHandle; > + mRedfishPlatformConfigPrivate->Protocol.GetValue =3D > RedfishPlatformConfigProtocolGetValue; > + mRedfishPlatformConfigPrivate->Protocol.SetValue =3D > RedfishPlatformConfigProtocolSetValue; > + mRedfishPlatformConfigPrivate->Protocol.GetConfigureLang =3D > RedfishPlatformConfigProtocolGetConfigureLang; > + mRedfishPlatformConfigPrivate->Protocol.GetSupportedSchema =3D > RedfishPlatformConfigProtocolGetSupportedSchema; > + > + InitializeListHead (&mRedfishPlatformConfigPrivate->FormsetList); > + InitializeListHead (&mRedfishPlatformConfigPrivate->PendingList); > + > + Status =3D gBS->InstallProtocolInterface ( > + &ImageHandle, > + &gEdkIIRedfishPlatformConfigProtocolGuid, > + EFI_NATIVE_INTERFACE, > + (VOID*)&mRedfishPlatformConfigPrivate->Protocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, can not install > gEdkIIRedfishPlatformConfigProtocolGuid: %r\n", __FUNCTION__, Status)); > + ASSERT (FALSE); > + } > + > + // > + // Install protocol notification if HII database protocol is installed= . > + // > + mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D > EfiCreateProtocolNotifyEvent ( > + &gEfiHiiDa= tabaseProtocolGuid, > + TPL_CALLBA= CK, > + HiiDatabas= eProtocolInstalled, > + NULL, > + &mRedfishP= latformConfigPrivate- > >HiiDbNotify.Registration > + ); > + if (mRedfishPlatformConfigPrivate->HiiDbNotify.ProtocolEvent =3D=3D NU= LL) { > + DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for > gEfiHiiDatabaseProtocolGuid\n", __FUNCTION__)); > + ASSERT (FALSE); > + } > + > + // > + // Install protocol notification if HII string protocol is installed. > + // > + mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D > EfiCreateProtocolNotifyEvent ( > + &gEfiH= iiStringProtocolGuid, > + TPL_CA= LLBACK, > + HiiStr= ingProtocolInstalled, > + NULL, > + &mRedf= ishPlatformConfigPrivate- > >HiiStringNotify.Registration > + ); > + if (mRedfishPlatformConfigPrivate->HiiStringNotify.ProtocolEvent =3D= =3D NULL) > { > + DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for > gEfiHiiStringProtocolGuid\n", __FUNCTION__)); > + ASSERT (FALSE); > + } > + > + // > + // Install protocol notification if regular expression protocol is ins= talled. > + // > + mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D > EfiCreateProtocolNotifyEvent ( > + &gEfiRegul= arExpressionProtocolGuid, > + TPL_CALLBA= CK, > + RegexProto= colInstalled, > + NULL, > + &mRedfishP= latformConfigPrivate- > >RegexNotify.Registration > + ); > + if (mRedfishPlatformConfigPrivate->RegexNotify.ProtocolEvent =3D=3D NU= LL) { > + DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notification for > gEfiRegularExpressionProtocolGuid\n", __FUNCTION__)); > + ASSERT (FALSE); > + } > + > + return EFI_SUCCESS; > +} > diff --git > a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h > b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h > index 99a613d229..d3f7af55ad 100644 > --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h > +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.h > @@ -1,64 +1,64 @@ > -/** @file > - This file defines the EDKII Redfish Platform Config Protocol interface= . > - > - (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > - > -#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_ > -#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_ > - > -#include > - > -// > -// Libraries > -// > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -// > -// Produced Protocols > -// > -#include > -#include > -#include > -#include > - > -// > -// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY. > -// > -typedef struct { > - EFI_EVENT ProtocolEvent; // Protocol notification = event. > - VOID *Registration; // Protocol notification = registration. > -} REDFISH_PLATFORM_CONFIG_NOTIFY; > - > -// > -// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE. > -// > -typedef struct { > - EFI_HANDLE ImageHandle; = // Driver image handle. > - EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol; > - REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify; > - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; = // The HII > database protocol. > - REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify; > - EFI_HII_STRING_PROTOCOL *HiiString; = // HII String > Protocol. > - REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify; > - EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol; > // Regular Expression Protocol. > - EFI_HANDLE NotifyHandle; = // The notify handle. > - LIST_ENTRY FormsetList; = // The list to keep cached > HII formset. > - LIST_ENTRY PendingList; = // The list to keep updated > HII handle. > -} REDFISH_PLATFORM_CONFIG_PRIVATE; > - > -#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR > (a, REDFISH_PLATFORM_CONFIG_PRIVATE, Protocol) > -#define REGULAR_EXPRESSION_INCLUDE_ALL L".*" > -#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-" > - > -#endif > +/** @file > + This file defines the EDKII Redfish Platform Config Protocol interface= . > + > + (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_ > +#define EDKII_REDFISH_PLATFORM_CONFIG_DXE_H_ > + > +#include > + > +// > +// Libraries > +// > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +// > +// Produced Protocols > +// > +#include > +#include > +#include > +#include > + > +// > +// Definition of EDKII_REDFISH_PLATFORM_CONFIG_NOTIFY. > +// > +typedef struct { > + EFI_EVENT ProtocolEvent; // Protocol notification = event. > + VOID *Registration; // Protocol notification = registration. > +} REDFISH_PLATFORM_CONFIG_NOTIFY; > + > +// > +// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE. > +// > +typedef struct { > + EFI_HANDLE ImageHandle; = // Driver image handle. > + EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Protocol; > + REDFISH_PLATFORM_CONFIG_NOTIFY HiiDbNotify; > + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; = // The HII > database protocol. > + REDFISH_PLATFORM_CONFIG_NOTIFY HiiStringNotify; > + EFI_HII_STRING_PROTOCOL *HiiString; = // HII String > Protocol. > + REDFISH_PLATFORM_CONFIG_NOTIFY RegexNotify; > + EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol; > // Regular Expression Protocol. > + EFI_HANDLE NotifyHandle; = // The notify handle. > + LIST_ENTRY FormsetList; = // The list to keep cached > HII formset. > + LIST_ENTRY PendingList; = // The list to keep updated > HII handle. > +} REDFISH_PLATFORM_CONFIG_PRIVATE; > + > +#define REDFISH_PLATFORM_CONFIG_PRIVATE_FROM_THIS(a) BASE_CR > (a, REDFISH_PLATFORM_CONFIG_PRIVATE, Protocol) > +#define REGULAR_EXPRESSION_INCLUDE_ALL L".*" > +#define CONFIGURE_LANGUAGE_PREFIX "x-uefi-redfish-" > + > +#endif > diff --git > a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf > b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf > index 16739bef7a..81b22e03c3 100644 > --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf > +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.inf > @@ -1,53 +1,53 @@ > -## @file > -# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL > interfaces. > -# > -# (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> -# SPDX-License-Identifier: BSD-2-Clause-Patent > -# > -## > - > -[Defines] > - INF_VERSION =3D 0x00010005 > - BASE_NAME =3D RedfishPlatformConfigDxe > - FILE_GUID =3D BEAEFFE1-0633-41B5-913C-9389339C2927 > - MODULE_TYPE =3D DXE_DRIVER > - VERSION_STRING =3D 1.0 > - ENTRY_POINT =3D RedfishPlatformConfigDxeEntryPoint > - UNLOAD_IMAGE =3D RedfishPlatformConfigDxeUnload > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - RedfishPkg/RedfishPkg.dec > - > -[Sources] > - RedfishPlatformConfigDxe.h > - RedfishPlatformConfigDxe.c > - RedfishPlatformConfigImpl.h > - RedfishPlatformConfigImpl.c > - > -[LibraryClasses] > - BaseLib > - BaseMemoryLib > - DebugLib > - DevicePathLib > - HiiLib > - HiiUtilityLib > - MemoryAllocationLib > - PrintLib > - UefiLib > - UefiBootServicesTableLib > - UefiRuntimeServicesTableLib > - UefiDriverEntryPoint > - > -[Protocols] > - gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED > - gEfiHiiDatabaseProtocolGuid ## CONSUMED > - gEfiHiiStringProtocolGuid ## CONSUMED > - gEfiRegularExpressionProtocolGuid ## CONSUMED > - > -[Guids] > - gEfiRegexSyntaxTypePerlGuid ## CONSUMED > - > -[Depex] > +## @file > +# Implementation of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL > interfaces. > +# > +# (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION =3D 0x00010005 > + BASE_NAME =3D RedfishPlatformConfigDxe > + FILE_GUID =3D BEAEFFE1-0633-41B5-913C-9389339C2927 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + ENTRY_POINT =3D RedfishPlatformConfigDxeEntryPoint > + UNLOAD_IMAGE =3D RedfishPlatformConfigDxeUnload > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + RedfishPkg/RedfishPkg.dec > + > +[Sources] > + RedfishPlatformConfigDxe.h > + RedfishPlatformConfigDxe.c > + RedfishPlatformConfigImpl.h > + RedfishPlatformConfigImpl.c > + > +[LibraryClasses] > + BaseLib > + BaseMemoryLib > + DebugLib > + DevicePathLib > + HiiLib > + HiiUtilityLib > + MemoryAllocationLib > + PrintLib > + UefiLib > + UefiBootServicesTableLib > + UefiRuntimeServicesTableLib > + UefiDriverEntryPoint > + > +[Protocols] > + gEdkIIRedfishPlatformConfigProtocolGuid ## PRODUCED > + gEfiHiiDatabaseProtocolGuid ## CONSUMED > + gEfiHiiStringProtocolGuid ## CONSUMED > + gEfiRegularExpressionProtocolGuid ## CONSUMED > + > +[Guids] > + gEfiRegexSyntaxTypePerlGuid ## CONSUMED > + > +[Depex] > TRUE > \ No newline at end of file > diff --git > a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c > b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c > index d9eab6c883..917f946656 100644 > --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c > +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c > @@ -1,1240 +1,1288 @@ > -/** @file > - > - The implementation of EDKII Redfidh Platform Config Protocol. > - > - (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > -#include "RedfishPlatformConfigDxe.h" > -#include "RedfishPlatformConfigImpl.h" > - > -extern REDFISH_PLATFORM_CONFIG_PRIVATE > *mRedfishPlatformConfigPrivate; > - > -/** > - Debug dump HII string > - > - @param[in] HiiHandle HII handle instance > - @param[in] StringId HII string to dump > - > - @retval EFI_SUCCESS Dump HII string successfully > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -DumpHiiString ( > - IN EFI_HII_HANDLE HiiHandle, > - IN EFI_STRING_ID StringId > - ) > -{ > - EFI_STRING String; > - > - if (HiiHandle =3D=3D NULL || StringId =3D=3D 0) { > - DEBUG ((DEBUG_INFO, "???")); > - return EFI_INVALID_PARAMETER; > - } > - > - String =3D HiiGetString (HiiHandle, StringId, NULL); > - if (String =3D=3D NULL) { > - return EFI_NOT_FOUND; > - } > - > - DEBUG ((DEBUG_INFO, "%s", String)); > - FreePool (String); > - > - return EFI_SUCCESS; > -} > - > -/** > - Debug dump HII form-set data > - > - @param[in] FormsetPrivate HII form-set private instance. > - > - @retval EFI_SUCCESS Dump form-set successfully > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -DumpFormset ( > - IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate > - ) > -{ > - LIST_ENTRY *HiiFormLink; > - LIST_ENTRY *HiiNextFormLink; > - REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > - LIST_ENTRY *HiiStatementLink; > - LIST_ENTRY *HiiNextStatementLink; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > - UINTN Index; > - > - if (FormsetPrivate =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Index =3D 0; > - HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList); > - while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) { > - HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > - HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, > HiiFormLink); > - > - DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPriva= te- > >Id)); > - DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title); > - DEBUG ((DEBUG_INFO, "\n")); > - > - HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList); > - while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) { > - HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > - HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi= st, > HiiStatementLink); > - > - DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate- > >QuestionId)); > - DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate- > >Description); > - DEBUG ((DEBUG_INFO, "\n")); > - > - HiiStatementLink =3D HiiNextStatementLink; > - } > - > - HiiFormLink =3D HiiNextFormLink; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Debug dump HII form-set list > - > - @param[in] FormsetList Form-set list instance > - > - @retval EFI_SUCCESS Dump list successfully > - @retval Others Errors occur > - > -**/ > -EFI_STATUS > -DumpFormsetList ( > - IN LIST_ENTRY *FormsetList > - ) > -{ > - LIST_ENTRY *HiiFormsetLink; > - LIST_ENTRY *HiiFormsetNextLink; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > - UINTN Index; > - > - if (FormsetList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (IsListEmpty (FormsetList)) { > - DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__)); > - return EFI_SUCCESS; > - } > - > - Index =3D 0; > - HiiFormsetLink =3D GetFirstNode (FormsetList); > - while (!IsNull (FormsetList, HiiFormsetLink)) { > - HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > - HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > - > - DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n", > ++Index, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid, > HiiFormsetPrivate->DevicePathStr)); > - DumpFormset (HiiFormsetPrivate); > - > - HiiFormsetLink =3D HiiFormsetNextLink; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Retrieves a string from a string package in a English language. The > - returned string is allocated using AllocatePool(). The caller is resp= onsible > - for freeing the allocated buffer using FreePool(). > - > - If HiiHandle is NULL, then ASSERT(). > - If StringId is 0, then ASSET. > - > - @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance. > - @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > - @param[in] StringId The identifier of the string to retrieve= d from the > string > - package associated with HiiHandle. > - > - @retval NULL The string specified by StringId is not present in the = string > package. > - @retval Other The string was returned. > - > -**/ > -EFI_STRING > -HiiGetRedfishString ( > - IN EFI_HII_HANDLE HiiHandle, > - IN CHAR8 *Language, > - IN EFI_STRING_ID StringId > - ) > -{ > - EFI_STATUS Status; > - UINTN StringSize; > - CHAR16 TempString; > - EFI_STRING String; > - > - if (mRedfishPlatformConfigPrivate->HiiString =3D=3D NULL || HiiHandle = =3D=3D NULL > || StringId =3D=3D 0 || IS_EMPTY_STRING (Language)) { > - ASSERT (FALSE); > - return NULL; > - } > - > - // > - // Retrieve the size of the string in the string package for the BestL= anguage > - // > - StringSize =3D 0; > - Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString ( > - mRedfishPlatformConfigPriva= te->HiiString, > - Language, > - HiiHandle, > - StringId, > - &TempString, > - &StringSize, > - NULL > - ); > - // > - // If GetString() returns EFI_SUCCESS for a zero size, > - // then there are no supported languages registered for HiiHandle. If > GetString() > - // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is > not present > - // in the HII Database > - // > - if (Status !=3D EFI_BUFFER_TOO_SMALL) { > - return NULL; > - } > - > - // > - // Allocate a buffer for the return string > - // > - String =3D AllocateZeroPool (StringSize); > - if (String =3D=3D NULL) { > - return NULL; > - } > - > - // > - // Retrieve the string from the string package > - // > - Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString ( > - mRedfishPlatformConfigPriva= te->HiiString, > - Language, > - HiiHandle, > - StringId, > - String, > - &StringSize, > - NULL > - ); > - if (EFI_ERROR (Status)) { > - // > - // Free the buffer and return NULL if the supported languages can no= t be > retrieved. > - // > - FreePool (String); > - String =3D NULL; > - } > - > - // > - // Return the Null-terminated Unicode string > - // > - return String; > -} > - > -/** > - Get string from HII database in English language. > - > - @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > - @param[in] StringId The identifier of the string to retrieve= d from the > string > - package associated with HiiHandle. > - > - @retval NULL The string specified by StringId is not present in the = string > package. > - @retval Other The string was returned. > - > -**/ > -EFI_STRING > -HiiGetEnglishString ( > - IN EFI_HII_HANDLE HiiHandle, > - IN EFI_STRING_ID StringId > - ) > -{ > - return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE, > StringId); > -} > - > -/** > - Check and see if this is supported schema or not. > - > - @param[in] SupportedSchema The list of supported schema. > - @param[in] Schema Schema string to be checked. > - > - @retval BOOLEAN TRUE if this is supported schema. FALSE > otherwise. > - > -**/ > -BOOLEAN > -CheckSupportedSchema ( > - IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema, > - IN CHAR8 *Schema > - ) > -{ > - UINTN Index; > - > - if (SupportedSchema =3D=3D NULL || IS_EMPTY_STRING (Schema)) { > - return FALSE; > - } > - > - if (SupportedSchema->Count =3D=3D 0) { > - return FALSE; > - } > - > - for (Index =3D 0; Index < SupportedSchema->Count; Index++) { > - if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) =3D=3D = 0) { > - return TRUE; > - } > - } > - > - return FALSE; > -} > - > -/** > - Get the list of supported schema from the given HII handle. > - > - @param[in] HiiHandle HII handle instance. > - @param[out] SupportedSchema Supported schema on this HII handle. > - > - @retval EFI_SUCCESS Schema list is returned. > - @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema > is NULL. > - @retval EFI_NOT_FOUND No supported schema found. > - @retval EFI_OUT_OF_RESOURCES System is out of memory. > - > -**/ > -EFI_STATUS > -GetSupportedSchema ( > - IN EFI_HII_HANDLE HiiHandle, > - OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema > - ) > -{ > - CHAR8 *SupportedLanguages; > - UINTN Index; > - UINTN LangIndex; > - UINTN Count; > - UINTN StrSize; > - UINTN ListIndex; > - > - if (HiiHandle =3D=3D NULL || SupportedSchema =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - SupportedSchema->Count =3D 0; > - > - SupportedLanguages =3D HiiGetSupportedLanguages (HiiHandle); > - if (SupportedLanguages =3D=3D NULL) { > - return EFI_NOT_FOUND; > - } > - > - Index =3D 0; > - LangIndex =3D 0; > - Count =3D 0; > - while (TRUE) { > - if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index= ] =3D=3D > '\0') { > - if (AsciiStrnCmp (&SupportedLanguages[LangIndex], > X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) { > - ++Count; > - } > - LangIndex =3D Index + 1; > - } > - > - if (SupportedLanguages[Index] =3D=3D '\0') { > - break; > - } > - > - ++Index; > - } > - > - if (Count =3D=3D 0) { > - return EFI_NOT_FOUND; > - } > - > - SupportedSchema->Count =3D Count; > - SupportedSchema->SchemaList =3D AllocatePool (sizeof (CHAR8 *) * Count= ); > - if (SupportedSchema->SchemaList =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Index =3D 0; > - LangIndex =3D 0; > - ListIndex =3D 0; > - while (TRUE) { > - > - if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index= ] =3D=3D > '\0') { > - if (AsciiStrnCmp (&SupportedLanguages[LangIndex], > X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) { > - StrSize =3D Index - LangIndex; > - SupportedSchema->SchemaList[ListIndex] =3D AllocateCopyPool ((St= rSize > + 1), &SupportedLanguages[LangIndex]); > - SupportedSchema->SchemaList[ListIndex][StrSize] =3D '\0'; > - ++ListIndex; > - } > - > - LangIndex =3D Index + 1; > - } > - > - if (SupportedLanguages[Index] =3D=3D '\0') { > - break; > - } > - > - ++Index; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Search and find statement private instance by given regular expression > patthern > - which describes the Configure Language. > - > - @param[in] RegularExpressionProtocol Regular express protocol. > - @param[in] FormsetList Form-set list to search. > - @param[in] Schema Schema to be matched. > - @param[in] Pattern Regular expression pattern. > - @param[out] StatementList Statement list that match abov= e > pattern. > - > - @retval EFI_SUCCESS Statement list is returned. > - @retval EFI_INVALID_PARAMETER Input parameter is NULL. > - @retval EFI_NOT_READY Regular express protocol is NULL. > - @retval EFI_NOT_FOUND No statement is found. > - @retval EFI_OUT_OF_RESOURCES System is out of memory. > - > -**/ > -EFI_STATUS > -GetStatementPrivateByConfigureLangRegex ( > - IN EFI_REGULAR_EXPRESSION_PROTOCOL > *RegularExpressionProtocol, > - IN LIST_ENTRY *FormsetList, > - IN CHAR8 *Schema, > - IN EFI_STRING Pattern, > - OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > - ) > -{ > - LIST_ENTRY *HiiFormsetLink; > - LIST_ENTRY *HiiFormsetNextLink; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > - LIST_ENTRY *HiiFormLink; > - LIST_ENTRY *HiiNextFormLink; > - REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > - LIST_ENTRY *HiiStatementLink; > - LIST_ENTRY *HiiNextStatementLink; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > - EFI_STRING TmpString; > - UINTN CaptureCount; > - BOOLEAN IsMatch; > - EFI_STATUS Status; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef; > - > - if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || > IS_EMPTY_STRING (Pattern) || StatementList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (RegularExpressionProtocol =3D=3D NULL) { > - return EFI_NOT_READY; > - } > - > - StatementList->Count =3D 0; > - InitializeListHead (&StatementList->StatementList); > - > - if (IsListEmpty (FormsetList)) { > - return EFI_NOT_FOUND; > - } > - > - HiiFormsetLink =3D GetFirstNode (FormsetList); > - while (!IsNull (FormsetList, HiiFormsetLink)) { > - HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > - HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > - > - // > - // Performance check. > - // If there is no desired Redfish schema found, skip this formset. > - // > - if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, > Schema)) { > - HiiFormsetLink =3D HiiFormsetNextLink; > - continue; > - } > - > - HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList); > - while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) { > - HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, > HiiFormLink); > - HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > - > - HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList); > - while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink))= { > - HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->Statement= List, > HiiStatementLink); > - HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > - > - if (HiiStatementPrivate->Description !=3D 0) { > - TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandl= e, > Schema, HiiStatementPrivate->Description); > - if (TmpString !=3D NULL) { > - Status =3D RegularExpressionProtocol->MatchString ( > - RegularExpressionProto= col, > - TmpString, > - Pattern, > - &gEfiRegexSyntaxTypePe= rlGuid, > - &IsMatch, > - NULL, > - &CaptureCount > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n"= , > __FUNCTION__, Pattern, Status)); > - ASSERT (FALSE); > - return Status; > - } > - > - // > - // Found > - // > - if (IsMatch) { > - StatementRef =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF)); > - if (StatementRef =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - StatementRef->Statement =3D HiiStatementPrivate; > - InsertTailList (&StatementList->StatementList, &StatementR= ef->Link); > - ++StatementList->Count; > - } > - > - FreePool (TmpString); > - } > - } > - > - HiiStatementLink =3D HiiNextStatementLink; > - } > - > - HiiFormLink =3D HiiNextFormLink; > - } > - > - HiiFormsetLink =3D HiiFormsetNextLink; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Get statement private instance by the given configure language. > - > - @param[in] FormsetList Form-set list to search. > - @param[in] Schema Schema to be matched. > - @param[in] ConfigureLang Configure language. > - > - @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to > statement private instance. > - > -**/ > -REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * > -GetStatementPrivateByConfigureLang ( > - IN LIST_ENTRY *FormsetList, > - IN CHAR8 *Schema, > - IN EFI_STRING ConfigureLang > - ) > -{ > - LIST_ENTRY *HiiFormsetLink; > - LIST_ENTRY *HiiFormsetNextLink; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > - LIST_ENTRY *HiiFormLink; > - LIST_ENTRY *HiiNextFormLink; > - REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > - LIST_ENTRY *HiiStatementLink; > - LIST_ENTRY *HiiNextStatementLink; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > - EFI_STRING TmpString; > - > - if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || > IS_EMPTY_STRING (ConfigureLang)) { > - return NULL; > - } > - > - if (IsListEmpty (FormsetList)) { > - return NULL; > - } > - > - HiiFormsetLink =3D GetFirstNode (FormsetList); > - while (!IsNull (FormsetList, HiiFormsetLink)) { > - HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > - HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > - > - // > - // Performance check. > - // If there is no desired Redfish schema found, skip this formset. > - // > - if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, > Schema)) { > - HiiFormsetLink =3D HiiFormsetNextLink; > - continue; > - } > - > - HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList); > - while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) { > - HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, > HiiFormLink); > - HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > - > - HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList); > - while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink))= { > - HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->Statement= List, > HiiStatementLink); > - HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > - > - DEBUG_CODE ( > - STATIC UINTN Index =3D 0; > - DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%= x > formset: %g\n", __FUNCTION__, ++Index, ConfigureLang, > HiiStatementPrivate->QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate- > >Guid)); > - ); > - > - if (HiiStatementPrivate->Description !=3D 0) { > - TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandl= e, > Schema, HiiStatementPrivate->Description); > - if (TmpString !=3D NULL) { > - if (StrCmp (TmpString, ConfigureLang) =3D=3D 0) { > - FreePool (TmpString); > - return HiiStatementPrivate; > - } > - > - FreePool (TmpString); > - } > - } > - > - HiiStatementLink =3D HiiNextStatementLink; > - } > - > - HiiFormLink =3D HiiNextFormLink; > - } > - > - HiiFormsetLink =3D HiiFormsetNextLink; > - } > - > - return NULL; > -} > - > -/** > - Get form-set private instance by the given HII handle. > - > - @param[in] HiiHandle HII handle instance. > - @param[in] FormsetList Form-set list to search. > - > - @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to > form-set private instance. > - > -**/ > -REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * > -GetFormsetPrivateByHiiHandle ( > - IN EFI_HII_HANDLE HiiHandle, > - IN LIST_ENTRY *FormsetList > - ) > -{ > - LIST_ENTRY *HiiFormsetLink; > - LIST_ENTRY *HiiFormsetNextLink; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > - > - if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) { > - return NULL; > - } > - > - if (IsListEmpty (FormsetList)) { > - return NULL; > - } > - > - HiiFormsetLink =3D GetFirstNode (FormsetList); > - while (!IsNull (FormsetList, HiiFormsetLink)) { > - HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > - HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > - > - if (HiiFormsetPrivate->HiiHandle =3D=3D HiiHandle) { > - return HiiFormsetPrivate; > - } > - > - HiiFormsetLink =3D HiiFormsetNextLink; > - } > - > - return NULL; > -} > - > -/** > - Release formset and all the forms and statements that belong to this > formset. > - > - @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE > - > - @retval EFI_STATUS > - > -**/ > -EFI_STATUS > -ReleaseFormset ( > - IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate > - ) > -{ > - LIST_ENTRY *HiiFormLink; > - LIST_ENTRY *HiiNextFormLink; > - REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > - LIST_ENTRY *HiiStatementLink; > - LIST_ENTRY *HiiNextStatementLink; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > - UINTN Index; > - > - if (FormsetPrivate =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList); > - while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) { > - HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > - HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, > HiiFormLink); > - > - HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList); > - while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) { > - HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > - HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi= st, > HiiStatementLink); > - > - // > - // HiiStatementPrivate->HiiStatement will be released in > DestroyFormSet(). > - // > - > - if (HiiStatementPrivate->DesStringCache !=3D NULL) { > - FreePool (HiiStatementPrivate->DesStringCache); > - HiiStatementPrivate->DesStringCache =3D NULL; > - } > - > - RemoveEntryList (&HiiStatementPrivate->Link); > - FreePool (HiiStatementPrivate); > - HiiStatementLink =3D HiiNextStatementLink; > - } > - > - // > - // HiiStatementPrivate->HiiForm will be released in DestroyFormSet()= . > - // > - > - RemoveEntryList (&HiiFormPrivate->Link); > - FreePool (HiiFormPrivate); > - HiiFormLink =3D HiiNextFormLink; > - } > - > - if (FormsetPrivate->HiiFormSet !=3D NULL) { > - DestroyFormSet (FormsetPrivate->HiiFormSet); > - FormsetPrivate->HiiFormSet =3D NULL; > - } > - > - FreePool (FormsetPrivate->DevicePathStr); > - > - // > - // Release schema list > - // > - if (FormsetPrivate->SupportedSchema.SchemaList !=3D NULL) { > - for (Index =3D 0; Index < FormsetPrivate->SupportedSchema.Count; > Index++) { > - FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]); > - } > - > - FreePool (FormsetPrivate->SupportedSchema.SchemaList); > - FormsetPrivate->SupportedSchema.SchemaList =3D NULL; > - FormsetPrivate->SupportedSchema.Count =3D 0; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Create new form-set instance. > - > - @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to > newly created form-set private instance. > - > -**/ > -REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * > -NewFormsetPrivate ( > - VOID > - ) > -{ > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate; > - > - NewFormsetPrivate =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE)); > - if (NewFormsetPrivate =3D=3D NULL) { > - return NULL; > - } > - > - // > - // Initial newly created formset private data. > - // > - InitializeListHead (&NewFormsetPrivate->HiiFormList); > - > - return NewFormsetPrivate; > -} > - > -/** > - Load the HII formset from the given HII handle. > - > - @param[in] HiiHandle Target HII handle to load. > - @param[out] FormsetPrivate The formset private data. > - > - @retval EFI_STATUS > - > -**/ > -EFI_STATUS > -LoadFormset ( > - IN EFI_HII_HANDLE HiiHandle, > - OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate > - ) > -{ > - EFI_STATUS Status; > - HII_FORMSET *HiiFormSet; > - HII_FORM *HiiForm; > - LIST_ENTRY *HiiFormLink; > - REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > - HII_STATEMENT *HiiStatement; > - LIST_ENTRY *HiiStatementLink; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > - EFI_GUID ZeroGuid; > - > - if (HiiHandle =3D=3D NULL || FormsetPrivate =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - > - HiiFormSet =3D AllocateZeroPool (sizeof (HII_FORMSET)); > - if (HiiFormSet =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Find HII formset by the given HII handle. > - // > - ZeroMem (&ZeroGuid, sizeof (ZeroGuid)); > - Status =3D CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSe= t); > - if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) { > - Status =3D EFI_NOT_FOUND; > - goto ErrorExit; > - } > - > - // > - // Initialize formset > - // > - InitializeFormSet (HiiFormSet); > - > - // > - // Initialize formset private data. > - // > - FormsetPrivate->HiiFormSet =3D HiiFormSet; > - FormsetPrivate->HiiHandle =3D HiiHandle; > - CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid); > - FormsetPrivate->DevicePathStr =3D ConvertDevicePathToText (HiiFormSet- > >DevicePath, FALSE, FALSE); > - Status =3D GetSupportedSchema (FormsetPrivate->HiiHandle, > &FormsetPrivate->SupportedSchema); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found: > %r\n", __FUNCTION__, FormsetPrivate->HiiHandle, Status)); > - } > - > - HiiFormLink =3D GetFirstNode (&HiiFormSet->FormListHead); > - while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) { > - HiiForm =3D HII_FORM_FROM_LINK (HiiFormLink); > - > - HiiFormPrivate =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_FORM_PRIVATE)); > - if (HiiFormPrivate =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto ErrorExit; > - } > - > - // > - // Initialize form private data. > - // > - HiiFormPrivate->HiiForm =3D HiiForm; > - HiiFormPrivate->Id =3D HiiForm->FormId; > - HiiFormPrivate->Title =3D HiiForm->FormTitle; > - HiiFormPrivate->ParentFormset =3D FormsetPrivate; > - InitializeListHead (&HiiFormPrivate->StatementList); > - > - HiiStatementLink =3D GetFirstNode (&HiiForm->StatementListHead); > - while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) { > - HiiStatement =3D HII_STATEMENT_FROM_LINK (HiiStatementLink); > - > - HiiStatementPrivate =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE)); > - if (HiiStatementPrivate =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto ErrorExit; > - } > - // > - // Initialize statement private data. > - // > - HiiStatementPrivate->HiiStatement =3D HiiStatement; > - HiiStatementPrivate->QuestionId =3D HiiStatement->QuestionId; > - HiiStatementPrivate->Description =3D HiiStatement->Prompt; > - HiiStatementPrivate->ParentForm =3D HiiFormPrivate; > - > - // > - // Attach to statement list. > - // > - InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPriva= te- > >Link); > - HiiStatementLink =3D GetNextNode (&HiiForm->StatementListHead, > HiiStatementLink); > - } > - // > - // Attach to form list. > - // > - InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link)= ; > - HiiFormLink =3D GetNextNode (&HiiFormSet->FormListHead, HiiFormLink)= ; > - } > - > - return EFI_SUCCESS; > - > -ErrorExit: > - > - // > - // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate ye= t. > - // > - if (HiiFormSet !=3D NULL && FormsetPrivate->HiiFormSet !=3D HiiFormSet= ) { > - DestroyFormSet (HiiFormSet); > - } > - > - // > - // Release resource when error happens. > - // > - ReleaseFormset (FormsetPrivate); > - > - return Status; > -} > - > -/** > - Release formset list and all the forms that belong to this formset. > - > - @param[in] FormsetList Pointer to formst list that needs to be > - released. > - > - @retval EFI_STATUS > - > -**/ > -EFI_STATUS > -LoadFormsetList ( > - IN EFI_HII_HANDLE *HiiHandle, > - OUT LIST_ENTRY *FormsetList > - ) > -{ > - EFI_STATUS Status; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate; > - > - if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - FormsetPrivate =3D GetFormsetPrivateByHiiHandle (HiiHandle, FormsetLis= t); > - if (FormsetPrivate !=3D NULL) { > - return EFI_ALREADY_STARTED; > - } > - > - FormsetPrivate =3D NewFormsetPrivate (); > - if (FormsetPrivate =3D=3D NULL) { > - DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__)); > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Load formset on the given HII handle. > - // > - Status =3D LoadFormset (HiiHandle, FormsetPrivate); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n", > __FUNCTION__, Status)); > - FreePool (FormsetPrivate); > - return Status; > - } > - > - // > - // Attach to cache list. > - // > - InsertTailList (FormsetList, &FormsetPrivate->Link); > - > - DEBUG_CODE ( > - DumpFormsetList (FormsetList); > - ); > - > - return EFI_SUCCESS; > -} > - > -/** > - Release formset list and all the forms that belong to this formset. > - > - @param[in] FormsetList Pointer to formst list that needs to be > - released. > - > - @retval EFI_STATUS > - > -**/ > -EFI_STATUS > -ReleaseFormsetList ( > - IN LIST_ENTRY *FormsetList > - ) > -{ > - LIST_ENTRY *HiiFormsetLink; > - LIST_ENTRY *HiiFormsetNextLink; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > - > - if (FormsetList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (IsListEmpty (FormsetList)) { > - return EFI_SUCCESS; > - } > - > - HiiFormsetLink =3D GetFirstNode (FormsetList); > - while (!IsNull (FormsetList, HiiFormsetLink)) { > - HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > - HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > - > - // > - // Detach from list. > - // > - RemoveEntryList (&HiiFormsetPrivate->Link); > - ReleaseFormset (HiiFormsetPrivate); > - FreePool (HiiFormsetPrivate); > - HiiFormsetLink =3D HiiFormsetNextLink; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Get all pending list. > - > - @param[in] HiiHandle HII handle instance. > - @param[in] PendingList Pending list to keep pending data. > - > - @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to > pending list data. > - > -**/ > -REDFISH_PLATFORM_CONFIG_PENDING_LIST * > -GetPendingList ( > - IN EFI_HII_HANDLE *HiiHandle, > - IN LIST_ENTRY *PendingList > - ) > -{ > - LIST_ENTRY *PendingListLink; > - REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target; > - > - if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) { > - return NULL; > - } > - > - if (IsListEmpty (PendingList)) { > - return NULL; > - } > - > - PendingListLink =3D GetFirstNode (PendingList); > - while (!IsNull (PendingList, PendingListLink)) { > - Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK > (PendingListLink); > - > - if (Target->HiiHandle =3D=3D HiiHandle) { > - return Target; > - } > - > - PendingListLink =3D GetNextNode (PendingList, PendingListLink); > - } > - > - return NULL; > -} > - > -/** > - When HII database is updated. Keep updated HII handle into pending lis= t so > - we can process them later. > - > - @param[in] HiiHandle HII handle instance. > - @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > - > - @retval EFI_SUCCESS HII handle is saved in pending list. > - @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > - @retval EFI_OUT_OF_RESOURCES System is out of memory. > - > -**/ > -EFI_STATUS > -NotifyFormsetUpdate ( > - IN EFI_HII_HANDLE *HiiHandle, > - IN LIST_ENTRY *PendingList > - ) > -{ > - REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList; > - > - if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Check and see if this HII handle is processed already. > - // > - TargetPendingList =3D GetPendingList (HiiHandle, PendingList); > - if (TargetPendingList !=3D NULL) { > - TargetPendingList->IsDeleted =3D FALSE; > - DEBUG_CODE ( > - DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n", > __FUNCTION__, HiiHandle)); > - ); > - return EFI_SUCCESS; > - } > - > - TargetPendingList=3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_PENDING_LIST)); > - if (TargetPendingList =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - TargetPendingList->HiiHandle =3D HiiHandle; > - TargetPendingList->IsDeleted =3D FALSE; > - > - InsertTailList (PendingList, &TargetPendingList->Link); > - > - DEBUG_CODE ( > - DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n", > __FUNCTION__, HiiHandle)); > - ); > - > - return EFI_SUCCESS; > -} > - > -/** > - When HII database is updated and form-set is deleted. Keep deleted HII > handle into pending list so > - we can process them later. > - > - @param[in] HiiHandle HII handle instance. > - @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > - > - @retval EFI_SUCCESS HII handle is saved in pending list. > - @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > - @retval EFI_OUT_OF_RESOURCES System is out of memory. > - > -**/ > -EFI_STATUS > -NotifyFormsetDeleted ( > - IN EFI_HII_HANDLE *HiiHandle, > - IN LIST_ENTRY *PendingList > - ) > -{ > - REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList; > - > - if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Check and see if this HII handle is processed already. > - // > - TargetPendingList =3D GetPendingList (HiiHandle, PendingList); > - if (TargetPendingList !=3D NULL) { > - TargetPendingList->IsDeleted =3D TRUE; > - DEBUG_CODE ( > - DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n= ", > __FUNCTION__, HiiHandle)); > - ); > - return EFI_SUCCESS; > - } > - > - TargetPendingList=3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_PENDING_LIST)); > - if (TargetPendingList =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - TargetPendingList->HiiHandle =3D HiiHandle; > - TargetPendingList->IsDeleted =3D TRUE; > - > - InsertTailList (PendingList, &TargetPendingList->Link); > - > - DEBUG_CODE ( > - DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n", > __FUNCTION__, HiiHandle)); > - ); > - > - return EFI_SUCCESS; > -} > - > -/** > - There are HII database update and we need to process them accordingly = so > that we > - won't use stale data. This function will parse updated HII handle agai= n in > order > - to get updated data-set. > - > - @param[in] FormsetList List to keep HII form-set. > - @param[in] PendingList List to keep HII handle that is updated. > - > - @retval EFI_SUCCESS HII handle is saved in pending list. > - @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is > NULL. > - > -**/ > -EFI_STATUS > -ProcessPendingList ( > - IN LIST_ENTRY *FormsetList, > - IN LIST_ENTRY *PendingList > - ) > -{ > - LIST_ENTRY *PendingListLink; > - LIST_ENTRY *PendingListNextLink; > - REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target; > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate; > - EFI_STATUS Status; > - > - > - if (FormsetList =3D=3D NULL || PendingList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (IsListEmpty (PendingList)) { > - return EFI_SUCCESS; > - } > - > - PendingListLink =3D GetFirstNode (PendingList); > - while (!IsNull (PendingList, PendingListLink)) { > - PendingListNextLink =3D GetNextNode (PendingList, PendingListLink); > - Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK > (PendingListLink); > - > - if (Target->IsDeleted) { > - // > - // The HII resource on this HII handle is removed. Release the for= mset. > - // > - FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle= , > FormsetList); > - if (FormsetPrivate !=3D NULL) { > - DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver > release HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid)); > - RemoveEntryList (&FormsetPrivate->Link); > - ReleaseFormset (FormsetPrivate); > - FreePool (FormsetPrivate); > - } else { > - DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was removed > already\n", __FUNCTION__, Target->HiiHandle)); > - } > - } else { > - // > - // The HII resource on this HII handle is updated/removed. > - // > - FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle= , > FormsetList); > - if (FormsetPrivate !=3D NULL) { > - // > - // HII formset already exist, release it and query again. > - // > - DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current > formset\n", __FUNCTION__, &FormsetPrivate->Guid)); > - RemoveEntryList (&FormsetPrivate->Link); > - ReleaseFormset (FormsetPrivate); > - FreePool (FormsetPrivate); > - } > - > - Status =3D LoadFormsetList (Target->HiiHandle, FormsetList); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x fai= led: > %r\n", __FUNCTION__, Target->HiiHandle, Status)); > - } > - } > - > - // > - // Detach it from list first. > - // > - RemoveEntryList (&Target->Link); > - FreePool (Target); > - > - PendingListLink =3D PendingListNextLink; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Release all resource in statement list. > - > - @param[in] StatementList Statement list to be released. > - > - @retval EFI_SUCCESS All resource are released. > - @retval EFI_INVALID_PARAMETER StatementList is NULL. > - > -**/ > -EFI_STATUS > -ReleaseStatementList ( > - IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > - ) > -{ > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef; > - LIST_ENTRY *NextLink; > - > - if (StatementList =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (IsListEmpty (&StatementList->StatementList)) { > - return EFI_SUCCESS; > - } > - > - NextLink =3D GetFirstNode (&StatementList->StatementList); > - while (!IsNull (&StatementList->StatementList, NextLink)) { > - StatementRef =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink); > - NextLink =3D GetNextNode (&StatementList->StatementList, NextLink); > - > - RemoveEntryList (&StatementRef->Link); > - FreePool (StatementRef); > - } > - > - return EFI_SUCCESS; > -} > +/** @file > + > + The implementation of EDKII Redfidh Platform Config Protocol. > + > + (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > +#include "RedfishPlatformConfigDxe.h" > +#include "RedfishPlatformConfigImpl.h" > + > +extern REDFISH_PLATFORM_CONFIG_PRIVATE > *mRedfishPlatformConfigPrivate; > + > +/** > + Debug dump HII string > + > + @param[in] HiiHandle HII handle instance > + @param[in] StringId HII string to dump > + > + @retval EFI_SUCCESS Dump HII string successfully > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +DumpHiiString ( > + IN EFI_HII_HANDLE HiiHandle, > + IN EFI_STRING_ID StringId > + ) > +{ > + EFI_STRING String; > + > + if (HiiHandle =3D=3D NULL || StringId =3D=3D 0) { > + DEBUG ((DEBUG_INFO, "???")); > + return EFI_INVALID_PARAMETER; > + } > + > + String =3D HiiGetString (HiiHandle, StringId, NULL); > + if (String =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + DEBUG ((DEBUG_INFO, "%s", String)); > + FreePool (String); > + > + return EFI_SUCCESS; > +} > + > +/** > + Debug dump HII form-set data > + > + @param[in] FormsetPrivate HII form-set private instance. > + > + @retval EFI_SUCCESS Dump form-set successfully > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +DumpFormset ( > + IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate > + ) > +{ > + LIST_ENTRY *HiiFormLink; > + LIST_ENTRY *HiiNextFormLink; > + REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > + LIST_ENTRY *HiiStatementLink; > + LIST_ENTRY *HiiNextStatementLink; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > + UINTN Index; > + > + if (FormsetPrivate =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Index =3D 0; > + HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList); > + while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) { > + HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > + HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, > HiiFormLink); > + > + DEBUG ((DEBUG_INFO, " [%d] form: %d title: ", ++Index, HiiFormPriva= te- > >Id)); > + DumpHiiString (FormsetPrivate->HiiHandle, HiiFormPrivate->Title); > + DEBUG ((DEBUG_INFO, "\n")); > + > + HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList); > + while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) { > + HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > + HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi= st, > HiiStatementLink); > + > + DEBUG ((DEBUG_INFO, " QID: 0x%x Prompt: ", HiiStatementPrivate- > >QuestionId)); > + DumpHiiString (FormsetPrivate->HiiHandle, HiiStatementPrivate- > >Description); > + DEBUG ((DEBUG_INFO, "\n")); > + > + HiiStatementLink =3D HiiNextStatementLink; > + } > + > + HiiFormLink =3D HiiNextFormLink; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Debug dump HII form-set list > + > + @param[in] FormsetList Form-set list instance > + > + @retval EFI_SUCCESS Dump list successfully > + @retval Others Errors occur > + > +**/ > +EFI_STATUS > +DumpFormsetList ( > + IN LIST_ENTRY *FormsetList > + ) > +{ > + LIST_ENTRY *HiiFormsetLink; > + LIST_ENTRY *HiiFormsetNextLink; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > + UINTN Index; > + > + if (FormsetList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (FormsetList)) { > + DEBUG ((DEBUG_INFO, "%a, Empty formset list\n", __FUNCTION__)); > + return EFI_SUCCESS; > + } > + > + Index =3D 0; > + HiiFormsetLink =3D GetFirstNode (FormsetList); > + while (!IsNull (FormsetList, HiiFormsetLink)) { > + HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > + HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > + > + DEBUG ((DEBUG_INFO, "[%d] HII Handle: 0x%x formset: %g at %s\n", > ++Index, HiiFormsetPrivate->HiiHandle, &HiiFormsetPrivate->Guid, > HiiFormsetPrivate->DevicePathStr)); > + DumpFormset (HiiFormsetPrivate); > + > + HiiFormsetLink =3D HiiFormsetNextLink; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Retrieves a string from a string package in a English language. The > + returned string is allocated using AllocatePool(). The caller is resp= onsible > + for freeing the allocated buffer using FreePool(). > + > + If HiiHandle is NULL, then ASSERT(). > + If StringId is 0, then ASSET. > + > + @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance. > + @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > + @param[in] StringId The identifier of the string to retrieve= d from the > string > + package associated with HiiHandle. > + > + @retval NULL The string specified by StringId is not present in the = string > package. > + @retval Other The string was returned. > + > +**/ > +EFI_STRING > +HiiGetRedfishString ( > + IN EFI_HII_HANDLE HiiHandle, > + IN CHAR8 *Language, > + IN EFI_STRING_ID StringId > + ) > +{ > + EFI_STATUS Status; > + UINTN StringSize; > + CHAR16 TempString; > + EFI_STRING String; > + > + if (mRedfishPlatformConfigPrivate->HiiString =3D=3D NULL || HiiHandle = =3D=3D > NULL || StringId =3D=3D 0 || IS_EMPTY_STRING (Language)) { > + ASSERT (FALSE); > + return NULL; > + } > + > + // > + // Retrieve the size of the string in the string package for the BestL= anguage > + // > + StringSize =3D 0; > + Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString ( > + mRedfishPlatformConfigPriva= te->HiiString, > + Language, > + HiiHandle, > + StringId, > + &TempString, > + &StringSize, > + NULL > + ); > + // > + // If GetString() returns EFI_SUCCESS for a zero size, > + // then there are no supported languages registered for HiiHandle. If > GetString() > + // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is > not present > + // in the HII Database > + // > + if (Status !=3D EFI_BUFFER_TOO_SMALL) { > + return NULL; > + } > + > + // > + // Allocate a buffer for the return string > + // > + String =3D AllocateZeroPool (StringSize); > + if (String =3D=3D NULL) { > + return NULL; > + } > + > + // > + // Retrieve the string from the string package > + // > + Status =3D mRedfishPlatformConfigPrivate->HiiString->GetString ( > + mRedfishPlatformConfigPriva= te->HiiString, > + Language, > + HiiHandle, > + StringId, > + String, > + &StringSize, > + NULL > + ); > + if (EFI_ERROR (Status)) { > + // > + // Free the buffer and return NULL if the supported languages can no= t be > retrieved. > + // > + FreePool (String); > + String =3D NULL; > + } > + > + // > + // Return the Null-terminated Unicode string > + // > + return String; > +} > + > +/** > + Retrieves a string from a string package in a English language. The > + returned string is allocated using AllocatePool(). The caller is resp= onsible > + for freeing the allocated buffer using FreePool(). > + > + If HiiHandle is NULL, then ASSERT(). > + If StringId is 0, then ASSET. > + > + @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance. > + @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > + @param[in] StringId The identifier of the string to retrieve= d from the The function parameters are not correct. > string > + package associated with HiiHandle. > + > + @retval NULL The string specified by StringId is not present in the = string > package. > + @retval Other The string was returned. > + > +**/ > +CHAR8 * > +HiiGetRedfishAsciiString ( > + IN EFI_HII_HANDLE HiiHandle, > + IN CHAR8 *Language, > + IN EFI_STRING_ID StringId > + ) > +{ > + EFI_STRING HiiString; > + UINTN StringSize; > + CHAR8 *AsciiString; > + > + HiiString =3D HiiGetRedfishString (HiiHandle, Language, StringId); > + if (HiiString =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, Can not find string ID: 0x%x with %a\n", > __FUNCTION__, StringId, Language)); > + return NULL; > + } > + > + StringSize =3D (StrLen (HiiString) + 1) * sizeof (CHAR8); > + AsciiString =3D AllocatePool (StringSize); > + if (AsciiString =3D=3D NULL) { > + return NULL; > + } > + > + UnicodeStrToAsciiStrS (HiiString, AsciiString, StringSize); > + > + FreePool (HiiString); > + return AsciiString; > +} > + > +/** > + Get string from HII database in English language. > + > + @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > + @param[in] StringId The identifier of the string to retrieve= d from the > string > + package associated with HiiHandle. > + > + @retval NULL The string specified by StringId is not present in the = string > package. > + @retval Other The string was returned. > + > +**/ > +EFI_STRING > +HiiGetEnglishString ( > + IN EFI_HII_HANDLE HiiHandle, > + IN EFI_STRING_ID StringId > + ) > +{ > + return HiiGetRedfishString (HiiHandle, ENGLISH_LANGUAGE_CODE, > StringId); > +} > + > +/** > + Check and see if this is supported schema or not. > + > + @param[in] SupportedSchema The list of supported schema. > + @param[in] Schema Schema string to be checked. > + > + @retval BOOLEAN TRUE if this is supported schema. FALSE > otherwise. > + > +**/ > +BOOLEAN > +CheckSupportedSchema ( > + IN REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema, > + IN CHAR8 *Schema > + ) > +{ > + UINTN Index; > + > + if (SupportedSchema =3D=3D NULL || IS_EMPTY_STRING (Schema)) { > + return FALSE; > + } > + > + if (SupportedSchema->Count =3D=3D 0) { > + return FALSE; > + } > + > + for (Index =3D 0; Index < SupportedSchema->Count; Index++) { > + if (AsciiStrCmp (SupportedSchema->SchemaList[Index], Schema) =3D=3D = 0) { > + return TRUE; > + } > + } > + > + return FALSE; > +} > + > +/** > + Get the list of supported schema from the given HII handle. > + > + @param[in] HiiHandle HII handle instance. > + @param[out] SupportedSchema Supported schema on this HII handle. > + > + @retval EFI_SUCCESS Schema list is returned. > + @retval EFI_INVALID_PARAMETER HiiHandle is NULL or SupportedSchema > is NULL. > + @retval EFI_NOT_FOUND No supported schema found. > + @retval EFI_OUT_OF_RESOURCES System is out of memory. > + > +**/ > +EFI_STATUS > +GetSupportedSchema ( > + IN EFI_HII_HANDLE HiiHandle, > + OUT REDFISH_PLATFORM_CONFIG_SCHEMA *SupportedSchema > + ) > +{ > + CHAR8 *SupportedLanguages; > + UINTN Index; > + UINTN LangIndex; > + UINTN Count; > + UINTN StrSize; > + UINTN ListIndex; > + > + if (HiiHandle =3D=3D NULL || SupportedSchema =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + SupportedSchema->Count =3D 0; > + > + SupportedLanguages =3D HiiGetSupportedLanguages (HiiHandle); > + if (SupportedLanguages =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + Index =3D 0; > + LangIndex =3D 0; > + Count =3D 0; > + while (TRUE) { > + if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index= ] =3D=3D > '\0') { > + if (AsciiStrnCmp (&SupportedLanguages[LangIndex], > X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) { > + ++Count; > + } > + LangIndex =3D Index + 1; > + } > + > + if (SupportedLanguages[Index] =3D=3D '\0') { > + break; > + } > + > + ++Index; > + } > + > + if (Count =3D=3D 0) { > + return EFI_NOT_FOUND; > + } > + > + SupportedSchema->Count =3D Count; > + SupportedSchema->SchemaList =3D AllocatePool (sizeof (CHAR8 *) * Count= ); > + if (SupportedSchema->SchemaList =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Index =3D 0; > + LangIndex =3D 0; > + ListIndex =3D 0; > + while (TRUE) { > + > + if (SupportedLanguages[Index] =3D=3D ';' || SupportedLanguages[Index= ] =3D=3D > '\0') { > + if (AsciiStrnCmp (&SupportedLanguages[LangIndex], > X_UEFI_SCHEMA_PREFIX, AsciiStrLen (X_UEFI_SCHEMA_PREFIX)) =3D=3D 0) { > + StrSize =3D Index - LangIndex; > + SupportedSchema->SchemaList[ListIndex] =3D AllocateCopyPool ((St= rSize > + 1), &SupportedLanguages[LangIndex]); > + SupportedSchema->SchemaList[ListIndex][StrSize] =3D '\0'; > + ++ListIndex; > + } > + > + LangIndex =3D Index + 1; > + } > + > + if (SupportedLanguages[Index] =3D=3D '\0') { > + break; > + } > + > + ++Index; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Search and find statement private instance by given regular expression > patthern > + which describes the Configure Language. > + > + @param[in] RegularExpressionProtocol Regular express protocol. > + @param[in] FormsetList Form-set list to search. > + @param[in] Schema Schema to be matched. > + @param[in] Pattern Regular expression pattern. > + @param[out] StatementList Statement list that match abov= e > pattern. > + > + @retval EFI_SUCCESS Statement list is returned. > + @retval EFI_INVALID_PARAMETER Input parameter is NULL. > + @retval EFI_NOT_READY Regular express protocol is NULL. > + @retval EFI_NOT_FOUND No statement is found. > + @retval EFI_OUT_OF_RESOURCES System is out of memory. > + > +**/ > +EFI_STATUS > +GetStatementPrivateByConfigureLangRegex ( > + IN EFI_REGULAR_EXPRESSION_PROTOCOL > *RegularExpressionProtocol, > + IN LIST_ENTRY *FormsetList, > + IN CHAR8 *Schema, > + IN EFI_STRING Pattern, > + OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > + ) > +{ > + LIST_ENTRY *HiiFormsetLink; > + LIST_ENTRY *HiiFormsetNextLink; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > + LIST_ENTRY *HiiFormLink; > + LIST_ENTRY *HiiNextFormLink; > + REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > + LIST_ENTRY *HiiStatementLink; > + LIST_ENTRY *HiiNextStatementLink; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > + EFI_STRING TmpString; > + UINTN CaptureCount; > + BOOLEAN IsMatch; > + EFI_STATUS Status; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef; > + > + if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || > IS_EMPTY_STRING (Pattern) || StatementList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (RegularExpressionProtocol =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + > + StatementList->Count =3D 0; > + InitializeListHead (&StatementList->StatementList); > + > + if (IsListEmpty (FormsetList)) { > + return EFI_NOT_FOUND; > + } > + > + HiiFormsetLink =3D GetFirstNode (FormsetList); > + while (!IsNull (FormsetList, HiiFormsetLink)) { > + HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > + HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > + > + // > + // Performance check. > + // If there is no desired Redfish schema found, skip this formset. > + // > + if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, > Schema)) { > + HiiFormsetLink =3D HiiFormsetNextLink; > + continue; > + } > + > + HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList); > + while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) { > + HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, > HiiFormLink); > + HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > + > + HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList); > + while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink))= { > + HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate- > >StatementList, HiiStatementLink); > + HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > + > + if (HiiStatementPrivate->Description !=3D 0) { > + TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandl= e, > Schema, HiiStatementPrivate->Description); > + if (TmpString !=3D NULL) { > + Status =3D RegularExpressionProtocol->MatchString ( > + RegularExpressionProto= col, > + TmpString, > + Pattern, > + &gEfiRegexSyntaxTypePe= rlGuid, > + &IsMatch, > + NULL, > + &CaptureCount > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, MatchString \"%s\" failed: %r\n"= , > __FUNCTION__, Pattern, Status)); > + ASSERT (FALSE); > + return Status; > + } > + > + // > + // Found > + // > + if (IsMatch) { > + StatementRef =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF)); > + if (StatementRef =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + StatementRef->Statement =3D HiiStatementPrivate; > + InsertTailList (&StatementList->StatementList, &StatementR= ef- > >Link); > + ++StatementList->Count; > + } > + > + FreePool (TmpString); > + } > + } > + > + HiiStatementLink =3D HiiNextStatementLink; > + } > + > + HiiFormLink =3D HiiNextFormLink; > + } > + > + HiiFormsetLink =3D HiiFormsetNextLink; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Get statement private instance by the given configure language. > + > + @param[in] FormsetList Form-set list to search. > + @param[in] Schema Schema to be matched. > + @param[in] ConfigureLang Configure language. > + > + @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer > to statement private instance. > + > +**/ > +REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * > +GetStatementPrivateByConfigureLang ( > + IN LIST_ENTRY *FormsetList, > + IN CHAR8 *Schema, > + IN EFI_STRING ConfigureLang > + ) > +{ > + LIST_ENTRY *HiiFormsetLink; > + LIST_ENTRY *HiiFormsetNextLink; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > + LIST_ENTRY *HiiFormLink; > + LIST_ENTRY *HiiNextFormLink; > + REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > + LIST_ENTRY *HiiStatementLink; > + LIST_ENTRY *HiiNextStatementLink; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > + EFI_STRING TmpString; > + > + if (FormsetList =3D=3D NULL || IS_EMPTY_STRING (Schema) || > IS_EMPTY_STRING (ConfigureLang)) { > + return NULL; > + } > + > + if (IsListEmpty (FormsetList)) { > + return NULL; > + } > + > + HiiFormsetLink =3D GetFirstNode (FormsetList); > + while (!IsNull (FormsetList, HiiFormsetLink)) { > + HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > + HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > + > + // > + // Performance check. > + // If there is no desired Redfish schema found, skip this formset. > + // > + if (!CheckSupportedSchema (&HiiFormsetPrivate->SupportedSchema, > Schema)) { > + HiiFormsetLink =3D HiiFormsetNextLink; > + continue; > + } > + > + HiiFormLink =3D GetFirstNode (&HiiFormsetPrivate->HiiFormList); > + while (!IsNull (&HiiFormsetPrivate->HiiFormList, HiiFormLink)) { > + HiiNextFormLink =3D GetNextNode (&HiiFormsetPrivate->HiiFormList, > HiiFormLink); > + HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > + > + HiiStatementLink =3DGetFirstNode (&HiiFormPrivate->StatementList); > + while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink))= { > + HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate- > >StatementList, HiiStatementLink); > + HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > + > + DEBUG_CODE ( > + STATIC UINTN Index =3D 0; > + DEBUG ((DEBUG_INFO, "%a, [%d] search %s in QID: 0x%x form: 0x%= x > formset: %g\n", __FUNCTION__, ++Index, ConfigureLang, > HiiStatementPrivate->QuestionId, HiiFormPrivate->Id, &HiiFormsetPrivate- > >Guid)); > + ); > + > + if (HiiStatementPrivate->Description !=3D 0) { > + TmpString =3D HiiGetRedfishString (HiiFormsetPrivate->HiiHandl= e, > Schema, HiiStatementPrivate->Description); > + if (TmpString !=3D NULL) { > + if (StrCmp (TmpString, ConfigureLang) =3D=3D 0) { > + FreePool (TmpString); > + return HiiStatementPrivate; > + } > + > + FreePool (TmpString); > + } > + } > + > + HiiStatementLink =3D HiiNextStatementLink; > + } > + > + HiiFormLink =3D HiiNextFormLink; > + } > + > + HiiFormsetLink =3D HiiFormsetNextLink; > + } > + > + return NULL; > +} > + > +/** > + Get form-set private instance by the given HII handle. > + > + @param[in] HiiHandle HII handle instance. > + @param[in] FormsetList Form-set list to search. > + > + @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to > form-set private instance. > + > +**/ > +REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * > +GetFormsetPrivateByHiiHandle ( > + IN EFI_HII_HANDLE HiiHandle, > + IN LIST_ENTRY *FormsetList > + ) > +{ > + LIST_ENTRY *HiiFormsetLink; > + LIST_ENTRY *HiiFormsetNextLink; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > + > + if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) { > + return NULL; > + } > + > + if (IsListEmpty (FormsetList)) { > + return NULL; > + } > + > + HiiFormsetLink =3D GetFirstNode (FormsetList); > + while (!IsNull (FormsetList, HiiFormsetLink)) { > + HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > + HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > + > + if (HiiFormsetPrivate->HiiHandle =3D=3D HiiHandle) { > + return HiiFormsetPrivate; > + } > + > + HiiFormsetLink =3D HiiFormsetNextLink; > + } > + > + return NULL; > +} > + > +/** > + Release formset and all the forms and statements that belong to this > formset. > + > + @param[in] FormsetPrivate Pointer to HP_HII_FORM_SET_PRIVATE > + > + @retval EFI_STATUS > + > +**/ > +EFI_STATUS > +ReleaseFormset ( > + IN REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate > + ) > +{ > + LIST_ENTRY *HiiFormLink; > + LIST_ENTRY *HiiNextFormLink; > + REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > + LIST_ENTRY *HiiStatementLink; > + LIST_ENTRY *HiiNextStatementLink; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > + UINTN Index; > + > + if (FormsetPrivate =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + HiiFormLink =3D GetFirstNode (&FormsetPrivate->HiiFormList); > + while (!IsNull (&FormsetPrivate->HiiFormList, HiiFormLink)) { > + HiiFormPrivate =3D REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK > (HiiFormLink); > + HiiNextFormLink =3D GetNextNode (&FormsetPrivate->HiiFormList, > HiiFormLink); > + > + HiiStatementLink =3D GetFirstNode (&HiiFormPrivate->StatementList); > + while (!IsNull (&HiiFormPrivate->StatementList, HiiStatementLink)) { > + HiiStatementPrivate =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK (HiiStatementLink); > + HiiNextStatementLink =3D GetNextNode (&HiiFormPrivate->StatementLi= st, > HiiStatementLink); > + > + // > + // HiiStatementPrivate->HiiStatement will be released in > DestroyFormSet(). > + // > + > + if (HiiStatementPrivate->DesStringCache !=3D NULL) { > + FreePool (HiiStatementPrivate->DesStringCache); > + HiiStatementPrivate->DesStringCache =3D NULL; > + } > + > + RemoveEntryList (&HiiStatementPrivate->Link); > + FreePool (HiiStatementPrivate); > + HiiStatementLink =3D HiiNextStatementLink; > + } > + > + // > + // HiiStatementPrivate->HiiForm will be released in DestroyFormSet()= . > + // > + > + RemoveEntryList (&HiiFormPrivate->Link); > + FreePool (HiiFormPrivate); > + HiiFormLink =3D HiiNextFormLink; > + } > + > + if (FormsetPrivate->HiiFormSet !=3D NULL) { > + DestroyFormSet (FormsetPrivate->HiiFormSet); > + FormsetPrivate->HiiFormSet =3D NULL; > + } > + > + if (FormsetPrivate->DevicePathStr !=3D NULL) { > + FreePool(FormsetPrivate->DevicePathStr); > + } > + > + // > + // Release schema list > + // > + if (FormsetPrivate->SupportedSchema.SchemaList !=3D NULL) { > + for (Index =3D 0; Index < FormsetPrivate->SupportedSchema.Count; > Index++) { > + FreePool (FormsetPrivate->SupportedSchema.SchemaList[Index]); > + } > + > + FreePool (FormsetPrivate->SupportedSchema.SchemaList); > + FormsetPrivate->SupportedSchema.SchemaList =3D NULL; > + FormsetPrivate->SupportedSchema.Count =3D 0; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Create new form-set instance. > + > + @retval REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * Pointer to > newly created form-set private instance. > + > +**/ > +REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE * > +NewFormsetPrivate ( > + VOID > + ) > +{ > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *NewFormsetPrivate; > + > + NewFormsetPrivate =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE)); > + if (NewFormsetPrivate =3D=3D NULL) { > + return NULL; > + } > + > + // > + // Initial newly created formset private data. > + // > + InitializeListHead (&NewFormsetPrivate->HiiFormList); > + > + return NewFormsetPrivate; > +} > + > +/** > + Load the HII formset from the given HII handle. > + > + @param[in] HiiHandle Target HII handle to load. > + @param[out] FormsetPrivate The formset private data. > + > + @retval EFI_STATUS > + > +**/ > +EFI_STATUS > +LoadFormset ( > + IN EFI_HII_HANDLE HiiHandle, > + OUT REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE > *FormsetPrivate > + ) > +{ > + EFI_STATUS Status; > + HII_FORMSET *HiiFormSet; > + HII_FORM *HiiForm; > + LIST_ENTRY *HiiFormLink; > + REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *HiiFormPrivate; > + HII_STATEMENT *HiiStatement; > + LIST_ENTRY *HiiStatementLink; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > *HiiStatementPrivate; > + EFI_GUID ZeroGuid; > + > + if (HiiHandle =3D=3D NULL || FormsetPrivate =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + > + HiiFormSet =3D AllocateZeroPool (sizeof (HII_FORMSET)); > + if (HiiFormSet =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Find HII formset by the given HII handle. > + // > + ZeroMem (&ZeroGuid, sizeof (ZeroGuid)); > + Status =3D CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSe= t); > + if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) { > + Status =3D EFI_NOT_FOUND; > + goto ErrorExit; > + } > + > + // > + // Initialize formset > + // > + InitializeFormSet (HiiFormSet); > + > + // > + // Initialize formset private data. > + // > + FormsetPrivate->HiiFormSet =3D HiiFormSet; > + FormsetPrivate->HiiHandle =3D HiiHandle; > + CopyGuid (&FormsetPrivate->Guid, &HiiFormSet->Guid); > + FormsetPrivate->DevicePathStr =3D ConvertDevicePathToText (HiiFormSet- > >DevicePath, FALSE, FALSE); > + Status =3D GetSupportedSchema (FormsetPrivate->HiiHandle, > &FormsetPrivate->SupportedSchema); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_WARN, "%a, No schema from HII handle: 0x%x found: > %r\n", __FUNCTION__, FormsetPrivate->HiiHandle, Status)); > + } > + > + HiiFormLink =3D GetFirstNode (&HiiFormSet->FormListHead); > + while (!IsNull (&HiiFormSet->FormListHead, HiiFormLink)) { > + HiiForm =3D HII_FORM_FROM_LINK (HiiFormLink); > + > + HiiFormPrivate =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_FORM_PRIVATE)); > + if (HiiFormPrivate =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto ErrorExit; > + } > + > + // > + // Initialize form private data. > + // > + HiiFormPrivate->HiiForm =3D HiiForm; > + HiiFormPrivate->Id =3D HiiForm->FormId; > + HiiFormPrivate->Title =3D HiiForm->FormTitle; > + HiiFormPrivate->ParentFormset =3D FormsetPrivate; > + InitializeListHead (&HiiFormPrivate->StatementList); > + > + HiiStatementLink =3D GetFirstNode (&HiiForm->StatementListHead); > + while (!IsNull (&HiiForm->StatementListHead, HiiStatementLink)) { > + HiiStatement =3D HII_STATEMENT_FROM_LINK (HiiStatementLink); > + > + HiiStatementPrivate =3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE)); > + if (HiiStatementPrivate =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto ErrorExit; > + } > + // > + // Initialize statement private data. > + // > + HiiStatementPrivate->HiiStatement =3D HiiStatement; > + HiiStatementPrivate->QuestionId =3D HiiStatement->QuestionId; > + HiiStatementPrivate->Description =3D HiiStatement->Prompt; > + HiiStatementPrivate->ParentForm =3D HiiFormPrivate; > + > + // > + // Attach to statement list. > + // > + InsertTailList (&HiiFormPrivate->StatementList, &HiiStatementPriva= te- > >Link); > + HiiStatementLink =3D GetNextNode (&HiiForm->StatementListHead, > HiiStatementLink); > + } > + // > + // Attach to form list. > + // > + InsertTailList (&FormsetPrivate->HiiFormList, &HiiFormPrivate->Link)= ; > + HiiFormLink =3D GetNextNode (&HiiFormSet->FormListHead, HiiFormLink)= ; > + } > + > + return EFI_SUCCESS; > + > +ErrorExit: > + > + // > + // Release HiiFormSet if HiiFormSet is not linked to FormsetPrivate ye= t. > + // > + if (HiiFormSet !=3D NULL && FormsetPrivate->HiiFormSet !=3D HiiFormSet= ) { > + DestroyFormSet (HiiFormSet); > + } > + > + // > + // Release resource when error happens. > + // > + ReleaseFormset (FormsetPrivate); > + > + return Status; > +} > + > +/** > + Release formset list and all the forms that belong to this formset. > + > + @param[in] FormsetList Pointer to formst list that needs to be > + released. > + > + @retval EFI_STATUS > + > +**/ > +EFI_STATUS > +LoadFormsetList ( > + IN EFI_HII_HANDLE *HiiHandle, > + OUT LIST_ENTRY *FormsetList > + ) > +{ > + EFI_STATUS Status; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate; > + > + if (HiiHandle =3D=3D NULL || FormsetList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + FormsetPrivate =3D GetFormsetPrivateByHiiHandle (HiiHandle, FormsetLis= t); > + if (FormsetPrivate !=3D NULL) { > + return EFI_ALREADY_STARTED; > + } > + > + FormsetPrivate =3D NewFormsetPrivate (); > + if (FormsetPrivate =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a, out of resource\n", __FUNCTION__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Load formset on the given HII handle. > + // > + Status =3D LoadFormset (HiiHandle, FormsetPrivate); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, failed to load formset: %r\n", > __FUNCTION__, Status)); > + FreePool (FormsetPrivate); > + return Status; > + } > + > + // > + // Attach to cache list. > + // > + InsertTailList (FormsetList, &FormsetPrivate->Link); > + > + DEBUG_CODE ( > + DumpFormsetList (FormsetList); > + ); > + > + return EFI_SUCCESS; > +} > + > +/** > + Release formset list and all the forms that belong to this formset. > + > + @param[in] FormsetList Pointer to formst list that needs to be > + released. > + > + @retval EFI_STATUS > + > +**/ > +EFI_STATUS > +ReleaseFormsetList ( > + IN LIST_ENTRY *FormsetList > + ) > +{ > + LIST_ENTRY *HiiFormsetLink; > + LIST_ENTRY *HiiFormsetNextLink; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *HiiFormsetPrivate; > + > + if (FormsetList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (FormsetList)) { > + return EFI_SUCCESS; > + } > + > + HiiFormsetLink =3D GetFirstNode (FormsetList); > + while (!IsNull (FormsetList, HiiFormsetLink)) { > + HiiFormsetNextLink =3D GetNextNode (FormsetList, HiiFormsetLink); > + HiiFormsetPrivate =3D > REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK (HiiFormsetLink); > + > + // > + // Detach from list. > + // > + RemoveEntryList (&HiiFormsetPrivate->Link); > + ReleaseFormset (HiiFormsetPrivate); > + FreePool (HiiFormsetPrivate); > + HiiFormsetLink =3D HiiFormsetNextLink; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Get all pending list. > + > + @param[in] HiiHandle HII handle instance. > + @param[in] PendingList Pending list to keep pending data. > + > + @retval REDFISH_PLATFORM_CONFIG_PENDING_LIST * Pointer to > pending list data. > + > +**/ > +REDFISH_PLATFORM_CONFIG_PENDING_LIST * > +GetPendingList ( > + IN EFI_HII_HANDLE *HiiHandle, > + IN LIST_ENTRY *PendingList > + ) > +{ > + LIST_ENTRY *PendingListLink; > + REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target; > + > + if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) { > + return NULL; > + } > + > + if (IsListEmpty (PendingList)) { > + return NULL; > + } > + > + PendingListLink =3D GetFirstNode (PendingList); > + while (!IsNull (PendingList, PendingListLink)) { > + Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK > (PendingListLink); > + > + if (Target->HiiHandle =3D=3D HiiHandle) { > + return Target; > + } > + > + PendingListLink =3D GetNextNode (PendingList, PendingListLink); > + } > + > + return NULL; > +} > + > +/** > + When HII database is updated. Keep updated HII handle into pending lis= t > so > + we can process them later. > + > + @param[in] HiiHandle HII handle instance. > + @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > + > + @retval EFI_SUCCESS HII handle is saved in pending list. > + @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > + @retval EFI_OUT_OF_RESOURCES System is out of memory. > + > +**/ > +EFI_STATUS > +NotifyFormsetUpdate ( > + IN EFI_HII_HANDLE *HiiHandle, > + IN LIST_ENTRY *PendingList > + ) > +{ > + REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList; > + > + if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Check and see if this HII handle is processed already. > + // > + TargetPendingList =3D GetPendingList (HiiHandle, PendingList); > + if (TargetPendingList !=3D NULL) { > + TargetPendingList->IsDeleted =3D FALSE; > + DEBUG_CODE ( > + DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated\n", > __FUNCTION__, HiiHandle)); > + ); > + return EFI_SUCCESS; > + } > + > + TargetPendingList=3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_PENDING_LIST)); > + if (TargetPendingList =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + TargetPendingList->HiiHandle =3D HiiHandle; > + TargetPendingList->IsDeleted =3D FALSE; > + > + InsertTailList (PendingList, &TargetPendingList->Link); > + > + DEBUG_CODE ( > + DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is created\n", > __FUNCTION__, HiiHandle)); > + ); > + > + return EFI_SUCCESS; > +} > + > +/** > + When HII database is updated and form-set is deleted. Keep deleted HII > handle into pending list so > + we can process them later. > + > + @param[in] HiiHandle HII handle instance. > + @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > + > + @retval EFI_SUCCESS HII handle is saved in pending list. > + @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > + @retval EFI_OUT_OF_RESOURCES System is out of memory. > + > +**/ > +EFI_STATUS > +NotifyFormsetDeleted ( > + IN EFI_HII_HANDLE *HiiHandle, > + IN LIST_ENTRY *PendingList > + ) > +{ > + REDFISH_PLATFORM_CONFIG_PENDING_LIST *TargetPendingList; > + > + if (HiiHandle =3D=3D NULL || PendingList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Check and see if this HII handle is processed already. > + // > + TargetPendingList =3D GetPendingList (HiiHandle, PendingList); > + if (TargetPendingList !=3D NULL) { > + TargetPendingList->IsDeleted =3D TRUE; > + DEBUG_CODE ( > + DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is updated and deleted\n= ", > __FUNCTION__, HiiHandle)); > + ); > + return EFI_SUCCESS; > + } > + > + TargetPendingList=3D AllocateZeroPool (sizeof > (REDFISH_PLATFORM_CONFIG_PENDING_LIST)); > + if (TargetPendingList =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + TargetPendingList->HiiHandle =3D HiiHandle; > + TargetPendingList->IsDeleted =3D TRUE; > + > + InsertTailList (PendingList, &TargetPendingList->Link); > + > + DEBUG_CODE ( > + DEBUG ((DEBUG_INFO, "%a, HII handle: 0x%x is deleted\n", > __FUNCTION__, HiiHandle)); > + ); > + > + return EFI_SUCCESS; > +} > + > +/** > + There are HII database update and we need to process them accordingly > so that we > + won't use stale data. This function will parse updated HII handle agai= n in > order > + to get updated data-set. > + > + @param[in] FormsetList List to keep HII form-set. > + @param[in] PendingList List to keep HII handle that is updated. > + > + @retval EFI_SUCCESS HII handle is saved in pending list. > + @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is > NULL. > + > +**/ > +EFI_STATUS > +ProcessPendingList ( > + IN LIST_ENTRY *FormsetList, > + IN LIST_ENTRY *PendingList > + ) > +{ > + LIST_ENTRY *PendingListLink; > + LIST_ENTRY *PendingListNextLink; > + REDFISH_PLATFORM_CONFIG_PENDING_LIST *Target; > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *FormsetPrivate; > + EFI_STATUS Status; > + > + > + if (FormsetList =3D=3D NULL || PendingList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (PendingList)) { > + return EFI_SUCCESS; > + } > + > + PendingListLink =3D GetFirstNode (PendingList); > + while (!IsNull (PendingList, PendingListLink)) { > + PendingListNextLink =3D GetNextNode (PendingList, PendingListLink); > + Target =3D REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK > (PendingListLink); > + > + if (Target->IsDeleted) { > + // > + // The HII resource on this HII handle is removed. Release the for= mset. > + // > + FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle= , > FormsetList); > + if (FormsetPrivate !=3D NULL) { > + DEBUG ((DEBUG_INFO, "%a, formset: %g is removed because driver > release HII resource it already\n", __FUNCTION__, FormsetPrivate->Guid)); > + RemoveEntryList (&FormsetPrivate->Link); > + ReleaseFormset (FormsetPrivate); > + FreePool (FormsetPrivate); > + } else { > + DEBUG ((DEBUG_WARN, "%a, formset on HII handle 0x%x was > removed already\n", __FUNCTION__, Target->HiiHandle)); > + } > + } else { > + // > + // The HII resource on this HII handle is updated/removed. > + // > + FormsetPrivate =3D GetFormsetPrivateByHiiHandle (Target->HiiHandle= , > FormsetList); > + if (FormsetPrivate !=3D NULL) { > + // > + // HII formset already exist, release it and query again. > + // > + DEBUG ((DEBUG_INFO, "%a, formset: %g is updated. Release current > formset\n", __FUNCTION__, &FormsetPrivate->Guid)); > + RemoveEntryList (&FormsetPrivate->Link); > + ReleaseFormset (FormsetPrivate); > + FreePool (FormsetPrivate); > + } > + > + Status =3D LoadFormsetList (Target->HiiHandle, FormsetList); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a, load formset from HII handle: 0x%x > failed: %r\n", __FUNCTION__, Target->HiiHandle, Status)); > + } > + } > + > + // > + // Detach it from list first. > + // > + RemoveEntryList (&Target->Link); > + FreePool (Target); > + > + PendingListLink =3D PendingListNextLink; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Release all resource in statement list. > + > + @param[in] StatementList Statement list to be released. > + > + @retval EFI_SUCCESS All resource are released. > + @retval EFI_INVALID_PARAMETER StatementList is NULL. > + > +**/ > +EFI_STATUS > +ReleaseStatementList ( > + IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > + ) > +{ > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF *StatementRef; > + LIST_ENTRY *NextLink; > + > + if (StatementList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (&StatementList->StatementList)) { > + return EFI_SUCCESS; > + } > + > + NextLink =3D GetFirstNode (&StatementList->StatementList); > + while (!IsNull (&StatementList->StatementList, NextLink)) { > + StatementRef =3D > REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK (NextLink); > + NextLink =3D GetNextNode (&StatementList->StatementList, NextLink); > + > + RemoveEntryList (&StatementRef->Link); > + FreePool (StatementRef); > + } > + > + return EFI_SUCCESS; > +} > diff --git > a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h > b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h > index e0ba0fb2d3..be2f63df8d 100644 > --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h > +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.h > @@ -1,274 +1,297 @@ > -/** @file > - This file defines the EDKII Redfish Platform Config Protocol interface= . > - > - (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > - > -#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_ > -#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_ > - > -#include > - > -// > -// Libraries > -// > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#define REDFISH_PLATFORM_CONFIG_DELETE_EXPIRED_FORMSET 0x00 > -#define IS_EMPTY_STRING(a) (a =3D=3D NULL = || a[0] =3D=3D L'\0') > -#define ENGLISH_LANGUAGE_CODE "en-US" > -#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish= -" > - > -// > -// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE. > -// > -typedef struct { > - LIST_ENTRY Link; > - EFI_HII_HANDLE HiiHandle; > - BOOLEAN IsDeleted; > -} REDFISH_PLATFORM_CONFIG_PENDING_LIST; > - > -#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a) > BASE_CR (a, REDFISH_PLATFORM_CONFIG_PENDING_LIST, Link) > - > -typedef struct { > - UINTN Count; // Number of schema in l= ist > - CHAR8 **SchemaList; // Schema list > -} REDFISH_PLATFORM_CONFIG_SCHEMA; > - > -// > -// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE > -// > -typedef struct { > - LIST_ENTRY Link; > - HII_FORMSET *HiiFormSet; // Pointer to HII for= mset data. > - EFI_GUID Guid; // Formset GUID. > - EFI_HII_HANDLE HiiHandle; // Hii Handle of this= formset. > - LIST_ENTRY HiiFormList; // Form list that kee= p form data under > this formset. > - CHAR16 *DevicePathStr; // Device path of thi= s formset. > - REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema > that is supported in this formset. > -} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE; > - > -#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR > (a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link) > - > -// > -// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE > -// > -typedef struct { > - LIST_ENTRY Link; > - UINT16 Id; // Form ID. > - EFI_STRING_ID Title; // String to= ken of form title. > - REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset; > - HII_FORM *HiiForm; // Pointer t= o HII form data. > - LIST_ENTRY StatementList; // Statement= list that keep > statement under this form. > -} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE; > - > -#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a, > REDFISH_PLATFORM_CONFIG_FORM_PRIVATE, Link) > - > -// > -// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > -// > -typedef struct { > - LIST_ENTRY Link; > - REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm; > - HII_STATEMENT *HiiStatement; // Pointer to HI= I statement > data. > - EFI_QUESTION_ID QuestionId; // Question ID o= f this > statement. > - EFI_STRING_ID Description; // String token = of this question. > - EFI_STRING DesStringCache; // The string ca= che for search > function. > -} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE; > - > -#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a) > BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link) > - > -// > -// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF > -// > -typedef struct { > - LIST_ENTRY Link; > - REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement; > -} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF; > - > -#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a) > BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link) > - > -// > -// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > -// > -typedef struct { > - LIST_ENTRY StatementList; // List of > REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF > - UINTN Count; > -} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST; > - > -/** > - Release formset list and all the forms that belong to this formset. > - > - @param[in] FormsetList Pointer to formst list that needs to be > - released. > - > - @retval EFI_STATUS > - > -**/ > -EFI_STATUS > -ReleaseFormsetList ( > - IN LIST_ENTRY *FormsetList > - ); > - > -/** > - Release formset list and all the forms that belong to this formset. > - > - @param[in] FormsetList Pointer to formst list that needs to be > - released. > - > - @retval EFI_STATUS > - > -**/ > -EFI_STATUS > -LoadFormsetList ( > - IN EFI_HII_HANDLE *HiiHandle, > - OUT LIST_ENTRY *FormsetList > - ); > - > -/** > - When HII database is updated. Keep updated HII handle into pending lis= t so > - we can process them later. > - > - @param[in] HiiHandle HII handle instance. > - @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > - > - @retval EFI_SUCCESS HII handle is saved in pending list. > - @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > - @retval EFI_OUT_OF_RESOURCES System is out of memory. > - > -**/ > -EFI_STATUS > -NotifyFormsetUpdate ( > - IN EFI_HII_HANDLE *HiiHandle, > - IN LIST_ENTRY *PendingList > - ); > - > -/** > - When HII database is updated and form-set is deleted. Keep deleted HII > handle into pending list so > - we can process them later. > - > - @param[in] HiiHandle HII handle instance. > - @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > - > - @retval EFI_SUCCESS HII handle is saved in pending list. > - @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > - @retval EFI_OUT_OF_RESOURCES System is out of memory. > - > -**/ > -EFI_STATUS > -NotifyFormsetDeleted ( > - IN EFI_HII_HANDLE *HiiHandle, > - IN LIST_ENTRY *PendingList > - ); > - > -/** > - Get statement private instance by the given configure language. > - > - @param[in] FormsetList Form-set list to search. > - @param[in] Schema Schema to be matched. > - @param[in] ConfigureLang Configure language. > - > - @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer to > statement private instance. > - > -**/ > -REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * > -GetStatementPrivateByConfigureLang ( > - IN LIST_ENTRY *FormsetList, > - IN CHAR8 *Schema, > - IN EFI_STRING ConfigureLang > - ); > - > -/** > - Search and find statement private instance by given regular expression > patthern > - which describes the Configure Language. > - > - @param[in] RegularExpressionProtocol Regular express protocol. > - @param[in] FormsetList Form-set list to search. > - @param[in] Schema Schema to be matched. > - @param[in] Pattern Regular expression pattern. > - @param[out] StatementList Statement list that match abov= e > pattern. > - > - @retval EFI_SUCCESS Statement list is returned. > - @retval EFI_INVALID_PARAMETER Input parameter is NULL. > - @retval EFI_NOT_READY Regular express protocol is NULL. > - @retval EFI_NOT_FOUND No statement is found. > - @retval EFI_OUT_OF_RESOURCES System is out of memory. > - > -**/ > -EFI_STATUS > -GetStatementPrivateByConfigureLangRegex ( > - IN EFI_REGULAR_EXPRESSION_PROTOCOL > *RegularExpressionProtocol, > - IN LIST_ENTRY *FormsetList, > - IN CHAR8 *Schema, > - IN EFI_STRING Pattern, > - OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > - ); > - > -/** > - There are HII database update and we need to process them accordingly = so > that we > - won't use stale data. This function will parse updated HII handle agai= n in > order > - to get updated data-set. > - > - @param[in] FormsetList List to keep HII form-set. > - @param[in] PendingList List to keep HII handle that is updated. > - > - @retval EFI_SUCCESS HII handle is saved in pending list. > - @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is > NULL. > - > -**/ > -EFI_STATUS > -ProcessPendingList ( > - IN LIST_ENTRY *FormsetList, > - IN LIST_ENTRY *PendingList > - ); > - > -/** > - Retrieves a string from a string package in a English language. The > - returned string is allocated using AllocatePool(). The caller is resp= onsible > - for freeing the allocated buffer using FreePool(). > - > - If HiiHandle is NULL, then ASSERT(). > - If StringId is 0, then ASSET. > - > - @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance. > - @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > - @param[in] StringId The identifier of the string to retrieve= d from the > string > - package associated with HiiHandle. > - > - @retval NULL The string specified by StringId is not present in the = string > package. > - @retval Other The string was returned. > - > -**/ > -EFI_STRING > -HiiGetRedfishString ( > - IN EFI_HII_HANDLE HiiHandle, > - IN CHAR8 *Language, > - IN EFI_STRING_ID StringId > - ); > - > -/** > - Release all resource in statement list. > - > - @param[in] StatementList Statement list to be released. > - > - @retval EFI_SUCCESS All resource are released. > - @retval EFI_INVALID_PARAMETER StatementList is NULL. > - > -**/ > -EFI_STATUS > -ReleaseStatementList ( > - IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > - ); > - > -#endif > +/** @file > + This file defines the EDKII Redfish Platform Config Protocol interface= . > + > + (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_ > +#define EDKII_REDFISH_PLATFORM_CONFIG_IMPL_H_ > + > +#include > + > +// > +// Libraries > +// > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define IS_EMPTY_STRING(a) (a =3D=3D NULL = || a[0] =3D=3D L'\0') > +#define ENGLISH_LANGUAGE_CODE "en-US" > +#define X_UEFI_SCHEMA_PREFIX "x-uefi-redfish= -" > + > +// > +// Definition of REDFISH_PLATFORM_CONFIG_PRIVATE. > +// > +typedef struct { > + LIST_ENTRY Link; > + EFI_HII_HANDLE HiiHandle; > + BOOLEAN IsDeleted; > +} REDFISH_PLATFORM_CONFIG_PENDING_LIST; > + > +#define REDFISH_PLATFORM_CONFIG_PENDING_LIST_FROM_LINK(a) > BASE_CR (a, REDFISH_PLATFORM_CONFIG_PENDING_LIST, Link) > + > +typedef struct { > + UINTN Count; // Number of schema in l= ist > + CHAR8 **SchemaList; // Schema list > +} REDFISH_PLATFORM_CONFIG_SCHEMA; > + > +// > +// Definition of REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE > +// > +typedef struct { > + LIST_ENTRY Link; > + HII_FORMSET *HiiFormSet; // Pointer to HII for= mset data. > + EFI_GUID Guid; // Formset GUID. > + EFI_HII_HANDLE HiiHandle; // Hii Handle of this= formset. > + LIST_ENTRY HiiFormList; // Form list that kee= p form data under > this formset. > + CHAR16 *DevicePathStr; // Device path of thi= s formset. > + REDFISH_PLATFORM_CONFIG_SCHEMA SupportedSchema; // Schema > that is supported in this formset. > +} REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE; > + > +#define REDFISH_PLATFORM_CONFIG_FORMSET_FROM_LINK(a) BASE_CR > (a, REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE, Link) > + > +// > +// Definition of REDFISH_PLATFORM_CONFIG_FORM_PRIVATE > +// > +typedef struct { > + LIST_ENTRY Link; > + UINT16 Id; // Form ID. > + EFI_STRING_ID Title; // String to= ken of form title. > + REDFISH_PLATFORM_CONFIG_FORM_SET_PRIVATE *ParentFormset; > + HII_FORM *HiiForm; // Pointer t= o HII form data. > + LIST_ENTRY StatementList; // Statement= list that keep > statement under this form. > +} REDFISH_PLATFORM_CONFIG_FORM_PRIVATE; > + > +#define REDFISH_PLATFORM_CONFIG_FORM_FROM_LINK(a) BASE_CR (a, > REDFISH_PLATFORM_CONFIG_FORM_PRIVATE, Link) > + > +// > +// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE > +// > +typedef struct { > + LIST_ENTRY Link; > + REDFISH_PLATFORM_CONFIG_FORM_PRIVATE *ParentForm; > + HII_STATEMENT *HiiStatement; // Pointer to HI= I statement > data. > + EFI_QUESTION_ID QuestionId; // Question ID o= f this > statement. > + EFI_STRING_ID Description; // String token = of this question. > + EFI_STRING DesStringCache; // The string ca= che for search > function. > +} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE; > + > +#define REDFISH_PLATFORM_CONFIG_STATEMENT_FROM_LINK(a) > BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE, Link) > + > +// > +// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF > +// > +typedef struct { > + LIST_ENTRY Link; > + REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE *Statement; > +} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF; > + > +#define REDFISH_PLATFORM_CONFIG_STATEMENT_REF_FROM_LINK(a) > BASE_CR (a, REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF, Link) > + > +// > +// Definition of REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > +// > +typedef struct { > + LIST_ENTRY StatementList; // List of > REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_REF > + UINTN Count; > +} REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST; > + > +/** > + Release formset list and all the forms that belong to this formset. > + > + @param[in] FormsetList Pointer to formst list that needs to be > + released. > + > + @retval EFI_STATUS > + > +**/ > +EFI_STATUS > +ReleaseFormsetList ( > + IN LIST_ENTRY *FormsetList > + ); > + > +/** > + Release formset list and all the forms that belong to this formset. > + > + @param[in] FormsetList Pointer to formst list that needs to be > + released. > + > + @retval EFI_STATUS > + > +**/ > +EFI_STATUS > +LoadFormsetList ( > + IN EFI_HII_HANDLE *HiiHandle, > + OUT LIST_ENTRY *FormsetList > + ); > + > +/** > + When HII database is updated. Keep updated HII handle into pending lis= t > so > + we can process them later. > + > + @param[in] HiiHandle HII handle instance. > + @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > + > + @retval EFI_SUCCESS HII handle is saved in pending list. > + @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > + @retval EFI_OUT_OF_RESOURCES System is out of memory. > + > +**/ > +EFI_STATUS > +NotifyFormsetUpdate ( > + IN EFI_HII_HANDLE *HiiHandle, > + IN LIST_ENTRY *PendingList > + ); > + > +/** > + When HII database is updated and form-set is deleted. Keep deleted HII > handle into pending list so > + we can process them later. > + > + @param[in] HiiHandle HII handle instance. > + @param[in] PendingList Pending list to keep HII handle which is recen= tly > updated. > + > + @retval EFI_SUCCESS HII handle is saved in pending list. > + @retval EFI_INVALID_PARAMETER HiiHnalde is NULL or PendingList is > NULL. > + @retval EFI_OUT_OF_RESOURCES System is out of memory. > + > +**/ > +EFI_STATUS > +NotifyFormsetDeleted ( > + IN EFI_HII_HANDLE *HiiHandle, > + IN LIST_ENTRY *PendingList > + ); > + > +/** > + Get statement private instance by the given configure language. > + > + @param[in] FormsetList Form-set list to search. > + @param[in] Schema Schema to be matched. > + @param[in] ConfigureLang Configure language. > + > + @retval REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * Pointer > to statement private instance. > + > +**/ > +REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE * > +GetStatementPrivateByConfigureLang ( > + IN LIST_ENTRY *FormsetList, > + IN CHAR8 *Schema, > + IN EFI_STRING ConfigureLang > + ); > + > +/** > + Search and find statement private instance by given regular expression > patthern > + which describes the Configure Language. > + > + @param[in] RegularExpressionProtocol Regular express protocol. > + @param[in] FormsetList Form-set list to search. > + @param[in] Schema Schema to be matched. > + @param[in] Pattern Regular expression pattern. > + @param[out] StatementList Statement list that match abov= e > pattern. > + > + @retval EFI_SUCCESS Statement list is returned. > + @retval EFI_INVALID_PARAMETER Input parameter is NULL. > + @retval EFI_NOT_READY Regular express protocol is NULL. > + @retval EFI_NOT_FOUND No statement is found. > + @retval EFI_OUT_OF_RESOURCES System is out of memory. > + > +**/ > +EFI_STATUS > +GetStatementPrivateByConfigureLangRegex ( > + IN EFI_REGULAR_EXPRESSION_PROTOCOL > *RegularExpressionProtocol, > + IN LIST_ENTRY *FormsetList, > + IN CHAR8 *Schema, > + IN EFI_STRING Pattern, > + OUT REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > + ); > + > +/** > + There are HII database update and we need to process them accordingly > so that we > + won't use stale data. This function will parse updated HII handle agai= n in > order > + to get updated data-set. > + > + @param[in] FormsetList List to keep HII form-set. > + @param[in] PendingList List to keep HII handle that is updated. > + > + @retval EFI_SUCCESS HII handle is saved in pending list. > + @retval EFI_INVALID_PARAMETER FormsetList is NULL or PendingList is > NULL. > + > +**/ > +EFI_STATUS > +ProcessPendingList ( > + IN LIST_ENTRY *FormsetList, > + IN LIST_ENTRY *PendingList > + ); > + > +/** > + Retrieves a string from a string package in a English language. The > + returned string is allocated using AllocatePool(). The caller is resp= onsible > + for freeing the allocated buffer using FreePool(). > + > + If HiiHandle is NULL, then ASSERT(). > + If StringId is 0, then ASSET. > + > + @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance. > + @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > + @param[in] StringId The identifier of the string to retrieve= d from the > string > + package associated with HiiHandle. > + > + @retval NULL The string specified by StringId is not present in the = string > package. > + @retval Other The string was returned. > + > +**/ > +EFI_STRING > +HiiGetRedfishString ( > + IN EFI_HII_HANDLE HiiHandle, > + IN CHAR8 *Language, > + IN EFI_STRING_ID StringId > + ); > + > +/** > + Retrieves a string from a string package in a English language. The > + returned string is allocated using AllocatePool(). The caller is resp= onsible > + for freeing the allocated buffer using FreePool(). > + > + If HiiHandle is NULL, then ASSERT(). > + If StringId is 0, then ASSET. > + > + @param[in] HiiStringProtocol EFI_HII_STRING_PROTOCOL instance. > + @param[in] HiiHandle A handle that was previously registered = in the > HII Database. > + @param[in] StringId The identifier of the string to retrieve= d from the > string The function parameters are not correct. Thanks Abner > + package associated with HiiHandle. > + > + @retval NULL The string specified by StringId is not present in the = string > package. > + @retval Other The string was returned. > + > +**/ > +CHAR8 * > +HiiGetRedfishAsciiString ( > + IN EFI_HII_HANDLE HiiHandle, > + IN CHAR8 *Language, > + IN EFI_STRING_ID StringId > + ); > + > +/** > + Release all resource in statement list. > + > + @param[in] StatementList Statement list to be released. > + > + @retval EFI_SUCCESS All resource are released. > + @retval EFI_INVALID_PARAMETER StatementList is NULL. > + > +**/ > +EFI_STATUS > +ReleaseStatementList ( > + IN REDFISH_PLATFORM_CONFIG_STATEMENT_PRIVATE_LIST > *StatementList > + ); > + > +#endif > -- > 2.32.0.windows.2