Hi Mike,

Thanks for bringing this good point!
We would like to document that all FDT structure data are in *big endian* 
format and remove those SwapBytes MACROs from FdtLib.h
It makes sense to handle this from library consumer side (consumer can define 
their own MACROs) because we cannot assume consumer usage always requires 
SwapBytes.

We will send V4 patch to update this.

Thanks,
Chasel



> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Michael D
> Kinney
> Sent: Thursday, April 20, 2023 9:44 AM
> To: Lin, Benny <benny....@intel.com>; devel@edk2.groups.io; Leif Lindholm
> <llind...@qti.qualcomm.com>
> 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 v3 2/3] MdePkg: Support FDT library.
> 
> 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 (#103332): https://edk2.groups.io/g/devel/message/103332
Mute This Topic: https://groups.io/mt/98313203/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to