1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <libfdt.h> 10*91f16700Schasinglulu #include <tc_plat.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <common/bl_common.h> 13*91f16700Schasinglulu #include <common/debug.h> 14*91f16700Schasinglulu #include <drivers/arm/css/css_mhu_doorbell.h> 15*91f16700Schasinglulu #include <drivers/arm/css/scmi.h> 16*91f16700Schasinglulu #include <drivers/arm/sbsa.h> 17*91f16700Schasinglulu #include <lib/fconf/fconf.h> 18*91f16700Schasinglulu #include <lib/fconf/fconf_dyn_cfg_getter.h> 19*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 20*91f16700Schasinglulu #include <plat/common/platform.h> 21*91f16700Schasinglulu 22*91f16700Schasinglulu static scmi_channel_plat_info_t tc_scmi_plat_info[] = { 23*91f16700Schasinglulu { 24*91f16700Schasinglulu .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, 25*91f16700Schasinglulu .db_reg_addr = PLAT_CSS_MHU_BASE + SENDER_REG_SET(0), 26*91f16700Schasinglulu .db_preserve_mask = 0xfffffffe, 27*91f16700Schasinglulu .db_modify_mask = 0x1, 28*91f16700Schasinglulu .ring_doorbell = &mhuv2_ring_doorbell, 29*91f16700Schasinglulu } 30*91f16700Schasinglulu }; 31*91f16700Schasinglulu 32*91f16700Schasinglulu void bl31_platform_setup(void) 33*91f16700Schasinglulu { 34*91f16700Schasinglulu tc_bl31_common_platform_setup(); 35*91f16700Schasinglulu } 36*91f16700Schasinglulu 37*91f16700Schasinglulu scmi_channel_plat_info_t *plat_css_get_scmi_info(unsigned int channel_id) 38*91f16700Schasinglulu { 39*91f16700Schasinglulu 40*91f16700Schasinglulu return &tc_scmi_plat_info[channel_id]; 41*91f16700Schasinglulu 42*91f16700Schasinglulu } 43*91f16700Schasinglulu 44*91f16700Schasinglulu void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 45*91f16700Schasinglulu u_register_t arg2, u_register_t arg3) 46*91f16700Schasinglulu { 47*91f16700Schasinglulu arm_bl31_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3); 48*91f16700Schasinglulu 49*91f16700Schasinglulu /* Fill the properties struct with the info from the config dtb */ 50*91f16700Schasinglulu fconf_populate("FW_CONFIG", arg1); 51*91f16700Schasinglulu } 52*91f16700Schasinglulu 53*91f16700Schasinglulu #ifdef PLATFORM_TESTS 54*91f16700Schasinglulu static __dead2 void tc_run_platform_tests(void) 55*91f16700Schasinglulu { 56*91f16700Schasinglulu int tests_failed; 57*91f16700Schasinglulu 58*91f16700Schasinglulu printf("\nStarting platform tests...\n"); 59*91f16700Schasinglulu 60*91f16700Schasinglulu #ifdef PLATFORM_TEST_NV_COUNTERS 61*91f16700Schasinglulu tests_failed = nv_counter_test(); 62*91f16700Schasinglulu #elif PLATFORM_TEST_ROTPK 63*91f16700Schasinglulu tests_failed = rotpk_test(); 64*91f16700Schasinglulu #elif PLATFORM_TEST_TFM_TESTSUITE 65*91f16700Schasinglulu tests_failed = run_platform_tests(); 66*91f16700Schasinglulu #endif 67*91f16700Schasinglulu 68*91f16700Schasinglulu printf("Platform tests %s.\n", 69*91f16700Schasinglulu (tests_failed != 0) ? "failed" : "succeeded"); 70*91f16700Schasinglulu 71*91f16700Schasinglulu /* Suspend booting, no matter the tests outcome. */ 72*91f16700Schasinglulu printf("Suspend booting...\n"); 73*91f16700Schasinglulu plat_error_handler(-1); 74*91f16700Schasinglulu } 75*91f16700Schasinglulu #endif 76*91f16700Schasinglulu 77*91f16700Schasinglulu void tc_bl31_common_platform_setup(void) 78*91f16700Schasinglulu { 79*91f16700Schasinglulu arm_bl31_platform_setup(); 80*91f16700Schasinglulu 81*91f16700Schasinglulu #ifdef PLATFORM_TESTS 82*91f16700Schasinglulu tc_run_platform_tests(); 83*91f16700Schasinglulu #endif 84*91f16700Schasinglulu } 85*91f16700Schasinglulu 86*91f16700Schasinglulu const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops) 87*91f16700Schasinglulu { 88*91f16700Schasinglulu return css_scmi_override_pm_ops(ops); 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu void __init bl31_plat_arch_setup(void) 92*91f16700Schasinglulu { 93*91f16700Schasinglulu arm_bl31_plat_arch_setup(); 94*91f16700Schasinglulu 95*91f16700Schasinglulu /* HW_CONFIG was also loaded by BL2 */ 96*91f16700Schasinglulu const struct dyn_cfg_dtb_info_t *hw_config_info; 97*91f16700Schasinglulu 98*91f16700Schasinglulu hw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, HW_CONFIG_ID); 99*91f16700Schasinglulu assert(hw_config_info != NULL); 100*91f16700Schasinglulu 101*91f16700Schasinglulu fconf_populate("HW_CONFIG", hw_config_info->config_addr); 102*91f16700Schasinglulu } 103*91f16700Schasinglulu 104*91f16700Schasinglulu #if defined(SPD_spmd) && (SPMC_AT_EL3 == 0) 105*91f16700Schasinglulu void tc_bl31_plat_runtime_setup(void) 106*91f16700Schasinglulu { 107*91f16700Schasinglulu arm_bl31_plat_runtime_setup(); 108*91f16700Schasinglulu 109*91f16700Schasinglulu /* Start secure watchdog timer. */ 110*91f16700Schasinglulu plat_arm_secure_wdt_start(); 111*91f16700Schasinglulu } 112*91f16700Schasinglulu 113*91f16700Schasinglulu void bl31_plat_runtime_setup(void) 114*91f16700Schasinglulu { 115*91f16700Schasinglulu tc_bl31_plat_runtime_setup(); 116*91f16700Schasinglulu } 117*91f16700Schasinglulu 118*91f16700Schasinglulu /* 119*91f16700Schasinglulu * Platform handler for Group0 secure interrupt. 120*91f16700Schasinglulu */ 121*91f16700Schasinglulu int plat_spmd_handle_group0_interrupt(uint32_t intid) 122*91f16700Schasinglulu { 123*91f16700Schasinglulu /* Trusted Watchdog timer is the only source of Group0 interrupt now. */ 124*91f16700Schasinglulu if (intid == SBSA_SECURE_WDOG_INTID) { 125*91f16700Schasinglulu /* Refresh the timer. */ 126*91f16700Schasinglulu plat_arm_secure_wdt_refresh(); 127*91f16700Schasinglulu 128*91f16700Schasinglulu return 0; 129*91f16700Schasinglulu } 130*91f16700Schasinglulu 131*91f16700Schasinglulu return -1; 132*91f16700Schasinglulu } 133*91f16700Schasinglulu #endif /*defined(SPD_spmd) && (SPMC_AT_EL3 == 0)*/ 134