diff mbox

[edk2,01/10] Add minimal support for passing a device tree image

Message ID 1408994367-11143-2-git-send-email-ard.biesheuvel@linaro.org
State New
Headers show

Commit Message

Ard Biesheuvel Aug. 25, 2014, 7:19 p.m. UTC
This adds the possibility to include a DTB blob into the firmware image, and
have it installed as a configuration under the correct GUID at UEFI init time.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 MdeModulePkg/MdeModulePkg.dec                      |  2 +
 MdeModulePkg/MdeModulePkg.dsc                      |  2 +
 .../Universal/Fdt/FdtTableDxe/FdtTableDxe.c        | 33 +++++++++++++++
 .../Universal/Fdt/FdtTableDxe/FdtTableDxe.inf      | 48 ++++++++++++++++++++++
 MdePkg/Include/Guid/FdtTable.h                     | 26 ++++++++++++
 MdePkg/MdePkg.dec                                  |  3 ++
 6 files changed, 114 insertions(+)
 create mode 100644 MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c
 create mode 100644 MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
 create mode 100644 MdePkg/Include/Guid/FdtTable.h

Comments

Laszlo Ersek Aug. 26, 2014, 9:39 a.m. UTC | #1
On 08/25/14 21:19, Ard Biesheuvel wrote:
> This adds the possibility to include a DTB blob into the firmware image, and
> have it installed as a configuration under the correct GUID at UEFI init time.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
>  MdeModulePkg/MdeModulePkg.dec                      |  2 +
>  MdeModulePkg/MdeModulePkg.dsc                      |  2 +
>  .../Universal/Fdt/FdtTableDxe/FdtTableDxe.c        | 33 +++++++++++++++
>  .../Universal/Fdt/FdtTableDxe/FdtTableDxe.inf      | 48 ++++++++++++++++++++++
>  MdePkg/Include/Guid/FdtTable.h                     | 26 ++++++++++++
>  MdePkg/MdePkg.dec                                  |  3 ++
>  6 files changed, 114 insertions(+)
>  create mode 100644 MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c
>  create mode 100644 MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
>  create mode 100644 MdePkg/Include/Guid/FdtTable.h
> 
> diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
> index e04246a2f419..d4d2a423256c 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -692,6 +692,8 @@
>    ## Default Creator Revision for ACPI table creation.
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision|0x01000013|UINT32|0x30001038
>  
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFdtImage|{ 0x66,0x0f,0xe1,0x96,0xa5,0x0f,0x43,0x8c,0xa9,0x50,0xbe,0x6a,0x58,0xb9,0x12,0x1b }|VOID*|0x30001041
> +
>  [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
>    ## This PCD defines the Console output column and the default value is 25 according to UEFI spec.
>    #  This PCD could be set to 0 then console output could be at max column and max row.
> diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
> index f4733253442b..616387a746c1 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -322,6 +322,8 @@
>    MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf
>    MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
>  
> +  MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
> +
>  [Components.IA32, Components.X64, Components.IPF]
>    MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
>    MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf
> diff --git a/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c
> new file mode 100644
> index 000000000000..c9b8b4c42464
> --- /dev/null
> +++ b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c
> @@ -0,0 +1,33 @@
> +
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/UefiDriverEntryPoint.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/DxeServicesLib.h>
> +
> +#include <Guid/FdtTable.h>
> +
> +EFI_STATUS
> +EFIAPI
> +InitializeFdtTableDxe (
> +  IN EFI_HANDLE           ImageHandle,
> +  IN EFI_SYSTEM_TABLE     *SystemTable
> +  )
> +{
> +  EFI_STATUS Status;
> +  VOID *FdtImageData;
> +  UINTN FdtImageSize;
> +
> +  Status = GetSectionFromAnyFv(PcdGetPtr(PcdFdtImage), EFI_SECTION_RAW, 0,
> +    &FdtImageData, &FdtImageSize);
> +  if (EFI_ERROR(Status))
> +    return Status;
> +
> +  DEBUG((EFI_D_ERROR, "InitializeFdtTableDxe: DTB @ 0x%08x\n", FdtImageData));
> +
> +  return gBS->InstallConfigurationTable(&gEfiFdtTableGuid, FdtImageData);
> +}
> diff --git a/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
> new file mode 100644
> index 000000000000..993b778b8f66
> --- /dev/null
> +++ b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
> @@ -0,0 +1,48 @@
> +## @file
> +#  FDT Table Protocol Driver
> +#
> +#  Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>
> +#  This program and the accompanying materials are
> +#  licensed and made available under the terms and conditions of the BSD License
> +#  which accompanies this distribution.  The full text of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = FdtTableDxe
> +  FILE_GUID                      = 261F9737-CDF6-46CE-A9E2-5DD16B957413
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +
> +  ENTRY_POINT                    = InitializeFdtTableDxe
> +
> +[Sources]
> +  FdtTableDxe.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  PcdLib
> +  UefiDriverEntryPoint
> +  DxeServicesLib
> +
> +[Guids]
> +  gEfiFdtTableGuid
> +
> +[FeaturePcd]
> +
> +[Pcd]
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFdtImage
> +
> +[Protocols]
> +
> +[Depex]
> +  TRUE
> diff --git a/MdePkg/Include/Guid/FdtTable.h b/MdePkg/Include/Guid/FdtTable.h
> new file mode 100644
> index 000000000000..ab2e0bc43940
> --- /dev/null
> +++ b/MdePkg/Include/Guid/FdtTable.h
> @@ -0,0 +1,26 @@
> +/** @file
> +  GUIDs used to locate the FDT image in the UEFI 2.x system table.
> +
> +  Copyright (c) 2014 Linaro Ltd. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD License
> +  which accompanies this distribution.  The full text of the license may be found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef __FDT_TABLE_GUID_H__
> +#define __FDT_TABLE_GUID_H__
> +
> +#define FDT_TABLE_GUID \
> +  { \
> +    0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } \
> +  }
> +
> +extern EFI_GUID       gEfiFdtTableGuid;
> +
> +#endif
> diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
> index 4daf3e6a75ea..574561b9f675 100644
> --- a/MdePkg/MdePkg.dec
> +++ b/MdePkg/MdePkg.dec
> @@ -615,6 +615,9 @@
>    ## Include/Guid/VectorHandoffTable.h
>    gEfiVectorHandoffTableGuid        = { 0x996ec11c, 0x5397, 0x4e73, { 0xb5, 0x8f, 0x82, 0x7e, 0x52, 0x90, 0x6d, 0xef }}
>  
> +  ## Include/Guid/FdtTable.h
> +  gEfiFdtTableGuid                     = { 0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 }}
> +
>  [Guids.IA32, Guids.X64]
>    ## Include/Guid/Cper.h
>    gEfiIa32X64ErrorTypeCacheCheckGuid = { 0xA55701F5, 0xE3EF, 0x43de, { 0xAC, 0x72, 0x24, 0x9B, 0x57, 0x3F, 0xAD, 0x2C }}
> 

I'm trying to familiarize myself with the structure of this series.

Before I get to the real meat (or what I consider to be the "real
meat"), I'd like to ask why we need this patch. I searched the other
patches for "FdtTableDxe", and I got no hits.

As far as I understand, this functionality is useful for the linaro
tree, and some of the physical hardware platforms. In a virtual machine
though, the DTB will always come from QEMU, so for aarch64 VM support,
this patch doesn't appear to be necessary.

Can you drop it from this series? (Along with 02/10, using the FDF
change you described before.) I'd like to reduce the things I must
understand to a minimum.

Additionally, adding anything at all to MdePkg and MdeModulePkg is
pretty hard in upstream edk2, so if we don't have to, let's not try. :)
If you drop the first two patches, then your series remains in the
confines of ArmPkg and ArmPlatformPkg. I can't stress enough how much
easier that makes it for your series to get applied.

Thanks,
Laszlo

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
Ard Biesheuvel Aug. 26, 2014, 10:12 a.m. UTC | #2
On 26 August 2014 11:39, Laszlo Ersek <lersek@redhat.com> wrote:
> On 08/25/14 21:19, Ard Biesheuvel wrote:
>> This adds the possibility to include a DTB blob into the firmware image, and
>> have it installed as a configuration under the correct GUID at UEFI init time.
>>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>> ---
[...]
>
> I'm trying to familiarize myself with the structure of this series.
>
> Before I get to the real meat (or what I consider to be the "real
> meat"), I'd like to ask why we need this patch. I searched the other
> patches for "FdtTableDxe", and I got no hits.
>

This patch does two things:
- declare a GUID for a device tree configuration table
- implement a driver that takes an embedded FV containing a device
tree blob and install it as a configuration table under the declared
GUID

The latter part is not used in this series, but the GUID /is/ used by
VirtFdtDxe.c to install the device tree as a config table. This is
what allows the kernel to boot straight from UEFI without having to
pass -dtb arguments and have the EFI stub perform the load. Granted,
this is somewhat of a bonus, and the EFI stub does support dtb=, but
we disable it for secure boot because loading unauthenticated data and
install it right into the heart of the kernel is considered a security
hazard.

So i could split it up and move the part we need under ArmPkg, and
drop the other half, I suppose.
I know Olivier is also working on device tree integration, so perhaps
he could chime in as well?

@Olivier:?

> As far as I understand, this functionality is useful for the linaro
> tree, and some of the physical hardware platforms. In a virtual machine
> though, the DTB will always come from QEMU, so for aarch64 VM support,
> this patch doesn't appear to be necessary.
>

The point is not where the device tree came from, but where it goes to ...

> Can you drop it from this series? (Along with 02/10, using the FDF
> change you described before.) I'd like to reduce the things I must
> understand to a minimum.
>
> Additionally, adding anything at all to MdePkg and MdeModulePkg is
> pretty hard in upstream edk2, so if we don't have to, let's not try. :)
> If you drop the first two patches, then your series remains in the
> confines of ArmPkg and ArmPlatformPkg. I can't stress enough how much
> easier that makes it for your series to get applied.
>

Agreed.
Olivier Martin Aug. 26, 2014, 10:26 a.m. UTC | #3
The GUID has already been declared in EmbeddedPkg/Include/Guid/Fdt.h.

I have just pushed some helper functions to load FDT from Firmware Volume (svn rev15905) or File System (svn rev15908).
These functions could be used by VirtFdtDxe.c.

> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
> Sent: 26 August 2014 11:12
> To: Laszlo Ersek
> Cc: Olivier Martin; edk2-devel@lists.sourceforge.net; Peter Maydell;
> Christoffer Dall; Andrew Jones; Ilias Biris; Leif Lindholm
> Subject: Re: [PATCH 01/10] Add minimal support for passing a device
> tree image
> 
> On 26 August 2014 11:39, Laszlo Ersek <lersek@redhat.com> wrote:
> > On 08/25/14 21:19, Ard Biesheuvel wrote:
> >> This adds the possibility to include a DTB blob into the firmware
> image, and
> >> have it installed as a configuration under the correct GUID at UEFI
> init time.
> >>
> >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> >> ---
> [...]
> >
> > I'm trying to familiarize myself with the structure of this series.
> >
> > Before I get to the real meat (or what I consider to be the "real
> > meat"), I'd like to ask why we need this patch. I searched the other
> > patches for "FdtTableDxe", and I got no hits.
> >
> 
> This patch does two things:
> - declare a GUID for a device tree configuration table
> - implement a driver that takes an embedded FV containing a device
> tree blob and install it as a configuration table under the declared
> GUID
> 
> The latter part is not used in this series, but the GUID /is/ used by
> VirtFdtDxe.c to install the device tree as a config table. This is
> what allows the kernel to boot straight from UEFI without having to
> pass -dtb arguments and have the EFI stub perform the load. Granted,
> this is somewhat of a bonus, and the EFI stub does support dtb=, but
> we disable it for secure boot because loading unauthenticated data and
> install it right into the heart of the kernel is considered a security
> hazard.
> 
> So i could split it up and move the part we need under ArmPkg, and
> drop the other half, I suppose.
> I know Olivier is also working on device tree integration, so perhaps
> he could chime in as well?
> 
> @Olivier:?
> 
> > As far as I understand, this functionality is useful for the linaro
> > tree, and some of the physical hardware platforms. In a virtual
> machine
> > though, the DTB will always come from QEMU, so for aarch64 VM
> support,
> > this patch doesn't appear to be necessary.
> >
> 
> The point is not where the device tree came from, but where it goes to
> ...
> 
> > Can you drop it from this series? (Along with 02/10, using the FDF
> > change you described before.) I'd like to reduce the things I must
> > understand to a minimum.
> >
> > Additionally, adding anything at all to MdePkg and MdeModulePkg is
> > pretty hard in upstream edk2, so if we don't have to, let's not try.
> :)
> > If you drop the first two patches, then your series remains in the
> > confines of ArmPkg and ArmPlatformPkg. I can't stress enough how much
> > easier that makes it for your series to get applied.
> >
> 
> Agreed.
> 
> --
> Ard.





------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
diff mbox

Patch

diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index e04246a2f419..d4d2a423256c 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -692,6 +692,8 @@ 
   ## Default Creator Revision for ACPI table creation.
   gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision|0x01000013|UINT32|0x30001038
 
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFdtImage|{ 0x66,0x0f,0xe1,0x96,0xa5,0x0f,0x43,0x8c,0xa9,0x50,0xbe,0x6a,0x58,0xb9,0x12,0x1b }|VOID*|0x30001041
+
 [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
   ## This PCD defines the Console output column and the default value is 25 according to UEFI spec.
   #  This PCD could be set to 0 then console output could be at max column and max row.
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index f4733253442b..616387a746c1 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -322,6 +322,8 @@ 
   MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/FirmwarePerformanceDxe.inf
   MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf
 
+  MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
+
 [Components.IA32, Components.X64, Components.IPF]
   MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
   MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf
diff --git a/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c
new file mode 100644
index 000000000000..c9b8b4c42464
--- /dev/null
+++ b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.c
@@ -0,0 +1,33 @@ 
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/PcdLib.h>
+#include <Library/DxeServicesLib.h>
+
+#include <Guid/FdtTable.h>
+
+EFI_STATUS
+EFIAPI
+InitializeFdtTableDxe (
+  IN EFI_HANDLE           ImageHandle,
+  IN EFI_SYSTEM_TABLE     *SystemTable
+  )
+{
+  EFI_STATUS Status;
+  VOID *FdtImageData;
+  UINTN FdtImageSize;
+
+  Status = GetSectionFromAnyFv(PcdGetPtr(PcdFdtImage), EFI_SECTION_RAW, 0,
+    &FdtImageData, &FdtImageSize);
+  if (EFI_ERROR(Status))
+    return Status;
+
+  DEBUG((EFI_D_ERROR, "InitializeFdtTableDxe: DTB @ 0x%08x\n", FdtImageData));
+
+  return gBS->InstallConfigurationTable(&gEfiFdtTableGuid, FdtImageData);
+}
diff --git a/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
new file mode 100644
index 000000000000..993b778b8f66
--- /dev/null
+++ b/MdeModulePkg/Universal/Fdt/FdtTableDxe/FdtTableDxe.inf
@@ -0,0 +1,48 @@ 
+## @file
+#  FDT Table Protocol Driver
+#
+#  Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>
+#  This program and the accompanying materials are
+#  licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = FdtTableDxe
+  FILE_GUID                      = 261F9737-CDF6-46CE-A9E2-5DD16B957413
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+
+  ENTRY_POINT                    = InitializeFdtTableDxe
+
+[Sources]
+  FdtTableDxe.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  PcdLib
+  UefiDriverEntryPoint
+  DxeServicesLib
+
+[Guids]
+  gEfiFdtTableGuid
+
+[FeaturePcd]
+
+[Pcd]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFdtImage
+
+[Protocols]
+
+[Depex]
+  TRUE
diff --git a/MdePkg/Include/Guid/FdtTable.h b/MdePkg/Include/Guid/FdtTable.h
new file mode 100644
index 000000000000..ab2e0bc43940
--- /dev/null
+++ b/MdePkg/Include/Guid/FdtTable.h
@@ -0,0 +1,26 @@ 
+/** @file
+  GUIDs used to locate the FDT image in the UEFI 2.x system table.
+
+  Copyright (c) 2014 Linaro Ltd. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __FDT_TABLE_GUID_H__
+#define __FDT_TABLE_GUID_H__
+
+#define FDT_TABLE_GUID \
+  { \
+    0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } \
+  }
+
+extern EFI_GUID       gEfiFdtTableGuid;
+
+#endif
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index 4daf3e6a75ea..574561b9f675 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -615,6 +615,9 @@ 
   ## Include/Guid/VectorHandoffTable.h
   gEfiVectorHandoffTableGuid        = { 0x996ec11c, 0x5397, 0x4e73, { 0xb5, 0x8f, 0x82, 0x7e, 0x52, 0x90, 0x6d, 0xef }}
 
+  ## Include/Guid/FdtTable.h
+  gEfiFdtTableGuid                     = { 0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 }}
+
 [Guids.IA32, Guids.X64]
   ## Include/Guid/Cper.h
   gEfiIa32X64ErrorTypeCacheCheckGuid = { 0xA55701F5, 0xE3EF, 0x43de, { 0xAC, 0x72, 0x24, 0x9B, 0x57, 0x3F, 0xAD, 0x2C }}