Determine total number of hart from DTB instead of using PCD. Signed-off-by: Abner Chang <abner.ch...@hpe.com> Cc: Daniel Schaefer <daniel.schae...@hpe.com> Cc: Sunil V L <suni...@ventanamicro.com> --- .../U540.fdf.inc | 1 - .../OpensbiPlatformLib/OpensbiPlatformLib.inf | 3 - .../PlatformPkg/Universal/Sec/SecMain.inf | 1 - .../PlatformPkg/Universal/Sec/SecMain.c | 12 ++-- .../Universal/Sec/Riscv64/SecEntry.S | 60 +++++++++++++------ 5 files changed, 49 insertions(+), 28 deletions(-)
diff --git a/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/U540.fdf.inc b/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/U540.fdf.inc index 1a525dc874..404c0b71ca 100644 --- a/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/U540.fdf.inc +++ b/Platform/SiFive/U5SeriesPkg/FreedomU540HiFiveUnleashedBoard/U540.fdf.inc @@ -90,7 +90,6 @@ SET gUefiRiscVPlatformPkgTokenSpaceGuid.PcdTemporaryRamSize = 0x10000 SET gUefiRiscVPkgTokenSpaceGuid.PcdRiscVMachineTimerFrequencyInHerz = 1000000 SET gSiFiveU5SeriesPlatformsPkgTokenSpaceGuid.PcdU5PlatformSystemClock = 1000000000 # 1GHz system clock -SET gUefiRiscVPlatformPkgTokenSpaceGuid.PcdHartCount = 5 # Total cores on U540 platform SET gUefiRiscVPlatformPkgTokenSpaceGuid.PcdBootHartId = 1 # Boot hart ID # diff --git a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf index 2e1227733a..6661ee8204 100644 --- a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf +++ b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf @@ -46,9 +46,6 @@ RiscVSpecialPlatformLib [FixedPcd] - gUefiRiscVPlatformPkgTokenSpaceGuid.PcdBootHartId - gUefiRiscVPlatformPkgTokenSpaceGuid.PcdHartCount - gUefiRiscVPlatformPkgTokenSpaceGuid.PcdBootableHartNumber gUefiRiscVPlatformPkgTokenSpaceGuid.PcdOpenSbiStackSize diff --git a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.inf b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.inf index ceb6d25222..b949b6c470 100644 --- a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.inf +++ b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.inf @@ -61,7 +61,6 @@ [Pcd] gUefiRiscVPlatformPkgTokenSpaceGuid.PcdBootHartId - gUefiRiscVPlatformPkgTokenSpaceGuid.PcdHartCount gUefiRiscVPlatformPkgTokenSpaceGuid.PcdRootFirmwareDomainBaseAddress gUefiRiscVPlatformPkgTokenSpaceGuid.PcdRootFirmwareDomainSize gUefiRiscVPlatformPkgTokenSpaceGuid.PcdBootableHartNumber diff --git a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c index f2b2c7b583..17f33a02cc 100644 --- a/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c +++ b/Platform/RISC-V/PlatformPkg/Universal/Sec/SecMain.c @@ -530,7 +530,7 @@ GetDeviceTreeAddress ( EFI_COMMON_SECTION_HEADER *FoundSection; if (FixedPcdGet32 (PcdDeviceTreeAddress)) { - DEBUG ((DEBUG_INFO, "Use fixed address of DBT from PcdDeviceTreeAddress 0x%x.\n", FixedPcdGet32 (PcdDeviceTreeAddress))); + DEBUG ((DEBUG_INFO, "Use fixed address of DBT from PcdDeviceTreeAddress 0x%x 0x%x.\n", FixedPcdGet32 (PcdDeviceTreeAddress), *((unsigned long *)FixedPcdGet32 (PcdDeviceTreeAddress)))); // // Device tree address is pointed by PcdDeviceTreeAddress. // @@ -647,11 +647,10 @@ VOID EFIAPI SecCoreStartUpWithStack( // ThisSbiPlatform = (struct sbi_platform *)sbi_platform_ptr(Scratch); ThisSbiPlatform->platform_ops_addr = (unsigned long)&Edk2OpensbiPlatformOps; + Scratch->next_arg1 = (unsigned long)GetDeviceTreeAddress (); if (HartId == FixedPcdGet32(PcdBootHartId)) { - - Scratch->next_arg1 = (unsigned long)GetDeviceTreeAddress (); if (Scratch->next_arg1 == (unsigned long)NULL) { - DEBUG ((DEBUG_ERROR, "Platform Device Tree is not found\n")); + DEBUG ((DEBUG_ERROR, "Platform Device Tree is not found on boot hart\n")); ASSERT (FALSE); } DEBUG ((DEBUG_INFO, "Device Tree at 0x%x\n", Scratch->next_arg1)); @@ -685,6 +684,11 @@ VOID EFIAPI SecCoreStartUpWithStack( NonBootHartMessageLockValue = atomic_xchg(&NonBootHartMessageLock, TRUE); }; DEBUG((DEBUG_INFO, "%a: Non boot hart %d initialization.\n", __FUNCTION__, HartId)); + if (Scratch->next_arg1 == (unsigned long)NULL) { + DEBUG ((DEBUG_ERROR, "Platform Device Tree is not found\n")); + ASSERT (FALSE); + } + DEBUG((DEBUG_INFO, "%a: Non boot hart %d DTB is at 0x%x.\n", __FUNCTION__, HartId, Scratch->next_arg1)); NonBootHartMessageLockValue = atomic_xchg(&NonBootHartMessageLock, FALSE); // // Non boot hart wiil be halted waiting for SBI_HART_STARTING. diff --git a/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S b/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S index 96087738a3..0fc7817665 100644 --- a/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S +++ b/Platform/RISC-V/PlatformPkg/Universal/Sec/Riscv64/SecEntry.S @@ -37,14 +37,39 @@ ASM_FUNC (_ModuleEntryPoint) li a5, FixedPcdGet32 (PcdBootHartId) bne a6, a5, _wait_for_boot_hart - li ra, 0 - call _reset_regs + /* + * Initial the hart count reported in DTB + */ + li a4, FixedPcdGet32 (PcdTemporaryRamBase) + li a5, FixedPcdGet32 (PcdTemporaryRamSize) + /* Use Temp memory as the stack for calling to C code */ + add sp, a4, a5 + /* Get the address of device tree and call generic fw_platform_init */ + call GetDeviceTreeAddress /* a0 return the device tree address */ + beqz a0, skip_fw_init + add a1, a0, 0 /* a1 is device tree */ + csrr a0, CSR_MHARTID /* a0 is boot hart ID */ + call fw_platform_init +skip_fw_init: /* Preload HART details - * s7 -> HART Count + * s7 -> Total HART count from PCD or DTB * s8 -> HART Stack Size */ - li s7, FixedPcdGet32 (PcdHartCount) + la a0, platform +#if __riscv_xlen == 64 + lwu s7, SBI_PLATFORM_HART_COUNT_OFFSET(a0) +#else + lw s7, SBI_PLATFORM_HART_COUNT_OFFSET(a0) +#endif + /* + * This is the number of HARTs described in + * DTB for this processor. We allocate the + * scratch buffer according to this number. + */ + la a4, _pysical_hart_count + sd s7, (a4) + li s8, FixedPcdGet32 (PcdOpenSbiStackSize) /* @@ -113,20 +138,9 @@ _scratch_init: li a4, FixedPcdGet32 (PcdTemporaryRamBase) li a5, FixedPcdGet32 (PcdTemporaryRamSize) - /* Use Temp memory as the stack for calling to C code */ add sp, a4, a5 - /* Get the address of device tree and call generic fw_platform_init */ - call GetDeviceTreeAddress /* a0 return the device tree address */ - beqz a0, skip_fw_init - add a1, a0, 0 /* a1 is device tree */ - csrr a0, CSR_MHARTID /* a0 is hart ID */ - call fw_platform_init -skip_fw_init: - /* Zero out temporary memory */ - li a4, FixedPcdGet32 (PcdTemporaryRamBase) - li a5, FixedPcdGet32 (PcdTemporaryRamSize) add a5, a4, a5 1: li a3, 0x0 @@ -167,7 +181,11 @@ _start_warm: li s7, FixedPcdGet32 (PcdBootableHartNumber) bnez s7, 1f la a4, platform - REG_L s7, SBI_PLATFORM_HART_COUNT_OFFSET(a4) +#if __riscv_xlen == 64 + lwu s7, SBI_PLATFORM_HART_COUNT_OFFSET(a4) +#else + lw s7, SBI_PLATFORM_HART_COUNT_OFFSET(a4) +#endif 1: li s8, FixedPcdGet32 (PcdOpenSbiStackSize) la a4, platform @@ -209,7 +227,8 @@ _start_warm: csrr a0, CSR_MHARTID j _uninitialized_hart_wait 4: - li s7, FixedPcdGet32 (PcdHartCount) + la a5, _pysical_hart_count + ld s7, (a5) /* Find the scratch space for this hart * * Scratch buffer is on the top of stack buffer @@ -275,6 +294,8 @@ _start_warm: .section .data, "aw" _boot_hart_done: RISCV_PTR 0 +_pysical_hart_count: + RISCV_PTR 0 .align 3 .section .entry, "ax", %progbits @@ -293,7 +314,7 @@ _hartid_to_scratch: /* * s0 -> HART Stack Size * s1 -> HART Stack End - * s2 -> Temporary + * s2 -> Total hart count */ la s2, platform #if __riscv_xlen == 64 @@ -301,8 +322,9 @@ _hartid_to_scratch: #else lw s0, SBI_PLATFORM_HART_STACK_SIZE_OFFSET(s2) #endif - li s2, FixedPcdGet32 (PcdHartCount) + la s1, _pysical_hart_count /* total HART count */ + ld s2, (s1) mul s2, s2, s0 li s1, FixedPcdGet32 (PcdScratchRamBase) add s1, s1, s2 -- 2.31.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#82342): https://edk2.groups.io/g/devel/message/82342 Mute This Topic: https://groups.io/mt/86435699/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-