feat(plat/arm): Introduce the common arm platform
This patch introduced the common arm platform which can be used
by any compatible hardware. This allows reuse of code across multiple
platforms and possibly a single binary which can run on these platforms.
This depends on the MAX_CPU and RMM_MAX_GRANULES and RMM_MAX_SIZE can
encompass the superset of the values.
Signed-off-by: Harry Moulton <harry.moulton@arm.com>
Signed-off-by: Soby Mathew <soby.mathew@arm.com>
Change-Id: I69ceea101595f0e8cac81bd9e4d8754d2b1edbc3
diff --git a/cmake/CommonConfigs.cmake b/cmake/CommonConfigs.cmake
index d212c06..ea517a3 100644
--- a/cmake/CommonConfigs.cmake
+++ b/cmake/CommonConfigs.cmake
@@ -48,9 +48,7 @@
NAME RMM_FPU_USE_AT_REL2
HELP "Enable Advanced SIMD support in RMM"
TYPE BOOL
- DEFAULT ON
- DEPENDS (RMM_ARCH STREQUAL aarch64)
- ELSE OFF)
+ DEFAULT OFF)
#
# The number of 4K pages allocated for attestation buffer.
diff --git a/configs/fvp_defcfg.cmake b/configs/fvp_defcfg.cmake
index 5d9bc2e..b0b1867 100644
--- a/configs/fvp_defcfg.cmake
+++ b/configs/fvp_defcfg.cmake
@@ -6,39 +6,15 @@
#
# Set the RMM_PLATFORM variable to Cmake cache.
#
-set(RMM_PLATFORM "fvp" CACHE STRING "platform")
+set(RMM_PLATFORM "arm" CACHE STRING "platform")
arm_config_option_override(NAME RMM_TOOLCHAIN DEFAULT "gnu")
#
-# Width of the virtual address space for the system.
-#
-arm_config_option_override(NAME VIRT_ADDR_SPACE_WIDTH DEFAULT 38)
-
-#
# Set RMM_MAX_SIZE for this platform (24MB)
#
arm_config_option_override(NAME RMM_MAX_SIZE DEFAULT 0x01800000)
#
-# Extra memory regions needed by this platform
-#
-arm_config_option_override(NAME PLAT_CMN_EXTRA_MMAP_REGIONS DEFAULT 1)
-
-#
-# Maximum number of translation tables allocated by the runtime context
-# for the translation library.
-#
-arm_config_option_override(NAME PLAT_CMN_CTX_MAX_XLAT_TABLES DEFAULT 6)
-
-#
-# Disable FPU/SIMD usage in RMM. Enabling this option turns on
-# DMBEDTLS_SHAXXX_USE_A64_CRYPTO_ONLY in Mbed TLS. To run RMM that was compiled
-# this way requires Crypto.so plugin to be present for the FVP. This plugin is
-# delivered separate to the FVP, and might not be present in all environments.
-#
-arm_config_option_override(NAME RMM_FPU_USE_AT_REL2 DEFAULT OFF)
-
-#
# Maximum number of granules supported, enough to cover
# (2GB - 64MB) of DRAM0 and 2GB of DRAM1. We overprovision
# for the case that DT has not catered for the 64 MB carveout.
diff --git a/lib/realm/CMakeLists.txt b/lib/realm/CMakeLists.txt
index bf2ce52..ef4ddc0 100644
--- a/lib/realm/CMakeLists.txt
+++ b/lib/realm/CMakeLists.txt
@@ -8,7 +8,7 @@
arm_config_option(
NAME VIRT_ADDR_SPACE_WIDTH
HELP "Size in bits of the virtual address space."
- DEFAULT 0x0
+ DEFAULT 38
TYPE STRING
ADVANCED)
diff --git a/plat/arm/CMakeLists.txt b/plat/arm/CMakeLists.txt
new file mode 100644
index 0000000..8161aec
--- /dev/null
+++ b/plat/arm/CMakeLists.txt
@@ -0,0 +1,35 @@
+#
+# SPDX-License-Identifier: BSD-3-Clause
+# SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
+#
+
+add_library(rmm-plat-arm)
+
+#
+# Extra memory regions needed by this platform
+#
+arm_config_option_override(NAME PLAT_CMN_EXTRA_MMAP_REGIONS DEFAULT 1)
+
+#
+# Maximum number of translation tables allocated by the runtime context
+# for the translation library.
+#
+arm_config_option_override(NAME PLAT_CMN_CTX_MAX_XLAT_TABLES DEFAULT 6)
+
+add_subdirectory("${RMM_SOURCE_DIR}/drivers/pl011" ${RMM_BINARY_DIR}/drivers/pl011)
+add_subdirectory("${RMM_SOURCE_DIR}/plat/common" ${RMM_BINARY_DIR}/plat/common)
+
+target_link_libraries(rmm-plat-arm
+ PRIVATE rmm-driver-pl011
+ rmm-lib
+ rmm-plat-common)
+
+target_sources(rmm-plat-arm
+ PRIVATE "src/arm_setup.c"
+ "src/arm_granule.c"
+ "src/arm_memory.c")
+
+target_include_directories(rmm-plat-arm
+ PRIVATE "src/include")
+
+add_library(rmm-platform ALIAS rmm-plat-arm)
diff --git a/plat/arm/src/arm_granule.c b/plat/arm/src/arm_granule.c
new file mode 100644
index 0000000..983b6ee
--- /dev/null
+++ b/plat/arm/src/arm_granule.c
@@ -0,0 +1,49 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
+ */
+
+#include <arm_dram.h>
+#include <assert.h>
+#include <platform_api.h>
+#include <utils_def.h>
+
+static struct arm_dram_layout arm_dram;
+
+struct arm_dram_layout *arm_get_dram_layout(void)
+{
+ return &arm_dram;
+}
+
+unsigned long plat_granule_addr_to_idx(unsigned long addr)
+{
+ if (!GRANULE_ALIGNED(addr)) {
+ return UINT64_MAX;
+ }
+
+ if ((addr >= arm_dram.arm_bank[0].start_addr) &&
+ (addr <= arm_dram.arm_bank[0].end_addr)) {
+ return (addr - arm_dram.arm_bank[0].start_addr) / GRANULE_SIZE;
+ }
+
+ if ((arm_dram.arm_bank[1].start_addr != 0UL) &&
+ (addr >= arm_dram.arm_bank[1].start_addr) &&
+ (addr <= arm_dram.arm_bank[1].end_addr)) {
+ return ((addr - arm_dram.arm_bank[1].start_addr) /
+ GRANULE_SIZE) + arm_dram.idx_bank_1;
+ }
+
+ return UINT64_MAX;
+}
+
+unsigned long plat_granule_idx_to_addr(unsigned long idx)
+{
+ assert(idx < arm_dram.num_granules);
+
+ if (idx < arm_dram.idx_bank_1) {
+ return arm_dram.arm_bank[0].start_addr + (idx * GRANULE_SIZE);
+ }
+
+ return arm_dram.arm_bank[1].start_addr +
+ ((idx - arm_dram.idx_bank_1) * GRANULE_SIZE);
+}
diff --git a/plat/fvp/src/fvp_memory.c b/plat/arm/src/arm_memory.c
similarity index 75%
rename from plat/fvp/src/fvp_memory.c
rename to plat/arm/src/arm_memory.c
index ff6a816..01783df 100644
--- a/plat/fvp/src/fvp_memory.c
+++ b/plat/arm/src/arm_memory.c
@@ -4,17 +4,17 @@
*/
#include <arch_helpers.h>
+#include <arm_dram.h>
#include <assert.h>
-#include <fvp_dram.h>
#include <rmm_el3_ifc.h>
COMPILER_ASSERT(MAX_DRAM_NUM_BANKS == 2UL);
-void fvp_set_dram_layout(struct ns_dram_info *plat_dram)
+void arm_set_dram_layout(struct ns_dram_info *plat_dram)
{
uint64_t num_banks, num_granules = 0UL;
struct ns_dram_bank *bank_ptr;
- struct fvp_dram_layout *dram_ptr = fvp_get_dram_layout();
+ struct arm_dram_layout *dram_ptr = arm_get_dram_layout();
/* Number of banks */
num_banks = plat_dram->num_banks;
@@ -36,13 +36,13 @@
/* Total number of granules */
num_granules += (size / GRANULE_SIZE);
- dram_ptr->fvp_bank[i].start_addr = start;
- dram_ptr->fvp_bank[i].end_addr = end;
+ dram_ptr->arm_bank[i].start_addr = start;
+ dram_ptr->arm_bank[i].end_addr = end;
bank_ptr++;
}
dram_ptr->num_granules = num_granules;
- inv_dcache_range((uintptr_t)dram_ptr, sizeof(struct fvp_dram_layout));
+ inv_dcache_range((uintptr_t)dram_ptr, sizeof(struct arm_dram_layout));
}
diff --git a/plat/fvp/src/fvp_setup.c b/plat/arm/src/arm_setup.c
similarity index 93%
rename from plat/fvp/src/fvp_setup.c
rename to plat/arm/src/arm_setup.c
index 0e22551..e17dccf 100644
--- a/plat/fvp/src/fvp_setup.c
+++ b/plat/arm/src/arm_setup.c
@@ -4,8 +4,8 @@
*/
#include <arch_features.h>
+#include <arm_dram.h>
#include <debug.h>
-#include <fvp_dram.h>
#include <pl011.h>
#include <plat_common.h>
#include <platform_api.h>
@@ -14,10 +14,7 @@
#include <string.h>
#include <xlat_tables.h>
-/* FVP UART Base address. */
-#define FVP_UART_ADDR UL(0x1c0c0000)
-
-#define FVP_RMM_UART MAP_REGION_FLAT( \
+#define ARM_RMM_UART MAP_REGION_FLAT( \
0, \
SZ_4K, \
(MT_DEVICE | MT_RW | MT_REALM))
@@ -61,7 +58,7 @@
/* TBD Initialize UART for early log */
struct xlat_mmap_region plat_regions[] = {
- FVP_RMM_UART,
+ ARM_RMM_UART,
{0}
};
@@ -122,8 +119,8 @@
rmm_el3_ifc_report_fail_to_el3(ret);
}
- /* Set up FVP DRAM layout */
- fvp_set_dram_layout(plat_dram);
+ /* Set up Arm DRAM layout */
+ arm_set_dram_layout(plat_dram);
plat_warmboot_setup(x0, x1, x2, x3);
}
diff --git a/plat/fvp/src/include/fvp_dram.h b/plat/arm/src/include/arm_dram.h
similarity index 60%
rename from plat/fvp/src/include/fvp_dram.h
rename to plat/arm/src/include/arm_dram.h
index 054e6f1..468bc94 100644
--- a/plat/fvp/src/include/fvp_dram.h
+++ b/plat/arm/src/include/arm_dram.h
@@ -3,8 +3,8 @@
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/
-#ifndef FVP_DRAM_H
-#define FVP_DRAM_H
+#ifndef ARM_DRAM_H
+#define ARM_DRAM_H
#include <rmm_el3_ifc.h>
#include <stddef.h>
@@ -13,19 +13,19 @@
/* Maximum number of DRAM banks supported */
#define MAX_DRAM_NUM_BANKS 2UL
-/* FVP runtime structures */
-struct fvp_dram_bank {
+/* Arm runtime structures */
+struct arm_dram_bank {
uintptr_t start_addr; /* start address */
uintptr_t end_addr; /* end address */
};
-struct fvp_dram_layout {
+struct arm_dram_layout {
unsigned long idx_bank_1; /* start granule index in bank 1 */
unsigned long num_granules; /* number of granules */
- struct fvp_dram_bank fvp_bank[MAX_DRAM_NUM_BANKS];
+ struct arm_dram_bank arm_bank[MAX_DRAM_NUM_BANKS];
};
-void fvp_set_dram_layout(struct ns_dram_info *plat_dram);
-struct fvp_dram_layout *fvp_get_dram_layout(void);
+void arm_set_dram_layout(struct ns_dram_info *plat_dram);
+struct arm_dram_layout *arm_get_dram_layout(void);
-#endif /* FVP_DRAM_H */
+#endif /* ARM_DRAM_H */
diff --git a/plat/fvp/CMakeLists.txt b/plat/fvp/CMakeLists.txt
deleted file mode 100644
index 3d4f067..0000000
--- a/plat/fvp/CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# SPDX-License-Identifier: BSD-3-Clause
-# SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
-#
-
-add_library(rmm-fvp)
-
-add_subdirectory("${RMM_SOURCE_DIR}/drivers/pl011" ${RMM_BINARY_DIR}/drivers/pl011)
-add_subdirectory("${RMM_SOURCE_DIR}/plat/common" ${RMM_BINARY_DIR}/plat/common)
-
-target_link_libraries(rmm-fvp
- PRIVATE rmm-driver-pl011
- rmm-lib
- rmm-plat-common)
-
-target_sources(rmm-fvp
- PRIVATE "src/fvp_setup.c"
- "src/fvp_granule.c"
- "src/fvp_memory.c")
-
-target_include_directories(rmm-fvp
- PRIVATE "src/include")
-
-add_library(rmm-platform ALIAS rmm-fvp)
diff --git a/plat/fvp/src/fvp_granule.c b/plat/fvp/src/fvp_granule.c
deleted file mode 100644
index 8e3eeec..0000000
--- a/plat/fvp/src/fvp_granule.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SPDX-License-Identifier: BSD-3-Clause
- * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
- */
-
-#include <assert.h>
-#include <fvp_dram.h>
-#include <platform_api.h>
-#include <utils_def.h>
-
-static struct fvp_dram_layout fvp_dram;
-
-struct fvp_dram_layout *fvp_get_dram_layout(void)
-{
- return &fvp_dram;
-}
-
-unsigned long plat_granule_addr_to_idx(unsigned long addr)
-{
- if (!GRANULE_ALIGNED(addr)) {
- return UINT64_MAX;
- }
-
- if ((addr >= fvp_dram.fvp_bank[0].start_addr) &&
- (addr <= fvp_dram.fvp_bank[0].end_addr)) {
- return (addr - fvp_dram.fvp_bank[0].start_addr) / GRANULE_SIZE;
- }
-
- if ((fvp_dram.fvp_bank[1].start_addr != 0UL) &&
- (addr >= fvp_dram.fvp_bank[1].start_addr) &&
- (addr <= fvp_dram.fvp_bank[1].end_addr)) {
- return ((addr - fvp_dram.fvp_bank[1].start_addr) /
- GRANULE_SIZE) + fvp_dram.idx_bank_1;
- }
-
- return UINT64_MAX;
-}
-
-unsigned long plat_granule_idx_to_addr(unsigned long idx)
-{
- assert(idx < fvp_dram.num_granules);
-
- if (idx < fvp_dram.idx_bank_1) {
- return fvp_dram.fvp_bank[0].start_addr + (idx * GRANULE_SIZE);
- }
-
- return fvp_dram.fvp_bank[1].start_addr +
- ((idx - fvp_dram.idx_bank_1) * GRANULE_SIZE);
-}
diff --git a/plat/fvp/src/include/fvp_private.h b/plat/fvp/src/include/fvp_private.h
deleted file mode 100644
index d4c9fe9..0000000
--- a/plat/fvp/src/include/fvp_private.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * SPDX-License-Identifier: BSD-3-Clause
- * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
- */
-
-#ifndef FVP_PRIVATE_H
-#define FVP_PRIVATE_H
-
-/* Default number of CPUs per cluster */
-#define FVP_MAX_CPUS_PER_CLUSTER 4
-
-/* Default number of threads per CPU */
-#define FVP_MAX_PE_PER_CPU 1
-
-#define FVP_UART_BAUDRATE 115200
-#define FVP_UART_CLK_IN_HZ 14745600
-
-#endif /* FVP_PRIVATE_H */