Merge pie-platform-release to aosp-master - DO NOT MERGE

Change-Id: I20efb0b291e228205e2098d996af0b0a539eacaa
diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template
index 1db94b6..2684c8c 100755
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -238,6 +238,20 @@
         # For RVCTCYGWIN ASM_FLAGS must be first to work around pathing issues

         "$(ASM)" $(ASM_FLAGS) -o ${dst} ${d_path}(+)${s_base}.iii

 

+[Device-Tree-Source-File]

+    <InputFile>

+        ?.dts

+

+    <ExtraDependency>

+        $(MAKE_FILE)

+

+    <OutputFile>

+        $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dtb

+

+    <Command.GCC>

+        "$(PP)" $(DTCPP_FLAGS) $(INC) ${src} > ${d_path}(+)${s_base}.i

+        "$(DTC)" -I dts -O dtb -o ${dst} ${d_path}(+)${s_base}.i

+

 [Visual-Form-Representation-File]

     <InputFile>

         ?.vfr

diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index 37feb8c..7736cfb 100755
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -1,5 +1,5 @@
 #

-#  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>

+#  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>

 #  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>

 #  Portions copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>

 #  Copyright (c) 2015, Hewlett-Packard Development Company, L.P.<BR>

@@ -227,6 +227,8 @@
 

 DEFINE SOURCERY_CYGWIN_TOOLS = /cygdrive/c/Program Files/CodeSourcery/Sourcery G++ Lite/bin

 

+DEFINE DTC_BIN                 = ENV(DTC_PREFIX)dtc

+

 ####################################################################################

 #

 # format: TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE = <string>

@@ -380,7 +382,8 @@
 #                               Intel(r) ACPI Compiler from

 #                               https://acpica.org/downloads

 #   CLANG38  -Linux-  Requires:

-#                             Clang v3.8 or later, LLVMgold plugin and GNU binutils 2.26 targeting x86_64-linux-gnu

+#                             Clang v3.8, LLVMgold plugin and GNU binutils 2.26 targeting x86_64-linux-gnu, aarch64-linux-gnu or arm-linux-gnueabi

+#                             Clang v3.9 or later, LLVMgold plugin and GNU binutils 2.28 targeting x86_64-linux-gnu, aarch64-linux-gnu or arm-linux-gnueabi

 #                        Optional:

 #                             Required to build platforms or ACPI tables:

 #                               Intel(r) ACPI Compiler from

@@ -4341,7 +4344,7 @@
 DEFINE GCC_IPF_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -minline-int-divide-min-latency

 DEFINE GCC_ARM_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -mabi=aapcs -fno-short-enums -funsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -Wno-address -mthumb -mfloat-abi=soft -fno-pic -fno-pie

 DEFINE GCC_ARM_CC_XIPFLAGS         = -mno-unaligned-access

-DEFINE GCC_AARCH64_CC_FLAGS        = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -fno-short-enums -fverbose-asm -funsigned-char  -ffunction-sections -fdata-sections -Wno-address -fno-asynchronous-unwind-tables -fno-pic -fno-pie

+DEFINE GCC_AARCH64_CC_FLAGS        = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -fno-short-enums -fverbose-asm -funsigned-char  -ffunction-sections -fdata-sections -fno-builtin -Wno-address -fno-asynchronous-unwind-tables -fno-unwind-tables -fno-pic -fno-pie -ffixed-x18

 DEFINE GCC_AARCH64_CC_XIPFLAGS     = -mstrict-align

 DEFINE GCC_DLINK_FLAGS_COMMON      = -nostdlib --pie

 DEFINE GCC_DLINK2_FLAGS_COMMON     = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds

@@ -4362,6 +4365,7 @@
 DEFINE GCC_ASLPP_FLAGS             = -x c -E -include AutoGen.h

 DEFINE GCC_ASLCC_FLAGS             = -x c

 DEFINE GCC_WINDRES_FLAGS           = -J rc -O coff

+DEFINE GCC_DTCPP_FLAGS             = -E -x assembler-with-cpp -imacros $(DEST_DIR_DEBUG)/AutoGen.h -nostdinc

 DEFINE GCC_IA32_RC_FLAGS           = -I binary -O elf32-i386          -B i386    --rename-section .data=.hii

 DEFINE GCC_X64_RC_FLAGS            = -I binary -O elf64-x86-64        -B i386    --rename-section .data=.hii

 DEFINE GCC_IPF_RC_FLAGS            = -I binary -O elf64-ia64-little   -B ia64    --rename-section .data=.hii

@@ -4745,6 +4749,7 @@
 *_GCC46_*_MAKE_PATH                    = DEF(GCC46_IA32_PREFIX)make

 *_GCC46_*_*_DLL                        = ENV(GCC46_DLL)

 *_GCC46_*_ASL_PATH                     = DEF(UNIX_IASL_BIN)

+*_GCC46_*_DTC_PATH                     = DEF(DTC_BIN)

 

 *_GCC46_*_PP_FLAGS                     = DEF(GCC_PP_FLAGS)

 *_GCC46_*_ASLPP_FLAGS                  = DEF(GCC_ASLPP_FLAGS)

@@ -4833,6 +4838,7 @@
 *_GCC46_ARM_ASM_FLAGS            = DEF(GCC46_ARM_ASM_FLAGS)

 *_GCC46_ARM_DLINK_FLAGS          = DEF(GCC46_ARM_DLINK_FLAGS)

 *_GCC46_ARM_DLINK2_FLAGS         = DEF(GCC46_ARM_DLINK2_FLAGS)

+*_GCC46_ARM_DTCPP_FLAGS          = DEF(GCC_DTCPP_FLAGS)

 *_GCC46_ARM_PLATFORM_FLAGS       = -march=armv7-a

 *_GCC46_ARM_PP_FLAGS             = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC46_ARM_RC_FLAGS             = DEF(GCC_ARM_RC_FLAGS)

@@ -4854,6 +4860,7 @@
 *_GCC47_*_MAKE_PATH                    = DEF(GCC47_IA32_PREFIX)make

 *_GCC47_*_*_DLL                        = ENV(GCC47_DLL)

 *_GCC47_*_ASL_PATH                     = DEF(UNIX_IASL_BIN)

+*_GCC47_*_DTC_PATH                     = DEF(DTC_BIN)

 

 *_GCC47_*_PP_FLAGS                     = DEF(GCC_PP_FLAGS)

 *_GCC47_*_ASLPP_FLAGS                  = DEF(GCC_ASLPP_FLAGS)

@@ -4941,6 +4948,7 @@
 *_GCC47_ARM_ASM_FLAGS            = DEF(GCC47_ARM_ASM_FLAGS)

 *_GCC47_ARM_DLINK_FLAGS          = DEF(GCC47_ARM_DLINK_FLAGS)

 *_GCC47_ARM_DLINK2_FLAGS         = DEF(GCC47_ARM_DLINK2_FLAGS)

+*_GCC47_ARM_DTCPP_FLAGS          = DEF(GCC_DTCPP_FLAGS)

 *_GCC47_ARM_PLATFORM_FLAGS       = -march=armv7-a

 *_GCC47_ARM_PP_FLAGS             = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC47_ARM_RC_FLAGS             = DEF(GCC_ARM_RC_FLAGS)

@@ -4970,6 +4978,7 @@
 *_GCC47_AARCH64_ASM_FLAGS        = DEF(GCC47_AARCH64_ASM_FLAGS)

 *_GCC47_AARCH64_DLINK_FLAGS      = DEF(GCC47_AARCH64_DLINK_FLAGS)

 *_GCC47_AARCH64_DLINK2_FLAGS     = DEF(GCC47_AARCH64_DLINK2_FLAGS)

+*_GCC47_AARCH64_DTCPP_FLAGS      = DEF(GCC_DTCPP_FLAGS)

 *_GCC47_AARCH64_PLATFORM_FLAGS   =

 *_GCC47_AARCH64_PP_FLAGS         = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC47_AARCH64_RC_FLAGS         = DEF(GCC_AARCH64_RC_FLAGS)

@@ -4991,6 +5000,7 @@
 *_GCC48_*_MAKE_PATH                    = DEF(GCC48_IA32_PREFIX)make

 *_GCC48_*_*_DLL                        = ENV(GCC48_DLL)

 *_GCC48_*_ASL_PATH                     = DEF(UNIX_IASL_BIN)

+*_GCC48_*_DTC_PATH                     = DEF(DTC_BIN)

 

 *_GCC48_*_PP_FLAGS                     = DEF(GCC_PP_FLAGS)

 *_GCC48_*_ASLPP_FLAGS                  = DEF(GCC_ASLPP_FLAGS)

@@ -5078,6 +5088,7 @@
 *_GCC48_ARM_ASM_FLAGS            = DEF(GCC48_ARM_ASM_FLAGS)

 *_GCC48_ARM_DLINK_FLAGS          = DEF(GCC48_ARM_DLINK_FLAGS)

 *_GCC48_ARM_DLINK2_FLAGS         = DEF(GCC48_ARM_DLINK2_FLAGS)

+*_GCC48_ARM_DTCPP_FLAGS          = DEF(GCC_DTCPP_FLAGS)

 *_GCC48_ARM_PLATFORM_FLAGS       = -march=armv7-a

 *_GCC48_ARM_PP_FLAGS             = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC48_ARM_RC_FLAGS             = DEF(GCC_ARM_RC_FLAGS)

@@ -5107,6 +5118,7 @@
 *_GCC48_AARCH64_ASM_FLAGS        = DEF(GCC48_AARCH64_ASM_FLAGS)

 *_GCC48_AARCH64_DLINK_FLAGS      = DEF(GCC48_AARCH64_DLINK_FLAGS)

 *_GCC48_AARCH64_DLINK2_FLAGS     = DEF(GCC48_AARCH64_DLINK2_FLAGS)

+*_GCC48_AARCH64_DTCPP_FLAGS      = DEF(GCC_DTCPP_FLAGS)

 *_GCC48_AARCH64_PLATFORM_FLAGS   =

 *_GCC48_AARCH64_PP_FLAGS         = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC48_AARCH64_RC_FLAGS         = DEF(GCC_AARCH64_RC_FLAGS)

@@ -5128,6 +5140,7 @@
 *_GCC49_*_MAKE_PATH                    = DEF(GCC49_IA32_PREFIX)make

 *_GCC49_*_*_DLL                        = ENV(GCC49_DLL)

 *_GCC49_*_ASL_PATH                     = DEF(UNIX_IASL_BIN)

+*_GCC49_*_DTC_PATH                     = DEF(DTC_BIN)

 

 *_GCC49_*_PP_FLAGS                     = DEF(GCC_PP_FLAGS)

 *_GCC49_*_ASLPP_FLAGS                  = DEF(GCC_ASLPP_FLAGS)

@@ -5215,6 +5228,7 @@
 *_GCC49_ARM_ASM_FLAGS            = DEF(GCC49_ARM_ASM_FLAGS)

 *_GCC49_ARM_DLINK_FLAGS          = DEF(GCC49_ARM_DLINK_FLAGS)

 *_GCC49_ARM_DLINK2_FLAGS         = DEF(GCC49_ARM_DLINK2_FLAGS)

+*_GCC49_ARM_DTCPP_FLAGS          = DEF(GCC_DTCPP_FLAGS)

 *_GCC49_ARM_PLATFORM_FLAGS       = -march=armv7-a

 *_GCC49_ARM_PP_FLAGS             = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC49_ARM_RC_FLAGS             = DEF(GCC_ARM_RC_FLAGS)

@@ -5243,6 +5257,7 @@
 *_GCC49_AARCH64_ASLDLINK_FLAGS   = DEF(GCC49_AARCH64_ASLDLINK_FLAGS)

 *_GCC49_AARCH64_ASM_FLAGS        = DEF(GCC49_AARCH64_ASM_FLAGS)

 *_GCC49_AARCH64_DLINK2_FLAGS     = DEF(GCC49_AARCH64_DLINK2_FLAGS)

+*_GCC49_AARCH64_DTCPP_FLAGS      = DEF(GCC_DTCPP_FLAGS)

 *_GCC49_AARCH64_PLATFORM_FLAGS   =

 *_GCC49_AARCH64_PP_FLAGS         = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC49_AARCH64_RC_FLAGS         = DEF(GCC_AARCH64_RC_FLAGS)

@@ -5271,6 +5286,7 @@
 *_GCC5_*_MAKE_PATH               = DEF(GCC5_IA32_PREFIX)make

 *_GCC5_*_*_DLL                   = ENV(GCC5_DLL)

 *_GCC5_*_ASL_PATH                = DEF(UNIX_IASL_BIN)

+*_GCC5_*_DTC_PATH                = DEF(DTC_BIN)

 

 *_GCC5_*_PP_FLAGS                = DEF(GCC_PP_FLAGS)

 *_GCC5_*_ASLPP_FLAGS             = DEF(GCC_ASLPP_FLAGS)

@@ -5363,6 +5379,7 @@
 *_GCC5_ARM_ASLDLINK_FLAGS        = DEF(GCC5_ARM_ASLDLINK_FLAGS)

 *_GCC5_ARM_ASM_FLAGS             = DEF(GCC5_ARM_ASM_FLAGS)

 *_GCC5_ARM_DLINK2_FLAGS          = DEF(GCC5_ARM_DLINK2_FLAGS)

+*_GCC5_ARM_DTCPP_FLAGS           = DEF(GCC_DTCPP_FLAGS)

 *_GCC5_ARM_PLATFORM_FLAGS        = -march=armv7-a

 *_GCC5_ARM_PP_FLAGS              = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC5_ARM_RC_FLAGS              = DEF(GCC_ARM_RC_FLAGS)

@@ -5396,6 +5413,7 @@
 *_GCC5_AARCH64_ASLDLINK_FLAGS    = DEF(GCC5_AARCH64_ASLDLINK_FLAGS)

 *_GCC5_AARCH64_ASM_FLAGS         = DEF(GCC5_AARCH64_ASM_FLAGS)

 *_GCC5_AARCH64_DLINK2_FLAGS      = DEF(GCC5_AARCH64_DLINK2_FLAGS)

+*_GCC5_AARCH64_DTCPP_FLAGS       = DEF(GCC_DTCPP_FLAGS)

 *_GCC5_AARCH64_PLATFORM_FLAGS    =

 *_GCC5_AARCH64_PP_FLAGS          = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS)

 *_GCC5_AARCH64_RC_FLAGS          = DEF(GCC_AARCH64_RC_FLAGS)

@@ -5425,12 +5443,14 @@
 *_CLANG35_*_MAKE_PATH            = make

 *_CLANG35_*_*_DLL                = ENV(CLANG35_DLL)

 *_CLANG35_*_ASL_PATH             = DEF(UNIX_IASL_BIN)

+*_CLANG35_*_DTC_PATH             = DEF(DTC_BIN)

 

 *_CLANG35_*_PP_FLAGS             = DEF(GCC_PP_FLAGS)

 *_CLANG35_*_ASLCC_FLAGS          = DEF(GCC_ASLCC_FLAGS)

 *_CLANG35_*_APP_FLAGS            =

 *_CLANG35_*_ASL_FLAGS            = DEF(IASL_FLAGS)

 *_CLANG35_*_ASL_OUTFLAGS         = DEF(IASL_OUTFLAGS)

+*_CLANG35_*_DTCPP_FLAGS          = DEF(GCC_DTCPP_FLAGS)

 

 *_CLANG35_*_CC_PATH              = ENV(CLANG35_BIN)clang

 *_CLANG35_*_ASM_PATH             = ENV(CLANG35_BIN)clang

@@ -5459,7 +5479,7 @@
 *_CLANG35_ARM_ASM_FLAGS          = DEF(GCC_ASM_FLAGS) DEF(CLANG35_ARM_TARGET) $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -Qunused-arguments

 *_CLANG35_ARM_DLINK_FLAGS        = DEF(CLANG35_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS)

 *_CLANG35_ARM_DLINK2_FLAGS       = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x220

-*_CLANG35_ARM_PLATFORM_FLAGS     =

+*_CLANG35_ARM_PLATFORM_FLAGS     = -march=armv7-a

 *_CLANG35_ARM_PP_FLAGS           = DEF(GCC_PP_FLAGS) DEF(CLANG35_ARM_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)

 *_CLANG35_ARM_RC_FLAGS           = DEF(GCC_ARM_RC_FLAGS)

 *_CLANG35_ARM_VFRPP_FLAGS        = DEF(GCC_VFRPP_FLAGS) DEF(CLANG35_ARM_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)

@@ -5501,6 +5521,7 @@
 *_CLANG38_*_MAKE_PATH               = make

 *_CLANG38_*_*_DLL                   = ENV(CLANG38_DLL)

 *_CLANG38_*_ASL_PATH                = DEF(UNIX_IASL_BIN)

+*_CLANG38_*_DTC_PATH                = DEF(DTC_BIN)

 

 *_CLANG38_*_APP_FLAGS               =

 *_CLANG38_*_ASL_FLAGS               = DEF(IASL_FLAGS)

@@ -5512,7 +5533,8 @@
 DEFINE CLANG38_IA32_TARGET          = -target i686-pc-linux-gnu

 DEFINE CLANG38_X64_TARGET           = -target x86_64-pc-linux-gnu

 

-DEFINE CLANG38_ALL_CC_FLAGS         = DEF(GCC44_ALL_CC_FLAGS) -Wno-empty-body -fno-stack-protector -fno-builtin -mms-bitfields -Wno-address -Wno-shift-negative-value -Wno-parentheses-equality -Wno-unknown-pragmas -Wno-tautological-constant-out-of-range-compare -Wno-incompatible-library-redeclaration -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -msoft-float -mno-implicit-float  -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -funsigned-char -fno-ms-extensions -Wno-null-dereference -Wno-tautological-compare

+DEFINE CLANG38_WARNING_OVERRIDES    = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body  -Wno-varargs

+DEFINE CLANG38_ALL_CC_FLAGS         = DEF(GCC44_ALL_CC_FLAGS) DEF(CLANG38_WARNING_OVERRIDES) -fno-stack-protector -mms-bitfields -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -msoft-float -mno-implicit-float  -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -funsigned-char -fno-ms-extensions -Wno-null-dereference -Wno-unknown-warning-option

 

 ###########################

 # CLANG38 IA32 definitions

@@ -5532,10 +5554,6 @@
 *_CLANG38_IA32_ASLCC_FLAGS          = DEF(GCC_ASLCC_FLAGS) -m32 -fno-lto DEF(CLANG38_IA32_TARGET)

 *_CLANG38_IA32_ASLDLINK_FLAGS       = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_i386

 *_CLANG38_IA32_ASM_FLAGS            = DEF(GCC5_ASM_FLAGS) -m32 -march=i386 DEF(CLANG38_IA32_TARGET)

-DEBUG_CLANG38_IA32_CC_FLAGS         = DEF(CLANG38_ALL_CC_FLAGS) -m32 -Oz -flto -march=i586 DEF(CLANG38_IA32_TARGET) -g

-RELEASE_CLANG38_IA32_CC_FLAGS       = DEF(CLANG38_ALL_CC_FLAGS) -m32 -Oz -flto -march=i586 DEF(CLANG38_IA32_TARGET)

-*_CLANG38_IA32_DLINK_FLAGS          = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Wl,-Oz -Wl,-melf_i386 -Wl,--oformat=elf32-i386

-*_CLANG38_IA32_DLINK2_FLAGS         = DEF(GCC5_IA32_DLINK2_FLAGS) -O3

 *_CLANG38_IA32_RC_FLAGS             = DEF(GCC_IA32_RC_FLAGS)

 *_CLANG38_IA32_OBJCOPY_FLAGS        =

 *_CLANG38_IA32_NASM_FLAGS           = -f elf32

@@ -5543,6 +5561,18 @@
 *_CLANG38_IA32_ASLPP_FLAGS          = DEF(GCC_ASLPP_FLAGS) DEF(CLANG38_IA32_TARGET)

 *_CLANG38_IA32_VFRPP_FLAGS          = DEF(GCC_VFRPP_FLAGS) DEF(CLANG38_IA32_TARGET)

 

+DEBUG_CLANG38_IA32_CC_FLAGS         = DEF(CLANG38_ALL_CC_FLAGS) -m32 -Oz -flto -march=i586 DEF(CLANG38_IA32_TARGET) -g

+DEBUG_CLANG38_IA32_DLINK_FLAGS      = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Wl,-Oz -Wl,-melf_i386 -Wl,--oformat=elf32-i386

+DEBUG_CLANG38_IA32_DLINK2_FLAGS     = DEF(GCC5_IA32_DLINK2_FLAGS) -O3

+

+RELEASE_CLANG38_IA32_CC_FLAGS       = DEF(CLANG38_ALL_CC_FLAGS) -m32 -Oz -flto -march=i586 DEF(CLANG38_IA32_TARGET)

+RELEASE_CLANG38_IA32_DLINK_FLAGS    = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Wl,-Oz -Wl,-melf_i386 -Wl,--oformat=elf32-i386

+RELEASE_CLANG38_IA32_DLINK2_FLAGS   = DEF(GCC5_IA32_DLINK2_FLAGS) -O3

+

+NOOPT_CLANG38_IA32_CC_FLAGS         = DEF(CLANG38_ALL_CC_FLAGS) -m32 -O0 -march=i586 DEF(CLANG38_IA32_TARGET) -g

+NOOPT_CLANG38_IA32_DLINK_FLAGS      = DEF(GCC5_IA32_X64_DLINK_FLAGS) -Wl,-O0 -Wl,-melf_i386 -Wl,--oformat=elf32-i386

+NOOPT_CLANG38_IA32_DLINK2_FLAGS     = DEF(GCC5_IA32_DLINK2_FLAGS) -O0

+

 ##########################

 # CLANG38 X64 definitions

 ##########################

@@ -5561,10 +5591,6 @@
 *_CLANG38_X64_ASLCC_FLAGS          = DEF(GCC_ASLCC_FLAGS) -m64 -fno-lto DEF(CLANG38_X64_TARGET)

 *_CLANG38_X64_ASLDLINK_FLAGS       = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_x86_64

 *_CLANG38_X64_ASM_FLAGS            = DEF(GCC5_ASM_FLAGS) -m64 DEF(CLANG38_X64_TARGET)

-DEBUG_CLANG38_X64_CC_FLAGS         = DEF(CLANG38_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -Oz -flto DEF(CLANG38_X64_TARGET) -g

-RELEASE_CLANG38_X64_CC_FLAGS       = DEF(CLANG38_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -Oz -flto DEF(CLANG38_X64_TARGET)

-*_CLANG38_X64_DLINK_FLAGS          = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Wl,-Oz -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,-pie -mcmodel=small

-*_CLANG38_X64_DLINK2_FLAGS         = DEF(GCC5_X64_DLINK2_FLAGS) -O3

 *_CLANG38_X64_RC_FLAGS             = DEF(GCC_X64_RC_FLAGS)

 *_CLANG38_X64_OBJCOPY_FLAGS        =

 *_CLANG38_X64_NASM_FLAGS           = -f elf64

@@ -5572,6 +5598,108 @@
 *_CLANG38_X64_ASLPP_FLAGS          = DEF(GCC_ASLPP_FLAGS) DEF(CLANG38_X64_TARGET)

 *_CLANG38_X64_VFRPP_FLAGS          = DEF(GCC_VFRPP_FLAGS) DEF(CLANG38_X64_TARGET)

 

+DEBUG_CLANG38_X64_CC_FLAGS         = DEF(CLANG38_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -Oz -flto DEF(CLANG38_X64_TARGET) -g

+DEBUG_CLANG38_X64_DLINK_FLAGS      = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Wl,-Oz -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,-pie -mcmodel=small

+DEBUG_CLANG38_X64_DLINK2_FLAGS     = DEF(GCC5_X64_DLINK2_FLAGS) -O3

+

+RELEASE_CLANG38_X64_CC_FLAGS       = DEF(CLANG38_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -Oz -flto DEF(CLANG38_X64_TARGET)

+RELEASE_CLANG38_X64_DLINK_FLAGS    = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Wl,-Oz -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,-pie -mcmodel=small

+RELEASE_CLANG38_X64_DLINK2_FLAGS   = DEF(GCC5_X64_DLINK2_FLAGS) -O3

+

+NOOPT_CLANG38_X64_CC_FLAGS         = DEF(CLANG38_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -O0 DEF(CLANG38_X64_TARGET) -g

+NOOPT_CLANG38_X64_DLINK_FLAGS      = DEF(GCC5_IA32_X64_DLINK_FLAGS) -Wl,-O0 -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,-pie -mcmodel=small

+NOOPT_CLANG38_X64_DLINK2_FLAGS     = DEF(GCC5_X64_DLINK2_FLAGS) -O0

+

+##################

+# CLANG38 ARM definitions

+##################

+DEFINE CLANG38_ARM_TARGET        = -target arm-linux-gnueabihf

+DEFINE CLANG38_ARM_CC_FLAGS      = DEF(GCC_ARM_CC_FLAGS) DEF(CLANG38_ARM_TARGET) DEF(CLANG38_WARNING_OVERRIDES) -mno-movt

+DEFINE CLANG38_ARM_DLINK_FLAGS   = DEF(CLANG38_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS)

+

+*_CLANG38_ARM_PP_FLAGS           = DEF(GCC_PP_FLAGS)

+*_CLANG38_ARM_ASLCC_FLAGS        = DEF(GCC_ASLCC_FLAGS)

+*_CLANG38_ARM_APP_FLAGS          =

+*_CLANG38_ARM_ASL_FLAGS          = DEF(IASL_FLAGS)

+*_CLANG38_ARM_ASL_OUTFLAGS       = DEF(IASL_OUTFLAGS)

+*_CLANG38_ARM_DTCPP_FLAGS        = DEF(GCC_DTCPP_FLAGS)

+

+*_CLANG38_ARM_CC_PATH            = ENV(CLANG38_BIN)clang

+*_CLANG38_ARM_ASM_PATH           = ENV(CLANG38_BIN)clang

+*_CLANG38_ARM_PP_PATH            = ENV(CLANG38_BIN)clang

+*_CLANG38_ARM_VFRPP_PATH         = ENV(CLANG38_BIN)clang

+*_CLANG38_ARM_ASLCC_PATH         = ENV(CLANG38_BIN)clang

+*_CLANG38_ARM_ASLPP_PATH         = ENV(CLANG38_BIN)clang

+*_CLANG38_ARM_DLINK_PATH         = ENV(CLANG38_BIN)clang

+*_CLANG38_ARM_ASLDLINK_PATH      = ENV(CLANG38_BIN)clang

+

+*_CLANG38_ARM_SLINK_PATH         = ENV(CLANG38_BIN)llvm-ar

+*_CLANG38_ARM_RC_PATH            = ENV(CLANG38_ARM_PREFIX)objcopy

+

+*_CLANG38_ARM_ASLCC_FLAGS        = DEF(GCC_ASLCC_FLAGS) -fno-lto

+*_CLANG38_ARM_ASLDLINK_FLAGS     = DEF(CLANG38_ARM_TARGET) DEF(GCC_ARM_ASLDLINK_FLAGS)

+*_CLANG38_ARM_ASM_FLAGS          = DEF(GCC_ASM_FLAGS) DEF(CLANG38_ARM_TARGET) $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -Qunused-arguments

+*_CLANG38_ARM_DLINK2_FLAGS       = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x220

+*_CLANG38_ARM_PLATFORM_FLAGS     = -march=armv7-a

+*_CLANG38_ARM_PP_FLAGS           = DEF(GCC_PP_FLAGS) DEF(CLANG38_ARM_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)

+*_CLANG38_ARM_RC_FLAGS           = DEF(GCC_ARM_RC_FLAGS)

+*_CLANG38_ARM_VFRPP_FLAGS        = DEF(GCC_VFRPP_FLAGS) DEF(CLANG38_ARM_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)

+*_CLANG38_ARM_ASLPP_FLAGS        = DEF(GCC_ASLPP_FLAGS) DEF(CLANG38_ARM_TARGET)

+*_CLANG38_ARM_CC_XIPFLAGS        = DEF(GCC_ARM_CC_XIPFLAGS)

+

+  DEBUG_CLANG38_ARM_CC_FLAGS     = DEF(CLANG38_ARM_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -flto -O1

+  DEBUG_CLANG38_ARM_DLINK_FLAGS  = DEF(CLANG38_ARM_DLINK_FLAGS) -flto -Wl,-O1 -L$(WORKSPACE)/ArmPkg/Library/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm

+  NOOPT_CLANG38_ARM_CC_FLAGS     = DEF(CLANG38_ARM_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O0

+  NOOPT_CLANG38_ARM_DLINK_FLAGS  = DEF(CLANG38_ARM_DLINK_FLAGS)

+RELEASE_CLANG38_ARM_CC_FLAGS     = DEF(CLANG38_ARM_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -flto -O3

+RELEASE_CLANG38_ARM_DLINK_FLAGS  = DEF(CLANG38_ARM_DLINK_FLAGS) -flto -Wl,-O3 -L$(WORKSPACE)/ArmPkg/Library/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm

+

+##################

+# CLANG38 AARCH64 definitions

+##################

+DEFINE CLANG38_AARCH64_TARGET    = -target aarch64-linux-gnu

+DEFINE CLANG38_AARCH64_CC_FLAGS  = DEF(GCC_AARCH64_CC_FLAGS) DEF(CLANG38_AARCH64_TARGET) -mcmodel=small DEF(CLANG38_WARNING_OVERRIDES)

+DEFINE CLANG38_AARCH64_DLINK_FLAGS  = DEF(CLANG38_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000

+

+*_CLANG38_AARCH64_PP_FLAGS       = DEF(GCC_PP_FLAGS)

+*_CLANG38_AARCH64_ASLCC_FLAGS    = DEF(GCC_ASLCC_FLAGS)

+*_CLANG38_AARCH64_APP_FLAGS      =

+*_CLANG38_AARCH64_ASL_FLAGS      = DEF(IASL_FLAGS)

+*_CLANG38_AARCH64_ASL_OUTFLAGS   = DEF(IASL_OUTFLAGS)

+*_CLANG38_AARCH64_DTCPP_FLAGS    = DEF(GCC_DTCPP_FLAGS)

+

+*_CLANG38_AARCH64_CC_PATH        = ENV(CLANG38_BIN)clang

+*_CLANG38_AARCH64_ASM_PATH       = ENV(CLANG38_BIN)clang

+*_CLANG38_AARCH64_PP_PATH        = ENV(CLANG38_BIN)clang

+*_CLANG38_AARCH64_VFRPP_PATH     = ENV(CLANG38_BIN)clang

+*_CLANG38_AARCH64_ASLCC_PATH     = ENV(CLANG38_BIN)clang

+*_CLANG38_AARCH64_ASLPP_PATH     = ENV(CLANG38_BIN)clang

+*_CLANG38_AARCH64_DLINK_PATH     = ENV(CLANG38_BIN)clang

+*_CLANG38_AARCH64_ASLDLINK_PATH  = ENV(CLANG38_BIN)clang

+

+*_CLANG38_AARCH64_SLINK_PATH     = ENV(CLANG38_BIN)llvm-ar

+*_CLANG38_AARCH64_RC_PATH        = ENV(CLANG38_AARCH64_PREFIX)objcopy

+

+*_CLANG38_AARCH64_ASLCC_FLAGS    = DEF(GCC_ASLCC_FLAGS) -fno-lto

+*_CLANG38_AARCH64_ASLDLINK_FLAGS = DEF(CLANG38_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS)

+*_CLANG38_AARCH64_ASM_FLAGS      = DEF(GCC_ASM_FLAGS) DEF(CLANG38_AARCH64_TARGET) $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -Qunused-arguments

+*_CLANG38_AARCH64_DLINK_FLAGS    = DEF(CLANG38_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000

+*_CLANG38_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20

+*_CLANG38_AARCH64_DLINK2_FLAGS   = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228

+*_CLANG38_AARCH64_PLATFORM_FLAGS =

+*_CLANG38_AARCH64_PP_FLAGS       = DEF(GCC_PP_FLAGS) DEF(CLANG38_AARCH64_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)

+*_CLANG38_AARCH64_RC_FLAGS       = DEF(GCC_AARCH64_RC_FLAGS)

+*_CLANG38_AARCH64_VFRPP_FLAGS    = DEF(GCC_VFRPP_FLAGS) DEF(CLANG38_AARCH64_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)

+*_CLANG38_AARCH64_ASLPP_FLAGS    = DEF(GCC_ASLPP_FLAGS) DEF(CLANG38_AARCH64_TARGET)

+*_CLANG38_AARCH64_CC_XIPFLAGS    = DEF(GCC_AARCH64_CC_XIPFLAGS)

+

+  DEBUG_CLANG38_AARCH64_CC_FLAGS    = DEF(CLANG38_AARCH64_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -flto -O1

+  DEBUG_CLANG38_AARCH64_DLINK_FLAGS = DEF(CLANG38_AARCH64_DLINK_FLAGS) -flto -Wl,-O1 -L$(WORKSPACE)/ArmPkg/Library/GccLto -llto-aarch64 -Wl,-plugin-opt=-pass-through=-llto-aarch64

+  NOOPT_CLANG38_AARCH64_CC_FLAGS    = DEF(CLANG38_AARCH64_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O0

+  NOOPT_CLANG38_AARCH64_DLINK_FLAGS = DEF(CLANG38_AARCH64_DLINK_FLAGS)

+RELEASE_CLANG38_AARCH64_CC_FLAGS    = DEF(CLANG38_AARCH64_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -flto -O3

+RELEASE_CLANG38_AARCH64_DLINK_FLAGS = DEF(CLANG38_AARCH64_DLINK_FLAGS) -flto -Wl,-O3 -L$(WORKSPACE)/ArmPkg/Library/GccLto -llto-aarch64 -Wl,-plugin-opt=-pass-through=-llto-aarch64

+

 ####################################################################################

 #

 # Cygwin GCC And Intel ACPI Compiler

diff --git a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
index 8495536..9074c6c 100644
--- a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
+++ b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
@@ -33,7 +33,8 @@
 #define CHUNK_TYPE_DONT_CARE        0xCAC3

 #define CHUNK_TYPE_CRC32            0xCAC4

 

-#define FILL_BUF_SIZE               1024

+#define FILL_BUF_SIZE               (16 * 1024 * 1024)

+#define SPARSE_BLOCK_SIZE           4096

 

 #define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && ((node)->SubType == (subtype)))

 

@@ -180,14 +181,35 @@
   )

 {

   EFI_STATUS        Status = EFI_SUCCESS;

-  UINTN             Chunk, Offset = 0, Index;

+  UINTN             Chunk, Offset = 0, Left, Count, FillBufSize;

   VOID             *Image;

   CHUNK_HEADER     *ChunkHeader;

-  UINT32            FillBuf[FILL_BUF_SIZE];

+  VOID             *FillBuf;

   CHAR16            OutputString[FASTBOOT_STRING_MAX_LENGTH];

 

   Image = (VOID *)SparseHeader;

   Image += SparseHeader->FileHeaderSize;

+

+  // allocate the fill buf with dynamic size

+  FillBufSize = FILL_BUF_SIZE;

+  while (FillBufSize >= SPARSE_BLOCK_SIZE) {

+    FillBuf = AllocatePool (FillBufSize);

+    if (FillBuf == NULL) {

+      FillBufSize = FillBufSize >> 1;

+    } else {

+      break;

+    }

+  };

+  if (FillBufSize < SPARSE_BLOCK_SIZE) {

+    UnicodeSPrint (

+      OutputString,

+      sizeof (OutputString),

+      L"Fail to allocate the fill buffer\n"

+      );

+    mTextOut->OutputString (mTextOut, OutputString);

+    return EFI_BUFFER_TOO_SMALL;

+  }

+

   for (Chunk = 0; Chunk < SparseHeader->TotalChunks; Chunk++) {

     ChunkHeader = (CHUNK_HEADER *)Image;

     DEBUG ((DEBUG_INFO, "Chunk #%d - Type: 0x%x Size: %d TotalSize: %d Offset %d\n",

@@ -209,20 +231,27 @@
       Offset += ChunkHeader->ChunkSize * SparseHeader->BlockSize;

       break;

     case CHUNK_TYPE_FILL:

-      SetMem32 (FillBuf, FILL_BUF_SIZE * sizeof (UINT32), *(UINT32 *)Image);

-      Image += sizeof (UINT32);

-      for (Index = 0; Index < ChunkHeader->ChunkSize; Index++) {

+      Left = ChunkHeader->ChunkSize * SparseHeader->BlockSize;

+      while (Left > 0) {

+        if (Left > FILL_BUF_SIZE) {

+          Count = FILL_BUF_SIZE;

+        } else {

+          Count = Left;

+        }

+        SetMem32 (FillBuf, Count, *(UINT32 *)Image);

         Status = mPlatform->FlashPartitionEx (

                               PartitionName,

                               Offset,

-                              SparseHeader->BlockSize,

+                              Count,

                               FillBuf

                               );

         if (EFI_ERROR (Status)) {

           return Status;

         }

-        Offset += SparseHeader->BlockSize;

+        Offset += Count;

+        Left = Left - Count;

       }

+      Image += sizeof (UINT32);

       break;

     case CHUNK_TYPE_DONT_CARE:

       Offset += ChunkHeader->ChunkSize * SparseHeader->BlockSize;

@@ -238,6 +267,7 @@
       break;

     }

   }

+  FreePool ((VOID *)FillBuf);

   return Status;

 }

 

diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c
new file mode 100644
index 0000000..1014be2
--- /dev/null
+++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c
@@ -0,0 +1,211 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.

+*

+*  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.

+*

+**/

+

+#include <Library/BaseLib.h>

+#include <Library/DebugLib.h>

+#include <Library/DevicePathLib.h>

+#include <Library/DtPlatformDtbLoaderLib.h>

+#include <Library/HiiLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiDriverEntryPoint.h>

+#include <Library/UefiRuntimeServicesTableLib.h>

+

+#include "DtPlatformDxe.h"

+

+extern  UINT8                     DtPlatformHiiBin[];

+extern  UINT8                     DtPlatformDxeStrings[];

+

+typedef struct {

+  VENDOR_DEVICE_PATH              VendorDevicePath;

+  EFI_DEVICE_PATH_PROTOCOL        End;

+} HII_VENDOR_DEVICE_PATH;

+

+STATIC HII_VENDOR_DEVICE_PATH     mDtPlatformDxeVendorDevicePath = {

+  {

+    {

+      HARDWARE_DEVICE_PATH,

+      HW_VENDOR_DP,

+      {

+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),

+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)

+      }

+    },

+    DT_PLATFORM_FORMSET_GUID

+  },

+  {

+    END_DEVICE_PATH_TYPE,

+    END_ENTIRE_DEVICE_PATH_SUBTYPE,

+    {

+      (UINT8) (END_DEVICE_PATH_LENGTH),

+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)

+    }

+  }

+};

+

+STATIC

+EFI_STATUS

+InstallHiiPages (

+  VOID

+  )

+{

+  EFI_STATUS                      Status;

+  EFI_HII_HANDLE                  HiiHandle;

+  EFI_HANDLE                      DriverHandle;

+

+  DriverHandle = NULL;

+  Status = gBS->InstallMultipleProtocolInterfaces (&DriverHandle,

+                  &gEfiDevicePathProtocolGuid,

+                  &mDtPlatformDxeVendorDevicePath,

+                  NULL);

+  if (EFI_ERROR (Status)) {

+    return Status;

+  }

+

+  HiiHandle = HiiAddPackages (&gDtPlatformFormSetGuid,

+                              DriverHandle,

+                              DtPlatformDxeStrings,

+                              DtPlatformHiiBin,

+                              NULL);

+

+  if (HiiHandle == NULL) {

+    gBS->UninstallMultipleProtocolInterfaces (DriverHandle,

+                  &gEfiDevicePathProtocolGuid,

+                  &mDtPlatformDxeVendorDevicePath,

+                  NULL);

+    return EFI_OUT_OF_RESOURCES;

+  }

+  return EFI_SUCCESS;

+}

+

+/**

+  The entry point for DtPlatformDxe driver.

+

+  @param[in] ImageHandle     The image handle of the driver.

+  @param[in] SystemTable     The system table.

+

+  @retval EFI_ALREADY_STARTED     The driver already exists in system.

+  @retval EFI_OUT_OF_RESOURCES    Fail to execute entry point due to lack of

+                                  resources.

+  @retval EFI_SUCCES              All the related protocols are installed on

+                                  the driver.

+

+**/

+EFI_STATUS

+EFIAPI

+DtPlatformDxeEntryPoint (

+  IN EFI_HANDLE                   ImageHandle,

+  IN EFI_SYSTEM_TABLE             *SystemTable

+  )

+{

+  EFI_STATUS                      Status;

+  DT_ACPI_VARSTORE_DATA           DtAcpiPref;

+  UINTN                           BufferSize;

+  VOID                            *Dtb;

+  UINTN                           DtbSize;

+

+  Dtb = NULL;

+  Status = DtPlatformLoadDtb (&Dtb, &DtbSize);

+  if (EFI_ERROR (Status)) {

+    DEBUG ((DEBUG_WARN,

+      "%a: no DTB blob could be loaded, defaulting to ACPI (Status == %r)\n",

+      __FUNCTION__, Status));

+    DtAcpiPref.Pref = DT_ACPI_SELECT_ACPI;

+  } else {

+    //

+    // Get the current DT/ACPI preference from the DtAcpiPref variable.

+    //

+    BufferSize = sizeof (DtAcpiPref);

+    Status = gRT->GetVariable(DT_ACPI_VARIABLE_NAME, &gDtPlatformFormSetGuid,

+                    NULL, &BufferSize, &DtAcpiPref);

+    if (EFI_ERROR (Status)) {

+      DEBUG ((DEBUG_WARN, "%a: no DT/ACPI preference found, defaulting to DT\n",

+        __FUNCTION__));

+      DtAcpiPref.Pref = DT_ACPI_SELECT_DT;

+    }

+  }

+

+  if (!EFI_ERROR (Status) &&

+      DtAcpiPref.Pref != DT_ACPI_SELECT_ACPI &&

+      DtAcpiPref.Pref != DT_ACPI_SELECT_DT) {

+    DEBUG ((DEBUG_WARN, "%a: invalid value for %s, defaulting to DT\n",

+      __FUNCTION__, DT_ACPI_VARIABLE_NAME));

+    DtAcpiPref.Pref = DT_ACPI_SELECT_DT;

+    Status = EFI_INVALID_PARAMETER; // trigger setvar below

+  }

+

+  //

+  // Write the newly selected default value back to the variable store.

+  //

+  if (EFI_ERROR (Status)) {

+    Status = gRT->SetVariable(DT_ACPI_VARIABLE_NAME, &gDtPlatformFormSetGuid,

+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,

+                    sizeof (DtAcpiPref), &DtAcpiPref);

+    if (EFI_ERROR (Status)) {

+      goto FreeDtb;

+    }

+  }

+

+  if (DtAcpiPref.Pref == DT_ACPI_SELECT_ACPI) {

+    //

+    // ACPI was selected: install the gEdkiiPlatformHasAcpiGuid GUID as a

+    // NULL protocol to unlock dispatch of ACPI related drivers.

+    //

+    Status = gBS->InstallMultipleProtocolInterfaces (&ImageHandle,

+                    &gEdkiiPlatformHasAcpiGuid, NULL, NULL);

+    if (EFI_ERROR (Status)) {

+      DEBUG ((DEBUG_ERROR,

+        "%a: failed to install gEdkiiPlatformHasAcpiGuid as a protocol\n",

+        __FUNCTION__));

+      goto FreeDtb;

+    }

+  } else if (DtAcpiPref.Pref == DT_ACPI_SELECT_DT) {

+    //

+    // DT was selected: copy the blob into newly allocated memory and install

+    // a reference to it as the FDT configuration table.

+    //

+    Status = gBS->InstallConfigurationTable (&gFdtTableGuid, Dtb);

+    if (EFI_ERROR (Status)) {

+      DEBUG ((DEBUG_ERROR, "%a: failed to install FDT configuration table\n",

+        __FUNCTION__));

+      goto FreeDtb;

+    }

+  } else {

+    ASSERT (FALSE);

+  }

+

+  //

+  // No point in installing the HII pages if ACPI is the only description

+  // we have

+  //

+  if (Dtb == NULL) {

+    return EFI_SUCCESS;

+  }

+

+  //

+  // Note that we don't uninstall the gEdkiiPlatformHasAcpiGuid protocol nor

+  // the FDT configuration table if the following call fails. While that will

+  // cause loading of this driver to fail, proceeding with ACPI and DT both

+  // disabled will guarantee a failed boot, and so it is better to leave them

+  // installed in that case.

+  //

+  return InstallHiiPages ();

+

+FreeDtb:

+  if (Dtb != NULL) {

+    FreePool (Dtb);

+  }

+

+  return Status;

+}

diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.h b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.h
new file mode 100644
index 0000000..2369367
--- /dev/null
+++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.h
@@ -0,0 +1,31 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro Limited. All rights reserved.

+*

+*  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 __DT_PLATFORM_DXE_H__

+#define __DT_PLATFORM_DXE_H__

+

+#include <Guid/HiiPlatformSetupFormset.h>

+#include <Guid/DtPlatformFormSet.h>

+

+#define DT_ACPI_SELECT_DT       0x0

+#define DT_ACPI_SELECT_ACPI     0x1

+

+#define DT_ACPI_VARIABLE_NAME   L"DtAcpiPref"

+

+typedef struct {

+  UINT8         Pref;

+  UINT8         Reserved[3];

+} DT_ACPI_VARSTORE_DATA;

+

+#endif

diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
new file mode 100644
index 0000000..45dfd90
--- /dev/null
+++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
@@ -0,0 +1,58 @@
+## @file

+#

+#  Copyright (c) 2017, 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               = 0x00010019

+  BASE_NAME                 = DtPlatformDxe

+  FILE_GUID                 = FC097B3C-2EBD-4A75-A3DA-121DCAB365CC

+  MODULE_TYPE               = DXE_DRIVER

+  VERSION_STRING            = 1.0

+  ENTRY_POINT               = DtPlatformDxeEntryPoint

+

+#

+# The following information is for reference only and not required by the build tools.

+#

+#  VALID_ARCHITECTURES      = IA32 X64 ARM AARCH64

+#

+

+[Sources]

+  DtPlatformDxe.c

+  DtPlatformHii.vfr

+  DtPlatformHii.uni

+

+[Packages]

+  EmbeddedPkg/EmbeddedPkg.dec

+  MdePkg/MdePkg.dec

+  MdeModulePkg/MdeModulePkg.dec

+

+[LibraryClasses]

+  BaseLib

+  DebugLib

+  DtPlatformDtbLoaderLib

+  HiiLib

+  MemoryAllocationLib

+  UefiBootServicesTableLib

+  UefiDriverEntryPoint

+  UefiRuntimeServicesTableLib

+

+[Guids]

+  gDtPlatformFormSetGuid

+  gDtPlatformDefaultDtbFileGuid

+  gEdkiiPlatformHasAcpiGuid

+  gFdtTableGuid

+

+[Depex]

+  gEfiVariableArchProtocolGuid        AND

+  gEfiVariableWriteArchProtocolGuid

diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformHii.uni b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformHii.uni
new file mode 100644
index 0000000..bc995c1
--- /dev/null
+++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformHii.uni
@@ -0,0 +1,27 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.

+*

+*  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.

+*

+**/

+

+#langdef en-US  "English"

+

+#string STR_FORM_SET_TITLE             #language en-US "O/S Hardware Description Selection"

+#string STR_FORM_SET_TITLE_HELP        #language en-US "Press <Enter> to choose between ACPI and DT hardware descriptions."

+

+#string STR_MAIN_FORM_TITLE            #language en-US "O/S Hardware Description Selection"

+#string STR_NULL_STRING                #language en-US ""

+

+#string STR_DT_ACPI_SELECT_PROMPT      #language en-US "O/S Hardware Description"

+#string STR_DT_ACPI_SELECT_HELP        #language en-US "Select the hardware description that will be exposed to the O/S."

+

+#string STR_DT_ACPI_SELECT_DT          #language en-US "Device Tree"

+#string STR_DT_ACPI_SELECT_ACPI        #language en-US "ACPI"

diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformHii.vfr b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformHii.vfr
new file mode 100644
index 0000000..3516746
--- /dev/null
+++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformHii.vfr
@@ -0,0 +1,51 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.

+*

+*  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.

+*

+**/

+

+#include "DtPlatformDxe.h"

+

+//

+// EFI Variable attributes

+//

+#define EFI_VARIABLE_NON_VOLATILE       0x00000001

+#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002

+#define EFI_VARIABLE_RUNTIME_ACCESS     0x00000004

+#define EFI_VARIABLE_READ_ONLY          0x00000008

+

+formset

+  guid      = DT_PLATFORM_FORMSET_GUID,

+  title     = STRING_TOKEN(STR_FORM_SET_TITLE),

+  help      = STRING_TOKEN(STR_FORM_SET_TITLE_HELP),

+  classguid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID,

+

+  efivarstore DT_ACPI_VARSTORE_DATA,

+    attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,  // EFI variable attributes

+    name  = DtAcpiPref,

+    guid  = DT_PLATFORM_FORMSET_GUID;

+

+  form formid = 0x1000,

+    title  = STRING_TOKEN(STR_MAIN_FORM_TITLE);

+

+    oneof varid = DtAcpiPref.Pref,

+        prompt      = STRING_TOKEN(STR_DT_ACPI_SELECT_PROMPT),

+        help        = STRING_TOKEN(STR_DT_ACPI_SELECT_HELP),

+        flags       = NUMERIC_SIZE_1 | INTERACTIVE | RESET_REQUIRED,

+        option text = STRING_TOKEN(STR_DT_ACPI_SELECT_DT), value = DT_ACPI_SELECT_DT, flags = DEFAULT;

+        option text = STRING_TOKEN(STR_DT_ACPI_SELECT_ACPI), value = DT_ACPI_SELECT_ACPI, flags = 0;

+    endoneof;

+

+    subtitle text = STRING_TOKEN(STR_NULL_STRING);

+

+  endform;

+

+endformset;

diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec
index e41415e..c4798b9 100644
--- a/EmbeddedPkg/EmbeddedPkg.dec
+++ b/EmbeddedPkg/EmbeddedPkg.dec
@@ -45,6 +45,7 @@
   GdbSerialLib|Include/Library/GdbSerialLib.h

   DebugAgentTimerLib|Include/Library/DebugAgentTimerLib.h

 

+  DtPlatformDtbLoaderLib|Include/Library/DtPlatformDtbLoaderLib.h

 

 [Guids.common]

   gEmbeddedTokenSpaceGuid       = { 0xe0d8ca17, 0x4276, 0x4386, { 0xbb, 0x79, 0x48, 0xcb, 0x81, 0x3d, 0x3c, 0x4f }}

@@ -56,6 +57,18 @@
   gFdtHobGuid   = { 0x16958446, 0x19B7, 0x480B, { 0xB0, 0x47, 0x74, 0x85, 0xAD, 0x3F, 0x71, 0x6D } }

   gFdtVariableGuid = { 0x25a4fd4a, 0x9703, 0x4ba9, { 0xa1, 0x90, 0xb7, 0xc8, 0x4e, 0xfb, 0x3e, 0x57 } }

 

+  ## Include/Guid/PlatformHasAcpi.h

+  gEdkiiPlatformHasAcpiGuid = { 0xf0966b41, 0xc23f, 0x41b9, { 0x96, 0x04, 0x0f, 0xf7, 0xe1, 0x11, 0x96, 0x5a } }

+

+  ## Include/Guid/PlatformHasDeviceTree.h

+  gEdkiiPlatformHasDeviceTreeGuid = { 0x7ebb920d, 0x1aaf, 0x46d9, { 0xb2, 0xaf, 0x54, 0x1e, 0x1d, 0xce, 0x14, 0x8b } }

+

+  # HII form set GUID for DtPlatformDxe driver

+  gDtPlatformFormSetGuid = { 0x2b7a240d, 0xd5ad, 0x4fd6, { 0xbe, 0x1c, 0xdf, 0xa4, 0x41, 0x5f, 0x55, 0x26 } }

+

+  # File GUID for default DTB image embedded in the firmware volume

+  gDtPlatformDefaultDtbFileGuid = { 0x25462cda, 0x221f, 0x47df, { 0xac, 0x1d, 0x25, 0x9c, 0xfa, 0xa4, 0xe3, 0x26 } }

+

 [Protocols.common]

   gHardwareInterruptProtocolGuid =  { 0x2890B3EA, 0x053D, 0x1643, { 0xAD, 0x0C, 0xD6, 0x48, 0x08, 0xDA, 0x3F, 0xF1 } }

   gEfiDebugSupportPeriodicCallbackProtocolGuid = { 0x9546e07c, 0x2cbb, 0x4c88, { 0x98, 0x6c, 0xcd, 0x34, 0x10, 0x86, 0xf0, 0x44 } }

diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc
index ba4f1ea..16b368e 100644
--- a/EmbeddedPkg/EmbeddedPkg.dsc
+++ b/EmbeddedPkg/EmbeddedPkg.dsc
@@ -109,6 +109,9 @@
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf

   UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf

 

+  DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf

+  DtPlatformDtbLoaderLib|EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.inf

+

 [LibraryClasses.common.DXE_DRIVER]

   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf

   ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf

@@ -247,6 +250,7 @@
   EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf

   EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf

   EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf

+  EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.inf

 

   EmbeddedPkg/Ebl/Ebl.inf

 ####  EmbeddedPkg/EblExternCmd/EblExternCmd.inf

@@ -290,5 +294,7 @@
   EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf

   EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf

 

+  EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf

+

 [Components.IA32, Components.X64, Components.IPF, Components.ARM]

   EmbeddedPkg/GdbStub/GdbStub.inf

diff --git a/EmbeddedPkg/Include/Guid/DtPlatformDefaultDtbFile.h b/EmbeddedPkg/Include/Guid/DtPlatformDefaultDtbFile.h
new file mode 100644
index 0000000..c44b4d9
--- /dev/null
+++ b/EmbeddedPkg/Include/Guid/DtPlatformDefaultDtbFile.h
@@ -0,0 +1,23 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro Limited. All rights reserved.

+*

+*  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 __DT_PLATFORM_DEFAULT_DTB_FILE_H__

+#define __DT_PLATFORM_DEFAULT_DTB_FILE_H__

+

+#define DT_PLATFORM_DEFAULT_DTB_FILE_GUID  \

+  { 0x25462cda, 0x221f, 0x47df, { 0xac, 0x1d, 0x25, 0x9c, 0xfa, 0xa4, 0xe3, 0x26 } }

+

+extern EFI_GUID gDtPlatformDefaultDtbFileGuid;

+

+#endif

diff --git a/EmbeddedPkg/Include/Guid/DtPlatformFormSet.h b/EmbeddedPkg/Include/Guid/DtPlatformFormSet.h
new file mode 100644
index 0000000..71e3e7e
--- /dev/null
+++ b/EmbeddedPkg/Include/Guid/DtPlatformFormSet.h
@@ -0,0 +1,23 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro Limited. All rights reserved.

+*

+*  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 __DT_PLATFORM_FORMSET_H__

+#define __DT_PLATFORM_FORMSET_H__

+

+#define DT_PLATFORM_FORMSET_GUID  \

+  { 0x2b7a240d, 0xd5ad, 0x4fd6, { 0xbe, 0x1c, 0xdf, 0xa4, 0x41, 0x5f, 0x55, 0x26 } }

+

+extern EFI_GUID gDtPlatformFormSetGuid;

+

+#endif

diff --git a/EmbeddedPkg/Include/Guid/PlatformHasAcpi.h b/EmbeddedPkg/Include/Guid/PlatformHasAcpi.h
new file mode 100644
index 0000000..ad51782
--- /dev/null
+++ b/EmbeddedPkg/Include/Guid/PlatformHasAcpi.h
@@ -0,0 +1,35 @@
+/** @file

+  EDKII Platform Has ACPI GUID

+

+  A NULL protocol instance with this GUID in the DXE protocol database, and/or

+  a NULL PPI with this GUID in the PPI database, implies that the platform

+  provides the operating system with an ACPI-based hardware description. Note

+  that this is not necessarily exclusive with different kinds of hardware

+  description (for example, a Device Tree-based one). A platform driver and/or

+  PEIM is supposed to produce a single instance of the protocol and/or PPI

+  (with NULL contents), if appropriate.

+

+  Copyright (C) 2017, Red Hat, Inc.

+

+  This program and the accompanying materials are licensed and made available

+  under the terms and conditions of the BSD License that 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 __EDKII_PLATFORM_HAS_ACPI_H__

+#define __EDKII_PLATFORM_HAS_ACPI_H__

+

+#define EDKII_PLATFORM_HAS_ACPI_GUID \

+  { \

+    0xf0966b41, 0xc23f, 0x41b9, \

+    { 0x96, 0x04, 0x0f, 0xf7, 0xe1, 0x11, 0x96, 0x5a } \

+  }

+

+extern EFI_GUID gEdkiiPlatformHasAcpiGuid;

+

+#endif

diff --git a/EmbeddedPkg/Include/Guid/PlatformHasDeviceTree.h b/EmbeddedPkg/Include/Guid/PlatformHasDeviceTree.h
new file mode 100644
index 0000000..a9bc512
--- /dev/null
+++ b/EmbeddedPkg/Include/Guid/PlatformHasDeviceTree.h
@@ -0,0 +1,35 @@
+/** @file

+  EDKII Platform Has Device Tree GUID

+

+  A NULL protocol instance with this GUID in the DXE protocol database, and/or

+  a NULL PPI with this GUID in the PPI database, implies that the platform

+  provides the operating system with a Device Tree-based hardware description.

+  Note that this is not necessarily exclusive with different kinds of hardware

+  description (for example, an ACPI-based one). A platform driver and/or PEIM

+  is supposed to produce a single instance of the protocol and/or PPI (with

+  NULL contents), if appropriate.

+

+  Copyright (C) 2017, Red Hat, Inc.

+

+  This program and the accompanying materials are licensed and made available

+  under the terms and conditions of the BSD License that 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 __EDKII_PLATFORM_HAS_DEVICE_TREE_H__

+#define __EDKII_PLATFORM_HAS_DEVICE_TREE_H__

+

+#define EDKII_PLATFORM_HAS_DEVICE_TREE_GUID \

+  { \

+    0x7ebb920d, 0x1aaf, 0x46d9, \

+    { 0xb2, 0xaf, 0x54, 0x1e, 0x1d, 0xce, 0x14, 0x8b } \

+  }

+

+extern EFI_GUID gEdkiiPlatformHasDeviceTreeGuid;

+

+#endif

diff --git a/EmbeddedPkg/Include/Library/DtPlatformDtbLoaderLib.h b/EmbeddedPkg/Include/Library/DtPlatformDtbLoaderLib.h
new file mode 100644
index 0000000..b2fbf4a
--- /dev/null
+++ b/EmbeddedPkg/Include/Library/DtPlatformDtbLoaderLib.h
@@ -0,0 +1,39 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.

+*

+*  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 __DT_PLATFORM_DTB_LOADER_LIB_H__

+#define __DT_PLATFORM_DTB_LOADER_LIB_H__

+

+#include <Uefi/UefiBaseType.h>

+

+/**

+  Return a pool allocated copy of the DTB image that is appropriate for

+  booting the current platform via DT.

+

+  @param[out]   Dtb                   Pointer to the DTB copy

+  @param[out]   DtbSize               Size of the DTB copy

+

+  @retval       EFI_SUCCESS           Operation completed successfully

+  @retval       EFI_NOT_FOUND         No suitable DTB image could be located

+  @retval       EFI_OUT_OF_RESOURCES  No pool memory available

+

+**/

+EFI_STATUS

+EFIAPI

+DtPlatformLoadDtb (

+  OUT   VOID        **Dtb,

+  OUT   UINTN       *DtbSize

+  );

+

+#endif

diff --git a/EmbeddedPkg/Include/Protocol/Abootimg.h b/EmbeddedPkg/Include/Protocol/Abootimg.h
index c85dad2..7452df6 100644
--- a/EmbeddedPkg/Include/Protocol/Abootimg.h
+++ b/EmbeddedPkg/Include/Protocol/Abootimg.h
@@ -33,8 +33,8 @@
 typedef

 EFI_STATUS

 (EFIAPI *ABOOTIMG_UPDATE_DTB) (

-  IN  EFI_PHYSICAL_ADDRESS    OrigDtbBase;

-  OUT EFI_PHYSICAL_ADDRESS   *NewDtbBase;

+  IN  EFI_PHYSICAL_ADDRESS    OrigDtbBase,

+  OUT EFI_PHYSICAL_ADDRESS   *NewDtbBase

   );

 

 struct _ABOOTIMG_PROTOCOL {

diff --git a/EmbeddedPkg/Library/AbootimgLib/AbootimgLib.c b/EmbeddedPkg/Library/AbootimgLib/AbootimgLib.c
index a8db3ac..b4cd1e4 100644
--- a/EmbeddedPkg/Library/AbootimgLib/AbootimgLib.c
+++ b/EmbeddedPkg/Library/AbootimgLib/AbootimgLib.c
@@ -268,23 +268,26 @@
 
   ASSERT (IS_POWER_OF_2 (Header->PageSize));
 
-  Address = (EFI_PHYSICAL_ADDRESS)(UINTN)Header->RamdiskAddress;
-  Status = gBS->AllocatePages (
-                  AllocateAddress, EfiBootServicesData,
-                  EFI_SIZE_TO_PAGES (Header->RamdiskSize), &Address);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  Source = (VOID *) (BootImgBytePtr + Header->PageSize +
-                     ALIGN_VALUE (Header->KernelSize, Header->PageSize));
-  CopyMem ((VOID *)(UINTN)Address, Source, Header->RamdiskSize);
-  // Set the ramdisk in command line arguments
-  if (KernelArgs != NULL) {
-    UnicodeSPrint (
-      (CHAR16 *)KernelArgs + StrLen (KernelArgs), BOOTIMG_KERNEL_ARGS_SIZE,
-      L" initrd=0x%x,0x%x",
-      (UINTN)Address, Header->RamdiskSize
-      );
+  Status = EFI_SUCCESS;
+  if (Header->RamdiskAddress && Header->RamdiskSize) {
+    Address = (EFI_PHYSICAL_ADDRESS)(UINTN)Header->RamdiskAddress;
+    Status = gBS->AllocatePages (
+                    AllocateAddress, EfiBootServicesData,
+                    EFI_SIZE_TO_PAGES (Header->RamdiskSize), &Address);
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+    Source = (VOID *) (BootImgBytePtr + Header->PageSize +
+                       ALIGN_VALUE (Header->KernelSize, Header->PageSize));
+    CopyMem ((VOID *)(UINTN)Address, Source, Header->RamdiskSize);
+    // Set the ramdisk in command line arguments
+    if (KernelArgs != NULL) {
+      UnicodeSPrint (
+        (CHAR16 *)KernelArgs + StrLen (KernelArgs), BOOTIMG_KERNEL_ARGS_SIZE,
+        L" initrd=0x%x,0x%x",
+        (UINTN)Address, Header->RamdiskSize
+        );
+    }
   }
   return Status;
 }
diff --git a/EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.c b/EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.c
new file mode 100644
index 0000000..313d0b1
--- /dev/null
+++ b/EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.c
@@ -0,0 +1,60 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.

+*

+*  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.

+*

+**/

+

+#include <PiDxe.h>

+

+#include <Library/BaseLib.h>

+#include <Library/DxeServicesLib.h>

+#include <Library/MemoryAllocationLib.h>

+

+/**

+  Return a pool allocated copy of the DTB image that is appropriate for

+  booting the current platform via DT.

+

+  @param[out]   Dtb                   Pointer to the DTB copy

+  @param[out]   DtbSize               Size of the DTB copy

+

+  @retval       EFI_SUCCESS           Operation completed successfully

+  @retval       EFI_NOT_FOUND         No suitable DTB image could be located

+  @retval       EFI_OUT_OF_RESOURCES  No pool memory available

+

+**/

+EFI_STATUS

+EFIAPI

+DtPlatformLoadDtb (

+  OUT   VOID        **Dtb,

+  OUT   UINTN       *DtbSize

+  )

+{

+  EFI_STATUS      Status;

+  VOID            *OrigDtb;

+  VOID            *CopyDtb;

+  UINTN           OrigDtbSize;

+

+  Status = GetSectionFromAnyFv (&gDtPlatformDefaultDtbFileGuid,

+             EFI_SECTION_RAW, 0, &OrigDtb, &OrigDtbSize);

+  if (EFI_ERROR (Status)) {

+    return EFI_NOT_FOUND;

+  }

+

+  CopyDtb = AllocateCopyPool (OrigDtbSize, OrigDtb);

+  if (CopyDtb == NULL) {

+    return EFI_OUT_OF_RESOURCES;

+  }

+

+  *Dtb = CopyDtb;

+  *DtbSize = OrigDtbSize;

+

+  return EFI_SUCCESS;

+}

diff --git a/EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.inf b/EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.inf
new file mode 100644
index 0000000..9d49fc5
--- /dev/null
+++ b/EmbeddedPkg/Library/DxeDtPlatformDtbLoaderLibDefault/DxeDtPlatformDtbLoaderLibDefault.inf
@@ -0,0 +1,36 @@
+/** @file

+*

+*  Copyright (c) 2017, Linaro, Ltd. All rights reserved.

+*

+*  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                    = 0x00010019

+  BASE_NAME                      = DxeDtPlatformDtbLoaderLibDefault

+  FILE_GUID                      = 419a1910-70da-4c99-8696-ba81a57be508

+  MODULE_TYPE                    = DXE_DRIVER

+  VERSION_STRING                 = 1.0

+  LIBRARY_CLASS                  = DtPlatformDtbLoaderLib|DXE_DRIVER

+

+[Sources]

+  DxeDtPlatformDtbLoaderLibDefault.c

+

+[Packages]

+  MdePkg/MdePkg.dec

+  EmbeddedPkg/EmbeddedPkg.dec

+

+[LibraryClasses]

+  BaseLib

+  DxeServicesLib

+  MemoryAllocationLib

+

+[Guids]

+  gDtPlatformDefaultDtbFileGuid

diff --git a/EmbeddedPkg/Library/PlatformHasAcpiLib/PlatformHasAcpiLib.c b/EmbeddedPkg/Library/PlatformHasAcpiLib/PlatformHasAcpiLib.c
new file mode 100644
index 0000000..2c73e71
--- /dev/null
+++ b/EmbeddedPkg/Library/PlatformHasAcpiLib/PlatformHasAcpiLib.c
@@ -0,0 +1,36 @@
+/** @file

+  A hook-in library for MdeModulePkg/Universal/Acpi/AcpiTableDxe.

+

+  Plugging this library instance into AcpiTableDxe makes

+  EFI_ACPI_TABLE_PROTOCOL and (if enabled) EFI_ACPI_SDT_PROTOCOL depend on the

+  platform's dynamic decision whether to expose an ACPI-based hardware

+  description to the operating system.

+

+  Universal and platform specific DXE drivers that produce ACPI tables depend

+  on EFI_ACPI_TABLE_PROTOCOL / EFI_ACPI_SDT_PROTOCOL in turn.

+

+  Copyright (C) 2017, Red Hat, Inc.

+

+  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.

+**/

+

+#include <Base.h>

+

+RETURN_STATUS

+EFIAPI

+PlatformHasAcpiInitialize (

+  VOID

+  )

+{

+  //

+  // Do nothing, just imbue AcpiTableDxe with a protocol dependency on

+  // EDKII_PLATFORM_HAS_ACPI_GUID.

+  //

+  return RETURN_SUCCESS;

+}

diff --git a/EmbeddedPkg/Library/PlatformHasAcpiLib/PlatformHasAcpiLib.inf b/EmbeddedPkg/Library/PlatformHasAcpiLib/PlatformHasAcpiLib.inf
new file mode 100644
index 0000000..6268293
--- /dev/null
+++ b/EmbeddedPkg/Library/PlatformHasAcpiLib/PlatformHasAcpiLib.inf
@@ -0,0 +1,40 @@
+## @file

+# A hook-in library for MdeModulePkg/Universal/Acpi/AcpiTableDxe.

+#

+# Plugging this library instance into AcpiTableDxe makes

+# EFI_ACPI_TABLE_PROTOCOL and (if enabled) EFI_ACPI_SDT_PROTOCOL depend on the

+# platform's dynamic decision whether to expose an ACPI-based hardware

+# description to the operating system.

+#

+# Universal and platform specific DXE drivers that produce ACPI tables depend

+# on EFI_ACPI_TABLE_PROTOCOL / EFI_ACPI_SDT_PROTOCOL in turn.

+#

+# Copyright (C) 2017, Red Hat, Inc.

+#

+# 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                    = 1.25

+  BASE_NAME                      = PlatformHasAcpiLib

+  FILE_GUID                      = 29beb028-0958-447b-be0a-12229235d77d

+  MODULE_TYPE                    = BASE

+  VERSION_STRING                 = 1.0

+  LIBRARY_CLASS                  = PlatformHasAcpiLib|DXE_DRIVER

+  CONSTRUCTOR                    = PlatformHasAcpiInitialize

+

+[Sources]

+  PlatformHasAcpiLib.c

+

+[Packages]

+  EmbeddedPkg/EmbeddedPkg.dec

+  MdePkg/MdePkg.dec

+

+[Depex]

+  gEdkiiPlatformHasAcpiGuid

diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
index 761dc8e..8c9aad9 100644
--- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
+++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
@@ -778,11 +778,14 @@
   UINTN                                 UfsHcBase;

   UINT32                                Index;

   UFS_CONFIG_DESC                       Config;

+  UFS_DEV_DESC                          Dev;

+  UINT32                                DevQuirks;

 

   Status    = EFI_SUCCESS;

   UfsHc     = NULL;

   Private   = NULL;

   UfsHcBase = 0;

+  DevQuirks = 0;

 

   DEBUG ((EFI_D_INFO, "==UfsPassThru Start== Controller = %x\n", Controller));

 

@@ -855,6 +858,22 @@
 

   MicroSecondDelay (100000);

 

+  Status = UfsRwDeviceDesc (Private, TRUE, UfsDeviceDesc, 0, 0, &Dev, sizeof (UFS_DEV_DESC));

+  if (EFI_ERROR (Status)) {

+    DEBUG ((EFI_D_ERROR, "Ufs Get Dev Descriptor Error, Status = %r\n", Status));

+    goto Error;

+  }

+

+  if (SwapBytes16(Dev.ManufacturerId) == UFS_VENDOR_SKHYNIX) {

+    DevQuirks |= UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME;

+  }

+

+  Status = UfsHc->PhySetPowerMode (UfsHc, DevQuirks);

+  if (EFI_ERROR (Status)) {

+    DEBUG ((EFI_D_ERROR, "Phy Set Power Mode Fails, Status = %r\n", Status));

+    goto Error;

+  }

+

   //

   // Get Ufs Device's Lun Info by reading Configuration Descriptor.

   //

diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
index af13757..ed1249b 100644
--- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
+++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
@@ -45,6 +45,9 @@
 #define UFS_MAX_LUNS                12

 #define UFS_WLUN_PREFIX             0xC1

 

+#define UFS_VENDOR_SKHYNIX				0x1AD

+#define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME	(1 << 0)

+

 typedef struct {

   UINT8    Lun[UFS_MAX_LUNS];

   UINT16   BitMask:12;              // Bit 0~7 is 1/1 mapping to common luns. Bit 8~11 is 1/1 mapping to well-known luns.

diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
index e53347d..fbb31ed 100644
--- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
+++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
@@ -811,12 +811,14 @@
   UINT32        Data;

   EFI_STATUS    Status;

 

-  Status = UfsMmioRead32 (Private, UFS_HC_UTRLRSR_OFFSET, &Data);

-  if (EFI_ERROR (Status)) {

-    return Status;

-  }

-

-  if ((Data & UFS_HC_UTRLRSR) != UFS_HC_UTRLRSR) {

+  for (;;) {

+    Status = UfsMmioRead32 (Private, UFS_HC_UTRLRSR_OFFSET, &Data);

+    if (EFI_ERROR (Status)) {

+      return Status;

+    }

+    if ((Data & UFS_HC_UTRLRSR) == UFS_HC_UTRLRSR) {

+      break;

+    }

     Status = UfsMmioWrite32 (Private, UFS_HC_UTRLRSR_OFFSET, UFS_HC_UTRLRSR);

     if (EFI_ERROR (Status)) {

       return Status;

@@ -2113,12 +2115,6 @@
     return Status;

   }

 

-  Status = UfsHc->PhySetPowerMode (UfsHc);

-  if (EFI_ERROR (Status)) {

-    DEBUG ((EFI_D_ERROR, "UfsControllerInit: Phy Set Power Mode Fails, Status = %r\n", Status));

-    return Status;

-  }

-

   Status = UfsInitTaskManagementRequestList (Private);

   if (EFI_ERROR (Status)) {

     DEBUG ((EFI_D_ERROR, "UfsControllerInit: Task management list initialization Fails, Status = %r\n", Status));

diff --git a/MdeModulePkg/Include/Protocol/UfsHostController.h b/MdeModulePkg/Include/Protocol/UfsHostController.h
index 66cd629..f98be70 100644
--- a/MdeModulePkg/Include/Protocol/UfsHostController.h
+++ b/MdeModulePkg/Include/Protocol/UfsHostController.h
@@ -230,7 +230,8 @@
 typedef

 EFI_STATUS

 (EFIAPI *EDKII_UFS_HC_PHY_SET_POWER_MODE)(

-  IN     EDKII_UFS_HOST_CONTROLLER_PROTOCOL        *This

+  IN     EDKII_UFS_HOST_CONTROLLER_PROTOCOL        *This,

+  IN     UINT32                                    DevQuirks

   );

 

 ///