From fa1b4624be7d487c6f946fc0fe3e3f21b030fadb Mon Sep 17 00:00:00 2001 From: LokiSharp Date: Sun, 6 Oct 2024 18:19:09 +0800 Subject: [PATCH 1/2] Add NanoPi M6 --- .github/workflows/build.yml | 1 + README.md | 2 + configs/nanopi-m6.conf | 3 + .../Rockchip/DeviceTree/rk3588-nanopi-m6.dtb | Bin 0 -> 241906 bytes .../NanoPi-M6/AcpiTables/AcpiTables.inf | 58 +++ .../NanoPi-M6/AcpiTables/Dsdt.asl | 39 ++ .../RockchipPlatformLib/RockchipPlatformLib.c | 342 ++++++++++++++++++ .../RockchipPlatformLib.inf | 34 ++ .../NanoPi-M6/NanoPi-M6.Modules.fdf.inc | 20 + .../FriendlyElec/NanoPi-M6/NanoPi-M6.dsc | 115 ++++++ 10 files changed, 614 insertions(+) create mode 100644 configs/nanopi-m6.conf create mode 100644 edk2-rockchip-non-osi/Platform/Rockchip/DeviceTree/rk3588-nanopi-m6.dtb create mode 100644 edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/AcpiTables.inf create mode 100644 edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl create mode 100644 edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.c create mode 100644 edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.inf create mode 100644 edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.Modules.fdf.inc create mode 100644 edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.dsc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 65a5fa293..2f9dee87d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,6 +39,7 @@ jobs: - edge2 - nanopi-r6c - nanopi-r6s + - nanopi-m6 - nanopc-t6 - blade3 - h88k diff --git a/README.md b/README.md index 49edc6342..f96203949 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ This repository contains an UEFI firmware implementation based on EDK2 for vario - [FriendlyELEC NanoPC T6](https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6) - [FriendlyELEC NanoPi R6C](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R6C) - [FriendlyELEC NanoPi R6S](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R6S) +- [FriendlyELEC NanoPi M6](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_M6) - [Hinlink H88K](http://www.hinlink.com) # Supported OSes @@ -159,6 +160,7 @@ The paths above are relative to the root of the file system. That is, the `dtb` | `rk3588-nanopc-t6` | NanoPC T6 | | `rk3588s-nanopi-r6c` | NanoPi R6C | | `rk3588s-nanopi-r6s` | NanoPi R6S | +| `rk3588s-nanopi-m6` | NanoPi M6 | | `rk3588-hinlink-h88k` | H88K | In the absence of a custom base DTB override, the overlays are applied on top of the firmware-provided DTB. diff --git a/configs/nanopi-m6.conf b/configs/nanopi-m6.conf new file mode 100644 index 000000000..4421d1e66 --- /dev/null +++ b/configs/nanopi-m6.conf @@ -0,0 +1,3 @@ +DSC_FILE=edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.dsc +PLATFORM_NAME=NanoPi-M6 +SOC=RK3588 diff --git a/edk2-rockchip-non-osi/Platform/Rockchip/DeviceTree/rk3588-nanopi-m6.dtb b/edk2-rockchip-non-osi/Platform/Rockchip/DeviceTree/rk3588-nanopi-m6.dtb new file mode 100644 index 0000000000000000000000000000000000000000..d779823a3b2df967664430b66474887d796c97a6 GIT binary patch literal 241906 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 z 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 literal 0 HcmV?d00001 diff --git a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/AcpiTables.inf b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/AcpiTables.inf new file mode 100644 index 000000000..35d333b08 --- /dev/null +++ b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/AcpiTables.inf @@ -0,0 +1,58 @@ +#/** @file +# +# ACPI table data and ASL sources required to boot the platform. +# +# Copyright (c) 2019-2021, ARM Limited. All rights reserved. +# Copyright (c) Microsoft Corporation. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = AcpiTables + FILE_GUID = 7E374E25-8E01-4FEE-87F2-390C23C606CD + MODULE_TYPE = USER_DEFINED + VERSION_STRING = 1.0 + RK_COMMON_ACPI_DIR = Silicon/Rockchip/RK3588/AcpiTables + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + Dsdt.asl + $(RK_COMMON_ACPI_DIR)/Madt.aslc + $(RK_COMMON_ACPI_DIR)/Fadt.aslc + $(RK_COMMON_ACPI_DIR)/Gtdt.aslc + $(RK_COMMON_ACPI_DIR)/Spcr.aslc + $(RK_COMMON_ACPI_DIR)/Mcfg.aslc + $(RK_COMMON_ACPI_DIR)/Dbg2.aslc + $(RK_COMMON_ACPI_DIR)/Pptt.aslc + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Silicon/Rockchip/RockchipPkg.dec + Silicon/Rockchip/RK3588/RK3588.dec + +[FixedPcd] + gArmTokenSpaceGuid.PcdArmArchTimerIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum + gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase + gArmTokenSpaceGuid.PcdGicDistributorBase + gArmTokenSpaceGuid.PcdGicRedistributorsBase + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase + gRK3588TokenSpaceGuid.PcdI2S0Supported + gRK3588TokenSpaceGuid.PcdI2S1Supported + gRockchipTokenSpaceGuid.PcdRkMtlMailBoxBase + gRockchipTokenSpaceGuid.PcdRkMtlMailBoxSize + gRockchipTokenSpaceGuid.PcdRkSdmmcCardDetectBroken diff --git a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl new file mode 100644 index 000000000..63c860058 --- /dev/null +++ b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl @@ -0,0 +1,39 @@ +/** @file + * + * Differentiated System Definition Table (DSDT) + * + * Copyright (c) 2020, Pete Batard + * Copyright (c) 2018-2020, Andrey Warkentin + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) 2021, ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#include "AcpiTables.h" + +DefinitionBlock ("Dsdt.aml", "DSDT", 2, "RKCP ", "RK3588S", 2) +{ + Scope (\_SB_) + { + include ("DsdtCommon.asl") + + include ("Cpu.asl") + + include ("Pcie.asl") + include ("Sata.asl") + include ("Emmc.asl") + include ("Sdhc.asl") + include ("Dma.asl") + include ("Gmac1.asl") + include ("Gpio.asl") + include ("I2c.asl") + include ("Uart.asl") + //include ("Spi.asl") + + include ("Usb2Host.asl") + include ("Usb3Host0.asl") + include ("Usb3Host1.asl") + } +} diff --git a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.c b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.c new file mode 100644 index 000000000..6525824e8 --- /dev/null +++ b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.c @@ -0,0 +1,342 @@ +/** @file +* +* Copyright (c) 2021, Rockchip Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ +#include +#include +#include +#include +#include +#include +#include + +static struct regulator_init_data rk806_init_data[] = { + /* Master PMIC */ + RK8XX_VOLTAGE_INIT(MASTER_BUCK1, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK3, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK4, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK5, 850000), + //RK8XX_VOLTAGE_INIT(MASTER_BUCK6, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK7, 2000000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK8, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK10, 1800000), + + RK8XX_VOLTAGE_INIT(MASTER_NLDO1, 750000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO2, 850000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO3, 750000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO4, 850000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO5, 750000), + + RK8XX_VOLTAGE_INIT(MASTER_PLDO1, 1800000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO2, 1800000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO3, 1200000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO4, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO5, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO6, 1800000), + /* No dual PMICs on this platform */ +}; + +VOID +EFIAPI +SdmmcIoMux ( + VOID + ) +{ + /* sdmmc0 iomux (microSD socket) */ + BUS_IOC->GPIO4D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //SDMMC_D0,SDMMC_D1,SDMMC_D2,SDMMC_D3 + BUS_IOC->GPIO4D_IOMUX_SEL_H = (0x00FFUL << 16) | (0x0011); //SDMMC_CLK,SDMMC_CMD + PMU1_IOC->GPIO0A_IOMUX_SEL_H = (0x000FUL << 16) | (0x0001); //SDMMC_DET +} + +VOID +EFIAPI +SdhciEmmcIoMux ( + VOID + ) +{ + /* sdhci0 iomux (eMMC socket) */ + BUS_IOC->GPIO2A_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //EMMC_CMD,EMMC_CLKOUT,EMMC_DATASTROBE,EMMC_RSTN + BUS_IOC->GPIO2D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //EMMC_D0,EMMC_D1,EMMC_D2,EMMC_D3 + BUS_IOC->GPIO2D_IOMUX_SEL_H = (0xFFFFUL << 16) | (0x1111); //EMMC_D4,EMMC_D5,EMMC_D6,EMMC_D7 +} + +#define NS_CRU_BASE 0xFD7C0000 +#define CRU_CLKSEL_CON59 0x03EC +#define CRU_CLKSEL_CON78 0x0438 + +VOID +EFIAPI +Rk806SpiIomux ( + VOID + ) +{ + /* io mux */ + //BUS_IOC->GPIO1A_IOMUX_SEL_H = (0xFFFFUL << 16) | 0x8888; + //BUS_IOC->GPIO1B_IOMUX_SEL_L = (0x000FUL << 16) | 0x0008; + PMU1_IOC->GPIO0A_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0110; + PMU1_IOC->GPIO0B_IOMUX_SEL_L = (0xF0FFUL << 16) | 0x1011; + MmioWrite32(NS_CRU_BASE + CRU_CLKSEL_CON59, (0x00C0UL << 16) | 0x0080); +} + +VOID +EFIAPI +Rk806Configure ( + VOID + ) +{ + UINTN RegCfgIndex; + + RK806Init(); + + for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE(rk806_init_data); RegCfgIndex++) + RK806RegulatorInit(rk806_init_data[RegCfgIndex]); +} + +VOID +EFIAPI +SetCPULittleVoltage ( + IN UINT32 Microvolts + ) +{ + struct regulator_init_data Rk806CpuLittleSupply = + RK8XX_VOLTAGE_INIT(MASTER_BUCK2, Microvolts); + + RK806RegulatorInit(Rk806CpuLittleSupply); +} + +VOID +EFIAPI +NorFspiIomux ( + VOID + ) +{ + /* io mux */ + /* Do not override, set by earlier boot stages. */ +} + +VOID +EFIAPI +GmacIomux ( + IN UINT32 Id + ) +{ + switch (Id) { + case 1: + /* gmac1 iomux */ + BUS_IOC->GPIO3B_IOMUX_SEL_H = (0x0FFFUL << 16) | 0x0111; + BUS_IOC->GPIO3A_IOMUX_SEL_L = (0xFFFFUL << 16) | 0x1111; + BUS_IOC->GPIO3B_IOMUX_SEL_L = (0xF0FFUL << 16) | 0x1011; + BUS_IOC->GPIO3A_IOMUX_SEL_H = (0xF0FFUL << 16) | 0x1011; + BUS_IOC->GPIO3C_IOMUX_SEL_L = (0xFF00UL << 16) | 0x1100; + + /* phy1 reset */ + GpioPinSetDirection (3, GPIO_PIN_PB7, GPIO_PIN_OUTPUT); + break; + default: + break; + } +} + +VOID +EFIAPI +GmacIoPhyReset ( + UINT32 Id, + BOOLEAN Enable + ) +{ + switch (Id) { + case 1: + /* phy1 reset */ + GpioPinWrite (3, GPIO_PIN_PB7, !Enable); + break; + default: + break; + } +} + +VOID +EFIAPI +NorFspiEnableClock ( + UINT32 *CruBase + ) +{ + UINTN BaseAddr = (UINTN) CruBase; + + MmioWrite32(BaseAddr + 0x087C, 0x0E000000); +} + +VOID +EFIAPI +I2cIomux ( + UINT32 id + ) +{ + switch (id) { + case 0: + GpioPinSetFunction(0, GPIO_PIN_PD1, 3); //i2c0_scl_m2 + GpioPinSetFunction(0, GPIO_PIN_PD2, 3); //i2c0_sda_m2 + break; + case 1: + break; + case 2: + GpioPinSetFunction(0, GPIO_PIN_PB7, 9); //i2c2_scl_m0 + GpioPinSetFunction(0, GPIO_PIN_PC0, 9); //i2c2_sda_m0 + break; + case 3: + GpioPinSetFunction(1, GPIO_PIN_PC1, 9); //i2c3_scl_m0 + GpioPinSetFunction(1, GPIO_PIN_PC0, 9); //i2c3_sda_m0 + break; + case 4: + break; + case 5: + break; + case 6: + GpioPinSetFunction(0, GPIO_PIN_PD0, 9); //i2c6_scl_m0 + GpioPinSetFunction(0, GPIO_PIN_PC7, 9); //i2c6_sda_m0 + break; + case 7: + break; + default: + break; + } +} + +VOID +EFIAPI +UsbPortPowerEnable ( + VOID + ) +{ + DEBUG((DEBUG_INFO, "UsbPortPowerEnable called\n")); + /* Set GPIO4 PB5 (USB_HOST_PWREN) output high to power USB ports */ + GpioPinWrite (4, GPIO_PIN_PB5, TRUE); + GpioPinSetDirection (4, GPIO_PIN_PB5, GPIO_PIN_OUTPUT); + + /* Set GPIO1 PD2 (TYPEC5V_PWREN) output high to power the type-c port */ + GpioPinWrite (1, GPIO_PIN_PD2, TRUE); + GpioPinSetDirection (1, GPIO_PIN_PD2, GPIO_PIN_OUTPUT); + + // DEBUG((DEBUG_INFO, "Trying to enable on-board LED WAN\n")); + // GpioPinWrite (1, GPIO_PIN_PC2, TRUE); + // GpioPinSetDirection (1, GPIO_PIN_PC2, GPIO_PIN_OUTPUT); + + // DEBUG((DEBUG_INFO, "Trying to enable on-board LED LAN\n")); + // GpioPinWrite (1, GPIO_PIN_PC3, TRUE); + // GpioPinSetDirection (1, GPIO_PIN_PC3, GPIO_PIN_OUTPUT); + + // DEBUG((DEBUG_INFO, "Trying to enable on-board LED1\n")); + // GpioPinWrite (1, GPIO_PIN_PC4, TRUE); + // GpioPinSetDirection (1, GPIO_PIN_PC4, GPIO_PIN_OUTPUT); +} + +VOID +EFIAPI +Usb2PhyResume ( + VOID + ) +{ + MmioWrite32(0xfd5d0008, 0x20000000); + MmioWrite32(0xfd5d4008, 0x20000000); + MmioWrite32(0xfd5d8008, 0x20000000); + MmioWrite32(0xfd5dc008, 0x20000000); + MmioWrite32(0xfd7f0a10, 0x07000700); + MmioWrite32(0xfd7f0a10, 0x07000000); +} + +VOID +EFIAPI +PcieIoInit ( + UINT32 Segment + ) +{ + /* Set reset and power IO to gpio output mode */ + switch(Segment) { + case PCIE_SEGMENT_PCIE20L1: // RTL8152BG + // GPIO1_A7_u - PCIE20x1_1_PERSTn_M2 + GpioPinSetDirection (1, GPIO_PIN_PA7, GPIO_PIN_OUTPUT); + break; + case PCIE_SEGMENT_PCIE20L2: // M.2 SSD + // GPIO3_D1_d - PCIE20X1_2_PERSTN_M0 + GpioPinSetDirection (3, GPIO_PIN_PD1, GPIO_PIN_OUTPUT); + break; + default: + break; + } +} + +VOID +EFIAPI +PciePowerEn ( + UINT32 Segment, + BOOLEAN Enable + ) +{ + /* nothing to power on */ +} + +VOID +EFIAPI +PciePeReset ( + UINT32 Segment, + BOOLEAN Enable + ) +{ + switch(Segment) { + case PCIE_SEGMENT_PCIE20L1: + GpioPinWrite (1, GPIO_PIN_PA7, !Enable); + break; + case PCIE_SEGMENT_PCIE20L2: + GpioPinWrite (3, GPIO_PIN_PD1, !Enable); + break; + default: + break; + } +} + +VOID +EFIAPI +PwmFanIoSetup ( + VOID + ) +{ +} + +VOID +EFIAPI +PwmFanSetSpeed ( + IN UINT32 Percentage + ) +{ +} + +VOID +EFIAPI +PlatformInitLeds ( + VOID + ) +{ + /* Status indicator */ + GpioPinWrite (1, GPIO_PIN_PC1, FALSE); + GpioPinSetDirection (1, GPIO_PIN_PC1, GPIO_PIN_OUTPUT); +} + +VOID +EFIAPI +PlatformSetStatusLed ( + IN BOOLEAN Enable + ) +{ + GpioPinWrite (1, GPIO_PIN_PC1, Enable); +} + +VOID +EFIAPI +PlatformEarlyInit ( + VOID + ) +{ + // Configure various things specific to this platform +} diff --git a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.inf b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.inf new file mode 100644 index 000000000..ec569eaf3 --- /dev/null +++ b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/Library/RockchipPlatformLib/RockchipPlatformLib.inf @@ -0,0 +1,34 @@ +# +# Copyright (c) 2021, Rockchip Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = RockchipPlatformLib + FILE_GUID = 5178fa86-2fec-11ec-95b4-f42a7dcb925d + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = RockchipPlatformLib + RKPLATLIB_COMMON_DIR = Silicon/Rockchip/RK3588/Library/RockchipPlatformLibCommon + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Silicon/Rockchip/RK3588/RK3588.dec + Silicon/Rockchip/RockchipPkg.dec + +[LibraryClasses] + ArmLib + HobLib + IoLib + MemoryAllocationLib + SerialPortLib + CruLib + GpioLib + +[Sources.common] + RockchipPlatformLib.c + $(RKPLATLIB_COMMON_DIR)/RK3588CruLib.c diff --git a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.Modules.fdf.inc b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.Modules.fdf.inc new file mode 100644 index 000000000..948e034ec --- /dev/null +++ b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.Modules.fdf.inc @@ -0,0 +1,20 @@ +## @file +# +# Copyright (c) 2023, Mario Bălănică +# Copyright (c) 2023, Sergey Tyuryukanov +# Copyright (c) 2024, LokiSharp +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + + # ACPI Support + INF RuleOverride = ACPITABLE $(PLATFORM_DIRECTORY)/AcpiTables/AcpiTables.inf + + # Device Tree Support + FILE FREEFORM = gDtPlatformDefaultDtbFileGuid { + SECTION RAW = Platform/Rockchip/DeviceTree/rk3588-nanopi-m6.dtb + } + + # Splash screen logo + INF $(VENDOR_DIRECTORY)/Drivers/LogoDxe/LogoDxe.inf diff --git a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.dsc b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.dsc new file mode 100644 index 000000000..6b3ce9a87 --- /dev/null +++ b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/NanoPi-M6.dsc @@ -0,0 +1,115 @@ +## @file +# +# Copyright (c) 2014-2018, Linaro Limited. All rights reserved. +# Copyright (c) 2023, Molly Sophia +# Copyright (c) 2023, Mario Bălănică +# Copyright (c) 2023, Sergey Tyuryukanov +# Copyright (c) 2024, LokiSharp +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + PLATFORM_NAME = NanoPi-M6 + PLATFORM_VENDOR = FriendlyElec + PLATFORM_GUID = cf256089-670b-d7c7-1e82-8b2b99637832 + PLATFORM_VERSION = 0.2 + DSC_SPECIFICATION = 0x00010019 + OUTPUT_DIRECTORY = Build/$(PLATFORM_NAME) + VENDOR_DIRECTORY = Platform/$(PLATFORM_VENDOR) + PLATFORM_DIRECTORY = $(VENDOR_DIRECTORY)/$(PLATFORM_NAME) + SUPPORTED_ARCHITECTURES = AARCH64 + BUILD_TARGETS = DEBUG|RELEASE + SKUID_IDENTIFIER = DEFAULT + FLASH_DEFINITION = Silicon/Rockchip/RK3588/RK3588.fdf + RK_PLATFORM_FVMAIN_MODULES = $(PLATFORM_DIRECTORY)/$(PLATFORM_NAME).Modules.fdf.inc + + # + # HYM8563 RTC support + # I2C location configured by PCDs below. + # + DEFINE RK_RTC8563_ENABLE = TRUE + + # + # RK3588S-based platform + # +!include Silicon/Rockchip/RK3588/RK3588SPlatform.dsc.inc + +################################################################################ +# +# Library Class section - list of all Library Classes needed by this Platform. +# +################################################################################ + +[LibraryClasses.common] + RockchipPlatformLib|$(PLATFORM_DIRECTORY)/Library/RockchipPlatformLib/RockchipPlatformLib.inf + +################################################################################ +# +# Pcd Section - list of all EDK II PCD Entries defined by this Platform. +# +################################################################################ + +[PcdsFixedAtBuild.common] + # SMBIOS platform config + gRockchipTokenSpaceGuid.PcdPlatformName|"NanoPi M6" + gRockchipTokenSpaceGuid.PcdPlatformVendorName|"FriendlyElec" + gRockchipTokenSpaceGuid.PcdFamilyName|"NanoPi" + gRockchipTokenSpaceGuid.PcdProductUrl|"https://wiki.friendlyelec.com/wiki/index.php/NanoPi_M6" + gRockchipTokenSpaceGuid.PcdDeviceTreeName|"rk3588s-nanopi-m6" + + # I2C + gRockchipTokenSpaceGuid.PcdI2cSlaveAddresses|{ 0x42, 0x43, 0x51 } + gRockchipTokenSpaceGuid.PcdI2cSlaveBuses|{ 0x0, 0x0, 0x6 } + gRockchipTokenSpaceGuid.PcdI2cSlaveBusesRuntimeSupport|{ FALSE, FALSE, TRUE } + gRockchipTokenSpaceGuid.PcdRk860xRegulatorAddresses|{ 0x42, 0x43 } + gRockchipTokenSpaceGuid.PcdRk860xRegulatorBuses|{ 0x0, 0x0 } + gRockchipTokenSpaceGuid.PcdRk860xRegulatorTags|{ $(SCMI_CLK_CPUB01), $(SCMI_CLK_CPUB23) } + gPcf8563RealTimeClockLibTokenSpaceGuid.PcdI2cSlaveAddress|0x51 + gRockchipTokenSpaceGuid.PcdRtc8563Bus|0x6 + + # + # CPU Performance default values + # + gRK3588TokenSpaceGuid.PcdCPULClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + gRK3588TokenSpaceGuid.PcdCPUB01ClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + gRK3588TokenSpaceGuid.PcdCPUB23ClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + + # + # PCIe/SATA/USB Combo PIPE PHY support flags and default values + # + gRK3588TokenSpaceGuid.PcdComboPhy0Switchable|FALSE + gRK3588TokenSpaceGuid.PcdComboPhy2Switchable|FALSE + gRK3588TokenSpaceGuid.PcdComboPhy0ModeDefault|$(COMBO_PHY_MODE_PCIE) + gRK3588TokenSpaceGuid.PcdComboPhy2ModeDefault|$(COMBO_PHY_MODE_PCIE) + + # + # USB/DP Combo PHY support flags and default values + # + gRK3588TokenSpaceGuid.PcdUsbDpPhy0Supported|TRUE + gRK3588TokenSpaceGuid.PcdDp0LaneMux|{ 0x2, 0x3 } + + # + # GMAC + # + gRK3588TokenSpaceGuid.PcdGmac1Supported|TRUE + gRK3588TokenSpaceGuid.PcdGmac1TxDelay|0x42 + +################################################################################ +# +# Components Section - list of all EDK II Modules needed by this Platform. +# +################################################################################ +[Components.common] + # ACPI Support + $(PLATFORM_DIRECTORY)/AcpiTables/AcpiTables.inf + + # Splash screen logo + $(VENDOR_DIRECTORY)/Drivers/LogoDxe/LogoDxe.inf + From 8b2531f888de4b472eb7af1bc2357ca7bee676ab Mon Sep 17 00:00:00 2001 From: LokiSharp Date: Sun, 13 Oct 2024 23:07:45 +0800 Subject: [PATCH 2/2] Use GMAC0 --- .../Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl index 63c860058..6710a7e5f 100644 --- a/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl +++ b/edk2-rockchip/Platform/FriendlyElec/NanoPi-M6/AcpiTables/Dsdt.asl @@ -26,7 +26,7 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 2, "RKCP ", "RK3588S", 2) include ("Emmc.asl") include ("Sdhc.asl") include ("Dma.asl") - include ("Gmac1.asl") + include ("Gmac0.asl") include ("Gpio.asl") include ("I2c.asl") include ("Uart.asl")