mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 01:24:27 +00:00

Coverity defects fixed by this patch are: *** CID 400208: Performance inefficiencies (PASS_BY_VALUE) /include/services/el3_spmd_logical_sp.h: 108 in ffa_partition_info_regs_get_last_idx() *** CID 400207: Performance inefficiencies (PASS_BY_VALUE) /services/std_svc/spmd/spmd_logical_sp.c: 359 in ffa_partition_info_regs_get_part_info() Signed-off-by: Raghu Krishnamurthy <raghu.ncstate@gmail.com> Change-Id: I9597377a8ec3d5519995e1619d99ee7102f33939
99 lines
2.7 KiB
C
99 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2023, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#include <common/debug.h>
|
|
#include <services/el3_spmd_logical_sp.h>
|
|
#include <services/ffa_svc.h>
|
|
#include <smccc_helpers.h>
|
|
|
|
#define SPMD_LP_PARTITION_ID SPMD_LP_ID_START
|
|
#define SPMD_LP_UUID {0xe98e43ad, 0xb7db524f, 0x47a3bf57, 0x1588f4e3}
|
|
|
|
/* SPMD Logical SP currently only supports sending direct message. */
|
|
#define SPMD_PARTITION_PROPERTIES FFA_PARTITION_DIRECT_REQ_SEND
|
|
|
|
#define SPMD_LP_MAX_SUPPORTED_SP 10
|
|
static void fvp_get_partition_info(void)
|
|
{
|
|
struct ffa_value ret = { 0 };
|
|
uint32_t target_uuid[4] = { 0 };
|
|
static struct ffa_partition_info_v1_1
|
|
part_info[SPMD_LP_MAX_SUPPORTED_SP] = { 0 };
|
|
|
|
uint16_t num_partitions = 0;
|
|
|
|
if (!spmd_el3_invoke_partition_info_get(target_uuid, 0, 0, &ret)) {
|
|
panic();
|
|
}
|
|
|
|
if (is_ffa_error(&ret)) {
|
|
panic();
|
|
}
|
|
|
|
num_partitions = ffa_partition_info_regs_get_last_idx(&ret) + 1;
|
|
if (num_partitions > SPMD_LP_MAX_SUPPORTED_SP) {
|
|
panic();
|
|
}
|
|
|
|
INFO("Number of secure partitions = %d\n", num_partitions);
|
|
|
|
for (uint16_t i = 0; i < num_partitions; i++) {
|
|
INFO("***Start Partition***\n");
|
|
if (!ffa_partition_info_regs_get_part_info(&ret, i, &part_info[i]))
|
|
panic();
|
|
INFO("\tPartition ID: 0x%x\n", part_info[i].ep_id);
|
|
INFO("\tvCPU count:0x%x\n", part_info[i].execution_ctx_count);
|
|
INFO("\tProperties: 0x%x\n", part_info[i].properties);
|
|
INFO("\tUUID: 0x%x 0x%x 0x%x 0x%x\n", part_info[i].uuid[0],
|
|
part_info[i].uuid[1], part_info[i].uuid[2],
|
|
part_info[i].uuid[3]);
|
|
INFO("***End Partition***\n");
|
|
}
|
|
|
|
}
|
|
|
|
static int32_t fvp_spmd_logical_partition_init(void)
|
|
{
|
|
INFO("FVP SPMD LSP: Init function called.\n");
|
|
|
|
fvp_get_partition_info();
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Platform specific SMC handler used to translate SIP SMCs or other platform
|
|
* specific SMCs into FF-A direct messages.
|
|
*/
|
|
uintptr_t plat_spmd_logical_sp_smc_handler(unsigned int smc_fid,
|
|
u_register_t x1,
|
|
u_register_t x2,
|
|
u_register_t x3,
|
|
u_register_t x4,
|
|
void *cookie,
|
|
void *handle,
|
|
u_register_t flags)
|
|
{
|
|
struct ffa_value retval = { 0 };
|
|
uint64_t send_recv_id = SPMD_LP_PARTITION_ID << 16 | 0x8001;
|
|
|
|
/*
|
|
* Forward the SMC as direct request.
|
|
*/
|
|
if (!spmd_el3_ffa_msg_direct_req(send_recv_id, x2, x3, x4, handle, &retval)) {
|
|
panic();
|
|
}
|
|
|
|
SMC_RET8(handle, retval.func, retval.arg1, retval.arg2, retval.arg3,
|
|
retval.arg4, retval.arg5, retval.arg6, retval.arg7);
|
|
}
|
|
|
|
/* Register SPMD logical partition */
|
|
DECLARE_SPMD_LOGICAL_PARTITION(
|
|
fvp_spmd_logical_partition,
|
|
fvp_spmd_logical_partition_init,/* Init Function */
|
|
SPMD_LP_PARTITION_ID, /* FF-A Partition ID */
|
|
SPMD_LP_UUID, /* UUID */
|
|
SPMD_PARTITION_PROPERTIES /* Partition Properties. */
|
|
);
|