blob: 2a5b951ffab073d7455752b5a1f5abb6870152b2 [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{
77 u_register_t my_mpidr;
78 secondary_ep_t ep;
79
80 my_mpidr = read_mpidr_el1() & MPID_MASK;
81 ep = entrypoint[my_mpidr];
82 if (ep != NULL) {
83 entrypoint[my_mpidr] = NULL;
84 context_id[my_mpidr] = 0;
85 (ep)(context_id[my_mpidr]);
86 } else {
87 /*
88 * Host can execute Rec directly without CPU_ON
89 * from Realm, if Rec is created RUNNABLE
90 * Jump to main in this case.
91 */
92 while (true) {
93 realm_payload_main();
94 }
95 }
96 realm_cpu_off();
97}