xref: /arm-trusted-firmware/plat/arm/board/fvp/fvp_spmd_logical_sp.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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