From 6f1b9fd8315dfd50cd14df4127b56595e63427a2 Mon Sep 17 00:00:00 2001 From: silime <1776303288@qq.com> Date: Thu, 3 Mar 2022 08:28:28 +0800 Subject: [PATCH] sdm845Pkg:Add SimpleInit ,Update AcpiTables for LG G7 Update submodule thanks form @AKAsaliza --- sdm845Pkg/AcpiTables | 2 +- sdm845Pkg/Devices/judyln.dsc | 8 +- sdm845Pkg/Devices/judyln.fdf | 647 ++++++++++++++++++++++++ sdm845Pkg/FdtBlob/sdm845-lge-judyln.dtb | Bin 0 -> 95262 bytes 4 files changed, 654 insertions(+), 3 deletions(-) create mode 100644 sdm845Pkg/Devices/judyln.fdf create mode 100644 sdm845Pkg/FdtBlob/sdm845-lge-judyln.dtb diff --git a/sdm845Pkg/AcpiTables b/sdm845Pkg/AcpiTables index 159f8df..186a8d9 160000 --- a/sdm845Pkg/AcpiTables +++ b/sdm845Pkg/AcpiTables @@ -1 +1 @@ -Subproject commit 159f8dfb2e6421e5e639df4434b1d2a6a31cd9b5 +Subproject commit 186a8d995c277c1fc392669822ede5b9509fc5b5 diff --git a/sdm845Pkg/Devices/judyln.dsc b/sdm845Pkg/Devices/judyln.dsc index 5eb45d0..3fd99fb 100644 --- a/sdm845Pkg/Devices/judyln.dsc +++ b/sdm845Pkg/Devices/judyln.dsc @@ -7,15 +7,19 @@ SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE SKUID_IDENTIFIER = DEFAULT - FLASH_DEFINITION = sdm845Pkg/Devices/845.fdf + FLASH_DEFINITION = sdm845Pkg/Devices/judyln.fdf !include sdm845Pkg/sdm845Pkg.dsc - +[BuildOptions.common] + GCC:*_*_AARCH64_CC_FLAGS = -DENABLE_SIMPLE_INIT -DENABLE_LINUX_SIMPLE_MASS_STORAGE [PcdsFixedAtBuild.common] gsdm845PkgTokenSpaceGuid.PcdMipiFrameBufferWidth|1440 gsdm845PkgTokenSpaceGuid.PcdMipiFrameBufferHeight|3120 + # Simple Init + gSimpleInitTokenSpaceGuid.PcdGuiDefaultDPI|440 + gsdm845PkgTokenSpaceGuid.PcdDeviceVendor|"LG" gsdm845PkgTokenSpaceGuid.PcdDeviceProduct|"G7" gsdm845PkgTokenSpaceGuid.PcdDeviceCodeName|"judyln" diff --git a/sdm845Pkg/Devices/judyln.fdf b/sdm845Pkg/Devices/judyln.fdf new file mode 100644 index 0000000..1944e24 --- /dev/null +++ b/sdm845Pkg/Devices/judyln.fdf @@ -0,0 +1,647 @@ +# +# Copyright (c) 2018, 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. +# + +################################################################################ +# +# FD Section +# The [FD] Section is made up of the definition statements and a +# description of what goes into the Flash Device Image. Each FD section +# defines one flash "device" image. A flash device image may be one of +# the following: Removable media bootable image (like a boot floppy +# image,) an Option ROM image (that would be "flashed" into an add-in +# card,) a System "Flash" image (that would be burned into a system's +# flash) or an Update ("Capsule") image that will be used to update and +# existing system flash. +# +################################################################################ + +[FD.sdm845Pkg_UEFI] +BaseAddress = 0xd0000000|gArmTokenSpaceGuid.PcdFdBaseAddress # The base address of the Firmware in NOR Flash. +Size = 0x00600000|gArmTokenSpaceGuid.PcdFdSize # The size in bytes of the FLASH Device +ErasePolarity = 1 + +# This one is tricky, it must be: BlockSize * NumBlocks = Size +BlockSize = 0x00001000 +NumBlocks = 0x600 + +################################################################################ +# +# Following are lists of FD Region layout which correspond to the locations of different +# images within the flash device. +# +# Regions must be defined in ascending order and may not overlap. +# +# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by +# the pipe "|" character, followed by the size of the region, also in hex with the leading +# "0x" characters. Like: +# Offset|Size +# PcdOffsetCName|PcdSizeCName +# RegionType +# +################################################################################ + +# from ArmVirtPkg/ArmVirtQemuKernel.fdf +# +# Implement the Linux kernel header layout so that the loader will identify +# it as something bootable, and execute it with a FDT pointer in x0 or r2. +# +0x00000000|0x00008000 +DATA = { + 0x01, 0x00, 0x00, 0x10, # code0: adr x1, . + 0xff, 0x1f, 0x00, 0x14, # code1: b 0x8000 + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, # text_offset: 512 KB + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, # image_size: 2 MB + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # flags + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res2 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res3 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res4 + 0x41, 0x52, 0x4d, 0x64, # magic: "ARM\x64" + 0x00, 0x00, 0x00, 0x00 # res5 +} + +0x00008000|0x005f8000 +gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize +FV = FVMAIN_COMPACT + + +################################################################################ +# +# FV Section +# +# [FV] section is used to define what components or modules are placed within a flash +# device file. This section also defines order the components and modules are positioned +# within the image. The [FV] section consists of define statements, set statements and +# module statements. +# +################################################################################ + +[FV.FvMain] +BlockSize = 0x40 +NumBlocks = 0 # This FV gets compressed so make it just big enough +FvAlignment = 8 # FV alignment and FV attributes setting. +ERASE_POLARITY = 1 +MEMORY_MAPPED = TRUE +STICKY_WRITE = TRUE +LOCK_CAP = TRUE +LOCK_STATUS = TRUE +WRITE_DISABLED_CAP = TRUE +WRITE_ENABLED_CAP = TRUE +WRITE_STATUS = TRUE +WRITE_LOCK_CAP = TRUE +WRITE_LOCK_STATUS = TRUE +READ_DISABLED_CAP = TRUE +READ_ENABLED_CAP = TRUE +READ_STATUS = TRUE +READ_LOCK_CAP = TRUE +READ_LOCK_STATUS = TRUE + +APRIORI DXE { + + # + # PI DXE Drivers producing Architectural Protocols (EFI Services) + # + INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf + INF MdeModulePkg/Core/Dxe/DxeMain.inf + INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf + INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf + INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf + INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf + INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf + INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf + + INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf + + FILE DRIVER = 9A5163E7-5C29-453F-825C-837A46A81E15 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.efi + SECTION UI = "SerialDxe" + } + + FILE DRIVER = f541d663-4a48-40aa-aabf-ff158ccae34c { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.efi + SECTION UI = "SmemDxe" + } + + FILE DRIVER = 8E9BD160-B184-11DF-94E2-0800200C9A66 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALSys/DALSys.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALSys/DALSys.efi + SECTION UI = "DALSys" + } + + FILE DRIVER = 8681CC5A-0DF6-441E-B4B8-E915C538F067 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.efi + SECTION UI = "HWIODxeDriver" + } + + FILE DRIVER = 10e193df-9966-44e7-b17c-59dd831e20fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.depex + SECTION PE32 = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.efi + SECTION UI = "ChipInfo" + } + + FILE DRIVER = B105211B-BBBD-4ADD-A3B0-D1CF4A52154C { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.efi + SECTION UI = "PlatformInfoDxeDriver" + } + + FILE DRIVER = 9A00771F-36D4-4DD5-8916-C48ED9B16B86 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.depex + SECTION PE32 = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.efi + SECTION UI = "HALIOMMU" + } + + INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf + INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf + + FILE DRIVER = E43128A8-8692-42B6-8AFA-676158578D18 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.efi + SECTION UI = "ULogDxe" + } + + FILE DRIVER = ABA01FF8-2CCB-4E12-8B2E-CD3F4A742993 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.efi + SECTION UI = "CmdDbDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219711 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.efi + SECTION UI = "NpaDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219766 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.efi + SECTION UI = "RpmhDxe" + } + + FILE DRIVER = B43C22DB-6333-490C-872D-0A73439059FD { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.efi + SECTION UI = "PdcDxe" + } + + FILE DRIVER = 4DB5DEA6-5302-4D1A-8A82-677A683B0D29 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.efi + SECTION UI = "ClockDxe" + } + + INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf + INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf + + FILE DRIVER = 0d35cd8e-97ea-4f9a-96af-0f0d89f76567 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UFSDxe/UFSDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UFSDxe/UFSDxe.efi + SECTION UI = "UFSDxe" + } + + INF FatPkg/EnhancedFatDxe/Fat.inf + INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf + INF MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf + + FILE DRIVER = 2a7b4bef-80cd-49e1-b473-374ba4d673fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SPMI/SPMI.depex + SECTION PE32 = sdm845Pkg/Binary/845/SPMI/SPMI.efi + SECTION UI = "SPMI" + } + + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf + INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf + INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf + INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf + INF MdeModulePkg/Universal/PrintDxe/PrintDxe.inf + INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf + INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf + INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf + INF SecurityPkg/VariableAuthenticated/SecureBootDefaultKeysDxe/SecureBootDefaultKeysDxe.inf + + INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf + + INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf + + FILE DRIVER = AF9763A2-033B-4109-8E17-56A98D380C92 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.efi + SECTION UI = "DALTLMM" + } + + FILE DRIVER = 04DE8591-D2B3-4077-BBBE-B12070094EB6 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/I2C/I2C.depex + SECTION PE32 = sdm845Pkg/Binary/845/I2C/I2C.efi + SECTION UI = "I2C" + } + + FILE DRIVER = 5776232e-082d-4b75-9a0e-fe1d13f7a5d9 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.efi + SECTION UI = "PmicDxe" + } + + INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf + INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf + INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf + + FILE DRIVER = 5bd181db-0487-4f1a-ae73-820e165611b3 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.efi + SECTION UI = "ButtonsDxe" + } + + FILE DRIVER = 11faed4c-b21f-4d88-8e48-c4c28a1e50df { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.efi + SECTION UI = "UsbPwrCtrlDxe" + } + + FILE DRIVER = 94f8a6a7-dc34-4101-88c1-99179cceae83 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.efi + SECTION UI = "UsbfnDwc3Dxe" + } + + FILE DRIVER = beb12bee-f6e1-11e1-9fb8-6c626de4aeb1 { + SECTION PE32 = sdm845Pkg/Binary/845/XhciPciEmulation/XhciPciEmulation.efi + SECTION UI = "XhciPciEmulation" + } + + FILE DRIVER = b7f50e91-a759-412c-ade4-dcd03e7f7c28 { + SECTION PE32 = sdm845Pkg/Binary/845/XhciDxe/XhciDxe.efi + SECTION UI = "XhciDxe" + } + INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf + INF MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouseDxe.inf + INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf + + FILE DRIVER = 2d2e62cf-9ecf-43b7-8219-94e7fc713dfe { + SECTION PE32 = sdm845Pkg/Binary/845/UsbKbDxe/UsbKbDxe.efi + SECTION UI = "UsbKbDxe" + } + + FILE DRIVER = cd823a4d-7dec-4531-ae5d-4134fa4127b8 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.efi + SECTION UI = "UsbConfigDxe" + } + + FILE DRIVER = 0A134F0E-075E-40B3-9C63-3B3906804663 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.efi + SECTION UI = "UsbInitDxe" + } + + FILE DRIVER = 3299a266-15f0-4346-8318-716336736d3e { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.efi + SECTION UI = "UsbDeviceDxe" + } + + FILE DRIVER = 7DB0793A-4402-4BE1-906E-D0FABAD2707E { + SECTION PE32 = sdm845Pkg/Binary/845/DDRInfoDxe/DDRInfoDxe.efi + SECTION UI = "DDRInfoDxe" + } +} + + INF MdeModulePkg/Core/Dxe/DxeMain.inf + + # + # PI DXE Drivers producing Architectural Protocols (EFI Services) + # + INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf + INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf + INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf + INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf +!include ArmPlatformPkg/SecureBootDefaultKeys.fdf.inc + INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf + INF SecurityPkg/VariableAuthenticated/SecureBootDefaultKeysDxe/SecureBootDefaultKeysDxe.inf + INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf + INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf + INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf + INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf + INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf + + # + # Multiple Console IO support + # + INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf + INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf + INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf + INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf + + INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf + INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf + + INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf + + FILE DRIVER = 9A5163E7-5C29-453F-825C-837A46A81E15 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.efi + SECTION UI = "SerialDxe" + } + + FILE DRIVER = f541d663-4a48-40aa-aabf-ff158ccae34c { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.efi + SECTION UI = "SmemDxe" + } + + FILE DRIVER = 8E9BD160-B184-11DF-94E2-0800200C9A66 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALSys/DALSys.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALSys/DALSys.efi + SECTION UI = "DALSys" + } + + FILE DRIVER = 8681CC5A-0DF6-441E-B4B8-E915C538F067 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.efi + SECTION UI = "HWIODxeDriver" + } + + FILE DRIVER = 10e193df-9966-44e7-b17c-59dd831e20fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.depex + SECTION PE32 = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.efi + SECTION UI = "ChipInfo" + } + + FILE DRIVER = B105211B-BBBD-4ADD-A3B0-D1CF4A52154C { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.efi + SECTION UI = "PlatformInfoDxeDriver" + } + + FILE DRIVER = 9A00771F-36D4-4DD5-8916-C48ED9B16B86 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.depex + SECTION PE32 = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.efi + SECTION UI = "HALIOMMU" + } + + FILE DRIVER = E43128A8-8692-42B6-8AFA-676158578D18 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.efi + SECTION UI = "ULogDxe" + } + + FILE DRIVER = ABA01FF8-2CCB-4E12-8B2E-CD3F4A742993 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.efi + SECTION UI = "CmdDbDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219711 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.efi + SECTION UI = "NpaDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219766 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.efi + SECTION UI = "RpmhDxe" + } + + FILE DRIVER = B43C22DB-6333-490C-872D-0A73439059FD { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.efi + SECTION UI = "PdcDxe" + } + + FILE DRIVER = 4DB5DEA6-5302-4D1A-8A82-677A683B0D29 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.efi + SECTION UI = "ClockDxe" + } + + FILE DRIVER = AF9763A2-033B-4109-8E17-56A98D380C92 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.efi + SECTION UI = "DALTLMM" + } + + FILE DRIVER = 04DE8591-D2B3-4077-BBBE-B12070094EB6 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/I2C/I2C.depex + SECTION PE32 = sdm845Pkg/Binary/845/I2C/I2C.efi + SECTION UI = "I2C" + } + + FILE DRIVER = 2a7b4bef-80cd-49e1-b473-374ba4d673fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SPMI/SPMI.depex + SECTION PE32 = sdm845Pkg/Binary/845/SPMI/SPMI.efi + SECTION UI = "SPMI" + } + + FILE DRIVER = beb12bee-f6e1-11e1-9fb8-6c626de4aeb1 { + SECTION PE32 = sdm845Pkg/Binary/845/XhciPciEmulation/XhciPciEmulation.efi + SECTION UI = "XhciPciEmulation" + } + + FILE DRIVER = b7f50e91-a759-412c-ade4-dcd03e7f7c28 { + SECTION PE32 = sdm845Pkg/Binary/845/XhciDxe/XhciDxe.efi + SECTION UI = "XhciDxe" + } + + FILE DRIVER = 5776232e-082d-4b75-9a0e-fe1d13f7a5d9 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.efi + SECTION UI = "PmicDxe" + } + + FILE DRIVER = 11faed4c-b21f-4d88-8e48-c4c28a1e50df { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.efi + SECTION UI = "UsbPwrCtrlDxe" + } + + FILE DRIVER = 94f8a6a7-dc34-4101-88c1-99179cceae83 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.efi + SECTION UI = "UsbfnDwc3Dxe" + } + + FILE DRIVER = 2d2e62cf-9ecf-43b7-8219-94e7fc713dfe { + SECTION PE32 = sdm845Pkg/Binary/845/UsbKbDxe/UsbKbDxe.efi + SECTION UI = "UsbKbDxe" + } + + FILE DRIVER = cd823a4d-7dec-4531-ae5d-4134fa4127b8 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.efi + SECTION UI = "UsbConfigDxe" + } + + FILE DRIVER = 0A134F0E-075E-40B3-9C63-3B3906804663 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.efi + SECTION UI = "UsbInitDxe" + } + + FILE DRIVER = 3299a266-15f0-4346-8318-716336736d3e { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.efi + SECTION UI = "UsbDeviceDxe" + } + + FILE DRIVER = 5bd181db-0487-4f1a-ae73-820e165611b3 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.efi + SECTION UI = "ButtonsDxe" + } + + FILE DRIVER = 0d35cd8e-97ea-4f9a-96af-0f0d89f76567 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UFSDxe/UFSDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UFSDxe/UFSDxe.efi + SECTION UI = "UFSDxe" + } + + FILE DRIVER = F0D87C5E-4D5D-4FB5-939F-A6768AE8A309 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/Synaptics/SynapticsTouchDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/Synaptics/SynapticsTouchDxe.efi + SECTION UI = "SynapticsTouchDxe" + } + + FILE DRIVER = F0D87C5E-4D5D-4FB5-939F-A6768AE8A310 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/Synaptics/SynapticsTouchDeviceDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/Synaptics/SynapticsTouchDeviceDxe.efi + SECTION UI = "SynapticsTouchDeviceDxe" + } + + FILE DRIVER = 5AF77F10-90DF-4E7E-8325-A17EC09D5443 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbMsdDxe/UsbMsdDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbMsdDxe/UsbMsdDxe.efi + SECTION UI = "UsbMsdDxe" + } + + INF sdm845Pkg/Drivers/sdm845Dxe/sdm845Dxe.inf + INF sdm845Pkg/Drivers/SimpleFbDxe/SimpleFbDxe.inf + + # + # USB Mass Storage Support + # + INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf + + # + # USB Host Support + # + INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf + INF MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouseDxe.inf + + + # + # FAT filesystem + GPT/MBR partitioning + # + INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf + INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf + INF FatPkg/EnhancedFatDxe/Fat.inf + INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf + INF MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf + + INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf + + # + # ACPI Support + # + INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf + INF MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf + INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf + # INF RuleOverride = ACPITABLE sdm845Pkg/AcpiTables/AcpiTables.inf + + FILE FREEFORM = 7E374E25-8E01-4FEE-87F2-390C23C606CD { + SECTION RAW = sdm845Pkg/AcpiTables/Common/DBG2.aml + SECTION RAW = sdm845Pkg/AcpiTables/legacy/lg/DSDT-lg.aml + SECTION RAW = sdm845Pkg/AcpiTables/Common/MADT.aml + SECTION RAW = sdm845Pkg/AcpiTables/Common/FADT.aml + SECTION RAW = sdm845Pkg/AcpiTables/Common/GTDT.aml + SECTION RAW = sdm845Pkg/AcpiTables/Common/IORT.aml + SECTION RAW = sdm845Pkg/AcpiTables/Common/PPTT.aml + SECTION UI = "AcpiTables" + } + + # + # FDT support + # + INF EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf + + FILE FREEFORM = 25462CDA-221F-47DF-AC1D-259CFAA4E326 { + SECTION RAW = sdm845Pkg/FdtBlob/sdm845-lge-judyln.dtb + } + + # + # SMBIOS Support + # + INF sdm845Pkg/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf + INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf + + # + # UEFI applications + # + INF ShellPkg/Application/Shell/Shell.inf +!ifdef $(INCLUDE_TFTP_COMMAND) + INF ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf +!endif #$(INCLUDE_TFTP_COMMAND) + + + # + # Bds + # + INF MdeModulePkg/Universal/PrintDxe/PrintDxe.inf + INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf + INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf + INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf + INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf + INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf + INF MdeModulePkg/Application/UiApp/UiApp.inf + INF sdm845Pkg/Drivers/LogoDxe/LogoDxe.inf + + + # + # Simple Init GUI + # + INF src/main/SimpleInitMain.inf + + INF src/kernelfdt/KernelFdtDxe.inf + + INF sdm845Pkg/Binary/845/LinuxSimpleMassStorage/LinuxSimpleMassStorage.inf + +[FV.FVMAIN_COMPACT] +FvAlignment = 8 +ERASE_POLARITY = 1 +MEMORY_MAPPED = TRUE +STICKY_WRITE = TRUE +LOCK_CAP = TRUE +LOCK_STATUS = TRUE +WRITE_DISABLED_CAP = TRUE +WRITE_ENABLED_CAP = TRUE +WRITE_STATUS = TRUE +WRITE_LOCK_CAP = TRUE +WRITE_LOCK_STATUS = TRUE +READ_DISABLED_CAP = TRUE +READ_ENABLED_CAP = TRUE +READ_STATUS = TRUE +READ_LOCK_CAP = TRUE +READ_LOCK_STATUS = TRUE + + INF ArmPlatformPkg/PrePi/PeiUniCore.inf + + FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { + SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { + SECTION FV_IMAGE = FVMAIN + } + } + +!include sdm845Pkg/CommonFdf.fdf.inc + + diff --git a/sdm845Pkg/FdtBlob/sdm845-lge-judyln.dtb b/sdm845Pkg/FdtBlob/sdm845-lge-judyln.dtb new file mode 100644 index 0000000000000000000000000000000000000000..80bd1dece2714032276dbe7a7b88d33d2624cbad GIT binary patch literal 95262 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