1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu #include <common/debug.h> 7*91f16700Schasinglulu #include <services/el3_spmd_logical_sp.h> 8*91f16700Schasinglulu #include <services/ffa_svc.h> 9*91f16700Schasinglulu #include <smccc_helpers.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #define SPMD_LP_PARTITION_ID SPMD_LP_ID_START 12*91f16700Schasinglulu #define SPMD_LP_UUID {0xe98e43ad, 0xb7db524f, 0x47a3bf57, 0x1588f4e3} 13*91f16700Schasinglulu 14*91f16700Schasinglulu /* SPMD Logical SP currently only supports sending direct message. */ 15*91f16700Schasinglulu #define SPMD_PARTITION_PROPERTIES FFA_PARTITION_DIRECT_REQ_SEND 16*91f16700Schasinglulu 17*91f16700Schasinglulu #define SPMD_LP_MAX_SUPPORTED_SP 10 18*91f16700Schasinglulu static void fvp_get_partition_info(void) 19*91f16700Schasinglulu { 20*91f16700Schasinglulu struct ffa_value ret = { 0 }; 21*91f16700Schasinglulu uint32_t target_uuid[4] = { 0 }; 22*91f16700Schasinglulu static struct ffa_partition_info_v1_1 23*91f16700Schasinglulu part_info[SPMD_LP_MAX_SUPPORTED_SP] = { 0 }; 24*91f16700Schasinglulu 25*91f16700Schasinglulu uint16_t num_partitions = 0; 26*91f16700Schasinglulu 27*91f16700Schasinglulu if (!spmd_el3_invoke_partition_info_get(target_uuid, 0, 0, &ret)) { 28*91f16700Schasinglulu panic(); 29*91f16700Schasinglulu } 30*91f16700Schasinglulu 31*91f16700Schasinglulu if (is_ffa_error(&ret)) { 32*91f16700Schasinglulu panic(); 33*91f16700Schasinglulu } 34*91f16700Schasinglulu 35*91f16700Schasinglulu num_partitions = ffa_partition_info_regs_get_last_idx(&ret) + 1; 36*91f16700Schasinglulu if (num_partitions > SPMD_LP_MAX_SUPPORTED_SP) { 37*91f16700Schasinglulu panic(); 38*91f16700Schasinglulu } 39*91f16700Schasinglulu 40*91f16700Schasinglulu INFO("Number of secure partitions = %d\n", num_partitions); 41*91f16700Schasinglulu 42*91f16700Schasinglulu for (uint16_t i = 0; i < num_partitions; i++) { 43*91f16700Schasinglulu INFO("***Start Partition***\n"); 44*91f16700Schasinglulu if (!ffa_partition_info_regs_get_part_info(&ret, i, &part_info[i])) 45*91f16700Schasinglulu panic(); 46*91f16700Schasinglulu INFO("\tPartition ID: 0x%x\n", part_info[i].ep_id); 47*91f16700Schasinglulu INFO("\tvCPU count:0x%x\n", part_info[i].execution_ctx_count); 48*91f16700Schasinglulu INFO("\tProperties: 0x%x\n", part_info[i].properties); 49*91f16700Schasinglulu INFO("\tUUID: 0x%x 0x%x 0x%x 0x%x\n", part_info[i].uuid[0], 50*91f16700Schasinglulu part_info[i].uuid[1], part_info[i].uuid[2], 51*91f16700Schasinglulu part_info[i].uuid[3]); 52*91f16700Schasinglulu INFO("***End Partition***\n"); 53*91f16700Schasinglulu } 54*91f16700Schasinglulu 55*91f16700Schasinglulu } 56*91f16700Schasinglulu 57*91f16700Schasinglulu static int32_t fvp_spmd_logical_partition_init(void) 58*91f16700Schasinglulu { 59*91f16700Schasinglulu INFO("FVP SPMD LSP: Init function called.\n"); 60*91f16700Schasinglulu 61*91f16700Schasinglulu fvp_get_partition_info(); 62*91f16700Schasinglulu return 0; 63*91f16700Schasinglulu } 64*91f16700Schasinglulu 65*91f16700Schasinglulu /* 66*91f16700Schasinglulu * Platform specific SMC handler used to translate SIP SMCs or other platform 67*91f16700Schasinglulu * specific SMCs into FF-A direct messages. 68*91f16700Schasinglulu */ 69*91f16700Schasinglulu uintptr_t plat_spmd_logical_sp_smc_handler(unsigned int smc_fid, 70*91f16700Schasinglulu u_register_t x1, 71*91f16700Schasinglulu u_register_t x2, 72*91f16700Schasinglulu u_register_t x3, 73*91f16700Schasinglulu u_register_t x4, 74*91f16700Schasinglulu void *cookie, 75*91f16700Schasinglulu void *handle, 76*91f16700Schasinglulu u_register_t flags) 77*91f16700Schasinglulu { 78*91f16700Schasinglulu struct ffa_value retval = { 0 }; 79*91f16700Schasinglulu uint64_t send_recv_id = SPMD_LP_PARTITION_ID << 16 | 0x8001; 80*91f16700Schasinglulu 81*91f16700Schasinglulu /* 82*91f16700Schasinglulu * Forward the SMC as direct request. 83*91f16700Schasinglulu */ 84*91f16700Schasinglulu if (!spmd_el3_ffa_msg_direct_req(send_recv_id, x2, x3, x4, handle, &retval)) { 85*91f16700Schasinglulu panic(); 86*91f16700Schasinglulu } 87*91f16700Schasinglulu 88*91f16700Schasinglulu SMC_RET8(handle, retval.func, retval.arg1, retval.arg2, retval.arg3, 89*91f16700Schasinglulu retval.arg4, retval.arg5, retval.arg6, retval.arg7); 90*91f16700Schasinglulu } 91*91f16700Schasinglulu 92*91f16700Schasinglulu /* Register SPMD logical partition */ 93*91f16700Schasinglulu DECLARE_SPMD_LOGICAL_PARTITION( 94*91f16700Schasinglulu fvp_spmd_logical_partition, 95*91f16700Schasinglulu fvp_spmd_logical_partition_init,/* Init Function */ 96*91f16700Schasinglulu SPMD_LP_PARTITION_ID, /* FF-A Partition ID */ 97*91f16700Schasinglulu SPMD_LP_UUID, /* UUID */ 98*91f16700Schasinglulu SPMD_PARTITION_PROPERTIES /* Partition Properties. */ 99*91f16700Schasinglulu ); 100