2 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
7 #include <arch_helpers.h>
8 #include <lib/spinlock.h>
9 #include <lib/utils_def.h>
10 #include <platform_def.h>
12 #include "./spm_private.h"
14 /*******************************************************************************
15 * Secure Service response global array. All the responses to the requests done
16 * to the Secure Partition are stored here. They are removed from the array as
17 * soon as their value is read.
18 ******************************************************************************/
19 struct sprt_response
{
22 uint16_t client_id
, handle
;
23 u_register_t x1
, x2
, x3
;
26 static struct sprt_response responses
[PLAT_SPM_RESPONSES_MAX
];
28 static spinlock_t responses_lock
;
30 /* Add response to the global response buffer. Returns 0 on success else -1. */
31 int spm_response_add(uint16_t client_id
, uint16_t handle
, uint32_t token
,
32 u_register_t x1
, u_register_t x2
, u_register_t x3
)
34 spin_lock(&responses_lock
);
36 /* Make sure that there isn't any other response with the same token. */
37 for (unsigned int i
= 0U; i
< ARRAY_SIZE(responses
); i
++) {
38 struct sprt_response
*resp
= &(responses
[i
]);
40 if ((resp
->is_valid
== 1) && (resp
->token
== token
)) {
45 for (int i
= 0; i
< ARRAY_SIZE(responses
); i
++) {
46 struct sprt_response
*resp
= &(responses
[i
]);
48 if (resp
->is_valid
== 0) {
50 resp
->client_id
= client_id
;
51 resp
->handle
= handle
;
60 spin_unlock(&responses_lock
);
66 spin_unlock(&responses_lock
);
72 * Returns a response from the requests array and removes it from it. Returns 0
73 * on success, -1 if it wasn't found.
75 int spm_response_get(uint16_t client_id
, uint16_t handle
, uint32_t token
,
76 u_register_t
*x1
, u_register_t
*x2
, u_register_t
*x3
)
78 spin_lock(&responses_lock
);
80 for (unsigned int i
= 0U; i
< ARRAY_SIZE(responses
); i
++) {
81 struct sprt_response
*resp
= &(responses
[i
]);
83 /* Ignore invalid entries */
84 if (resp
->is_valid
== 0) {
88 /* Make sure that all the information matches the stored one */
89 if ((resp
->token
!= token
) || (resp
->client_id
!= client_id
) ||
90 (resp
->handle
!= handle
)) {
102 spin_unlock(&responses_lock
);
107 spin_unlock(&responses_lock
);