1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2018-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 11*91f16700Schasinglulu #include <common/bl_common.h> 12*91f16700Schasinglulu #include <common/debug.h> 13*91f16700Schasinglulu #include <drivers/arm/css/css_mhu_doorbell.h> 14*91f16700Schasinglulu #include <drivers/arm/css/scmi.h> 15*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu #include <plat/common/platform.h> 18*91f16700Schasinglulu 19*91f16700Schasinglulu #include <plat/arm/css/common/css_pm.h> 20*91f16700Schasinglulu 21*91f16700Schasinglulu #include <sgi_ras.h> 22*91f16700Schasinglulu #include <sgi_variant.h> 23*91f16700Schasinglulu 24*91f16700Schasinglulu sgi_platform_info_t sgi_plat_info; 25*91f16700Schasinglulu 26*91f16700Schasinglulu static scmi_channel_plat_info_t sgi575_scmi_plat_info = { 27*91f16700Schasinglulu .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, 28*91f16700Schasinglulu .db_reg_addr = PLAT_CSS_MHU_BASE + CSS_SCMI_MHU_DB_REG_OFF, 29*91f16700Schasinglulu .db_preserve_mask = 0xfffffffe, 30*91f16700Schasinglulu .db_modify_mask = 0x1, 31*91f16700Schasinglulu .ring_doorbell = &mhu_ring_doorbell, 32*91f16700Schasinglulu }; 33*91f16700Schasinglulu 34*91f16700Schasinglulu static scmi_channel_plat_info_t plat_rd_scmi_info[] = { 35*91f16700Schasinglulu { 36*91f16700Schasinglulu .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, 37*91f16700Schasinglulu .db_reg_addr = PLAT_CSS_MHU_BASE + SENDER_REG_SET(0), 38*91f16700Schasinglulu .db_preserve_mask = 0xfffffffe, 39*91f16700Schasinglulu .db_modify_mask = 0x1, 40*91f16700Schasinglulu .ring_doorbell = &mhuv2_ring_doorbell, 41*91f16700Schasinglulu }, 42*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 1) 43*91f16700Schasinglulu { 44*91f16700Schasinglulu .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE + 45*91f16700Schasinglulu CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1), 46*91f16700Schasinglulu .db_reg_addr = PLAT_CSS_MHU_BASE 47*91f16700Schasinglulu + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1) + SENDER_REG_SET(0), 48*91f16700Schasinglulu .db_preserve_mask = 0xfffffffe, 49*91f16700Schasinglulu .db_modify_mask = 0x1, 50*91f16700Schasinglulu .ring_doorbell = &mhuv2_ring_doorbell, 51*91f16700Schasinglulu }, 52*91f16700Schasinglulu #endif 53*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 2) 54*91f16700Schasinglulu { 55*91f16700Schasinglulu .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE + 56*91f16700Schasinglulu CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2), 57*91f16700Schasinglulu .db_reg_addr = PLAT_CSS_MHU_BASE + 58*91f16700Schasinglulu CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2) + SENDER_REG_SET(0), 59*91f16700Schasinglulu .db_preserve_mask = 0xfffffffe, 60*91f16700Schasinglulu .db_modify_mask = 0x1, 61*91f16700Schasinglulu .ring_doorbell = &mhuv2_ring_doorbell, 62*91f16700Schasinglulu }, 63*91f16700Schasinglulu #endif 64*91f16700Schasinglulu #if (CSS_SGI_CHIP_COUNT > 3) 65*91f16700Schasinglulu { 66*91f16700Schasinglulu .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE + 67*91f16700Schasinglulu CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3), 68*91f16700Schasinglulu .db_reg_addr = PLAT_CSS_MHU_BASE + 69*91f16700Schasinglulu CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3) + SENDER_REG_SET(0), 70*91f16700Schasinglulu .db_preserve_mask = 0xfffffffe, 71*91f16700Schasinglulu .db_modify_mask = 0x1, 72*91f16700Schasinglulu .ring_doorbell = &mhuv2_ring_doorbell, 73*91f16700Schasinglulu }, 74*91f16700Schasinglulu #endif 75*91f16700Schasinglulu }; 76*91f16700Schasinglulu 77*91f16700Schasinglulu scmi_channel_plat_info_t *plat_css_get_scmi_info(unsigned int channel_id) 78*91f16700Schasinglulu { 79*91f16700Schasinglulu if (sgi_plat_info.platform_id == RD_N1E1_EDGE_SID_VER_PART_NUM || 80*91f16700Schasinglulu sgi_plat_info.platform_id == RD_V1_SID_VER_PART_NUM || 81*91f16700Schasinglulu sgi_plat_info.platform_id == RD_N2_SID_VER_PART_NUM || 82*91f16700Schasinglulu sgi_plat_info.platform_id == RD_V2_SID_VER_PART_NUM || 83*91f16700Schasinglulu sgi_plat_info.platform_id == RD_N2_CFG1_SID_VER_PART_NUM || 84*91f16700Schasinglulu sgi_plat_info.platform_id == RD_N2_CFG3_SID_VER_PART_NUM) { 85*91f16700Schasinglulu if (channel_id >= ARRAY_SIZE(plat_rd_scmi_info)) 86*91f16700Schasinglulu panic(); 87*91f16700Schasinglulu return &plat_rd_scmi_info[channel_id]; 88*91f16700Schasinglulu } 89*91f16700Schasinglulu else if (sgi_plat_info.platform_id == SGI575_SSC_VER_PART_NUM) 90*91f16700Schasinglulu return &sgi575_scmi_plat_info; 91*91f16700Schasinglulu else 92*91f16700Schasinglulu panic(); 93*91f16700Schasinglulu } 94*91f16700Schasinglulu 95*91f16700Schasinglulu void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 96*91f16700Schasinglulu u_register_t arg2, u_register_t arg3) 97*91f16700Schasinglulu { 98*91f16700Schasinglulu sgi_plat_info.platform_id = plat_arm_sgi_get_platform_id(); 99*91f16700Schasinglulu sgi_plat_info.config_id = plat_arm_sgi_get_config_id(); 100*91f16700Schasinglulu sgi_plat_info.multi_chip_mode = plat_arm_sgi_get_multi_chip_mode(); 101*91f16700Schasinglulu 102*91f16700Schasinglulu arm_bl31_early_platform_setup((void *)arg0, arg1, arg2, (void *)arg3); 103*91f16700Schasinglulu } 104*91f16700Schasinglulu 105*91f16700Schasinglulu void sgi_bl31_common_platform_setup(void) 106*91f16700Schasinglulu { 107*91f16700Schasinglulu arm_bl31_platform_setup(); 108*91f16700Schasinglulu 109*91f16700Schasinglulu /* Configure the warm reboot SGI for primary core */ 110*91f16700Schasinglulu css_setup_cpu_pwr_down_intr(); 111*91f16700Schasinglulu 112*91f16700Schasinglulu #if CSS_SYSTEM_GRACEFUL_RESET 113*91f16700Schasinglulu /* Register priority level handlers for reboot */ 114*91f16700Schasinglulu ehf_register_priority_handler(PLAT_REBOOT_PRI, 115*91f16700Schasinglulu css_reboot_interrupt_handler); 116*91f16700Schasinglulu #endif 117*91f16700Schasinglulu } 118*91f16700Schasinglulu 119*91f16700Schasinglulu const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops) 120*91f16700Schasinglulu { 121*91f16700Schasinglulu /* 122*91f16700Schasinglulu * For RD-E1-Edge, only CPU power ON/OFF, PSCI platform callbacks are 123*91f16700Schasinglulu * supported. 124*91f16700Schasinglulu */ 125*91f16700Schasinglulu if (((sgi_plat_info.platform_id == RD_N1E1_EDGE_SID_VER_PART_NUM) && 126*91f16700Schasinglulu (sgi_plat_info.config_id == RD_E1_EDGE_CONFIG_ID))) { 127*91f16700Schasinglulu ops->cpu_standby = NULL; 128*91f16700Schasinglulu ops->system_off = NULL; 129*91f16700Schasinglulu ops->system_reset = NULL; 130*91f16700Schasinglulu ops->get_sys_suspend_power_state = NULL; 131*91f16700Schasinglulu ops->pwr_domain_suspend = NULL; 132*91f16700Schasinglulu ops->pwr_domain_suspend_finish = NULL; 133*91f16700Schasinglulu } 134*91f16700Schasinglulu 135*91f16700Schasinglulu return css_scmi_override_pm_ops(ops); 136*91f16700Schasinglulu } 137