blob: eb0e9612851b57be9f8dd28d9d431d542248f00a [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001/*
Alex Liang0fa7d212024-06-18 11:17:01 -05002 * Copyright (c) 2024, Arm Limited. All rights reserved.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02007#include <assert.h>
Antonio Nino Diaz09a00ef2019-01-11 13:12:58 +00008#include <drivers/arm/arm_gic.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02009#include <sdei.h>
10#include <smccc.h>
11#include <stdint.h>
12#include <tftf_lib.h>
13
14int64_t sdei_version(void)
15{
16 smc_args args = { SDEI_VERSION };
17 smc_ret_values ret;
18
19 ret = tftf_smc(&args);
20 return ret.ret0;
21}
22
23int64_t sdei_interrupt_bind(int intr, struct sdei_intr_ctx *intr_ctx)
24{
25 smc_args args = { 0 };
26 smc_ret_values ret;
27
28 assert(intr_ctx);
29
30 intr_ctx->priority = arm_gic_get_intr_priority(intr);
31 intr_ctx->num = intr;
32 intr_ctx->enabled = arm_gic_intr_enabled(intr);
33 arm_gic_intr_disable(intr);
34
Sandrine Bailleux17795062018-12-13 16:02:41 +010035 args.fid = SDEI_INTERRUPT_BIND;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020036 args.arg1 = intr;
37 ret = tftf_smc(&args);
38 if (ret.ret0 < 0) {
39 arm_gic_set_intr_priority(intr_ctx->num, intr_ctx->priority);
40 if (intr_ctx->enabled)
41 arm_gic_intr_enable(intr_ctx->num);
42 }
43
44 return ret.ret0;
45}
46
47int64_t sdei_interrupt_release(int ev, const struct sdei_intr_ctx *intr_ctx)
48{
49 smc_args args = { 0 };
50 smc_ret_values ret;
51
52 assert(intr_ctx);
53
Sandrine Bailleux17795062018-12-13 16:02:41 +010054 args.fid = SDEI_INTERRUPT_RELEASE;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020055 args.arg1 = ev;
56 ret = tftf_smc(&args);
57 if (ret.ret0 == 0) {
58 arm_gic_set_intr_priority(intr_ctx->num, intr_ctx->priority);
59 if (intr_ctx->enabled)
60 arm_gic_intr_enable(intr_ctx->num);
61 }
62
63 return ret.ret0;
64}
65
66int64_t sdei_event_register(int ev, sdei_handler_t *ep,
67 uint64_t ep_arg, int flags, uint64_t mpidr)
68{
69 smc_args args = { 0 };
70 smc_ret_values ret;
71
Sandrine Bailleux17795062018-12-13 16:02:41 +010072 args.fid = SDEI_EVENT_REGISTER;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020073 args.arg1 = ev;
74 args.arg2 = (u_register_t)ep;
75 args.arg3 = ep_arg;
76 args.arg4 = flags;
77 args.arg5 = mpidr;
78 ret = tftf_smc(&args);
Alex Liang0fa7d212024-06-18 11:17:01 -050079
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020080 return ret.ret0;
81}
82
83int64_t sdei_event_unregister(int ev)
84{
85 smc_args args = { 0 };
86 smc_ret_values ret;
87
Sandrine Bailleux17795062018-12-13 16:02:41 +010088 args.fid = SDEI_EVENT_UNREGISTER;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020089 args.arg1 = ev;
90 ret = tftf_smc(&args);
91 return ret.ret0;
92}
93
94int64_t sdei_event_enable(int ev)
95{
96 smc_args args = { 0 };
97 smc_ret_values ret;
98
Sandrine Bailleux17795062018-12-13 16:02:41 +010099 args.fid = SDEI_EVENT_ENABLE;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200100 args.arg1 = ev;
101 ret = tftf_smc(&args);
102 return ret.ret0;
103}
104
105int64_t sdei_event_disable(int ev)
106{
107 smc_args args = { 0 };
108 smc_ret_values ret;
109
Sandrine Bailleux17795062018-12-13 16:02:41 +0100110 args.fid = SDEI_EVENT_DISABLE;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200111 args.arg1 = ev;
112 ret = tftf_smc(&args);
113 return ret.ret0;
114}
115
116int64_t sdei_pe_mask(void)
117{
118 smc_args args = { 0 };
119 smc_ret_values ret;
120
Sandrine Bailleux17795062018-12-13 16:02:41 +0100121 args.fid = SDEI_PE_MASK;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200122 ret = tftf_smc(&args);
123 return ret.ret0;
124}
125
126int64_t sdei_pe_unmask(void)
127{
128 smc_args args = { 0 };
129 smc_ret_values ret;
130
Sandrine Bailleux17795062018-12-13 16:02:41 +0100131 args.fid = SDEI_PE_UNMASK;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200132 ret = tftf_smc(&args);
133 return ret.ret0;
134}
135
136int64_t sdei_private_reset(void)
137{
138 smc_args args = { 0 };
139 smc_ret_values ret;
140
Sandrine Bailleux17795062018-12-13 16:02:41 +0100141 args.fid = SDEI_PRIVATE_RESET;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200142 ret = tftf_smc(&args);
143 return ret.ret0;
144}
145
146int64_t sdei_shared_reset(void)
147{
148 smc_args args = { 0 };
149 smc_ret_values ret;
150
Sandrine Bailleux17795062018-12-13 16:02:41 +0100151 args.fid = SDEI_SHARED_RESET;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200152 ret = tftf_smc(&args);
153 return ret.ret0;
154}
155
156int64_t sdei_event_signal(uint64_t mpidr)
157{
158 smc_args args = { 0 };
159 smc_ret_values ret;
160
Sandrine Bailleux17795062018-12-13 16:02:41 +0100161 args.fid = SDEI_EVENT_SIGNAL;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200162 args.arg1 = 0; /* must be event 0 */
163 args.arg2 = mpidr;
164 ret = tftf_smc(&args);
165 return ret.ret0;
166}
167
168int64_t sdei_event_status(int32_t ev)
169{
170 smc_args args = { 0 };
171 smc_ret_values ret;
172
Sandrine Bailleux17795062018-12-13 16:02:41 +0100173 args.fid = SDEI_EVENT_STATUS;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200174 args.arg1 = ev;
175 ret = tftf_smc(&args);
176 return ret.ret0;
177}
178
179int64_t sdei_event_routing_set(int32_t ev, uint64_t flags)
180{
181 smc_args args = { 0 };
182 smc_ret_values ret;
183
Sandrine Bailleux17795062018-12-13 16:02:41 +0100184 args.fid = SDEI_EVENT_ROUTING_SET;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200185 args.arg1 = ev;
186 args.arg2 = flags;
187 ret = tftf_smc(&args);
188 return ret.ret0;
189}
190
191int64_t sdei_event_context(uint32_t param)
192{
193 smc_args args = { 0 };
194 smc_ret_values ret;
195
Sandrine Bailleux17795062018-12-13 16:02:41 +0100196 args.fid = SDEI_EVENT_CONTEXT;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200197 args.arg1 = param;
198 ret = tftf_smc(&args);
199 return ret.ret0;
200}
201
202int64_t sdei_event_complete(uint32_t flags)
203{
204 smc_args args = { 0 };
205 smc_ret_values ret;
206
Sandrine Bailleux17795062018-12-13 16:02:41 +0100207 args.fid = SDEI_EVENT_COMPLETE;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200208 args.arg1 = flags;
209 ret = tftf_smc(&args);
210 return ret.ret0;
211}
212
213int64_t sdei_event_complete_and_resume(uint64_t addr)
214{
215 smc_args args = { 0 };
216 smc_ret_values ret;
217
Sandrine Bailleux17795062018-12-13 16:02:41 +0100218 args.fid = SDEI_EVENT_COMPLETE_AND_RESUME;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200219 args.arg1 = addr;
220 ret = tftf_smc(&args);
221 return ret.ret0;
222}
Alex Liang0fa7d212024-06-18 11:17:01 -0500223
224int64_t sdei_features(uint32_t feature)
225{
226 smc_args args = { 0 };
227 smc_ret_values ret;
228
229 args.fid = SDEI_FEATURES;
230 args.arg1 = feature;
231 ret = tftf_smc(&args);
232 return ret.ret0;
233}
234
235int64_t sdei_event_get_info(int32_t event, uint32_t info)
236{
237 smc_args args = { 0 };
238 smc_ret_values ret;
239
240 args.fid = SDEI_EVENT_GET_INFO;
241 args.arg1 = event;
242 args.arg2 = info;
243 ret = tftf_smc(&args);
244 return ret.ret0;
245}