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
)) {
41 spin_unlock(&responses_lock
);
47 for (unsigned int i
= 0U; i
< ARRAY_SIZE(responses
); i
++) {
48 struct sprt_response
*resp
= &(responses
[i
]);
50 if (resp
->is_valid
== 0) {
52 resp
->client_id
= client_id
;
53 resp
->handle
= handle
;
62 spin_unlock(&responses_lock
);
68 spin_unlock(&responses_lock
);
74 * Returns a response from the requests array and removes it from it. Returns 0
75 * on success, -1 if it wasn't found.
77 int spm_response_get(uint16_t client_id
, uint16_t handle
, uint32_t token
,
78 u_register_t
*x1
, u_register_t
*x2
, u_register_t
*x3
)
80 spin_lock(&responses_lock
);
82 for (unsigned int i
= 0U; i
< ARRAY_SIZE(responses
); i
++) {
83 struct sprt_response
*resp
= &(responses
[i
]);
85 /* Ignore invalid entries */
86 if (resp
->is_valid
== 0) {
90 /* Make sure that all the information matches the stored one */
91 if ((resp
->token
!= token
) || (resp
->client_id
!= client_id
) ||
92 (resp
->handle
!= handle
)) {
104 spin_unlock(&responses_lock
);
109 spin_unlock(&responses_lock
);