I don't think the macros that are identical to BaseLib functions help. My preference if for caller of FdtLib to know use SwapBytesxx() as needed.
Mike > -----Original Message----- > From: Chiu, Chasel <chasel.c...@intel.com> > Sent: Tuesday, May 2, 2023 7:35 PM > To: devel@edk2.groups.io; quic_llind...@quicinc.com; Kinney, Michael D > <michael.d.kin...@intel.com> > Cc: Lin, Benny <benny....@intel.com>; Gao, Liming > <gaolim...@byosoft.com.cn>; Liu, Zhiguang <zhiguang....@intel.com>; > Pedro Falcato <pedro.falc...@gmail.com> > Subject: RE: [edk2-devel] [PATCH v3 2/3] MdePkg: Support FDT library. > > > Thanks Leif! > To align with your suggestion I think we can define below MACROs in > FdtLib.h. > Library consumers can use those MACROs to convert structure data between > Big endian and Little endian. (better readability) > > Mike, what do you think? > > Thanks, > Chasel > > > > // > // Definitions for transferring FDT structure data between big-endian (FDT) > and little-endian (CPU) > // > #define CPU_TO_FDT16(x) SwapBytes16 (x) > #define FDT16_TO_CPU(x) SwapBytes16 (x) > > #define CPU_TO_FDT32(x) SwapBytes32 (x) > #define FDT32_TO_CPU(x) SwapBytes32 (x) > > #define CPU_TO_FDT64(x) SwapBytes64 (x) > #define FDT64_TO_CPU(x) SwapBytes64 (x) > > > > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Leif > > Lindholm > > Sent: Tuesday, May 2, 2023 4:42 AM > > To: devel@edk2.groups.io; Chiu, Chasel <chasel.c...@intel.com>; Kinney, > > Michael D <michael.d.kin...@intel.com> > > Cc: Lin, Benny <benny....@intel.com>; Gao, Liming > > <gaolim...@byosoft.com.cn>; Liu, Zhiguang <zhiguang....@intel.com>; > Pedro > > Falcato <pedro.falc...@gmail.com> > > Subject: Re: [edk2-devel] [PATCH v3 2/3] MdePkg: Support FDT library. > > > > Hi Chasel, > > > > Apologies, spent last week at Linaro Connect with little time to follow > > the list. > > > > If we're seeing this purely as a wrapper on libfdt, then it shouldn't > > need to provide additional functionality on top of what it provides. > > My initial impression was that this library was attempting to do more, > > but then I mostly skimmed it, and that appears to have been incorrect. > > > > What I *really* don't want is mixing abstractions. I.e. if we're getting > > the pointers through libfdt calls, we should be using the libfdt > > accessor functions to extract the data correctly. And expose the > > cpu_to_fdt*/fdt*_to_cpu accessors through the library. Presumably as > > Fdt*ToCpu/CpuToFdt*. > > > > Regards, > > > > Leif > > > > > > On 2023-05-01 17:31, Chiu, Chasel wrote: > > > > > > Hi Leif, > > > > > > Would you please share your ideas and respond Mike's question too? > > > > > > Thanks, > > > Chasel > > > > > > > > > > > >> -----Original Message----- > > >> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Chiu, > > Chasel > > >> Sent: Tuesday, April 25, 2023 10:22 PM > > >> To: devel@edk2.groups.io; Kinney, Michael D > <michael.d.kin...@intel.com>; > > >> Leif Lindholm <quic_llind...@quicinc.com> > > >> Cc: Lin, Benny <benny....@intel.com>; Leif Lindholm > > >> <llind...@qti.qualcomm.com>; Gao, Liming > <gaolim...@byosoft.com.cn>; > > Liu, > > >> Zhiguang <zhiguang....@intel.com>; Pedro Falcato > > <pedro.falc...@gmail.com> > > >> Subject: Re: [edk2-devel] [PATCH v3 2/3] MdePkg: Support FDT library. > > >> > > >> > > >> Hello, > > >> > > >> Since platform may also define other FDT structures, this EDK2 library > may > > not > > >> be able to convert all the FDT structures to little endian. > > >> We might define a generic MACRO in library like > > >> CONVERT_FDT_DATA_TO_LITTLE_ENDIAN which can be used for all > > structure > > >> data, but it will be almost like calling SwapBytes** directly. > > >> Any other suggestion? > > >> > > >> Thanks, > > >> Chasel > > >> > > >> > > >>> -----Original Message----- > > >>> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Michael > > D > > >>> Kinney > > >>> Sent: Monday, April 24, 2023 10:41 AM > > >>> To: Leif Lindholm <quic_llind...@quicinc.com>; devel@edk2.groups.io > > >>> Cc: Lin, Benny <benny....@intel.com>; Leif Lindholm > > >>> <llind...@qti.qualcomm.com>; 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 v3 2/3] MdePkg: Support FDT library. > > >>> > > >>> Hi Leif, > > >>> > > >>> Do you have a proposal or small example on what you want to see > > >>> in the library? > > >>> > > >>> Mike > > >>> > > >>>> -----Original Message----- > > >>>> From: Leif Lindholm <quic_llind...@quicinc.com> > > >>>> Sent: Monday, April 24, 2023 10:29 AM > > >>>> To: devel@edk2.groups.io; Kinney, Michael D > > <michael.d.kin...@intel.com> > > >>>> Cc: Lin, Benny <benny....@intel.com>; Leif Lindholm > > >>> <llind...@qti.qualcomm.com>; Gao, Liming > <gaolim...@byosoft.com.cn>; > > >> Liu, > > >>>> Zhiguang <zhiguang....@intel.com>; Pedro Falcato > > >>> <pedro.falc...@gmail.com> > > >>>> Subject: Re: [edk2-devel] [PATCH v3 2/3] MdePkg: Support FDT > library. > > >>>> > > >>>> Apologies, I was refactoring a git tree and switched off the world :) > > >>>> > > >>>> Well, being a bit late to the party ... my view is it would be > > >>>> preferable if we put the byteswapping in the library. > > >>>> > > >>>> The DT format is *defined* to be big-endian, 32-bit cells. So frankly, > > >>>> I have no problems with pushing responsibility onto individual > > >>>> platforms if they have decided to be "clever" by ignoring that - > > >>>> if that gets rid of a bunch of boilerplate for sensibly behaving > platforms. > > >>>> > > >>>> Maybe another excuse for getting > > >>>> https://github.com/tianocore/edk2- > > >>> platforms/blob/master/Silicon/NXP/Library/IoAccessLib/IoAccessLib.c > > >>>> into MdePkg? > > >>>> > > >>>> / > > >>>> Leif > > >>>> > > >>>> On Thu, Apr 20, 2023 at 16:44:03 +0000, Michael D Kinney wrote: > > >>>>> Hi Leif, > > >>>>> > > >>>>> What is your opinion on FDT being big endian. > > >>>>> > > >>>>> Do we want the lib to help with that aspect, or leave it up to the > > consumer > > >> of > > >>> the lib to > > >>>>> convert as needed? Seems like an area that could be very error > prone if > > we > > >>> are not > > >>>>> careful. > > >>>>> > > >>>>> Mike > > >>>>> > > >>>>>> -----Original Message----- > > >>>>>> From: Lin, Benny <benny....@intel.com> > > >>>>>> Sent: Wednesday, April 19, 2023 9:25 PM > > >>>>>> To: Kinney, Michael D <michael.d.kin...@intel.com>; > > >>> devel@edk2.groups.io > > >>>>>> Cc: Gao, Liming <gaolim...@byosoft.com.cn>; Liu, Zhiguang > > >>> <zhiguang....@intel.com>; Pedro Falcato <pedro.falc...@gmail.com> > > >>>>>> Subject: RE: [PATCH v3 2/3] MdePkg: Support FDT library. > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>>>> -----Original Message----- > > >>>>>>> From: Kinney, Michael D <michael.d.kin...@intel.com> > > >>>>>>> Sent: Thursday, April 20, 2023 5:04 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: [PATCH v3 2/3] MdePkg: Support FDT library. > > >>>>>>> > > >>>>>>> Responses below > > >>>>>>> > > >>>>>>> Mike > > >>>>>>> > > >>>>>>>> -----Original Message----- > > >>>>>>>> From: Lin, Benny <benny....@intel.com> > > >>>>>>>> Sent: Wednesday, April 19, 2023 10:12 AM > > >>>>>>>> To: Kinney, Michael D <michael.d.kin...@intel.com>; > > >>>>>>>> devel@edk2.groups.io > > >>>>>>>> Cc: Gao, Liming <gaolim...@byosoft.com.cn>; Liu, Zhiguang > > >>>>>>>> <zhiguang....@intel.com>; Pedro Falcato > > >> <pedro.falc...@gmail.com> > > >>>>>>>> Subject: RE: [PATCH v3 2/3] MdePkg: Support FDT library. > > >>>>>>>> > > >>>>>>>> Please find my feedback below. > > >>>>>>>> We can remove FDT_RESERVE_ENTRY but keep > FDT_NODE_HEADER, > > >>> what do you think? > > >>>>>>>> > > >>>>>>>> QQQ > > >>>>>>>> Benny > > >>>>>>>> > > >>>>>>>>> -----Original Message----- > > >>>>>>>>> From: Kinney, Michael D <michael.d.kin...@intel.com> > > >>>>>>>>> Sent: Wednesday, April 19, 2023 11:54 PM > > >>>>>>>>> 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: [PATCH v3 2/3] MdePkg: Support FDT library. > > >>>>>>>>> > > >>>>>>>>> A few comments below. > > >>>>>>>>> > > >>>>>>>>> Mike > > >>>>>>>>> > > >>>>>>>>>> -----Original Message----- > > >>>>>>>>>> From: Lin, Benny <benny....@intel.com> > > >>>>>>>>>> Sent: Sunday, April 16, 2023 10:35 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 v3 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 | 314 > > >>> ++++++++++++++++++++ > > >>>>>>>>>> MdePkg/Library/BaseFdtLib/BaseFdtLib.inf | 62 ++++ > > >>>>>>>>>> MdePkg/Library/BaseFdtLib/BaseFdtLib.uni | 14 + > > >>>>>>>>>> MdePkg/Library/BaseFdtLib/FdtLib.c | 301 > > >>> +++++++++++++++++++ > > >>>>>>>>>> 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 | 17 +- > > >>>>>>>>>> MdePkg/MdePkg.dec | 4 + > > >>>>>>>>>> MdePkg/MdePkg.dsc | 1 + > > >>>>>>>>>> 15 files changed, 1043 insertions(+), 2 deletions(-) > > >>>>>>>>>> > > >>>>>>>>>> diff --git a/MdePkg/Include/Library/FdtLib.h > > >>>>>>>>>> b/MdePkg/Include/Library/FdtLib.h new file mode 100644 > index > > >>>>>>>>>> 0000000000..d59b749c25 > > >>>>>>>>>> --- /dev/null > > >>>>>>>>>> +++ b/MdePkg/Include/Library/FdtLib.h > > >>>>>>>>>> @@ -0,0 +1,314 @@ > > >>>>>>>>>> +/** @file > > >>>>>>>>>> > > >>>>>>>>>> + Flattened Device Tree Library. > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> + 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 > > >>>>>>>>>> > > >>>>>>>>>> +/// > > >>>>>>>>>> > > >>>>>>>>>> +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; > > >>>>>>>>> > > >>>>>>>>> I see the macros below use SwapBytes32() on all the fields from > this > > >>>>>>>>> structure. Does this mean this structure is big >endian? If > > >>>>>>>> that is the case, then the description of this structure and all > > >>>>>>>> individual fields must make that very clear >so any consumer of > the > > >>>>>>>> structure knows it does not follow the default endianness of > UEFI/PI > > >>> and that consumers >must either use the macros or > > >>>> consumers > > >>>>>> must use SwapBytes32() on their own when using this structure > directly. > > >>>>>>>> > > >>>>>>>> Yes, it's big endian. I will complete more descriptions in patch > v4. > > >>>>>>> > > >>>>>>> Would it be simpler if we have a lib service that converts the > entire > > >> header > > >>> from big endian to little endian. > > >>>>>>> That way, the consumer can use the FDT_HEADER directly > without any > > >> of > > >>> the macros? > > >>>>>>> > > >>>>>>> Also, is the rest of the FDT blob also big endian? > > >>>>>> > > >>>>>> FDT blob format is binary encoding of FDT data with big endian. In > > >> addition, > > >>> the consumer will set or get FDT data with FDT > > >>>> blob. We > > >>>>>> can complete more descriptions to warn consumers to be careful if > just > > >> use > > >>> header struct for mapping and get/set FDT data > > >>>> with FDT > > >>>>>> blob. > > >>>>>> > > >>>>>> For provide lib services that converts between big endian and little > > endian, > > >>> we can provide a get header function to convert > > >>>> between > > >>>>>> big endian and little endian. However, we also need to consider > the > > >>> property value for setting and getting then we can > > >>>> convert in > > >>>>>> wrapper functions. > > >>>>>> > > >>>>>> For example, > > >>>>>> > > >>>>>> 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); > > >>>>>> } > > >>>>>> > > >>>>>> More functions for various byte width. > > >>>>>> INT32 > > >>>>>> EFIAPI > > >>>>>> FdtSetProp16 ( > > >>>>>> IN VOID *Fdt, > > >>>>>> IN INT32 NodeOffset, > > >>>>>> IN CONST CHAR8 *Name, > > >>>>>> IN CONST UINT16 *Value, > > >>>>>> IN UINT32 Length > > >>>>>> ) > > >>>>>> { > > >>>>>> return fdt_setprop (Fdt, NodeOffset, Name, SwapBytes16(Value), > > >>> (int)Length); > > >>>>>> } > > >>>>>> > > >>>>>> INT32 > > >>>>>> EFIAPI > > >>>>>> FdtSetProp32 ( > > >>>>>> IN VOID *Fdt, > > >>>>>> IN INT32 NodeOffset, > > >>>>>> IN CONST CHAR8 *Name, > > >>>>>> IN CONST UINT32 *Value, > > >>>>>> IN UINT32 Length > > >>>>>> ) > > >>>>>> { > > >>>>>> return fdt_setprop (Fdt, NodeOffset, Name, SwapBytes32(Value), > > >>> (int)Length); > > >>>>>> } > > >>>>>> > > >>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +typedef struct { > > >>>>>>>>>> > > >>>>>>>>>> + UINT64 Address; > > >>>>>>>>>> > > >>>>>>>>>> + UINT64 Size; > > >>>>>>>>>> > > >>>>>>>>>> +} FDT_RESERVE_ENTRY; > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> I do not see this type used anywhere in the lib class or the lib > > instance. > > >>>>>>>>> Can it be removed? > > >>>>>>>> > > >>>>>>>> I think we can remove it because it might be not used for further > > >> usage > > >>> of FDT support. > > >>>>>>>> > > >>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +typedef struct { > > >>>>>>>>>> > > >>>>>>>>>> + UINT32 Tag; > > >>>>>>>>>> > > >>>>>>>>>> + CHAR8 Name[]; > > >>>>>>>>>> > > >>>>>>>>>> +} FDT_NODE_HEADER; > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> I do not see this type used anywhere in the lib class or the lib > > instance. > > >>>>>>>>> Can it be removed? > > >>>>>>>> > > >>>>>>>> When we need retrieve a node from a FDT blob, we will get a > node > > >>>>>>>> offset then we could use the struct to map the node content. It's > very > > >>> useful. > > >>>>>>> > > >>>>>>> Please add a comment header for this structure and describe the > usage > > >> as > > >>> it related to the rest of the FdtLib >services. > > >>>>>> > > >>>>>> I will add descriptions for the usage and remove > FDT_RESERVE_ENTRY in > > >>> patch v4. > > >>>>>> > > >>>>>>> > > >>>>>>>> > > >>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +typedef struct { > > >>>>>>>>>> > > >>>>>>>>>> + UINT32 Tag; > > >>>>>>>>>> > > >>>>>>>>>> + UINT32 Length; > > >>>>>>>>>> > > >>>>>>>>>> + UINT32 NameOffset; > > >>>>>>>>>> > > >>>>>>>>>> + CHAR8 Data[]; > > >>>>>>>>>> > > >>>>>>>>>> +} FDT_PROPERTY; > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +#define FDT_GET_HEADER(Fdt, Field) SwapBytes32(((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)) > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +/** > > >>>>>>>>>> > > >>>>>>>>>> + 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. > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +**/ > > >>>>>>>>>> > > >>>>>>>>>> +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 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 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 > > >>> 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 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..200a496c7e > > >>>>>>>>>> --- /dev/null > > >>>>>>>>>> +++ b/MdePkg/Library/BaseFdtLib/FdtLib.c > > >>>>>>>>>> @@ -0,0 +1,301 @@ > > >>>>>>>>>> +/** @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> > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +/** > > >>>>>>>>>> > > >>>>>>>>>> + 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 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. > > >>>>>>>>>> > > >>>>>>>>>> + > > >>>>>>>>>> > > >>>>>>>>>> +**/ > > >>>>>>>>>> > > >>>>>>>>>> +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 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..e738f4ded4 > > >>>>>>>>>> --- /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..772bba4839 > > >>>>>>>>>> --- /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..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.<BR> > > >>>>>>>>>> > > >>>>>>>>>> +# Copyright (c) 2023, Intel Corporation. All rights > reserved.<BR> > > >>>>>>>>>> > > >>>>>>>>>> # Copyright (c) 2021, Arm Limited. All rights reserved.<BR> > > >>>>>>>>>> > > >>>>>>>>>> # Copyright (c) 2023, Loongson Technology Corporation > Limited. > > >> All > > >>>>>>>>>> rights reserved.<BR> > > >>>>>>>>>> > > >>>>>>>>>> # 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 > > >> 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 (#103879): https://edk2.groups.io/g/devel/message/103879 Mute This Topic: https://groups.io/mt/98313203/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-