Hi Mike,
Please see my reply below inline. Thanks, Chasel > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Michael D > Kinney > Sent: Thursday, May 4, 2023 11:02 AM > To: Lin, Benny <benny....@intel.com>; devel@edk2.groups.io > Cc: Gao, Liming <gaolim...@byosoft.com.cn>; Liu, Zhiguang > <zhiguang....@intel.com>; Pedro Falcato <pedro.falc...@gmail.com>; Kinney, > Michael D <michael.d.kin...@intel.com> > Subject: Re: [edk2-devel] [PATCH v6 2/3] MdePkg: Support FDT library. > > Hi Benny, > > A couple comments below. > > Mike > > > -----Original Message----- > > From: Lin, Benny <benny....@intel.com> > > Sent: Wednesday, May 3, 2023 10:57 PM > > To: devel@edk2.groups.io > > Cc: Lin, Benny <benny....@intel.com>; Kinney, Michael D > > <michael.d.kin...@intel.com>; Gao, Liming <gaolim...@byosoft.com.cn>; > > Liu, Zhiguang <zhiguang....@intel.com>; Pedro Falcato > > <pedro.falc...@gmail.com> > > Subject: [PATCH v6 2/3] MdePkg: Support FDT library. > > > > From: Benny Lin <benny....@intel.com> > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4392 > > Add FDT support in EDK2 by submodule 3rd party libfdt > > (https://github.com/devicetree-org/pylibfdt/tree/main/libfdt) > > and refer to LibcLib implementation by Pedro. > > > > Cc: Michael D Kinney <michael.d.kin...@intel.com> > > Cc: Liming Gao <gaolim...@byosoft.com.cn> > > Cc: Zhiguang Liu <zhiguang....@intel.com> > > Acked-by: Pedro Falcato <pedro.falc...@gmail.com> > > Signed-off-by: Benny Lin <benny....@intel.com> > > --- > > MdePkg/Include/Library/FdtLib.h | 396 +++++++++++++++++++ > > MdePkg/Library/BaseFdtLib/BaseFdtLib.inf | 62 +++ > > MdePkg/Library/BaseFdtLib/BaseFdtLib.uni | 14 + > > MdePkg/Library/BaseFdtLib/FdtLib.c | 404 ++++++++++++++++++++ > > MdePkg/Library/BaseFdtLib/LibFdtSupport.h | 99 +++++ > > MdePkg/Library/BaseFdtLib/LibFdtWrapper.c | 173 +++++++++ > > 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 | 15 +- > > MdePkg/MdePkg.dec | 4 + > > MdePkg/MdePkg.dsc | 1 + > > 15 files changed, 1227 insertions(+), 1 deletion(-) > > > > diff --git a/MdePkg/Include/Library/FdtLib.h > > b/MdePkg/Include/Library/FdtLib.h new file mode 100644 index > > 0000000000..4b428eb5d1 > > --- /dev/null > > +++ b/MdePkg/Include/Library/FdtLib.h > > @@ -0,0 +1,396 @@ > > +/** @file > > > > + Flattened Device Tree Library. > > > > + > > > > + All structure data are in big-endian format. Need to call > > + SwapBytes** > > > > + function to convert between little-endia and big-endian. > > I would remove all references to SwapBytes in this lib class header and > Instead > mention that the FdtToCpu and CpuToFdt services are provided To support > conversion between big endian FDT format and the CPUs native endian format. We will replace SwapBytes*() in comments with CpuToFdt*()/Fdt*ToCpu() > > > > > + For example, pushing data to FDT blob need convert to big-endian > > + with > > SwapByte**. > > > > + For retrieving data from FDT blob need convert to little-endian > > + with > > SwapByte**. > > > > + Refer to FDT specification: > > + https://www.devicetree.org/specifications/ > > > > + > > > > + Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#ifndef FDT_LIB_H_ > > > > +#define FDT_LIB_H_ > > > > + > > > > +/** > > > > + Flattened Device Tree definition > > > > + > > > > + The Devicetree Blob (DTB) format is a binary encoding with big-endian. > > > > + When producing or consuming the blob data, must convert with > > SwapBytesXX > > > > + provided by edk2 BaseLib between big-endian and little-endian. > > > > +**/ > > > > +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; > > > > + > > > > +/** > > > > + Convert UINT16 data of the FDT blob to little-endian > > > > + > > > > + @param[in] Value The value to the blob data. > > > > + > > > > + @return The value to be converted to little-endian. > > > > + > > > > +**/ > > > > +UINT16 > > > > +EFIAPI > > > > +Fdt16ToCpu ( > > > > + IN UINT16 Value > > > > + ); > > > > + > > > > +/** > > > > + Convert UINT16 data to big-endian for aligned with the FDT blob > > > > + > > > > + @param[in] Value The value to align with the FDT blob. > > > > + > > > > + @return The value to be converted to big-endian. > > > > + > > > > +**/ > > > > +UINT16 > > > > +EFIAPI > > > > +CpuToFdt16 ( > > > > + IN UINT16 Value > > > > + ); > > > > + > > > > +/** > > > > + Convert UINT32 data of the FDT blob to little-endian > > > > + > > > > + @param[in] Value The value to the blob data. > > > > + > > > > + @return The value to be converted to little-endian. > > > > + > > > > +**/ > > > > +UINT32 > > > > +EFIAPI > > > > +Fdt32ToCpu ( > > > > + IN UINT32 Value > > > > + ); > > > > + > > > > +/** > > > > + Convert UINT32 data to big-endian for aligned with the FDT blob > > > > + > > > > + @param[in] Value The value to align with the FDT blob. > > > > + > > > > + @return The value to be converted to big-endian. > > > > + > > > > +**/ > > > > +UINT32 > > > > +EFIAPI > > > > +CpuToFdt32 ( > > > > + IN UINT32 Value > > > > + ); > > > > + > > > > +/** > > > > + Convert UINT64 data of the FDT blob to little-endian > > > > + > > > > + @param[in] Value The value to the blob data. > > > > + > > > > + @return The value to be converted to little-endian. > > > > + > > > > +**/ > > > > +UINT64 > > > > +EFIAPI > > > > +Fdt64ToCpu ( > > > > + IN UINT64 Value > > > > + ); > > > > + > > > > +/** > > > > + Convert UINT64 data to big-endian for aligned with the FDT blob > > > > + > > > > + @param[in] Value The value to align with the FDT blob. > > > > + > > > > + @return The value to be converted to big-endian. > > > > + > > > > +**/ > > > > +UINT64 > > > > +EFIAPI > > > > +CpuToFdt64 ( > > > > + IN UINT64 Value > > > > + ); > > > > + > > > > +/** > > > > + Verify the header of the Flattened Device Tree > > > > + > > > > + @param[in] Fdt The pointer to FDT blob. > > > > + > > > > + @return Zero for successfully, otherwise failed. > > > > + > > > > +**/ > > > > +INT32 > > > > +EFIAPI > > > > +FdtCheckHeader ( > > > > + IN CONST VOID *Fdt > > > > + ); > > > > + > > > > +/** > > > > + 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 > > > > + ); > > > > + > > > > +/** > > > > + 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 and > > 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 > > including the named property. > > > > + @param[in] PropertyValue The property value (big-endian) 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. Since > > + the > > data > > > > + come from FDT blob, it's encoding with big-endian. > > > > + > > > > +**/ > > > > +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] 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 > > > > + ); > > > > + > > > > +/** > > > > + 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 > > block 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 add > > 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 property in the given node. > > > > + > > > > + @param[in] Fdt The pointer to FDT blob. > > > > + @param[in] NodeOffset The offset to the node offset which want to add > > in. > > > > + @param[in] Name The name to name the property. > > > > + @param[in] Value The value (big-endian) 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/BaseFdtLib/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.<BR> > > > > +# > > > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > > > +# > > > > +# > > > > +## > > > > + > > > > +[Defines] > > > > + INF_VERSION = 0x0001001B > > > > + BASE_NAME = BaseFdtLib > > > > + MODULE_UNI_FILE = BaseFdtLib.uni > > > > + FILE_GUID = C64DCB01-B037-4FF6-9CF3-E8CEC206DE04 > > > > + MODULE_TYPE = BASE > > > > + VERSION_STRING = 1.0 > > > > + LIBRARY_CLASS = FdtLib > > > > + > > > > + DEFINE FDT_LIB_PATH = libfdt/libfdt > > > > + > > > > +# > > > > +# VALID_ARCHITECTURES = 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 = /wd4146 /wd4245 > > > > + MSFT:*_*_X64_CC_FLAGS = /wd4146 /wd4244 /wd4245 /wd4267 > > > > + > > > > diff --git a/MdePkg/Library/BaseFdtLib/BaseFdtLib.uni > > b/MdePkg/Library/BaseFdtLib/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.<BR> > > > > +// > > > > +// SPDX-License-Identifier: BSD-2-Clause-Patent > > > > +// > > > > +// **/ > > > > + > > > > + > > > > +#string STR_MODULE_ABSTRACT #language en-US "Instance of FDT > > Library" > > > > + > > > > +#string STR_MODULE_DESCRIPTION #language en-US "This module > > provides FDT Library implementation." > > > > + > > > > diff --git a/MdePkg/Library/BaseFdtLib/FdtLib.c > > b/MdePkg/Library/BaseFdtLib/FdtLib.c > > new file mode 100644 > > index 0000000000..090b0b3fd4 > > --- /dev/null > > +++ b/MdePkg/Library/BaseFdtLib/FdtLib.c > > @@ -0,0 +1,404 @@ > > +/** @file > > > > + Flattened Device Tree Library. > > > > + > > > > + Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <libfdt/libfdt/libfdt.h> > > > > + > > > > +/** > > > > + Convert UINT16 data of the FDT blob to little-endian > > > > + > > > > + @param[in] Value The value to the blob data. > > > > + > > > > + @return The value to be converted to little-endian. > > > > + > > > > +**/ > > > > +UINT16 > > > > +EFIAPI > > > > +Fdt16ToCpu ( > > > > + IN UINT16 Value > > > > + ) > > > > +{ > > > > + return fdt16_to_cpu (Value); > > > > +} > > > > + > > > > +/** > > > > + Convert UINT16 data to big-endian for aligned with the FDT blob > > > > + > > > > + @param[in] Value The value to align with the FDT blob. > > > > + > > > > + @return The value to be converted to big-endian. > > > > + > > > > +**/ > > > > +UINT16 > > > > +EFIAPI > > > > +CpuToFdt16 ( > > > > + IN UINT16 Value > > > > + ) > > > > +{ > > > > + return cpu_to_fdt16 (Value); > > I think the implementation of these APIs should just use the BaseLib > SwapBytesxx() APIs. Is there a reason this approach was selected? We would like to reuse original libfdt functions and this also can eliminate BaseLib.h inclusion from the file. > > > > > +} > > > > + > > > > +/** > > > > + Convert UINT32 data of the FDT blob to little-endian > > > > + > > > > + @param[in] Value The value to the blob data. > > > > + > > > > + @return The value to be converted to little-endian. > > > > + > > > > +**/ > > > > +UINT32 > > > > +EFIAPI > > > > +Fdt32ToCpu ( > > > > + IN UINT32 Value > > > > + ) > > > > +{ > > > > + return fdt32_to_cpu (Value); > > > > +} > > > > + > > > > +/** > > > > + Convert UINT32 data to big-endian for aligned with the FDT blob > > > > + > > > > + @param[in] Value The value to align with the FDT blob. > > > > + > > > > + @return The value to be converted to big-endian. > > > > + > > > > +**/ > > > > +UINT32 > > > > +EFIAPI > > > > +CpuToFdt32 ( > > > > + IN UINT32 Value > > > > + ) > > > > +{ > > > > + return cpu_to_fdt32 (Value); > > > > +} > > > > + > > > > +/** > > > > + Convert UINT64 data of the FDT blob to little-endian > > > > + > > > > + @param[in] Value The value to the blob data. > > > > + > > > > + @return The value to be converted to little-endian. > > > > + > > > > +**/ > > > > +UINT64 > > > > +EFIAPI > > > > +Fdt64ToCpu ( > > > > + IN UINT64 Value > > > > + ) > > > > +{ > > > > + return fdt64_to_cpu (Value); > > > > +} > > > > + > > > > +/** > > > > + Convert UINT64 data to big-endian for aligned with the FDT blob > > > > + > > > > + @param[in] Value The value to align with the FDT blob. > > > > + > > > > + @return The value to be converted to big-endian. > > > > + > > > > +**/ > > > > +UINT64 > > > > +EFIAPI > > > > +CpuToFdt64 ( > > > > + IN UINT64 Value > > > > + ) > > > > +{ > > > > + return cpu_to_fdt64 (Value); > > > > +} > > > > + > > > > +/** > > > > + Verify the header of the Flattened Device Tree > > > > + > > > > + @param[in] Fdt The pointer to FDT blob. > > > > + > > > > + @return Zero for successfully, otherwise failed. > > > > + > > > > +**/ > > > > +INT32 > > > > +EFIAPI > > > > +FdtCheckHeader ( > > > > + IN CONST VOID *Fdt > > > > + ) > > > > +{ > > > > + return fdt_check_header (Fdt); > > > > +} > > > > + > > > > +/** > > > > + 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 and > > 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 > > including the named property. > > > > + @param[in] PropertyValue The property value (big-endian) 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, > > PropertyValue, 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. Since > > + the > > data > > > > + come from FDT blob, it's encoding with big-endian. > > > > + > > > > +**/ > > > > +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 > > block 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 add > > 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 property in the given node. > > > > + > > > > + @param[in] Fdt The pointer to FDT blob. > > > > + @param[in] NodeOffset The offset to the node offset which want to add > > in. > > > > + @param[in] Name The name to name the property. > > > > + @param[in] Value The value (big-endian) 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/BaseFdtLib/LibFdtSupport.h > > new file mode 100644 > > index 0000000000..393019324b > > --- /dev/null > > +++ b/MdePkg/Library/BaseFdtLib/LibFdtSupport.h > > @@ -0,0 +1,99 @@ > > +/** @file > > > > + Root include file of C runtime library to support building the > > + third-party > > > > + libfdt library. > > > > + > > > > + Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#ifndef FDT_LIB_SUPPORT_H_ > > > > +#define FDT_LIB_SUPPORT_H_ > > > > + > > > > +#include <Base.h> > > > > +#include <Library/BaseLib.h> > > > > +#include <Library/BaseMemoryLib.h> > > > > + > > > > +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 == 1) > > > > +#define false (1 == 0) > > > > + > > > > +// > > > > +// Definitions for global constants used by libfdt library routines > > > > +// > > > > +#define INT_MAX 0x7FFFFFFF /* Maximum (signed) int value */ > > > > +#define INT32_MAX 0x7FFFFFFF /* Maximum (signed) int32 value */ > > > > +#define UINT32_MAX 0xFFFFFFFF /* Maximum unsigned int32 value */ > > > > + > > > > +// > > > > +// 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 > > DebugLib functions > > > > +// > > > > +#define memcpy(dest, source, count) CopyMem(dest,source, > > (UINTN)(count)) > > > > +#define memset(dest, ch, count) SetMem(dest, > > (UINTN)(count),(UINT8)(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, > > count)) > > > > +#define strncpy(strDest, strSource, count) AsciiStrnCpyS(strDest, > > MAX_STRING_SIZE, strSource, (UINTN)count) > > > > +#define strcat(strDest, strSource) AsciiStrCatS(strDest, > > MAX_STRING_SIZE, strSource) > > > > +#define strcmp(string1, string2, count) (int)(AsciiStrCmp(string1, > > string2)) > > > > +#define strncmp(string1, string2, count) (int)(AsciiStrnCmp(string1, > > string2, > > (UINTN)(count))) > > > > + > > > > +#endif /* FDT_LIB_SUPPORT_H_ */ > > > > diff --git a/MdePkg/Library/BaseFdtLib/LibFdtWrapper.c > > b/MdePkg/Library/BaseFdtLib/LibFdtWrapper.c > > new file mode 100644 > > index 0000000000..ef6452914f > > --- /dev/null > > +++ b/MdePkg/Library/BaseFdtLib/LibFdtWrapper.c > > @@ -0,0 +1,173 @@ > > +/** @file > > > > + ISO C implementations of strchr, strrchr and strtoul. > > > > + > > > > + Copyright (c) 2023, Intel Corporation. All rights reserved.<BR> > > > > + Copyright (c) 2023 Pedro Falcato All rights reserved. > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <Base.h> > > > > + > > > > +#define ULONG_MAX 0xFFFFFFFF /* Maximum unsigned long value */ > > > > + > > > > +// Very quick notes: > > > > +// We only go through the string once for both functions > > > > +// They are minimal implementations (not speed optimized) of ISO C > > semantics > > > > +// strchr and strrchr also include the null terminator as part of the > > +string > > > > +// so the code gets a bit clunky to handle that case specifically. > > > > + > > > > +char * > > > > +strchr ( > > > > + const char *Str, > > > > + int Char > > > > + ) > > > > +{ > > > > + char *S; > > > > + > > > > + S = (char *)Str; > > > > + > > > > + for ( ; ; S++) { > > > > + if (*S == Char) { > > > > + return S; > > > > + } > > > > + > > > > + if (*S == '\0') { > > > > + return NULL; > > > > + } > > > > + } > > > > +} > > > > + > > > > +char * > > > > +strrchr ( > > > > + const char *Str, > > > > + int Char > > > > + ) > > > > +{ > > > > + char *S, *last; > > > > + > > > > + S = (char *)Str; > > > > + last = NULL; > > > > + > > > > + for ( ; ; S++) { > > > > + if (*S == Char) { > > > > + last = S; > > > > + } > > > > + > > > > + if (*S == '\0') { > > > > + return last; > > > > + } > > > > + } > > > > +} > > > > + > > > > +STATIC > > > > +int > > > > +__isspace ( > > > > + int ch > > > > + ) > > > > +{ > > > > + // basic ASCII ctype.h:isspace(). Not efficient > > > > + return ch == '\r' || ch == '\n' || ch == ' ' || ch == '\t' || ch == > > + '\v' || ch == '\f'; > > > > +} > > > > + > > > > +unsigned long > > > > +strtoul ( > > > > + const char *Nptr, > > > > + char **EndPtr, > > > > + int Base > > > > + ) > > > > +{ > > > > + BOOLEAN Negate; > > > > + BOOLEAN Overflow; > > > > + unsigned long Val; > > > > + > > > > + Negate = FALSE; > > > > + Overflow = FALSE; > > > > + Val = 0; > > > > + > > > > + // Reject bad numeric bases > > > > + if ((Base < 0) || (Base == 1) || (Base > 36)) { > > > > + return 0; > > > > + } > > > > + > > > > + // Skip whitespace > > > > + while (__isspace (*Nptr)) { > > > > + Nptr++; > > > > + } > > > > + > > > > + // Check for + or - prefixes > > > > + if (*Nptr == '-') { > > > > + Negate = TRUE; > > > > + Nptr++; > > > > + } else if (*Nptr == '+') { > > > > + Nptr++; > > > > + } > > > > + > > > > + // Consume the start, autodetecting base if needed > > > > + if ((Nptr[0] == '0') && ((Nptr[1] == 'x') || (Nptr[1] == 'X')) && > > + ((Base == 0) || > > (Base == 16))) { > > > > + // Hex > > > > + Nptr += 2; > > > > + Base = 16; > > > > + } else if ((Nptr[0] == '0') && ((Nptr[1] == 'b') || (Nptr[1] == > > + 'B')) && ((Base == > > 0) || (Base == 2))) { > > > > + // Binary (standard pending C23) > > > > + Nptr += 2; > > > > + Base = 2; > > > > + } else if ((Nptr[0] == '0') && ((Base == 0) || (Base == 8))) { > > > > + // Octal > > > > + Nptr++; > > > > + Base = 8; > > > > + } else { > > > > + if (Base == 0) { > > > > + // Assume decimal > > > > + Base = 10; > > > > + } > > > > + } > > > > + > > > > + while (TRUE) { > > > > + int Digit; > > > > + char C; > > > > + unsigned long NewVal; > > > > + > > > > + C = *Nptr; > > > > + Digit = -1; > > > > + > > > > + if ((C >= '0') && (C <= '9')) { > > > > + Digit = C - '0'; > > > > + } else if ((C >= 'a') && (C <= 'z')) { > > > > + Digit = C - 'a' + 10; > > > > + } else if ((C >= 'A') && (C <= 'Z')) { > > > > + Digit = C - 'A' + 10; > > > > + } > > > > + > > > > + if ((Digit == -1) || (Digit >= Base)) { > > > > + // Note that this case also handles the \0 > > > > + if (EndPtr) { > > > > + *EndPtr = (char *)Nptr; > > > > + } > > > > + > > > > + break; > > > > + } > > > > + > > > > + NewVal = Val * Base + Digit; > > > > + > > > > + if (NewVal < Val) { > > > > + // Overflow > > > > + Overflow = TRUE; > > > > + } > > > > + > > > > + Val = NewVal; > > > > + > > > > + Nptr++; > > > > + } > > > > + > > > > + if (Negate) { > > > > + Val = -Val; > > > > + } > > > > + > > > > + if (Overflow) { > > > > + Val = ULONG_MAX; > > > > + } > > > > + > > > > + // TODO: We're lacking errno here. > > > > + return Val; > > > > +} > > > > 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.<BR> > > > > +SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <LibFdtSupport.h> > > > > + > > > > diff --git a/MdePkg/Library/BaseFdtLib/stdbool.h > > b/MdePkg/Library/BaseFdtLib/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.<BR> > > > > +SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <LibFdtSupport.h> > > > > + > > > > 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.<BR> > > > > +SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <LibFdtSupport.h> > > > > + > > > > 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.<BR> > > > > +SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <LibFdtSupport.h> > > > > + > > > > 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.<BR> > > > > +SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <LibFdtSupport.h> > > > > + > > > > 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.<BR> > > > > +SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <LibFdtSupport.h> > > > > + > > > > diff --git a/MdePkg/MdePkg.ci.yaml b/MdePkg/MdePkg.ci.yaml index > > 6ba85ebe61..035c34b3ad 100644 > > --- a/MdePkg/MdePkg.ci.yaml > > +++ b/MdePkg/MdePkg.ci.yaml > > @@ -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 > > for this > > package > > > > "IgnoreStandardPaths": [], # Standard Plugin defined paths that > > should > > be ignore > > > > "AdditionalIncludePaths": [] # Additional paths to spell > > check (wildcards > > 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 > > e70182bf7f..9804a7a6bd 100644 > > --- a/MdePkg/MdePkg.dec > > +++ b/MdePkg/MdePkg.dec > > @@ -289,6 +289,10 @@ > > # > > > > ArmTrngLib|Include/Library/ArmTrngLib.h > > > > > > > > + ## @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 > > 152c02991a..b38c863812 100644 > > --- a/MdePkg/MdePkg.dsc > > +++ b/MdePkg/MdePkg.dsc > > @@ -137,6 +137,7 @@ > > MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.inf > > > > > > > > MdePkg/Library/JedecJep106Lib/JedecJep106Lib.inf > > > > + MdePkg/Library/BaseFdtLib/BaseFdtLib.inf > > > > > > > > [Components.IA32, Components.X64, Components.ARM, > Components.AARCH64] > > > > # > > > > -- > > 2.39.1.windows.1 > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#104041): https://edk2.groups.io/g/devel/message/104041 Mute This Topic: https://groups.io/mt/98678643/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-