From nobody Mon May 20 23:49:52 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+102201+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102201+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1680196413; cv=none; d=zohomail.com; s=zohoarc; b=ZW7s2sCQtj/OHzHTnJJb1OCwqihNGN9foCWxqveDdQeZ8xk4DPDjbvUgTF/y4Z3C6PRZPEYozvB29TIe+Ffbpf8tvIMDJnnPkU5PpD+G1THhmer7R7Uu4kSP0vdjMAfMRPuNnBrS9bcynuxAqjGLnHN9GWp+agpRoNT4likeZ6k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1680196413; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=T7PcJozoead6cBP7/67lioNp0pAxtOpToFmTral5qBc=; b=eK/Kn5PqwyFOJWZFhewbyWZ/Pc+DPy33W+beEKostmqXT9l05r/6McHRXmP0LJCfCdkw1OMGUxQI8jw6OBILgNCecaYmGjaNY2fk2gQ+ZNr/TNjqEcVRoc2TPDCjk6rjyO5fUWum914ubI939kIGffgDfvM2yXmDGrNm5Z+mLE4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102201+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1680196413416764.9125252917473; Thu, 30 Mar 2023 10:13:33 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id jbF4YY1788612xeTY4SIJK6H; Thu, 30 Mar 2023 10:13:33 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web11.31053.1680195146314081910 for ; Thu, 30 Mar 2023 09:52:27 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="321614944" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="321614944" X-Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2023 09:52:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="795734899" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="795734899" X-Received: from bennyli1-mobl2.gar.corp.intel.com ([10.252.191.174]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2023 09:52:25 -0700 From: "Benny Lin" To: devel@edk2.groups.io Cc: Benny Lin , Michael D Kinney , Liming Gao , Zhiguang Liu Subject: [edk2-devel] [PATCH 1/2] MdePkg: Support FDT library. Date: Fri, 31 Mar 2023 00:52:04 +0800 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,benny.lin@intel.com X-Gm-Message-State: Cw5mcXcjY0aUFZ6H65z4IsZ0x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1680196413; bh=0DUB+oQBfWdlou/gwOXIxmG435bdopNFJ9Rr3Tu+Rgk=; h=Cc:Date:From:Reply-To:Subject:To; b=RslWjfTvMW21OZlIZiPedB6LoZXJjfB/VrG0b/0yQ2LAYIWgexnTBP+k5jWP2+gqN6A jcmrAB/N97FezzChO/8vdXKHTvJY2Oy76EI3jtetky6CDHycGhlkJ1IFiG/BHGwC+/xbM Y0tJEuc1kbWt/d4qE2aotJJMwZtr+yec3dQ= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1680196415677100004 Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4392 Add FDT support in EDK2 by submodule 3rd party libfdt (https://github.com/devicetree-org/pylibfdt/tree/main/libfdt) Cc: Michael D Kinney Cc: Liming Gao Cc: Zhiguang Liu Signed-off-by: Benny Lin --- .gitmodules | 3 + MdePkg/Include/Library/FdtLib.h | 300 ++++++++++++++++++++++ MdePkg/Library/BaseFdtLib/BaseFdtLib.inf | 62 +++++ MdePkg/Library/BaseFdtLib/BaseFdtLib.uni | 14 + MdePkg/Library/BaseFdtLib/FdtLib.c | 284 ++++++++++++++++++++ MdePkg/Library/BaseFdtLib/LibFdtSupport.h | 102 ++++++++ MdePkg/Library/BaseFdtLib/LibFdtWrapper.c | 138 ++++++++++ MdePkg/Library/BaseFdtLib/libfdt | 1 + MdePkg/Library/BaseFdtLib/limits.h | 10 + MdePkg/Library/BaseFdtLib/stdbool.h | 10 + MdePkg/Library/BaseFdtLib/stddef.h | 10 + MdePkg/Library/BaseFdtLib/stdint.h | 10 + MdePkg/Library/BaseFdtLib/stdlib.h | 10 + MdePkg/Library/BaseFdtLib/string.h | 10 + MdePkg/MdePkg.ci.yaml | 17 +- MdePkg/MdePkg.dec | 4 + MdePkg/MdePkg.dsc | 2 + ReadMe.rst | 1 + 18 files changed, 986 insertions(+), 2 deletions(-) create mode 100644 MdePkg/Include/Library/FdtLib.h create mode 100644 MdePkg/Library/BaseFdtLib/BaseFdtLib.inf create mode 100644 MdePkg/Library/BaseFdtLib/BaseFdtLib.uni create mode 100644 MdePkg/Library/BaseFdtLib/FdtLib.c create mode 100644 MdePkg/Library/BaseFdtLib/LibFdtSupport.h create mode 100644 MdePkg/Library/BaseFdtLib/LibFdtWrapper.c create mode 160000 MdePkg/Library/BaseFdtLib/libfdt create mode 100644 MdePkg/Library/BaseFdtLib/limits.h create mode 100644 MdePkg/Library/BaseFdtLib/stdbool.h create mode 100644 MdePkg/Library/BaseFdtLib/stddef.h create mode 100644 MdePkg/Library/BaseFdtLib/stdint.h create mode 100644 MdePkg/Library/BaseFdtLib/stdlib.h create mode 100644 MdePkg/Library/BaseFdtLib/string.h diff --git a/.gitmodules b/.gitmodules index 8011a88d9d..5da342e90c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "UnitTestFrameworkPkg/Library/GoogleTestLib/googletest"] path =3D UnitTestFrameworkPkg/Library/GoogleTestLib/googletest url =3D https://github.com/google/googletest.git +[submodule "MdePkg/Library/BaseFdtLib/libfdt"] + path =3D MdePkg/Library/BaseFdtLib/libfdt + url =3D https://github.com/devicetree-org/pylibfdt.git diff --git a/MdePkg/Include/Library/FdtLib.h b/MdePkg/Include/Library/FdtLi= b.h new file mode 100644 index 0000000000..bcb097b77e --- /dev/null +++ b/MdePkg/Include/Library/FdtLib.h @@ -0,0 +1,300 @@ +/** @file + Flattened Device Tree Library. + + Copyright (c) 2023, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FDT_LIB_H_ +#define FDT_LIB_H_ + +/// +/// Flattened Device Tree definition +/// +typedef struct { + UINT32 Magic; /* magic word FDT_MAGIC */ + UINT32 TotalSize; /* total size of DT block */ + UINT32 OffsetDtStruct; /* offset to structure */ + UINT32 OffsetDtStrings; /* offset to strings */ + UINT32 OffsetMemRsvmap; /* offset to memory reserve map */ + UINT32 Version; /* format version */ + UINT32 LastCompVersion; /* last compatible version */ + + /* version 2 fields below */ + UINT32 BootCpuidPhys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + UINT32 SizeDtStrings; /* size of the strings block */ + + /* version 17 fields below */ + UINT32 SizeDtStruct; /* size of the structure block */ +} FDT_HEADER; + +typedef struct { + UINT64 Address; + UINT64 Size; +} FDT_RESERVE_ENTRY; + +typedef struct { + UINT32 Tag; + CHAR8 Name[]; +} FDT_NODE_HEADER; + +typedef struct { + UINT32 Tag; + UINT32 Length; + UINT32 NameOffset; + CHAR8 Data[]; +} FDT_PROPERTY; + +#define FDT_GET_HEADER(Fdt, Field) FDT32_TO_CPU(((CONST FDT_HEADER *)(Fdt= ))->Field) + +#define FDT_MAGIC(Fdt) (FDT_GET_HEADER(Fdt, Magic)) +#define FDT_TOTAL_SIZE(Fdt) (FDT_GET_HEADER(Fdt, TotalSize)) +#define FDT_OFFSET_DT_STRUCT(Fdt) (FDT_GET_HEADER(Fdt, OffsetDtStruct)) +#define FDT_OFFSET_DT_STRINGS(Fdt) (FDT_GET_HEADER(Fdt, OffsetDtStrings)) +#define FDT_OFFSET_MEM_RSVMAP(Fdt) (FDT_GET_HEADER(Fdt, OffsetMemRsvmap)) +#define FDT_VERSION(Fdt) (FDT_GET_HEADER(Fdt, Version)) +#define FDT_LAST_COMP_VERSION(Fdt) (FDT_GET_HEADER(Fdt, LastCompVersion)) +#define FDT_BOOT_CPUID_PHYS(Fdt) (FDT_GET_HEADER(Fdt, BootCpuidPhys)) +#define FDT_SIZE_DT_STRINGS(Fdt) (FDT_GET_HEADER(Fdt, SizeDtStrings)) +#define FDT_SIZE_DT_STRUCT(Fdt) (FDT_GET_HEADER(Fdt, SizeDtStruct)) + +/** + Create a empty Flattened Device Tree. + + @param[in] Buffer The pointer to allocate a pool for FDT blob. + @param[in] BufferSize The BufferSize to the pool size. + + @return Zero for successfully, otherwise failed. + +**/ +RETURN_STATUS +EFIAPI +FdtCreateEmptyTree ( + IN VOID *Buffer, + IN UINTN BufferSize + ); + +/** + Returns a offset of next node from the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous node. + @param[in] Depth The depth to the level of tree hierarchy. + + @return The offset to next node offset. + +**/ +INT32 +EFIAPI +FdtNextNode ( + IN CONST VOID *Fdt, + IN INT32 Offset, + IN INT32 *Depth + ); + +/** + Returns a offset of first node under the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous node. + + @return The offset to next node offset. + +**/ +INT32 +EFIAPI +FdtFirstSubnode ( + IN CONST VOID *Fdt, + IN INT32 Offset + ); + +/** + Returns a offset of next node from the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous node. + + @return The offset to next node offset. + +**/ +INT32 +EFIAPI +FdtNextSubnode ( + IN CONST VOID *Fdt, + IN INT32 Offset + ); + +/** + Returns a offset of first node which includes the given name. + + @param[in] Fdt The pointer to FDT blob. + @param[in] ParentOffset The offset to the node which start find under. + @param[in] Name The name to search the node with the name. + @param[in] NameLength The length of the name to check only. + + @return The offset to node offset with given node name. + +**/ +INT32 +EFIAPI +FdtSubnodeOffsetNameLen ( + IN CONST VOID *Fdt, + IN INT32 ParentOffset, + IN CONST CHAR8 *Name, + IN INT32 NameLength + ); + +/** + Returns a offset of first node which includes the given property name an= d value. + + @param[in] Fdt The pointer to FDT blob. + @param[in] StartOffset The offset to the starting node to find. + @param[in] PropertyName The property name to search the node includin= g the named property. + @param[in] PropertyValue The property value to check the same property= value. + @param[in] PropertyLength The length of the value in PropertValue. + + @return The offset to node offset with given property. + +**/ +INT32 +EFIAPI +FdtNodeOffsetByPropValue ( + IN CONST VOID *Fdt, + IN INT32 StartOffset, + IN CONST CHAR8 *PropertyName, + IN CONST VOID *PropertyValue, + IN INT32 PropertyLength + ); + +/** + Returns a property with the given name from the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] NodeOffset The offset to the given node. + @param[in] Name The name to the property which need be searched + @param[in] Length The length to the size of the property found. + + @return The property to the structure of the found property. + +**/ +CONST FDT_PROPERTY * +EFIAPI +FdtGetProperty ( + IN CONST VOID *Fdt, + IN INT32 NodeOffset, + IN CONST CHAR8 *Name, + IN INT32 *Length + ); + +/** + Returns a offset of first property in the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to the node which need be searched. + + @return The offset to first property offset in the given node. + +**/ +INT32 +EFIAPI +FdtFirstPropertyOffset ( + IN CONST VOID *Fdt, + IN INT32 NodeOffset + ); + +/** + Returns a offset of next property from the given property. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous property. + + @return The offset to next property offset. + +**/ +INT32 +EFIAPI +FdtNextPropertyOffset ( + IN CONST VOID *Fdt, + IN INT32 Offset + ); + +/** + Returns a property from the given offset of the property. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to the given offset of the property. + @param[in] Length The length to the size of the property found. + + @return The property to the structure of the given property offset. + +**/ +CONST FDT_PROPERTY * +EFIAPI +FdtGetPropertyByOffset ( + IN CONST VOID *Fdt, + IN INT32 Offset, + IN INT32 *Length + ); + +/** + Returns a string by the given string offset. + + @param[in] Fdt The pointer to FDT blob. + @param[in] StrOffset The offset to the location in the strings bloc= k of FDT. + @param[in] Length The length to the size of string which need be= retrieved. + + @return The string to the given string offset. + +**/ +CONST CHAR8 * +EFIAPI +FdtGetString ( + IN CONST VOID *Fdt, + IN INT32 StrOffset, + IN INT32 *Length OPTIONAL + ); + +/** + Add a new node to the FDT. + + @param[in] Fdt The pointer to FDT blob. + @param[in] ParentOffset The offset to the node offset which want to ad= d in. + @param[in] Name The name to name the node. + + @return The offset to the new node. + +**/ +INT32 +EFIAPI +FdtAddSubnode ( + IN VOID *Fdt, + IN INT32 ParentOffset, + IN CONST CHAR8 *Name + ); + +/** + Add or modify a porperty in the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] NodeOffset The offset to the node offset which want to ad= d in. + @param[in] Name The name to name the property. + @param[in] Value The value to the property value. + @param[in] Length The length to the size of the property. + + @return Zero for successfully, otherwise failed. + +**/ +INT32 +EFIAPI +FdtSetProp ( + IN VOID *Fdt, + IN INT32 NodeOffset, + IN CONST CHAR8 *Name, + IN CONST VOID *Value, + IN UINT32 Length + ); + +#endif /* FDT_LIB_H_ */ diff --git a/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf b/MdePkg/Library/Base= FdtLib/BaseFdtLib.inf new file mode 100644 index 0000000000..730e568ff6 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf @@ -0,0 +1,62 @@ +## @file +# Flattened Device Tree Library. +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION =3D 0x0001001B + BASE_NAME =3D BaseFdtLib + MODULE_UNI_FILE =3D BaseFdtLib.uni + FILE_GUID =3D C64DCB01-B037-4FF6-9CF3-E8CEC206DE04 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D FdtLib + + DEFINE FDT_LIB_PATH =3D libfdt/libfdt + +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Sources] + FdtLib.c + LibFdtWrapper.c + # header Wrapper files + limits.h + stdbool.h + stddef.h + stdint.h + stdlib.h + string.h + + $(FDT_LIB_PATH)/fdt.c + $(FDT_LIB_PATH)/fdt.h + $(FDT_LIB_PATH)/fdt_addresses.c + $(FDT_LIB_PATH)/fdt_check.c + $(FDT_LIB_PATH)/fdt_empty_tree.c + $(FDT_LIB_PATH)/fdt_overlay.c + $(FDT_LIB_PATH)/fdt_ro.c + $(FDT_LIB_PATH)/fdt_rw.c + $(FDT_LIB_PATH)/fdt_strerror.c + $(FDT_LIB_PATH)/fdt_sw.c + $(FDT_LIB_PATH)/fdt_wip.c + $(FDT_LIB_PATH)/libfdt.h + $(FDT_LIB_PATH)/libfdt_env.h + $(FDT_LIB_PATH)/libfdt_internal.h + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + +[BuildOptions] + MSFT:*_*_IA32_CC_FLAGS =3D /wd4146 /wd4245 + MSFT:*_*_X64_CC_FLAGS =3D /wd4146 /wd4244 /wd4245 /wd4267 + diff --git a/MdePkg/Library/BaseFdtLib/BaseFdtLib.uni b/MdePkg/Library/Base= FdtLib/BaseFdtLib.uni new file mode 100644 index 0000000000..3f7e45ea6f --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/BaseFdtLib.uni @@ -0,0 +1,14 @@ +// /** @file +// Flattened Device Tree Library. +// +// Copyright (c) 2023, Intel Corporation. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "Instance of FDT L= ibrary" + +#string STR_MODULE_DESCRIPTION #language en-US "This module provi= des FDT Library implementation." + diff --git a/MdePkg/Library/BaseFdtLib/FdtLib.c b/MdePkg/Library/BaseFdtLib= /FdtLib.c new file mode 100644 index 0000000000..ba9a284e58 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/FdtLib.c @@ -0,0 +1,284 @@ +/** @file + Flattened Device Tree Library. + + Copyright (c) 2023, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +/** + Create a empty Flattened Device Tree. + + @param[in] Buffer The pointer to allocate a pool for FDT blob. + @param[in] BufferSize The BufferSize to the pool size. + + @return Zero for successfully, otherwise failed. + +**/ +INT32 +EFIAPI +FdtCreateEmptyTree ( + IN VOID *Buffer, + IN UINT32 BufferSize + ) +{ + return fdt_create_empty_tree (Buffer, (int)BufferSize); +} + +/** + Returns a offset of next node from the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous node. + @param[in] Depth The depth to the level of tree hierarchy. + + @return The offset to next node offset. + +**/ +INT32 +EFIAPI +FdtNextNode ( + IN CONST VOID *Fdt, + IN INT32 Offset, + IN INT32 *Depth + ) +{ + return fdt_next_node (Fdt, Offset, Depth); +} + +/** + Returns a offset of first node under the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous node. + + @return The offset to next node offset. + +**/ +INT32 +EFIAPI +FdtFirstSubnode ( + IN CONST VOID *Fdt, + IN INT32 Offset + ) +{ + return fdt_first_subnode (Fdt, Offset); +} + +/** + Returns a offset of next node from the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous node. + + @return The offset to next node offset. + +**/ +INT32 +EFIAPI +FdtNextSubnode ( + IN CONST VOID *Fdt, + IN INT32 Offset + ) +{ + return fdt_next_subnode (Fdt, Offset); +} + +/** + Returns a offset of first node which includes the given name. + + @param[in] Fdt The pointer to FDT blob. + @param[in] ParentOffset The offset to the node which start find under. + @param[in] Name The name to search the node with the name. + @param[in] NameLength The length of the name to check only. + + @return The offset to node offset with given node name. + +**/ +INT32 +EFIAPI +FdtSubnodeOffsetNameLen ( + IN CONST VOID *Fdt, + IN INT32 ParentOffset, + IN CONST CHAR8 *Name, + IN INT32 NameLength + ) +{ + return fdt_subnode_offset_namelen (Fdt, ParentOffset, Name, NameLength); +} + +/** + Returns a offset of first node which includes the given property name an= d value. + + @param[in] Fdt The pointer to FDT blob. + @param[in] StartOffset The offset to the starting node to find. + @param[in] PropertyName The property name to search the node includin= g the named property. + @param[in] PropertyValue The property value to check the same property= value. + @param[in] PropertyLength The length of the value in PropertValue. + + @return The offset to node offset with given property. + +**/ +INT32 +EFIAPI +FdtNodeOffsetByPropValue ( + IN CONST VOID *Fdt, + IN INT32 StartOffset, + IN CONST CHAR8 *PropertyName, + IN CONST VOID *PropertyValue, + IN INT32 PropertyLength + ) +{ + return fdt_node_offset_by_prop_value (Fdt, StartOffset, PropertyName, Pr= opertyValue, PropertyLength); +} + +/** + Returns a property with the given name from the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] NodeOffset The offset to the given node. + @param[in] Name The name to the property which need be searched + @param[in] Length The length to the size of the property found. + + @return The property to the structure of the found property. + +**/ +CONST struct fdt_property * +EFIAPI +FdtGetProperty ( + IN CONST VOID *Fdt, + IN INT32 NodeOffset, + IN CONST CHAR8 *Name, + IN INT32 *Length + ) +{ + return fdt_get_property (Fdt, NodeOffset, Name, Length); +} + +/** + Returns a offset of first property in the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] NodeOffset The offset to the node which need be searched. + + @return The offset to first property offset in the given node. + +**/ +INT32 +EFIAPI +FdtFirstPropertyOffset ( + IN CONST VOID *Fdt, + IN INT32 NodeOffset + ) +{ + return fdt_first_property_offset (Fdt, NodeOffset); +} + +/** + Returns a offset of next property from the given property. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to previous property. + + @return The offset to next property offset. + +**/ +INT32 +EFIAPI +FdtNextPropertyOffset ( + IN CONST VOID *Fdt, + IN INT32 Offset + ) +{ + return fdt_next_property_offset (Fdt, Offset); +} + +/** + Returns a property from the given offset of the property. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Offset The offset to the given offset of the property. + @param[in] Length The length to the size of the property found. + + @return The property to the structure of the given property offset. + +**/ +CONST struct fdt_property * +EFIAPI +FdtGetPropertyByOffset ( + IN CONST VOID *Fdt, + IN INT32 Offset, + IN INT32 *Length + ) +{ + return fdt_get_property_by_offset (Fdt, Offset, Length); +} + +/** + Returns a string by the given string offset. + + @param[in] Fdt The pointer to FDT blob. + @param[in] StrOffset The offset to the location in the strings bloc= k of FDT. + @param[in] Length The length to the size of string which need be= retrieved. + + @return The string to the given string offset. + +**/ +CONST CHAR8 * +EFIAPI +FdtGetString ( + IN CONST VOID *Fdt, + IN INT32 StrOffset, + IN INT32 *Length OPTIONAL + ) +{ + return fdt_get_string (Fdt, StrOffset, Length); +} + +/** + Add a new node to the FDT. + + @param[in] Fdt The pointer to FDT blob. + @param[in] ParentOffset The offset to the node offset which want to ad= d in. + @param[in] Name The name to name the node. + + @return The offset to the new node. + +**/ +INT32 +EFIAPI +FdtAddSubnode ( + IN VOID *Fdt, + IN INT32 ParentOffset, + IN CONST CHAR8 *Name + ) +{ + return fdt_add_subnode (Fdt, ParentOffset, Name); +} + +/** + Add or modify a porperty in the given node. + + @param[in] Fdt The pointer to FDT blob. + @param[in] NodeOffset The offset to the node offset which want to ad= d in. + @param[in] Name The name to name the property. + @param[in] Value The value to the property value. + @param[in] Length The length to the size of the property. + + @return Zero for successfully, otherwise failed. + +**/ +INT32 +EFIAPI +FdtSetProp ( + IN VOID *Fdt, + IN INT32 NodeOffset, + IN CONST CHAR8 *Name, + IN CONST VOID *Value, + IN UINT32 Length + ) +{ + return fdt_setprop (Fdt, NodeOffset, Name, Value, (int)Length); +} diff --git a/MdePkg/Library/BaseFdtLib/LibFdtSupport.h b/MdePkg/Library/Bas= eFdtLib/LibFdtSupport.h new file mode 100644 index 0000000000..58b0bb403e --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/LibFdtSupport.h @@ -0,0 +1,102 @@ +/** @file + Root include file of C runtime library to support building the third-par= ty + libfdt library. + + Copyright (c) 2023, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FDT_LIB_SUPPORT_H_ +#define FDT_LIB_SUPPORT_H_ + +#include +#include +#include + +typedef UINT8 uint8_t; +typedef UINT16 uint16_t; +typedef INT32 int32_t; +typedef UINT32 uint32_t; +typedef UINT64 uint64_t; +typedef UINTN uintptr_t; +typedef UINTN size_t; +typedef BOOLEAN bool; + +#define true (1 =3D=3D 1) +#define false (1 =3D=3D 0) + +// +// Definitions for global constants used by libfdt library routines +// +#ifndef INT_MAX +#define INT_MAX 0x7FFFFFFF /* Maximum (signed) int value */ +#endif +#define INT32_MAX 0x7FFFFFFF /* Maximum (signed) int32 value */ +#define UINT32_MAX 0xFFFFFFFF /* Maximum unsigned int32 value */ +#define MAX_STRING_SIZE 0x1000 + +// +// Function prototypes of libfdt Library routines +// +void * +memset ( + void *, + int, + size_t + ); + +int +memcmp ( + const void *, + const void *, + size_t + ); + +int +strcmp ( + const char *, + const char * + ); + +char * +strchr ( + const char *, + int + ); + +char * +strrchr ( + const char *, + int + ); + +unsigned long +strtoul ( + const char *, + char **, + int + ); + +char * +strcpy ( + char *strDest, + const char *strSource + ); + +// +// Macros that directly map functions to BaseLib, BaseMemoryLib, and Debug= Lib functions +// +#define memcpy(dest, source, count) CopyMem(dest,source, (UINTN)(c= ount)) +#define memset(dest, ch, count) SetMem(dest, (UINTN)(count),(U= INT8)(ch)) +#define memchr(buf, ch, count) ScanMem8(buf, (UINTN)(count),(= UINT8)ch) +#define memcmp(buf1, buf2, count) (int)(CompareMem(buf1, buf2, (= UINTN)(count))) +#define memmove(dest, source, count) CopyMem(dest, source, (UINTN)(= count)) +#define strlen(str) (size_t)(AsciiStrLen(str)) +#define strnlen(str, count) (size_t)(AsciiStrnLenS(str, co= unt)) +#define strncpy(strDest, strSource, count) AsciiStrnCpyS(strDest, MAX_STR= ING_SIZE, strSource, (UINTN)count) +#define strcat(strDest, strSource) AsciiStrCatS(strDest, MAX_STRI= NG_SIZE, strSource) +#define strcmp(string1, string2, count) (int)(AsciiStrCmp(string1, str= ing2)) +#define strncmp(string1, string2, count) (int)(AsciiStrnCmp(string1, st= ring2, (UINTN)(count))) + +#endif /* FDT_LIB_SUPPORT_H_ */ diff --git a/MdePkg/Library/BaseFdtLib/LibFdtWrapper.c b/MdePkg/Library/Bas= eFdtLib/LibFdtWrapper.c new file mode 100644 index 0000000000..3f1cc69dc6 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/LibFdtWrapper.c @@ -0,0 +1,138 @@ +/** @file + Root include file of C runtime library to support building the third-par= ty + libfdt library. + + Copyright (c) 2023, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LibFdtSupport.h" +#include + +/** + Returns the first occurrence of a Null-terminated ASCII character + in a Null-terminated ASCII string. + + This function scans the contents of the ASCII string specified by s + and returns the first occurrence of c. If c is not found in s, + then NULL is returned. If the length of c is zero, then s is returned. + + @param s The pointer to a Null-terminated ASCII string. + @param c The pointer to a Null-terminated ASCII character= to search for. + + @retval NULL If the c does not appear in s. + @retval others If there is a match return the first occurrence = of c. + If the length of c is zero,return s. + +**/ +char * +strchr ( + const char *s, + int c + ) +{ + char pattern[2]; + + pattern[0] =3D (CHAR8)c; + pattern[1] =3D 0; + return AsciiStrStr (s, pattern); +} + +/** + Returns the last occurrence of a Null-terminated ASCII character + in a Null-terminated ASCII string. + + This function scans the contents of the ASCII string specified by s + and returns the last occurrence of c. If c is not found in s, + then NULL is returned. If the length of c is zero, then s is returned. + + @param s The pointer to a Null-terminated ASCII string. + @param c The pointer to a Null-terminated ASCII character= to search for. + + @retval NULL If the c does not appear in s. + @retval others If there is a match return the last occurrence o= f c. + If the length of c is zero,return s. + +**/ +char * +strrchr ( + const char *s, + int c + ) +{ + char pattern[2]; + CONST CHAR8 *LastMatch; + CONST CHAR8 *StringTmp; + CONST CHAR8 *SearchString; + + pattern[0] =3D (CHAR8)c; + pattern[1] =3D 0; + SearchString =3D pattern; + + // + // Return NULL if both strings are less long than PcdMaximumAsciiStringL= ength + // + if ((AsciiStrSize (s) =3D=3D 0) || (AsciiStrSize (SearchString) =3D=3D 0= )) { + return NULL; + } + + if (*SearchString =3D=3D '\0') { + return (CHAR8 *)s; + } + + LastMatch =3D NULL; + do { + StringTmp =3D AsciiStrStr (s, SearchString); + + if (StringTmp =3D=3D NULL) { + break; + } + + LastMatch =3D StringTmp; + s =3D StringTmp + 1; + } while (s !=3D NULL); + + return (CHAR8 *)LastMatch; +} + +/** + Convert a Null-terminated Ascii decimal or hexadecimal string to a value= of type UINTN. + + This function outputs a value of type UINTN by interpreting the contents= of + the Ascii string specified by String as a decimal or hexadecimal number. + + @param nptr Pointer to a Null-terminated Ascii stri= ng. + @param endptr Pointer to character that stops scan. + @param base Pointer to decimal or hexadecimal. + + @retval MAX_UINTN If nptr is NULL. + If endptr is NULL. + If base is not 10 or 16. + @retval others Value is translated from String. + +**/ +unsigned long +strtoul ( + const char *nptr, + char **endptr, + int base + ) +{ + RETURN_STATUS Status; + UINTN ReturnValue; + + if (base =3D=3D 10) { + Status =3D AsciiStrDecimalToUintnS (nptr, endptr, &ReturnValue); + } else if (base =3D=3D 16) { + Status =3D AsciiStrHexToUintnS (nptr, endptr, &ReturnValue); + } else { + Status =3D RETURN_INVALID_PARAMETER; + } + + if (RETURN_ERROR (Status)) { + return MAX_UINTN; + } + + return (unsigned long)ReturnValue; +} diff --git a/MdePkg/Library/BaseFdtLib/libfdt b/MdePkg/Library/BaseFdtLib/l= ibfdt new file mode 160000 index 0000000000..cfff805481 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/libfdt @@ -0,0 +1 @@ +Subproject commit cfff805481bdea27f900c32698171286542b8d3c diff --git a/MdePkg/Library/BaseFdtLib/limits.h b/MdePkg/Library/BaseFdtLib= /limits.h new file mode 100644 index 0000000000..f6cf8d5702 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/limits.h @@ -0,0 +1,10 @@ +/** @file + Include file to support building the third-party libfdt library. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + diff --git a/MdePkg/Library/BaseFdtLib/stdbool.h b/MdePkg/Library/BaseFdtLi= b/stdbool.h new file mode 100644 index 0000000000..f6cf8d5702 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/stdbool.h @@ -0,0 +1,10 @@ +/** @file + Include file to support building the third-party libfdt library. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + diff --git a/MdePkg/Library/BaseFdtLib/stddef.h b/MdePkg/Library/BaseFdtLib= /stddef.h new file mode 100644 index 0000000000..f6cf8d5702 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/stddef.h @@ -0,0 +1,10 @@ +/** @file + Include file to support building the third-party libfdt library. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + diff --git a/MdePkg/Library/BaseFdtLib/stdint.h b/MdePkg/Library/BaseFdtLib= /stdint.h new file mode 100644 index 0000000000..f6cf8d5702 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/stdint.h @@ -0,0 +1,10 @@ +/** @file + Include file to support building the third-party libfdt library. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + diff --git a/MdePkg/Library/BaseFdtLib/stdlib.h b/MdePkg/Library/BaseFdtLib= /stdlib.h new file mode 100644 index 0000000000..f6cf8d5702 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/stdlib.h @@ -0,0 +1,10 @@ +/** @file + Include file to support building the third-party libfdt library. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + diff --git a/MdePkg/Library/BaseFdtLib/string.h b/MdePkg/Library/BaseFdtLib= /string.h new file mode 100644 index 0000000000..f6cf8d5702 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/string.h @@ -0,0 +1,10 @@ +/** @file + Include file to support building the third-party libfdt library. + +Copyright (c) 2023, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + diff --git a/MdePkg/MdePkg.ci.yaml b/MdePkg/MdePkg.ci.yaml index 6ba85ebe61..f039daccdb 100644 --- a/MdePkg/MdePkg.ci.yaml +++ b/MdePkg/MdePkg.ci.yaml @@ -2,7 +2,7 @@ # CI configuration for MdePkg # # Copyright (c) Microsoft Corporation -# Copyright (c) 2020, Intel Corporation. All rights reserved.
+# Copyright (c) 2023, Intel Corporation. All rights reserved.
# Copyright (c) 2021, Arm Limited. All rights reserved.
# Copyright (c) 2023, Loongson Technology Corporation Limited. All rights = reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent @@ -67,7 +67,8 @@ "Include/Library/PcdLib.h", "Include/Library/SafeIntLib.h", "Include/Protocol/DebugSupport.h", - "Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.c" + "Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.c", + "Library/BaseFdtLib" ] }, ## options defined ci/Plugin/CompilerPlugin @@ -164,5 +165,17 @@ "ExtendWords": [], # words to extend to the dictionary f= or this package "IgnoreStandardPaths": [], # Standard Plugin defined paths that = should be ignore "AdditionalIncludePaths": [] # Additional paths to spell check (wi= ldcards supported) + }, + # options defined in .pytool/Plugin/UncrustifyCheck + "UncrustifyCheck": { + "IgnoreFiles": [ + "Library/BaseFdtLib/libfdt", + "Library/BaseFdtLib/limits.h", + "Library/BaseFdtLib/stdbool.h", + "Library/BaseFdtLib/stddef.h", + "Library/BaseFdtLib/stdint.h", + "Library/BaseFdtLib/stdlib.h", + "Library/BaseFdtLib/string.h" + ] } } diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 5cf04bc0cb..3ce7f28b6e 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -285,6 +285,10 @@ # ArmTrngLib|Include/Library/ArmTrngLib.h =20 + ## @libraryclass Provides APIs for third-party library libfdt. + # + FdtLib|Include/Library/FdtLib.h + [LibraryClasses.IA32, LibraryClasses.X64, LibraryClasses.AARCH64] ## @libraryclass Provides services to generate random number. # diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 0ac7618b46..b262068b67 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -136,6 +136,8 @@ MdePkg/Library/CcProbeLibNull/CcProbeLibNull.inf MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.inf =20 + MdePkg/Library/BaseFdtLib/BaseFdtLib.inf + [Components.IA32, Components.X64, Components.ARM, Components.AARCH64] # # Add UEFI Target Based Unit Tests diff --git a/ReadMe.rst b/ReadMe.rst index 497d963559..00514c84ff 100644 --- a/ReadMe.rst +++ b/ReadMe.rst @@ -95,6 +95,7 @@ that are covered by additional licenses. - `UnitTestFrameworkPkg/Library/CmockaLib/cmocka `__ - `UnitTestFrameworkPkg/Library/GoogleTestLib/googletest `__ - `RedfishPkg/Library/JsonLib/jansson `__ +- `MdePkg/Library/BaseFdtLib/libfdt `__ =20 The EDK II Project is composed of packages. The maintainers for each packa= ge are listed in `Maintainers.txt `__. --=20 2.39.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#102201): https://edk2.groups.io/g/devel/message/102201 Mute This Topic: https://groups.io/mt/97955739/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Mon May 20 23:49:52 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+102202+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102202+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1680196413; cv=none; d=zohomail.com; s=zohoarc; b=UNBB6w2VF2sIL+NyrxTWzwgN8CxNCHISDMfjiEES0s05k1e+Zf4bZPbTur/ADHAiGZbuzx60Xn1mqcjn2GIHmynTiLJjL/+irI9yVqdSZL49RWzBlq4rbSFaDznBFdU6XpyMwFfCCrzesoRFjBZMSL1UFhDZwiOzBqYurSS7zhE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1680196413; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=uTX9FwJjbeiB9tjlGm4s7jCqOHG8W56eIbvYVVV3n/U=; b=ma4kf44puJkTxpVOY+t7GYA+wR708CrzcyTsbb3apqF8PIZXhR7ruGGhpv5aZmnJx0v4bx9QWa4zjraSxYmmMtAGGRzpOxV8GJAiWg5w/s5HQjkia9XxXekuVzlX2xCJJ4z56kNLJXqgKwd2698jhKlwveVfXCXuvmSNcz/0BGk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102202+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1680196413925870.4065380733392; Thu, 30 Mar 2023 10:13:33 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id qZjsYY1788612xDAgcOwncbj; Thu, 30 Mar 2023 10:13:33 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web11.31053.1680195146314081910 for ; Thu, 30 Mar 2023 09:52:28 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="321614963" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="321614963" X-Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2023 09:52:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="795734916" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="795734916" X-Received: from bennyli1-mobl2.gar.corp.intel.com ([10.252.191.174]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2023 09:52:27 -0700 From: "Benny Lin" To: devel@edk2.groups.io Cc: Benny Lin , Sean Brogan , Michael Kubacki , Michael D Kinney , Liming Gao Subject: [edk2-devel] [PATCH 2/2] .pytool: Support FDT library. Date: Fri, 31 Mar 2023 00:52:05 +0800 Message-Id: <7464291cf804e0797fdf1c3f039909f961320a4a.1680186454.git.benny.lin@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,benny.lin@intel.com X-Gm-Message-State: q8aAVydRYDYX9ktkI6miNgiHx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1680196413; bh=jXZdLJjeJLYSL+KDKsPuW2apZYoNtWkv6LmbdLvNf1E=; h=Cc:Date:From:Reply-To:Subject:To; b=ZAAMd0YZuce381E9Qh4I/PD7K2aqV2DZb1FmjXc8xRTJVJz945LgRtg0283g5rZbkYI DE1Sc+urFORrBwFN07m8o9daevFKPG+1jcJDVd1k87TLSorx7Rr01hxMAClCObZKB9WIr Ojk9QVWK76Otr3RUmkxDnqRSO10j8CafbRM= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1680196415612100002 Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4392 Add FDT support in EDK2 by submodule 3rd party libfdt (https://github.com/devicetree-org/pylibfdt/tree/main/libfdt) Add RequiredSubmodule object for CI setting. Cc: Sean Brogan Cc: Michael Kubacki Cc: Michael D Kinney Cc: Liming Gao Signed-off-by: Benny Lin --- .pytool/CISettings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pytool/CISettings.py b/.pytool/CISettings.py index d87c8e838e..126c9f0164 100644 --- a/.pytool/CISettings.py +++ b/.pytool/CISettings.py @@ -193,6 +193,8 @@ class Settings(CiBuildSettingsManager, UpdateSettingsMa= nager, SetupSettingsManag "BaseTools/Source/C/BrotliCompress/brotli", False)) rs.append(RequiredSubmodule( "RedfishPkg/Library/JsonLib/jansson", False)) + rs.append(RequiredSubmodule( + "MdePkg/Library/BaseFdtLib/libfdt", False)) return rs =20 def GetName(self): --=20 2.39.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#102202): https://edk2.groups.io/g/devel/message/102202 Mute This Topic: https://groups.io/mt/97955740/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-