From 5a1d666f779a2a9ede72fcf9ba84abfd5c7c16be Mon Sep 17 00:00:00 2001 From: Danct12 Date: Mon, 3 Apr 2023 01:20:27 +0000 Subject: [PATCH] PineTab2: Add support for PINE64 PineTab 2 --- Makefile | 2 +- build.sh | 4 + dtb/rk3566-pinetab2.dtb | Bin 0 -> 118420 bytes .../Drivers/BoardInitDxe/BoardInitDxe.c | 189 +++++ .../Drivers/BoardInitDxe/BoardInitDxe.inf | 57 ++ .../Platform/Pine64/PineTab2/PineTab2.dsc | 719 ++++++++++++++++++ .../Platform/Pine64/PineTab2/PineTab2.fdf.inc | 35 + .../Rockchip/Rk356x/AcpiTables/PineTab2.inf | 74 ++ .../Rk356x/AcpiTables/PineTab2/Dsdt.asl | 28 + 9 files changed, 1107 insertions(+), 1 deletion(-) create mode 100644 dtb/rk3566-pinetab2.dtb create mode 100755 edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.c create mode 100755 edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.inf create mode 100644 edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.dsc create mode 100755 edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.fdf.inc create mode 100755 edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2.inf create mode 100755 edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2/Dsdt.asl diff --git a/Makefile b/Makefile index b1d8a4173..673e6812c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -BOARDS ?= QUARTZ64 SOQUARTZ ROC-RK3566-PC ROC-RK3568-PC ORANGEPI3B +BOARDS ?= QUARTZ64 SOQUARTZ ROC-RK3566-PC ROC-RK3568-PC ORANGEPI3B PINETAB2 TARGET ?= RELEASE .PHONY: all diff --git a/build.sh b/build.sh index d3ce90343..0940b364a 100755 --- a/build.sh +++ b/build.sh @@ -106,6 +106,10 @@ for board in ${RKUEFIBOARDS}; do build_uefi OrangePi OrangePi3B build_fit OrangePi3B rk3566-orangepi-3b ;; + PINETAB2) + build_uefi Pine64 PineTab2 + build_fit PineTab2 rk3566-pinetab2 + ;; *) echo "Unknown board ${board}" exit 1 diff --git a/dtb/rk3566-pinetab2.dtb b/dtb/rk3566-pinetab2.dtb new file mode 100644 index 0000000000000000000000000000000000000000..467db09e771a768fd37c945bd2916b3891d73255 GIT binary patch literal 118420 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 literal 0 HcmV?d00001 diff --git a/edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.c b/edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.c new file mode 100755 index 000000000..838f68e85 --- /dev/null +++ b/edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.c @@ -0,0 +1,189 @@ +/** @file + * + * Board init for the PineTab2 platform + * + * Copyright (c) 2021, Jared McNeill + * Copyright (c) 2023, Dang Huynh + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/* + * PMIC registers +*/ +#define PMIC_I2C_ADDR 0x20 + +#define PMIC_CHIP_NAME 0xed +#define PMIC_CHIP_VER 0xee +#define PMIC_POWER_EN1 0xb2 +#define PMIC_POWER_EN2 0xb3 +#define PMIC_POWER_EN3 0xb4 +#define PMIC_LDO1_ON_VSEL 0xcc +#define PMIC_LDO2_ON_VSEL 0xce +#define PMIC_LDO3_ON_VSEL 0xd0 +#define PMIC_LDO4_ON_VSEL 0xd2 +#define PMIC_LDO6_ON_VSEL 0xd6 +#define PMIC_LDO7_ON_VSEL 0xd8 +#define PMIC_LDO8_ON_VSEL 0xda +#define PMIC_LDO9_ON_VSEL 0xdc + +/* + * CPU_GRF registers +*/ +#define GRF_CPU_COREPVTPLL_CON0 (CPU_GRF + 0x0010) +#define CORE_PVTPLL_RING_LENGTH_SEL_SHIFT 3 +#define CORE_PVTPLL_RING_LENGTH_SEL_MASK (0x1FU << CORE_PVTPLL_RING_LENGTH_SEL_SHIFT) +#define CORE_PVTPLL_OSC_EN BIT1 +#define CORE_PVTPLL_START BIT0 + +/* + * PMU registers + */ +#define PMU_NOC_AUTO_CON0 (PMU_BASE + 0x0070) +#define PMU_NOC_AUTO_CON1 (PMU_BASE + 0x0074) + +STATIC +EFI_STATUS +PmicRead ( + IN UINT8 Register, + OUT UINT8 *Value + ) +{ + return I2cRead (I2C0_BASE, PMIC_I2C_ADDR, + &Register, sizeof (Register), + Value, sizeof (*Value)); +} + +STATIC +EFI_STATUS +PmicWrite ( + IN UINT8 Register, + IN UINT8 Value + ) +{ + return I2cWrite (I2C0_BASE, PMIC_I2C_ADDR, + &Register, sizeof (Register), + &Value, sizeof (Value)); +} + +STATIC +VOID +BoardInitPmic ( + VOID + ) +{ + EFI_STATUS Status; + UINT16 ChipName; + UINT8 ChipVer; + UINT8 Value; + + DEBUG ((DEBUG_INFO, "BOARD: PMIC init\n")); + + GpioPinSetPull (0, GPIO_PIN_PB1, GPIO_PIN_PULL_NONE); + GpioPinSetInput (0, GPIO_PIN_PB1, GPIO_PIN_INPUT_SCHMITT); + GpioPinSetFunction (0, GPIO_PIN_PB1, 1); + GpioPinSetPull (0, GPIO_PIN_PB2, GPIO_PIN_PULL_NONE); + GpioPinSetInput (0, GPIO_PIN_PB2, GPIO_PIN_INPUT_SCHMITT); + GpioPinSetFunction (0, GPIO_PIN_PB2, 1); + + Status = PmicRead (PMIC_CHIP_NAME, &Value); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "Failed to read PMIC chip name! %r\n", Status)); + ASSERT (FALSE); + } + ChipName = (UINT16)Value << 4; + + Status = PmicRead (PMIC_CHIP_VER, &Value); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "Failed to read PMIC chip version! %r\n", Status)); + ASSERT (FALSE); + } + ChipName |= (Value >> 4) & 0xF; + ChipVer = Value & 0xF; + + DEBUG ((DEBUG_INFO, "PMIC: Detected RK%03X ver 0x%X\n", ChipName, ChipVer)); + ASSERT (ChipName == 0x817); + + /* Initialize PMIC */ + PmicWrite (PMIC_LDO1_ON_VSEL, 0x30); /* 1.8V - vcca1v8_pmu */ + PmicWrite (PMIC_LDO2_ON_VSEL, 0x0c); /* 0.9V - vdda_0v9 */ + PmicWrite (PMIC_LDO3_ON_VSEL, 0x0c); /* 0.9V - vdd0v9_pmu */ + PmicWrite (PMIC_LDO4_ON_VSEL, 0x6c); /* 3.3V - vccio_acodec */ + /* Skip LDO5 for now; 1.8V/3.3V - vccio_sd */ + PmicWrite (PMIC_LDO6_ON_VSEL, 0x6c); /* 3.3V - vcc3v3_pmu */ + PmicWrite (PMIC_LDO7_ON_VSEL, 0x30); /* 1.8V - vcca_1v8 */ + PmicWrite (PMIC_LDO8_ON_VSEL, 0x30); /* 1.8V - vcca1v8_dvp */ + PmicWrite (PMIC_LDO9_ON_VSEL, 0x58); /* 2.8V - vcca2v8_dvp */ + + PmicWrite (PMIC_POWER_EN1, 0xff); /* LDO1, LDO2, LDO3, LDO4 */ + PmicWrite (PMIC_POWER_EN2, 0xee); /* LDO6, LDO7, LDO8 */ + PmicWrite (PMIC_POWER_EN3, 0x33); /* LDO9, BOOST */ +} + +EFI_STATUS +EFIAPI +BoardInitDriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + DEBUG ((DEBUG_INFO, "BOARD: BoardInitDriverEntryPoint() called\n")); + + SocSetDomainVoltage (PMUIO2, VCC_1V8); /* VCCA1V8_PMU */ + SocSetDomainVoltage (VCCIO1, VCC_3V3); /* VCCIO_ACODEC (PCIe) */ + SocSetDomainVoltage (VCCIO2, VCC_1V8); /* VCCIO_FLASH */ + SocSetDomainVoltage (VCCIO3, VCC_3V3); /* VCCIO_SD */ + SocSetDomainVoltage (VCCIO4, VCC_1V8); + SocSetDomainVoltage (VCCIO5, VCC_1V8); + SocSetDomainVoltage (VCCIO6, VCC_1V8); + SocSetDomainVoltage (VCCIO7, VCC_3V3); + + BoardInitPmic (); + + /* Enable automatic clock gating */ + MmioWrite32 (PMU_NOC_AUTO_CON0, 0xFFFFFFFFU); + MmioWrite32 (PMU_NOC_AUTO_CON1, 0x000F000FU); + + /* Set core_pvtpll ring length */ + MmioWrite32 (GRF_CPU_COREPVTPLL_CON0, + ((CORE_PVTPLL_RING_LENGTH_SEL_MASK | CORE_PVTPLL_OSC_EN | CORE_PVTPLL_START) << 16) | + (5U << CORE_PVTPLL_RING_LENGTH_SEL_SHIFT) | CORE_PVTPLL_OSC_EN | CORE_PVTPLL_START); + + /* Configure MULTI-PHY 0 and 1 for USB3 mode */ + MultiPhySetMode (0, MULTIPHY_MODE_USB3); + MultiPhySetMode (1, MULTIPHY_MODE_USB3); + + /* Set GPIO4 PC4 and PC5 (USB_HOST_PWREN) output high to power USB ports */ + GpioPinSetDirection (4, GPIO_PIN_PC4, GPIO_PIN_OUTPUT); + GpioPinWrite (4, GPIO_PIN_PC4, TRUE); + GpioPinSetDirection (4, GPIO_PIN_PC5, GPIO_PIN_OUTPUT); + GpioPinWrite (4, GPIO_PIN_PC5, TRUE); + + return EFI_SUCCESS; +} diff --git a/edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.inf b/edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.inf new file mode 100755 index 000000000..09471fc79 --- /dev/null +++ b/edk2-rockchip/Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.inf @@ -0,0 +1,57 @@ +#/** @file +# +# Board init PineTab2 platforms +# +# Copyright (c) 2021 Jared McNeill +# Copyright (c) 2023, Dang Huynh +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = BoardInitDxe + FILE_GUID = D595E3B3-A972-4A6D-94F6-11309E3FA496 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = BoardInitDriverEntryPoint + +[Sources] + BoardInitDxe.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + CryptoPkg/CryptoPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + ArmPkg/ArmPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + Platform/Rockchip/Rk356x/Rk356x.dec + Silicon/Rockchip/Rk356x/Rk356x.dec + +[LibraryClasses] + ArmLib + UefiBootServicesTableLib + MemoryAllocationLib + BaseMemoryLib + BaseCryptLib + BaseLib + UefiLib + UefiDriverEntryPoint + DebugLib + PrintLib + TimeBaseLib + TimerLib + CruLib + GpioLib + I2cLib + MultiPhyLib + OtpLib + SocLib + +[Protocols] + + +[Depex] + TRUE diff --git a/edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.dsc b/edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.dsc new file mode 100644 index 000000000..8f3726b0f --- /dev/null +++ b/edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.dsc @@ -0,0 +1,719 @@ +# @file +# +# Copyright (c) 2011 - 2020, ARM Limited. All rights reserved. +# Copyright (c) 2014, Linaro Limited. All rights reserved. +# Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved. +# Copyright (c) 2017 - 2021, Andrei Warkentin +# Copyright (C) 2021, Jared McNeill +# Copyright (c) 2023, Dang Huynh +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + PLATFORM_NAME = PineTab2 + PLATFORM_GUID = 2EDE49F2-1EFA-4149-AE6E-EA4D1BA2A23F + PLATFORM_VERSION = 1.0 + DSC_SPECIFICATION = 0x0001001A + OUTPUT_DIRECTORY = Build/$(PLATFORM_NAME) + SUPPORTED_ARCHITECTURES = AARCH64 + BUILD_TARGETS = DEBUG|RELEASE|NOOPT + SKUID_IDENTIFIER = DEFAULT + FLASH_DEFINITION = Platform/Rockchip/Rk356x/Rk356x.fdf + BOARD_DXE_FV_COMPONENTS = Platform/Pine64/PineTab2/PineTab2.fdf.inc + + # + # Defines for default states. These can be changed on the command line. + # -D FLAG=VALUE + # + DEFINE DEBUG_PRINT_ERROR_LEVEL = 0x8000004F + +################################################################################ +# +# Library Class section - list of all Library Classes needed by this Platform. +# +################################################################################ + +!include MdePkg/MdeLibs.dsc.inc + +[LibraryClasses.common] +!if $(TARGET) == RELEASE + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf +!else + DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf +!endif + DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf + + BaseLib|MdePkg/Library/BaseLib/BaseLib.inf + SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf + BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf + SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf + PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf + ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf + PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf + PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf + PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf + IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf + PciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf + UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf + CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf + + UefiLib|MdePkg/Library/UefiLib/UefiLib.inf + HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf + UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf + DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf + UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf + DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf + DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf + UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf + UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf + HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf + UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf + SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf + + UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf + OrderedCollectionLib|MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollectionRedBlackTreeLib.inf + + # + # Ramdisk Requirements + # + FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf + + # Allow dynamic PCDs + # + PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf + PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf + + # use the accelerated BaseMemoryLibOptDxe by default, overrides for SEC/PEI below + BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf + + # + # It is not possible to prevent the ARM compiler from inserting calls to intrinsic functions. + # This library provides the instrinsic functions such a compiler may generate calls to. + # + NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf + + # Add support for GCC stack protector + NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf + + # ARM Architectural Libraries + CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf + DefaultExceptionHandlerLib|ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf + CpuExceptionHandlerLib|ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf + ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf + ArmGicLib|ArmPkg/Drivers/ArmGic/ArmGicLib.inf + ArmGicArchLib|ArmPkg/Library/ArmGicArchLib/ArmGicArchLib.inf + DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf + TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf + ArmPlatformStackLib|ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf + ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf + ArmHvcLib|ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf + ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf + + # Rockchip SoC libraries + CpuVoltageLib|Silicon/Rockchip/Rk356x/Library/Tsc4525CpuVoltageLib/CpuVoltageLib.inf + CruLib|Silicon/Rockchip/Rk356x/Library/CruLib/CruLib.inf + GpioLib|Silicon/Rockchip/Rk356x/Library/GpioLib/GpioLib.inf + I2cLib|Silicon/Rockchip/Rk356x/Library/I2cLib/I2cLib.inf + MultiPhyLib|Silicon/Rockchip/Rk356x/Library/MultiPhyLib/MultiPhyLib.inf + OtpLib|Silicon/Rockchip/Rk356x/Library/OtpLib/OtpLib.inf + SdramLib|Silicon/Rockchip/Rk356x/Library/SdramLib/SdramLib.inf + SocLib|Silicon/Rockchip/Rk356x/Library/SocLib/SocLib.inf + Pcie30PhyLib|Silicon/Rockchip/Rk356x/Library/Pcie30PhyLib/Pcie30PhyLib.inf + + # Devices + NonDiscoverableDeviceRegistrationLib|MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/NonDiscoverableDeviceRegistrationLib.inf + + # UART + #PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf + #PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf + SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf + PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf + + # Cryptographic libraries + RngLib|MdePkg/Library/DxeRngLib/DxeRngLib.inf + IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf + TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf + + # + # Uncomment (and comment out the next line) For RealView Debugger. The Standard IO window + # in the debugger will show load and unload commands for symbols. You can cut and paste this + # into the command window to load symbols. We should be able to use a script to do this, but + # the version of RVD I have does not support scripts accessing system memory. + # + #PeCoffExtraActionLib|ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.inf + PeCoffExtraActionLib|ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf + #PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf + + DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf + DebugAgentTimerLib|EmbeddedPkg/Library/DebugAgentTimerLibNull/DebugAgentTimerLibNull.inf + + # Flattened Device Tree (FDT) access library + FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf + + # USB Libraries + UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf + + # SCMI Mailbox Transport Layer + ArmMtlLib|Platform/Rockchip/Rk356x/Library/RkMtlLib/RkMtlLib.inf + + # + # Secure Boot dependencies + # + TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf + AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf + VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf + VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.inf + VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf + + # + # PCI support + # + PciSegmentLib|Silicon/Rockchip/Rk356x/Library/Rk356xPciSegmentLib/Rk356xPciSegmentLib.inf + PciLib|MdePkg/Library/BasePciLibPciExpress/BasePciLibPciExpress.inf + PciHostBridgeLib|Silicon/Rockchip/Rk356x/Library/Rk356xPciHostBridgeLib/Rk356xPciHostBridgeLib.inf + + # Storage + UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf + +[LibraryClasses.common.SEC] + PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf + MemoryInitPeiLib|Platform/Rockchip/Rk356x/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf + PlatformPeiLib|ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf + ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf + LzmaDecompressLib|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf + PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf + HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf + PrePiHobListPointerLib|ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf + MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf + +[LibraryClasses.common.DXE_CORE] + HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf + MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf + DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf + ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf + PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf + +[LibraryClasses.common.DXE_DRIVER] + SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf + PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf + MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf + +[LibraryClasses.common.UEFI_APPLICATION] + PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf + MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf + ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf + FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf + +[LibraryClasses.common.UEFI_DRIVER] + ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf + PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf + MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + +[LibraryClasses.common.DXE_RUNTIME_DRIVER] + # Runtime debug messages may crash an OS unless serial output to MMIO mapped UARTs is inhibited + DebugLib|MdePkg/Library/DxeRuntimeDebugLibSerialPort/DxeRuntimeDebugLibSerialPort.inf + MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf + EfiResetSystemLib|Platform/Rockchip/Rk356x/Library/ResetLib/ResetLib.inf + ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf + VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLibRuntimeDxe.inf + +################################################################################################### +# BuildOptions Section - Define the module specific tool chain flags that should be used as +# the default flags for a module. These flags are appended to any +# standard flags that are defined by the build process. +################################################################################################### + +[BuildOptions] + GCC:*_*_*_CC_FLAGS = -DRK356X -DPINETAB2 + GCC:*_*_*_PP_FLAGS = -DRK356X -DPINETAB2 + GCC:*_*_*_ASLPP_FLAGS = -DRK356X -DPINETAB2 + GCC:*_*_*_ASLCC_FLAGS = -DRK356X -DPINETAB2 + GCC:*_*_*_VFRPP_FLAGS = -DRK356X -DPINETAB2 + GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG -DNDEBUG + +[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] + GCC:*_*_AARCH64_DLINK_FLAGS = -z common-page-size=0x10000 + +################################################################################ +# +# Pcd Section - list of all EDK II PCD Entries defined by this Platform +# +################################################################################ + +[PcdsFeatureFlag.common] + # Use the Vector Table location in CpuDxe. We will not copy the Vector Table at PcdCpuVectorBaseAddress + gArmTokenSpaceGuid.PcdRelocateVectorTable|FALSE + + gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE + + ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe. + # It could be set FALSE to save size. + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE + gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport|FALSE + + gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE + + +[PcdsFixedAtBuild.common] + gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000 + gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength|1000000 + gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000 + gEfiMdePkgTokenSpaceGuid.PcdSpinLockTimeout|10000000 + gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue|0xAF + gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|1 + gEfiMdePkgTokenSpaceGuid.PcdPostCodePropertyMask|0 + gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320 + + # DEBUG_ASSERT_ENABLED 0x01 + # DEBUG_PRINT_ENABLED 0x02 + # DEBUG_CODE_ENABLED 0x04 + # CLEAR_MEMORY_ENABLED 0x08 + # ASSERT_BREAKPOINT_ENABLED 0x10 + # ASSERT_DEADLOOP_ENABLED 0x20 +!if $(TARGET) == RELEASE + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x21 +!else + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2f +!endif + + # DEBUG_INIT 0x00000001 // Initialization + # DEBUG_WARN 0x00000002 // Warnings + # DEBUG_LOAD 0x00000004 // Load events + # DEBUG_FS 0x00000008 // EFI File system + # DEBUG_POOL 0x00000010 // Alloc & Free (pool) + # DEBUG_PAGE 0x00000020 // Alloc & Free (page) + # DEBUG_INFO 0x00000040 // Informational debug messages + # DEBUG_DISPATCH 0x00000080 // PEI/DXE/SMM Dispatchers + # DEBUG_VARIABLE 0x00000100 // Variable + # DEBUG_BM 0x00000400 // Boot Manager + # DEBUG_BLKIO 0x00001000 // BlkIo Driver + # DEBUG_NET 0x00004000 // SNP Driver + # DEBUG_UNDI 0x00010000 // UNDI Driver + # DEBUG_LOADFILE 0x00020000 // LoadFile + # DEBUG_EVENT 0x00080000 // Event messages + # DEBUG_GCD 0x00100000 // Global Coherency Database changes + # DEBUG_CACHE 0x00200000 // Memory range cachability changes + # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may + # // significantly impact boot performance + # DEBUG_ERROR 0x80000000 // Error + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|$(DEBUG_PRINT_ERROR_LEVEL) + + gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x07 + + # + # Optional feature to help prevent EFI memory map fragments + # Turned on and off via: PcdPrePiProduceMemoryTypeInformationHob + # Values are in EFI Pages (4K). DXE Core will make sure that + # at least this much of each type of memory can be allocated + # from a single memory range. This way you only end up with + # maximum of two fragments for each type in the memory map + # (the memory used, and the free memory that was prereserved + # but not used). + # + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory|0 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS|0 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType|0 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData|300 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode|150 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesCode|1000 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData|12000 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode|20 + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData|0 + + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"EDK2-DEV" + + # Default platform supported RFC 4646 languages: (American) English + gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLangCodes|"en-US" + + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x10000 + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x8000 + gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x10000 + +[LibraryClasses.common] + ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf + ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmPlatformLib|Platform/Rockchip/Rk356x/Library/PlatformLib/PlatformLib.inf + TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf + CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf + UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf + BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf + PlatformBootManagerLib|ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf + CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf + FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf + AcpiLib|EmbeddedPkg/Library/AcpiLib/AcpiLib.inf + +[LibraryClasses.common.UEFI_DRIVER] + +################################################################################ +# +# Pcd Section - list of all EDK II PCD Entries defined by this Platform +# +################################################################################ + +[PcdsFeatureFlag.common] + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE + gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE + +[PcdsFixedAtBuild.common] + gArmPlatformTokenSpaceGuid.PcdCoreCount|4 + gArmPlatformTokenSpaceGuid.PcdClusterCount|1 + + gArmTokenSpaceGuid.PcdVFPEnabled|1 + + # ARM Architectural Timer Frequency + gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|24000000 + gEmbeddedTokenSpaceGuid.PcdMetronomeTickPeriod|1000 + gEmbeddedTokenSpaceGuid.PcdTimerPeriod|1000 + + gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize|0x4000 + + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 + + # Smallest possible memory size + gArmTokenSpaceGuid.PcdSystemMemoryBase|0 + gArmTokenSpaceGuid.PcdSystemMemorySize|0x80000000 + + # Size of the region used by UEFI in permanent memory (Reserved 64MB) + gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000 + + # UART2 + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0xFE660000 + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHardwareFlowControl|FALSE + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|24000000 + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|4 + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterAccessWidth|32 + + # TODO: Use 1.5M baud + #gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|1500000 + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200 + + # + # ARM General Interrupt Controller (GIC600) + # + gArmTokenSpaceGuid.PcdGicDistributorBase|0xFD400000 + gArmTokenSpaceGuid.PcdGicRedistributorsBase|0xFD460000 + gRk356xTokenSpaceGuid.PcdGicPmuIrq0|260 + gRk356xTokenSpaceGuid.PcdGicPmuIrq1|261 + gRk356xTokenSpaceGuid.PcdGicPmuIrq2|262 + gRk356xTokenSpaceGuid.PcdGicPmuIrq3|263 + + ## Default Terminal Type + ## 0-PCANSI, 1-VT100, 2-VT00+, 3-UTF8, 4-TTYTERM + gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|4 + + gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE + gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 } + + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"EDK2" + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy|0x3 + gRk356xTokenSpaceGuid.PcdPlatformName|"PINE64 PineTab2" + gRk356xTokenSpaceGuid.PcdCpuName|"Rockchip RK3566 (Cortex-A55)" + gRk356xTokenSpaceGuid.PcdPlatformVendorName|"Pine64" + gRk356xTokenSpaceGuid.PcdFamilyName|"PineTab2" + gRk356xTokenSpaceGuid.PcdProductUrl|"https://www.pine64.org/pinetab2/" + gRk356xTokenSpaceGuid.PcdMemoryVendorName|"Micron" + + # + # USB support + # + gRk356xTokenSpaceGuid.PcdOhc0Status|0xF + gRk356xTokenSpaceGuid.PcdOhc1Status|0xF + gRk356xTokenSpaceGuid.PcdEhc0Status|0xF + gRk356xTokenSpaceGuid.PcdEhc1Status|0xF + gRk356xTokenSpaceGuid.PcdXhc0Status|0xF + gRk356xTokenSpaceGuid.PcdXhc1Status|0xF + + # + # SATA support + # + gRk356xTokenSpaceGuid.PcdSata1Status|0xF + + # + # PCI support + # + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x0000000300000000 + gArmTokenSpaceGuid.PcdPciBusMin|0 + gArmTokenSpaceGuid.PcdPciBusMax|1 + gArmTokenSpaceGuid.PcdPciMmio32Base|0xF4000000 + gArmTokenSpaceGuid.PcdPciMmio32Size|0x02000000 + gArmTokenSpaceGuid.PcdPciMmio64Base|0x0000000310000000 + gArmTokenSpaceGuid.PcdPciMmio64Size|0x000000002FFF0000 + gArmTokenSpaceGuid.PcdPciIoBase|0x0000 + gArmTokenSpaceGuid.PcdPciIoSize|0x10000 + gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize|34 + + gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation|0x000000033FFF0000 + gRk356xTokenSpaceGuid.PcdPcieResetGpioBank|1 + gRk356xTokenSpaceGuid.PcdPcieResetGpioPin|10 + gRk356xTokenSpaceGuid.PcdPciePowerGpioBank|4 + gRk356xTokenSpaceGuid.PcdPciePowerGpioPin|19 + + # + # This board has inverted polarity for the PWREN pin on the SD card slot + # + gRk356xTokenSpaceGuid.PcdMshcDxePwrEnUsed|TRUE + gRk356xTokenSpaceGuid.PcdMshcDxePwrEnInverted|TRUE + +[PcdsDynamicHii.common.DEFAULT] + + # + # Reset-related. + # + gRk356xTokenSpaceGuid.PcdPlatformResetDelay|L"ResetDelay"|gRk356xTokenSpaceGuid|0x0|0 + + # + # ConfigDxe + # + gRk356xTokenSpaceGuid.PcdSystemTableMode|L"SystemTableMode"|gConfigDxeFormSetGuid|0x0|0 + gRk356xTokenSpaceGuid.PcdCpuClock|L"CpuClock"|gConfigDxeFormSetGuid|0x0|2 + gRk356xTokenSpaceGuid.PcdCustomCpuClock|L"CustomCpuClock"|gConfigDxeFormSetGuid|0x0|816 + gRk356xTokenSpaceGuid.PcdMultiPhy1Mode|L"MultiPhy1Mode"|gConfigDxeFormSetGuid|0x0|0 + + # + # Common UEFI ones. + # + + gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5 + +[PcdsDynamicDefault.common] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0 + + gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|1280 + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|720 + +################################################################################ +# +# Components Section - list of all EDK II Modules needed by this Platform +# +################################################################################ +[Components.common] + # + # PEI Phase modules + # + ArmPlatformPkg/PrePi/PeiUniCore.inf { + + SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf + } + + # + # DXE + # + MdeModulePkg/Core/Dxe/DxeMain.inf { + + NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf + } + MdeModulePkg/Universal/PCD/Dxe/Pcd.inf { + + PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + } + + # + # Architectural Protocols + # + ArmPkg/Drivers/CpuDxe/CpuDxe.inf + MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf + Platform/Rockchip/Rk356x/Drivers/VarBlockServiceDxe/VarBlockServiceDxe.inf + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf { + + VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf + } + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf { + + NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf + VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf + } + MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf + MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf + MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf + EmbeddedPkg/ResetRuntimeDxe/ResetRuntimeDxe.inf + EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf { + + RealTimeClockLib|EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf + } + EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf + + MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf + MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf + MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf + MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf + MdeModulePkg/Universal/SerialDxe/SerialDxe.inf { + + SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf + } + Silicon/Rockchip/Rk356x/Drivers/DisplayDxe/DisplayDxe.inf + EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf + + MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf + + ArmPkg/Drivers/ArmGic/ArmGicDxe.inf + ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf + ArmPkg/Drivers/TimerDxe/TimerDxe.inf + MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf + MdeModulePkg/Universal/EbcDxe/EbcDxe.inf + + # + # SCMI Driver + # + ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf + + # + # Board specific + # + Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.inf + + # + # Config + # + Platform/Rockchip/Rk356x/Drivers/ConfigDxe/ConfigDxe.inf + + # + # FAT filesystem + GPT/MBR partitioning + # + MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf + MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf + MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf + FatPkg/EnhancedFatDxe/Fat.inf + + # + # USB + # + Silicon/Rockchip/Rk356x/Drivers/OhciDxe/OhciDxe.inf + MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf + MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf + MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf + MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf + MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf + + MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf + Silicon/Rockchip/Rk356x/Drivers/UsbHcdInitDxe/UsbHcd.inf + + # + # SD + # + EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf + Silicon/Rockchip/Rk356x/Drivers/MshcDxe/MshcDxe.inf + + # + # eMMC + # + MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf + MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf + Silicon/Rockchip/Rk356x/Drivers/EmmcDxe/EmmcDxe.inf + + # + # Devicetree support + # + Platform/Rockchip/Rk356x/Drivers/FdtDxe/FdtDxe.inf + + # + # ACPI Support + # + MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf + MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf + Platform/Rockchip/Rk356x/Drivers/PlatformAcpiDxe/PlatformAcpiDxe.inf + Platform/Rockchip/Rk356x/AcpiTables/$(PLATFORM_NAME).inf + + # + # SMBIOS Support + # + Platform/Rockchip/Rk356x/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf + MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf + + # + # PCI Support + # + MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf + MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf + EmbeddedPkg/Drivers/NonCoherentIoMmuDxe/NonCoherentIoMmuDxe.inf + MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf + + # + # AHCI Support + # + MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf + MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf + MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf + MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf + Silicon/Rockchip/Rk356x/Drivers/SataDxe/SataDxe.inf + + # + # TRNG Support + # + Silicon/Rockchip/Rk356x/Drivers/TrngDxe/TrngDxe.inf + + # + # TS-ADC Support + # + Silicon/Rockchip/Rk356x/Drivers/TsadcDxe/TsadcDxe.inf + + # + # RAM Disk Support + # + MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf + + # + # Bds + # + MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf + MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf + MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf + MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf + MdeModulePkg/Universal/BdsDxe/BdsDxe.inf + Platform/Pine64/Drivers/LogoDxe/LogoDxe.inf + MdeModulePkg/Application/UiApp/UiApp.inf { + + NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf + NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf + NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf + } + + # + # UEFI application (Shell Embedded Boot Loader) + # + ShellPkg/Application/Shell/Shell.inf { + + ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf + NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf + NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf + NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf + NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf + NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf + NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf + NULL|ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf + HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf + OrderedCollectionLib|MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollectionRedBlackTreeLib.inf + PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf + BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf + ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf + + + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF + gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE + gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000 + gEfiShellPkgTokenSpaceGuid.PcdShellFileOperationSize|0x200000 + } diff --git a/edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.fdf.inc b/edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.fdf.inc new file mode 100755 index 000000000..3ef431036 --- /dev/null +++ b/edk2-rockchip/Platform/Pine64/PineTab2/PineTab2.fdf.inc @@ -0,0 +1,35 @@ +# +# Copyright (c) 2021, Jared McNeill +# Copyright (c) 2023, Dang Huynh +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +# +# Board specific initialization +# +INF Platform/Pine64/PineTab2/Drivers/BoardInitDxe/BoardInitDxe.inf + +# +# Devicetree support +# +INF Platform/Rockchip/Rk356x/Drivers/FdtDxe/FdtDxe.inf + +# +# ACPI Support +# +INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf +INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf +INF Platform/Rockchip/Rk356x/Drivers/PlatformAcpiDxe/PlatformAcpiDxe.inf +INF RuleOverride = ACPITABLE Platform/Rockchip/Rk356x/AcpiTables/$(PLATFORM_NAME).inf + +# +# SMBIOS Support +# +INF Platform/Rockchip/Rk356x/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf +INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf + +# +# PINE64 logo (splash screen) +# +INF Platform/Pine64/Drivers/LogoDxe/LogoDxe.inf diff --git a/edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2.inf b/edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2.inf new file mode 100755 index 000000000..db358d69b --- /dev/null +++ b/edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2.inf @@ -0,0 +1,74 @@ +## @file +# +# ACPI table data and ASL sources required to boot the platform. +# +# Copyright (c) 2021, Jared McNeill +# Copyright (c) 2020, Linaro Ltd. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = Rk356xAcpiTables + FILE_GUID = 0FBE0D20-3528-4F07-838B-9A711C62654F + MODULE_TYPE = USER_DEFINED + VERSION_STRING = 1.0 + +[Sources] + PineTab2/Dsdt.asl + Dbg2.aslc + Fadt.aslc + Gtdt.aslc + Madt.aslc + Mcfg.aslc + Spcr.aslc + +[Packages] + ArmPlatformPkg/ArmPlatformPkg.dec + ArmPkg/ArmPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Platform/Rockchip/Rk356x/Rk356x.dec + Silicon/Rockchip/Rk356x/Rk356x.dec + +[FixedPcd] + gArmTokenSpaceGuid.PcdGicDistributorBase + gArmTokenSpaceGuid.PcdGicRedistributorsBase + + gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum + + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemTableId + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision + + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate + + gRk356xTokenSpaceGuid.PcdOhc0Status + gRk356xTokenSpaceGuid.PcdOhc1Status + gRk356xTokenSpaceGuid.PcdEhc0Status + gRk356xTokenSpaceGuid.PcdEhc1Status + gRk356xTokenSpaceGuid.PcdXhc0Status + gRk356xTokenSpaceGuid.PcdXhc1Status + gRk356xTokenSpaceGuid.PcdMac0Status + gRk356xTokenSpaceGuid.PcdMac1Status + + gRk356xTokenSpaceGuid.PcdMshc1Status + gRk356xTokenSpaceGuid.PcdMshc1SdioIrq + gRk356xTokenSpaceGuid.PcdMshc1NonRemovable + gRk356xTokenSpaceGuid.PcdMshc2Status + gRk356xTokenSpaceGuid.PcdMshc2SdioIrq + gRk356xTokenSpaceGuid.PcdMshc2NonRemovable + + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress + +[BuildOptions] + GCC:*_*_*_ASL_FLAGS = -vw3133 -vw3150 diff --git a/edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2/Dsdt.asl b/edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2/Dsdt.asl new file mode 100755 index 000000000..7f7dc8781 --- /dev/null +++ b/edk2-rockchip/Platform/Rockchip/Rk356x/AcpiTables/PineTab2/Dsdt.asl @@ -0,0 +1,28 @@ +/** @file +* Differentiated System Description Table Fields (DSDT) for the PINE64 PineTab2. +* +* Copyright (c) 2022, Jared McNeill +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +DefinitionBlock ("DsdtTable.aml", "DSDT", + EFI_ACPI_6_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_REVISION, + "RKCP ", "RK356X ", FixedPcdGet32 (PcdAcpiDefaultOemRevision)) { + Scope (_SB) { + + include ("Cpu.asl") + include ("Tsadc.asl") + include ("Uart.asl") + include ("Wdt.asl") + include ("Usb2.asl") + include ("Usb3.asl") + include ("Gmac.asl") + include ("Mshc.asl") + include ("Emmc.asl") + include ("Pcie2x1.asl") + + } // Scope (_SB) +}