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