Date   

[PATCH v3 11/11] OvmfPkg/AmdSev: Enforce hash verification of kernel blobs

Dov Murik
 

In the AmdSevX64 build, use BlobVerifierLibSevHashes to enforce
verification of hashes of the kernel/initrd/cmdline blobs fetched from
firmware config.

This allows for secure (measured) boot of SEV guests with QEMU's
-kernel/-initrd/-append switches (with the corresponding QEMU support
for injecting the hashes table into initial measured guest memory).

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Ashish Kalra <ashish.kalra@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Min Xu <min.m.xu@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3457
Signed-off-by: Dov Murik <dovmurik@...>
---
OvmfPkg/AmdSev/AmdSevX64.dsc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc
index b2cc96cc5a97..c01599ea354f 100644
--- a/OvmfPkg/AmdSev/AmdSevX64.dsc
+++ b/OvmfPkg/AmdSev/AmdSevX64.dsc
@@ -173,7 +173,7 @@ [LibraryClasses]
LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf=0D
CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/Customize=
dDisplayLib.inf=0D
FrameBufferBltLib|MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltL=
ib.inf=0D
- BlobVerifierLib|OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf=
=0D
+ BlobVerifierLib|OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes=
.inf=0D
=0D
!if $(SOURCE_DEBUG_ENABLE) =3D=3D TRUE=0D
PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDeb=
ug/PeCoffExtraActionLibDebug.inf=0D
@@ -696,7 +696,7 @@ [Components]
}=0D
OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf {=0D
<LibraryClasses>=0D
- NULL|OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf=0D
+ NULL|OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes.inf=0D
}=0D
OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf=0D
OvmfPkg/Virtio10Dxe/Virtio10.inf=0D
--=20
2.25.1


[PATCH v3 10/11] OvmfPkg: add BlobVerifierLibSevHashes

Dov Murik
 

Add an implementation for BlobVerifierLib that locates the SEV hashes
table and verifies that the calculated hashes of the kernel, initrd, and
cmdline blobs indeed match the expected hashes stated in the hashes
table.

If there's a missing hash or a hash mismatch then EFI_ACCESS_DENIED is
returned which will cause a failure to load a kernel image.

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Ashish Kalra <ashish.kalra@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Min Xu <min.m.xu@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3457
Co-developed-by: James Bottomley <jejb@...>
Signed-off-by: James Bottomley <jejb@...>
Signed-off-by: Dov Murik <dovmurik@...>
---
OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes.inf | 37 ++++
OvmfPkg/Library/BlobVerifierLib/BlobVerifierSevHashes.c | 200 +++++++=
+++++++++++++
2 files changed, 237 insertions(+)

diff --git a/OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes.inf b=
/OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes.inf
new file mode 100644
index 000000000000..76ca0b8154ce
--- /dev/null
+++ b/OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes.inf
@@ -0,0 +1,37 @@
+## @file=0D
+#=0D
+# Blob verifier library that uses SEV hashes table. The hashes table hol=
ds the=0D
+# allowed hashes of the kernel, initrd, and cmdline blobs.=0D
+#=0D
+# Copyright (C) 2021, IBM Corp=0D
+#=0D
+# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+#=0D
+##=0D
+=0D
+[Defines]=0D
+ INF_VERSION =3D 1.29=0D
+ BASE_NAME =3D BlobVerifierLibSevHashes=0D
+ FILE_GUID =3D 59e713b5-eff3-46a7-8d8b-46f4c004ad7b=
=0D
+ MODULE_TYPE =3D BASE=0D
+ VERSION_STRING =3D 1.0=0D
+ LIBRARY_CLASS =3D BlobVerifierLib=0D
+ CONSTRUCTOR =3D BlobVerifierLibSevHashesConstructor=0D
+=0D
+[Sources]=0D
+ BlobVerifierSevHashes.c=0D
+=0D
+[Packages]=0D
+ CryptoPkg/CryptoPkg.dec=0D
+ MdePkg/MdePkg.dec=0D
+ OvmfPkg/OvmfPkg.dec=0D
+=0D
+[LibraryClasses]=0D
+ BaseCryptLib=0D
+ BaseMemoryLib=0D
+ DebugLib=0D
+ PcdLib=0D
+=0D
+[FixedPcd]=0D
+ gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase=0D
+ gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableSize=0D
diff --git a/OvmfPkg/Library/BlobVerifierLib/BlobVerifierSevHashes.c b/Ovmf=
Pkg/Library/BlobVerifierLib/BlobVerifierSevHashes.c
new file mode 100644
index 000000000000..797d63d18067
--- /dev/null
+++ b/OvmfPkg/Library/BlobVerifierLib/BlobVerifierSevHashes.c
@@ -0,0 +1,200 @@
+/** @file=0D
+=0D
+ Blob verifier library that uses SEV hashes table. The hashes table hold=
s the=0D
+ allowed hashes of the kernel, initrd, and cmdline blobs.=0D
+=0D
+ Copyright (C) 2021, IBM Corporation=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+**/=0D
+=0D
+#include <Library/BaseCryptLib.h>=0D
+#include <Library/BaseLib.h>=0D
+#include <Library/BaseMemoryLib.h>=0D
+#include <Library/DebugLib.h>=0D
+#include <Library/BlobVerifierLib.h>=0D
+=0D
+/**=0D
+ The SEV Hashes table must be in encrypted memory and has the table=0D
+ and its entries described by=0D
+=0D
+ <GUID>|UINT16 <len>|<data>=0D
+=0D
+ With the whole table GUID being 9438d606-4f22-4cc9-b479-a793d411fd21=0D
+=0D
+ The current possible table entries are for the kernel, the initrd=0D
+ and the cmdline:=0D
+=0D
+ 4de79437-abd2-427f-b835-d5b172d2045b kernel=0D
+ 44baf731-3a2f-4bd7-9af1-41e29169781d initrd=0D
+ 97d02dd8-bd20-4c94-aa78-e7714d36ab2a cmdline=0D
+=0D
+ The size of the entry is used to identify the hash, but the=0D
+ expectation is that it will be 32 bytes of SHA-256.=0D
+**/=0D
+=0D
+#define SEV_HASH_TABLE_GUID \=0D
+ (GUID) { 0x9438d606, 0x4f22, 0x4cc9, { 0xb4, 0x79, 0xa7, 0x93, 0xd4, 0x1=
1, 0xfd, 0x21 } }=0D
+#define SEV_KERNEL_HASH_GUID \=0D
+ (GUID) { 0x4de79437, 0xabd2, 0x427f, { 0xb8, 0x35, 0xd5, 0xb1, 0x72, 0xd=
2, 0x04, 0x5b } }=0D
+#define SEV_INITRD_HASH_GUID \=0D
+ (GUID) { 0x44baf731, 0x3a2f, 0x4bd7, { 0x9a, 0xf1, 0x41, 0xe2, 0x91, 0x6=
9, 0x78, 0x1d } }=0D
+#define SEV_CMDLINE_HASH_GUID \=0D
+ (GUID) { 0x97d02dd8, 0xbd20, 0x4c94, { 0xaa, 0x78, 0xe7, 0x71, 0x4d, 0x3=
6, 0xab, 0x2a } }=0D
+=0D
+STATIC CONST EFI_GUID mSevKernelHashGuid =3D SEV_KERNEL_HASH_GUID;=0D
+STATIC CONST EFI_GUID mSevInitrdHashGuid =3D SEV_INITRD_HASH_GUID;=0D
+STATIC CONST EFI_GUID mSevCmdlineHashGuid =3D SEV_CMDLINE_HASH_GUID;=0D
+=0D
+#pragma pack (1)=0D
+typedef struct {=0D
+ GUID Guid;=0D
+ UINT16 Len;=0D
+ UINT8 Data[];=0D
+} HASH_TABLE;=0D
+#pragma pack ()=0D
+=0D
+STATIC HASH_TABLE *mHashesTable;=0D
+STATIC UINT16 mHashesTableSize;=0D
+=0D
+STATIC=0D
+CONST GUID*=0D
+FindBlobEntryGuid (=0D
+ IN CONST CHAR16 *BlobName=0D
+ )=0D
+{=0D
+ if (StrCmp (BlobName, L"kernel") =3D=3D 0) {=0D
+ return &mSevKernelHashGuid;=0D
+ } else if (StrCmp (BlobName, L"initrd") =3D=3D 0) {=0D
+ return &mSevInitrdHashGuid;=0D
+ } else if (StrCmp (BlobName, L"cmdline") =3D=3D 0) {=0D
+ return &mSevCmdlineHashGuid;=0D
+ } else {=0D
+ return NULL;=0D
+ }=0D
+}=0D
+=0D
+/**=0D
+ Verify blob from an external source.=0D
+=0D
+ @param[in] BlobName The name of the blob=0D
+ @param[in] Buf The data of the blob=0D
+ @param[in] BufSize The size of the blob in bytes=0D
+=0D
+ @retval EFI_SUCCESS The blob was verified successfully.=0D
+ @retval EFI_ACCESS_DENIED The blob could not be verified, and theref=
ore=0D
+ should be considered non-secure.=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+VerifyBlob (=0D
+ IN CONST CHAR16 *BlobName,=0D
+ IN CONST VOID *Buf,=0D
+ IN UINT32 BufSize=0D
+ )=0D
+{=0D
+ CONST GUID *Guid;=0D
+ INT32 Len;=0D
+ HASH_TABLE *Entry;=0D
+=0D
+ if (mHashesTable =3D=3D NULL || mHashesTableSize =3D=3D 0) {=0D
+ DEBUG ((DEBUG_ERROR,=0D
+ "%a: Verifier called but no hashes table discoverd in MEMFD\n",=0D
+ __FUNCTION__));=0D
+ return EFI_ACCESS_DENIED;=0D
+ }=0D
+=0D
+ Guid =3D FindBlobEntryGuid (BlobName);=0D
+ if (Guid =3D=3D NULL) {=0D
+ DEBUG ((DEBUG_ERROR, "%a: Unknown blob name \"%s\"\n", __FUNCTION__,=0D
+ BlobName));=0D
+ return EFI_ACCESS_DENIED;=0D
+ }=0D
+=0D
+ for (Entry =3D mHashesTable, Len =3D 0;=0D
+ Len < (INT32)mHashesTableSize;=0D
+ Len +=3D Entry->Len,=0D
+ Entry =3D (HASH_TABLE *)((UINT8 *)Entry + Entry->Len)) {=0D
+ UINTN EntrySize;=0D
+ EFI_STATUS Status;=0D
+ UINT8 Hash[SHA256_DIGEST_SIZE];=0D
+=0D
+ if (!CompareGuid (&Entry->Guid, Guid)) {=0D
+ continue;=0D
+ }=0D
+=0D
+ DEBUG ((DEBUG_INFO, "%a: Found GUID %g in table\n", __FUNCTION__, Guid=
));=0D
+=0D
+ EntrySize =3D Entry->Len - sizeof (Entry->Guid) - sizeof (Entry->Len);=
=0D
+ if (EntrySize !=3D SHA256_DIGEST_SIZE) {=0D
+ DEBUG ((DEBUG_ERROR, "%a: Hash has the wrong size %d !=3D %d\n",=0D
+ __FUNCTION__, EntrySize, SHA256_DIGEST_SIZE));=0D
+ return EFI_ACCESS_DENIED;=0D
+ }=0D
+=0D
+ //=0D
+ // Calculate the buffer's hash and verify that it is identical to the=
=0D
+ // expected hash table entry=0D
+ //=0D
+ Sha256HashAll (Buf, BufSize, Hash);=0D
+=0D
+ if (CompareMem (Entry->Data, Hash, EntrySize) =3D=3D 0) {=0D
+ Status =3D EFI_SUCCESS;=0D
+ DEBUG ((DEBUG_INFO, "%a: Hash comparison succeeded for \"%s\"\n",=0D
+ __FUNCTION__, BlobName));=0D
+ } else {=0D
+ Status =3D EFI_ACCESS_DENIED;=0D
+ DEBUG ((DEBUG_ERROR, "%a: Hash comparison failed for \"%s\"\n",=0D
+ __FUNCTION__, BlobName));=0D
+ }=0D
+ return Status;=0D
+ }=0D
+=0D
+ DEBUG ((DEBUG_ERROR, "%a: Hash GUID %g not found in table\n", __FUNCTION=
__,=0D
+ Guid));=0D
+ return EFI_ACCESS_DENIED;=0D
+}=0D
+=0D
+/**=0D
+ Locate the SEV hashes table.=0D
+=0D
+ This function always returns success, even if the table can't be found. =
The=0D
+ subsequent VerifyBlob calls will fail if no table was found.=0D
+=0D
+ @retval RETURN_SUCCESS The verifier tables were set up correctly=0D
+**/=0D
+RETURN_STATUS=0D
+EFIAPI=0D
+BlobVerifierLibSevHashesConstructor (=0D
+ VOID=0D
+ )=0D
+{=0D
+ HASH_TABLE *Ptr =3D (void *)(UINTN)FixedPcdGet64 (PcdQemuHashTableBase);=
=0D
+ UINT32 Size =3D FixedPcdGet32 (PcdQemuHashTableSize);=0D
+=0D
+ mHashesTable =3D NULL;=0D
+ mHashesTableSize =3D 0;=0D
+=0D
+ if (Ptr =3D=3D NULL || Size =3D=3D 0) {=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ if (!CompareGuid (&Ptr->Guid, &SEV_HASH_TABLE_GUID)) {=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ if (Ptr->Len < (sizeof Ptr->Guid + sizeof Ptr->Len)) {=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ DEBUG ((DEBUG_INFO, "%a: Found injected hashes table in secure location\=
n",=0D
+ __FUNCTION__));=0D
+=0D
+ mHashesTable =3D (HASH_TABLE *)Ptr->Data;=0D
+ mHashesTableSize =3D Ptr->Len - sizeof Ptr->Guid - sizeof Ptr->Len;=0D
+=0D
+ DEBUG ((DEBUG_VERBOSE, "%a: mHashesTable=3D0x%p, Size=3D%u\n", __FUNCTIO=
N__,=0D
+ mHashesTable, mHashesTableSize));=0D
+=0D
+ return RETURN_SUCCESS;=0D
+}=0D
--=20
2.25.1


[PATCH v3 09/11] OvmfPkg/AmdSev: reserve MEMFD space for for firmware config hashes

Dov Murik
 

From: James Bottomley <jejb@...>

Split the existing 4KB page reserved for SEV launch secrets into two
parts: first 3KB for SEV launch secrets and last 1KB for firmware
config hashes.

The area of the firmware config hashes will be attested (measured) by
the PSP and thus the untrusted VMM can't pass in different files from
what the guest owner allows.

Declare this in the Reset Vector table using GUID
7255371f-3a3b-4b04-927b-1da6efa8d454 and a uint32_t table of a base
and size value (similar to the structure used to declare the launch
secret block).

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Ashish Kalra <ashish.kalra@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Min Xu <min.m.xu@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3457
Co-developed-by: Dov Murik <dovmurik@...>
Signed-off-by: Dov Murik <dovmurik@...>
Signed-off-by: James Bottomley <jejb@...>
Reviewed-by: Tom Lendacky <thomas.lendacky@...>
---
OvmfPkg/OvmfPkg.dec | 6 ++++++
OvmfPkg/AmdSev/AmdSevX64.fdf | 5 ++++-
OvmfPkg/ResetVector/ResetVector.inf | 2 ++
OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm | 20 ++++++++++++++++++++
OvmfPkg/ResetVector/ResetVector.nasmb | 2 ++
5 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index f82228d69cc2..2ab27f0c73c2 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -324,6 +324,12 @@ [PcdsFixedAtBuild]
gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretBase|0x0|UINT32|0x42=0D
gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretSize|0x0|UINT32|0x43=0D
=0D
+ ## The base address and size of a hash table confirming allowed=0D
+ # parameters to be passed in via the Qemu firmware configuration=0D
+ # device=0D
+ gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase|0x0|UINT32|0x47=0D
+ gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableSize|0x0|UINT32|0x48=0D
+=0D
[PcdsDynamic, PcdsDynamicEx]=0D
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2=0D
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x1=
0=0D
diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf
index 9977b0f00a18..0a89749700c3 100644
--- a/OvmfPkg/AmdSev/AmdSevX64.fdf
+++ b/OvmfPkg/AmdSev/AmdSevX64.fdf
@@ -59,9 +59,12 @@ [FD.MEMFD]
0x00B000|0x001000=0D
gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase|gUefiCpuPkgTokenSpaceGuid.P=
cdSevEsWorkAreaSize=0D
=0D
-0x00C000|0x001000=0D
+0x00C000|0x000C00=0D
gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretBase|gUefiOvmfPkgTokenSpaceGu=
id.PcdSevLaunchSecretSize=0D
=0D
+0x00CC00|0x000400=0D
+gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase|gUefiOvmfPkgTokenSpaceGuid=
.PcdQemuHashTableSize=0D
+=0D
0x00D000|0x001000=0D
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpace=
Guid.PcdOvmfSecGhcbBackupSize=0D
=0D
diff --git a/OvmfPkg/ResetVector/ResetVector.inf b/OvmfPkg/ResetVector/Rese=
tVector.inf
index dc38f68919cd..d028c92d8cfa 100644
--- a/OvmfPkg/ResetVector/ResetVector.inf
+++ b/OvmfPkg/ResetVector/ResetVector.inf
@@ -47,3 +47,5 @@ [Pcd]
[FixedPcd]=0D
gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretBase=0D
gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretSize=0D
+ gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase=0D
+ gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableSize=0D
diff --git a/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm b/OvmfPkg/ResetVe=
ctor/Ia16/ResetVectorVtf0.asm
index 9c0b5853a46f..7ec3c6e980c3 100644
--- a/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm
+++ b/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm
@@ -47,7 +47,27 @@ TIMES (15 - ((guidedStructureEnd - guidedStructureStart =
+ 15) % 16)) DB 0
;=0D
guidedStructureStart:=0D
=0D
+; SEV Hash Table Block=0D
;=0D
+; This describes the guest ram area where the hypervisor should=0D
+; install a table describing the hashes of certain firmware configuration=
=0D
+; device files that would otherwise be passed in unchecked. The current=0D
+; use is for the kernel, initrd and command line values, but others may be=
=0D
+; added. The data format is:=0D
+;=0D
+; base physical address (32 bit word)=0D
+; table length (32 bit word)=0D
+;=0D
+; GUID (SEV FW config hash block): 7255371f-3a3b-4b04-927b-1da6efa8d454=0D
+;=0D
+sevFwHashBlockStart:=0D
+ DD SEV_FW_HASH_BLOCK_BASE=0D
+ DD SEV_FW_HASH_BLOCK_SIZE=0D
+ DW sevFwHashBlockEnd - sevFwHashBlockStart=0D
+ DB 0x1f, 0x37, 0x55, 0x72, 0x3b, 0x3a, 0x04, 0x4b=0D
+ DB 0x92, 0x7b, 0x1d, 0xa6, 0xef, 0xa8, 0xd4, 0x54=0D
+sevFwHashBlockEnd:=0D
+=0D
; SEV Secret block=0D
;=0D
; This describes the guest ram area where the hypervisor should=0D
diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/Re=
setVector.nasmb
index 5fbacaed5f9d..8d0bab02f8cb 100644
--- a/OvmfPkg/ResetVector/ResetVector.nasmb
+++ b/OvmfPkg/ResetVector/ResetVector.nasmb
@@ -88,5 +88,7 @@
%define SEV_ES_AP_RESET_IP FixedPcdGet32 (PcdSevEsWorkAreaBase)=0D
%define SEV_LAUNCH_SECRET_BASE FixedPcdGet32 (PcdSevLaunchSecretBase)=0D
%define SEV_LAUNCH_SECRET_SIZE FixedPcdGet32 (PcdSevLaunchSecretSize)=0D
+ %define SEV_FW_HASH_BLOCK_BASE FixedPcdGet32 (PcdQemuHashTableBase)=0D
+ %define SEV_FW_HASH_BLOCK_SIZE FixedPcdGet32 (PcdQemuHashTableSize)=0D
%include "Ia16/ResetVectorVtf0.asm"=0D
=0D
--=20
2.25.1


[PATCH v3 06/11] ArmVirtPkg: add BlobVerifierLibNull to DSC

Dov Murik
 

This prepares the ground for calling VerifyBlob() in
QemuKernelLoaderFsDxe.

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Leif Lindholm <leif@...>
Cc: Sami Mujawar <sami.mujawar@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Ashish Kalra <ashish.kalra@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Min Xu <min.m.xu@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3457
Signed-off-by: Dov Murik <dovmurik@...>
---
ArmVirtPkg/ArmVirtQemu.dsc | 5 ++++-
ArmVirtPkg/ArmVirtQemuKernel.dsc | 5 ++++-
2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
index 7ef5e7297bc7..bf8bb1ec9578 100644
--- a/ArmVirtPkg/ArmVirtQemu.dsc
+++ b/ArmVirtPkg/ArmVirtQemu.dsc
@@ -440,7 +440,10 @@ [Components.common]
NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf=0D
NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanc=
eManagerUiLib.inf=0D
}=0D
- OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf=0D
+ OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf {=0D
+ <LibraryClasses>=0D
+ NULL|OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf=0D
+ }=0D
=0D
#=0D
# Networking stack=0D
diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKerne=
l.dsc
index a542fcb157e9..af34cb47a12d 100644
--- a/ArmVirtPkg/ArmVirtQemuKernel.dsc
+++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc
@@ -376,7 +376,10 @@ [Components.common]
NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf=0D
NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanc=
eManagerUiLib.inf=0D
}=0D
- OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf=0D
+ OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf {=0D
+ <LibraryClasses>=0D
+ NULL|OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf=0D
+ }=0D
=0D
#=0D
# Networking stack=0D
--=20
2.25.1


[PATCH v3 04/11] OvmfPkg: add library class BlobVerifierLib with null implementation

Dov Murik
 

BlobVerifierLib will be used to verify blobs fetching them from QEMU's
firmware config (fw_cfg) in platforms that enable such verification.

The null implementation BlobVerifierLibNull treats all blobs as valid.

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Ashish Kalra <ashish.kalra@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Min Xu <min.m.xu@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3457
Signed-off-by: Dov Murik <dovmurik@...>
---
OvmfPkg/OvmfPkg.dec | 3 ++
OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf | 24 +++++++++++++
OvmfPkg/Include/Library/BlobVerifierLib.h | 38 +++++++++++++=
+++++++
OvmfPkg/Library/BlobVerifierLib/BlobVerifierNull.c | 33 +++++++++++++=
++++
4 files changed, 98 insertions(+)

diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index 6ae733f6e39f..f82228d69cc2 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -23,6 +23,9 @@ [LibraryClasses]
## @libraryclass Access bhyve's firmware control interface.=0D
BhyveFwCtlLib|Include/Library/BhyveFwCtlLib.h=0D
=0D
+ ## @libraryclass Verify blobs read from the VMM=0D
+ BlobVerifierLib|Include/Library/BlobVerifierLib.h=0D
+=0D
## @libraryclass Loads and boots a Linux kernel image=0D
#=0D
LoadLinuxLib|Include/Library/LoadLinuxLib.h=0D
diff --git a/OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf b/Ovmf=
Pkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf
new file mode 100644
index 000000000000..850d398e65a4
--- /dev/null
+++ b/OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf
@@ -0,0 +1,24 @@
+## @file=0D
+#=0D
+# Null implementation of the blob verifier library.=0D
+#=0D
+# Copyright (C) 2021, IBM Corp=0D
+#=0D
+# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+#=0D
+##=0D
+=0D
+[Defines]=0D
+ INF_VERSION =3D 1.29=0D
+ BASE_NAME =3D BlobVerifierLibNull=0D
+ FILE_GUID =3D b1b5533e-e01a-43bb-9e54-414f00ca036e=
=0D
+ MODULE_TYPE =3D BASE=0D
+ VERSION_STRING =3D 1.0=0D
+ LIBRARY_CLASS =3D BlobVerifierLib=0D
+=0D
+[Sources]=0D
+ BlobVerifierNull.c=0D
+=0D
+[Packages]=0D
+ MdePkg/MdePkg.dec=0D
+ OvmfPkg/OvmfPkg.dec=0D
diff --git a/OvmfPkg/Include/Library/BlobVerifierLib.h b/OvmfPkg/Include/Li=
brary/BlobVerifierLib.h
new file mode 100644
index 000000000000..db122684f76c
--- /dev/null
+++ b/OvmfPkg/Include/Library/BlobVerifierLib.h
@@ -0,0 +1,38 @@
+/** @file=0D
+=0D
+ Blob verification library=0D
+=0D
+ This library class allows verifiying whether blobs from external sources=
=0D
+ (such as QEMU's firmware config) are trusted.=0D
+=0D
+ Copyright (C) 2021, IBM Corporation=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+**/=0D
+=0D
+#ifndef BLOB_VERIFIER_LIB_H__=0D
+#define BLOB_VERIFIER_LIB_H__=0D
+=0D
+#include <Uefi/UefiBaseType.h>=0D
+#include <Base.h>=0D
+=0D
+/**=0D
+ Verify blob from an external source.=0D
+=0D
+ @param[in] BlobName The name of the blob=0D
+ @param[in] Buf The data of the blob=0D
+ @param[in] BufSize The size of the blob in bytes=0D
+=0D
+ @retval EFI_SUCCESS The blob was verified successfully.=0D
+ @retval EFI_ACCESS_DENIED The blob could not be verified, and theref=
ore=0D
+ should be considered non-secure.=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+VerifyBlob (=0D
+ IN CONST CHAR16 *BlobName,=0D
+ IN CONST VOID *Buf,=0D
+ IN UINT32 BufSize=0D
+ );=0D
+=0D
+#endif=0D
diff --git a/OvmfPkg/Library/BlobVerifierLib/BlobVerifierNull.c b/OvmfPkg/L=
ibrary/BlobVerifierLib/BlobVerifierNull.c
new file mode 100644
index 000000000000..975d4dd52f80
--- /dev/null
+++ b/OvmfPkg/Library/BlobVerifierLib/BlobVerifierNull.c
@@ -0,0 +1,33 @@
+/** @file=0D
+=0D
+ Null implementation of the blob verifier library.=0D
+=0D
+ Copyright (C) 2021, IBM Corporation=0D
+=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+**/=0D
+=0D
+#include <Library/BaseLib.h>=0D
+#include <Library/BlobVerifierLib.h>=0D
+=0D
+/**=0D
+ Verify blob from an external source.=0D
+=0D
+ @param[in] BlobName The name of the blob=0D
+ @param[in] Buf The data of the blob=0D
+ @param[in] BufSize The size of the blob in bytes=0D
+=0D
+ @retval EFI_SUCCESS The blob was verified successfully.=0D
+ @retval EFI_ACCESS_DENIED The blob could not be verified, and theref=
ore=0D
+ should be considered non-secure.=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+VerifyBlob (=0D
+ IN CONST CHAR16 *BlobName,=0D
+ IN CONST VOID *Buf,=0D
+ IN UINT32 BufSize=0D
+ )=0D
+{=0D
+ return EFI_SUCCESS;=0D
+}=0D
--=20
2.25.1


[PATCH v3 01/11] OvmfPkg/AmdSev/SecretDxe: fix header comment to generic naming

Dov Murik
 

From: James Bottomley <jejb@...>

Commit 96201ae7bf97 ("OvmfPkg/AmdSev/SecretDxe: make secret location
naming generic", 2020-12-15) replaced references to SEV with the generic
term Confidential Computing, but missed the file header comment. Fix
the naming in that header.

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Ashish Kalra <ashish.kalra@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Min Xu <min.m.xu@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3457
Signed-off-by: James Bottomley <jejb@...>
Reviewed-by: Brijesh Singh <brijesh.singh@...>
---
OvmfPkg/AmdSev/SecretDxe/SecretDxe.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/OvmfPkg/AmdSev/SecretDxe/SecretDxe.c b/OvmfPkg/AmdSev/SecretDx=
e/SecretDxe.c
index 308022b5b25e..934ad207632b 100644
--- a/OvmfPkg/AmdSev/SecretDxe/SecretDxe.c
+++ b/OvmfPkg/AmdSev/SecretDxe/SecretDxe.c
@@ -1,5 +1,5 @@
/** @file=0D
- SEV Secret configuration table constructor=0D
+ Confidential Computing Secret configuration table constructor=0D
=0D
Copyright (C) 2020 James Bottomley, IBM Corporation.=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
--=20
2.25.1


[PATCH v3 00/11] Measured SEV boot with kernel/initrd/cmdline

Dov Murik
 

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3457

Booting with SEV prevented the loading of kernel, initrd, and kernel
command-line via QEMU fw_cfg interface because they arrive from the VMM
which is untrusted in SEV.

However, in some cases the kernel, initrd, and cmdline are not secret
but should not be modified by the host. In such a case, we want to
verify inside the trusted VM that the kernel, initrd, and cmdline are
indeed the ones expected by the Guest Owner, and only if that is the
case go on and boot them up (removing the need for grub inside OVMF in
that mode).

This patch series reserves an area in MEMFD (previously the last 1KB of
the launch secret page) which will contain the hashes of these three
blobs (kernel, initrd, cmdline), each under its own GUID entry. This
tables of hashes is populated by QEMU before launch, and encrypted as
part of the initial VM memory; this makes sure these hashes are part of
the SEV measurement (which has to be approved by the Guest Owner for
secret injection, for example). Note that populating the hashes table
requires QEMU support [1].

OVMF parses the table of hashes populated by QEMU (patch 10), and as it
reads the fw_cfg blobs from QEMU, it will verify each one against the
expected hash. This is all done inside the trusted VM context. If all
the hashes are correct, boot of the kernel is allowed to continue.

Any attempt by QEMU to modify the kernel, initrd, cmdline (including
dropping one of them), or to modify the OVMF code that verifies those
hashes, will cause the initial SEV measurement to change and therefore
will be detectable by the Guest Owner during launch before secret
injection.

Relevant part of OVMF serial log during boot with AmdSevX86 build and
QEMU with -kernel/-initrd/-append:

...
BlobVerifierLibSevHashesConstructor: Found injected hashes table in secure location
Select Item: 0x17
Select Item: 0x8
FetchBlob: loading 7379328 bytes for "kernel"
Select Item: 0x18
Select Item: 0x11
VerifyBlob: Found GUID 4DE79437-ABD2-427F-B835-D5B172D2045B in table
VerifyBlob: Hash comparison succeeded for "kernel"
Select Item: 0xB
FetchBlob: loading 12483878 bytes for "initrd"
Select Item: 0x12
VerifyBlob: Found GUID 44BAF731-3A2F-4BD7-9AF1-41E29169781D in table
VerifyBlob: Hash comparison succeeded for "initrd"
Select Item: 0x14
FetchBlob: loading 86 bytes for "cmdline"
Select Item: 0x15
VerifyBlob: Found GUID 97D02DD8-BD20-4C94-AA78-E7714D36AB2A in table
VerifyBlob: Hash comparison succeeded for "cmdline"
...

The patch series is organized as follows:

1: Simple comment fix in adjacent area in the code.
2: Use GenericQemuLoadImageLib to gain one location for fw_cfg blob
fetching.
3: Allow the (previously blocked) usage of -kernel in AmdSevX64.
4-7: Add BlobVerifierLib with null implementation and use it in the correct
location in QemuKernelLoaderFsDxe.
8-9: Reserve memory for hashes table, declare this area in the reset vector.
10-11: Add the secure implementation BlobVerifierLibSevHashes and use it in
AmdSevX64 builds.

[1] https://lore.kernel.org/qemu-devel/20210624102040.2015280-1-dovmurik@linux.ibm.com/

Code is at
https://github.com/confidential-containers-demo/edk2/tree/sev-hashes-v3

v3 changes:
- Rename to BlobVerifierLibNull, use decimal INF_VERSION, remove unused
DebugLib reference, fix doxygen comments, add missing IN attribute
- Rename to BlobVerifierLibSevHashes, use decimal INF_VERSION, fix
doxygen comments, add missing IN attribute,
calculate buffer hash only when the guid is found in hashes table
- SecretPei: use ALIGN_VALUE to round the hob size
- Coding style fixes
- Add missing 'Ref:' in patch 1 commit message
- Fix phrasing and typos in commit messages
- Remove Cc: Laszlo from series

v2: https://edk2.groups.io/g/devel/message/77505
v2 changes:
- Use the last 1KB of the existing SEV launch secret page for hashes table
(instead of reserving a whole new MEMFD page).
- Build on top of commit cf203024745f ("OvmfPkg/GenericQemuLoadImageLib: Read
cmdline from QemuKernelLoaderFs", 2021-06-28) to have a single location in
which all of kernel/initrd/cmdline are fetched from QEMU.
- Use static linking of the two BlobVerifierLib implemenatations.
- Reorganize series.

v1: https://edk2.groups.io/g/devel/message/75567

Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Jordan Justen <jordan.l.justen@...>
Cc: Ashish Kalra <ashish.kalra@...>
Cc: Brijesh Singh <brijesh.singh@...>
Cc: Erdem Aktas <erdemaktas@...>
Cc: James Bottomley <jejb@...>
Cc: Jiewen Yao <jiewen.yao@...>
Cc: Min Xu <min.m.xu@...>
Cc: Tom Lendacky <thomas.lendacky@...>
Cc: Leif Lindholm <leif@...>
Cc: Sami Mujawar <sami.mujawar@...>

Dov Murik (8):
OvmfPkg/AmdSev: use GenericQemuLoadImageLib in AmdSev builds
OvmfPkg: add library class BlobVerifierLib with null implementation
OvmfPkg: add BlobVerifierLibNull to DSC
ArmVirtPkg: add BlobVerifierLibNull to DSC
OvmfPkg/QemuKernelLoaderFsDxe: call VerifyBlob after fetch from fw_cfg
OvmfPkg/AmdSev/SecretPei: build hob for full page
OvmfPkg: add BlobVerifierLibSevHashes
OvmfPkg/AmdSev: Enforce hash verification of kernel blobs

James Bottomley (3):
OvmfPkg/AmdSev/SecretDxe: fix header comment to generic naming
OvmfPkg: PlatformBootManagerLibGrub: Allow executing kernel via fw_cfg
OvmfPkg/AmdSev: reserve MEMFD space for for firmware config hashes

OvmfPkg/OvmfPkg.dec | 9 +
ArmVirtPkg/ArmVirtQemu.dsc | 5 +-
ArmVirtPkg/ArmVirtQemuKernel.dsc | 5 +-
OvmfPkg/AmdSev/AmdSevX64.dsc | 9 +-
OvmfPkg/OvmfPkgIa32.dsc | 5 +-
OvmfPkg/OvmfPkgIa32X64.dsc | 5 +-
OvmfPkg/OvmfPkgX64.dsc | 5 +-
OvmfPkg/AmdSev/AmdSevX64.fdf | 5 +-
OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf | 24 +++
OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes.inf | 37 ++++
OvmfPkg/Library/PlatformBootManagerLibGrub/PlatformBootManagerLibGrub.inf | 2 +
OvmfPkg/ResetVector/ResetVector.inf | 2 +
OvmfPkg/Include/Library/BlobVerifierLib.h | 38 ++++
OvmfPkg/Library/PlatformBootManagerLibGrub/BdsPlatform.h | 11 ++
OvmfPkg/AmdSev/SecretDxe/SecretDxe.c | 2 +-
OvmfPkg/AmdSev/SecretPei/SecretPei.c | 3 +-
OvmfPkg/Library/BlobVerifierLib/BlobVerifierNull.c | 33 ++++
OvmfPkg/Library/BlobVerifierLib/BlobVerifierSevHashes.c | 200 ++++++++++++++++++++
OvmfPkg/Library/PlatformBootManagerLibGrub/BdsPlatform.c | 5 +
OvmfPkg/Library/{PlatformBootManagerLib => PlatformBootManagerLibGrub}/QemuKernel.c | 0
OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c | 9 +
OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm | 20 ++
OvmfPkg/ResetVector/ResetVector.nasmb | 2 +
23 files changed, 426 insertions(+), 10 deletions(-)
create mode 100644 OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibNull.inf
create mode 100644 OvmfPkg/Library/BlobVerifierLib/BlobVerifierLibSevHashes.inf
create mode 100644 OvmfPkg/Include/Library/BlobVerifierLib.h
create mode 100644 OvmfPkg/Library/BlobVerifierLib/BlobVerifierNull.c
create mode 100644 OvmfPkg/Library/BlobVerifierLib/BlobVerifierSevHashes.c
copy OvmfPkg/Library/{PlatformBootManagerLib => PlatformBootManagerLibGrub}/QemuKernel.c (100%)

--
2.25.1


Re: [PATCH v4 5/5] StandaloneMmPkg: build for 32bit arm machines

Ard Biesheuvel
 

On Tue, 20 Jul 2021 at 04:01, gaoliming <gaoliming@...> wrote:

Hi, all
This patch set has passed code review. How about merge it for this stable tag edk2 202108?
OK, I will pick these up. Would you mind creating the entry for the
release notes?


Thanks
Liming
-----邮件原件-----
发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Sami
Mujawar
发送时间: 2021年5月19日 17:58
收件人: Etienne Carriere <etienne.carriere@...>;
devel@edk2.groups.io
抄送: Achin Gupta <achin.gupta@...>; Ard Biesheuvel
<ardb+tianocore@...>; Jiewen Yao <jiewen.yao@...>; Leif
Lindholm <leif@...>; Sughosh Ganu <sughosh.ganu@...>;
nd@...
主题: Re: [edk2-devel] [PATCH v4 5/5] StandaloneMmPkg: build for 32bit arm
machines

Hi Etienn,

This patch looks good to me.

Reviewed-by: Sami Mujawar <sami.mujawar@...>

Regards,

Sami Mujawar

On 19/05/2021 08:14 AM, Etienne Carriere wrote:
This change allows to build StandaloneMmPkg components for 32bit Arm
StandaloneMm firmware.

This change mainly moves AArch64/ source files to Arm/ side directory
for several components: StandaloneMmCpu,
StandaloneMmCoreEntryPoint
and StandaloneMmMemLib. The source file is built for both 32b and 64b
Arm targets.

Signed-off-by: Etienne Carriere <etienne.carriere@...>
---
Changes since v3:
- Fix BuildOptions.ARM in StandaloneMmPkg.
- Remove Cc tags.

No change since v2

Changes since v1:
- ARM_SMC_ID_MM_COMMUNICATE 32b/64b agnostic helper ID is
defined
in ArmStdSmc.h (see 1st commit in this series) instead of being
local to EventHandle.c.
- Fix void occurrence to VOID.
- Fix path in StandaloneMmPkg/StandaloneMmPkg.dsc
---
StandaloneMmPkg/Core/StandaloneMmCore.inf
| 2 +-
StandaloneMmPkg/Drivers/StandaloneMmCpu/{AArch64
=> }/EventHandle.c
| 5 +++--
StandaloneMmPkg/Drivers/StandaloneMmCpu/{AArch64
=> }/StandaloneMmCpu.c
| 2 +-
StandaloneMmPkg/Drivers/StandaloneMmCpu/{AArch64
=> }/StandaloneMmCpu.h
| 0
StandaloneMmPkg/Drivers/StandaloneMmCpu/{AArch64
=> }/StandaloneMmCpu.inf
| 0
StandaloneMmPkg/Include/Library/{AArch64 =>
Arm}/StandaloneMmCoreEntryPoint.h
| 0
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/{AArch64 =>
Arm}/CreateHobList.c | 2 +-
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/{AArch64 =>
Arm}/SetPermissions.c | 2 +-
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/{AArch64 =>
Arm}/StandaloneMmCoreEntryPoint.c | 16
++++++++--------
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCor
eEntryPoint.inf | 14
+++++++-------
StandaloneMmPkg/Library/StandaloneMmCoreHobLib/{AArch64 =>
Arm}/StandaloneMmCoreHobLib.c | 0
StandaloneMmPkg/Library/StandaloneMmCoreHobLib/{AArch64 =>
Arm}/StandaloneMmCoreHobLibInternal.c | 0
StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreH
obLib.inf | 8 ++++----
StandaloneMmPkg/Library/StandaloneMmMemLib/{AArch64/StandaloneMm
MemLibInternal.c => ArmStandaloneMmMemLibInternal.c} | 9 ++++++++-
StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.i
nf | 6
+++---
StandaloneMmPkg/Library/VariableMmDependency/VariableMmDependenc
y.inf | 2 +-
StandaloneMmPkg/StandaloneMmPkg.dsc
| 12 ++++++++----
17 files changed, 46 insertions(+), 34 deletions(-)

diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.inf
b/StandaloneMmPkg/Core/StandaloneMmCore.inf
index 87bf6e9440..56042b7b39 100644
--- a/StandaloneMmPkg/Core/StandaloneMmCore.inf
+++ b/StandaloneMmPkg/Core/StandaloneMmCore.inf
@@ -17,7 +17,7 @@
PI_SPECIFICATION_VERSION = 0x00010032
ENTRY_POINT = StandaloneMmMain

-# VALID_ARCHITECTURES = IA32 X64 AARCH64
+# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM

[Sources]
StandaloneMmCore.c
diff --git
a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
b/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c
similarity index 95%
rename from
StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
rename to StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c
index 63fbe26642..165d696f99 100644
---
a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/EventHandle.c
+++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c
@@ -2,6 +2,7 @@

Copyright (c) 2016 HP Development Company, L.P.
Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.
+ Copyright (c) 2021, Linaro Limited

SPDX-License-Identifier: BSD-2-Clause-Patent

@@ -92,8 +93,8 @@ PiMmStandaloneArmTfCpuDriverEntry (
// receipt of a synchronous MM request. Use the Event ID to
distinguish
// between synchronous and asynchronous events.
//
- if ((ARM_SMC_ID_MM_COMMUNICATE_AARCH64 != EventId) &&
- (ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64 !=
EventId)) {
+ if ((ARM_SMC_ID_MM_COMMUNICATE != EventId) &&
+ (ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ != EventId)) {
DEBUG ((DEBUG_INFO, "UnRecognized Event - 0x%x\n", EventId));
return EFI_INVALID_PARAMETER;
}
diff --git
a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCp
u.c b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c
similarity index 96%
rename from
StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCpu.
c
rename to
StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c
index d4590bcd19..10097f792f 100644
---
a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCp
u.c
+++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c
@@ -10,7 +10,7 @@

#include <Base.h>
#include <Pi/PiMmCis.h>
-#include <Library/AArch64/StandaloneMmCoreEntryPoint.h>
+#include <Library/Arm/StandaloneMmCoreEntryPoint.h>
#include <Library/DebugLib.h>
#include <Library/ArmSvcLib.h>
#include <Library/ArmLib.h>
diff --git
a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCp
u.h b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h
similarity index 100%
rename from
StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCpu.
h
rename to
StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h
diff --git
a/StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCp
u.inf b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf
similarity index 100%
rename from
StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCpu.i
nf
rename to
StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf
diff --git
a/StandaloneMmPkg/Include/Library/AArch64/StandaloneMmCoreEntryPoin
t.h
b/StandaloneMmPkg/Include/Library/Arm/StandaloneMmCoreEntryPoint.h
similarity index 100%
rename from
StandaloneMmPkg/Include/Library/AArch64/StandaloneMmCoreEntryPoint.h
rename to
StandaloneMmPkg/Include/Library/Arm/StandaloneMmCoreEntryPoint.h
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Create
HobList.c
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHob
List.c
similarity index 97%
rename from
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/CreateHo
bList.c
rename to
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHobLis
t.c
index 4d4cf3d5ff..85f8194687 100644
---
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Create
HobList.c
+++
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHob
List.c
@@ -14,7 +14,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Guid/MmramMemoryReserve.h>
#include <Guid/MpInformation.h>

-#include <Library/AArch64/StandaloneMmCoreEntryPoint.h>
+#include <Library/Arm/StandaloneMmCoreEntryPoint.h>
#include <Library/ArmMmuLib.h>
#include <Library/ArmSvcLib.h>
#include <Library/DebugLib.h>
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPer
missions.c
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/SetPermissi
ons.c
similarity index 96%
rename from
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermi
ssions.c
rename to
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/SetPermissio
ns.c
index 4a380df4a6..cd4b90823e 100644
---
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPer
missions.c
+++
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/SetPermissi
ons.c
@@ -14,7 +14,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Guid/MmramMemoryReserve.h>
#include <Guid/MpInformation.h>

-#include <Library/AArch64/StandaloneMmCoreEntryPoint.h>
+#include <Library/Arm/StandaloneMmCoreEntryPoint.h>
#include <Library/ArmMmuLib.h>
#include <Library/ArmSvcLib.h>
#include <Library/DebugLib.h>
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Standa
loneMmCoreEntryPoint.c
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/Standalone
MmCoreEntryPoint.c
similarity index 94%
rename from
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Standalo
neMmCoreEntryPoint.c
rename to
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/StandaloneM
mCoreEntryPoint.c
index b445d6942e..49cf51a789 100644
---
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/Standa
loneMmCoreEntryPoint.c
+++
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/Standalone
MmCoreEntryPoint.c
@@ -10,7 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent

#include <PiMm.h>

-#include <Library/AArch64/StandaloneMmCoreEntryPoint.h>
+#include <Library/Arm/StandaloneMmCoreEntryPoint.h>

#include <PiPei.h>
#include <Guid/MmramMemoryReserve.h>
@@ -182,13 +182,13 @@ DelegatedEventLoop (
}

if (FfaEnabled) {
- EventCompleteSvcArgs->Arg0 =
ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64;
+ EventCompleteSvcArgs->Arg0 =
ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP;
EventCompleteSvcArgs->Arg1 = 0;
EventCompleteSvcArgs->Arg2 = 0;
- EventCompleteSvcArgs->Arg3 =
ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
+ EventCompleteSvcArgs->Arg3 =
ARM_SVC_ID_SP_EVENT_COMPLETE;
EventCompleteSvcArgs->Arg4 = SvcStatus;
} else {
- EventCompleteSvcArgs->Arg0 =
ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
+ EventCompleteSvcArgs->Arg0 =
ARM_SVC_ID_SP_EVENT_COMPLETE;
EventCompleteSvcArgs->Arg1 = SvcStatus;
}
}
@@ -273,13 +273,13 @@ InitArmSvcArgs (
)
{
if (FeaturePcdGet (PcdFfaEnable)) {
- InitMmFoundationSvcArgs->Arg0 =
ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64;
+ InitMmFoundationSvcArgs->Arg0 =
ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP;
InitMmFoundationSvcArgs->Arg1 = 0;
InitMmFoundationSvcArgs->Arg2 = 0;
- InitMmFoundationSvcArgs->Arg3 =
ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
+ InitMmFoundationSvcArgs->Arg3 =
ARM_SVC_ID_SP_EVENT_COMPLETE;
InitMmFoundationSvcArgs->Arg4 = *Ret;
} else {
- InitMmFoundationSvcArgs->Arg0 =
ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
+ InitMmFoundationSvcArgs->Arg0 =
ARM_SVC_ID_SP_EVENT_COMPLETE;
InitMmFoundationSvcArgs->Arg1 = *Ret;
}
}
@@ -395,7 +395,7 @@ _ModuleEntryPoint (
//
ProcessModuleEntryPointList (HobStart);

- DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP 0x%lx\n", (UINT64)
CpuDriverEntryPoint));
+ DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP %p\n", (VOID *)
CpuDriverEntryPoint));

finish:
if (Status == RETURN_UNSUPPORTED) {
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm
CoreEntryPoint.inf
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm
CoreEntryPoint.inf
index 4fa426f58e..1762586cfa 100644
---
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm
CoreEntryPoint.inf
+++
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMm
CoreEntryPoint.inf
@@ -21,10 +21,10 @@
# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is for
build only)
#

-[Sources.AARCH64]
- AArch64/StandaloneMmCoreEntryPoint.c
- AArch64/SetPermissions.c
- AArch64/CreateHobList.c
+[Sources.AARCH64, Sources.ARM]
+ Arm/StandaloneMmCoreEntryPoint.c
+ Arm/SetPermissions.c
+ Arm/CreateHobList.c

[Sources.X64]
X64/StandaloneMmCoreEntryPoint.c
@@ -34,14 +34,14 @@
MdeModulePkg/MdeModulePkg.dec
StandaloneMmPkg/StandaloneMmPkg.dec

-[Packages.AARCH64]
+[Packages.ARM, Packages.AARCH64]
ArmPkg/ArmPkg.dec

[LibraryClasses]
BaseLib
DebugLib

-[LibraryClasses.AARCH64]
+[LibraryClasses.ARM, LibraryClasses.AARCH64]
StandaloneMmMmuLib
ArmSvcLib

@@ -51,7 +51,7 @@
gEfiStandaloneMmNonSecureBufferGuid
gEfiArmTfCpuDriverEpDescriptorGuid

-[FeaturePcd.AARCH64]
+[FeaturePcd.ARM, FeaturePcd.AARCH64]
gArmTokenSpaceGuid.PcdFfaEnable

[BuildOptions]
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/AArch64/Standalon
eMmCoreHobLib.c
b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/Arm/StandaloneM
mCoreHobLib.c
similarity index 100%
rename from
StandaloneMmPkg/Library/StandaloneMmCoreHobLib/AArch64/Standalone
MmCoreHobLib.c
rename to
StandaloneMmPkg/Library/StandaloneMmCoreHobLib/Arm/StandaloneMmC
oreHobLib.c
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/AArch64/Standalon
eMmCoreHobLibInternal.c
b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/Arm/StandaloneM
mCoreHobLibInternal.c
similarity index 100%
rename from
StandaloneMmPkg/Library/StandaloneMmCoreHobLib/AArch64/Standalone
MmCoreHobLibInternal.c
rename to
StandaloneMmPkg/Library/StandaloneMmCoreHobLib/Arm/StandaloneMmC
oreHobLibInternal.c
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCore
HobLib.inf
b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCore
HobLib.inf
index a2559920e8..34ed536480 100644
---
a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCore
HobLib.inf
+++
b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCore
HobLib.inf
@@ -22,7 +22,7 @@
LIBRARY_CLASS =
HobLib|MM_CORE_STANDALONE

#
-# VALID_ARCHITECTURES = X64 AARCH64
+# VALID_ARCHITECTURES = X64 AARCH64 ARM
#
[Sources.common]
Common.c
@@ -30,9 +30,9 @@
[Sources.X64]
X64/StandaloneMmCoreHobLib.c

-[Sources.AARCH64]
- AArch64/StandaloneMmCoreHobLib.c
- AArch64/StandaloneMmCoreHobLibInternal.c
+[Sources.AARCH64, Sources.ARM]
+ Arm/StandaloneMmCoreHobLib.c
+ Arm/StandaloneMmCoreHobLibInternal.c

[Packages]
MdePkg/MdePkg.dec
diff --git
a/StandaloneMmPkg/Library/StandaloneMmMemLib/AArch64/StandaloneM
mMemLibInternal.c
b/StandaloneMmPkg/Library/StandaloneMmMemLib/ArmStandaloneMmMe
mLibInternal.c
similarity index 86%
rename from
StandaloneMmPkg/Library/StandaloneMmMemLib/AArch64/StandaloneMm
MemLibInternal.c
rename to
StandaloneMmPkg/Library/StandaloneMmMemLib/ArmStandaloneMmMemL
ibInternal.c
index 4124959e04..fa7df46413 100644
---
a/StandaloneMmPkg/Library/StandaloneMmMemLib/AArch64/StandaloneM
mMemLibInternal.c
+++
b/StandaloneMmPkg/Library/StandaloneMmMemLib/ArmStandaloneMmMe
mLibInternal.c
@@ -20,6 +20,13 @@
//
extern EFI_PHYSICAL_ADDRESS
mMmMemLibInternalMaximumSupportAddress;

+#ifdef MDE_CPU_AARCH64
+#define ARM_PHYSICAL_ADDRESS_BITS 36
+#endif
+#ifdef MDE_CPU_ARM
+#define ARM_PHYSICAL_ADDRESS_BITS 32
+#endif
+
/**
Calculate and save the maximum support address.

@@ -31,7 +38,7 @@
MmMemLibInternalCalculateMaximumSupportAddress (
{
UINT8 PhysicalAddressBits;

- PhysicalAddressBits = 36;
+ PhysicalAddressBits = ARM_PHYSICAL_ADDRESS_BITS;

//
// Save the maximum support address in one global variable
diff --git
a/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib
.inf
b/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib
.inf
index 062b0d7a11..b29d97a746 100644
---
a/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib
.inf
+++
b/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib
.inf
@@ -28,7 +28,7 @@
#
# The following information is for reference only and not required by the
build tools.
#
-# VALID_ARCHITECTURES = IA32 X64 AARCH64
+# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM
#

[Sources.Common]
@@ -37,8 +37,8 @@
[Sources.IA32, Sources.X64]
X86StandaloneMmMemLibInternal.c

-[Sources.AARCH64]
- AArch64/StandaloneMmMemLibInternal.c
+[Sources.AARCH64, Sources.ARM]
+ ArmStandaloneMmMemLibInternal.c

[Packages]
MdePkg/MdePkg.dec
diff --git
a/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDepende
ncy.inf
b/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDepende
ncy.inf
index a2a059c5d6..ffb2a6d083 100644
---
a/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDepende
ncy.inf
+++
b/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDepende
ncy.inf
@@ -20,7 +20,7 @@
#
# The following information is for reference only and not required by the
build tools.
#
-# VALID_ARCHITECTURES = AARCH64
+# VALID_ARCHITECTURES = AARCH64|ARM
#
#

diff --git a/StandaloneMmPkg/StandaloneMmPkg.dsc
b/StandaloneMmPkg/StandaloneMmPkg.dsc
index 0c45df95e2..8012f93b7d 100644
--- a/StandaloneMmPkg/StandaloneMmPkg.dsc
+++ b/StandaloneMmPkg/StandaloneMmPkg.dsc
@@ -20,7 +20,7 @@
PLATFORM_VERSION = 1.0
DSC_SPECIFICATION = 0x00010011
OUTPUT_DIRECTORY = Build/StandaloneMm
- SUPPORTED_ARCHITECTURES = AARCH64|X64
+ SUPPORTED_ARCHITECTURES = AARCH64|X64|ARM
BUILD_TARGETS = DEBUG|RELEASE
SKUID_IDENTIFIER = DEFAULT

@@ -60,7 +60,7 @@
StandaloneMmDriverEntryPoint|MdePkg/Library/StandaloneMmDriverEntryP
oint/StandaloneMmDriverEntryPoint.inf
VariableMmDependency|StandaloneMmPkg/Library/VariableMmDependenc
y/VariableMmDependency.inf

-[LibraryClasses.AARCH64]
+[LibraryClasses.AARCH64, LibraryClasses.ARM]
ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
StandaloneMmMmuLib|ArmPkg/Library/StandaloneMmMmuLib/ArmMmuSt
andaloneMmLib.inf
ArmSvcLib|ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
@@ -118,8 +118,8 @@
StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/Standalone
MmMemoryAllocationLib.inf
StandaloneMmPkg/Library/VariableMmDependency/VariableMmDependenc
y.inf

-[Components.AARCH64]
-
StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCpu.i
nf
+[Components.AARCH64, Components.ARM]
+ StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf
StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/Standalone
MmPeCoffExtraActionLib.inf

##############################################################
#####################################
@@ -135,6 +135,10 @@
GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
-march=armv8-a+nofp -mstrict-align
GCC:*_*_*_CC_FLAGS = -mstrict-align

+[BuildOptions.ARM]
+GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000
-march=armv7-a
+GCC:*_*_*_CC_FLAGS = -fno-stack-protector
+
[BuildOptions.X64]
MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096
GCC:*_GCC*_*_DLINK_FLAGS = -z common-page-size=0x1000










Re: [PATCH v2 03/11] OvmfPkg: PlatformBootManagerLibGrub: Allow executing kernel via fw_cfg

Ard Biesheuvel
 

On Tue, 20 Jul 2021 at 09:33, Dov Murik <dovmurik@...> wrote:



On 19/07/2021 22:14, Dov Murik wrote:


On 19/07/2021 18:21, Tom Lendacky wrote:
On 7/6/21 3:54 AM, Dov Murik wrote:
From: James Bottomley <jejb@...>

Support QEMU's -kernel option.

OvmfPkg/Library/PlatformBootManagerLibGrub/QemuKernel.c is an exact copy
of OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c .
Just a nit, but this confused me initially. Maybe it should say something
along the lines of create a QemuKernel.c for PlatformBootManagerLibGrub
that is an exact copy of the file from PlatformBootManagerLib.
You're right; I'll write it clearer.


Is there any way that the two libraries can use the same file rather than
making an exact copy?
I guess it's possible by extracting the file into its own library? I'll
need to take a deeper look.

With this patch we'll have two identical files:

OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
OvmfPkg/Library/PlatformBootManagerLibGrub/QemuKernel.c

but there's another QemuKernel.c, which is *almost* identical:

ArmVirtPkg/Library/PlatformBootManagerLib/QemuKernel.c

so a proper fix should consolidate all three into one library used by
all three libs.

I suggest postponing this to a separate refactoring series.
That is fine with me.


Re: [edk2-platform][PATCH v1 1/1] Platform/RaspberryPi/RPi4: Fix non-standard ACPI HIDs

Ard Biesheuvel
 

On Mon, 19 Jul 2021 at 22:45, Samer El-Haj-Mahmoud
<Samer.El-Haj-Mahmoud@...> wrote:

Remove non-standard RPI ACPI _CIDs that are not needed.
This also fixes the FWTS failure reported in
https://github.com/pftf/RPi4/issues/67

The windows drivers at https://github.com/raspberrypi/windows-drivers
are still able to match the ACPI objects using the HIDs which
are supported in the drivers, with these two recent changes needed:
469702898789e555c6947e50216a3f79e0ddeb9
and
5c5e2742b4c983b3001c473b168b0dae2fcba0c2

Cc: Leif Lindholm <leif@...>
Cc: Ard Biesheuvel <ardb+tianocore@...>
Cc: Pete Batard <pete@...>
Cc: Andrei Warkentin <awarkentin@...>
Cc: Mario Bălănică <mariobalanica02@...>
Signed-off-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@...>
Tested-by: Mario Bălănică <mariobalanica02@...>
Glad to see this getting cleaned up.

Anyone care to ack?


---
Platform/RaspberryPi/AcpiTables/GpuDevs.asl | 26 +++++++++++---------
Platform/RaspberryPi/AcpiTables/Sdhc.asl | 4 +--
Platform/RaspberryPi/AcpiTables/Uart.asl | 2 +-
3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/Platform/RaspberryPi/AcpiTables/GpuDevs.asl b/Platform/RaspberryPi/AcpiTables/GpuDevs.asl
index 966a94cdb5b5..9750dc25c07c 100644
--- a/Platform/RaspberryPi/AcpiTables/GpuDevs.asl
+++ b/Platform/RaspberryPi/AcpiTables/GpuDevs.asl
@@ -13,7 +13,11 @@
Device (USB0)
{
Name (_HID, "BCM2848")
- Name (_CID, Package() { "DWC_OTG", "DWC2_OTG" })
+#if (RPI_MODEL == 3)
+ Name (_CID, "DWC_OTG")
+#elif (RPI_MODEL == 4)
+ Name (_CID, "BCM2848")
+#endif
Name (_UID, 0x0)
Name (_CCA, 0x0)
Method (_STA)
@@ -36,7 +40,7 @@ Device (USB0)
Device (GPU0)
{
Name (_HID, "BCM2850")
- Name (_CID, "VC4")
+ Name (_CID, "BCM2850")
Name (_UID, 0x0)
Name (_CCA, 0x0)
Method (_STA)
@@ -140,7 +144,7 @@ Device (GPU0)
Device (RPIQ)
{
Name (_HID, "BCM2849")
- Name (_CID, "RPIQ")
+ Name (_CID, "BCM2849")
Name (_UID, 0)
Name (_CCA, 0x0)
Method (_STA)
@@ -164,7 +168,7 @@ Device (RPIQ)
Device (VCIQ)
{
Name (_HID, "BCM2835")
- Name (_CID, "VCIQ")
+ Name (_CID, "BCM2835")
Name (_UID, 0)
Name (_CCA, 0x0)
Name (_DEP, Package() { \_SB.GDV0.RPIQ })
@@ -189,7 +193,7 @@ Device (VCIQ)
Device (VCSM)
{
Name (_HID, "BCM2856")
- Name (_CID, "VCSM")
+ Name (_CID, "BCM2856")
Name (_UID, 0)
Name (_CCA, 0x0)
Name (_DEP, Package() { \_SB.GDV0.VCIQ })
@@ -203,7 +207,7 @@ Device (VCSM)
Device (GPI0)
{
Name (_HID, "BCM2845")
- Name (_CID, "BCMGPIO")
+ Name (_CID, "BCM2845")
Name (_UID, 0x0)
Name (_CCA, 0x0)
Method (_STA)
@@ -230,7 +234,7 @@ Device (GPI0)
Device (I2C1)
{
Name (_HID, "BCM2841")
- Name (_CID, "BCMI2C")
+ Name (_CID, "BCM2841")
Name (_UID, 0x1)
Name (_CCA, 0x0)
Method (_STA)
@@ -254,7 +258,7 @@ Device (I2C1)
Device (I2C2)
{
Name (_HID, "BCM2841")
- Name (_CID, "BCMI2C")
+ Name (_CID, "BCM2841")
Name (_UID, 0x2)
Name (_CCA, 0x0)
Method (_STA)
@@ -278,7 +282,7 @@ Device (I2C2)
Device (SPI0)
{
Name (_HID, "BCM2838")
- Name (_CID, "BCMSPI0")
+ Name (_CID, "BCM2838")
Name (_UID, 0x0)
Name (_CCA, 0x0)
Method (_STA)
@@ -304,7 +308,7 @@ Device (SPI0)
Device (SPI1)
{
Name (_HID, "BCM2839")
- Name (_CID, "BCMAUXSPI")
+ Name (_CID, "BCM2839")
Name (_UID, 0x1)
Name (_CCA, 0x0)
Name (_DEP, Package() { \_SB.GDV0.RPIQ })
@@ -331,7 +335,7 @@ Device (SPI1)
// Device (SPI2)
// {
// Name (_HID, "BCM2839")
-// Name (_CID, "BCMAUXSPI")
+// Name (_CID, "BCM2839")
// Name (_UID, 0x2)
// Name (_CCA, 0x0)
// Name (_DEP, Package() { \_SB.GDV0.RPIQ })
diff --git a/Platform/RaspberryPi/AcpiTables/Sdhc.asl b/Platform/RaspberryPi/AcpiTables/Sdhc.asl
index 42776e33bbc6..85d5053a338c 100644
--- a/Platform/RaspberryPi/AcpiTables/Sdhc.asl
+++ b/Platform/RaspberryPi/AcpiTables/Sdhc.asl
@@ -23,7 +23,7 @@
Device (SDC1)
{
Name (_HID, "BCM2847")
- Name (_CID, "ARASAN")
+ Name (_CID, "BCM2847")
Name (_UID, 0x0)
Name (_CCA, 0x0)
Name (_S1D, 0x1)
@@ -78,7 +78,7 @@ Device (SDC1)
Device (SDC2)
{
Name (_HID, "BCM2855")
- Name (_CID, "SDHST")
+ Name (_CID, "BCM2855")
Name (_UID, 0x0)
Name (_CCA, 0x0)
Name (_S1D, 0x1)
diff --git a/Platform/RaspberryPi/AcpiTables/Uart.asl b/Platform/RaspberryPi/AcpiTables/Uart.asl
index 167f94e8892b..974f06d3bc3f 100644
--- a/Platform/RaspberryPi/AcpiTables/Uart.asl
+++ b/Platform/RaspberryPi/AcpiTables/Uart.asl
@@ -59,7 +59,7 @@ Device (URT0)
Device (URTM)
{
Name (_HID, "BCM2836")
- Name (_CID, "MINIUART")
+ Name (_CID, "BCM2836")
Name (_UID, 0x0)
Name (_CCA, 0x0)
Method (_STA)
--
2.25.1


Re: [PATCH v2 03/11] OvmfPkg: PlatformBootManagerLibGrub: Allow executing kernel via fw_cfg

Dov Murik
 

On 19/07/2021 22:14, Dov Murik wrote:


On 19/07/2021 18:21, Tom Lendacky wrote:
On 7/6/21 3:54 AM, Dov Murik wrote:
From: James Bottomley <jejb@...>

Support QEMU's -kernel option.

OvmfPkg/Library/PlatformBootManagerLibGrub/QemuKernel.c is an exact copy
of OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c .
Just a nit, but this confused me initially. Maybe it should say something
along the lines of create a QemuKernel.c for PlatformBootManagerLibGrub
that is an exact copy of the file from PlatformBootManagerLib.
You're right; I'll write it clearer.


Is there any way that the two libraries can use the same file rather than
making an exact copy?
I guess it's possible by extracting the file into its own library? I'll
need to take a deeper look.

With this patch we'll have two identical files:

OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
OvmfPkg/Library/PlatformBootManagerLibGrub/QemuKernel.c

but there's another QemuKernel.c, which is *almost* identical:

ArmVirtPkg/Library/PlatformBootManagerLib/QemuKernel.c

so a proper fix should consolidate all three into one library used by
all three libs.

I suggest postponing this to a separate refactoring series.

Thanks,
-Dov


Re: [edk2-platforms: PATCH] Features/Intel/IpmiFeaturePkg: Use MdePkg macros instead of redefining.

Chaganty, Rangasai V
 

Reviewed-by: Sai Chaganty <rangasai.v.chaganty@...>

-----Original Message-----
From: Chiu, Chasel <chasel.chiu@...>
Sent: Thursday, July 15, 2021 7:38 AM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@...>; Desimone, Nathaniel L <nathaniel.l.desimone@...>; Chaganty, Rangasai V <rangasai.v.chaganty@...>; Liming Gao <gaoliming@...>; Oram, Isaac W <isaac.w.oram@...>
Subject: [edk2-platforms: PATCH] Features/Intel/IpmiFeaturePkg: Use MdePkg macros instead of redefining.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3494

Renamed below macros and structure to use MdePkg ones.
IPMI_MSG_GET_BMC_EXEC_RSP
IPMI_GET_BMC_EXECUTION_CONTEXT
IPMI_BMC_IN_FORCED_UPDATE_MODE

Cc: Nate DeSimone <nathaniel.l.desimone@...>
Cc: Sai Chaganty <rangasai.v.chaganty@...>
Cc: Liming Gao <gaoliming@...>
Cc: Isaac Oram <isaac.w.oram@...>
Signed-off-by: Chasel Chiu <chasel.chiu@...>
---
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/IpmiInit.c | 8 ++++---- Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/ServerManagement.h | 17 -----------------
2 files changed, 4 insertions(+), 21 deletions(-)

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/IpmiInit.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/IpmiInit.c
index 1e0c132508..d788b48867 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/IpmiInit.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Dxe/
+++ IpmiInit.c
@@ -242,7 +242,7 @@ Returns:
EFI_STATUS Status; UINT32 DataSize; SM_CTRL_INFO *pBmcInfo;- EFI_IPMI_MSG_GET_BMC_EXEC_RSP *pBmcExecContext;+ IPMI_MSG_GET_BMC_EXEC_RSP *pBmcExecContext; UINT32 Retries; #ifdef FAST_VIDEO_SUPPORT EFI_VIDEOPRINT_PROTOCOL *VideoPrintProtocol;@@ -301,14 +301,14 @@ Returns:
Status = IpmiSendCommand ( &IpmiInstance->IpmiTransport, IPMI_NETFN_FIRMWARE, 0,- EFI_FIRMWARE_GET_BMC_EXECUTION_CONTEXT,+ IPMI_GET_BMC_EXECUTION_CONTEXT, NULL, 0, IpmiInstance->TempData, &DataSize ); - pBmcExecContext = (EFI_IPMI_MSG_GET_BMC_EXEC_RSP*)&IpmiInstance->TempData[0];+ pBmcExecContext = (IPMI_MSG_GET_BMC_EXEC_RSP*)&IpmiInstance->TempData[0]; DEBUG ((DEBUG_INFO, "[IPMI] Operational status of BMC: 0x%x\n", pBmcExecContext->CurrentExecutionContext));- if ((pBmcExecContext->CurrentExecutionContext == EFI_FIRMWARE_BMC_IN_FORCED_UPDATE_MODE) &&+ if ((pBmcExecContext->CurrentExecutionContext == IPMI_BMC_IN_FORCED_UPDATE_MODE) && !EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "[IPMI] BMC in Forced Update mode, skip waiting for BMC_READY.\n")); IpmiInstance->BmcStatus = BMC_UPDATE_IN_PROGRESS;diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/ServerManagement.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/ServerManagement.h
index 7591f33aba..244b86e91a 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/ServerManagement.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/ServerMa
+++ nagement.h
@@ -149,15 +149,6 @@ typedef enum {
#define UPPER_NON_RECOVER_GOING_LOW 0x400 #define UPPER_NON_RECOVER_GOING_HI 0x800 -//-// Definitions for Get BMC Execution Context-//-#define EFI_FIRMWARE_GET_BMC_EXECUTION_CONTEXT 0x23-//-// Current Execution Context responses-//-#define EFI_FIRMWARE_BMC_IN_FORCED_UPDATE_MODE 0x11- // // Server Management COM Addressing types //@@ -327,14 +318,6 @@ typedef struct {
UINT16 IoBasePort; } IPMI_HOB_DATA; -//-// Constants and Structure definitions for "Get Device ID" command to follow here-//-typedef struct {- UINT8 CurrentExecutionContext;- UINT8 PartitionPointer;-} EFI_IPMI_MSG_GET_BMC_EXEC_RSP;- // // COM Layer Callback //--
2.28.0.windows.1


Re: [RFC PATCH] OvmfPkg/OvmfXen: set PcdAcpiS3Enable at initialization

Gary Lin
 

On Mon, Jul 19, 2021 at 05:07:21PM +0100, Anthony PERARD wrote:
It would have been nice to have this patch in a patch series with
"OvmfPkg/OvmfXen: add QemuKernelLoaderFsDxe", mostly to make it simpler
to understand the problem needed to be fixed.
To be honest, I don't have Xen environment and didn't realize that it's
about direct kernel boot until looking into another bug report. I just
compared InitializeXenPlatform() with InitializePlatform() and my
colleague told me OvmfXen works again after setting PcdAcpiS3Enable.

On Thu, Jul 08, 2021 at 12:05:49PM +0800, Gary Lin wrote:
There are several functions in OvmfPkg/Library using
QemuFwCfgS3Enabled() to detect the S3 support status. However, in
MdeModulePkg, PcdAcpiS3Enable is used to check S3 support. Since
InitializeXenPlatform() didn't set PcdAcpiS3Enable as
InitializePlatform() did, this made the inconsistency between
drivers/functions.

For example, S3SaveStateDxe checked PcdAcpiS3Enable and skipped
S3BootScript because the default value is FALSE. On the other hand,
PlatformBootManagerBeforeConsole() from OvmfPkg/Library called
QemuFwCfgS3Enabled() and found it returned TRUE, so it invoked
SaveS3BootScript(). However, S3SaveStateDxe skipped S3BootScript, so
SaveS3BootScript() asserted due to EFI_NOT_FOUND.
This sounds like OvmfPkg would need to be fixed to use PcdAcpiS3Enable
instead of QemuFwCfgS3Enabled() in most placed and have a single place
where QemuFwCfgS3Enabled() is used to set PcdAcpiS3Enable. If you feel
like trying to fix that, that would be nice, and then we could probably
set PcdAcpiS3Enable unconditionally on OvmfXen (and maybe hope that S3
support actually works with Xen).
That's why I marked this patch as RFC since the inconsistency could
exist in OVMF for KVM, not just Xen, so I would like to have feedbacks
from OvmfPkg maintainers. I'll amend the patch set to cover other
drivers/libraries in OvmfPkg.

In the mean time, this patch is fine but wants better comments. First
two paragraphs are good, but the rest needs explanation on what we are
trying to fix/workaround, that is "Direct Kernel Boot" as it is called
in "man xl.cfg".
Thanks for the suggestion. Will amend the comment in v2.

Setting PcdAcpiS3Enable at InitializeXenPlatform() "fixes" the crash
reported by my colleague. The other possible direction is to replace
QemuFwCfgS3Enabled() with PcdAcpiS3Enable. I'm not sure which one is
the right fix.

Signed-off-by: Gary Lin <glin@...>
---
diff --git a/OvmfPkg/XenPlatformPei/Platform.c b/OvmfPkg/XenPlatformPei/Platform.c
index a811e72ee301..f7edc979486e 100644
--- a/OvmfPkg/XenPlatformPei/Platform.c
+++ b/OvmfPkg/XenPlatformPei/Platform.c
@@ -26,6 +26,8 @@
#include <Library/PciLib.h>
#include <Library/PeimEntryPoint.h>
#include <Library/PeiServicesLib.h>
+#include <Library/QemuFwCfgLib.h>
I don't think QemuFwCfgLib.h is needed, can you remove it?
Sure, will remove it from v2.

+#include <Library/QemuFwCfgS3Lib.h>
#include <Library/ResourcePublicationLib.h>
#include <Guid/MemoryTypeInformation.h>
#include <Ppi/MasterBootMode.h>
@@ -433,6 +437,12 @@ InitializeXenPlatform (
CpuDeadLoop ();
}

+ if (QemuFwCfgS3Enabled ()) {
This test needs a comment. QEMU's fwcfg isn't supposed to be available,
unless one try to use the Direct Kernel Boot functionality.

+ DEBUG ((DEBUG_INFO, "S3 support was detected on QEMU\n"));
+ Status = PcdSetBoolS (PcdAcpiS3Enable, TRUE);
+ ASSERT_EFI_ERROR (Status);
+ }
+
XenConnect ();

BootModeInitialization ();
diff --git a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
index 597cb6fcd7ff..1e22c0b2e2aa 100644
--- a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
+++ b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
@@ -57,6 +57,8 @@ [LibraryClasses]
ResourcePublicationLib
PeiServicesLib
PeimEntryPoint
+ QemuFwCfgLib
Same here, QemuFwCfgLib doesn't seems to be needed or used.
Will remove it from v2.

Thanks,

Gary Lin


Re: [staging/edk2-redfish-client PATCH v2 1/2] RedfishClientPkg: Initial commit

Nickle Wang
 

Reviewed-by: Nickle Wang <nickle.wang@...>

Thanks,
Nickle

-----Original Message-----
From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@...>
Sent: Tuesday, July 20, 2021 11:54 AM
To: devel@edk2.groups.io
Cc: Wang, Nickle (HPS SW) <nickle.wang@...>; Liming Gao <gaoliming@...>; Andrew Fish <afish@...>; Leif Lindholm <leif@...>; Michael D Kinney <michael.d.kinney@...>
Subject: [staging/edk2-redfish-client PATCH v2 1/2] RedfishClientPkg: Initial commit

Initial commit of architecture diagrams and Readme.md

Signed-off-by: Abner Chang <abner.chang@...>
Cc: Nickle Wang <nickle.wang@...>
Cc: Liming Gao <gaoliming@...>
Cc: Andrew Fish <afish@...>
Cc: Leif Lindholm <leif@...>
Cc: Michael D Kinney <michael.d.kinney@...>
---
RedfishClientPkg/Readme.md | 185 +++
.../Media/RedfishClientDriverStack.svg | 1068 +++++++++++++++++
2 files changed, 1253 insertions(+)
create mode 100644 RedfishClientPkg/Readme.md
create mode 100644 RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg

diff --git a/RedfishClientPkg/Readme.md b/RedfishClientPkg/Readme.md
new file mode 100644
index 0000000000..9e56fb9039
--- /dev/null
+++ b/RedfishClientPkg/Readme.md
@@ -0,0 +1,185 @@
+# UEFI Redfish Client EDK2 Implementation
+
+## Introduction
+UEFI Redfish Client EDK2 solution is implemented base on
+[*EDK2 Redfish Foundation*](https://github.com/tianocore/edk2/blob/master/RedfishPkg/Readme.md),
+the implementation utilizes the EFI protocols provided by EDK2 Redfish
+Foundation to communicate with the Redfish service for creating, consuming, and
+updating the Redfish properties which are managed by firmware. This solution
+requests the instance of **EFI REST EX Protocol** through EFI Redfish Discover
+Protocol and interacts with Redfish service using **EFI REST EX Protocol** later
+on. The essential part of this implementation is to map the EDK2 HII options to
+the corresponding Redfish properties that are already defined in the standard
+Redfish schemas published by
+[*DMTF Redfish working group*](https://www.dmtf.org/standards/redfish).
+The advantage of this design is to strengthen the interoperability among the
+servers produced by different OEMs when configuring the platform through Redfish
+service. Using the properties defined in Redfish standard schema for configuring
+platform reduces the overhead of Redfish client tools to have different
+implementations in order to compliant with OEM servers. The solution also
+reduces OEM-defined proprietary BIOS Attributes that lead to the divergence of
+platform configuration namings in Redfish BIOS Attribute Registry, however,
+those different namings refer to the same platform functionality.
+
+## The Scope of UEFI Redfish Client EDK2 Implementation
+- Platform Configurable settings
+
+This is the first stage of UEFI Redfish Client EDK2 Implementation. Associate
+Redfish property with HII option.
+
+- Provisioning of Firmware Managed Platform Redfish Resource
+
+The current design of UEFI Redfish Client EDK2 Implementation can already
+support the provisioning of firmware-owned platform Redfish resource, however,
+this requires addtional support on edk2 HII. Therefore, provisioning of
+firmware managed platform Redfish resource would be the second stage.
+
+Below are the block diagrams of UEFI Redfish Client EDK2 Implementation.
+
+## <a name="[0]">EDK2 Redfish Client Implementation Diagrams</a>
+![UEFI Redfish Client Implementation](https://github.com/changab/edk2-staging/blob/edk2-redfish-client/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg?raw=true)
+
+## EFI EDK2 Redfish Client Framework
+The functionality of each block in the diagrams are described in belwo sections,
+
+### EDK2 Redfish Foundation ***[[1]](#[0])***
+EDK2 Redfish Redfish Foundation provides the facilities of communicating with
+Redfish service. Such as the discovery of Redfish service, the credential to
+access Redfish service, *EFI REST EX Protocol* instance which is the transport
+layer to Redfish service, and so on. Please refer to
+[*EDK2 Redfish Foundation*](https://github.com/tianocore/edk2/blob/master/RedfishPkg/Readme.md).
+
+### Redfish Profile Simulator ***[[2]](#[0])***
+Redfish Profile Simulator is an
+[*open source project*](https://github.com/DMTF/Redfish-Profile-Simulator) on
+DMTF GitHub, which simulates the HTTP request methods (POST, PATCH, PUT, GET) on
+Redfish resource maintained by Redfish Profile Simulator. EDK2 open source uses
+this simulator for the use case when Redfish service has not been set up on the
+platform, or for the quick Redfish firmware feature development. We clone this
+project under RedfishClientPkg and maintain it by edk2 because this project has
+currently been using and updating rarely. That is easier for edk2 to add
+features to the simulator or modify the simulator to align with edk2 requirement
+on Redfish service, such as ETAG and HTTP POST support. <br>
+Another open source project of Redfish simulator is
+[*Redfish Interface Emulator*](https://github.com/DMTF/Redfish-Interface-Emulator),
+however, we don't pay much attention to this project because we have been
+dedicating to Redfish Profile Simulator since we started the UEFI Redfish EDK2
+project.
+
+### EDK2 Redfish JSON Schema to C Structure Convertor ***[[3]](#[0])***
+This is the script auto-generated EDK2 drivers and libraries that provide the
+Redfish schema naming based JSON to C structure and vise versa converters. C
+structure is another representation of Redfish properties other than JSON and
+CSDL(XML). The higher layer Redfish client application can deal with C structure
+instead of using JSON library to manipulate Redfish properties. The script
+[*Redfish Schema C Struct Generator*](https://github.com/DMTF/Redfish-Schema-C-Struct-Generator)
+is still a private project on DMTF GitHub. Below is the reference of script
+auto-generated
+[*Redfish JSON C Struct Converter Lib*](https://github.com/changab/Redfish-JSON-C-Struct-Converter-Lib)
+libraries. The converters generated by the script are followed
+**EFI REST JSON Structure Protocol** defined in UEFI spec 2.8, section 29.7.3.
+
+### EDK2 Redfish Non-Collection ***[[4]](#[0])*** and Collection ***[[5]](#[0])
+*** Feature Drivers EDK2 Redfish feature driver is an intermediary driver that
+sits between **JSON Schema to C Structure converters** and **EFI Platform
+Configuration to Redfish Protocol**. The Redfish feature driver gets and sets
+the platform configuration and incorporates it with Redfish JSON schema C
+structure to manipulate Redfish JSON resources. Then applies the settings from
+Redfish service to platform configurations, or vise versa to update platform
+configurations to Redfish service. Both EDK2 Redfish Non-Collection and
+Collection Feature drivers are script auto-generated base on Redfish schema
+naming. The EDK2 Redfish Non-Collection feature driver manages the resource of
+specific Resdifsh resource type, while the EDK2 Redfish Collection feature
+driver manages the members which have the same resource type in collection
+resource (e.g the ComputerSystem resource and ComputerSystemCollection resource)
+.
+
+### EDKII Redfish Platform Config Protocol ***[[6]](#[0])***
+EDKII Redfish Platform Config Protocol is an abstract driver that abstracts the
+platform configuration format and storage from EDK2 Redfish Feature driver.
+This protocol provides the interfaces to get and set platform configuration with
+the format and configuration storage agnostic to the Redfish feature driver.
+The platform can provide its own EDKII Redfish Platform Config driver instance
+to access platform-specific configuration format and storage. On EDK2 open
+source, EDKII Redfish Platform Config Protocol accesses the platform
+configuration in EDK2 HII defined format.
+
+Below is the prototype of **EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL**,
+
+```C
+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;
+};
+```
+
+### Other instances of EDKII Redfish Platform Config Protocol ***[[7]](#[0])***
+For those Non-EDK2 HII-based platform configuration formats, the driver instance
+can provide its own implementation to get or set the platform configurations.
+
+### EDK2 HII VFR Form ***[[8]](#[0])***
+According to **UEFI spec 2.9 section 35.6 Form Browser Protocol**,
+**EFI_HII_REST_STYLE_FORMSET_GUID** is used on HII form to indicate that HII
+options declared in this form intend to interact with the REST architectural
+style. On edk2 open source, the REST architectural style refers to the Redfish
+service. Besides **EFI_HII_REST_STYLE_FORMSET_GUID** is defined in the form
+scope, **EFI_IFR_FLAG_REST_STYLE** can be assigned to the HII options that
+indicate those options intend to interact with the REST service.
+
+### EDK2 HII UNI file ***[[9]](#[0])***
+x-uefi-redfish Configure Language is used in UNI file to associate HII option
+with the particular Redfish property. The Hii options interact with EDK2 Redfish
+Feature driver if the string of HII option is assigned with x-uefi-redfish
+Language as in below,
+
+```C
+x-uefi-redfish-$(NAMESPACE)
+where $(NAMESPACE) is the combination of Redfish ResourceTypeName and schema version.
+```
+For example, if the HII option is mapped to the property in Processor.v1_0_0.
+The x-uefi-redfish configure language is declared as below,
+```C
+x-uefi-redfish-Processor.v1_0_0
+```
+#### x-uefi-redfish Configure Language format:
+- The string declared with x-uefi-redfish configure language is a path to the property
+in Redfish resource
+- The root of path is the Redfish resource type indicated in x-uefi-redfish configure
+language
+- The path is relative to root of Redfish resource type, not related to Redfish service
+- root.
+
+#### Examples,
+```C
+Properties:
+
+#string STR_BOOT_SOURCE_OVERRIDE_ENABLED_PROMPT #language x_uefi_redfish_ComputerSystem.v1_0_0 "/Boot/BootSourceOverrideEnabled"
+#string STR_BOOT_SOURCE_OVERRIDE_MODE_PROMPT #language x_uefi_redfish_ComputerSystem.v1_0_0 "/Boot/BootSourceOverrideMode"
+#string STR_BOOT_SOURCE_OVERRIDE_TARGET_PROMPT #language x_uefi_redfish_ComputerSystem.v1_0_0 "/Boot/BootSourceOverrideTarget"
+```
+```C
+Properties in array object [NUM]:
+
+#string STR_BOOT_ORDER_1_PROMPT #language x_uefi_redfish_ComputerSystem.v1_11_0 "/Boot/BootOrder/[1]/Boot0001"
+#string STR_BOOT_ORDER_2_PROMPT #language x_uefi_redfish_ComputerSystem.v1_11_0 "/Boot/BootOrder/[2]/Boot0002"
+#string STR_BOOT_ORDER_3_PROMPT #language x_uefi_redfish_ComputerSystem.v1_11_0 "/Boot/BootOrder/[3]/Boot0003"
+```
+```C
+Properties in collection object {NUM}:
+
+#string STR_MEMORY_1_BASE_MODULE_TYPE_PROMPT #language x_uefi_redfish_Memory.v1_7_1 "/Memory/{1}/BaseModuleType"
+#string STR_MEMORY_2_BASE_MODULE_TYPE_PROMPT #language x_uefi_redfish_Memory.v1_7_1 "/Memory/{2}/BaseModuleType"
+#string STR_MEMORY_3_BASE_MODULE_TYPE_PROMPT #language x_uefi_redfish_Memory.v1_7_1 "/Memory/{3}/BaseModuleType"
+```
+
+### EDK2 Build Tool ***[[10]](#[0])***
+EDK2 Build is responsible to pull the necessary EDK2 Redfish JSON Schema to C
+Structure Convertors and EDK2 Redfish Feature drivers into edk2 build process
+according to the x-uefi-Redfish config language used in the HII VFR forms.
+
+## The Contributors
+Chang, Abner <abner.chang@...>\
+Wang, Nickle <nickle.wang@...>\
+Chen, Aaron <aaron.chen@...>
diff --git a/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg b/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg
new file mode 100644
index 0000000000..881d9647e5
--- /dev/null
+++ b/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg
@@ -0,0 +1,1068 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export RedfishClientDriverStack.svg Page-2 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="12.1281in" height="9.93872in"
+ viewBox="0 0 873.222 715.588" xml:space="preserve" color-interpolation-filters="sRGB" class="st69">
+ <v:documentProperties v:langID="1033" v:viewMarkup="false">
+ <v:userDefs>
+ <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
+ </v:userDefs>
+ </v:documentProperties>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st2 {fill:#ebf1df;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st3 {fill:#ff1a1a;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st4 {fill:#ffffff;font-family:Calibri;font-size:1.00001em;font-weight:bold}
+ .st5 {font-size:1em}
+ .st6 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st7 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-weight:bold}
+ .st8 {fill:#dbeef3;stroke:#d8d8d8;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st9 {fill:#ffffff;font-family:Calibri;font-size:1.08334em;font-weight:bold}
+ .st10 {visibility:visible}
+ .st11 {fill:none;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}
+ .st12 {fill:none;stroke:#bfbfbf;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st13 {fill:#000000;font-family:Arial;font-size:1.99999em;font-style:italic;font-weight:bold}
+ .st14 {marker-end:url(#mrkr2-45);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.9}
+ .st15 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.42986425339367}
+ .st16 {fill:#000000;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st17 {fill:#ffffff;font-family:Arial;font-size:1.33333em;font-weight:bold}
+ .st18 {fill:#ffffff;stroke:#595959;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st19 {fill:#7f7f7f;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st20 {fill:#ffffff;font-family:Calibri;font-size:1.08334em}
+ .st21 {fill:#000000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st22 {fill:#000000;font-family:Calibri;font-size:0.833336em;font-weight:bold}
+ .st23 {marker-start:url(#mrkr10-112);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st24 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.40983606557377}
+ .st25 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st26 {fill:#000000;fill-opacity:0.4;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}
+ .st27 {fill:#0070c0;fill-opacity:0.72;stroke:#003f6c;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st28 {fill:#0070c0;stroke:#003f6c;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st29 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-style:italic;font-weight:bold}
+ .st30 {fill:#ffffff;stroke:#000000;stroke-dasharray:1.68,1.2;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st31 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st32 {fill:#ffffff;stroke:#000000;stroke-dasharray:3.5,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}
+ .st33 {stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:4.5}
+ .st34 {fill:#000000;fill-opacity:0.38;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.38}
+ .st35 {fill:#000000;fill-opacity:0.38;stroke:#000000;stroke-opacity:0.38;stroke-width:0.22935779816514}
+ .st36 {fill:#f2f2f2;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st37 {fill:#7f7f7f;fill-opacity:1;stroke:#7f7f7f;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st38 {fill:#d8d8d8;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st39 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st40 {fill:#000000;fill-opacity:0.4;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}
+ .st41 {fill:#0070c0;stroke:#003f6c;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st42 {fill:#ffffff;stroke:#000000;stroke-dasharray:9.5,2.5,3.5,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}
+ .st43 {fill:#ffffff;stroke:#000000;stroke-dasharray:3.5,2.5,3.5,2.5,0,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}
+ .st44 {marker-end:url(#mrkr4-212);marker-start:url(#mrkr4-210);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25}
+ .st45 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.47169811320755}
+ .st46 {fill:#ffffff;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st47 {fill:#000000;font-family:Calibri;font-size:1.16666em;font-style:italic;font-weight:bold}
+ .st48 {font-family:Arial;font-size:0.571431em;font-style:normal;font-weight:normal}
+ .st49 {font-family:Arial;font-size:0.571431em;font-style:normal}
+ .st50 {fill:#ea700d;font-family:Arial;font-size:0.571431em;font-style:normal}
+ .st51 {fill:#ffffff;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st52 {fill:#d8d8d8;font-family:Calibri;font-size:0.833336em;font-style:italic;font-weight:bold}
+ .st53 {font-size:1.20001em;font-style:normal;font-weight:normal}
+ .st54 {font-size:1em;font-style:normal;font-weight:normal}
+ .st55 {fill:#f59d56;font-size:1em;font-style:normal;font-weight:normal}
+ .st56 {marker-end:url(#mrkr2-350);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}
+ .st57 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.44247787610619}
+ .st58 {marker-end:url(#mrkr2-383);marker-start:url(#mrkr2-381);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st59 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st60 {fill:#000000;font-family:Calibri;font-size:0.75em;font-style:italic;font-weight:bold}
+ .st61 {fill:#000000;font-family:Calibri;font-size:0.75em;font-weight:bold}
+ .st62 {fill:#0070c0;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st63 {fill:#595959;stroke:none;stroke-linecap:butt;stroke-width:0.75}
+ .st64 {marker-start:url(#mrkr4-405);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st65 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.3315649867374}
+ .st66 {marker-end:url(#mrkr4-411);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st67 {marker-end:url(#mrkr10-430);marker-start:url(#mrkr10-112);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st68 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st69 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend2">
+ <path d="M 1 1 L 0 0 L 1 -1 L 1 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr2-45" class="st15" v:arrowType="2" v:arrowSize="2" v:setback="2.13684" refX="-2.1368421052632"
+ orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(-2.3263157894737,-2.3263157894737) "/>
+ </marker>
+ <g id="lend10">
+ <path
+ d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "
+ style="stroke:none"/>
+ </g>
+ <marker id="mrkr10-112" class="st24" v:arrowType="10" v:arrowSize="1" v:setback="1.542" refX="1.542" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend10" transform="scale(2.44) "/>
+ </marker>
+ <g id="lend42">
+ <path
+ d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "
+ style="stroke:none"/>
+ </g>
+ <marker id="mrkr42-163" class="st35" v:arrowType="42" v:arrowSize="2" v:setback="3.27" refX="3.27" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend42" transform="scale(4.36) "/>
+ </marker>
+ <marker id="mrkr42-167" class="st37" v:arrowType="42" v:arrowSize="2" v:setback="3.27" refX="3.27" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend42" transform="scale(4.36) "/>
+ </marker>
+ <g id="lend4">
+ <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr4-210" class="st45" v:arrowType="4" v:arrowSize="2" v:setback="4.08" refX="4.08" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(2.12) "/>
+ </marker>
+ <marker id="mrkr4-212" class="st45" v:arrowType="4" v:arrowSize="2" v:setback="4.08" refX="-4.08" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-2.12,-2.12) "/>
+ </marker>
+ <marker id="mrkr2-350" class="st57" v:arrowType="2" v:arrowSize="2" v:setback="2.08" refX="-2.08" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(-2.26,-2.26) "/>
+ </marker>
+ <marker id="mrkr2-381" class="st59" v:arrowType="2" v:arrowSize="2" v:setback="3.88" refX="3.88" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(4.36) "/>
+ </marker>
+ <marker id="mrkr2-383" class="st59" v:arrowType="2" v:arrowSize="2" v:setback="3.88" refX="-3.88" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ <marker id="mrkr4-405" class="st65" v:arrowType="4" v:arrowSize="2" v:setback="5.744" refX="5.744" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(3.016) "/>
+ </marker>
+ <marker id="mrkr4-411" class="st65" v:arrowType="4" v:arrowSize="2" v:setback="6.032" refX="-6.032" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-3.016,-3.016) "/>
+ </marker>
+ <marker id="mrkr10-430" class="st24" v:arrowType="10" v:arrowSize="1" v:setback="1.542" refX="-1.542" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend10" transform="scale(-2.44,-2.44) "/>
+ </marker>
+ </defs>
+ <defs id="Filters">
+ <filter id="filter_3.3333334922791">
+ <feGaussianBlur stdDeviation="3.3333334922791"/>
+ </filter>
+ </defs>
+ <g v:mID="8" v:index="1" v:groupContext="backgroundPage">
+ <v:userDefs>
+ <v:ud v:nameU="msvVisioCreated" v:prompt="" v:val="VT0(0):26"/>
+ </v:userDefs>
+ <title>VBackground-1</title>
+ <v:pageProperties width="12.1281" height="9.93872" v:drawingScale="1" v:pageScale="1" v:drawingUnits="19"
+ v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+ <g id="shape1-1" v:mID="1" v:groupContext="shape">
+ <title>Solid</title>
+ <v:userDefs>
+ <v:ud v:nameU="Background" v:val="VT0(0):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ <v:ud v:nameU="msvShapeCategories" v:prompt="" v:val="VT4(DoNotContain)"/>
+ <v:ud v:nameU="msvVisioCreated" v:prompt="" v:val="VT0(0):26"/>
+ </v:userDefs>
+ <rect x="0" y="0" width="873.222" height="715.588" class="st1"/>
+ </g>
+ </g>
+ <g v:mID="4" v:index="3" v:groupContext="foregroundPage">
+ <title>Page-2</title>
+ <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="19" v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+ <v:layer v:name="Connector" v:index="0"/>
+ <g id="shape52-3" v:mID="52" v:groupContext="shape" transform="translate(336.222,-197.713)">
+ <title>Rectangle.52</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="598.588" width="495" height="117" class="st2"/>
+ </g>
+ <g id="group5-5" transform="translate(772.722,-60.4625)" v:mID="5" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can</title>
+ <desc>Redfish Service</desc>
+ <g id="shape6-6" v:mID="6" v:groupContext="shape">
+ <title>Sheet.6</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.15625):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT5(#ff1a1a)"/>
+ </v:userDefs>
+ <path d="M0 704.34 A26.4375 11.25 -180 1 0 52.88 704.34 L52.88 663.84 L0 663.84 L0 704.34 Z" class="st3"/>
+ </g>
+ <g id="shape5-8" v:mID="5" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="2"/>
+ <v:textRect cx="26.4375" cy="684.088" width="52.88" height="63"/>
+ <ellipse cx="26.4375" cy="663.838" rx="26.4375" ry="11.25" class="st3"/>
+ <text x="7.83" y="693.59" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Redfish <tspan
+ x="8.6" dy="1.2em" class="st5">Service</tspan></text> </g>
+ </g>
+ <g id="shape8-12" v:mID="8" v:groupContext="shape" transform="translate(746.847,-24.4625)">
+ <title>Sheet.8</title>
+ <desc>Redfish Profile Simulator On Network</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="17.62" y="693.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Redfish Profile <tspan
+ x="21.08" dy="1em" class="st5">Simulator On </tspan><tspan x="32.24" dy="1em" class="st5">Network</tspan></text> </g>
+ <g id="shape10-17" v:mID="10" v:groupContext="shape" transform="translate(408.222,-82.9625)">
+ <title>Sheet.10</title>
+ <desc>EFI REST EX</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="99.8" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI REST EX </text> </g>
+ <g id="shape12-20" v:mID="12" v:groupContext="shape" transform="translate(57.2224,-197.713)">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="598.588" width="234" height="117" class="st2"/>
+ </g>
+ <g id="shape13-22" v:mID="13" v:groupContext="shape" transform="translate(30.2224,-24.4625)">
+ <title>Rounded Rectangle.76</title>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ </v:userDefs>
+ <g id="shadow13-23" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-6.84,-13.2318)" class="st10">
+ <path d="M9 715.59 L675 715.59 A8.99985 8.99985 -180 0 0 684 706.59 L684 616.59 A8.99985 8.99985 -180 0 0 675 607.59
+ L9 607.59 A8.99985 8.99985 -180 0 0 0 616.59 L0 706.59 A8.99985 8.99985 -180 0 0 9 715.59 Z"
+ class="st11"/>
+ </g>
+ <path d="M9 715.59 L675 715.59 A8.99985 8.99985 -180 0 0 684 706.59 L684 616.59 A8.99985 8.99985 -180 0 0 675 607.59
+ L9 607.59 A8.99985 8.99985 -180 0 0 0 616.59 L0 706.59 A8.99985 8.99985 -180 0 0 9 715.59 Z" class="st12"/>
+ </g>
+ <g id="shape16-27" v:mID="16" v:groupContext="shape" transform="translate(75.2224,-82.9625)">
+ <title>Sheet.16</title>
+ <desc>EFI REST JSON to C Structure</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="53.89" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI REST JSON to C Structure</text> </g>
+ <g id="shape17-30" v:mID="17" v:groupContext="shape" transform="translate(408.222,-37.9625)">
+ <title>Sheet.17</title>
+ <desc>EFI Network Stack</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="81.72" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI Network Stack</text> </g>
+ <g id="shape18-33" v:mID="18" v:groupContext="shape" transform="translate(75.2224,-37.9625)">
+ <title>Sheet.18</title>
+ <desc>EFI Redfish Discover Protocl</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="55.56" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI Redfish Discover Protocl</text> </g>
+ <g id="shape19-36" v:mID="19" v:groupContext="shape" transform="translate(291.222,-51.4625)">
+ <title>Sheet.19</title>
+ <desc>EDKII Redfish Foundation</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="92" cy="693.088" width="184.01" height="45"/>
+ <rect x="0" y="670.588" width="184" height="45" class="st6"/>
+ <text x="12.66" y="685.89" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>EDKII Redfish <tspan
+ x="26.69" dy="1.2em" class="st5">Foundation</tspan></text> </g>
+ <g id="shape20-40" v:mID="20" v:groupContext="shape" v:layerMember="0"
+ transform="translate(904.308,1335.5) rotate(-19.179) scale(1,-1)">
+ <title>Curve connect 1</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 715.59 A42.4531 42.4531 0 0 1 54.79 715.59 A42.4531 42.4531 -180 0 0 106.06 718.26 L106.35 718.04"
+ class="st14"/>
+ </g>
+ <g id="shape21-46" v:mID="21" v:groupContext="shape" transform="translate(18.9724,-139.213)">
+ <title>Sheet.21</title>
+ <desc>EDKII Redfish Client</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalText="true"/>
+ <v:textRect cx="12.375" cy="463.588" width="24.75" height="504" transform="rotate(-180)"/>
+ <rect x="0" y="211.588" width="24.75" height="504" class="st16"/>
+ <text x="-10.85" y="-540.93" writing-mode="tb-rl" transform="rotate(180)" class="st17" v:langID="1033"><v:paragraph
+ v:horizAlign="1"/><v:tabList/>EDKII Redfish Client</text> </g>
+ <g id="shape24-49" v:mID="24" v:groupContext="shape" transform="translate(111.222,-253.963)">
+ <title>Sheet.24</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape25-51" v:mID="25" v:groupContext="shape" transform="translate(84.2224,-240.463)">
+ <title>Sheet.25</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape26-53" v:mID="26" v:groupContext="shape" transform="translate(75.2224,-226.963)">
+ <title>Sheet.26</title>
+ <desc>Script-generated Redfish JSON schema to C Structure convertor</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="76.5" cy="693.088" width="153" height="45"/>
+ <rect x="0" y="670.588" width="153" height="45" class="st19"/>
+ <text x="11.2" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated Redfish <tspan
+ x="29.22" dy="1em" class="st5">JSON schema to C </tspan><tspan x="24.45" dy="1em" class="st5">Structure convertor</tspan></text> </g>
+ <g id="shape28-58" v:mID="28" v:groupContext="shape" transform="translate(241.722,-267.463)">
+ <title>Sheet.28</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape29-60" v:mID="29" v:groupContext="shape" transform="translate(245.66,-272.525)">
+ <title>Sheet.29</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape30-62" v:mID="30" v:groupContext="shape" transform="translate(250.16,-277.588)">
+ <title>Sheet.30</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape31-64" v:mID="31" v:groupContext="shape" transform="translate(178.722,-204.463)">
+ <title>Sheet.31</title>
+ <desc>ComputerSystem</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="18.16" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>ComputerSystem</text> </g>
+ <g id="shape32-67" v:mID="32" v:groupContext="shape" transform="translate(201.222,-220.213)">
+ <title>Sheet.32</title>
+ <desc>BootOption</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="29.69" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>BootOption</text> </g>
+ <g id="shape33-70" v:mID="33" v:groupContext="shape" transform="translate(210.222,-233.713)">
+ <title>Sheet.33</title>
+ <desc>Memory</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="36.21" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Memory</text> </g>
+ <g id="shape34-73" v:mID="34" v:groupContext="shape" transform="translate(385.722,-247.213)">
+ <title>Sheet.34</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape35-75" v:mID="35" v:groupContext="shape" transform="translate(358.722,-233.713)">
+ <title>Sheet.35</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape36-77" v:mID="36" v:groupContext="shape" transform="translate(349.722,-220.213)">
+ <title>Sheet.36</title>
+ <desc>Script-generated EDK2 Redfish Feature Driver</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="76.5" cy="693.088" width="153" height="45"/>
+ <rect x="0" y="670.588" width="153" height="45" class="st19"/>
+ <text x="16.96" y="689.84" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated EDK2 <tspan
+ x="17.33" dy="1em" class="st5">Redfish Feature Driver</tspan></text> </g>
+ <g id="shape40-81" v:mID="40" v:groupContext="shape" transform="translate(453.222,-197.713)">
+ <title>Sheet.40</title>
+ <desc>ComputerSystem</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="18.16" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>ComputerSystem</text> </g>
+ <g id="shape41-84" v:mID="41" v:groupContext="shape" transform="translate(475.722,-213.463)">
+ <title>Sheet.41</title>
+ <desc>BootOption</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="29.69" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>BootOption</text> </g>
+ <g id="shape42-87" v:mID="42" v:groupContext="shape" transform="translate(493.722,-226.963)">
+ <title>Sheet.42</title>
+ <desc>Memory</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="36.21" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Memory</text> </g>
+ <g id="shape43-90" v:mID="43" v:groupContext="shape" transform="translate(608.472,-249.463)">
+ <title>Sheet.43</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape46-92" v:mID="46" v:groupContext="shape" transform="translate(738.972,-262.963)">
+ <title>Sheet.46</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape47-94" v:mID="47" v:groupContext="shape" transform="translate(742.91,-268.025)">
+ <title>Sheet.47</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape48-96" v:mID="48" v:groupContext="shape" transform="translate(747.41,-273.088)">
+ <title>Sheet.48</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape49-98" v:mID="49" v:groupContext="shape" transform="translate(660.222,-199.963)">
+ <title>Sheet.49</title>
+ <desc>ComputerSystemCollection</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="61.875" cy="702.088" width="123.75" height="27"/>
+ <rect x="0" y="688.588" width="123.75" height="27" class="st6"/>
+ <text x="5.3" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>ComputerSystemCollection</text> </g>
+ <g id="shape50-101" v:mID="50" v:groupContext="shape" transform="translate(720.972,-215.713)">
+ <title>Sheet.50</title>
+ <desc>BootOptionCollection</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="8.96" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>BootOptionCollection</text> </g>
+ <g id="shape51-104" v:mID="51" v:groupContext="shape" transform="translate(732.222,-229.213)">
+ <title>Sheet.51</title>
+ <desc>MemoryCollection</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="15.48" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>MemoryCollection</text> </g>
+ <g id="shape56-107" v:mID="56" v:groupContext="shape" v:layerMember="0"
+ transform="translate(515.651,-269.34) rotate(-1.84761)">
+ <title>Curve connect 2.56</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 69.79 715.59" class="st23"/>
+ </g>
+ <g id="shape57-113" v:mID="57" v:groupContext="shape" transform="translate(581.472,-235.963)">
+ <title>Sheet.57</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape59-115" v:mID="59" v:groupContext="shape" v:layerMember="0" transform="translate(291.222,-242.713)">
+ <title>1-D double</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L31.5 710.19 L31.5 715.59 L45 702.09 L31.5 688.59
+ L31.5 693.99 L13.5 693.99 Z" class="st25"/>
+ </g>
+ <g id="shape64-117" v:mID="64" v:groupContext="shape" transform="translate(619.722,-467.713)">
+ <title>Sheet.64</title>
+ <desc>EDKII REDFISH_PLATFORM_CONFIG_PROTOCOL</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="99" cy="693.088" width="198" height="45"/>
+ <g id="shadow64-118" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.98,-13.8618)" class="st10">
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st26"/>
+ </g>
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st27"/>
+ <text x="85.18" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDKII <tspan
+ x="5.65" dy="1em" class="st5">REDFISH</tspan>_PLATFORM_CONFIG_PRO<tspan x="81.03" dy="1em" class="st5">TOCOL</tspan></text> </g>
+ <g id="shape65-125" v:mID="65" v:groupContext="shape" transform="translate(511.722,-445.213)">
+ <title>Sheet.65</title>
+ <desc>EDKII REDFISH_PLATFORM_CONFIG_PROTOCOL</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="99" cy="693.088" width="198" height="45"/>
+ <g id="shadow65-126" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.98,-13.8618)" class="st10">
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st26"/>
+ </g>
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st28"/>
+ <text x="85.18" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDKII <tspan
+ x="5.65" dy="1em" class="st5">REDFISH</tspan>_PLATFORM_CONFIG_PRO<tspan x="81.03" dy="1em" class="st5">TOCOL</tspan></text> </g>
+ <g id="shape67-133" v:mID="67" v:groupContext="shape" transform="translate(536.472,-593.713)">
+ <title>Sheet.67</title>
+ <desc>Other Platform-specific Implementations</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="121.5" cy="702.088" width="243" height="27"/>
+ <rect x="0" y="688.588" width="243" height="27" class="st6"/>
+ <text x="20.02" y="705.09" class="st29" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Other Platform-specific Implementations</text> </g>
+ <g id="group71-136" transform="translate(567.972,-530.713)" v:mID="71" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can.71</title>
+ <desc>EFI Variable/ FW Storage</desc>
+ <g id="shape72-137" v:mID="72" v:groupContext="shape">
+ <title>Sheet.72</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.0875):1"/>
+ </v:userDefs>
+ <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st30"/>
+ </g>
+ <g id="shape71-139" v:mID="71" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="29.25" cy="684.088" width="58.5" height="63"/>
+ <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st30"/>
+ <text x="23.25" y="675.09" class="st31" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>EFI <tspan
+ x="10.54" dy="1.2em" class="st5">Variable</tspan>/ <tspan x="5.79" dy="1.2em" class="st5">FW Storage</tspan></text> </g>
+ </g>
+ <g id="group73-144" transform="translate(687.222,-530.713)" v:mID="73" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can.73</title>
+ <desc>Other Storage</desc>
+ <g id="shape74-145" v:mID="74" v:groupContext="shape">
+ <title>Sheet.74</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.0875):1"/>
+ </v:userDefs>
+ <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st30"/>
+ </g>
+ <g id="shape73-147" v:mID="73" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="29.25" cy="684.088" width="58.5" height="63"/>
+ <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st30"/>
+ <text x="17.41" y="681.09" class="st31" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Other <tspan
+ x="13.66" dy="1.2em" class="st5">Storage</tspan></text> </g>
+ </g>
+ <g id="shape76-151" v:mID="76" v:groupContext="shape" v:layerMember="0" transform="translate(1306.06,184.875) rotate(90)">
+ <title>1-D double.76</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L33.75 712.89 L33.75 715.59 L40.5 708.84 L33.75
+ 702.09 L33.75 704.79 L6.75 704.79 Z" class="st32"/>
+ </g>
+ <g id="shape77-153" v:mID="77" v:groupContext="shape" v:layerMember="0" transform="translate(1425.31,184.875) rotate(90)">
+ <title>1-D double.77</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L11.25 712.89 L11.25 715.59 L18 708.84 L11.25
+ 702.09 L11.25 704.79 L6.75 704.79 Z" class="st32"/>
+ </g>
+ <g id="shape78-155" v:mID="78" v:groupContext="shape" transform="translate(21.2224,-139.213)">
+ <title>Sheet.78</title>
+ <path d="M0 715.59 L810 715.59" class="st33"/>
+ </g>
+ <g id="group80-158" transform="translate(-173.49,382.875) rotate(-90)" v:mID="80" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="ControlDistFromCorner" v:prompt="" v:val="VT0(0.35355339059327):1"/>
+ <v:ud v:nameU="AngToControl" v:prompt="" v:val="VT0(0.78539816339745):32"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="ControlDistFromCorner" v:prompt="" v:val="VT0(0.57622152858081):1"/>
+ <v:ud v:nameU="AngToControl" v:prompt="" v:val="VT0(0.70862627212768):32"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.44270833333333):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.3794642857143):1"/>
+ </v:userDefs>
+ <title>Folded Corner</title>
+ <g id="shape80-159" v:mID="80" v:groupContext="groupContent">
+ <g id="shadow80-160" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-3.105,-9.45175)" class="st10">
+ <path d="M0 715.59 L278.62 715.59 L310.5 688.27 L310.5 229.59 L0 229.59 L0 715.59 Z" class="st34"/>
+ </g>
+ <path d="M0 715.59 L278.62 715.59 L310.5 688.27 L310.5 229.59 L0 229.59 L0 715.59 Z" class="st36"/>
+ </g>
+ <g id="shape81-168" v:mID="81" v:groupContext="shape" transform="translate(278.625,0)">
+ <title>Sheet.81</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlX" v:prompt="" v:val="VT0(1):1"/>
+ <v:ud v:nameU="ControlY" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlX" v:prompt="" v:val="VT0(3.9375):1"/>
+ <v:ud v:nameU="ControlY" v:prompt="" v:val="VT0(0.4375):1"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.44270833333333):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.3794642857143):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT5(#f2f2f2)"/>
+ </v:userDefs>
+ <g id="shadow81-169" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-0.6375,-14.3117)" class="st10">
+ <path d="M0 715.59 L31.88 688.27 L4.87 684.09 L0 715.59 Z" class="st34"/>
+ </g>
+ <path d="M0 715.59 L31.88 688.27 L4.87 684.09 L0 715.59 Z" class="st38"/>
+ </g>
+ </g>
+ <g id="group82-175" transform="translate(432.972,-530.713)" v:mID="82" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can.69</title>
+ <desc>EDK2 HII Database</desc>
+ <g id="shape83-176" v:mID="83" v:groupContext="shape">
+ <title>Sheet.83</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.0875):1"/>
+ </v:userDefs>
+ <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st39"/>
+ </g>
+ <g id="shape82-178" v:mID="82" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="29.25" cy="684.088" width="58.5" height="63"/>
+ <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st39"/>
+ <text x="11.84" y="681.09" class="st31" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>EDK2 HII <tspan
+ x="10.24" dy="1.2em" class="st5">Database</tspan></text> </g>
+ </g>
+ <g id="shape84-182" v:mID="84" v:groupContext="shape" transform="translate(390.222,-429.463)">
+ <title>Sheet.84</title>
+ <desc>EDKII REDFISH_PLATFORM_CONFIG_PROTOCOL</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="72" cy="693.088" width="144" height="45"/>
+ <g id="shadow84-183" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.44,-13.8618)" class="st10">
+ <rect x="0" y="670.588" width="144" height="45" class="st40"/>
+ </g>
+ <rect x="0" y="670.588" width="144" height="45" class="st41"/>
+ <text x="58.18" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDKII <tspan
+ x="6" dy="1em" class="st5">REDFISH</tspan>_PLATFORM_CO<tspan x="26.68" dy="1em" class="st5">NFIG</tspan>_PROTOCOL</text> </g>
+ <g id="shape85-190" v:mID="85" v:groupContext="shape" v:layerMember="0" transform="translate(1171.06,184.875) rotate(90)">
+ <title>1-D double.75</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L49.5 712.89 L49.5 715.59 L56.25 708.84 L49.5
+ 702.09 L49.5 704.79 L6.75 704.79 Z" class="st39"/>
+ </g>
+ <g id="shape86-192" v:mID="86" v:groupContext="shape" v:layerMember="0" transform="translate(1164.31,286.125) rotate(90)">
+ <title>1-D double.68</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow86-193" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.1475,-14.0418)" class="st10">
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L101.25 710.19 L101.25 715.59 L114.75 702.09
+ L101.25 688.59 L101.25 693.99 L13.5 693.99 Z" class="st40"/>
+ </g>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L101.25 710.19 L101.25 715.59 L114.75 702.09 L101.25
+ 688.59 L101.25 693.99 L13.5 693.99 Z" class="st39"/>
+ </g>
+ <g id="shape87-197" v:mID="87" v:groupContext="shape" transform="translate(27.9724,-616.213)">
+ <title>Sheet.87</title>
+ <desc>EDK2 Open Source Implementation</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="121.5" cy="702.088" width="243" height="27"/>
+ <rect x="0" y="688.588" width="243" height="27" class="st6"/>
+ <text x="34.39" y="705.09" class="st29" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDK2 Open Source Implementation</text> </g>
+ <g id="shape88-200" v:mID="88" v:groupContext="shape" v:layerMember="0" transform="translate(1312.81,270.375) rotate(90)">
+ <title>1-D double.88</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L117 710.19 L117 715.59 L130.5 702.09 L117 688.59
+ L117 693.99 L13.5 693.99 Z" class="st42"/>
+ </g>
+ <g id="shape89-202" v:mID="89" v:groupContext="shape" v:layerMember="0" transform="translate(1434.31,247.875) rotate(90)">
+ <title>1-D double.89</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L139.5 710.19 L139.5 715.59 L153 702.09 L139.5
+ 688.59 L139.5 693.99 L13.5 693.99 Z" class="st43"/>
+ </g>
+ <g id="shape90-204" v:mID="90" v:groupContext="shape" v:layerMember="0"
+ transform="translate(838.629,252.112) rotate(68.1986)">
+ <title>Curve connect 1.61</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.53 720.84 L7.83 721.04 A30.61 30.61 -180 0 0 42.41 715.59 A30.61 30.61 0 0 1 76.99 710.13 L77.29 710.34"
+ class="st44"/>
+ </g>
+ <g id="shape91-213" v:mID="91" v:groupContext="shape" v:layerMember="0"
+ transform="translate(-37.5816,162.844) rotate(-60.2551) scale(-1,1)">
+ <title>Curve connect 1.62</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.67 720.62 L7.98 720.82 A34.3918 34.3918 -180 0 0 45.35 715.59 A34.3918 34.3918 0 0 1 82.72 710.35 L83.03
+ 710.55" class="st44"/>
+ </g>
+ <g id="shape94-220" v:mID="94" v:groupContext="shape" v:layerMember="0"
+ transform="translate(488.651,-255.84) rotate(-1.84761)">
+ <title>Curve connect 2.54</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 69.79 715.59" class="st23"/>
+ </g>
+ <g id="shape96-225" v:mID="96" v:groupContext="shape" transform="translate(572.472,-222.463)">
+ <title>Sheet.96</title>
+ <desc>Script-generated EDK2 Redfish Collection Driver</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="76.5" cy="693.088" width="153" height="45"/>
+ <rect x="0" y="670.588" width="153" height="45" class="st19"/>
+ <text x="16.96" y="689.84" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated EDK2 <tspan
+ x="11.39" dy="1em" class="st5">Redfish Collection Driver</tspan></text> </g>
+ <g id="shape98-229" v:mID="98" v:groupContext="shape" transform="translate(67.3474,-420.463)">
+ <title>Rounded Rectangle.98</title>
+ <desc>EDK2 HII UNI file #string STR_OPTION_A #language x-uefi-redfi...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="137.25" cy="672.838" width="274.5" height="85.5"/>
+ <path d="M7.73 715.59 L266.77 715.59 A7.73227 7.73227 -180 0 0 274.5 707.86 L274.5 637.82 A7.73227 7.73227 -180 0 0 266.77
+ 630.09 L7.73 630.09 A7.73227 7.73227 -180 0 0 -0 637.82 L0 707.86 A7.73227 7.73227 -180 0 0 7.73 715.59
+ Z" class="st46"/>
+ <text x="4" y="646.69" class="st47" v:langID="1033"><v:paragraph v:spBefore="6" v:bulletSize="0.166667"/><v:tabList/>EDK2 HII UNI file<v:lf/><tspan
+ x="4" dy="1.425em" class="st48">#</tspan><tspan class="st48">string </tspan><tspan class="st49">STR</tspan><tspan
+ class="st49">_</tspan><tspan class="st49">OPTION</tspan><tspan class="st49">_</tspan><tspan class="st49">A</tspan><tspan
+ class="st48"> </tspan><tspan class="st48">#</tspan><tspan class="st48">language </tspan><tspan
+ class="st49">x</tspan><tspan class="st49">-</tspan><tspan class="st49">uefi</tspan><tspan class="st49">-</tspan><tspan
+ class="st49">redfish</tspan><tspan class="st49">-</tspan><tspan class="st49">SCHEMA</tspan><tspan
+ class="st49">.</tspan><tspan class="st49">VERSION</tspan><tspan class="st48"> </tspan><tspan class="st49"> </tspan><tspan
+ x="4" dy="1.2em" class="st50">“</tspan><tspan class="st50">/</tspan><tspan class="st50">SCHEMA</tspan><tspan
+ class="st50">/</tspan><tspan class="st50">PropertyA</tspan><tspan class="st49">” </tspan><tspan
+ class="st48"> <v:newlineChar/><v:paragraph v:bulletSize="0.166667"/></tspan><tspan x="4" dy="1.2em"
+ class="st48">#</tspan><tspan class="st48">string</tspan><tspan class="st49"> </tspan><tspan class="st49">STR</tspan><tspan
+ class="st49">_</tspan><tspan class="st49">OPTION</tspan><tspan class="st49">_</tspan><tspan class="st49">B</tspan><tspan
+ class="st48"> </tspan><tspan class="st48">#</tspan><tspan class="st48">language</tspan><tspan class="st49"> </tspan><tspan
+ class="st49">x</tspan><tspan class="st49">-</tspan><tspan class="st49">uefi</tspan><tspan class="st49">-</tspan><tspan
+ class="st49">redfish</tspan><tspan class="st49">-</tspan><tspan class="st49">SCHEMA</tspan><tspan
+ class="st49">.</tspan><tspan class="st49">VERSION</tspan><tspan class="st48"> </tspan><tspan class="st50"> </tspan><tspan
+ x="4" dy="1.2em" class="st50">“</tspan><tspan class="st50">/</tspan><tspan class="st50">SCHEMA</tspan><tspan
+ class="st50">/</tspan><tspan class="st50">PropertyB</tspan><tspan class="st50">”<v:newlineChar/></tspan><tspan
+ x="4" dy="1.2em" class="st48">#</tspan><tspan class="st48">string </tspan><tspan class="st49">STR</tspan><tspan
+ class="st49">_</tspan><tspan class="st49">OPTION</tspan><tspan class="st49">_</tspan><tspan class="st48">C </tspan><tspan
+ class="st48">#</tspan><tspan class="st48">language</tspan><tspan class="st49"> </tspan><tspan class="st49">x</tspan><tspan
+ class="st49">-</tspan><tspan class="st49">uefi</tspan><tspan class="st49">-</tspan><tspan class="st49">redfish</tspan><tspan
+ class="st49">-</tspan><tspan class="st49">SCHEMA</tspan><tspan class="st49">.</tspan><tspan class="st49">VERSION</tspan><tspan
+ class="st48"> </tspan><tspan class="st50"> </tspan><tspan x="4" dy="1.312em" class="st50">“</tspan><tspan
+ class="st50">/</tspan><tspan class="st50">SCHEMA</tspan><tspan class="st50">/</tspan><tspan class="st50">PropertyC</tspan><tspan
+ class="st50">”</tspan><v:newlineChar/></text> </g>
+ <g id="shape100-316" v:mID="100" v:groupContext="shape" transform="translate(171.972,-550.963)">
+ <title>Rounded Rectangle.100</title>
+ <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="76.5" cy="688.025" width="153" height="55.125"/>
+ <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46
+ L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"
+ class="st51"/>
+ <text x="37.65" y="671.66" class="st52" v:langID="1033"><v:paragraph v:spLine="-0.8" v:horizAlign="1"/><v:tabList/>EDK2 HII VFR Form<v:lf/><v:lf/><tspan
+ x="24.37" dy="1.6em" class="st53">Option A Enabled<v:newlineChar/></tspan><tspan x="24.6" dy="0.8em"
+ class="st53">Option B Disabled<v:newlineChar/></tspan><tspan x="24.4" dy="0.8em" class="st53">Option C </tspan><tspan
+ class="st53">0</tspan><tspan class="st53">x</tspan><tspan class="st53">16</tspan></text> </g>
+ <g id="shape101-325" v:mID="101" v:groupContext="shape" transform="translate(147.222,-539.713)">
+ <title>Rounded Rectangle.101</title>
+ <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="76.5" cy="688.025" width="153" height="55.125"/>
+ <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46
+ L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"
+ class="st51"/>
+ <text x="37.65" y="671.66" class="st52" v:langID="1033"><v:paragraph v:spLine="-0.8" v:horizAlign="1"/><v:tabList/>EDK2 HII VFR Form<v:lf/><v:lf/><tspan
+ x="24.37" dy="1.6em" class="st53">Option A Enabled<v:newlineChar/></tspan><tspan x="24.6" dy="0.8em"
+ class="st53">Option B Disabled<v:newlineChar/></tspan><tspan x="24.4" dy="0.8em" class="st53">Option C </tspan><tspan
+ class="st53">0</tspan><tspan class="st53">x</tspan><tspan class="st53">16</tspan></text> </g>
+ <g id="shape102-334" v:mID="102" v:groupContext="shape" transform="translate(129.222,-526.213)">
+ <title>Rounded Rectangle</title>
+ <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="76.5" cy="688.025" width="153" height="55.125"/>
+ <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46
+ L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"
+ class="st51"/>
+ <text x="29.88" y="671.66" class="st29" v:langID="1033"><v:paragraph v:spLine="-0.8" v:horizAlign="1"/><v:tabList/>EDK2 HII VFR Form<v:lf/><v:lf/><tspan
+ x="24.37" dy="1.6em" class="st54">Option A </tspan><tspan class="st55">Enabled<v:newlineChar/></tspan><tspan
+ x="24.6" dy="0.8em" class="st54">Option B </tspan><tspan class="st55">Disabled<v:newlineChar/></tspan><tspan
+ x="24.4" dy="0.8em" class="st54">Option C </tspan><tspan class="st55">0</tspan><tspan
+ class="st55">x</tspan><tspan class="st55">16</tspan></text> </g>
+ <g id="shape110-345" v:mID="110" v:groupContext="shape" v:layerMember="0"
+ transform="translate(503.938,-444.613) rotate(13.0919)">
+ <title>Curve connect 1.110</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 715.59 A11.592 11.592 0 0 1 22.97 715.59 A13.4718 13.4718 -180 0 0 48.31 719.9 L48.42 719.56" class="st56"/>
+ </g>
+ <g id="shape122-351" v:mID="122" v:groupContext="shape" transform="translate(41.4724,-96.4625)">
+ <title>Sheet.122</title>
+ <desc>[1]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[1]</text> </g>
+ <g id="shape123-354" v:mID="123" v:groupContext="shape" transform="translate(746.847,-100.963)">
+ <title>Sheet.123</title>
+ <desc>[2]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[2]</text> </g>
+ <g id="shape124-357" v:mID="124" v:groupContext="shape" transform="translate(68.4724,-278.713)">
+ <title>Sheet.124</title>
+ <desc>[3]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[3]</text> </g>
+ <g id="shape125-360" v:mID="125" v:groupContext="shape" transform="translate(338.472,-269.713)">
+ <title>Sheet.125</title>
+ <desc>[4]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[4]</text> </g>
+ <g id="shape126-363" v:mID="126" v:groupContext="shape" transform="translate(761.472,-269.713)">
+ <title>Sheet.126</title>
+ <desc>[5]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[5]</text> </g>
+ <g id="shape127-366" v:mID="127" v:groupContext="shape" transform="translate(390.222,-476.713)">
+ <title>Sheet.127</title>
+ <desc>[6]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[6]</text> </g>
+ <g id="shape128-369" v:mID="128" v:groupContext="shape" transform="translate(123.597,-579.088)">
+ <title>Sheet.128</title>
+ <desc>[8]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[8]</text> </g>
+ <g id="shape129-372" v:mID="129" v:groupContext="shape" transform="translate(62.8474,-501.463)">
+ <title>Sheet.129</title>
+ <desc>[9]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[9]</text> </g>
+ <g id="shape132-375" v:mID="132" v:groupContext="shape" v:layerMember="0"
+ transform="translate(583.722,1233.46) rotate(180)">
+ <title>Curve connect 2.132</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M2.78 714.72 L3.12 714.61 A681.188 681.188 0 0 1 406.38 714.61 L406.72 714.72" class="st58"/>
+ </g>
+ <g id="shape133-384" v:mID="133" v:groupContext="shape" transform="translate(238.347,-157.213)">
+ <title>Sheet.133</title>
+ <desc>Script-generated EDK2 Redfish client driver/library based on ...</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="702.088" width="261" height="27"/>
+ <rect x="0" y="688.588" width="261" height="27" class="st1"/>
+ <text x="11.21" y="699.84" class="st60" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated EDK2 Redfish client driver/library based on the <tspan
+ x="45.23" dy="1em" class="st5">standard Redfish schemas </tspan>published by DMTF</text> </g>
+ <g id="shape134-388" v:mID="134" v:groupContext="shape" transform="translate(21.2224,-679.775)">
+ <title>Rectangle.134</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="703.213" width="24.75" height="12.375" class="st2"/>
+ </g>
+ <g id="shape135-390" v:mID="135" v:groupContext="shape" transform="translate(41.4724,-670.213)">
+ <title>Sheet.135</title>
+ <desc>Script-generated code</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="12.79" y="704.34" class="st61" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated code</text> </g>
+ <g id="shape137-393" v:mID="137" v:groupContext="shape" transform="translate(21.2224,-661.213)">
+ <title>Rectangle.137</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="703.213" width="24.75" height="12.375" class="st62"/>
+ </g>
+ <g id="shape138-395" v:mID="138" v:groupContext="shape" transform="translate(43.7224,-652.213)">
+ <title>Sheet.138</title>
+ <desc>UEFI/EDK2 open source</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="9.97" y="704.34" class="st61" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>UEFI/EDK2 open source</text> </g>
+ <g id="shape140-398" v:mID="140" v:groupContext="shape" transform="translate(281.66,-341.784)">
+ <title>Configure</title>
+ <v:userDefs>
+ <v:ud v:nameU="msvShapeCategories" v:prompt="" v:val="VT4(Icon)"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M41.27 698.83 C40.4 698.46 37.61 697.28 37.61 697.28 L37.79 694.96 L37.94 693.01 L37.69 689.29 L39.53 688.23
+ C39.53 688.23 40.46 687.84 41.33 687.49 C40.71 685.96 40.45 685.33 39.82 683.81 C38.94 684.17 36.06 685.35
+ 36.06 685.35 L34.63 683.57 C33.94 682.7 33.09 681.89 32.02 681.06 L30.33 679.75 L31.01 677.68 C31.01 677.68
+ 31.41 676.7 31.79 675.77 C30.27 675.14 29.64 674.88 28.12 674.26 C27.72 675.23 26.52 678.17 26.52 678.17
+ L24.28 677.95 C23.14 677.83 21.96 677.86 20.77 678.02 L18.64 678.3 L17.65 676.35 C17.65 676.35 17.21 675.31
+ 16.78 674.31 C15.27 674.95 14.64 675.21 13.13 675.85 C13.58 676.92 14.85 679.93 14.85 679.93 L13.12 681.37
+ C12.3 682.05 11.54 682.85 10.79 683.83 L9.49 685.52 L7.41 684.86 C7.41 684.86 6.28 684.4 5.17 683.96 C4.56
+ 685.49 4.31 686.12 3.69 687.65 C4.82 688.1 7.84 689.31 7.84 689.31 C7.84 689.31 7.65 692.73 7.63 693 C7.65
+ 693.25 7.7 694.01 7.7 694.03 C7.7 694.03 7.87 695.84 7.87 695.84 L6.79 696.82 C6.46 697.15 6.34 697.24 3.64
+ 698.3 C4.24 699.84 4.49 700.47 5.08 702.01 C6.21 701.57 9.36 700.34 9.36 700.34 L10.99 702.57 C11.49 703.19
+ 12.18 703.89 13.04 704.61 L14.63 705.96 L13.93 707.96 C13.93 707.96 13.45 709.08 12.97 710.2 C14.47 710.85
+ 15.1 711.12 16.61 711.77 C17.05 710.74 18.36 707.71 18.36 707.71 L20.65 708.03 C21.73 708.19 22.89 708.21
+ 24.1 708.1 L26.18 707.92 L27.11 709.84 C27.11 709.84 27.53 710.9 27.94 711.93 C29.47 711.32 30.1 711.07
+ 31.63 710.45 C31.25 709.51 30.04 706.48 30.04 706.48 L32.32 704.83 C32.97 704.31 33.71 703.56 34.48 702.62
+ L35.81 701 L37.85 701.7 C37.85 701.7 38.82 702.1 39.73 702.49 C40.37 700.97 40.64 700.34 41.27 698.83 ZM40.58
+ 695.32 C40.58 695.32 40.57 695.4 40.56 695.47 C40.95 695.64 44.96 697.33 44.96 697.33 L41.23 706.17 C41.23
+ 706.17 37.13 704.45 36.75 704.28 C36.7 704.34 36.65 704.41 36.65 704.41 C35.76 705.49 34.89 706.37 33.97
+ 707.11 C33.97 707.11 33.67 707.33 33.46 707.47 C33.62 707.88 35.28 712.02 35.28 712.02 L26.38 715.59 C26.38
+ 715.59 24.65 711.28 24.5 710.89 C24.42 710.9 24.34 710.9 24.34 710.9 C22.91 711.03 21.54 711 20.25 710.82
+ C20.25 710.82 20.17 710.8 20.09 710.79 C19.93 711.19 18.08 715.47 18.08 715.47 L9.27 711.66 C9.27 711.66
+ 11.18 707.25 11.34 706.86 C11.29 706.81 11.22 706.76 11.22 706.76 C10.23 705.92 9.41 705.09 8.72 704.23
+ C8.72 704.23 8.51 703.94 8.37 703.75 C7.96 703.9 3.49 705.65 3.49 705.65 L0 696.71 C0 696.71 4.8 694.83
+ 4.8 694.83 C4.8 694.83 4.88 694.8 4.95 694.78 C4.92 694.54 4.89 694.21 4.89 694.21 L4.82 693.02 C4.82 693.02
+ 4.9 691.52 4.92 691.17 C4.54 691.02 0.04 689.21 0.04 689.21 L3.6 680.3 C3.6 680.3 8.06 682.09 8.46 682.25
+ C8.51 682.18 8.56 682.12 8.56 682.12 C9.43 680.98 10.34 680.02 11.33 679.2 C11.33 679.2 11.39 679.15 11.45
+ 679.11 C11.29 678.72 9.45 674.35 9.45 674.35 L18.29 670.62 C18.29 670.62 20.07 674.85 20.24 675.25 C20.31
+ 675.24 20.39 675.23 20.39 675.23 C21.8 675.04 23.2 675.01 24.56 675.15 C24.56 675.15 24.63 675.16 24.71
+ 675.16 C24.87 674.78 26.59 670.59 26.59 670.59 L35.46 674.23 C35.46 674.23 33.77 678.34 33.61 678.74 C33.67
+ 678.78 33.74 678.83 33.74 678.83 C34.99 679.8 35.99 680.77 36.82 681.8 C36.82 681.8 36.88 681.88 36.94 681.95
+ C37.33 681.79 41.35 680.14 41.35 680.14 L45 689.02 C45 689.02 40.99 690.67 40.6 690.83 C40.61 690.9 40.62
+ 690.98 40.62 690.98 C40.71 691.76 40.75 692.41 40.75 693.01 C40.75 693.7 40.7 694.43 40.58 695.32 ZM26.56
+ 697.76 C29.16 695.67 29.58 691.87 27.5 689.26 C25.42 686.65 21.62 686.23 19.01 688.31 C16.41 690.4 15.98
+ 694.2 18.07 696.81 C20.15 699.42 23.95 699.84 26.56 697.76 ZM23.76 684.23 C26.11 684.49 28.22 685.65 29.7
+ 687.5 C32.75 691.32 32.12 696.9 28.31 699.95 C26.47 701.43 24.16 702.1 21.8 701.84 C19.45 701.58 17.34 700.41
+ 15.87 698.56 C14.57 696.94 13.93 694.98 13.93 693.04 C13.93 690.44 15.07 687.86 17.25 686.12 C19.1 684.64
+ 21.41 683.97 23.76 684.23 Z" class="st63"/>
+ </g>
+ <g id="shape145-400" v:mID="145" v:groupContext="shape" v:layerMember="0"
+ transform="translate(323.911,1069.28) scale(1,-1)">
+ <title>Side to top/bottom.145</title>
+ <v:userDefs>
+ <v:ud v:nameU="TextPos" v:val="VT0(0):5"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.18 715.59 L7.54 715.59 L96.69 715.59 L96.69 668.4" class="st64"/>
+ </g>
+ <g id="shape146-406" v:mID="146" v:groupContext="shape" v:layerMember="0" transform="translate(204.597,-382.144)">
+ <title>Bottom to top fixed 2</title>
+ <v:userDefs>
+ <v:ud v:nameU="TextPos" v:val="VT0(1):26"/>
+ <v:ud v:nameU="Offset" v:val="VT0(0.25):0"/>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 677.27 L0 697.59 L99.14 697.59 L99.14 708.05" class="st66"/>
+ </g>
+ <g id="shape150-412" v:mID="150" v:groupContext="shape" v:layerMember="0" transform="translate(281.66,1070.51) rotate(180)">
+ <title>Side to top/bottom</title>
+ <v:userDefs>
+ <v:ud v:nameU="TextPos" v:val="VT0(0):5"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.18 715.59 L7.54 715.59 L107.44 715.59 L107.44 669.64" class="st64"/>
+ </g>
+ <g id="shape152-417" v:mID="152" v:groupContext="shape" transform="translate(173.097,-359.713)">
+ <title>Sheet.152</title>
+ <desc>[10]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="22.5" cy="702.088" width="45" height="27"/>
+ <rect x="0" y="688.588" width="45" height="27" class="st6"/>
+ <text x="12.52" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[10]</text> </g>
+ <g id="shape153-420" v:mID="153" v:groupContext="shape" transform="translate(186.597,-359.713)">
+ <title>Sheet.153</title>
+ <desc>EDK2 Build Tool</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="21.18" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDK2 Build Tool</text> </g>
+ <g id="shape95-423" v:mID="95" v:groupContext="shape" v:layerMember="0"
+ transform="translate(479.651,-242.34) rotate(-1.84761)">
+ <title>Curve connect 2</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 68.5 713.7 L68.7 713.99" class="st67"/>
+ </g>
+ <g id="shape154-431" v:mID="154" v:groupContext="shape" transform="translate(546.597,-607.213)">
+ <title>Sheet.154</title>
+ <desc>[7]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[7]</text> </g>
+ <g id="shape155-434" v:mID="155" v:groupContext="shape" v:layerMember="0"
+ transform="translate(919.083,249.319) rotate(-86.8202) scale(1,-1)">
+ <title>Curve connect 1.155</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 715.59 A6.2366 6.2366 0 0 1 11.73 715.59 A4.54475 4.54475 -180 0 0 20.28 715.59" class="st68"/>
+ </g>
+ </g>
+</svg>
--
2.17.1


回复: [PATCH v1 1/1] Add MemoryFence implementation for RiscV64

gaoliming
 

Acked-by: Liming Gao <gaoliming@...>

-----邮件原件-----
发件人: Chang, Abner (HPS SW/FW Technologist) <abner.chang@...>
发送时间: 2021年7月14日 22:12
收件人: Schaefer, Daniel <daniel.schaefer@...>; devel@edk2.groups.io
抄送: Michael D Kinney <michael.d.kinney@...>; Liming Gao
<gaoliming@...>; Zhiguang Liu <zhiguang.liu@...>; Leif
Lindholm <leif@...>
主题: RE: [PATCH v1 1/1] Add MemoryFence implementation for RiscV64

Reviewed-by: Abner Chang <abner.chang@...>

-----Original Message-----
From: Schaefer, Daniel
Sent: Sunday, May 16, 2021 2:13 AM
To: devel@edk2.groups.io
Cc: Chang, Abner (HPS SW/FW Technologist) <abner.chang@...>;
Michael D Kinney <michael.d.kinney@...>; Liming Gao
<gaoliming@...>; Zhiguang Liu <zhiguang.liu@...>; Leif
Lindholm <leif@...>
Subject: [PATCH v1 1/1] Add MemoryFence implementation for RiscV64

Cc: Abner Chang <abner.chang@...>
Cc: Michael D Kinney <michael.d.kinney@...>
Cc: Liming Gao <gaoliming@...>
Cc: Zhiguang Liu <zhiguang.liu@...>
Cc: Leif Lindholm <leif@...>
Signed-off-by: Daniel Schaefer <daniel.schaefer@...>
---
MdePkg/Library/BaseLib/BaseLib.inf | 1 +
MdePkg/Library/BaseLib/RiscV64/MemoryFence.S | 33
++++++++++++++++++++
2 files changed, 34 insertions(+)

diff --git a/MdePkg/Library/BaseLib/BaseLib.inf
b/MdePkg/Library/BaseLib/BaseLib.inf
index b76f3af380ea..b7ab5f632366 100644
--- a/MdePkg/Library/BaseLib/BaseLib.inf
+++ b/MdePkg/Library/BaseLib/BaseLib.inf
@@ -399,6 +399,7 @@
RiscV64/DisableInterrupts.c

RiscV64/EnableInterrupts.c

RiscV64/CpuPause.c

+ RiscV64/MemoryFence.S | GCC

RiscV64/RiscVSetJumpLongJump.S | GCC

RiscV64/RiscVCpuBreakpoint.S | GCC

RiscV64/RiscVCpuPause.S | GCC

diff --git a/MdePkg/Library/BaseLib/RiscV64/MemoryFence.S
b/MdePkg/Library/BaseLib/RiscV64/MemoryFence.S
new file mode 100644
index 000000000000..283df9356a9a
--- /dev/null
+++ b/MdePkg/Library/BaseLib/RiscV64/MemoryFence.S
@@ -0,0 +1,33 @@
+##-------------------------------------------------------------------------
-----

+#

+# MemoryFence() for RiscV64

+

+# Copyright (c) 2021, Hewlett Packard Enterprise Development. All
rights
reserved.

+#

+# SPDX-License-Identifier: BSD-2-Clause-Patent

+#

+##-------------------------------------------------------------------------
-----

+

+.text

+.p2align 2

+

+ASM_GLOBAL ASM_PFX(MemoryFence)

+

+

+#/**

+# Used to serialize load and store operations.

+#

+# All loads and stores that proceed calls to this function are
guaranteed
to
be

+# globally visible when this function returns.

+#

+#**/

+#VOID

+#EFIAPI

+#MemoryFence (

+# VOID

+# );

+#

+ASM_PFX(MemoryFence):

+ // Fence on all memory and I/O

+ fence

+ ret

--
2.30.1


回复: [PATCH] BaseTools GenFw: Add support for R_RISCV_PCREL_LO12_S relocation

gaoliming
 

Acked-by: Liming Gao <gaoliming@...>

-----邮件原件-----
发件人: Sunil V L <sunilvl@...>
发送时间: 2021年7月13日 18:14
收件人: Daniel Schaefer <daniel.schaefer@...>
抄送: devel@edk2.groups.io; sunil.vl@...; Liming Gao
<gaoliming@...>; Bob Feng <bob.c.feng@...>; Yuwei Chen
<yuwei.chen@...>; Pete Batard <pete@...>; Abner Chang
<abner.chang@...>
主题: Re: [PATCH] BaseTools GenFw: Add support for
R_RISCV_PCREL_LO12_S relocation

On Tue, Jul 13, 2021 at 05:27:30PM +0800, Daniel Schaefer wrote:
Looks good. I compared it with existing R_RISCV_PCREL_LO12_I and looked
at
the differences.
Thanks Daniel.

This one doesn't do use mRiscVPass1GotFixup.
I assume this is an optimization that's not possible here?
GOT fixup is required only for load to avoid the indirection for symbol
resolution.

Thanks
Sunil

Haven't tested that it works but since it works for Pete:

Reviewed-by: Daniel Schaefer <daniel.schaefer@...>

Thanks!

On 7/10/21 2:31 PM, Sunil V L wrote:
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3459

This patch adds support for R_RISCV_PCREL_LO12_S relocation type.
The logic is same as existing R_RISCV_PCREL_LO12_I relocation
except the difference between load vs store instruction formats.

Signed-off-by: Sunil V L <sunilvl@...>

Cc: Liming Gao <gaoliming@...>
Cc: Bob Feng <bob.c.feng@...>
Cc: Yuwei Chen <yuwei.chen@...>
Cc: Pete Batard <pete@...>
Cc: Abner Chang <abner.chang@...>
Cc: Daniel Schaefer <daniel.schaefer@...>
---
BaseTools/Source/C/GenFw/Elf64Convert.c | 55
+++++++++++++++++++++++++
1 file changed, 55 insertions(+)

diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c
b/BaseTools/Source/C/GenFw/Elf64Convert.c
index 3d7e20aaff..0bb3ead228 100644
--- a/BaseTools/Source/C/GenFw/Elf64Convert.c
+++ b/BaseTools/Source/C/GenFw/Elf64Convert.c
@@ -557,6 +557,60 @@ WriteSectionRiscV64 (
Value = (UINT32)(RV_X(*(UINT32 *)mRiscVPass1Targ, 12, 20));
break;
+ case R_RISCV_PCREL_LO12_S:
+ if (mRiscVPass1Targ != NULL && mRiscVPass1Sym != NULL &&
mRiscVPass1SymSecIndex != 0) {
+ int i;
+ Value2 = (UINT32)(RV_X(*(UINT32 *)mRiscVPass1Targ, 12, 20));
+
+ Value = ((UINT32)(RV_X(*(UINT32 *)Targ, 25, 7)) << 5);
+ Value = (Value | (UINT32)(RV_X(*(UINT32 *)Targ, 7, 5)));
+
+ if(Value & (RISCV_IMM_REACH/2)) {
+ Value |= ~(RISCV_IMM_REACH-1);
+ }
+ Value = Value - (UINT32)mRiscVPass1Sym->sh_addr +
mCoffSectionsOffset[mRiscVPass1SymSecIndex];
+
+ if(-2048 > (INT32)Value) {
+ i = (((INT32)Value * -1) / 4096);
+ Value2 -= i;
+ Value += 4096 * i;
+ if(-2048 > (INT32)Value) {
+ Value2 -= 1;
+ Value += 4096;
+ }
+ }
+ else if( 2047 < (INT32)Value) {
+ i = (Value / 4096);
+ Value2 += i;
+ Value -= 4096 * i;
+ if(2047 < (INT32)Value) {
+ Value2 += 1;
+ Value -= 4096;
+ }
+ }
+
+ // Update the IMM of SD instruction
+ //
+ // |31 25|24 20|19 15|14 12 |11 7|6
0|
+ // |-------------------------------------------|-------|
+ // |imm[11:5] | rs2 | rs1 | funct3 |imm[4:0] | opcode|
+ // ---------------------------------------------------
+
+ // First Zero out current IMM
+ *(UINT32 *)Targ &= ~0xfe000f80;
+
+ // Update with new IMM
+ *(UINT32 *)Targ |= (RV_X(Value, 5, 7) << 25);
+ *(UINT32 *)Targ |= (RV_X(Value, 0, 5) << 7);
+
+ // Update previous instruction
+ *(UINT32 *)mRiscVPass1Targ = (RV_X(Value2, 0, 20)<<12) |
(RV_X(*(UINT32 *)mRiscVPass1Targ, 0, 12));
+ }
+ mRiscVPass1Sym = NULL;
+ mRiscVPass1Targ = NULL;
+ mRiscVPass1SymSecIndex = 0;
+ break;
+
case R_RISCV_PCREL_LO12_I:
if (mRiscVPass1Targ != NULL && mRiscVPass1Sym != NULL &&
mRiscVPass1SymSecIndex != 0) {
int i;
@@ -1587,6 +1641,7 @@ WriteRelocations64 (
case R_RISCV_PCREL_HI20:
case R_RISCV_GOT_HI20:
case R_RISCV_PCREL_LO12_I:
+ case R_RISCV_PCREL_LO12_S:
break;
default:


Re: [PATCH v2 03/11] OvmfPkg: PlatformBootManagerLibGrub: Allow executing kernel via fw_cfg

Dov Murik
 

On 20/07/2021 1:36, Christoph Willing wrote:
On 20/7/21 3:58 am, Dov Murik wrote:


On 19/07/2021 15:56, Christoph Willing wrote:
Thanks for the clarification Dov.

I've been trying with just "normal" VMs, not SEV. I did already find and try the confidential-containers-demo sev-hashes-v2 branch but it didn't help - not surprising if it's not relevant to normal VMs.

Do you know whether this functionality (-kernel, -initrd, -append options) is actually supposed to work in normal VMs at the moment? The only conditions under which it works here with qemu-6.0.0 is with vUDK2017 & 2018 and an old ovmf binary package from kraxel.og dated 2017. Anything built from the edk2 master branch has failed when using those qemu options, although all the same builds work perfectly using the VMs' internal kernels & initrds. I've also extracted OVMF files from the current kraxel.org package as well as Ubuntu's (hirsute) package and these also fail the same way i.e. kernel boots and initrd works (loads modules) but then the VM filesystem doesn't seem to be found (no /dev/sdX exists to mount the filesystem root).

I guess this could be a qemu problem but since it works with some (old) udk/edk2 versions, I thought I'd look here first.

Can you please try with edk2 commit d1fc3d7ef3cb - just before we did
some changes around this QEMU-interop code in OVMF?
I just tried a build at d1fc3d7ef3cb... with the same result. Works with
VM's internal kernel & initrd but not with external (using -kernel,
-initrd & -append options).

As soon as I revert to OVMF files (CODE & VARS) from vUDK2018, all works
as expected with external kernel & initrd.

Since this problem seems to go back to around 2018, is it better to
report in bugzilla?
I think so.

Be sure to include full logs as much as possible and details about the
image you're trying to start; it seems to me that if the kernel starts
and initrd is mounted etc then both QEMU and OVMF are doing their part,
and there's something else that fails (but then again, reverting to an
old OVMF does solve it... IDK).

-Dov


Thanks,
chris


Re: [staging/edk2-redfish-client PATCH 1/2] RedfishClientPkg: Initial commit

Abner Chang
 

Thanks for catching this.

 

V2 sent.

Abner

 

From: Wang, Nickle (HPS SW)
Sent: Tuesday, July 20, 2021 10:38 AM
To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@...>; devel@edk2.groups.io
Cc: Liming Gao <gaoliming@...>; Andrew Fish <afish@...>; Leif Lindholm <leif@...>; Michael D Kinney <michael.d.kinney@...>; Wang, Nickle (HPS SW) <nickle.wang@...>
Subject: RE: [staging/edk2-redfish-client PATCH 1/2] RedfishClientPkg: Initial commit

 

Hi Abner,

 

I see typo here:

 

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;

};

 

It is EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL instead of EDKII_PLATFORM_CONFIG_TO_REDFISH_PROTOCOL. I update the description as below:

 

 

+### EDKII Redfish Platform Config Protocol ***[[6]](#[0])***

+EDKII Redfish Platform Config Protocol is an abstract driver that abstracts the platform

+configuration format and storage from EDK2 Redfish Feature driver. This protocol provides

+the interfaces to get and set platform configuration that format and the storage to store

+configuration are agnostic to the feature driver. The platform can provide its own EDKII

+Redfish Platform Config driver to access platform-specific configuration format and

+storage. On EDK2 open source, EDKII Redfish Platform Config Protocol accesses the

+platform configuration in EDK2 HII defined format.

+

+Below is the prototype of **EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL**,

+

+```C

+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;

+};

+```

+

+### Other instances of EDKII Redfish Platform Config Protocol ***[[7]](#[0])***

+For those Non-EDK2 HII-based platform configuration formats, the driver instance can

+provide its own implementation to get or set the platform configurations.

 

 

 

Thanks,

Nickle

 

-----Original Message-----
From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@...>
Sent: Saturday, July 17, 2021 10:02 PM
To: devel@edk2.groups.io
Cc: Wang, Nickle (HPS SW) <nickle.wang@...>; Liming Gao <gaoliming@...>; Andrew Fish <afish@...>; Leif Lindholm <leif@...>; Michael D Kinney <michael.d.kinney@...>
Subject: [staging/edk2-redfish-client PATCH 1/2] RedfishClientPkg: Initial commit

 

Initial commit of architecture diagrams and Readme.md

 

Signed-off-by: Abner Chang <abner.chang@...>

Cc: Nickle Wang <nickle.wang@...>

Cc: Liming Gao <gaoliming@...>

Cc: Andrew Fish <afish@...>

Cc: Leif Lindholm <leif@...>

Cc: Michael D Kinney <michael.d.kinney@...>

---

RedfishClientPkg/Readme.md                    | 180 +++++

.../Media/RedfishClientDriverStack.svg        | 680 ++++++++++++++++++

2 files changed, 860 insertions(+)

create mode 100644 RedfishClientPkg/Readme.md

create mode 100644 RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg

 

diff --git a/RedfishClientPkg/Readme.md b/RedfishClientPkg/Readme.md

new file mode 100644

index 0000000000..ce8c2f9409

--- /dev/null

+++ b/RedfishClientPkg/Readme.md

@@ -0,0 +1,180 @@

+# UEFI Redfish Client EDK2 Implementation

+

+## Introduction

+UEFI Redfish Client EDK2 solution is implemented base on

+[*EDK2 Redfish Foundation*](https://github.com/tianocore/edk2/blob/master/RedfishPkg/Readme.md),

+the implementation utilizes the EFI protocols provided by EDK2 Redfish

+Foundation to communicate with the Redfish service for creating, consuming, and

+updating the Redfish properties which are managed by firmware. This solution

+requests the instance of **EFI REST EX Protocol** through EFI Redfish Discover

+Protocol and interacts with Redfish service using **EFI REST EX Protocol** later

+on. The essential part of this implementation is to map the EDK2 HII options to

+the corresponding Redfish properties that are already defined in the standard

+Redfish schemas published by

+[*DMTF Redfish working group*](https://www.dmtf.org/standards/redfish).

+The advantage of this design is to strengthen the interoperability among the

+servers produced by different OEMs when configuring the platform through Redfish

+service. Using the properties defined in Redfish standard schema for configuring

+platform reduces the overhead of Redfish client tools to have different

+implementations in order to compliant with OEM servers. The solution also

+reduces OEM-defined proprietary BIOS Attributes that lead to the divergence of

+platform configuration namings in Redfish BIOS Attribute Registry, however,

+those different namings refer to the same platform functionality.

+

+## The Scope of UEFI Redfish Client EDK2 Implementation

+-  Platform Configurable settings

+

+This is the first stage of UEFI Redfish Client EDK2 Implementation. Associate

+Redfish property with HII option.

+

+- Provisioning of Firmware Managed Platform Redfish Resource

+

+The current design of UEFI Redfish Client EDK2 Implementation can already

+support the provisioning of firmware-owned platform Redfish resource, however,

+this requires addtional support on edk2 HII. Therefore, provisioning of

+firmware managed platform Redfish resource would be the second stage.

+

+Below are the block diagrams of UEFI Redfish Client EDK2 Implementation.

+

+## <a name="[0]">EDK2 Redfish Client Implementation Diagrams</a>

+![UEFI Redfish Client Implementation](https://github.com/changab/edk2-staging/blob/edk2-redfish-client/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg?raw=true)

+

+## EFI EDK2 Redfish Client Framework

+The functionality of each block in the diagrams are described in belwo sections,

+

+### EDK2 Redfish Foundation ***[[1]](#[0])***

+EDK2 Redfish Redfish Foundation provides the facilities of communicating with

+Redfish service. Such as the discovery of Redfish service, the credential to access

+Redfish service, *EFI REST EX Protocol* instance which is the transport layer to

+Redfish service, and so on. Please refer to

+[*EDK2 Redfish Foundation*](https://github.com/tianocore/edk2/blob/master/RedfishPkg/Readme.md).

+

+### Redfish Profile Simulator ***[[2]](#[0])***

+Redfish Profile Simulator is an

+[*open source project*](https://github.com/DMTF/Redfish-Profile-Simulator) on DMTF

+GitHub, which simulates the HTTP request methods (POST, PATCH, PUT, GET) on Redfish

+resource maintained by Redfish Profile Simulator. EDK2 open source uses this

+simulator for the use case when Redfish service has not been set up on the platform,

+or for the quick Redfish firmware feature development. We clone this project under

+RedfishClientPkg and maintain it by edk2 because this project has currently been

+using and updating rarely. That is easier for edk2 to add features to the simulator

+or modify the simulator to align with edk2 requirement on Redfish service, such as

+ETAG and HTTP POST support. <br>

+Another open source project of Redfish simulator is

+[*Redfish Interface Emulator*](https://github.com/DMTF/Redfish-Interface-Emulator),

+however, we don't pay much attention to this project because we have been dedicating

+to Redfish Profile Simulator since we started the UEFI Redfish EDK2 project.

+

+### EDK2 Redfish JSON Schema to C Structure Convertor ***[[3]](#[0])***

+This is the script auto-generated EDK2 drivers and libraries that provide the Redfish

+schema naming based JSON to C structure and vise versa converters. C structure is

+another representation of Redfish properties other than JSON and CSDL(XML). The higher

+layer Redfish client application can deal with C structure instead of using JSON

+library to manipulate Redfish properties. The script

+[*Redfish Schema C Struct Generator*](https://github.com/DMTF/Redfish-Schema-C-Struct-Generator)

+is still a private project on DMTF GitHub. Below is the reference of script

+auto-generated [*Redfish JSON C Struct Converter Lib*](https://github.com/changab/Redfish-JSON-C-Struct-Converter-Lib)

+libraries. The converters generated by the script are followed

+**EFI REST JSON Structure Protocol** defined in UEFI spec 2.8, section 29.7.3.

+

+### EDK2 Redfish Non-Collection ***[[4]](#[0])*** and Collection ***[[5]](#[0])*** Feature Drivers

+EDK2 Redfish feature driver is an intermediary driver that sits between **JSON Schema

+to C Structure converters** and **EFI Platform Configuration to Redfish Protocol**. The

+Redfish feature driver gets and sets the platform configuration and incorporates it with

+Redfish JSON schema C structure to manipulate Redfish JSON resources. Then applies the

+settings from Redfish service to platform configurations, or vise versa to update platform

+configurations to Redfish service. Both EDK2 Redfish Non-Collection and Collection Feature

+drivers are script auto-generated base on Redfish schema naming. The EDK2 Redfish

+Non-Collection feature driver manages the resource of specific Resdifsh resource type,

+while the EDK2 Redfish Collection feature driver manages the members which have the same

+resource type in collection resource (e.g the ComputerSystem resource and

+ComputerSystemCollection resource).

+

+### EFI Platform Config to Redfish Protocol ***[[6]](#[0])***

+EFI Platform Config to Redfish Protocol is an abstract driver that abstracts the platform

+configuration format and storage from EDK2 Redfish Feature driver. This protocol provides

+the interfaces to get and set platform configuration that format and the storage to store

+configuration are agnostic to the feature driver. The platform can provide its own EFI

+Platform Config to Redfish driver to access platform-specific configuration format and

+storage. On EDK2 open source, EFI Platform Config to Redfish Protocol accesses the

+platform configuration in EDK2 HII defined format.

+

+Below is the prototype of **EFI_PLATFORM_CONFIG_TO_REDFISH_PROTOCOL**,

+

+```C

+struct _EDKII_PLATFORM_CONFIG_TO_REDFISH_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;

+};

+```

+

+### Other instances of EFI Platform Config to Redfish Protocol ***[[7]](#[0])***

+For those Non-EDK2 HII-based platform configuration formats, the driver instance can

+provide its own implementation to get or set the platform configurations.

+

+### EDK2 HII VFR Form ***[[8]](#[0])***

+According to **UEFI spec 2.9 section 35.6 Form Browser Protocol**,

+**EFI_HII_REST_STYLE_FORMSET_GUID** is used on HII form to indicate that HII options

+declared in this form intend to interact with the REST architectural style. On edk2

+open source, the REST architectural style refers to the Redfish service. Besides

+**EFI_HII_REST_STYLE_FORMSET_GUID** is defined in the form scope,

+**EFI_IFR_FLAG_REST_STYLE** can be assigned to the HII options that indicate those

+options intend to interact with the REST service.

+

+### EDK2 HII UNI file ***[[9]](#[0])***

+x-uefi-redfish Configure Language is used in UNI file to associate HII option with

+the particular Redfish property. The Hii options interact with EDK2 Redfish Feature

+driver if the string of HII option is assigned with x-uefi-redfish Language as

+in below,

+

+```C

+x-uefi-redfish-$(NAMESPACE)

+where $(NAMESPACE) is the combination of Redfish ResourceTypeName and schema version.

+```

+For example, if the HII option is mapped to the property in Processor.v1_0_0.

+The x-uefi-redfish configure language is declared as below,

+```C

+x-uefi-redfish-Processor.v1_0_0

+```

+#### x-uefi-redfish Configure Language format:

+- The string declared with x-uefi-redfish configure language is a path to the property

+in Redfish resource

+- The root of path is the Redfish resource type indicated in x-uefi-redfish configure

+language

+- The path is relative to root of Redfish resource type, not related to Redfish service

+- root.

+

+#### Examples,

+```C

+Properties:

+

+#string STR_BOOT_SOURCE_OVERRIDE_ENABLED_PROMPT #language x_uefi_redfish_ComputerSystem.v1_0_0  "/Boot/BootSourceOverrideEnabled"

+#string STR_BOOT_SOURCE_OVERRIDE_MODE_PROMPT    #language x_uefi_redfish_ComputerSystem.v1_0_0  "/Boot/BootSourceOverrideMode"

+#string STR_BOOT_SOURCE_OVERRIDE_TARGET_PROMPT  #language x_uefi_redfish_ComputerSystem.v1_0_0  "/Boot/BootSourceOverrideTarget"

+```

+```C

+Properties in array object [NUM]:

+

+#string STR_BOOT_ORDER_1_PROMPT  #language x_uefi_redfish_ComputerSystem.v1_11_0  "/Boot/BootOrder/[1]/Boot0001"

+#string STR_BOOT_ORDER_2_PROMPT  #language x_uefi_redfish_ComputerSystem.v1_11_0  "/Boot/BootOrder/[2]/Boot0002"

+#string STR_BOOT_ORDER_3_PROMPT  #language x_uefi_redfish_ComputerSystem.v1_11_0  "/Boot/BootOrder/[3]/Boot0003"

+```

+```C

+Properties in collection object {NUM}:

+

+#string STR_MEMORY_1_BASE_MODULE_TYPE_PROMPT  #language x_uefi_redfish_Memory.v1_7_1  "/Memory/{1}/BaseModuleType"

+#string STR_MEMORY_2_BASE_MODULE_TYPE_PROMPT  #language x_uefi_redfish_Memory.v1_7_1  "/Memory/{2}/BaseModuleType"

+#string STR_MEMORY_3_BASE_MODULE_TYPE_PROMPT  #language x_uefi_redfish_Memory.v1_7_1  "/Memory/{3}/BaseModuleType"

+```

+

+### EDK2 Build Tool ***[[10]](#[0])***

+EDK2 Build is responsible to pull the necessary EDK2 Redfish JSON Schema to C Structure

+Convertors and EDK2 Redfish Feature drivers into edk2 build process according to the

+x-uefi-Redfish config language used in the HII VFR forms.

+

+## The Contributors

+Chang, Abner <abner.chang@...>\

+Wang, Nickle <nickle.wang@...>\

+Chen, Aaron <aaron.chen@...>

diff --git a/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg b/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg

new file mode 100644

index 0000000000..eb59eb9992

--- /dev/null

+++ b/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg

@@ -0,0 +1,680 @@

+<?xml version="1.0" encoding="UTF-8" standalone="no"?>

+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

+<!-- Generated by Microsoft Visio, SVG Export RedfishClientDriverStack.svg Page-2 -->

+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"

+        width="12.1281in" height="9.93872in" viewBox="0 0 873.222 715.588" xml:space="preserve" color-interpolation-filters="sRGB"

+        class="st68">

+    <style type="text/css">

+    <![CDATA[

+        .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st2 {fill:#ebf1df;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st3 {fill:#ff1a1a;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st4 {fill:#ffffff;font-family:Calibri;font-size:1.00001em;font-weight:bold}

+        .st5 {font-size:1em}

+        .st6 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st7 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-weight:bold}

+        .st8 {fill:#dbeef3;stroke:#d8d8d8;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st9 {fill:#ffffff;font-family:Calibri;font-size:1.08334em;font-weight:bold}

+        .st10 {visibility:visible}

+        .st11 {fill:none;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}

+        .st12 {fill:none;stroke:#bfbfbf;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st13 {fill:#000000;font-family:Arial;font-size:1.99999em;font-style:italic;font-weight:bold}

+        .st14 {marker-end:url(#mrkr2-45);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.9}

+        .st15 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.42986425339367}

+        .st16 {fill:#000000;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st17 {fill:#ffffff;font-family:Arial;font-size:1.33333em;font-weight:bold}

+        .st18 {fill:#ffffff;stroke:#595959;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st19 {fill:#7f7f7f;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st20 {fill:#ffffff;font-family:Calibri;font-size:1.08334em}

+        .st21 {fill:#000000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st22 {fill:#000000;font-family:Calibri;font-size:0.833336em;font-weight:bold}

+        .st23 {marker-start:url(#mrkr10-112);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}

+        .st24 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.40983606557377}

+        .st25 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}

+        .st26 {fill:#000000;fill-opacity:0.4;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}

+        .st27 {fill:#0070c0;stroke:#003f6c;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st28 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-style:italic;font-weight:bold}

+        .st29 {fill:#ffffff;stroke:#000000;stroke-dasharray:1.68,1.2;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}

+        .st30 {fill:#000000;font-family:Calibri;font-size:0.833336em}

+        .st31 {fill:#ffffff;stroke:#000000;stroke-dasharray:3.5,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}

+        .st32 {stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:4.5}

+        .st33 {fill:#000000;fill-opacity:0.38;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.38}

+        .st34 {fill:#000000;fill-opacity:0.38;stroke:#000000;stroke-opacity:0.38;stroke-width:0.22935779816514}

+        .st35 {fill:#f2f2f2;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st36 {fill:#7f7f7f;fill-opacity:1;stroke:#7f7f7f;stroke-opacity:1;stroke-width:0.22935779816514}

+        .st37 {fill:#d8d8d8;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st38 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}

+        .st39 {fill:#000000;fill-opacity:0.4;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}

+        .st40 {fill:#0070c0;stroke:#003f6c;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st41 {fill:#ffffff;stroke:#000000;stroke-dasharray:9.5,2.5,3.5,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}

+        .st42 {fill:#ffffff;stroke:#000000;stroke-dasharray:3.5,2.5,3.5,2.5,0,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}

+        .st43 {marker-end:url(#mrkr4-212);marker-start:url(#mrkr4-210);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25}

+        .st44 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.47169811320755}

+        .st45 {fill:#ffffff;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}

+        .st46 {fill:#000000;font-family:Calibri;font-size:1.16666em;font-style:italic;font-weight:bold}

+        .st47 {font-family:Arial;font-size:0.571431em;font-style:normal;font-weight:normal}

+        .st48 {font-family:Arial;font-size:0.571431em;font-style:normal}

+        .st49 {fill:#ea700d;font-family:Arial;font-size:0.571431em;font-style:normal}

+        .st50 {fill:#ffffff;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}

+        .st51 {fill:#d8d8d8;font-family:Calibri;font-size:0.833336em;font-style:italic;font-weight:bold}

+        .st52 {font-size:1.20001em;font-style:normal;font-weight:normal}

+        .st53 {font-size:1em;font-style:normal;font-weight:normal}

+        .st54 {fill:#f59d56;font-size:1em;font-style:normal;font-weight:normal}

+        .st55 {marker-end:url(#mrkr2-350);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}

+        .st56 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.44247787610619}

+        .st57 {marker-end:url(#mrkr2-383);marker-start:url(#mrkr2-381);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}

+        .st58 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514}

+        .st59 {fill:#000000;font-family:Calibri;font-size:0.75em;font-style:italic;font-weight:bold}

+        .st60 {fill:#000000;font-family:Calibri;font-size:0.75em;font-weight:bold}

+        .st61 {fill:#0070c0;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}

+        .st62 {fill:#595959;stroke:none;stroke-linecap:butt;stroke-width:0.75}

+        .st63 {marker-start:url(#mrkr4-405);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}

+        .st64 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.3315649867374}

+        .st65 {marker-end:url(#mrkr4-411);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}

+        .st66 {marker-end:url(#mrkr10-430);marker-start:url(#mrkr10-112);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}

+        .st67 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}

+        .st68 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}

+    ]]>

+    </style>

+

+    <defs id="Markers">

+        <g id="lend2">

+            <path d="M 1 1 L 0 0 L 1 -1 L 1 1 " style="stroke:none"/>

+        </g>

+        <marker id="mrkr2-45" class="st15" refX="-2.1368421052632" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend2" transform="scale(-2.3263157894737,-2.3263157894737) "/>

+        </marker>

+        <g id="lend10">

+            <path

+                    d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "

+                    style="stroke:none"/>

+        </g>

+        <marker id="mrkr10-112" class="st24" refX="1.542" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend10" transform="scale(2.44) "/>

+        </marker>

+        <g id="lend42">

+            <path

+                    d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "

+                    style="stroke:none"/>

+        </g>

+        <marker id="mrkr42-163" class="st34" refX="3.27" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend42" transform="scale(4.36) "/>

+        </marker>

+        <marker id="mrkr42-167" class="st36" refX="3.27" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend42" transform="scale(4.36) "/>

+        </marker>

+        <g id="lend4">

+            <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>

+        </g>

+        <marker id="mrkr4-210" class="st44" refX="4.08" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend4" transform="scale(2.12) "/>

+        </marker>

+        <marker id="mrkr4-212" class="st44" refX="-4.08" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend4" transform="scale(-2.12,-2.12) "/>

+        </marker>

+        <marker id="mrkr2-350" class="st56" refX="-2.08" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend2" transform="scale(-2.26,-2.26) "/>

+        </marker>

+        <marker id="mrkr2-381" class="st58" refX="3.88" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend2" transform="scale(4.36) "/>

+        </marker>

+        <marker id="mrkr2-383" class="st58" refX="-3.88" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend2" transform="scale(-4.36,-4.36) "/>

+        </marker>

+        <marker id="mrkr4-405" class="st64" refX="5.744" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend4" transform="scale(3.016) "/>

+        </marker>

+        <marker id="mrkr4-411" class="st64" refX="-6.032" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend4" transform="scale(-3.016,-3.016) "/>

+        </marker>

+        <marker id="mrkr10-430" class="st24" refX="-1.542" orient="auto" markerUnits="strokeWidth" overflow="visible">

+            <use xlink:href="#lend10" transform="scale(-2.44,-2.44) "/>

+        </marker>

+    </defs>

+    <defs id="Filters">

+        <filter id="filter_3.3333334922791">

+            <feGaussianBlur stdDeviation="3.3333334922791"/>

+        </filter>

+    </defs>

+    <g>

+        <title>VBackground-1</title>

+        <g id="shape1-1">

+            <title>Solid</title>

+            <rect x="0" y="0" width="873.222" height="715.588" class="st1"/>

+        </g>

+    </g>

+    <g>

+        <title>Page-2</title>

+        <g id="shape52-3" transform="translate(336.222,-197.713)">

+            <title>Rectangle.52</title>

+            <rect x="0" y="598.588" width="495" height="117" class="st2"/>

+        </g>

+        <g id="group5-5" transform="translate(772.722,-60.4625)">

+            <title>Can</title>

+            <desc>Redfish Service</desc>

+            <g id="shape6-6">

+                <title>Sheet.6</title>

+                <path d="M0 704.34 A26.4375 11.25 -180 1 0 52.88 704.34 L52.88 663.84 L0 663.84 L0 704.34 Z" class="st3"/>

+            </g>

+            <g id="shape5-8">

+                <ellipse cx="26.4375" cy="663.838" rx="26.4375" ry="11.25" class="st3"/>

+                <text x="7.83" y="693.59" class="st4">Redfish <tspan x="8.6" dy="1.2em" class="st5">Service</tspan></text>          </g>

+        </g>

+        <g id="shape8-12" transform="translate(746.847,-24.4625)">

+            <title>Sheet.8</title>

+            <desc>Redfish Profile Simulator On Network</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="17.62" y="693.09" class="st7">Redfish Profile <tspan x="21.08" dy="1em" class="st5">Simulator On </tspan><tspan

+                        x="32.24" dy="1em" class="st5">Network</tspan></text>       </g>

+        <g id="shape10-17" transform="translate(408.222,-82.9625)">

+            <title>Sheet.10</title>

+            <desc>EFI REST EX</desc>

+            <rect x="0" y="679.588" width="261" height="36" class="st8"/>

+            <text x="99.8" y="700.84" class="st9">EFI REST EX </text>       </g>

+        <g id="shape12-20" transform="translate(57.2224,-197.713)">

+            <title>Rectangle</title>

+            <rect x="0" y="598.588" width="234" height="117" class="st2"/>

+        </g>

+        <g id="shape13-22" transform="translate(30.2224,-24.4625)">

+            <title>Rounded Rectangle.76</title>

+            <g id="shadow13-23" transform="matrix(1.02,0,0,1.02,-6.84,-13.2318)" class="st10">

+                <path d="M9 715.59 L675 715.59 A8.99985 8.99985 -180 0 0 684 706.59 L684 616.59 A8.99985 8.99985 -180 0 0 675 607.59

+                             L9 607.59 A8.99985 8.99985 -180 0 0 0 616.59 L0 706.59 A8.99985 8.99985 -180 0 0 9 715.59 Z"

+                        class="st11"/>

+            </g>

+            <path d="M9 715.59 L675 715.59 A8.99985 8.99985 -180 0 0 684 706.59 L684 616.59 A8.99985 8.99985 -180 0 0 675 607.59

+                         L9 607.59 A8.99985 8.99985 -180 0 0 0 616.59 L0 706.59 A8.99985 8.99985 -180 0 0 9 715.59 Z" class="st12"/>

+        </g>

+        <g id="shape16-27" transform="translate(75.2224,-82.9625)">

+            <title>Sheet.16</title>

+            <desc>EFI REST JSON to C Structure</desc>

+            <rect x="0" y="679.588" width="261" height="36" class="st8"/>

+            <text x="53.89" y="700.84" class="st9">EFI REST JSON to C Structure</text>      </g>

+        <g id="shape17-30" transform="translate(408.222,-37.9625)">

+            <title>Sheet.17</title>

+            <desc>EFI Network Stack</desc>

+            <rect x="0" y="679.588" width="261" height="36" class="st8"/>

+            <text x="81.72" y="700.84" class="st9">EFI Network Stack</text>     </g>

+        <g id="shape18-33" transform="translate(75.2224,-37.9625)">

+            <title>Sheet.18</title>

+            <desc>EFI Redfish Discover Protocl</desc>

+            <rect x="0" y="679.588" width="261" height="36" class="st8"/>

+            <text x="55.56" y="700.84" class="st9">EFI Redfish Discover Protocl</text>      </g>

+        <g id="shape19-36" transform="translate(291.222,-51.4625)">

+            <title>Sheet.19</title>

+            <desc>EDKII Redfish Foundation</desc>

+            <rect x="0" y="670.588" width="184" height="45" class="st6"/>

+            <text x="12.66" y="685.89" class="st13">EDKII Redfish <tspan x="26.69" dy="1.2em" class="st5">Foundation</tspan></text>     </g>

+        <g id="shape20-40" transform="translate(904.308,1335.5) rotate(-19.179) scale(1,-1)">

+            <title>Curve connect 1</title>

+            <path d="M0 715.59 A42.4531 42.4531 0 0 1 54.79 715.59 A42.4531 42.4531 -180 0 0 106.06 718.26 L106.35 718.04"

+                    class="st14"/>

+        </g>

+        <g id="shape21-46" transform="translate(18.9724,-139.213)">

+            <title>Sheet.21</title>

+            <desc>EDKII Redfish Client</desc>

+            <rect x="0" y="211.588" width="24.75" height="504" class="st16"/>

+            <text x="-10.85" y="-540.93" writing-mode="tb-rl" transform="rotate(180)" class="st17">EDKII Redfish Client</text>      </g>

+        <g id="shape24-49" transform="translate(111.222,-253.963)">

+            <title>Sheet.24</title>

+            <rect x="0" y="670.588" width="153" height="45" class="st18"/>

+        </g>

+        <g id="shape25-51" transform="translate(84.2224,-240.463)">

+            <title>Sheet.25</title>

+            <rect x="0" y="670.588" width="153" height="45" class="st18"/>

+        </g>

+        <g id="shape26-53" transform="translate(75.2224,-226.963)">

+            <title>Sheet.26</title>

+            <desc>Script-generated Redfish JSON schema to C Structure convertor</desc>

+            <rect x="0" y="670.588" width="153" height="45" class="st19"/>

+            <text x="11.2" y="683.34" class="st20">Script-generated Redfish <tspan x="29.22" dy="1em" class="st5">JSON schema to C </tspan><tspan

+                        x="24.45" dy="1em" class="st5">Structure convertor</tspan></text>       </g>

+        <g id="shape28-58" transform="translate(241.722,-267.463)">

+            <title>Sheet.28</title>

+            <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>

+        </g>

+        <g id="shape29-60" transform="translate(245.66,-272.525)">

+            <title>Sheet.29</title>

+            <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>

+        </g>

+        <g id="shape30-62" transform="translate(250.16,-277.588)">

+            <title>Sheet.30</title>

+            <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>

+        </g>

+        <g id="shape31-64" transform="translate(178.722,-204.463)">

+            <title>Sheet.31</title>

+            <desc>ComputerSystem</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="18.16" y="704.59" class="st22">ComputerSystem</text>       </g>

+        <g id="shape32-67" transform="translate(201.222,-220.213)">

+            <title>Sheet.32</title>

+            <desc>BootOption</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="29.69" y="704.59" class="st22">BootOption</text>       </g>

+        <g id="shape33-70" transform="translate(210.222,-233.713)">

+            <title>Sheet.33</title>

+            <desc>Memory</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="36.21" y="704.59" class="st22">Memory</text>       </g>

+        <g id="shape34-73" transform="translate(385.722,-247.213)">

+            <title>Sheet.34</title>

+            <rect x="0" y="670.588" width="153" height="45" class="st18"/>

+        </g>

+        <g id="shape35-75" transform="translate(358.722,-233.713)">

+            <title>Sheet.35</title>

+            <rect x="0" y="670.588" width="153" height="45" class="st18"/>

+        </g>

+        <g id="shape36-77" transform="translate(349.722,-220.213)">

+            <title>Sheet.36</title>

+            <desc>Script-generated EDK2 Redfish Feature Driver</desc>

+            <rect x="0" y="670.588" width="153" height="45" class="st19"/>

+            <text x="16.96" y="689.84" class="st20">Script-generated EDK2 <tspan x="17.33" dy="1em" class="st5">Redfish Feature Driver</tspan></text>       </g>

+        <g id="shape40-81" transform="translate(453.222,-197.713)">

+            <title>Sheet.40</title>

+            <desc>ComputerSystem</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="18.16" y="704.59" class="st22">ComputerSystem</text>       </g>

+        <g id="shape41-84" transform="translate(475.722,-213.463)">

+            <title>Sheet.41</title>

+            <desc>BootOption</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="29.69" y="704.59" class="st22">BootOption</text>       </g>

+        <g id="shape42-87" transform="translate(493.722,-226.963)">

+            <title>Sheet.42</title>

+            <desc>Memory</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="36.21" y="704.59" class="st22">Memory</text>       </g>

+        <g id="shape43-90" transform="translate(608.472,-249.463)">

+            <title>Sheet.43</title>

+            <rect x="0" y="670.588" width="153" height="45" class="st18"/>

+        </g>

+        <g id="shape46-92" transform="translate(738.972,-262.963)">

+            <title>Sheet.46</title>

+            <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>

+        </g>

+        <g id="shape47-94" transform="translate(742.91,-268.025)">

+            <title>Sheet.47</title>

+            <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>

+        </g>

+        <g id="shape48-96" transform="translate(747.41,-273.088)">

+            <title>Sheet.48</title>

+            <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>

+        </g>

+        <g id="shape49-98" transform="translate(660.222,-199.963)">

+            <title>Sheet.49</title>

+            <desc>ComputerSystemCollection</desc>

+            <rect x="0" y="688.588" width="123.75" height="27" class="st6"/>

+            <text x="5.3" y="704.59" class="st22">ComputerSystemCollection</text>       </g>

+        <g id="shape50-101" transform="translate(720.972,-215.713)">

+            <title>Sheet.50</title>

+            <desc>BootOptionCollection</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="8.96" y="704.59" class="st22">BootOptionCollection</text>      </g>

+        <g id="shape51-104" transform="translate(732.222,-229.213)">

+            <title>Sheet.51</title>

+            <desc>MemoryCollection</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="15.48" y="704.59" class="st22">MemoryCollection</text>     </g>

+        <g id="shape56-107" transform="translate(515.651,-269.34) rotate(-1.84761)">

+            <title>Curve connect 2.56</title>

+            <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 69.79 715.59" class="st23"/>

+        </g>

+        <g id="shape57-113" transform="translate(581.472,-235.963)">

+            <title>Sheet.57</title>

+            <rect x="0" y="670.588" width="153" height="45" class="st18"/>

+        </g>

+        <g id="shape59-115" transform="translate(291.222,-242.713)">

+            <title>1-D double</title>

+            <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L31.5 710.19 L31.5 715.59 L45 702.09 L31.5 688.59

+                         L31.5 693.99 L13.5 693.99 Z" class="st25"/>

+        </g>

+        <g id="shape64-117" transform="translate(619.722,-467.713)">

+            <title>Sheet.64</title>

+            <desc>EFI PLATFORM_CONFIG_TO_REDFISH_PROTOCOL</desc>

+            <g id="shadow64-118" transform="matrix(1.02,0,0,1.02,-1.98,-13.8618)" class="st10">

+                <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st26"/>

+            </g>

+            <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st27"/>

+            <text x="91.2" y="683.34" class="st20">EFI <tspan x="6.13" dy="1em" class="st5">PLATFORM</tspan>_CONFIG_TO_REDFISH_<tspan

+                        x="69.84" dy="1em" class="st5">PROTOCOL</tspan></text>      </g>

+        <g id="shape65-125" transform="translate(511.722,-445.213)">

+            <title>Sheet.65</title>

+            <desc>EFI PLATFORM_CONFIG_TO_REDFISH_PROTOCOL</desc>

+            <g id="shadow65-126" transform="matrix(1.02,0,0,1.02,-1.98,-13.8618)" class="st10">

+                <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st26"/>

+            </g>

+            <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st27"/>

+            <text x="91.2" y="683.34" class="st20">EFI <tspan x="6.13" dy="1em" class="st5">PLATFORM</tspan>_CONFIG_TO_REDFISH_<tspan

+                        x="69.84" dy="1em" class="st5">PROTOCOL</tspan></text>      </g>

+        <g id="shape67-133" transform="translate(536.472,-593.713)">

+            <title>Sheet.67</title>

+            <desc>Other Platform-specific Implementations</desc>

+            <rect x="0" y="688.588" width="243" height="27" class="st6"/>

+            <text x="20.02" y="705.09" class="st28">Other Platform-specific Implementations</text>      </g>

+        <g id="group71-136" transform="translate(567.972,-530.713)">

+            <title>Can.71</title>

+            <desc>EFI Variable/ FW Storage</desc>

+            <g id="shape72-137">

+                <title>Sheet.72</title>

+                <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st29"/>

+            </g>

+            <g id="shape71-139">

+                <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st29"/>

+                <text x="23.25" y="675.09" class="st30">EFI <tspan x="10.54" dy="1.2em" class="st5">Variable</tspan>/ <tspan

+                            x="5.79" dy="1.2em" class="st5">FW Storage</tspan></text>           </g>

+        </g>

+        <g id="group73-144" transform="translate(687.222,-530.713)">

+            <title>Can.73</title>

+            <desc>Other Storage</desc>

+            <g id="shape74-145">

+                <title>Sheet.74</title>

+                <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st29"/>

+            </g>

+            <g id="shape73-147">

+                <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st29"/>

+                <text x="17.41" y="681.09" class="st30">Other <tspan x="13.66" dy="1.2em" class="st5">Storage</tspan></text>            </g>

+        </g>

+        <g id="shape76-151" transform="translate(1306.06,184.875) rotate(90)">

+            <title>1-D double.76</title>

+            <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L33.75 712.89 L33.75 715.59 L40.5 708.84 L33.75

+                         702.09 L33.75 704.79 L6.75 704.79 Z" class="st31"/>

+        </g>

+        <g id="shape77-153" transform="translate(1425.31,184.875) rotate(90)">

+            <title>1-D double.77</title>

+            <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L11.25 712.89 L11.25 715.59 L18 708.84 L11.25

+                         702.09 L11.25 704.79 L6.75 704.79 Z" class="st31"/>

+        </g>

+        <g id="shape78-155" transform="translate(21.2224,-139.213)">

+            <title>Sheet.78</title>

+            <path d="M0 715.59 L810 715.59" class="st32"/>

+        </g>

+        <g id="group80-158" transform="translate(-173.49,382.875) rotate(-90)">

+            <title>Folded Corner</title>

+            <g id="shape80-159">

+                <g id="shadow80-160" transform="matrix(1.02,0,0,1.02,-3.105,-9.45175)" class="st10">

+                    <path d="M0 715.59 L278.62 715.59 L310.5 688.27 L310.5 229.59 L0 229.59 L0 715.59 Z" class="st33"/>

+                </g>

+                <path d="M0 715.59 L278.62 715.59 L310.5 688.27 L310.5 229.59 L0 229.59 L0 715.59 Z" class="st35"/>

+            </g>

+            <g id="shape81-168" transform="translate(278.625,0)">

+                <title>Sheet.81</title>

+                <g id="shadow81-169" transform="matrix(1.02,0,0,1.02,-0.6375,-14.3117)" class="st10">

+                    <path d="M0 715.59 L31.88 688.27 L4.87 684.09 L0 715.59 Z" class="st33"/>

+                </g>

+                <path d="M0 715.59 L31.88 688.27 L4.87 684.09 L0 715.59 Z" class="st37"/>

+            </g>

+        </g>

+        <g id="group82-175" transform="translate(432.972,-530.713)">

+            <title>Can.69</title>

+            <desc>EDK2 HII Database</desc>

+            <g id="shape83-176">

+                <title>Sheet.83</title>

+                <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st38"/>

+            </g>

+            <g id="shape82-178">

+                <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st38"/>

+                <text x="11.84" y="681.09" class="st30">EDK2 HII <tspan x="10.24" dy="1.2em" class="st5">Database</tspan></text>            </g>

+        </g>

+        <g id="shape84-182" transform="translate(390.222,-429.463)">

+            <title>Sheet.84</title>

+            <desc>EFI PLATFORM_CONFIG_TO_REDFISH_PROTOCOL</desc>

+            <g id="shadow84-183" transform="matrix(1.02,0,0,1.02,-1.44,-13.8618)" class="st10">

+                <rect x="0" y="670.588" width="144" height="45" class="st39"/>

+            </g>

+            <rect x="0" y="670.588" width="144" height="45" class="st40"/>

+            <text x="64.2" y="683.34" class="st20">EFI <tspan x="4.73" dy="1em" class="st5">PLATFORM</tspan>_CONFIG_TO_<tspan

+                        x="17.24" dy="1em" class="st5">REDFISH</tspan>_PROTOCOL</text>      </g>

+        <g id="shape85-190" transform="translate(1171.06,184.875) rotate(90)">

+            <title>1-D double.75</title>

+            <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L49.5 712.89 L49.5 715.59 L56.25 708.84 L49.5

+                         702.09 L49.5 704.79 L6.75 704.79 Z" class="st38"/>

+        </g>

+        <g id="shape86-192" transform="translate(1164.31,286.125) rotate(90)">

+            <title>1-D double.68</title>

+            <g id="shadow86-193" transform="matrix(1.02,0,0,1.02,-1.1475,-14.0418)" class="st10">

+                <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L101.25 710.19 L101.25 715.59 L114.75 702.09

+                             L101.25 688.59 L101.25 693.99 L13.5 693.99 Z" class="st39"/>

+            </g>

+            <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L101.25 710.19 L101.25 715.59 L114.75 702.09 L101.25

+                         688.59 L101.25 693.99 L13.5 693.99 Z" class="st38"/>

+        </g>

+        <g id="shape87-197" transform="translate(27.9724,-616.213)">

+            <title>Sheet.87</title>

+            <desc>EDK2 Open Source Implementation</desc>

+            <rect x="0" y="688.588" width="243" height="27" class="st6"/>

+            <text x="34.39" y="705.09" class="st28">EDK2 Open Source Implementation</text>      </g>

+        <g id="shape88-200" transform="translate(1312.81,270.375) rotate(90)">

+            <title>1-D double.88</title>

+            <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L117 710.19 L117 715.59 L130.5 702.09 L117 688.59

+                         L117 693.99 L13.5 693.99 Z" class="st41"/>

+        </g>

+        <g id="shape89-202" transform="translate(1434.31,247.875) rotate(90)">

+            <title>1-D double.89</title>

+            <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L139.5 710.19 L139.5 715.59 L153 702.09 L139.5

+                         688.59 L139.5 693.99 L13.5 693.99 Z" class="st42"/>

+        </g>

+        <g id="shape90-204" transform="translate(838.629,252.112) rotate(68.1986)">

+            <title>Curve connect 1.61</title>

+            <path d="M7.53 720.84 L7.83 721.04 A30.61 30.61 -180 0 0 42.41 715.59 A30.61 30.61 0 0 1 76.99 710.13 L77.29 710.34"

+                    class="st43"/>

+        </g>

+        <g id="shape91-213" transform="translate(-37.5816,162.844) rotate(-60.2551) scale(-1,1)">

+            <title>Curve connect 1.62</title>

+            <path d="M7.67 720.62 L7.98 720.82 A34.3918 34.3918 -180 0 0 45.35 715.59 A34.3918 34.3918 0 0 1 82.72 710.35 L83.03

+                         710.55" class="st43"/>

+        </g>

+        <g id="shape94-220" transform="translate(488.651,-255.84) rotate(-1.84761)">

+            <title>Curve connect 2.54</title>

+            <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 69.79 715.59" class="st23"/>

+        </g>

+        <g id="shape96-225" transform="translate(572.472,-222.463)">

+            <title>Sheet.96</title>

+            <desc>Script-generated EDK2 Redfish Collection Driver</desc>

+            <rect x="0" y="670.588" width="153" height="45" class="st19"/>

+            <text x="16.96" y="689.84" class="st20">Script-generated EDK2 <tspan x="11.39" dy="1em" class="st5">Redfish Collection Driver</tspan></text>        </g>

+        <g id="shape98-229" transform="translate(67.3474,-420.463)">

+            <title>Rounded Rectangle.98</title>

+            <desc>EDK2 HII UNI file #string STR_OPTION_A #language x-uefi-redfi...</desc>

+            <path d="M7.73 715.59 L266.77 715.59 A7.73227 7.73227 -180 0 0 274.5 707.86 L274.5 637.82 A7.73227 7.73227 -180 0 0 266.77

+                         630.09 L7.73 630.09 A7.73227 7.73227 -180 0 0 -0 637.82 L0 707.86 A7.73227 7.73227 -180 0 0 7.73 715.59

+                         Z" class="st45"/>

+            <text x="4" y="646.69" class="st46">EDK2 HII UNI file<tspan x="4" dy="1.425em" class="st47">#</tspan><tspan

+                        class="st47">string </tspan><tspan class="st48">STR</tspan><tspan class="st48">_</tspan><tspan class="st48">OPTION</tspan><tspan

+                        class="st48">_</tspan><tspan class="st48">A</tspan><tspan class="st47">  </tspan><tspan class="st47">#</tspan><tspan

+                        class="st47">language </tspan><tspan class="st48">x</tspan><tspan class="st48">-</tspan><tspan class="st48">uefi</tspan><tspan

+                        class="st48">-</tspan><tspan class="st48">redfish</tspan><tspan class="st48">-</tspan><tspan class="st48">SCHEMA</tspan><tspan

+                        class="st48">.</tspan><tspan class="st48">VERSION</tspan><tspan class="st47">  </tspan><tspan class="st48"> </tspan><tspan

+                        x="4" dy="1.2em" class="st49">“</tspan><tspan class="st49">/</tspan><tspan class="st49">SCHEMA</tspan><tspan

+                        class="st49">/</tspan><tspan class="st49">PropertyA</tspan><tspan class="st48">” </tspan><tspan

+                        class="st47">  </tspan><tspan x="4" dy="1.2em" class="st47">#</tspan><tspan class="st47">string</tspan><tspan

+                        class="st48"> </tspan><tspan class="st48">STR</tspan><tspan class="st48">_</tspan><tspan class="st48">OPTION</tspan><tspan

+                        class="st48">_</tspan><tspan class="st48">B</tspan><tspan class="st47">  </tspan><tspan class="st47">#</tspan><tspan

+                        class="st47">language</tspan><tspan class="st48"> </tspan><tspan class="st48">x</tspan><tspan class="st48">-</tspan><tspan

+                        class="st48">uefi</tspan><tspan class="st48">-</tspan><tspan class="st48">redfish</tspan><tspan

+                        class="st48">-</tspan><tspan class="st48">SCHEMA</tspan><tspan class="st48">.</tspan><tspan class="st48">VERSION</tspan><tspan

+                        class="st47">  </tspan><tspan class="st49"> </tspan><tspan x="4" dy="1.2em" class="st49">“</tspan><tspan

+                        class="st49">/</tspan><tspan class="st49">SCHEMA</tspan><tspan class="st49">/</tspan><tspan class="st49">PropertyB</tspan><tspan

+                        class="st49">” </tspan><tspan x="4" dy="1.2em" class="st47">#</tspan><tspan class="st47">string </tspan><tspan

+                        class="st48">STR</tspan><tspan class="st48">_</tspan><tspan class="st48">OPTION</tspan><tspan class="st48">_</tspan><tspan

+                        class="st47">C  </tspan><tspan class="st47">#</tspan><tspan class="st47">language</tspan><tspan

+                        class="st48"> </tspan><tspan class="st48">x</tspan><tspan class="st48">-</tspan><tspan class="st48">uefi</tspan><tspan

+                        class="st48">-</tspan><tspan class="st48">redfish</tspan><tspan class="st48">-</tspan><tspan class="st48">SCHEMA</tspan><tspan

+                        class="st48">.</tspan><tspan class="st48">VERSION</tspan><tspan class="st47">  </tspan><tspan class="st49"> </tspan><tspan

+                        x="4" dy="1.312em" class="st49">“</tspan><tspan class="st49">/</tspan><tspan class="st49">SCHEMA</tspan><tspan

+                        class="st49">/</tspan><tspan class="st49">PropertyC</tspan><tspan class="st49">”</tspan></text>       </g>

+        <g id="shape100-316" transform="translate(171.972,-550.963)">

+            <title>Rounded Rectangle.100</title>

+            <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>

+            <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46

+                         L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"

+                    class="st50"/>

+            <text x="37.65" y="671.66" class="st51">EDK2 HII VFR Form<tspan x="24.37" dy="1.6em" class="st52">Option A        Enabled </tspan><tspan

+                        x="24.6" dy="0.8em" class="st52">Option B       Disabled </tspan><tspan x="24.4" dy="0.8em" class="st52">Option C              </tspan><tspan

+                        class="st52">0</tspan><tspan class="st52">x</tspan><tspan class="st52">16</tspan></text>        </g>

+        <g id="shape101-325" transform="translate(147.222,-539.713)">

+            <title>Rounded Rectangle.101</title>

+            <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>

+            <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46

+                         L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"

+                    class="st50"/>

+            <text x="37.65" y="671.66" class="st51">EDK2 HII VFR Form<tspan x="24.37" dy="1.6em" class="st52">Option A        Enabled </tspan><tspan

+                        x="24.6" dy="0.8em" class="st52">Option B       Disabled </tspan><tspan x="24.4" dy="0.8em" class="st52">Option C              </tspan><tspan

+                        class="st52">0</tspan><tspan class="st52">x</tspan><tspan class="st52">16</tspan></text>        </g>

+        <g id="shape102-334" transform="translate(129.222,-526.213)">

+            <title>Rounded Rectangle</title>

+            <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>

+            <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46

+                         L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"

+                    class="st50"/>

+            <text x="29.88" y="671.66" class="st28">EDK2 HII VFR Form<tspan x="24.37" dy="1.6em" class="st53">Option A        </tspan><tspan

+                        class="st54">Enabled </tspan><tspan x="24.6" dy="0.8em" class="st53">Option B       </tspan><tspan

+                        class="st54">Disabled </tspan><tspan x="24.4" dy="0.8em" class="st53">Option C              </tspan><tspan

+                        class="st54">0</tspan><tspan class="st54">x</tspan><tspan class="st54">16</tspan></text>        </g>

+        <g id="shape110-345" transform="translate(503.938,-444.613) rotate(13.0919)">

+            <title>Curve connect 1.110</title>

+            <path d="M0 715.59 A11.592 11.592 0 0 1 22.97 715.59 A13.4718 13.4718 -180 0 0 48.31 719.9 L48.42 719.56" class="st55"/>

+        </g>

+        <g id="shape122-351" transform="translate(41.4724,-96.4625)">

+            <title>Sheet.122</title>

+            <desc>[1]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[1]</text>        </g>

+        <g id="shape123-354" transform="translate(746.847,-100.963)">

+            <title>Sheet.123</title>

+            <desc>[2]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[2]</text>        </g>

+        <g id="shape124-357" transform="translate(68.4724,-278.713)">

+            <title>Sheet.124</title>

+            <desc>[3]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[3]</text>        </g>

+        <g id="shape125-360" transform="translate(338.472,-269.713)">

+            <title>Sheet.125</title>

+            <desc>[4]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[4]</text>        </g>

+        <g id="shape126-363" transform="translate(761.472,-269.713)">

+            <title>Sheet.126</title>

+            <desc>[5]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[5]</text>        </g>

+        <g id="shape127-366" transform="translate(390.222,-476.713)">

+            <title>Sheet.127</title>

+            <desc>[6]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[6]</text>        </g>

+        <g id="shape128-369" transform="translate(123.597,-579.088)">

+            <title>Sheet.128</title>

+            <desc>[8]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[8]</text>        </g>

+        <g id="shape129-372" transform="translate(62.8474,-501.463)">

+            <title>Sheet.129</title>

+            <desc>[9]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[9]</text>        </g>

+        <g id="shape132-375" transform="translate(583.722,1233.46) rotate(180)">

+            <title>Curve connect 2.132</title>

+            <path d="M2.78 714.72 L3.12 714.61 A681.188 681.188 0 0 1 406.38 714.61 L406.72 714.72" class="st57"/>

+        </g>

+        <g id="shape133-384" transform="translate(238.347,-157.213)">

+            <title>Sheet.133</title>

+            <desc>Script-generated EDK2 Redfish client driver/library based on ...</desc>

+            <rect x="0" y="688.588" width="261" height="27" class="st1"/>

+            <text x="11.21" y="699.84" class="st59">Script-generated EDK2 Redfish client driver/library based on the <tspan

+                        x="45.23" dy="1em" class="st5">standard Redfish schemas </tspan>published by DMTF</text>        </g>

+        <g id="shape134-388" transform="translate(21.2224,-679.775)">

+            <title>Rectangle.134</title>

+            <rect x="0" y="703.213" width="24.75" height="12.375" class="st2"/>

+        </g>

+        <g id="shape135-390" transform="translate(41.4724,-670.213)">

+            <title>Sheet.135</title>

+            <desc>Script-generated code</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="12.79" y="704.34" class="st60">Script-generated code</text>        </g>

+        <g id="shape137-393" transform="translate(21.2224,-661.213)">

+            <title>Rectangle.137</title>

+            <rect x="0" y="703.213" width="24.75" height="12.375" class="st61"/>

+        </g>

+        <g id="shape138-395" transform="translate(43.7224,-652.213)">

+            <title>Sheet.138</title>

+            <desc>UEFI/EDK2 open source</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="9.97" y="704.34" class="st60">UEFI/EDK2 open source</text>     </g>

+        <g id="shape140-398" transform="translate(281.66,-341.784)">

+            <title>Configure</title>

+            <path d="M41.27 698.83 C40.4 698.46 37.61 697.28 37.61 697.28 L37.79 694.96 L37.94 693.01 L37.69 689.29 L39.53 688.23

+                         C39.53 688.23 40.46 687.84 41.33 687.49 C40.71 685.96 40.45 685.33 39.82 683.81 C38.94 684.17 36.06 685.35

+                         36.06 685.35 L34.63 683.57 C33.94 682.7 33.09 681.89 32.02 681.06 L30.33 679.75 L31.01 677.68 C31.01 677.68

+                         31.41 676.7 31.79 675.77 C30.27 675.14 29.64 674.88 28.12 674.26 C27.72 675.23 26.52 678.17 26.52 678.17

+                         L24.28 677.95 C23.14 677.83 21.96 677.86 20.77 678.02 L18.64 678.3 L17.65 676.35 C17.65 676.35 17.21 675.31

+                         16.78 674.31 C15.27 674.95 14.64 675.21 13.13 675.85 C13.58 676.92 14.85 679.93 14.85 679.93 L13.12 681.37

+                         C12.3 682.05 11.54 682.85 10.79 683.83 L9.49 685.52 L7.41 684.86 C7.41 684.86 6.28 684.4 5.17 683.96 C4.56

+                         685.49 4.31 686.12 3.69 687.65 C4.82 688.1 7.84 689.31 7.84 689.31 C7.84 689.31 7.65 692.73 7.63 693 C7.65

+                         693.25 7.7 694.01 7.7 694.03 C7.7 694.03 7.87 695.84 7.87 695.84 L6.79 696.82 C6.46 697.15 6.34 697.24 3.64

+                         698.3 C4.24 699.84 4.49 700.47 5.08 702.01 C6.21 701.57 9.36 700.34 9.36 700.34 L10.99 702.57 C11.49 703.19

+                         12.18 703.89 13.04 704.61 L14.63 705.96 L13.93 707.96 C13.93 707.96 13.45 709.08 12.97 710.2 C14.47 710.85

+                         15.1 711.12 16.61 711.77 C17.05 710.74 18.36 707.71 18.36 707.71 L20.65 708.03 C21.73 708.19 22.89 708.21

+                         24.1 708.1 L26.18 707.92 L27.11 709.84 C27.11 709.84 27.53 710.9 27.94 711.93 C29.47 711.32 30.1 711.07

+                         31.63 710.45 C31.25 709.51 30.04 706.48 30.04 706.48 L32.32 704.83 C32.97 704.31 33.71 703.56 34.48 702.62

+                         L35.81 701 L37.85 701.7 C37.85 701.7 38.82 702.1 39.73 702.49 C40.37 700.97 40.64 700.34 41.27 698.83 ZM40.58

+                         695.32 C40.58 695.32 40.57 695.4 40.56 695.47 C40.95 695.64 44.96 697.33 44.96 697.33 L41.23 706.17 C41.23

+                         706.17 37.13 704.45 36.75 704.28 C36.7 704.34 36.65 704.41 36.65 704.41 C35.76 705.49 34.89 706.37 33.97

+                         707.11 C33.97 707.11 33.67 707.33 33.46 707.47 C33.62 707.88 35.28 712.02 35.28 712.02 L26.38 715.59 C26.38

+                         715.59 24.65 711.28 24.5 710.89 C24.42 710.9 24.34 710.9 24.34 710.9 C22.91 711.03 21.54 711 20.25 710.82

+                         C20.25 710.82 20.17 710.8 20.09 710.79 C19.93 711.19 18.08 715.47 18.08 715.47 L9.27 711.66 C9.27 711.66

+                         11.18 707.25 11.34 706.86 C11.29 706.81 11.22 706.76 11.22 706.76 C10.23 705.92 9.41 705.09 8.72 704.23

+                         C8.72 704.23 8.51 703.94 8.37 703.75 C7.96 703.9 3.49 705.65 3.49 705.65 L0 696.71 C0 696.71 4.8 694.83

+                         4.8 694.83 C4.8 694.83 4.88 694.8 4.95 694.78 C4.92 694.54 4.89 694.21 4.89 694.21 L4.82 693.02 C4.82 693.02

+                         4.9 691.52 4.92 691.17 C4.54 691.02 0.04 689.21 0.04 689.21 L3.6 680.3 C3.6 680.3 8.06 682.09 8.46 682.25

+                         C8.51 682.18 8.56 682.12 8.56 682.12 C9.43 680.98 10.34 680.02 11.33 679.2 C11.33 679.2 11.39 679.15 11.45

+                         679.11 C11.29 678.72 9.45 674.35 9.45 674.35 L18.29 670.62 C18.29 670.62 20.07 674.85 20.24 675.25 C20.31

+                         675.24 20.39 675.23 20.39 675.23 C21.8 675.04 23.2 675.01 24.56 675.15 C24.56 675.15 24.63 675.16 24.71

+                         675.16 C24.87 674.78 26.59 670.59 26.59 670.59 L35.46 674.23 C35.46 674.23 33.77 678.34 33.61 678.74 C33.67

+                         678.78 33.74 678.83 33.74 678.83 C34.99 679.8 35.99 680.77 36.82 681.8 C36.82 681.8 36.88 681.88 36.94 681.95

+                         C37.33 681.79 41.35 680.14 41.35 680.14 L45 689.02 C45 689.02 40.99 690.67 40.6 690.83 C40.61 690.9 40.62

+                         690.98 40.62 690.98 C40.71 691.76 40.75 692.41 40.75 693.01 C40.75 693.7 40.7 694.43 40.58 695.32 ZM26.56

+                         697.76 C29.16 695.67 29.58 691.87 27.5 689.26 C25.42 686.65 21.62 686.23 19.01 688.31 C16.41 690.4 15.98

+                         694.2 18.07 696.81 C20.15 699.42 23.95 699.84 26.56 697.76 ZM23.76 684.23 C26.11 684.49 28.22 685.65 29.7

+                         687.5 C32.75 691.32 32.12 696.9 28.31 699.95 C26.47 701.43 24.16 702.1 21.8 701.84 C19.45 701.58 17.34 700.41

+                         15.87 698.56 C14.57 696.94 13.93 694.98 13.93 693.04 C13.93 690.44 15.07 687.86 17.25 686.12 C19.1 684.64

+                         21.41 683.97 23.76 684.23 Z" class="st62"/>

+        </g>

+        <g id="shape145-400" transform="translate(323.911,1069.28) scale(1,-1)">

+            <title>Side to top/bottom.145</title>

+            <path d="M7.18 715.59 L7.54 715.59 L96.69 715.59 L96.69 668.4" class="st63"/>

+        </g>

+        <g id="shape146-406" transform="translate(204.597,-382.144)">

+            <title>Bottom to top fixed 2</title>

+            <path d="M0 677.27 L0 697.59 L99.14 697.59 L99.14 708.05" class="st65"/>

+        </g>

+        <g id="shape150-412" transform="translate(281.66,1070.51) rotate(180)">

+            <title>Side to top/bottom</title>

+            <path d="M7.18 715.59 L7.54 715.59 L107.44 715.59 L107.44 669.64" class="st63"/>

+        </g>

+        <g id="shape152-417" transform="translate(173.097,-359.713)">

+            <title>Sheet.152</title>

+            <desc>[10]</desc>

+            <rect x="0" y="688.588" width="45" height="27" class="st6"/>

+            <text x="12.52" y="705.09" class="st7">[10]</text>      </g>

+        <g id="shape153-420" transform="translate(186.597,-359.713)">

+            <title>Sheet.153</title>

+            <desc>EDK2 Build Tool</desc>

+            <rect x="0" y="688.588" width="108" height="27" class="st6"/>

+            <text x="21.18" y="704.59" class="st22">EDK2 Build Tool</text>      </g>

+        <g id="shape95-423" transform="translate(479.651,-242.34) rotate(-1.84761)">

+            <title>Curve connect 2</title>

+            <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 68.5 713.7 L68.7 713.99" class="st66"/>

+        </g>

+        <g id="shape154-431" transform="translate(546.597,-607.213)">

+            <title>Sheet.154</title>

+            <desc>[7]</desc>

+            <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>

+            <text x="5.44" y="705.09" class="st7">[7]</text>        </g>

+        <g id="shape155-434" transform="translate(919.083,249.319) rotate(-86.8202) scale(1,-1)">

+            <title>Curve connect 1.155</title>

+            <path d="M0 715.59 A6.2366 6.2366 0 0 1 11.73 715.59 A4.54475 4.54475 -180 0 0 20.28 715.59" class="st67"/>

+        </g>

+    </g>

+</svg>

--

2.17.1

 


[staging/edk2-redfish-client PATCH v2 1/2] RedfishClientPkg: Initial commit

Abner Chang
 

Initial commit of architecture diagrams and Readme.md

Signed-off-by: Abner Chang <abner.chang@...>
Cc: Nickle Wang <nickle.wang@...>
Cc: Liming Gao <gaoliming@...>
Cc: Andrew Fish <afish@...>
Cc: Leif Lindholm <leif@...>
Cc: Michael D Kinney <michael.d.kinney@...>
---
RedfishClientPkg/Readme.md | 185 +++
.../Media/RedfishClientDriverStack.svg | 1068 +++++++++++++++++
2 files changed, 1253 insertions(+)
create mode 100644 RedfishClientPkg/Readme.md
create mode 100644 RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg

diff --git a/RedfishClientPkg/Readme.md b/RedfishClientPkg/Readme.md
new file mode 100644
index 0000000000..9e56fb9039
--- /dev/null
+++ b/RedfishClientPkg/Readme.md
@@ -0,0 +1,185 @@
+# UEFI Redfish Client EDK2 Implementation
+
+## Introduction
+UEFI Redfish Client EDK2 solution is implemented base on
+[*EDK2 Redfish Foundation*](https://github.com/tianocore/edk2/blob/master/RedfishPkg/Readme.md),
+the implementation utilizes the EFI protocols provided by EDK2 Redfish
+Foundation to communicate with the Redfish service for creating, consuming, and
+updating the Redfish properties which are managed by firmware. This solution
+requests the instance of **EFI REST EX Protocol** through EFI Redfish Discover
+Protocol and interacts with Redfish service using **EFI REST EX Protocol** later
+on. The essential part of this implementation is to map the EDK2 HII options to
+the corresponding Redfish properties that are already defined in the standard
+Redfish schemas published by
+[*DMTF Redfish working group*](https://www.dmtf.org/standards/redfish).
+The advantage of this design is to strengthen the interoperability among the
+servers produced by different OEMs when configuring the platform through Redfish
+service. Using the properties defined in Redfish standard schema for configuring
+platform reduces the overhead of Redfish client tools to have different
+implementations in order to compliant with OEM servers. The solution also
+reduces OEM-defined proprietary BIOS Attributes that lead to the divergence of
+platform configuration namings in Redfish BIOS Attribute Registry, however,
+those different namings refer to the same platform functionality.
+
+## The Scope of UEFI Redfish Client EDK2 Implementation
+- Platform Configurable settings
+
+This is the first stage of UEFI Redfish Client EDK2 Implementation. Associate
+Redfish property with HII option.
+
+- Provisioning of Firmware Managed Platform Redfish Resource
+
+The current design of UEFI Redfish Client EDK2 Implementation can already
+support the provisioning of firmware-owned platform Redfish resource, however,
+this requires addtional support on edk2 HII. Therefore, provisioning of
+firmware managed platform Redfish resource would be the second stage.
+
+Below are the block diagrams of UEFI Redfish Client EDK2 Implementation.
+
+## <a name="[0]">EDK2 Redfish Client Implementation Diagrams</a>
+![UEFI Redfish Client Implementation](https://github.com/changab/edk2-staging/blob/edk2-redfish-client/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg?raw=true)
+
+## EFI EDK2 Redfish Client Framework
+The functionality of each block in the diagrams are described in belwo sections,
+
+### EDK2 Redfish Foundation ***[[1]](#[0])***
+EDK2 Redfish Redfish Foundation provides the facilities of communicating with
+Redfish service. Such as the discovery of Redfish service, the credential to
+access Redfish service, *EFI REST EX Protocol* instance which is the transport
+layer to Redfish service, and so on. Please refer to
+[*EDK2 Redfish Foundation*](https://github.com/tianocore/edk2/blob/master/RedfishPkg/Readme.md).
+
+### Redfish Profile Simulator ***[[2]](#[0])***
+Redfish Profile Simulator is an
+[*open source project*](https://github.com/DMTF/Redfish-Profile-Simulator) on
+DMTF GitHub, which simulates the HTTP request methods (POST, PATCH, PUT, GET) on
+Redfish resource maintained by Redfish Profile Simulator. EDK2 open source uses
+this simulator for the use case when Redfish service has not been set up on the
+platform, or for the quick Redfish firmware feature development. We clone this
+project under RedfishClientPkg and maintain it by edk2 because this project has
+currently been using and updating rarely. That is easier for edk2 to add
+features to the simulator or modify the simulator to align with edk2 requirement
+on Redfish service, such as ETAG and HTTP POST support. <br>
+Another open source project of Redfish simulator is
+[*Redfish Interface Emulator*](https://github.com/DMTF/Redfish-Interface-Emulator),
+however, we don't pay much attention to this project because we have been
+dedicating to Redfish Profile Simulator since we started the UEFI Redfish EDK2
+project.
+
+### EDK2 Redfish JSON Schema to C Structure Convertor ***[[3]](#[0])***
+This is the script auto-generated EDK2 drivers and libraries that provide the
+Redfish schema naming based JSON to C structure and vise versa converters. C
+structure is another representation of Redfish properties other than JSON and
+CSDL(XML). The higher layer Redfish client application can deal with C structure
+instead of using JSON library to manipulate Redfish properties. The script
+[*Redfish Schema C Struct Generator*](https://github.com/DMTF/Redfish-Schema-C-Struct-Generator)
+is still a private project on DMTF GitHub. Below is the reference of script
+auto-generated
+[*Redfish JSON C Struct Converter Lib*](https://github.com/changab/Redfish-JSON-C-Struct-Converter-Lib)
+libraries. The converters generated by the script are followed
+**EFI REST JSON Structure Protocol** defined in UEFI spec 2.8, section 29.7.3.
+
+### EDK2 Redfish Non-Collection ***[[4]](#[0])*** and Collection ***[[5]](#[0])
+*** Feature Drivers EDK2 Redfish feature driver is an intermediary driver that
+sits between **JSON Schema to C Structure converters** and **EFI Platform
+Configuration to Redfish Protocol**. The Redfish feature driver gets and sets
+the platform configuration and incorporates it with Redfish JSON schema C
+structure to manipulate Redfish JSON resources. Then applies the settings from
+Redfish service to platform configurations, or vise versa to update platform
+configurations to Redfish service. Both EDK2 Redfish Non-Collection and
+Collection Feature drivers are script auto-generated base on Redfish schema
+naming. The EDK2 Redfish Non-Collection feature driver manages the resource of
+specific Resdifsh resource type, while the EDK2 Redfish Collection feature
+driver manages the members which have the same resource type in collection
+resource (e.g the ComputerSystem resource and ComputerSystemCollection resource)
+.
+
+### EDKII Redfish Platform Config Protocol ***[[6]](#[0])***
+EDKII Redfish Platform Config Protocol is an abstract driver that abstracts the
+platform configuration format and storage from EDK2 Redfish Feature driver.
+This protocol provides the interfaces to get and set platform configuration with
+the format and configuration storage agnostic to the Redfish feature driver.
+The platform can provide its own EDKII Redfish Platform Config driver instance
+to access platform-specific configuration format and storage. On EDK2 open
+source, EDKII Redfish Platform Config Protocol accesses the platform
+configuration in EDK2 HII defined format.
+
+Below is the prototype of **EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL**,
+
+```C
+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;
+};
+```
+
+### Other instances of EDKII Redfish Platform Config Protocol ***[[7]](#[0])***
+For those Non-EDK2 HII-based platform configuration formats, the driver instance
+can provide its own implementation to get or set the platform configurations.
+
+### EDK2 HII VFR Form ***[[8]](#[0])***
+According to **UEFI spec 2.9 section 35.6 Form Browser Protocol**,
+**EFI_HII_REST_STYLE_FORMSET_GUID** is used on HII form to indicate that HII
+options declared in this form intend to interact with the REST architectural
+style. On edk2 open source, the REST architectural style refers to the Redfish
+service. Besides **EFI_HII_REST_STYLE_FORMSET_GUID** is defined in the form
+scope, **EFI_IFR_FLAG_REST_STYLE** can be assigned to the HII options that
+indicate those options intend to interact with the REST service.
+
+### EDK2 HII UNI file ***[[9]](#[0])***
+x-uefi-redfish Configure Language is used in UNI file to associate HII option
+with the particular Redfish property. The Hii options interact with EDK2 Redfish
+Feature driver if the string of HII option is assigned with x-uefi-redfish
+Language as in below,
+
+```C
+x-uefi-redfish-$(NAMESPACE)
+where $(NAMESPACE) is the combination of Redfish ResourceTypeName and schema version.
+```
+For example, if the HII option is mapped to the property in Processor.v1_0_0.
+The x-uefi-redfish configure language is declared as below,
+```C
+x-uefi-redfish-Processor.v1_0_0
+```
+#### x-uefi-redfish Configure Language format:
+- The string declared with x-uefi-redfish configure language is a path to the property
+in Redfish resource
+- The root of path is the Redfish resource type indicated in x-uefi-redfish configure
+language
+- The path is relative to root of Redfish resource type, not related to Redfish service
+- root.
+
+#### Examples,
+```C
+Properties:
+
+#string STR_BOOT_SOURCE_OVERRIDE_ENABLED_PROMPT #language x_uefi_redfish_ComputerSystem.v1_0_0 "/Boot/BootSourceOverrideEnabled"
+#string STR_BOOT_SOURCE_OVERRIDE_MODE_PROMPT #language x_uefi_redfish_ComputerSystem.v1_0_0 "/Boot/BootSourceOverrideMode"
+#string STR_BOOT_SOURCE_OVERRIDE_TARGET_PROMPT #language x_uefi_redfish_ComputerSystem.v1_0_0 "/Boot/BootSourceOverrideTarget"
+```
+```C
+Properties in array object [NUM]:
+
+#string STR_BOOT_ORDER_1_PROMPT #language x_uefi_redfish_ComputerSystem.v1_11_0 "/Boot/BootOrder/[1]/Boot0001"
+#string STR_BOOT_ORDER_2_PROMPT #language x_uefi_redfish_ComputerSystem.v1_11_0 "/Boot/BootOrder/[2]/Boot0002"
+#string STR_BOOT_ORDER_3_PROMPT #language x_uefi_redfish_ComputerSystem.v1_11_0 "/Boot/BootOrder/[3]/Boot0003"
+```
+```C
+Properties in collection object {NUM}:
+
+#string STR_MEMORY_1_BASE_MODULE_TYPE_PROMPT #language x_uefi_redfish_Memory.v1_7_1 "/Memory/{1}/BaseModuleType"
+#string STR_MEMORY_2_BASE_MODULE_TYPE_PROMPT #language x_uefi_redfish_Memory.v1_7_1 "/Memory/{2}/BaseModuleType"
+#string STR_MEMORY_3_BASE_MODULE_TYPE_PROMPT #language x_uefi_redfish_Memory.v1_7_1 "/Memory/{3}/BaseModuleType"
+```
+
+### EDK2 Build Tool ***[[10]](#[0])***
+EDK2 Build is responsible to pull the necessary EDK2 Redfish JSON Schema to C
+Structure Convertors and EDK2 Redfish Feature drivers into edk2 build process
+according to the x-uefi-Redfish config language used in the HII VFR forms.
+
+## The Contributors
+Chang, Abner <abner.chang@...>\
+Wang, Nickle <nickle.wang@...>\
+Chen, Aaron <aaron.chen@...>
diff --git a/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg b/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg
new file mode 100644
index 0000000000..881d9647e5
--- /dev/null
+++ b/RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg
@@ -0,0 +1,1068 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export RedfishClientDriverStack.svg Page-2 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="12.1281in" height="9.93872in"
+ viewBox="0 0 873.222 715.588" xml:space="preserve" color-interpolation-filters="sRGB" class="st69">
+ <v:documentProperties v:langID="1033" v:viewMarkup="false">
+ <v:userDefs>
+ <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
+ </v:userDefs>
+ </v:documentProperties>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#ffffff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st2 {fill:#ebf1df;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st3 {fill:#ff1a1a;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st4 {fill:#ffffff;font-family:Calibri;font-size:1.00001em;font-weight:bold}
+ .st5 {font-size:1em}
+ .st6 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st7 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-weight:bold}
+ .st8 {fill:#dbeef3;stroke:#d8d8d8;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st9 {fill:#ffffff;font-family:Calibri;font-size:1.08334em;font-weight:bold}
+ .st10 {visibility:visible}
+ .st11 {fill:none;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}
+ .st12 {fill:none;stroke:#bfbfbf;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st13 {fill:#000000;font-family:Arial;font-size:1.99999em;font-style:italic;font-weight:bold}
+ .st14 {marker-end:url(#mrkr2-45);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.9}
+ .st15 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.42986425339367}
+ .st16 {fill:#000000;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st17 {fill:#ffffff;font-family:Arial;font-size:1.33333em;font-weight:bold}
+ .st18 {fill:#ffffff;stroke:#595959;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st19 {fill:#7f7f7f;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st20 {fill:#ffffff;font-family:Calibri;font-size:1.08334em}
+ .st21 {fill:#000000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st22 {fill:#000000;font-family:Calibri;font-size:0.833336em;font-weight:bold}
+ .st23 {marker-start:url(#mrkr10-112);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st24 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.40983606557377}
+ .st25 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st26 {fill:#000000;fill-opacity:0.4;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}
+ .st27 {fill:#0070c0;fill-opacity:0.72;stroke:#003f6c;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st28 {fill:#0070c0;stroke:#003f6c;stroke-dasharray:10.5,7.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st29 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-style:italic;font-weight:bold}
+ .st30 {fill:#ffffff;stroke:#000000;stroke-dasharray:1.68,1.2;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st31 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st32 {fill:#ffffff;stroke:#000000;stroke-dasharray:3.5,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}
+ .st33 {stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:4.5}
+ .st34 {fill:#000000;fill-opacity:0.38;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.38}
+ .st35 {fill:#000000;fill-opacity:0.38;stroke:#000000;stroke-opacity:0.38;stroke-width:0.22935779816514}
+ .st36 {fill:#f2f2f2;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st37 {fill:#7f7f7f;fill-opacity:1;stroke:#7f7f7f;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st38 {fill:#d8d8d8;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st39 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st40 {fill:#000000;fill-opacity:0.4;filter:url(#filter_3.3333334922791);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.4}
+ .st41 {fill:#0070c0;stroke:#003f6c;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st42 {fill:#ffffff;stroke:#000000;stroke-dasharray:9.5,2.5,3.5,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}
+ .st43 {fill:#ffffff;stroke:#000000;stroke-dasharray:3.5,2.5,3.5,2.5,0,2.5;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}
+ .st44 {marker-end:url(#mrkr4-212);marker-start:url(#mrkr4-210);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25}
+ .st45 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.47169811320755}
+ .st46 {fill:#ffffff;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st47 {fill:#000000;font-family:Calibri;font-size:1.16666em;font-style:italic;font-weight:bold}
+ .st48 {font-family:Arial;font-size:0.571431em;font-style:normal;font-weight:normal}
+ .st49 {font-family:Arial;font-size:0.571431em;font-style:normal}
+ .st50 {fill:#ea700d;font-family:Arial;font-size:0.571431em;font-style:normal}
+ .st51 {fill:#ffffff;stroke:#7f7f7f;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st52 {fill:#d8d8d8;font-family:Calibri;font-size:0.833336em;font-style:italic;font-weight:bold}
+ .st53 {font-size:1.20001em;font-style:normal;font-weight:normal}
+ .st54 {font-size:1em;font-style:normal;font-weight:normal}
+ .st55 {fill:#f59d56;font-size:1em;font-style:normal;font-weight:normal}
+ .st56 {marker-end:url(#mrkr2-350);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}
+ .st57 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.44247787610619}
+ .st58 {marker-end:url(#mrkr2-383);marker-start:url(#mrkr2-381);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st59 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st60 {fill:#000000;font-family:Calibri;font-size:0.75em;font-style:italic;font-weight:bold}
+ .st61 {fill:#000000;font-family:Calibri;font-size:0.75em;font-weight:bold}
+ .st62 {fill:#0070c0;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st63 {fill:#595959;stroke:none;stroke-linecap:butt;stroke-width:0.75}
+ .st64 {marker-start:url(#mrkr4-405);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st65 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.3315649867374}
+ .st66 {marker-end:url(#mrkr4-411);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st67 {marker-end:url(#mrkr10-430);marker-start:url(#mrkr10-112);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st68 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25}
+ .st69 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend2">
+ <path d="M 1 1 L 0 0 L 1 -1 L 1 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr2-45" class="st15" v:arrowType="2" v:arrowSize="2" v:setback="2.13684" refX="-2.1368421052632"
+ orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(-2.3263157894737,-2.3263157894737) "/>
+ </marker>
+ <g id="lend10">
+ <path
+ d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "
+ style="stroke:none"/>
+ </g>
+ <marker id="mrkr10-112" class="st24" v:arrowType="10" v:arrowSize="1" v:setback="1.542" refX="1.542" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend10" transform="scale(2.44) "/>
+ </marker>
+ <g id="lend42">
+ <path
+ d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "
+ style="stroke:none"/>
+ </g>
+ <marker id="mrkr42-163" class="st35" v:arrowType="42" v:arrowSize="2" v:setback="3.27" refX="3.27" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend42" transform="scale(4.36) "/>
+ </marker>
+ <marker id="mrkr42-167" class="st37" v:arrowType="42" v:arrowSize="2" v:setback="3.27" refX="3.27" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend42" transform="scale(4.36) "/>
+ </marker>
+ <g id="lend4">
+ <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr4-210" class="st45" v:arrowType="4" v:arrowSize="2" v:setback="4.08" refX="4.08" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(2.12) "/>
+ </marker>
+ <marker id="mrkr4-212" class="st45" v:arrowType="4" v:arrowSize="2" v:setback="4.08" refX="-4.08" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-2.12,-2.12) "/>
+ </marker>
+ <marker id="mrkr2-350" class="st57" v:arrowType="2" v:arrowSize="2" v:setback="2.08" refX="-2.08" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(-2.26,-2.26) "/>
+ </marker>
+ <marker id="mrkr2-381" class="st59" v:arrowType="2" v:arrowSize="2" v:setback="3.88" refX="3.88" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(4.36) "/>
+ </marker>
+ <marker id="mrkr2-383" class="st59" v:arrowType="2" v:arrowSize="2" v:setback="3.88" refX="-3.88" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend2" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ <marker id="mrkr4-405" class="st65" v:arrowType="4" v:arrowSize="2" v:setback="5.744" refX="5.744" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(3.016) "/>
+ </marker>
+ <marker id="mrkr4-411" class="st65" v:arrowType="4" v:arrowSize="2" v:setback="6.032" refX="-6.032" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-3.016,-3.016) "/>
+ </marker>
+ <marker id="mrkr10-430" class="st24" v:arrowType="10" v:arrowSize="1" v:setback="1.542" refX="-1.542" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend10" transform="scale(-2.44,-2.44) "/>
+ </marker>
+ </defs>
+ <defs id="Filters">
+ <filter id="filter_3.3333334922791">
+ <feGaussianBlur stdDeviation="3.3333334922791"/>
+ </filter>
+ </defs>
+ <g v:mID="8" v:index="1" v:groupContext="backgroundPage">
+ <v:userDefs>
+ <v:ud v:nameU="msvVisioCreated" v:prompt="" v:val="VT0(0):26"/>
+ </v:userDefs>
+ <title>VBackground-1</title>
+ <v:pageProperties width="12.1281" height="9.93872" v:drawingScale="1" v:pageScale="1" v:drawingUnits="19"
+ v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+ <g id="shape1-1" v:mID="1" v:groupContext="shape">
+ <title>Solid</title>
+ <v:userDefs>
+ <v:ud v:nameU="Background" v:val="VT0(0):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ <v:ud v:nameU="msvShapeCategories" v:prompt="" v:val="VT4(DoNotContain)"/>
+ <v:ud v:nameU="msvVisioCreated" v:prompt="" v:val="VT0(0):26"/>
+ </v:userDefs>
+ <rect x="0" y="0" width="873.222" height="715.588" class="st1"/>
+ </g>
+ </g>
+ <g v:mID="4" v:index="3" v:groupContext="foregroundPage">
+ <title>Page-2</title>
+ <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="19" v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+ <v:layer v:name="Connector" v:index="0"/>
+ <g id="shape52-3" v:mID="52" v:groupContext="shape" transform="translate(336.222,-197.713)">
+ <title>Rectangle.52</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="598.588" width="495" height="117" class="st2"/>
+ </g>
+ <g id="group5-5" transform="translate(772.722,-60.4625)" v:mID="5" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can</title>
+ <desc>Redfish Service</desc>
+ <g id="shape6-6" v:mID="6" v:groupContext="shape">
+ <title>Sheet.6</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.15625):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT5(#ff1a1a)"/>
+ </v:userDefs>
+ <path d="M0 704.34 A26.4375 11.25 -180 1 0 52.88 704.34 L52.88 663.84 L0 663.84 L0 704.34 Z" class="st3"/>
+ </g>
+ <g id="shape5-8" v:mID="5" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="2"/>
+ <v:textRect cx="26.4375" cy="684.088" width="52.88" height="63"/>
+ <ellipse cx="26.4375" cy="663.838" rx="26.4375" ry="11.25" class="st3"/>
+ <text x="7.83" y="693.59" class="st4" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Redfish <tspan
+ x="8.6" dy="1.2em" class="st5">Service</tspan></text> </g>
+ </g>
+ <g id="shape8-12" v:mID="8" v:groupContext="shape" transform="translate(746.847,-24.4625)">
+ <title>Sheet.8</title>
+ <desc>Redfish Profile Simulator On Network</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="17.62" y="693.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Redfish Profile <tspan
+ x="21.08" dy="1em" class="st5">Simulator On </tspan><tspan x="32.24" dy="1em" class="st5">Network</tspan></text> </g>
+ <g id="shape10-17" v:mID="10" v:groupContext="shape" transform="translate(408.222,-82.9625)">
+ <title>Sheet.10</title>
+ <desc>EFI REST EX</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="99.8" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI REST EX </text> </g>
+ <g id="shape12-20" v:mID="12" v:groupContext="shape" transform="translate(57.2224,-197.713)">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="598.588" width="234" height="117" class="st2"/>
+ </g>
+ <g id="shape13-22" v:mID="13" v:groupContext="shape" transform="translate(30.2224,-24.4625)">
+ <title>Rounded Rectangle.76</title>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.125):1"/>
+ </v:userDefs>
+ <g id="shadow13-23" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-6.84,-13.2318)" class="st10">
+ <path d="M9 715.59 L675 715.59 A8.99985 8.99985 -180 0 0 684 706.59 L684 616.59 A8.99985 8.99985 -180 0 0 675 607.59
+ L9 607.59 A8.99985 8.99985 -180 0 0 0 616.59 L0 706.59 A8.99985 8.99985 -180 0 0 9 715.59 Z"
+ class="st11"/>
+ </g>
+ <path d="M9 715.59 L675 715.59 A8.99985 8.99985 -180 0 0 684 706.59 L684 616.59 A8.99985 8.99985 -180 0 0 675 607.59
+ L9 607.59 A8.99985 8.99985 -180 0 0 0 616.59 L0 706.59 A8.99985 8.99985 -180 0 0 9 715.59 Z" class="st12"/>
+ </g>
+ <g id="shape16-27" v:mID="16" v:groupContext="shape" transform="translate(75.2224,-82.9625)">
+ <title>Sheet.16</title>
+ <desc>EFI REST JSON to C Structure</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="53.89" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI REST JSON to C Structure</text> </g>
+ <g id="shape17-30" v:mID="17" v:groupContext="shape" transform="translate(408.222,-37.9625)">
+ <title>Sheet.17</title>
+ <desc>EFI Network Stack</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="81.72" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI Network Stack</text> </g>
+ <g id="shape18-33" v:mID="18" v:groupContext="shape" transform="translate(75.2224,-37.9625)">
+ <title>Sheet.18</title>
+ <desc>EFI Redfish Discover Protocl</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="697.588" width="261" height="36"/>
+ <rect x="0" y="679.588" width="261" height="36" class="st8"/>
+ <text x="55.56" y="700.84" class="st9" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EFI Redfish Discover Protocl</text> </g>
+ <g id="shape19-36" v:mID="19" v:groupContext="shape" transform="translate(291.222,-51.4625)">
+ <title>Sheet.19</title>
+ <desc>EDKII Redfish Foundation</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="92" cy="693.088" width="184.01" height="45"/>
+ <rect x="0" y="670.588" width="184" height="45" class="st6"/>
+ <text x="12.66" y="685.89" class="st13" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>EDKII Redfish <tspan
+ x="26.69" dy="1.2em" class="st5">Foundation</tspan></text> </g>
+ <g id="shape20-40" v:mID="20" v:groupContext="shape" v:layerMember="0"
+ transform="translate(904.308,1335.5) rotate(-19.179) scale(1,-1)">
+ <title>Curve connect 1</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 715.59 A42.4531 42.4531 0 0 1 54.79 715.59 A42.4531 42.4531 -180 0 0 106.06 718.26 L106.35 718.04"
+ class="st14"/>
+ </g>
+ <g id="shape21-46" v:mID="21" v:groupContext="shape" transform="translate(18.9724,-139.213)">
+ <title>Sheet.21</title>
+ <desc>EDKII Redfish Client</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalText="true"/>
+ <v:textRect cx="12.375" cy="463.588" width="24.75" height="504" transform="rotate(-180)"/>
+ <rect x="0" y="211.588" width="24.75" height="504" class="st16"/>
+ <text x="-10.85" y="-540.93" writing-mode="tb-rl" transform="rotate(180)" class="st17" v:langID="1033"><v:paragraph
+ v:horizAlign="1"/><v:tabList/>EDKII Redfish Client</text> </g>
+ <g id="shape24-49" v:mID="24" v:groupContext="shape" transform="translate(111.222,-253.963)">
+ <title>Sheet.24</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape25-51" v:mID="25" v:groupContext="shape" transform="translate(84.2224,-240.463)">
+ <title>Sheet.25</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape26-53" v:mID="26" v:groupContext="shape" transform="translate(75.2224,-226.963)">
+ <title>Sheet.26</title>
+ <desc>Script-generated Redfish JSON schema to C Structure convertor</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="76.5" cy="693.088" width="153" height="45"/>
+ <rect x="0" y="670.588" width="153" height="45" class="st19"/>
+ <text x="11.2" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated Redfish <tspan
+ x="29.22" dy="1em" class="st5">JSON schema to C </tspan><tspan x="24.45" dy="1em" class="st5">Structure convertor</tspan></text> </g>
+ <g id="shape28-58" v:mID="28" v:groupContext="shape" transform="translate(241.722,-267.463)">
+ <title>Sheet.28</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape29-60" v:mID="29" v:groupContext="shape" transform="translate(245.66,-272.525)">
+ <title>Sheet.29</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape30-62" v:mID="30" v:groupContext="shape" transform="translate(250.16,-277.588)">
+ <title>Sheet.30</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape31-64" v:mID="31" v:groupContext="shape" transform="translate(178.722,-204.463)">
+ <title>Sheet.31</title>
+ <desc>ComputerSystem</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="18.16" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>ComputerSystem</text> </g>
+ <g id="shape32-67" v:mID="32" v:groupContext="shape" transform="translate(201.222,-220.213)">
+ <title>Sheet.32</title>
+ <desc>BootOption</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="29.69" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>BootOption</text> </g>
+ <g id="shape33-70" v:mID="33" v:groupContext="shape" transform="translate(210.222,-233.713)">
+ <title>Sheet.33</title>
+ <desc>Memory</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="36.21" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Memory</text> </g>
+ <g id="shape34-73" v:mID="34" v:groupContext="shape" transform="translate(385.722,-247.213)">
+ <title>Sheet.34</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape35-75" v:mID="35" v:groupContext="shape" transform="translate(358.722,-233.713)">
+ <title>Sheet.35</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape36-77" v:mID="36" v:groupContext="shape" transform="translate(349.722,-220.213)">
+ <title>Sheet.36</title>
+ <desc>Script-generated EDK2 Redfish Feature Driver</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="76.5" cy="693.088" width="153" height="45"/>
+ <rect x="0" y="670.588" width="153" height="45" class="st19"/>
+ <text x="16.96" y="689.84" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated EDK2 <tspan
+ x="17.33" dy="1em" class="st5">Redfish Feature Driver</tspan></text> </g>
+ <g id="shape40-81" v:mID="40" v:groupContext="shape" transform="translate(453.222,-197.713)">
+ <title>Sheet.40</title>
+ <desc>ComputerSystem</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="18.16" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>ComputerSystem</text> </g>
+ <g id="shape41-84" v:mID="41" v:groupContext="shape" transform="translate(475.722,-213.463)">
+ <title>Sheet.41</title>
+ <desc>BootOption</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="29.69" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>BootOption</text> </g>
+ <g id="shape42-87" v:mID="42" v:groupContext="shape" transform="translate(493.722,-226.963)">
+ <title>Sheet.42</title>
+ <desc>Memory</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="36.21" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Memory</text> </g>
+ <g id="shape43-90" v:mID="43" v:groupContext="shape" transform="translate(608.472,-249.463)">
+ <title>Sheet.43</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape46-92" v:mID="46" v:groupContext="shape" transform="translate(738.972,-262.963)">
+ <title>Sheet.46</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape47-94" v:mID="47" v:groupContext="shape" transform="translate(742.91,-268.025)">
+ <title>Sheet.47</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape48-96" v:mID="48" v:groupContext="shape" transform="translate(747.41,-273.088)">
+ <title>Sheet.48</title>
+ <ellipse cx="1.6875" cy="713.9" rx="1.6875" ry="1.6875" class="st21"/>
+ </g>
+ <g id="shape49-98" v:mID="49" v:groupContext="shape" transform="translate(660.222,-199.963)">
+ <title>Sheet.49</title>
+ <desc>ComputerSystemCollection</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="61.875" cy="702.088" width="123.75" height="27"/>
+ <rect x="0" y="688.588" width="123.75" height="27" class="st6"/>
+ <text x="5.3" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>ComputerSystemCollection</text> </g>
+ <g id="shape50-101" v:mID="50" v:groupContext="shape" transform="translate(720.972,-215.713)">
+ <title>Sheet.50</title>
+ <desc>BootOptionCollection</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="8.96" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>BootOptionCollection</text> </g>
+ <g id="shape51-104" v:mID="51" v:groupContext="shape" transform="translate(732.222,-229.213)">
+ <title>Sheet.51</title>
+ <desc>MemoryCollection</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="15.48" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>MemoryCollection</text> </g>
+ <g id="shape56-107" v:mID="56" v:groupContext="shape" v:layerMember="0"
+ transform="translate(515.651,-269.34) rotate(-1.84761)">
+ <title>Curve connect 2.56</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 69.79 715.59" class="st23"/>
+ </g>
+ <g id="shape57-113" v:mID="57" v:groupContext="shape" transform="translate(581.472,-235.963)">
+ <title>Sheet.57</title>
+ <rect x="0" y="670.588" width="153" height="45" class="st18"/>
+ </g>
+ <g id="shape59-115" v:mID="59" v:groupContext="shape" v:layerMember="0" transform="translate(291.222,-242.713)">
+ <title>1-D double</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L31.5 710.19 L31.5 715.59 L45 702.09 L31.5 688.59
+ L31.5 693.99 L13.5 693.99 Z" class="st25"/>
+ </g>
+ <g id="shape64-117" v:mID="64" v:groupContext="shape" transform="translate(619.722,-467.713)">
+ <title>Sheet.64</title>
+ <desc>EDKII REDFISH_PLATFORM_CONFIG_PROTOCOL</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="99" cy="693.088" width="198" height="45"/>
+ <g id="shadow64-118" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.98,-13.8618)" class="st10">
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st26"/>
+ </g>
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st27"/>
+ <text x="85.18" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDKII <tspan
+ x="5.65" dy="1em" class="st5">REDFISH</tspan>_PLATFORM_CONFIG_PRO<tspan x="81.03" dy="1em" class="st5">TOCOL</tspan></text> </g>
+ <g id="shape65-125" v:mID="65" v:groupContext="shape" transform="translate(511.722,-445.213)">
+ <title>Sheet.65</title>
+ <desc>EDKII REDFISH_PLATFORM_CONFIG_PROTOCOL</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="99" cy="693.088" width="198" height="45"/>
+ <g id="shadow65-126" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.98,-13.8618)" class="st10">
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st26"/>
+ </g>
+ <path d="M0 715.59 L198 715.59 L198 670.59 L0 670.59 L0 715.59 Z" class="st28"/>
+ <text x="85.18" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDKII <tspan
+ x="5.65" dy="1em" class="st5">REDFISH</tspan>_PLATFORM_CONFIG_PRO<tspan x="81.03" dy="1em" class="st5">TOCOL</tspan></text> </g>
+ <g id="shape67-133" v:mID="67" v:groupContext="shape" transform="translate(536.472,-593.713)">
+ <title>Sheet.67</title>
+ <desc>Other Platform-specific Implementations</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="121.5" cy="702.088" width="243" height="27"/>
+ <rect x="0" y="688.588" width="243" height="27" class="st6"/>
+ <text x="20.02" y="705.09" class="st29" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Other Platform-specific Implementations</text> </g>
+ <g id="group71-136" transform="translate(567.972,-530.713)" v:mID="71" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can.71</title>
+ <desc>EFI Variable/ FW Storage</desc>
+ <g id="shape72-137" v:mID="72" v:groupContext="shape">
+ <title>Sheet.72</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.0875):1"/>
+ </v:userDefs>
+ <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st30"/>
+ </g>
+ <g id="shape71-139" v:mID="71" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="29.25" cy="684.088" width="58.5" height="63"/>
+ <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st30"/>
+ <text x="23.25" y="675.09" class="st31" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>EFI <tspan
+ x="10.54" dy="1.2em" class="st5">Variable</tspan>/ <tspan x="5.79" dy="1.2em" class="st5">FW Storage</tspan></text> </g>
+ </g>
+ <g id="group73-144" transform="translate(687.222,-530.713)" v:mID="73" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can.73</title>
+ <desc>Other Storage</desc>
+ <g id="shape74-145" v:mID="74" v:groupContext="shape">
+ <title>Sheet.74</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.0875):1"/>
+ </v:userDefs>
+ <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st30"/>
+ </g>
+ <g id="shape73-147" v:mID="73" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="29.25" cy="684.088" width="58.5" height="63"/>
+ <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st30"/>
+ <text x="17.41" y="681.09" class="st31" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Other <tspan
+ x="13.66" dy="1.2em" class="st5">Storage</tspan></text> </g>
+ </g>
+ <g id="shape76-151" v:mID="76" v:groupContext="shape" v:layerMember="0" transform="translate(1306.06,184.875) rotate(90)">
+ <title>1-D double.76</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L33.75 712.89 L33.75 715.59 L40.5 708.84 L33.75
+ 702.09 L33.75 704.79 L6.75 704.79 Z" class="st32"/>
+ </g>
+ <g id="shape77-153" v:mID="77" v:groupContext="shape" v:layerMember="0" transform="translate(1425.31,184.875) rotate(90)">
+ <title>1-D double.77</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L11.25 712.89 L11.25 715.59 L18 708.84 L11.25
+ 702.09 L11.25 704.79 L6.75 704.79 Z" class="st32"/>
+ </g>
+ <g id="shape78-155" v:mID="78" v:groupContext="shape" transform="translate(21.2224,-139.213)">
+ <title>Sheet.78</title>
+ <path d="M0 715.59 L810 715.59" class="st33"/>
+ </g>
+ <g id="group80-158" transform="translate(-173.49,382.875) rotate(-90)" v:mID="80" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="ControlDistFromCorner" v:prompt="" v:val="VT0(0.35355339059327):1"/>
+ <v:ud v:nameU="AngToControl" v:prompt="" v:val="VT0(0.78539816339745):32"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="ControlDistFromCorner" v:prompt="" v:val="VT0(0.57622152858081):1"/>
+ <v:ud v:nameU="AngToControl" v:prompt="" v:val="VT0(0.70862627212768):32"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.44270833333333):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.3794642857143):1"/>
+ </v:userDefs>
+ <title>Folded Corner</title>
+ <g id="shape80-159" v:mID="80" v:groupContext="groupContent">
+ <g id="shadow80-160" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-3.105,-9.45175)" class="st10">
+ <path d="M0 715.59 L278.62 715.59 L310.5 688.27 L310.5 229.59 L0 229.59 L0 715.59 Z" class="st34"/>
+ </g>
+ <path d="M0 715.59 L278.62 715.59 L310.5 688.27 L310.5 229.59 L0 229.59 L0 715.59 Z" class="st36"/>
+ </g>
+ <g id="shape81-168" v:mID="81" v:groupContext="shape" transform="translate(278.625,0)">
+ <title>Sheet.81</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlX" v:prompt="" v:val="VT0(1):1"/>
+ <v:ud v:nameU="ControlY" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.25):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlX" v:prompt="" v:val="VT0(3.9375):1"/>
+ <v:ud v:nameU="ControlY" v:prompt="" v:val="VT0(0.4375):1"/>
+ <v:ud v:nameU="XFoldLength" v:prompt="" v:val="VT0(0.44270833333333):1"/>
+ <v:ud v:nameU="YFoldLength" v:prompt="" v:val="VT0(0.3794642857143):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT5(#f2f2f2)"/>
+ </v:userDefs>
+ <g id="shadow81-169" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-0.6375,-14.3117)" class="st10">
+ <path d="M0 715.59 L31.88 688.27 L4.87 684.09 L0 715.59 Z" class="st34"/>
+ </g>
+ <path d="M0 715.59 L31.88 688.27 L4.87 684.09 L0 715.59 Z" class="st38"/>
+ </g>
+ </g>
+ <g id="group82-175" transform="translate(432.972,-530.713)" v:mID="82" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <title>Can.69</title>
+ <desc>EDK2 HII Database</desc>
+ <g id="shape83-176" v:mID="83" v:groupContext="shape">
+ <title>Sheet.83</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.125):1"/>
+ <v:ud v:nameU="FillForegnd" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="ControlHalfHeight" v:prompt="" v:val="VT0(0.0875):1"/>
+ </v:userDefs>
+ <path d="M0 709.29 A29.25 6.3 -180 1 0 58.5 709.29 L58.5 658.89 L0 658.89 L0 709.29 Z" class="st39"/>
+ </g>
+ <g id="shape82-178" v:mID="82" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="29.25" cy="684.088" width="58.5" height="63"/>
+ <ellipse cx="29.25" cy="658.888" rx="29.25" ry="6.3" class="st39"/>
+ <text x="11.84" y="681.09" class="st31" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>EDK2 HII <tspan
+ x="10.24" dy="1.2em" class="st5">Database</tspan></text> </g>
+ </g>
+ <g id="shape84-182" v:mID="84" v:groupContext="shape" transform="translate(390.222,-429.463)">
+ <title>Sheet.84</title>
+ <desc>EDKII REDFISH_PLATFORM_CONFIG_PROTOCOL</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="72" cy="693.088" width="144" height="45"/>
+ <g id="shadow84-183" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.44,-13.8618)" class="st10">
+ <rect x="0" y="670.588" width="144" height="45" class="st40"/>
+ </g>
+ <rect x="0" y="670.588" width="144" height="45" class="st41"/>
+ <text x="58.18" y="683.34" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDKII <tspan
+ x="6" dy="1em" class="st5">REDFISH</tspan>_PLATFORM_CO<tspan x="26.68" dy="1em" class="st5">NFIG</tspan>_PROTOCOL</text> </g>
+ <g id="shape85-190" v:mID="85" v:groupContext="shape" v:layerMember="0" transform="translate(1171.06,184.875) rotate(90)">
+ <title>1-D double.75</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M6.75 704.79 L6.75 702.09 L0 708.84 L6.75 715.59 L6.75 712.89 L49.5 712.89 L49.5 715.59 L56.25 708.84 L49.5
+ 702.09 L49.5 704.79 L6.75 704.79 Z" class="st39"/>
+ </g>
+ <g id="shape86-192" v:mID="86" v:groupContext="shape" v:layerMember="0" transform="translate(1164.31,286.125) rotate(90)">
+ <title>1-D double.68</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow86-193" v:groupContext="shadow" v:shadowOffsetX="7.2E-008" v:shadowOffsetY="0" v:shadowType="1"
+ v:shadowScale="1.02" transform="matrix(1.02,0,0,1.02,-1.1475,-14.0418)" class="st10">
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L101.25 710.19 L101.25 715.59 L114.75 702.09
+ L101.25 688.59 L101.25 693.99 L13.5 693.99 Z" class="st40"/>
+ </g>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L101.25 710.19 L101.25 715.59 L114.75 702.09 L101.25
+ 688.59 L101.25 693.99 L13.5 693.99 Z" class="st39"/>
+ </g>
+ <g id="shape87-197" v:mID="87" v:groupContext="shape" transform="translate(27.9724,-616.213)">
+ <title>Sheet.87</title>
+ <desc>EDK2 Open Source Implementation</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="121.5" cy="702.088" width="243" height="27"/>
+ <rect x="0" y="688.588" width="243" height="27" class="st6"/>
+ <text x="34.39" y="705.09" class="st29" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDK2 Open Source Implementation</text> </g>
+ <g id="shape88-200" v:mID="88" v:groupContext="shape" v:layerMember="0" transform="translate(1312.81,270.375) rotate(90)">
+ <title>1-D double.88</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L117 710.19 L117 715.59 L130.5 702.09 L117 688.59
+ L117 693.99 L13.5 693.99 Z" class="st42"/>
+ </g>
+ <g id="shape89-202" v:mID="89" v:groupContext="shape" v:layerMember="0" transform="translate(1434.31,247.875) rotate(90)">
+ <title>1-D double.89</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M13.5 693.99 L13.5 688.59 L0 702.09 L13.5 715.59 L13.5 710.19 L139.5 710.19 L139.5 715.59 L153 702.09 L139.5
+ 688.59 L139.5 693.99 L13.5 693.99 Z" class="st43"/>
+ </g>
+ <g id="shape90-204" v:mID="90" v:groupContext="shape" v:layerMember="0"
+ transform="translate(838.629,252.112) rotate(68.1986)">
+ <title>Curve connect 1.61</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.53 720.84 L7.83 721.04 A30.61 30.61 -180 0 0 42.41 715.59 A30.61 30.61 0 0 1 76.99 710.13 L77.29 710.34"
+ class="st44"/>
+ </g>
+ <g id="shape91-213" v:mID="91" v:groupContext="shape" v:layerMember="0"
+ transform="translate(-37.5816,162.844) rotate(-60.2551) scale(-1,1)">
+ <title>Curve connect 1.62</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.67 720.62 L7.98 720.82 A34.3918 34.3918 -180 0 0 45.35 715.59 A34.3918 34.3918 0 0 1 82.72 710.35 L83.03
+ 710.55" class="st44"/>
+ </g>
+ <g id="shape94-220" v:mID="94" v:groupContext="shape" v:layerMember="0"
+ transform="translate(488.651,-255.84) rotate(-1.84761)">
+ <title>Curve connect 2.54</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 69.79 715.59" class="st23"/>
+ </g>
+ <g id="shape96-225" v:mID="96" v:groupContext="shape" transform="translate(572.472,-222.463)">
+ <title>Sheet.96</title>
+ <desc>Script-generated EDK2 Redfish Collection Driver</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="76.5" cy="693.088" width="153" height="45"/>
+ <rect x="0" y="670.588" width="153" height="45" class="st19"/>
+ <text x="16.96" y="689.84" class="st20" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated EDK2 <tspan
+ x="11.39" dy="1em" class="st5">Redfish Collection Driver</tspan></text> </g>
+ <g id="shape98-229" v:mID="98" v:groupContext="shape" transform="translate(67.3474,-420.463)">
+ <title>Rounded Rectangle.98</title>
+ <desc>EDK2 HII UNI file #string STR_OPTION_A #language x-uefi-redfi...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.10739436619718):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="137.25" cy="672.838" width="274.5" height="85.5"/>
+ <path d="M7.73 715.59 L266.77 715.59 A7.73227 7.73227 -180 0 0 274.5 707.86 L274.5 637.82 A7.73227 7.73227 -180 0 0 266.77
+ 630.09 L7.73 630.09 A7.73227 7.73227 -180 0 0 -0 637.82 L0 707.86 A7.73227 7.73227 -180 0 0 7.73 715.59
+ Z" class="st46"/>
+ <text x="4" y="646.69" class="st47" v:langID="1033"><v:paragraph v:spBefore="6" v:bulletSize="0.166667"/><v:tabList/>EDK2 HII UNI file<v:lf/><tspan
+ x="4" dy="1.425em" class="st48">#</tspan><tspan class="st48">string </tspan><tspan class="st49">STR</tspan><tspan
+ class="st49">_</tspan><tspan class="st49">OPTION</tspan><tspan class="st49">_</tspan><tspan class="st49">A</tspan><tspan
+ class="st48"> </tspan><tspan class="st48">#</tspan><tspan class="st48">language </tspan><tspan
+ class="st49">x</tspan><tspan class="st49">-</tspan><tspan class="st49">uefi</tspan><tspan class="st49">-</tspan><tspan
+ class="st49">redfish</tspan><tspan class="st49">-</tspan><tspan class="st49">SCHEMA</tspan><tspan
+ class="st49">.</tspan><tspan class="st49">VERSION</tspan><tspan class="st48"> </tspan><tspan class="st49"> </tspan><tspan
+ x="4" dy="1.2em" class="st50">“</tspan><tspan class="st50">/</tspan><tspan class="st50">SCHEMA</tspan><tspan
+ class="st50">/</tspan><tspan class="st50">PropertyA</tspan><tspan class="st49">” </tspan><tspan
+ class="st48"> <v:newlineChar/><v:paragraph v:bulletSize="0.166667"/></tspan><tspan x="4" dy="1.2em"
+ class="st48">#</tspan><tspan class="st48">string</tspan><tspan class="st49"> </tspan><tspan class="st49">STR</tspan><tspan
+ class="st49">_</tspan><tspan class="st49">OPTION</tspan><tspan class="st49">_</tspan><tspan class="st49">B</tspan><tspan
+ class="st48"> </tspan><tspan class="st48">#</tspan><tspan class="st48">language</tspan><tspan class="st49"> </tspan><tspan
+ class="st49">x</tspan><tspan class="st49">-</tspan><tspan class="st49">uefi</tspan><tspan class="st49">-</tspan><tspan
+ class="st49">redfish</tspan><tspan class="st49">-</tspan><tspan class="st49">SCHEMA</tspan><tspan
+ class="st49">.</tspan><tspan class="st49">VERSION</tspan><tspan class="st48"> </tspan><tspan class="st50"> </tspan><tspan
+ x="4" dy="1.2em" class="st50">“</tspan><tspan class="st50">/</tspan><tspan class="st50">SCHEMA</tspan><tspan
+ class="st50">/</tspan><tspan class="st50">PropertyB</tspan><tspan class="st50">”<v:newlineChar/></tspan><tspan
+ x="4" dy="1.2em" class="st48">#</tspan><tspan class="st48">string </tspan><tspan class="st49">STR</tspan><tspan
+ class="st49">_</tspan><tspan class="st49">OPTION</tspan><tspan class="st49">_</tspan><tspan class="st48">C </tspan><tspan
+ class="st48">#</tspan><tspan class="st48">language</tspan><tspan class="st49"> </tspan><tspan class="st49">x</tspan><tspan
+ class="st49">-</tspan><tspan class="st49">uefi</tspan><tspan class="st49">-</tspan><tspan class="st49">redfish</tspan><tspan
+ class="st49">-</tspan><tspan class="st49">SCHEMA</tspan><tspan class="st49">.</tspan><tspan class="st49">VERSION</tspan><tspan
+ class="st48"> </tspan><tspan class="st50"> </tspan><tspan x="4" dy="1.312em" class="st50">“</tspan><tspan
+ class="st50">/</tspan><tspan class="st50">SCHEMA</tspan><tspan class="st50">/</tspan><tspan class="st50">PropertyC</tspan><tspan
+ class="st50">”</tspan><v:newlineChar/></text> </g>
+ <g id="shape100-316" v:mID="100" v:groupContext="shape" transform="translate(171.972,-550.963)">
+ <title>Rounded Rectangle.100</title>
+ <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="76.5" cy="688.025" width="153" height="55.125"/>
+ <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46
+ L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"
+ class="st51"/>
+ <text x="37.65" y="671.66" class="st52" v:langID="1033"><v:paragraph v:spLine="-0.8" v:horizAlign="1"/><v:tabList/>EDK2 HII VFR Form<v:lf/><v:lf/><tspan
+ x="24.37" dy="1.6em" class="st53">Option A Enabled<v:newlineChar/></tspan><tspan x="24.6" dy="0.8em"
+ class="st53">Option B Disabled<v:newlineChar/></tspan><tspan x="24.4" dy="0.8em" class="st53">Option C </tspan><tspan
+ class="st53">0</tspan><tspan class="st53">x</tspan><tspan class="st53">16</tspan></text> </g>
+ <g id="shape101-325" v:mID="101" v:groupContext="shape" transform="translate(147.222,-539.713)">
+ <title>Rounded Rectangle.101</title>
+ <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="76.5" cy="688.025" width="153" height="55.125"/>
+ <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46
+ L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"
+ class="st51"/>
+ <text x="37.65" y="671.66" class="st52" v:langID="1033"><v:paragraph v:spLine="-0.8" v:horizAlign="1"/><v:tabList/>EDK2 HII VFR Form<v:lf/><v:lf/><tspan
+ x="24.37" dy="1.6em" class="st53">Option A Enabled<v:newlineChar/></tspan><tspan x="24.6" dy="0.8em"
+ class="st53">Option B Disabled<v:newlineChar/></tspan><tspan x="24.4" dy="0.8em" class="st53">Option C </tspan><tspan
+ class="st53">0</tspan><tspan class="st53">x</tspan><tspan class="st53">16</tspan></text> </g>
+ <g id="shape102-334" v:mID="102" v:groupContext="shape" transform="translate(129.222,-526.213)">
+ <title>Rounded Rectangle</title>
+ <desc>EDK2 HII VFR Form Option A Enabled Option B Disabled Option C...</desc>
+ <v:userDefs>
+ <v:ud v:nameU="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockVert" v:prompt="" v:val="VT0(1):5"/>
+ <v:ud v:nameU="CornerLockDiag" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="TopLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="TopRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotLeftOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ <v:ud v:nameU="BotRightOffset" v:prompt="" v:val="VT0(0.0625):1"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:verticalAlign="0"/>
+ <v:textRect cx="76.5" cy="688.025" width="153" height="55.125"/>
+ <path d="M4.5 715.59 L148.5 715.59 A4.49993 4.49993 -180 0 0 153 711.09 L153 664.96 A4.49993 4.49993 -180 0 0 148.5 660.46
+ L4.5 660.46 A4.49993 4.49993 -180 0 0 0 664.96 L0 711.09 A4.49993 4.49993 -180 0 0 4.5 715.59 Z"
+ class="st51"/>
+ <text x="29.88" y="671.66" class="st29" v:langID="1033"><v:paragraph v:spLine="-0.8" v:horizAlign="1"/><v:tabList/>EDK2 HII VFR Form<v:lf/><v:lf/><tspan
+ x="24.37" dy="1.6em" class="st54">Option A </tspan><tspan class="st55">Enabled<v:newlineChar/></tspan><tspan
+ x="24.6" dy="0.8em" class="st54">Option B </tspan><tspan class="st55">Disabled<v:newlineChar/></tspan><tspan
+ x="24.4" dy="0.8em" class="st54">Option C </tspan><tspan class="st55">0</tspan><tspan
+ class="st55">x</tspan><tspan class="st55">16</tspan></text> </g>
+ <g id="shape110-345" v:mID="110" v:groupContext="shape" v:layerMember="0"
+ transform="translate(503.938,-444.613) rotate(13.0919)">
+ <title>Curve connect 1.110</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 715.59 A11.592 11.592 0 0 1 22.97 715.59 A13.4718 13.4718 -180 0 0 48.31 719.9 L48.42 719.56" class="st56"/>
+ </g>
+ <g id="shape122-351" v:mID="122" v:groupContext="shape" transform="translate(41.4724,-96.4625)">
+ <title>Sheet.122</title>
+ <desc>[1]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[1]</text> </g>
+ <g id="shape123-354" v:mID="123" v:groupContext="shape" transform="translate(746.847,-100.963)">
+ <title>Sheet.123</title>
+ <desc>[2]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[2]</text> </g>
+ <g id="shape124-357" v:mID="124" v:groupContext="shape" transform="translate(68.4724,-278.713)">
+ <title>Sheet.124</title>
+ <desc>[3]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[3]</text> </g>
+ <g id="shape125-360" v:mID="125" v:groupContext="shape" transform="translate(338.472,-269.713)">
+ <title>Sheet.125</title>
+ <desc>[4]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[4]</text> </g>
+ <g id="shape126-363" v:mID="126" v:groupContext="shape" transform="translate(761.472,-269.713)">
+ <title>Sheet.126</title>
+ <desc>[5]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[5]</text> </g>
+ <g id="shape127-366" v:mID="127" v:groupContext="shape" transform="translate(390.222,-476.713)">
+ <title>Sheet.127</title>
+ <desc>[6]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[6]</text> </g>
+ <g id="shape128-369" v:mID="128" v:groupContext="shape" transform="translate(123.597,-579.088)">
+ <title>Sheet.128</title>
+ <desc>[8]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[8]</text> </g>
+ <g id="shape129-372" v:mID="129" v:groupContext="shape" transform="translate(62.8474,-501.463)">
+ <title>Sheet.129</title>
+ <desc>[9]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[9]</text> </g>
+ <g id="shape132-375" v:mID="132" v:groupContext="shape" v:layerMember="0"
+ transform="translate(583.722,1233.46) rotate(180)">
+ <title>Curve connect 2.132</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M2.78 714.72 L3.12 714.61 A681.188 681.188 0 0 1 406.38 714.61 L406.72 714.72" class="st58"/>
+ </g>
+ <g id="shape133-384" v:mID="133" v:groupContext="shape" transform="translate(238.347,-157.213)">
+ <title>Sheet.133</title>
+ <desc>Script-generated EDK2 Redfish client driver/library based on ...</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="130.5" cy="702.088" width="261" height="27"/>
+ <rect x="0" y="688.588" width="261" height="27" class="st1"/>
+ <text x="11.21" y="699.84" class="st60" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated EDK2 Redfish client driver/library based on the <tspan
+ x="45.23" dy="1em" class="st5">standard Redfish schemas </tspan>published by DMTF</text> </g>
+ <g id="shape134-388" v:mID="134" v:groupContext="shape" transform="translate(21.2224,-679.775)">
+ <title>Rectangle.134</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="703.213" width="24.75" height="12.375" class="st2"/>
+ </g>
+ <g id="shape135-390" v:mID="135" v:groupContext="shape" transform="translate(41.4724,-670.213)">
+ <title>Sheet.135</title>
+ <desc>Script-generated code</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="12.79" y="704.34" class="st61" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>Script-generated code</text> </g>
+ <g id="shape137-393" v:mID="137" v:groupContext="shape" transform="translate(21.2224,-661.213)">
+ <title>Rectangle.137</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <rect x="0" y="703.213" width="24.75" height="12.375" class="st62"/>
+ </g>
+ <g id="shape138-395" v:mID="138" v:groupContext="shape" transform="translate(43.7224,-652.213)">
+ <title>Sheet.138</title>
+ <desc>UEFI/EDK2 open source</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="9.97" y="704.34" class="st61" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>UEFI/EDK2 open source</text> </g>
+ <g id="shape140-398" v:mID="140" v:groupContext="shape" transform="translate(281.66,-341.784)">
+ <title>Configure</title>
+ <v:userDefs>
+ <v:ud v:nameU="msvShapeCategories" v:prompt="" v:val="VT4(Icon)"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M41.27 698.83 C40.4 698.46 37.61 697.28 37.61 697.28 L37.79 694.96 L37.94 693.01 L37.69 689.29 L39.53 688.23
+ C39.53 688.23 40.46 687.84 41.33 687.49 C40.71 685.96 40.45 685.33 39.82 683.81 C38.94 684.17 36.06 685.35
+ 36.06 685.35 L34.63 683.57 C33.94 682.7 33.09 681.89 32.02 681.06 L30.33 679.75 L31.01 677.68 C31.01 677.68
+ 31.41 676.7 31.79 675.77 C30.27 675.14 29.64 674.88 28.12 674.26 C27.72 675.23 26.52 678.17 26.52 678.17
+ L24.28 677.95 C23.14 677.83 21.96 677.86 20.77 678.02 L18.64 678.3 L17.65 676.35 C17.65 676.35 17.21 675.31
+ 16.78 674.31 C15.27 674.95 14.64 675.21 13.13 675.85 C13.58 676.92 14.85 679.93 14.85 679.93 L13.12 681.37
+ C12.3 682.05 11.54 682.85 10.79 683.83 L9.49 685.52 L7.41 684.86 C7.41 684.86 6.28 684.4 5.17 683.96 C4.56
+ 685.49 4.31 686.12 3.69 687.65 C4.82 688.1 7.84 689.31 7.84 689.31 C7.84 689.31 7.65 692.73 7.63 693 C7.65
+ 693.25 7.7 694.01 7.7 694.03 C7.7 694.03 7.87 695.84 7.87 695.84 L6.79 696.82 C6.46 697.15 6.34 697.24 3.64
+ 698.3 C4.24 699.84 4.49 700.47 5.08 702.01 C6.21 701.57 9.36 700.34 9.36 700.34 L10.99 702.57 C11.49 703.19
+ 12.18 703.89 13.04 704.61 L14.63 705.96 L13.93 707.96 C13.93 707.96 13.45 709.08 12.97 710.2 C14.47 710.85
+ 15.1 711.12 16.61 711.77 C17.05 710.74 18.36 707.71 18.36 707.71 L20.65 708.03 C21.73 708.19 22.89 708.21
+ 24.1 708.1 L26.18 707.92 L27.11 709.84 C27.11 709.84 27.53 710.9 27.94 711.93 C29.47 711.32 30.1 711.07
+ 31.63 710.45 C31.25 709.51 30.04 706.48 30.04 706.48 L32.32 704.83 C32.97 704.31 33.71 703.56 34.48 702.62
+ L35.81 701 L37.85 701.7 C37.85 701.7 38.82 702.1 39.73 702.49 C40.37 700.97 40.64 700.34 41.27 698.83 ZM40.58
+ 695.32 C40.58 695.32 40.57 695.4 40.56 695.47 C40.95 695.64 44.96 697.33 44.96 697.33 L41.23 706.17 C41.23
+ 706.17 37.13 704.45 36.75 704.28 C36.7 704.34 36.65 704.41 36.65 704.41 C35.76 705.49 34.89 706.37 33.97
+ 707.11 C33.97 707.11 33.67 707.33 33.46 707.47 C33.62 707.88 35.28 712.02 35.28 712.02 L26.38 715.59 C26.38
+ 715.59 24.65 711.28 24.5 710.89 C24.42 710.9 24.34 710.9 24.34 710.9 C22.91 711.03 21.54 711 20.25 710.82
+ C20.25 710.82 20.17 710.8 20.09 710.79 C19.93 711.19 18.08 715.47 18.08 715.47 L9.27 711.66 C9.27 711.66
+ 11.18 707.25 11.34 706.86 C11.29 706.81 11.22 706.76 11.22 706.76 C10.23 705.92 9.41 705.09 8.72 704.23
+ C8.72 704.23 8.51 703.94 8.37 703.75 C7.96 703.9 3.49 705.65 3.49 705.65 L0 696.71 C0 696.71 4.8 694.83
+ 4.8 694.83 C4.8 694.83 4.88 694.8 4.95 694.78 C4.92 694.54 4.89 694.21 4.89 694.21 L4.82 693.02 C4.82 693.02
+ 4.9 691.52 4.92 691.17 C4.54 691.02 0.04 689.21 0.04 689.21 L3.6 680.3 C3.6 680.3 8.06 682.09 8.46 682.25
+ C8.51 682.18 8.56 682.12 8.56 682.12 C9.43 680.98 10.34 680.02 11.33 679.2 C11.33 679.2 11.39 679.15 11.45
+ 679.11 C11.29 678.72 9.45 674.35 9.45 674.35 L18.29 670.62 C18.29 670.62 20.07 674.85 20.24 675.25 C20.31
+ 675.24 20.39 675.23 20.39 675.23 C21.8 675.04 23.2 675.01 24.56 675.15 C24.56 675.15 24.63 675.16 24.71
+ 675.16 C24.87 674.78 26.59 670.59 26.59 670.59 L35.46 674.23 C35.46 674.23 33.77 678.34 33.61 678.74 C33.67
+ 678.78 33.74 678.83 33.74 678.83 C34.99 679.8 35.99 680.77 36.82 681.8 C36.82 681.8 36.88 681.88 36.94 681.95
+ C37.33 681.79 41.35 680.14 41.35 680.14 L45 689.02 C45 689.02 40.99 690.67 40.6 690.83 C40.61 690.9 40.62
+ 690.98 40.62 690.98 C40.71 691.76 40.75 692.41 40.75 693.01 C40.75 693.7 40.7 694.43 40.58 695.32 ZM26.56
+ 697.76 C29.16 695.67 29.58 691.87 27.5 689.26 C25.42 686.65 21.62 686.23 19.01 688.31 C16.41 690.4 15.98
+ 694.2 18.07 696.81 C20.15 699.42 23.95 699.84 26.56 697.76 ZM23.76 684.23 C26.11 684.49 28.22 685.65 29.7
+ 687.5 C32.75 691.32 32.12 696.9 28.31 699.95 C26.47 701.43 24.16 702.1 21.8 701.84 C19.45 701.58 17.34 700.41
+ 15.87 698.56 C14.57 696.94 13.93 694.98 13.93 693.04 C13.93 690.44 15.07 687.86 17.25 686.12 C19.1 684.64
+ 21.41 683.97 23.76 684.23 Z" class="st63"/>
+ </g>
+ <g id="shape145-400" v:mID="145" v:groupContext="shape" v:layerMember="0"
+ transform="translate(323.911,1069.28) scale(1,-1)">
+ <title>Side to top/bottom.145</title>
+ <v:userDefs>
+ <v:ud v:nameU="TextPos" v:val="VT0(0):5"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.18 715.59 L7.54 715.59 L96.69 715.59 L96.69 668.4" class="st64"/>
+ </g>
+ <g id="shape146-406" v:mID="146" v:groupContext="shape" v:layerMember="0" transform="translate(204.597,-382.144)">
+ <title>Bottom to top fixed 2</title>
+ <v:userDefs>
+ <v:ud v:nameU="TextPos" v:val="VT0(1):26"/>
+ <v:ud v:nameU="Offset" v:val="VT0(0.25):0"/>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 677.27 L0 697.59 L99.14 697.59 L99.14 708.05" class="st66"/>
+ </g>
+ <g id="shape150-412" v:mID="150" v:groupContext="shape" v:layerMember="0" transform="translate(281.66,1070.51) rotate(180)">
+ <title>Side to top/bottom</title>
+ <v:userDefs>
+ <v:ud v:nameU="TextPos" v:val="VT0(0):5"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M7.18 715.59 L7.54 715.59 L107.44 715.59 L107.44 669.64" class="st64"/>
+ </g>
+ <g id="shape152-417" v:mID="152" v:groupContext="shape" transform="translate(173.097,-359.713)">
+ <title>Sheet.152</title>
+ <desc>[10]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="22.5" cy="702.088" width="45" height="27"/>
+ <rect x="0" y="688.588" width="45" height="27" class="st6"/>
+ <text x="12.52" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[10]</text> </g>
+ <g id="shape153-420" v:mID="153" v:groupContext="shape" transform="translate(186.597,-359.713)">
+ <title>Sheet.153</title>
+ <desc>EDK2 Build Tool</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="54" cy="702.088" width="108" height="27"/>
+ <rect x="0" y="688.588" width="108" height="27" class="st6"/>
+ <text x="21.18" y="704.59" class="st22" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>EDK2 Build Tool</text> </g>
+ <g id="shape95-423" v:mID="95" v:groupContext="shape" v:layerMember="0"
+ transform="translate(479.651,-242.34) rotate(-1.84761)">
+ <title>Curve connect 2</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M1.08 713.99 L1.29 713.7 A41.432 41.432 0 0 1 68.5 713.7 L68.7 713.99" class="st67"/>
+ </g>
+ <g id="shape154-431" v:mID="154" v:groupContext="shape" transform="translate(546.597,-607.213)">
+ <title>Sheet.154</title>
+ <desc>[7]</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="12.375" cy="702.088" width="24.75" height="27"/>
+ <rect x="0" y="688.588" width="24.75" height="27" class="st6"/>
+ <text x="5.44" y="705.09" class="st7" v:langID="1033"><v:paragraph v:spLine="-1" v:horizAlign="1"/><v:tabList/>[7]</text> </g>
+ <g id="shape155-434" v:mID="155" v:groupContext="shape" v:layerMember="0"
+ transform="translate(919.083,249.319) rotate(-86.8202) scale(1,-1)">
+ <title>Curve connect 1.155</title>
+ <v:userDefs>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <path d="M0 715.59 A6.2366 6.2366 0 0 1 11.73 715.59 A4.54475 4.54475 -180 0 0 20.28 715.59" class="st68"/>
+ </g>
+ </g>
+</svg>
--
2.17.1


[staging/edk2-redfish-client PATCH v2 0/2] RedfishClientPkg

Abner Chang
 

In V2: Correct EFI_PLATFORM_CONFIG_TO_REDFISH_PROTOCOL to
EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL in readme and diagrams.

In V1:
This is the first commit of RedfishClientPkg. Readme and diagrams
are created to delineate EDK2 Redfish Client implementation.

Signed-off-by: Abner Chang <abner.chang@...>
Cc: Nickle Wang <nickle.wang@...>
Cc: Liming Gao <gaoliming@...>
Cc: Andrew Fish <afish@...>
Cc: Leif Lindholm <leif@...>
Cc: Michael D Kinney <michael.d.kinney@...>

Abner Chang (2):
RedfishClientPkg: Initial commit
edk2: Update Maintainers.txt

RedfishClientPkg/Readme.md | 185 +++
Maintainers.txt | 5 +
.../Media/RedfishClientDriverStack.svg | 1068 +++++++++++++++++
3 files changed, 1258 insertions(+)
create mode 100644 RedfishClientPkg/Readme.md
create mode 100644 RedfishClientPkg/Documents/Media/RedfishClientDriverStack.svg

--
2.17.1

14541 - 14560 of 92426