diff options
Diffstat (limited to 'plat')
34 files changed, 522 insertions, 49 deletions
diff --git a/plat/arm/board/juno/include/platform_def.h b/plat/arm/board/juno/include/platform_def.h index 0e5c6d9ac..d4a77f027 100644 --- a/plat/arm/board/juno/include/platform_def.h +++ b/plat/arm/board/juno/include/platform_def.h @@ -142,7 +142,7 @@ # define PLAT_ARM_MAX_BL2_SIZE 0x1C000 #endif #else -# define PLAT_ARM_MAX_BL2_SIZE 0xE000 +# define PLAT_ARM_MAX_BL2_SIZE 0xF000 #endif /* diff --git a/plat/arm/board/juno/juno_topology.c b/plat/arm/board/juno/juno_topology.c index 72bb92e00..6d8fc05ce 100644 --- a/plat/arm/board/juno/juno_topology.c +++ b/plat/arm/board/juno/juno_topology.c @@ -9,6 +9,21 @@ #include <plat_arm.h> #include <platform.h> #include "juno_def.h" +#include "../../css/drivers/scmi/scmi.h" +#include "../../css/drivers/mhu/css_mhu_doorbell.h" + +static scmi_channel_plat_info_t juno_scmi_plat_info = { + .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, + .db_reg_addr = PLAT_CSS_MHU_BASE + CSS_SCMI_MHU_DB_REG_OFF, + .db_preserve_mask = 0xfffffffe, + .db_modify_mask = 0x1, + .ring_doorbell = &mhu_ring_doorbell, +}; + +scmi_channel_plat_info_t *plat_css_get_scmi_info() +{ + return &juno_scmi_plat_info; +} /* * On Juno, the system power level is the highest power level. diff --git a/plat/arm/common/aarch64/arm_helpers.S b/plat/arm/common/aarch64/arm_helpers.S index 752929db5..06720589a 100644 --- a/plat/arm/common/aarch64/arm_helpers.S +++ b/plat/arm/common/aarch64/arm_helpers.S @@ -8,9 +8,9 @@ .weak plat_arm_calc_core_pos .weak plat_my_core_pos - .weak plat_crash_console_init - .weak plat_crash_console_putc - .weak plat_crash_console_flush + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl platform_mem_init diff --git a/plat/arm/common/arm_tzc400.c b/plat/arm/common/arm_tzc400.c index a32736c3a..2ae084c7b 100644 --- a/plat/arm/common/arm_tzc400.c +++ b/plat/arm/common/arm_tzc400.c @@ -24,7 +24,7 @@ void arm_tzc400_setup(const arm_tzc_regions_info_t *tzc_regions) { #ifndef EL3_PAYLOAD_BASE - int region_index = 1; + unsigned int region_index = 1U; const arm_tzc_regions_info_t *p; const arm_tzc_regions_info_t init_tzc_regions[] = { ARM_TZC_REGIONS_DEF, @@ -55,7 +55,7 @@ void arm_tzc400_setup(const arm_tzc_regions_info_t *tzc_regions) region_index++; } - INFO("Total %d regions set.\n", region_index); + INFO("Total %u regions set.\n", region_index); #else /* if defined(EL3_PAYLOAD_BASE) */ diff --git a/plat/arm/common/arm_tzc_dmc500.c b/plat/arm/common/arm_tzc_dmc500.c index 8cb81e7ae..6bd771b0e 100644 --- a/plat/arm/common/arm_tzc_dmc500.c +++ b/plat/arm/common/arm_tzc_dmc500.c @@ -20,7 +20,7 @@ void arm_tzc_dmc500_setup(tzc_dmc500_driver_data_t *plat_driver_data, const arm_tzc_regions_info_t *tzc_regions) { #ifndef EL3_PAYLOAD_BASE - int region_index = 1; + unsigned int region_index = 1U; const arm_tzc_regions_info_t *p; const arm_tzc_regions_info_t init_tzc_regions[] = { ARM_TZC_REGIONS_DEF, @@ -50,7 +50,7 @@ void arm_tzc_dmc500_setup(tzc_dmc500_driver_data_t *plat_driver_data, region_index++; } - INFO("Total %d regions set.\n", region_index); + INFO("Total %u regions set.\n", region_index); #else /* Allow secure access only to DRAM for EL3 payloads */ diff --git a/plat/arm/css/drivers/scmi/scmi.h b/plat/arm/css/drivers/scmi/scmi.h index 71a8c2d02..7f8922910 100644 --- a/plat/arm/css/drivers/scmi/scmi.h +++ b/plat/arm/css/drivers/scmi/scmi.h @@ -159,4 +159,7 @@ int scmi_sys_pwr_state_get(void *p, uint32_t *system_state); int scmi_ap_core_set_reset_addr(void *p, uint64_t reset_addr, uint32_t attr); int scmi_ap_core_get_reset_addr(void *p, uint64_t *reset_addr, uint32_t *attr); +/* API to get the platform specific SCMI channel information. */ +scmi_channel_plat_info_t *plat_css_get_scmi_info(); + #endif /* __CSS_SCMI_H__ */ diff --git a/plat/arm/css/drivers/scp/css_pm_scmi.c b/plat/arm/css/drivers/scp/css_pm_scmi.c index 9297e9fe4..956f583c0 100644 --- a/plat/arm/css/drivers/scp/css_pm_scmi.c +++ b/plat/arm/css/drivers/scp/css_pm_scmi.c @@ -13,7 +13,6 @@ #include <platform.h> #include <string.h> #include "../scmi/scmi.h" -#include "../mhu/css_mhu_doorbell.h" #include "css_scp.h" /* @@ -298,14 +297,6 @@ void __dead2 css_scp_sys_reboot(void) css_scp_system_off(SCMI_SYS_PWR_COLD_RESET); } -static scmi_channel_plat_info_t plat_css_scmi_plat_info = { - .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, - .db_reg_addr = PLAT_CSS_MHU_BASE + CSS_SCMI_MHU_DB_REG_OFF, - .db_preserve_mask = 0xfffffffe, - .db_modify_mask = 0x1, - .ring_doorbell = &mhu_ring_doorbell, -}; - static int scmi_ap_core_init(scmi_channel_t *ch) { #if PROGRAMMABLE_RESET_ADDRESS @@ -330,7 +321,7 @@ static int scmi_ap_core_init(scmi_channel_t *ch) void __init plat_arm_pwrc_setup(void) { - channel.info = &plat_css_scmi_plat_info; + channel.info = plat_css_get_scmi_info(); channel.lock = ARM_SCMI_LOCK_GET_INSTANCE; scmi_handle = scmi_init(&channel); if (scmi_handle == NULL) { diff --git a/plat/arm/css/sgi/sgi_bl31_setup.c b/plat/arm/css/sgi/sgi_bl31_setup.c index 395807675..a16343cf0 100644 --- a/plat/arm/css/sgi/sgi_bl31_setup.c +++ b/plat/arm/css/sgi/sgi_bl31_setup.c @@ -8,6 +8,21 @@ #include <debug.h> #include <plat_arm.h> #include <sgi_ras.h> +#include "../../css/drivers/scmi/scmi.h" +#include "../../css/drivers/mhu/css_mhu_doorbell.h" + +static scmi_channel_plat_info_t sgi575_scmi_plat_info = { + .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, + .db_reg_addr = PLAT_CSS_MHU_BASE + CSS_SCMI_MHU_DB_REG_OFF, + .db_preserve_mask = 0xfffffffe, + .db_modify_mask = 0x1, + .ring_doorbell = &mhu_ring_doorbell, +}; + +scmi_channel_plat_info_t *plat_css_get_scmi_info() +{ + return &sgi575_scmi_plat_info; +} void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) diff --git a/plat/arm/css/sgm/sgm_bl31_setup.c b/plat/arm/css/sgm/sgm_bl31_setup.c index a55176a74..29c32e7cf 100644 --- a/plat/arm/css/sgm/sgm_bl31_setup.c +++ b/plat/arm/css/sgm/sgm_bl31_setup.c @@ -8,6 +8,21 @@ #include <debug.h> #include <plat_arm.h> #include <sgm_plat_config.h> +#include "../../css/drivers/scmi/scmi.h" +#include "../../css/drivers/mhu/css_mhu_doorbell.h" + +static scmi_channel_plat_info_t sgm775_scmi_plat_info = { + .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, + .db_reg_addr = PLAT_CSS_MHU_BASE + CSS_SCMI_MHU_DB_REG_OFF, + .db_preserve_mask = 0xfffffffe, + .db_modify_mask = 0x1, + .ring_doorbell = &mhu_ring_doorbell, +}; + +scmi_channel_plat_info_t *plat_css_get_scmi_info() +{ + return &sgm775_scmi_plat_info; +} void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) diff --git a/plat/common/aarch32/crash_console_helpers.S b/plat/common/aarch32/crash_console_helpers.S new file mode 100644 index 000000000..fc37c08fa --- /dev/null +++ b/plat/common/aarch32/crash_console_helpers.S @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * If a platform wishes to use the functions in this file it has to be added to + * the Makefile of the platform. It is not included in the common Makefile. + */ + +#include <asm_macros.S> +#include <console.h> + + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush + +#if MULTI_CONSOLE_API + + /* ----------------------------------------------------- + * int plat_crash_console_init(void) + * Use normal console by default. Switch it to crash + * mode so serial consoles become active again. + * NOTE: This default implementation will only work for + * crashes that occur after a normal console (marked + * valid for the crash state) has been registered with + * the console framework. To debug crashes that occur + * earlier, the platform has to override these functions + * with an implementation that initializes a console + * driver with hardcoded parameters. See + * docs/porting-guide.rst for more information. + * ----------------------------------------------------- + */ +func plat_crash_console_init +#if defined(IMAGE_BL1) + /* + * BL1 code can possibly crash so early that the data segment is not yet + * accessible. Don't risk undefined behavior by trying to run the normal + * console framework. Platforms that want to debug BL1 will need to + * override this with custom functions that can run from registers only. + */ + mov r0, #0 + bx lr +#else /* IMAGE_BL1 */ + mov r3, lr + mov r0, #CONSOLE_FLAG_CRASH + bl console_switch_state + mov r0, #1 + bx r3 +#endif +endfunc plat_crash_console_init + + /* ----------------------------------------------------- + * void plat_crash_console_putc(int character) + * Output through the normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_putc + b console_putc +endfunc plat_crash_console_putc + + /* ----------------------------------------------------- + * void plat_crash_console_flush(void) + * Flush normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_flush + b console_flush +endfunc plat_crash_console_flush + +#else /* MULTI_CONSOLE_API */ + + /* ----------------------------------------------------- + * In the old API these are all no-op stubs that need to + * be overridden by the platform to be useful. + * ----------------------------------------------------- + */ +func plat_crash_console_init + mov r0, #0 + bx lr +endfunc plat_crash_console_init + +func plat_crash_console_putc + bx lr +endfunc plat_crash_console_putc + +func plat_crash_console_flush + bx lr +endfunc plat_crash_console_flush + +#endif diff --git a/plat/common/aarch32/platform_helpers.S b/plat/common/aarch32/platform_helpers.S index d61853942..e1e2a6f58 100644 --- a/plat/common/aarch32/platform_helpers.S +++ b/plat/common/aarch32/platform_helpers.S @@ -8,9 +8,11 @@ #include <asm_macros.S> .weak plat_report_exception +#if !ERROR_DEPRECATED .weak plat_crash_console_init .weak plat_crash_console_putc .weak plat_crash_console_flush +#endif .weak plat_reset_handler .weak plat_disable_acp .weak bl1_plat_prepare_exit @@ -26,6 +28,7 @@ func plat_report_exception bx lr endfunc plat_report_exception +#if !ERROR_DEPRECATED /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. @@ -54,6 +57,7 @@ func plat_crash_console_flush mov r0, #0 bx lr endfunc plat_crash_console_flush +#endif /* ----------------------------------------------------- * Placeholder function which should be redefined by diff --git a/plat/common/aarch64/crash_console_helpers.S b/plat/common/aarch64/crash_console_helpers.S new file mode 100644 index 000000000..5af8db252 --- /dev/null +++ b/plat/common/aarch64/crash_console_helpers.S @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * If a platform wishes to use the functions in this file it has to be added to + * the Makefile of the platform. It is not included in the common Makefile. + */ + +#include <asm_macros.S> +#include <console.h> + + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush + +#if MULTI_CONSOLE_API + + /* ----------------------------------------------------- + * int plat_crash_console_init(void) + * Use normal console by default. Switch it to crash + * mode so serial consoles become active again. + * NOTE: This default implementation will only work for + * crashes that occur after a normal console (marked + * valid for the crash state) has been registered with + * the console framework. To debug crashes that occur + * earlier, the platform has to override these functions + * with an implementation that initializes a console + * driver with hardcoded parameters. See + * docs/porting-guide.rst for more information. + * ----------------------------------------------------- + */ +func plat_crash_console_init +#if defined(IMAGE_BL1) + /* + * BL1 code can possibly crash so early that the data segment is not yet + * accessible. Don't risk undefined behavior by trying to run the normal + * console framework. Platforms that want to debug BL1 will need to + * override this with custom functions that can run from registers only. + */ + mov x0, #0 + ret +#else /* IMAGE_BL1 */ + mov x3, x30 + mov x0, #CONSOLE_FLAG_CRASH + bl console_switch_state + mov x0, #1 + ret x3 +#endif +endfunc plat_crash_console_init + + /* ----------------------------------------------------- + * void plat_crash_console_putc(int character) + * Output through the normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_putc + b console_putc +endfunc plat_crash_console_putc + + /* ----------------------------------------------------- + * void plat_crash_console_flush(void) + * Flush normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_flush + b console_flush +endfunc plat_crash_console_flush + +#else /* MULTI_CONSOLE_API */ + + /* ----------------------------------------------------- + * In the old API these are all no-op stubs that need to + * be overridden by the platform to be useful. + * ----------------------------------------------------- + */ +func plat_crash_console_init + mov x0, #0 + ret +endfunc plat_crash_console_init + +func plat_crash_console_putc + ret +endfunc plat_crash_console_putc + +func plat_crash_console_flush + ret +endfunc plat_crash_console_flush + +#endif diff --git a/plat/common/aarch64/platform_helpers.S b/plat/common/aarch64/platform_helpers.S index 7214588a6..d3ffcaf19 100644 --- a/plat/common/aarch64/platform_helpers.S +++ b/plat/common/aarch64/platform_helpers.S @@ -10,9 +10,11 @@ #include <platform_def.h> .weak plat_report_exception +#if !ERROR_DEPRECATED .weak plat_crash_console_init .weak plat_crash_console_putc .weak plat_crash_console_flush +#endif .weak plat_reset_handler .weak plat_disable_acp .weak bl1_plat_prepare_exit @@ -37,6 +39,7 @@ func plat_report_exception ret endfunc plat_report_exception +#if !ERROR_DEPRECATED #if MULTI_CONSOLE_API /* ----------------------------------------------------- * int plat_crash_console_init(void) @@ -109,6 +112,7 @@ func plat_crash_console_flush ret endfunc plat_crash_console_flush #endif +#endif /* ERROR_DEPRECATED */ /* ----------------------------------------------------- * Placeholder function which should be redefined by diff --git a/plat/hisilicon/hikey/aarch64/hikey_helpers.S b/plat/hisilicon/hikey/aarch64/hikey_helpers.S index 32ff8b40c..9dfdae49c 100644 --- a/plat/hisilicon/hikey/aarch64/hikey_helpers.S +++ b/plat/hisilicon/hikey/aarch64/hikey_helpers.S @@ -12,6 +12,7 @@ .globl platform_mem_init .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl plat_report_exception .globl plat_reset_handler @@ -61,6 +62,19 @@ func plat_crash_console_putc endfunc plat_crash_console_putc /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, CRASH_CONSOLE_BASE + b console_core_flush +endfunc plat_crash_console_flush + + /* --------------------------------------------- * void plat_report_exception(unsigned int type) * Function to report an unhandled exception * with platform-specific means. diff --git a/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S b/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S index d18399fbf..550c5604b 100644 --- a/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S +++ b/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -14,6 +14,7 @@ .globl platform_mem_init .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl plat_report_exception .globl plat_reset_handler .globl clr_ex @@ -65,6 +66,19 @@ func plat_crash_console_putc endfunc plat_crash_console_putc /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, CRASH_CONSOLE_BASE + b console_core_flush +endfunc plat_crash_console_flush + + /* --------------------------------------------- * void plat_report_exception(unsigned int type) * Function to report an unhandled exception * with platform-specific means. diff --git a/plat/imx/common/imx8_helpers.S b/plat/imx/common/imx8_helpers.S index b89d346c6..19293bfe7 100644 --- a/plat/imx/common/imx8_helpers.S +++ b/plat/imx/common/imx8_helpers.S @@ -16,6 +16,7 @@ .globl plat_secondary_cold_boot_setup .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl platform_mem_init .globl imx_mailbox_init @@ -106,6 +107,7 @@ func plat_secondary_cold_boot_setup endfunc plat_secondary_cold_boot_setup func plat_crash_console_init + mov x0, #1 ret endfunc plat_crash_console_init @@ -113,6 +115,11 @@ func plat_crash_console_putc ret endfunc plat_crash_console_putc +func plat_crash_console_flush + mov x0, #0 + ret +endfunc plat_crash_console_flush + func platform_mem_init ret endfunc platform_mem_init diff --git a/plat/imx/common/lpuart_console.S b/plat/imx/common/lpuart_console.S index ad71b89f2..668fd6249 100644 --- a/plat/imx/common/lpuart_console.S +++ b/plat/imx/common/lpuart_console.S @@ -6,6 +6,7 @@ #include <arch.h> #include <asm_macros.S> +#define USE_FINISH_CONSOLE_REG_2 #include <console_macros.S> #include <assert_macros.S> #include "imx8_lpuart.h" @@ -26,7 +27,7 @@ func console_lpuart_register mov x0, x6 mov x30, x7 - finish_console_register lpuart + finish_console_register lpuart putc=1, getc=1 register_fail: ret x7 diff --git a/plat/imx/imx7/warp7/aarch32/warp7_helpers.S b/plat/imx/imx7/warp7/aarch32/warp7_helpers.S index b1921cc38..3695b32db 100644 --- a/plat/imx/imx7/warp7/aarch32/warp7_helpers.S +++ b/plat/imx/imx7/warp7/aarch32/warp7_helpers.S @@ -14,6 +14,7 @@ .globl plat_get_my_entrypoint .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl plat_panic_handler /* --------------------------------------------- @@ -45,6 +46,12 @@ func plat_crash_console_putc b imx_crash_uart_putc endfunc plat_crash_console_putc +func plat_crash_console_flush + /* Placeholder */ + mov r0, #0 + bx lr +endfunc plat_crash_console_flush + func plat_panic_handler mov r3, #HAB_ROM_VECTOR_TABLE_FAILSAFE ldr r3, [r3, #0] diff --git a/plat/layerscape/common/aarch64/ls_console.S b/plat/layerscape/common/aarch64/ls_console.S index 5c87465eb..ec4390a69 100644 --- a/plat/layerscape/common/aarch64/ls_console.S +++ b/plat/layerscape/common/aarch64/ls_console.S @@ -6,6 +6,7 @@ #include <arch.h> #include <asm_macros.S> +#define USE_FINISH_CONSOLE_REG_2 #include <console_macros.S> #include <assert_macros.S> #include "ls_16550.h" @@ -106,7 +107,7 @@ func console_ls_16550_register mov x0, x6 mov x30, x7 - finish_console_register ls_16550 + finish_console_register ls_16550 putc=1, getc=1, flush=1 register_fail: ret x7 diff --git a/plat/marvell/common/aarch64/marvell_helpers.S b/plat/marvell/common/aarch64/marvell_helpers.S index a3dc917c6..128c3ab69 100644 --- a/plat/marvell/common/aarch64/marvell_helpers.S +++ b/plat/marvell/common/aarch64/marvell_helpers.S @@ -18,6 +18,7 @@ .weak plat_my_core_pos .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl platform_mem_init .globl disable_mmu_dcache .globl invalidate_tlb_all @@ -79,6 +80,19 @@ func plat_crash_console_putc b console_core_putc endfunc plat_crash_console_putc + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, PLAT_MARVELL_CRASH_UART_BASE + b console_core_flush +endfunc plat_crash_console_flush + /* --------------------------------------------------------------------- * We don't need to carry out any memory initialization on ARM * platforms. The Secure RAM is accessible straight away. diff --git a/plat/nvidia/tegra/common/aarch64/tegra_helpers.S b/plat/nvidia/tegra/common/aarch64/tegra_helpers.S index 3c490d078..0476ba826 100644 --- a/plat/nvidia/tegra/common/aarch64/tegra_helpers.S +++ b/plat/nvidia/tegra/common/aarch64/tegra_helpers.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -36,6 +36,7 @@ .globl platform_mem_init .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl tegra_secure_entrypoint .globl plat_reset_handler @@ -240,6 +241,20 @@ func plat_crash_console_putc b console_core_putc endfunc plat_crash_console_putc + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + adr x0, tegra_console_base + ldr x0, [x0] + b console_core_flush +endfunc plat_crash_console_flush + /* --------------------------------------------------- * Function to handle a platform reset and store * input parameters passed by BL2. diff --git a/plat/qemu/include/platform_def.h b/plat/qemu/include/platform_def.h index 55252c380..c2289bc56 100644 --- a/plat/qemu/include/platform_def.h +++ b/plat/qemu/include/platform_def.h @@ -223,7 +223,7 @@ * DT related constants */ #define PLAT_QEMU_DT_BASE NS_DRAM0_BASE -#define PLAT_QEMU_DT_MAX_SIZE 0x10000 +#define PLAT_QEMU_DT_MAX_SIZE 0x100000 /* * System counter diff --git a/plat/rockchip/rk3328/platform.mk b/plat/rockchip/rk3328/platform.mk index 560cccae6..785f64036 100644 --- a/plat/rockchip/rk3328/platform.mk +++ b/plat/rockchip/rk3328/platform.mk @@ -29,6 +29,7 @@ RK_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/aarch64/xlat_tables.c \ lib/xlat_tables/xlat_tables_common.c \ + plat/common/aarch64/crash_console_helpers.S \ plat/common/plat_psci_common.c BL31_SOURCES += ${RK_GIC_SOURCES} \ diff --git a/plat/rockchip/rk3368/platform.mk b/plat/rockchip/rk3368/platform.mk index 050a2c423..a3e593e60 100644 --- a/plat/rockchip/rk3368/platform.mk +++ b/plat/rockchip/rk3368/platform.mk @@ -26,6 +26,7 @@ RK_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/xlat_tables_common.c \ lib/xlat_tables/aarch64/xlat_tables.c \ + plat/common/aarch64/crash_console_helpers.S \ plat/common/plat_psci_common.c BL31_SOURCES += ${RK_GIC_SOURCES} \ diff --git a/plat/rockchip/rk3399/platform.mk b/plat/rockchip/rk3399/platform.mk index 912041928..eccf1cc85 100644 --- a/plat/rockchip/rk3399/platform.mk +++ b/plat/rockchip/rk3399/platform.mk @@ -32,6 +32,7 @@ RK_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/xlat_tables_common.c \ lib/xlat_tables/aarch64/xlat_tables.c \ + plat/common/aarch64/crash_console_helpers.S \ plat/common/plat_psci_common.c BL31_SOURCES += ${RK_GIC_SOURCES} \ diff --git a/plat/rpi3/platform.mk b/plat/rpi3/platform.mk index a7b0991fb..36c1ee2b4 100644 --- a/plat/rpi3/platform.mk +++ b/plat/rpi3/platform.mk @@ -4,12 +4,16 @@ # SPDX-License-Identifier: BSD-3-Clause # +include lib/libfdt/libfdt.mk +include lib/xlat_tables_v2/xlat_tables.mk + PLAT_INCLUDES := -Iinclude/common/tbbr \ -Iplat/rpi3/include PLAT_BL_COMMON_SOURCES := drivers/console/aarch64/console.S \ drivers/ti/uart/aarch64/16550_console.S \ - plat/rpi3/rpi3_common.c + plat/rpi3/rpi3_common.c \ + ${XLAT_TABLES_LIB_SRCS} BL1_SOURCES += drivers/io/io_fip.c \ drivers/io/io_memmap.c \ @@ -37,12 +41,8 @@ BL31_SOURCES += lib/cpus/aarch64/cortex_a53.S \ plat/rpi3/aarch64/plat_helpers.S \ plat/rpi3/rpi3_bl31_setup.c \ plat/rpi3/rpi3_pm.c \ - plat/rpi3/rpi3_topology.c - -# Translation tables library -include lib/xlat_tables_v2/xlat_tables.mk - -PLAT_BL_COMMON_SOURCES += ${XLAT_TABLES_LIB_SRCS} + plat/rpi3/rpi3_topology.c \ + ${LIBFDT_SRCS} # Tune compiler for Cortex-A53 ifeq ($(notdir $(CC)),armclang) diff --git a/plat/rpi3/rpi3_bl31_setup.c b/plat/rpi3/rpi3_bl31_setup.c index 0ae783e12..483d150f0 100644 --- a/plat/rpi3/rpi3_bl31_setup.c +++ b/plat/rpi3/rpi3_bl31_setup.c @@ -6,6 +6,7 @@ #include <assert.h> #include <bl_common.h> +#include <libfdt.h> #include <platform.h> #include <platform_def.h> #include <xlat_mmu_helpers.h> @@ -137,12 +138,74 @@ void bl31_plat_arch_setup(void) enable_mmu_el3(0); } -void bl31_platform_setup(void) +/* + * Add information to the device tree (if any) about the reserved DRAM used by + * the Trusted Firmware. + */ +static void rpi3_dtb_add_mem_rsv(void) { + int i, regions, rc; + uint64_t addr, size; + void *dtb = (void *)RPI3_PRELOADED_DTB_BASE; + + INFO("rpi3: Checking DTB...\n"); + + /* Return if no device tree is detected */ + if (fdt_check_header(dtb) != 0) + return; + + regions = fdt_num_mem_rsv(dtb); + + VERBOSE("rpi3: Found %d mem reserve region(s)\n", regions); + + /* We expect to find one reserved region that we can modify */ + if (regions < 1) + return; + + /* + * Look for the region that corresponds to the default boot firmware. It + * starts at address 0, and it is not needed when the default firmware + * is replaced by this port of the Trusted Firmware. + */ + for (i = 0; i < regions; i++) { + if (fdt_get_mem_rsv(dtb, i, &addr, &size) != 0) + continue; + + if (addr != 0x0) + continue; + + VERBOSE("rpi3: Firmware mem reserve region found\n"); + + rc = fdt_del_mem_rsv(dtb, i); + if (rc != 0) { + INFO("rpi3: Can't remove mem reserve region (%d)\n", rc); + } + + break; + } + + if (i == regions) { + VERBOSE("rpi3: Firmware mem reserve region not found\n"); + } + /* - * Do initial security configuration to allow DRAM/device access - * (if earlier BL has not already done so). + * Reserve all SRAM. As said in the documentation, this isn't actually + * secure memory, so it is needed to tell BL33 that this is a reserved + * memory region. It doesn't guarantee it won't use it, though. */ + rc = fdt_add_mem_rsv(dtb, SEC_SRAM_BASE, SEC_SRAM_SIZE); + if (rc != 0) { + WARN("rpi3: Can't add mem reserve region (%d)\n", rc); + } + + INFO("rpi3: Reserved 0x%llx - 0x%llx in DTB\n", SEC_SRAM_BASE, + SEC_SRAM_BASE + SEC_SRAM_SIZE); +} - return; +void bl31_platform_setup(void) +{ +#ifdef RPI3_PRELOADED_DTB_BASE + /* Only modify a DTB if we know where to look for it */ + rpi3_dtb_add_mem_rsv(); +#endif } diff --git a/plat/rpi3/rpi3_common.c b/plat/rpi3/rpi3_common.c index 98cf534c7..18ff1c82e 100644 --- a/plat/rpi3/rpi3_common.c +++ b/plat/rpi3/rpi3_common.c @@ -23,7 +23,12 @@ #define MAP_SHARED_RAM MAP_REGION_FLAT(SHARED_RAM_BASE, \ SHARED_RAM_SIZE, \ - MT_DEVICE | MT_RW | MT_SECURE) + MT_DEVICE | MT_RW | MT_SECURE) + +#ifdef RPI3_PRELOADED_DTB_BASE +#define MAP_NS_DTB MAP_REGION_FLAT(RPI3_PRELOADED_DTB_BASE, 0x10000, \ + MT_MEMORY | MT_RW | MT_NS) +#endif #define MAP_NS_DRAM0 MAP_REGION_FLAT(NS_DRAM0_BASE, NS_DRAM0_SIZE, \ MT_MEMORY | MT_RW | MT_NS) @@ -74,6 +79,9 @@ static const mmap_region_t plat_rpi3_mmap[] = { static const mmap_region_t plat_rpi3_mmap[] = { MAP_SHARED_RAM, MAP_DEVICE0, +#ifdef RPI3_PRELOADED_DTB_BASE + MAP_NS_DTB, +#endif #ifdef BL32_BASE MAP_BL32_MEM, #endif diff --git a/plat/ti/k3/common/k3_helpers.S b/plat/ti/k3/common/k3_helpers.S index c95e9c367..3dfdda4bd 100644 --- a/plat/ti/k3/common/k3_helpers.S +++ b/plat/ti/k3/common/k3_helpers.S @@ -100,13 +100,13 @@ endfunc plat_my_core_pos * Clobber list : x0 - x4 * --------------------------------------------- */ + .globl plat_crash_console_init func plat_crash_console_init mov_imm x0, CRASH_CONSOLE_BASE mov_imm x1, CRASH_CONSOLE_CLK mov_imm x2, CRASH_CONSOLE_BAUD_RATE mov w3, #0x0 - b console_core_init - + b console_16550_core_init endfunc plat_crash_console_init /* --------------------------------------------- @@ -116,7 +116,22 @@ endfunc plat_crash_console_init * Clobber list : x1, x2 * --------------------------------------------- */ + .globl plat_crash_console_putc func plat_crash_console_putc mov_imm x1, CRASH_CONSOLE_BASE - b console_core_putc + b console_16550_core_putc endfunc plat_crash_console_putc + + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ + .globl plat_crash_console_flush +func plat_crash_console_flush + mov_imm x0, CRASH_CONSOLE_BASE + b console_16550_core_flush +endfunc plat_crash_console_flush diff --git a/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S b/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S index ad960f493..969d8faa1 100644 --- a/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S +++ b/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -10,6 +10,12 @@ .globl plat_secondary_cold_boot_setup .globl plat_is_my_cpu_primary + .globl zynqmp_calc_core_pos + .globl plat_my_core_pos + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush + .globl platform_mem_init /* ----------------------------------------------------- * void plat_secondary_cold_boot_setup (void); @@ -47,3 +53,76 @@ func plat_is_my_cpu_primary cset x0, eq ret x9 endfunc plat_is_my_cpu_primary + + /* ----------------------------------------------------- + * unsigned int plat_my_core_pos(void) + * This function uses the zynqmp_calc_core_pos() + * definition to get the index of the calling CPU. + * ----------------------------------------------------- + */ +func plat_my_core_pos + mrs x0, mpidr_el1 + b zynqmp_calc_core_pos +endfunc plat_my_core_pos + + /* ----------------------------------------------------- + * unsigned int zynqmp_calc_core_pos(u_register_t mpidr) + * Helper function to calculate the core position. + * With this function: CorePos = (ClusterId * 4) + + * CoreId + * ----------------------------------------------------- + */ +func zynqmp_calc_core_pos + and x1, x0, #MPIDR_CPU_MASK + and x0, x0, #MPIDR_CLUSTER_MASK + add x0, x1, x0, LSR #6 + ret +endfunc zynqmp_calc_core_pos + + /* --------------------------------------------- + * int plat_crash_console_init(void) + * Function to initialize the crash console + * without a C Runtime to print crash report. + * Clobber list : x0 - x4 + * --------------------------------------------- + */ +func plat_crash_console_init + mov_imm x0, ZYNQMP_CRASH_UART_BASE + mov_imm x1, ZYNQMP_CRASH_UART_CLK_IN_HZ + mov_imm x2, ZYNQMP_UART_BAUDRATE + b console_core_init +endfunc plat_crash_console_init + + /* --------------------------------------------- + * int plat_crash_console_putc(int c) + * Function to print a character on the crash + * console without a C Runtime. + * Clobber list : x1, x2 + * --------------------------------------------- + */ +func plat_crash_console_putc + mov_imm x1, ZYNQMP_CRASH_UART_BASE + b console_core_putc +endfunc plat_crash_console_putc + + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : r0 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, ZYNQMP_CRASH_UART_BASE + b console_core_flush +endfunc plat_crash_console_flush + + /* --------------------------------------------------------------------- + * We don't need to carry out any memory initialization on ARM + * platforms. The Secure RAM is accessible straight away. + * --------------------------------------------------------------------- + */ +func platform_mem_init + ret +endfunc platform_mem_init diff --git a/plat/xilinx/zynqmp/plat_zynqmp.c b/plat/xilinx/zynqmp/plat_zynqmp.c index cbfa935c2..2441630bd 100644 --- a/plat/xilinx/zynqmp/plat_zynqmp.c +++ b/plat/xilinx/zynqmp/plat_zynqmp.c @@ -1,10 +1,11 @@ /* - * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ -#include <plat_arm.h> +#include <platform.h> +#include "zynqmp_private.h" int plat_core_pos_by_mpidr(u_register_t mpidr) { @@ -14,5 +15,5 @@ int plat_core_pos_by_mpidr(u_register_t mpidr) if ((mpidr & MPIDR_CPU_MASK) >= PLATFORM_CORE_COUNT) return -1; - return plat_arm_calc_core_pos(mpidr); + return zynqmp_calc_core_pos(mpidr); } diff --git a/plat/xilinx/zynqmp/platform.mk b/plat/xilinx/zynqmp/platform.mk index 53d93c326..33859ee5e 100644 --- a/plat/xilinx/zynqmp/platform.mk +++ b/plat/xilinx/zynqmp/platform.mk @@ -64,7 +64,6 @@ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/xlat_tables_common.c \ drivers/arm/gic/v2/gicv2_helpers.c \ drivers/cadence/uart/aarch64/cdns_console.S \ drivers/console/aarch64/console.S \ - plat/arm/common/aarch64/arm_helpers.S \ plat/arm/common/arm_cci.c \ plat/arm/common/arm_common.c \ plat/arm/common/arm_gicv2.c \ diff --git a/plat/xilinx/zynqmp/zynqmp_def.h b/plat/xilinx/zynqmp/zynqmp_def.h index 50a733176..9d19b1bbd 100644 --- a/plat/xilinx/zynqmp/zynqmp_def.h +++ b/plat/xilinx/zynqmp/zynqmp_def.h @@ -145,13 +145,11 @@ # error "invalid ZYNQMP_CONSOLE" #endif -#define PLAT_ARM_CRASH_UART_BASE ZYNQMP_UART_BASE +#define ZYNQMP_CRASH_UART_BASE ZYNQMP_UART_BASE /* impossible to call C routine how it is done now - hardcode any value */ -#define PLAT_ARM_CRASH_UART_CLK_IN_HZ 100000000 /* FIXME */ - +#define ZYNQMP_CRASH_UART_CLK_IN_HZ 100000000 /* FIXME */ /* Must be non zero */ -#define ZYNQMP_UART_BAUDRATE 115200 -#define ARM_CONSOLE_BAUDRATE ZYNQMP_UART_BAUDRATE +#define ZYNQMP_UART_BAUDRATE 115200 /* Silicon version detection */ #define ZYNQMP_SILICON_VER_MASK 0xF000 diff --git a/plat/xilinx/zynqmp/zynqmp_private.h b/plat/xilinx/zynqmp/zynqmp_private.h index 08a54107a..d5024c3ec 100644 --- a/plat/xilinx/zynqmp/zynqmp_private.h +++ b/plat/xilinx/zynqmp/zynqmp_private.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -9,9 +9,12 @@ #include <bl_common.h> #include <interrupt_mgmt.h> +#include <stdint.h> void zynqmp_config_setup(void); +unsigned int zynqmp_calc_core_pos(u_register_t mpidr); + /* ZynqMP specific functions */ unsigned int zynqmp_get_uart_clk(void); unsigned int zynqmp_get_bootmode(void); |