blob: a4a287b3badffdcf9178b841efb255cafebb8792 [file] [log] [blame]
Shruti Gupta699cd4f2023-09-27 16:46:54 +01001/*
2 * Copyright (c) 2023, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include <debug.h>
9#include <psci.h>
10#include <realm_def.h>
11#include <tftf_lib.h>
12
13typedef void (*secondary_ep_t)(u_register_t);
14static secondary_ep_t entrypoint[MAX_REC_COUNT];
15static u_register_t context_id[MAX_REC_COUNT];
16void realm_entrypoint(void);
17void realm_payload_main(void);
18
19void realm_cpu_off(void)
20{
21 smc_args args = { SMC_PSCI_CPU_OFF };
22
23 tftf_smc(&args);
24}
25
26u_register_t realm_cpu_on(u_register_t mpidr, uintptr_t ep, u_register_t cxt_id)
27{
28 smc_args args;
29 smc_ret_values ret_vals;
30
31
32 if (mpidr > MAX_REC_COUNT) {
33 return PSCI_E_INVALID_PARAMS;
34 }
35
36 if (entrypoint[mpidr] != NULL) {
37 return PSCI_E_ALREADY_ON;
38 }
39
40 args.fid = SMC_PSCI_CPU_ON;
41 args.arg1 = mpidr;
42 args.arg2 = (u_register_t)realm_entrypoint;
43 args.arg3 = cxt_id;
44 entrypoint[mpidr] = (secondary_ep_t)ep;
45 context_id[mpidr] = cxt_id;
46 ret_vals = tftf_smc(&args);
47 return ret_vals.ret0;
48}
49
50u_register_t realm_psci_affinity_info(u_register_t target_affinity,
51 uint32_t lowest_affinity_level)
52{
53 smc_args args;
54 smc_ret_values ret_vals;
55
56 args.fid = SMC_PSCI_AFFINITY_INFO;
57 args.arg1 = target_affinity;
58 args.arg2 = lowest_affinity_level;
59 ret_vals = tftf_smc(&args);
60 return ret_vals.ret0;
61}
62
63u_register_t realm_psci_features(uint32_t psci_func_id)
64{
65
66 smc_args args;
67 smc_ret_values ret_vals;
68
69 args.fid = SMC_PSCI_FEATURES;
70 args.arg1 = psci_func_id;
71 ret_vals = tftf_smc(&args);
72 return ret_vals.ret0;
73}
74
75void realm_secondary_entrypoint(u_register_t cxt_id)
76{
Shruti Guptaaffbae82023-08-22 12:51:11 +010077 u_register_t my_mpidr, id;
Shruti Gupta699cd4f2023-09-27 16:46:54 +010078 secondary_ep_t ep;
79
80 my_mpidr = read_mpidr_el1() & MPID_MASK;
81 ep = entrypoint[my_mpidr];
Shruti Guptaaffbae82023-08-22 12:51:11 +010082 id = context_id[my_mpidr];
Shruti Gupta699cd4f2023-09-27 16:46:54 +010083 if (ep != NULL) {
84 entrypoint[my_mpidr] = NULL;
85 context_id[my_mpidr] = 0;
Shruti Guptaaffbae82023-08-22 12:51:11 +010086 (ep)(id);
Shruti Gupta699cd4f2023-09-27 16:46:54 +010087 } else {
88 /*
89 * Host can execute Rec directly without CPU_ON
90 * from Realm, if Rec is created RUNNABLE
91 * Jump to main in this case.
92 */
93 while (true) {
94 realm_payload_main();
95 }
96 }
97 realm_cpu_off();
98}