From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (NAM11-CO1-obe.outbound.protection.outlook.com [40.107.220.79]) by mx.groups.io with SMTP id smtpd.web10.32987.1670810307313919191 for ; Sun, 11 Dec 2022 17:58:27 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=rEvwux17; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.220.79, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=obxgjGqG0gZt07bRpJIiE++f7kUcgOygi3DifuvTfK/eVD/B1yUQ91tfPk/k/5TBRWRN7YDPKBvuhubBhOQg0fJPDSOYJ/rdOL/C4yRQhQ7meOjFN6LscZwfY8Sly7HmBF+ismsNz5sBEHrghRZ996IXsZu15YPFgoXRC/ncOwdnr5fSqXTK/ujuL1br/tGdQT6ZgNyoJ/Zjb83bP24vQunZa4rrzv83GU9AmeGVXXMidEhoh2yUEFh51tPeq7eOkZAH90QgegM0EHe6fyA0EibOxxQjkJKcl7i7VykkBHp073X49HsoxtDw2JRiAXFGEh9VsKbzjObXVR2MuBBTOA== 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=q6mRQFLdfhStxR2aaIJVTfmmAiFl5vOmiUojJ8171S0=; b=GOFA6QdLuTayBlSq4s+lhkuaDQQsfayBabD0RkMgt3d30N0HEe5QM5E36CY4D23mwtiC9DNLWK1hP/GZpKx4PkMW+z9ZR+rr9aaza1uPp4XA/jsvIS6QN8zsQpLzdfWQtS1iTO69woxDc/1F1QSxc1rjfQjmV5Dye876iQdnqNIkNckTwIo4PnQvxjNGos4vmoVWNPErdfL4b3V4e+3j064tQl8Oqg1BzEiZTGcfm0dMuXe2glhg4rTiuWebWBonlwp1bKUp+1NB3Yle1LOlOSfKdT5mV71Bb/LxXXW3yB/U3Jcl452882WKdac2Xe70ZsekWoycj3+XvKMrVB2GXA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=q6mRQFLdfhStxR2aaIJVTfmmAiFl5vOmiUojJ8171S0=; b=rEvwux174KgfMi9tdZHYeYGDMoYERPTii+meTBXw61IukMOhZkOyQsTqUN3DkgkE1yb7IWF/MPEh6YSj3qNw1n2++ZkgEiuyqtMLXnpIm1Ws2ovinJHkmkYaVho/Tle+tZFDt1sXymBFjTXQzJTiAUfnhWyp5EJ9iR1tx2gXw1o= Received: from MN2PR12MB3966.namprd12.prod.outlook.com (2603:10b6:208:165::18) by DS7PR12MB5767.namprd12.prod.outlook.com (2603:10b6:8:76::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5880.16; Mon, 12 Dec 2022 01:58:22 +0000 Received: from MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::ce0a:283e:839:34bd]) by MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::ce0a:283e:839:34bd%3]) with mapi id 15.20.5880.019; Mon, 12 Dec 2022 01:58:22 +0000 From: "Chang, Abner" To: Nickle Wang , "devel@edk2.groups.io" CC: Igor Kulchytskyy , Nick Ramirez Subject: Re: [edk2-staging][PATCH 1/3] edk2-staging/RedfishPkg: Add interface to get question default value Thread-Topic: [edk2-staging][PATCH 1/3] edk2-staging/RedfishPkg: Add interface to get question default value Thread-Index: AQHZCkWCkpdOwes7ykmuSRXQmvwf4K5pgadg Date: Mon, 12 Dec 2022 01:58:22 +0000 Message-ID: References: <20221207140910.124-1-nicklew@nvidia.com> In-Reply-To: <20221207140910.124-1-nicklew@nvidia.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Enabled=true; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SetDate=2022-12-12T01:58:20Z; 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=34dbd254-c6d1-4b65-b439-710b1bbd4e1a; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=1 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MN2PR12MB3966:EE_|DS7PR12MB5767:EE_ x-ms-office365-filtering-correlation-id: 29859674-1179-42f5-ca5f-08dadbe45979 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: SZ6z6HIbynFSFbEzwN7lrO4ZdrF37Fw6BkzklzxbFDzpZmP7KS/l1/QHt+3CH2fThq24GXir5S8ojxmAFwem0Za5LbtQBJWZiCnxMm73E8Cr/h4g/Gm0Frt9JwJrJQilJQ3jxjB43Ehu9OTTwCDBoXJm522qoifmZYxDA/ENN0rP5NSMyhLoclikfTPt2Le6Ucz+1862c3eKqhrbS+YV3OAABAz/Yetv9+olUdlbVp0aCVUyPB15cm/tE8foobWTwDLZd5FHXika5VUTJhLYCHKueyyQxXTCyezuc/3BSE39AwazfOk/+IDeuB7dIilGi/tdtEp0fVmwrGpgFfi4phjkJDW5JMTxoxqwbga28hpF0GIK+p+HIrFuqOPRHjScX0j8zDGktKELQZAV7eYDBgAQ7XSrD14JZGERJpK2Vvj47ASaE9dI4N/k9wTV6GP4YURNvObYnabbOkZ6PSUDeozeHVoJs50XO8v/TD69+4rVniE61d6+nunTlaNWEi8LwP+4QRedBG9E+v0JHvtlNbCGRQbrWseaM+goFYdqd7g8jeuqBVsTlclBoq4vab/UX5lc7UQxvzTiggKsjkq2ctagpgWfILFhPq20/bG4K0Hq33kEzBBpfOXaRiIYidPtU+YbermoFXj/AXXo+Olefy3qe0hMCS+J7BubpA/zwoJYdT/hkk30PKlRe698ZJykWlEAoUx2h6dFY7uyZSAlEA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB3966.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(346002)(376002)(396003)(366004)(39860400002)(136003)(451199015)(316002)(83380400001)(52536014)(26005)(30864003)(9686003)(2906002)(8936002)(110136005)(71200400001)(66574015)(53546011)(54906003)(186003)(41300700001)(7696005)(38070700005)(86362001)(6506007)(5660300002)(4326008)(8676002)(76116006)(55016003)(64756008)(66476007)(66446008)(66946007)(66556008)(38100700002)(478600001)(33656002)(122000001)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?nM4VXXPV6lbqeycKGUDfSE7DB1PiYDI5pUOcobnG2i84RM985ltL0+lyw8Xb?= =?us-ascii?Q?cFkpfPjdy0zzloJ1UP0vuYm1Hv15y+pA1KWkysi6aJjom/JIhGOU7Yx9QnIt?= =?us-ascii?Q?NJ2r/B7eTgPOmQXx8tKkUWK/AH76FyC50v1FCPqJqm5qd4JO/aglYUXkBSNx?= =?us-ascii?Q?Swh9OGCsGqv+bbAA6mSKyGLJ7JrKW5PzfShWkXOVBY0iy9tconl5sJ0jb0wD?= =?us-ascii?Q?UsZ5plr9110I3RoTfrcgzO2zR9mY4Rh651ntyL9sLTBAH4WyMDDcFNG5hwqS?= =?us-ascii?Q?enBFDSwCjv5hrQFai14Iui9Vjt+0TcjjBNTymEvjDTKsvbOrANRbb0HQb3SV?= =?us-ascii?Q?Z+8C6/hyn3gSUBEEUhL6Birg4gqvjgkDJPOXUDmcB/wl3sBMgpZgXyCu3l42?= =?us-ascii?Q?6jTEWc5ySRb++O4odIVAHzUphKtels7jzwU4MSqbtWjvkIMBSx0Fg+Fpcjh4?= =?us-ascii?Q?O1d4+6GEMr1zEYMiqN4kYubhC8Y+GcftCfZ/A1iUI+cQ1xiuNS9UQaYcJTVh?= =?us-ascii?Q?wudESEojE1JhgbDUAWIldaQpSZrnVCaF07Q464NuDZPPu15dOi1fVvZQ02WH?= =?us-ascii?Q?0sUoUBZF9OvEj/dUna6fem5NsuRNkw4qPinJOwQYE6vG+7bZ3BvRLN0/zYBu?= =?us-ascii?Q?BC5U8jstltJWTkQfC1TKMvOWfT0aG55mYDlbtQF2xRXd+S8I8Bgce8ZNxZ1G?= =?us-ascii?Q?+jt/jyvGgQd/r+P7XrqPQoAE2hlvSigCuJNVol4bQ74iiTxeM4zYyDVPS7Fz?= =?us-ascii?Q?+vDiTT6TkI0IdDM9NEfAm2dZQjtqlk6H3Ppnl9WOuGxvjgUNEqV7swyZwCBN?= =?us-ascii?Q?aLWkQZJG+I3fHUj//ZS2zlzknTu6LZQcTQFPvNncx76dND37ufd//mFxUlfh?= =?us-ascii?Q?Ek8/erO+nsdAkSas1vTCye4Tqqn6jq7uBRpiWJD5gGzRcH7q+WndlXG0o4Cu?= =?us-ascii?Q?06qBJAUtatiZdh+UdPCvfZz1wji1TVl1uR97OSFr6kE/mQkY0fUoEk4rnGIz?= =?us-ascii?Q?p25TkYtdZhOdxmbT3JgFc8oMoojrzKnnKo+qPil4GF+Ir80xDMkr4g1YHXr4?= =?us-ascii?Q?hv6PlHdEotgqp95uIhdlpqbcTqc/mfqzsFpLL5RuHL8T9kbr6fLqXnixBLf9?= =?us-ascii?Q?bDQd/5r/8VhQwk84mbomHfgJWhEzoLXzA/0Kd1eV0pkj2F0CCZS3iqLBUjei?= =?us-ascii?Q?EKr6HWbUaz49CdUIWjld/d3AombuUfSf0o76l5rlowljOcCEMMbbQ9HMmvpA?= =?us-ascii?Q?qzUTXbLq//WmOSXAbcURbVmLuxAGkmB0bL26MjfiPUZikegMZ+GY+pFOl/6g?= =?us-ascii?Q?L7gbGyfU0WApdxzQ+CBgIbv2PQjgwwqHXGE5ylE2/TsitH4BF+nGvzx6hVkh?= =?us-ascii?Q?So6sIUZuiCTYFZc9i0R2TYxWz82+CbZw116BjeHBHt8icYTSoO1PKGAJYGVk?= =?us-ascii?Q?at+Of9/AQEotnSxAQtoxzF80qjS3YyEsWj7UPThnigSRtvyNESdTKj3Qjnff?= =?us-ascii?Q?I1NIAxNMU8wdWZyAwgvi7IKGGl6wFOqzeAE5ecv9A0VcvaRFz8/qUEkGM1bI?= =?us-ascii?Q?KRy6tx4ow2NvdpP9upaG0S+sGRMadiorbf7rmaT0?= MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3966.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29859674-1179-42f5-ca5f-08dadbe45979 X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Dec 2022 01:58:22.6058 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: p94NlcYAGgMLl7WT5ifQ0u4x9g/YuBp5KG99Oc+KBzA/pRn67+HKVn+8nwnv6mDkRxL839QNVdXoVHz9pgcruQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5767 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable [AMD Official Use Only - General] Hi Nickle, comments in line. > -----Original Message----- > From: Nickle Wang > Sent: Wednesday, December 7, 2022 10:09 PM > To: devel@edk2.groups.io > Cc: Chang, Abner ; Igor Kulchytskyy > ; Nick Ramirez > Subject: [edk2-staging][PATCH 1/3] edk2-staging/RedfishPkg: Add interface= to > get question default value >=20 > Caution: This message originated from an External Source. Use proper caut= ion > when opening attachments, clicking links, or responding. >=20 >=20 > Implement GetQuestionDefault() in HiiUtilityLib. Caller can get question = default > value from this interface. GetQuestionDefault() is created and modifed fr= om > SetupBrowserDxe\Setup.c under MdeModulePkg. >=20 > Signed-off-by: Nickle Wang > Cc: Abner Chang > Cc: Igor Kulchytskyy > Cc: Nick Ramirez > --- > RedfishPkg/Include/Library/HiiUtilityLib.h | 31 +- > .../Library/HiiUtilityLib/HiiExpression.c | 77 +++ > .../Library/HiiUtilityLib/HiiExpression.h | 23 + > .../HiiUtilityLib/HiiUtilityInternal.c | 614 ++++++++++++++++++ > 4 files changed, 728 insertions(+), 17 deletions(-) >=20 > diff --git a/RedfishPkg/Include/Library/HiiUtilityLib.h > b/RedfishPkg/Include/Library/HiiUtilityLib.h > index 1f164ba49c..f4be485423 100644 > --- a/RedfishPkg/Include/Library/HiiUtilityLib.h > +++ b/RedfishPkg/Include/Library/HiiUtilityLib.h > @@ -3,6 +3,7 @@ >=20 > Copyright (c) 2019, Intel Corporation. All rights reserved.
> (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserv= ed. >=20 > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -1168,28 +1169,24 @@ GetHiiExpressionDependency ( > ); >=20 > /** > - Evaluate the result of a HII expression. > - > - If Expression is NULL, then ASSERT. > + Get default value of question. >=20 > - @param FormSet FormSet associated with this expression= . > - @param Form Form associated with this expression. > - @param Expression Expression to be evaluated. > + @param FormSet The form set. > + @param Form The form. > + @param Question The question. > + @param DefaultId The Class of the default. > + @param DefaultValue The default value of given question. No [in, out] for the Doxygen parameter/ >=20 > - @retval EFI_SUCCESS The expression evaluated successfuly > - @retval EFI_NOT_FOUND The Question which referenced by a > QuestionId > - could not be found. > - @retval EFI_OUT_OF_RESOURCES There is not enough system memory to > grow the > - stack. > - @retval EFI_ACCESS_DENIED The pop operation underflowed the stack > - @retval EFI_INVALID_PARAMETER Syntax error with the Expression > + @retval EFI_SUCCESS Question is reset to default value. >=20 > **/ > EFI_STATUS > -HpEvaluateHiiExpression ( > - IN HII_FORMSET *FormSet, > - IN HII_FORM *Form, > - IN OUT HII_EXPRESSION *Expression > +GetQuestionDefault ( > + IN HII_FORMSET *FormSet, > + IN HII_FORM *Form, > + IN HII_STATEMENT *Question, > + IN UINT16 DefaultId, > + OUT HII_STATEMENT_VALUE *DefaultValue > ); >=20 > #endif // _HII_UTILITY_LIB_ > diff --git a/RedfishPkg/Library/HiiUtilityLib/HiiExpression.c > b/RedfishPkg/Library/HiiUtilityLib/HiiExpression.c > index 7111b40acf..c6954587f5 100644 > --- a/RedfishPkg/Library/HiiUtilityLib/HiiExpression.c > +++ b/RedfishPkg/Library/HiiUtilityLib/HiiExpression.c > @@ -3,6 +3,7 @@ >=20 > Copyright (c) 2019, Intel Corporation. All rights reserved.
> (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserv= ed. >=20 > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -1365,3 +1366,79 @@ GetHiiExpressionDependency ( > Done: > return Status; > } > + > +/** > + Return the result of the expression list. Check the expression list > +and > + return the highest priority express result. > + Priority: DisableIf > SuppressIf > GrayOutIf > FALSE > + > + @param ExpList The input expression list. > + @param Evaluate Whether need to evaluate the expression fi= rst. > + @param FormSet FormSet associated with this expression. > + @param Form Form associated with this expression. Just realize we don't have [in,out] for Doxygen @param throughout this file= . Please just fix @params in the new added function. We can fix all others = later. > + > + @retval EXPRESS_RESULT Return the higher priority express result. > + DisableIf > SuppressIf > GrayOutIf > > + FALSE > + > +**/ > +EXPRESS_RESULT > +EvaluateExpressionList ( > + IN HII_EXPRESSION_LIST *ExpList, > + IN BOOLEAN Evaluate, > + IN HII_FORMSET *FormSet, OPTIONAL > + IN HII_FORM *Form OPTIONAL > + ) > +{ > + UINTN Index; > + EXPRESS_RESULT ReturnVal; > + EXPRESS_RESULT CompareOne; > + EFI_STATUS Status; > + > + if (ExpList =3D=3D NULL) { > + return ExpressFalse; > + } > + > + ASSERT (ExpList->Signature =3D=3D HII_EXPRESSION_LIST_SIGNATURE); Ind= ex > + =3D 0; > + > + // > + // Check whether need to evaluate the expression first. > + // > + if (Evaluate) { > + while (ExpList->Count > Index) { > + Status =3D EvaluateHiiExpression (FormSet, Form, ExpList- > >Expression[Index++]); > + if (EFI_ERROR (Status)) { > + return ExpressFalse; > + } > + } > + } > + > + // > + // Run the list of expressions. > + // > + ReturnVal =3D ExpressFalse; > + for (Index =3D 0; Index < ExpList->Count; Index++) { > + if (IsTrue (&ExpList->Expression[Index]->Result)) { > + switch (ExpList->Expression[Index]->Type) { > + case EFI_HII_EXPRESSION_SUPPRESS_IF: > + CompareOne =3D ExpressSuppress; > + break; > + > + case EFI_HII_EXPRESSION_GRAY_OUT_IF: > + CompareOne =3D ExpressGrayOut; > + break; > + > + case EFI_HII_EXPRESSION_DISABLE_IF: > + CompareOne =3D ExpressDisable; > + break; > + > + default: > + return ExpressFalse; > + } > + > + ReturnVal =3D ReturnVal < CompareOne ? CompareOne : ReturnVal; > + } > + } > + > + return ReturnVal; > +} > diff --git a/RedfishPkg/Library/HiiUtilityLib/HiiExpression.h > b/RedfishPkg/Library/HiiUtilityLib/HiiExpression.h > index e96c07b4de..25a3a44b48 100644 > --- a/RedfishPkg/Library/HiiUtilityLib/HiiExpression.h > +++ b/RedfishPkg/Library/HiiUtilityLib/HiiExpression.h > @@ -3,6 +3,7 @@ >=20 > Copyright (c) 2019, Intel Corporation. All rights reserved.
> (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserv= ed. >=20 > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -187,4 +188,26 @@ PopScope ( > OUT UINT8 *Operand > ); >=20 > +/** > + Return the result of the expression list. Check the expression list > +and > + return the highest priority express result. > + Priority: DisableIf > SuppressIf > GrayOutIf > FALSE > + > + @param ExpList The input expression list. > + @param Evaluate Whether need to evaluate the expression fi= rst. > + @param FormSet FormSet associated with this expression. > + @param Form Form associated with this expression. Same, [in,out] is miseed. > + > + @retval EXPRESS_RESULT Return the higher priority express result. > + DisableIf > SuppressIf > GrayOutIf > > + FALSE > + > +**/ > +EXPRESS_RESULT > +EvaluateExpressionList ( > + IN HII_EXPRESSION_LIST *ExpList, > + IN BOOLEAN Evaluate, > + IN HII_FORMSET *FormSet, OPTIONAL > + IN HII_FORM *Form OPTIONAL > + ); > + > #endif > diff --git a/RedfishPkg/Library/HiiUtilityLib/HiiUtilityInternal.c > b/RedfishPkg/Library/HiiUtilityLib/HiiUtilityInternal.c > index 55b78315d1..b4dd61f360 100644 > --- a/RedfishPkg/Library/HiiUtilityLib/HiiUtilityInternal.c > +++ b/RedfishPkg/Library/HiiUtilityLib/HiiUtilityInternal.c > @@ -3,6 +3,7 @@ >=20 > Copyright (c) 2019, Intel Corporation. All rights reserved.
> (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserv= ed. >=20 > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -5043,3 +5044,616 @@ Done: >=20 > return Status; > } > + > +/** > + Set value of a data element in an Array by its Index. > + > + @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. Same here. > + > +**/ > +VOID > +SetArrayData ( > + 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; > + } > +} > + > +/** > + Search an Option of a Question by its value. > + > + @param Question The Question > + @param OptionValue Value for Option to be searched. > + > + @retval Pointer Pointer to the found Option. > + @retval NULL Option not found. > + > +**/ > +HII_QUESTION_OPTION * > +ValueToOption ( > + IN HII_STATEMENT *Question, > + IN HII_STATEMENT_VALUE *OptionValue > + ) > +{ > + LIST_ENTRY *Link; > + HII_QUESTION_OPTION *Option; > + EFI_HII_VALUE Data1; > + EFI_HII_VALUE Data2; > + INTN Result; > + EFI_STATUS Status; > + > + Status =3D HiiStatementValueToHiiValue (OptionValue, &Data1); > + ASSERT_EFI_ERROR (Status); > + > + Link =3D GetFirstNode (&Question->OptionListHead); while (!IsNull > + (&Question->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + > + Status =3D HiiStatementValueToHiiValue (&Option->Value, &Data2); > + ASSERT_EFI_ERROR (Status); > + > + if ((CompareHiiValue (&Data1, &Data2, &Result, NULL) =3D=3D EFI_SUCC= ESS) && > (Result =3D=3D 0)) { > + // > + // Check the suppressif condition, only a valid option can be retu= rn. > + // > + if ((Option->SuppressExpression =3D=3D NULL) || > + ((EvaluateExpressionList (Option->SuppressExpression, FALSE, N= ULL, > NULL) =3D=3D ExpressFalse))) > + { The open curly bracket should be at the end of condition check one line abo= ve. Abner > + return Option; > + } > + } > + > + Link =3D GetNextNode (&Question->OptionListHead, Link); } > + > + return NULL; > +} > + > +/** > + Find the point in the ConfigResp string for this question. > + > + @param Question The question. > + @param ConfigResp Get ConfigResp string. Same here. Please check all @param in the new added function in this file. > + > + @retval point to the offset where is for this question. > + > +**/ > +CHAR16 * > +GetOffsetFromConfigResp ( > + IN HII_STATEMENT *Question, > + IN CHAR16 *ConfigResp > + ) > +{ > + CHAR16 *RequestElement; > + CHAR16 *BlockData; > + > + // > + // Type is EFI_HII_VARSTORE_NAME_VALUE. > + // > + if (Question->Storage->Type =3D=3D EFI_HII_VARSTORE_NAME_VALUE) { > + RequestElement =3D StrStr (ConfigResp, Question->VariableName); > + if (RequestElement !=3D NULL) { > + // > + // Skip the "VariableName=3D" field. > + // > + RequestElement +=3D StrLen (Question->VariableName) + 1; > + } > + > + return RequestElement; > + } > + > + // > + // Type is EFI_HII_VARSTORE_EFI_VARIABLE or > + EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER > + // > + > + // > + // Convert all hex digits in ConfigResp to lower case before searching= . > + // > + HiiToLower (ConfigResp); > + > + // > + // 1. Directly use Question->BlockName to find. > + // > + RequestElement =3D StrStr (ConfigResp, Question->BlockName); if > + (RequestElement !=3D NULL) { > + // > + // Skip the "Question->BlockName&VALUE=3D" field. > + // > + RequestElement +=3D StrLen (Question->BlockName) + StrLen (L"&VALUE= =3D"); > + return RequestElement; > + } > + > + // > + // 2. Change all hex digits in Question->BlockName to lower and compar= e > again. > + // > + BlockData =3D AllocateCopyPool (StrSize (Question->BlockName), > + Question->BlockName); ASSERT (BlockData !=3D NULL); HiiToLower > + (BlockData); RequestElement =3D StrStr (ConfigResp, BlockData); > + FreePool (BlockData); > + > + if (RequestElement !=3D NULL) { > + // > + // Skip the "Question->BlockName&VALUE=3D" field. > + // > + RequestElement +=3D StrLen (Question->BlockName) + StrLen > + (L"&VALUE=3D"); } > + > + return RequestElement; > +} > + > +/** > + Get Question default value from AltCfg string. > + > + @param FormSet The form set. > + @param Form The form > + @param Question The question. > + @param DefaultValue Default value. > + > + @retval EFI_SUCCESS Question is reset to default value. > + > +**/ > +EFI_STATUS > +GetDefaultValueFromAltCfg ( > + IN HII_FORMSET *FormSet, > + IN HII_FORM *Form, > + IN HII_STATEMENT *Question, > + OUT HII_STATEMENT_VALUE *DefaultValue > + ) > +{ > + HII_FORMSET_STORAGE *Storage; > + CHAR16 *ConfigResp; > + CHAR16 *Value; > + LIST_ENTRY *Link; > + HII_FORM_CONFIG_REQUEST *ConfigInfo; > + > + Storage =3D Question->Storage; > + if ((Storage =3D=3D NULL) || (Storage->Type =3D=3D EFI_HII_VARSTORE_EF= I_VARIABLE)) > { > + return EFI_NOT_FOUND; > + } > + > + // > + // Try to get AltCfg string from form. If not found it, then // try > + to get it from formset. > + // > + ConfigResp =3D NULL; > + Link =3D GetFirstNode (&Form->ConfigRequestHead); > + while (!IsNull (&Form->ConfigRequestHead, Link)) { > + ConfigInfo =3D HII_FORM_CONFIG_REQUEST_FROM_LINK (Link); > + Link =3D GetNextNode (&Form->ConfigRequestHead, Link); > + > + if (Storage =3D=3D ConfigInfo->Storage) { > + ConfigResp =3D ConfigInfo->ConfigAltResp; > + break; > + } > + } > + > + if (ConfigResp =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + Value =3D GetOffsetFromConfigResp (Question, ConfigResp); if (Value = =3D=3D > + NULL) { > + return EFI_NOT_FOUND; > + } > + > + return BufferToValue (Question, Value, DefaultValue); } > + > +/** > + Get default Id value used for browser. > + > + @param DefaultId The default id value used by hii. > + > + @retval Browser used default value. > + > +**/ > +INTN > +GetDefaultIdForCallBack ( > + UINTN DefaultId > + ) > +{ > + if (DefaultId =3D=3D EFI_HII_DEFAULT_CLASS_STANDARD) { > + return EFI_BROWSER_ACTION_DEFAULT_STANDARD; > + } else if (DefaultId =3D=3D EFI_HII_DEFAULT_CLASS_MANUFACTURING) { > + return EFI_BROWSER_ACTION_DEFAULT_MANUFACTURING; > + } else if (DefaultId =3D=3D EFI_HII_DEFAULT_CLASS_SAFE) { > + return EFI_BROWSER_ACTION_DEFAULT_SAFE; > + } else if ((DefaultId >=3D EFI_HII_DEFAULT_CLASS_PLATFORM_BEGIN) && > (DefaultId < EFI_HII_DEFAULT_CLASS_PLATFORM_BEGIN + 0x1000)) { > + return EFI_BROWSER_ACTION_DEFAULT_PLATFORM + DefaultId - > +EFI_HII_DEFAULT_CLASS_PLATFORM_BEGIN; > + } else if ((DefaultId >=3D EFI_HII_DEFAULT_CLASS_HARDWARE_BEGIN) && > (DefaultId < EFI_HII_DEFAULT_CLASS_HARDWARE_BEGIN + 0x1000)) { > + return EFI_BROWSER_ACTION_DEFAULT_HARDWARE + DefaultId - > +EFI_HII_DEFAULT_CLASS_HARDWARE_BEGIN; > + } else if ((DefaultId >=3D EFI_HII_DEFAULT_CLASS_FIRMWARE_BEGIN) && > (DefaultId < EFI_HII_DEFAULT_CLASS_FIRMWARE_BEGIN + 0x1000)) { > + return EFI_BROWSER_ACTION_DEFAULT_FIRMWARE + DefaultId - > +EFI_HII_DEFAULT_CLASS_FIRMWARE_BEGIN; > + } else { > + return -1; > + } > +} > + > +/** > + Get default value of question. > + > + @param FormSet The form set. > + @param Form The form. > + @param Question The question. > + @param DefaultId The Class of the default. > + @param DefaultValue The default value of given question. > + > + @retval EFI_SUCCESS Question is reset to default value. > + > +**/ > +EFI_STATUS > +GetQuestionDefault ( > + IN HII_FORMSET *FormSet, > + IN HII_FORM *Form, > + IN HII_STATEMENT *Question, > + IN UINT16 DefaultId, > + OUT HII_STATEMENT_VALUE *DefaultValue > + ) > +{ > + EFI_STATUS Status; > + LIST_ENTRY *Link; > + HII_QUESTION_DEFAULT *Default; > + HII_QUESTION_OPTION *Option; > + HII_STATEMENT_VALUE *HiiValue; > + UINT8 Index; > + EFI_STRING StrValue; > + EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess; > + EFI_BROWSER_ACTION_REQUEST ActionRequest; > + INTN Action; > + EFI_IFR_TYPE_VALUE *TypeValue; > + UINT16 OriginalDefaultId; > + HII_FORMSET_DEFAULTSTORE *DefaultStore; > + LIST_ENTRY *DefaultLink; > + > + if ((FormSet =3D=3D NULL) || (Form =3D=3D NULL) || (Question =3D=3D NU= LL) || > (DefaultValue =3D=3D NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status =3D EFI_NOT_FOUND; > + StrValue =3D NULL; > + OriginalDefaultId =3D DefaultId; > + DefaultLink =3D GetFirstNode (&FormSet->DefaultStoreListHead); > + > + // > + // Statement don't have storage, skip them // if > + (Question->QuestionId =3D=3D 0) { > + return Status; > + } > + > + // > + // There are Five ways to specify default value for a Question: > + // 1, use call back function (highest priority) > + // 2, use ExtractConfig function > + // 3, use nested EFI_IFR_DEFAULT > + // 4, set flags of EFI_ONE_OF_OPTION (provide Standard and > +Manufacturing default) > + // 5, set flags of EFI_IFR_CHECKBOX (provide Standard and > +Manufacturing default) (lowest priority) > + // > + CopyMem (DefaultValue, &Question->Value, sizeof > +(HII_STATEMENT_VALUE)); > +ReGetDefault: > + HiiValue =3D DefaultValue; > + TypeValue =3D &HiiValue->Value; > + if (HiiValue->Type =3D=3D EFI_IFR_TYPE_BUFFER) { > + // > + // For orderedlist, need to pass the BufferValue to Callback functio= n. > + // > + DefaultValue->BufferLen =3D Question->Value.BufferLen; > + DefaultValue->Buffer =3D AllocateZeroPool (DefaultValue->BufferLe= n); > + ASSERT (DefaultValue->Buffer !=3D NULL); > + if (DefaultValue->Buffer =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + TypeValue =3D (EFI_IFR_TYPE_VALUE *)DefaultValue->Buffer; } > + > + // > + // Get Question defaut value from call back function. > + // The string type of question cause HII driver to set string to its d= efault value. > + // So, we don't do this otherwise it will actually set question to def= ault value. > + // We only want to get default value of question. > + // > + if (HiiValue->Type !=3D EFI_IFR_TYPE_STRING) { > + ConfigAccess =3D FormSet->ConfigAccess; > + Action =3D GetDefaultIdForCallBack (DefaultId); > + if ((Action > 0) && ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBAC= K) !=3D > 0) && (ConfigAccess !=3D NULL)) { > + ActionRequest =3D EFI_BROWSER_ACTION_REQUEST_NONE; > + Status =3D ConfigAccess->Callback ( > + ConfigAccess, > + Action, > + Question->QuestionId, > + HiiValue->Type, > + TypeValue, > + &ActionRequest > + ); > + if (!EFI_ERROR (Status)) { > + return Status; > + } > + } > + } > + > + // > + // Get default value from altcfg string. > + // > + if (ConfigAccess !=3D NULL) { > + Status =3D GetDefaultValueFromAltCfg (FormSet, Form, Question, > DefaultValue); > + if (!EFI_ERROR (Status)) { > + return Status; > + } > + } > + > + // > + // EFI_IFR_DEFAULT has highest priority // if (!IsListEmpty > + (&Question->DefaultListHead)) { > + Link =3D GetFirstNode (&Question->DefaultListHead); > + while (!IsNull (&Question->DefaultListHead, Link)) { > + Default =3D HII_QUESTION_DEFAULT_FROM_LINK (Link); > + > + if (Default->DefaultId =3D=3D DefaultId) { > + if (Default->ValueExpression !=3D NULL) { > + // > + // Default is provided by an Expression, evaluate it > + // > + Status =3D EvaluateHiiExpression (FormSet, Form, Default- > >ValueExpression); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + if (Default->ValueExpression->Result.Type =3D=3D EFI_IFR_TYPE_= BUFFER) { > + ASSERT (HiiValue->Type =3D=3D EFI_IFR_TYPE_BUFFER && Default= Value- > >Buffer !=3D NULL); > + if (DefaultValue->BufferLen > Default->ValueExpression- > >Result.BufferLen) { > + CopyMem (DefaultValue->Buffer, Default->ValueExpression- > >Result.Buffer, Default->ValueExpression->Result.BufferLen); > + DefaultValue->BufferLen =3D Default->ValueExpression- > >Result.BufferLen; > + } else { > + CopyMem (DefaultValue->Buffer, Default->ValueExpression- > >Result.Buffer, DefaultValue->BufferLen); > + } > + > + FreePool (Default->ValueExpression->Result.Buffer); > + } > + > + HiiValue->Type =3D Default->ValueExpression->Result.Type; > + CopyMem (&HiiValue->Value, &Default->ValueExpression->Result.V= alue, > sizeof (EFI_IFR_TYPE_VALUE)); > + } else { > + // > + // Default value is embedded in EFI_IFR_DEFAULT > + // > + if (Default->Value.Type =3D=3D EFI_IFR_TYPE_BUFFER) { > + ASSERT (HiiValue->Buffer !=3D NULL); > + CopyMem (HiiValue->Buffer, Default->Value.Buffer, Default- > >Value.BufferLen); > + } else { > + CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE)); > + } > + } > + > + if (HiiValue->Type =3D=3D EFI_IFR_TYPE_STRING) { > + StrValue =3D HiiGetString (FormSet->HiiHandle, HiiValue->Value= .string, > NULL); > + if (StrValue =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + if (DefaultValue->BufferLen > StrSize (StrValue)) { > + ZeroMem (DefaultValue->Buffer, DefaultValue->BufferLen); > + CopyMem (DefaultValue->Buffer, StrValue, StrSize (StrValue))= ; > + } else { > + CopyMem (DefaultValue->Buffer, StrValue, DefaultValue->Buffe= rLen); > + } > + } > + > + return EFI_SUCCESS; > + } > + > + Link =3D GetNextNode (&Question->DefaultListHead, Link); > + } > + } > + > + // > + // EFI_ONE_OF_OPTION > + // > + if ((Question->Operand =3D=3D EFI_IFR_ONE_OF_OP) && !IsListEmpty (&Que= stion- > >OptionListHead)) { > + if (DefaultId <=3D EFI_HII_DEFAULT_CLASS_MANUFACTURING) { > + // > + // OneOfOption could only provide Standard and Manufacturing defau= lt > + // > + Link =3D GetFirstNode (&Question->OptionListHead); > + while (!IsNull (&Question->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + Link =3D GetNextNode (&Question->OptionListHead, Link); > + > + if ((Option->SuppressExpression !=3D NULL) && > + (EvaluateExpressionList (Option->SuppressExpression, FALSE, = NULL, > NULL) !=3D ExpressFalse)) > + { > + continue; > + } > + > + if (((DefaultId =3D=3D EFI_HII_DEFAULT_CLASS_STANDARD) && ((Opti= on->Flags > & EFI_IFR_OPTION_DEFAULT) !=3D 0)) || > + ((DefaultId =3D=3D EFI_HII_DEFAULT_CLASS_MANUFACTURING) && > ((Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG) !=3D 0)) > + ) > + { > + CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE)); > + > + return EFI_SUCCESS; > + } > + } > + } > + } > + > + // > + // EFI_IFR_CHECKBOX - lowest priority // if (Question->Operand =3D= =3D > + EFI_IFR_CHECKBOX_OP) { > + if (DefaultId <=3D EFI_HII_DEFAULT_CLASS_MANUFACTURING) { > + // > + // Checkbox could only provide Standard and Manufacturing default > + // > + if (((DefaultId =3D=3D EFI_HII_DEFAULT_CLASS_STANDARD) && ((Questi= on- > >ExtraData.Flags & EFI_IFR_CHECKBOX_DEFAULT) !=3D 0)) || > + ((DefaultId =3D=3D EFI_HII_DEFAULT_CLASS_MANUFACTURING) && > ((Question->ExtraData.Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) !=3D 0)) > + ) > + { > + HiiValue->Value.b =3D TRUE; > + } > + > + return EFI_SUCCESS; > + } > + } > + > + // > + // For question without default value for current default Id, we try t= o re-get > the default value form other default id in the DefaultStoreList. > + // If get, will exit the function, if not, will choose next default id= in the > DefaultStoreList. > + // The default id in DefaultStoreList are in ascending order to make s= ure > choose the smallest default id every time. > + // > + while (!IsNull (&FormSet->DefaultStoreListHead, DefaultLink)) { > + DefaultStore =3D HII_FORMSET_DEFAULTSTORE_FROM_LINK (DefaultLink); > + DefaultLink =3D GetNextNode (&FormSet->DefaultStoreListHead, Defaul= tLink); > + DefaultId =3D DefaultStore->DefaultId; > + if (DefaultId =3D=3D OriginalDefaultId) { > + continue; > + } > + > + goto ReGetDefault; > + } > + > + // > + // For Questions without default value for all the default id in the > DefaultStoreList. > + // > + Status =3D EFI_NOT_FOUND; > + switch (Question->Operand) { > + case EFI_IFR_CHECKBOX_OP: > + HiiValue->Value.b =3D FALSE; > + Status =3D EFI_SUCCESS; > + break; > + > + case EFI_IFR_NUMERIC_OP: > + // > + // Take minimum value as numeric default value > + // > + if ((Question->ExtraData.NumData.Flags & EFI_IFR_DISPLAY) =3D=3D 0= ) { > + // > + // In EFI_IFR_DISPLAY_INT_DEC type, should check value with int*= type. > + // > + switch (Question->ExtraData.NumData.Flags & EFI_IFR_NUMERIC_SIZE= ) { > + case EFI_IFR_NUMERIC_SIZE_1: > + if (((INT8)HiiValue->Value.u8 < (INT8)Question- > >ExtraData.NumData.Minimum) || ((INT8)HiiValue->Value.u8 > (INT8)Question= - > >ExtraData.NumData.Maximum)) { > + HiiValue->Value.u8 =3D (UINT8)Question->ExtraData.NumData.= Minimum; > + Status =3D EFI_SUCCESS; > + } > + > + break; > + case EFI_IFR_NUMERIC_SIZE_2: > + if (((INT16)HiiValue->Value.u16 < (INT16)Question- > >ExtraData.NumData.Minimum) || ((INT16)HiiValue->Value.u16 > > (INT16)Question->ExtraData.NumData.Maximum)) { > + HiiValue->Value.u16 =3D (UINT16)Question- > >ExtraData.NumData.Minimum; > + Status =3D EFI_SUCCESS; > + } > + > + break; > + case EFI_IFR_NUMERIC_SIZE_4: > + if (((INT32)HiiValue->Value.u32 < (INT32)Question- > >ExtraData.NumData.Minimum) || ((INT32)HiiValue->Value.u32 > > (INT32)Question->ExtraData.NumData.Maximum)) { > + HiiValue->Value.u32 =3D (UINT32)Question- > >ExtraData.NumData.Minimum; > + Status =3D EFI_SUCCESS; > + } > + > + break; > + case EFI_IFR_NUMERIC_SIZE_8: > + if (((INT64)HiiValue->Value.u64 < (INT64)Question- > >ExtraData.NumData.Minimum) || ((INT64)HiiValue->Value.u64 > > (INT64)Question->ExtraData.NumData.Maximum)) { > + HiiValue->Value.u64 =3D Question->ExtraData.NumData.Minimu= m; > + Status =3D EFI_SUCCESS; > + } > + > + break; > + default: > + break; > + } > + } else { > + if ((HiiValue->Value.u64 < Question->ExtraData.NumData.Minimum) = || > (HiiValue->Value.u64 > Question->ExtraData.NumData.Maximum)) { > + HiiValue->Value.u64 =3D Question->ExtraData.NumData.Minimum; > + Status =3D EFI_SUCCESS; > + } > + } > + > + break; > + > + case EFI_IFR_ONE_OF_OP: > + // > + // Take first oneof option as oneof's default value > + // > + if (ValueToOption (Question, HiiValue) =3D=3D NULL) { > + Link =3D GetFirstNode (&Question->OptionListHead); > + while (!IsNull (&Question->OptionListHead, Link)) { > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + Link =3D GetNextNode (&Question->OptionListHead, Link); > + > + if ((Option->SuppressExpression !=3D NULL) && > + (EvaluateExpressionList (Option->SuppressExpression, FALSE= , NULL, > NULL) !=3D ExpressFalse)) > + { > + continue; > + } > + > + CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE)); > + Status =3D EFI_SUCCESS; > + break; > + } > + } > + > + break; > + > + case EFI_IFR_ORDERED_LIST_OP: > + // > + // Take option sequence in IFR as ordered list's default value > + // > + Index =3D 0; > + Link =3D GetFirstNode (&Question->OptionListHead); > + while (!IsNull (&Question->OptionListHead, Link)) { > + Status =3D EFI_SUCCESS; > + Option =3D HII_QUESTION_OPTION_FROM_LINK (Link); > + Link =3D GetNextNode (&Question->OptionListHead, Link); > + > + if ((Option->SuppressExpression !=3D NULL) && > + (EvaluateExpressionList (Option->SuppressExpression, FALSE, = NULL, > NULL) !=3D ExpressFalse)) > + { > + continue; > + } > + > + SetArrayData (DefaultValue->Buffer, Question->Value.Type, > + Index, Option->Value.Value.u64); > + > + Index++; > + if (Index >=3D Question->ExtraData.OrderListData.MaxContainers) = { > + break; > + } > + } > + > + break; > + > + default: > + break; > + } > + > + return Status; > +} > -- > 2.38.1.windows.1