diff --git a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf index a4087379..909fbffa 100644 --- a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf +++ b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/OpensbiPlatformLib.inf @@ -25,8 +25,6 @@ [Sources] Platform.c - SifiveFu540.c - PlatformOverride.h [Packages] EmbeddedPkg/EmbeddedPkg.dec @@ -45,6 +43,7 @@ PcdLib PrintLib RiscVCpuLib + RiscVSpecialPlatformLib [FixedPcd] gUefiRiscVPlatformPkgTokenSpaceGuid.PcdBootHartId diff --git a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/Platform.c b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/Platform.c index 4fbb2018..06cd1a29 100644 --- a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/Platform.c +++ b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/Platform.c @@ -5,10 +5,16 @@ * * Authors: * Anup Patel + + Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + */ #include -#include +#include + #include #include #include @@ -24,11 +30,12 @@ #include #include -extern const struct platform_override sifive_fu540; - -static const struct platform_override *special_platforms[] = { - &sifive_fu540, -}; +// +// SpecialPlatformArray and NumberOfSpecialPlatform are +// provided by RiscVSpecialPlatformLib library. +// +extern const struct platform_override *special_platforms[]; +extern INTN NumberOfPlaformsInArray; static const struct platform_override *generic_plat = NULL; static const struct fdt_match *generic_plat_match = NULL; @@ -39,7 +46,11 @@ static void fw_platform_lookup_special(void *fdt, int root_offset) const struct platform_override *plat; const struct fdt_match *match; - for (pos = 0; pos < array_size(special_platforms); pos++) { + if (special_platforms == NULL || NumberOfPlaformsInArray == 0) { + return; + } + + for (pos = 0; pos < (int)NumberOfPlaformsInArray; pos++) { plat = special_platforms[pos]; if (!plat->match_table) continue; diff --git a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/PlatformOverride.h b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/PlatformOverride.h deleted file mode 100644 index 467ebbd4..00000000 --- a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/PlatformOverride.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2020 Western Digital Corporation or its affiliates. - * - * Authors: - * Anup Patel - */ - -#ifndef __PLATFORM_OVERRIDE_H__ -#define __PLATFORM_OVERRIDE_H__ - -#include - -struct platform_override { - const struct fdt_match *match_table; - u64 (*features)(const struct fdt_match *match); - u64 (*tlbr_flush_limit)(const struct fdt_match *match); - int (*early_init)(bool cold_boot, const struct fdt_match *match); - int (*final_init)(bool cold_boot, const struct fdt_match *match); - void (*early_exit)(const struct fdt_match *match); - void (*final_exit)(const struct fdt_match *match); - int (*system_reset_check)(u32 reset_type, u32 reset_reason, - const struct fdt_match *match); - void (*system_reset)(u32 reset_type, u32 reset_reason, - const struct fdt_match *match); - int (*fdt_fixup)(void *fdt, const struct fdt_match *match); -}; - -#endif diff --git a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/SifiveFu540.c b/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/SifiveFu540.c deleted file mode 100644 index 748b0588..00000000 --- a/Platform/RISC-V/PlatformPkg/Library/OpensbiPlatformLib/SifiveFu540.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2020 Western Digital Corporation or its affiliates. - * - * Authors: - * Anup Patel - */ - -#include -#include -#include - -static u64 sifive_fu540_tlbr_flush_limit(const struct fdt_match *match) -{ - /* - * The sfence.vma by virtual address does not work on - * SiFive FU540 so we return remote TLB flush limit as zero. - */ - return 0; -} - -static int sifive_fu540_fdt_fixup(void *fdt, const struct fdt_match *match) -{ - /* - * SiFive Freedom U540 has an erratum that prevents S-mode software - * to access a PMP protected region using 1GB page table mapping, so - * always add the no-map attribute on this platform. - */ - fdt_reserved_memory_nomap_fixup(fdt); - - return 0; -} - -static const struct fdt_match sifive_fu540_match[] = { - { .compatible = "sifive,fu540" }, - { .compatible = "sifive,fu540g" }, - { .compatible = "sifive,fu540-c000" }, - { .compatible = "sifive,hifive-unleashed-a00" }, - { }, -}; - -const struct platform_override sifive_fu540 = { - .match_table = sifive_fu540_match, - .tlbr_flush_limit = sifive_fu540_tlbr_flush_limit, - .fdt_fixup = sifive_fu540_fdt_fixup, -};