blob: 264da28aee0de1fc8829698c7c1706b489fb1ade [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001/*
2 * Copyright (c) 2018, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arm_gic.h>
8#include <assert.h>
9#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);
79 return ret.ret0;
80}
81
82int64_t sdei_event_unregister(int ev)
83{
84 smc_args args = { 0 };
85 smc_ret_values ret;
86
Sandrine Bailleux17795062018-12-13 16:02:41 +010087 args.fid = SDEI_EVENT_UNREGISTER;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020088 args.arg1 = ev;
89 ret = tftf_smc(&args);
90 return ret.ret0;
91}
92
93int64_t sdei_event_enable(int ev)
94{
95 smc_args args = { 0 };
96 smc_ret_values ret;
97
Sandrine Bailleux17795062018-12-13 16:02:41 +010098 args.fid = SDEI_EVENT_ENABLE;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020099 args.arg1 = ev;
100 ret = tftf_smc(&args);
101 return ret.ret0;
102}
103
104int64_t sdei_event_disable(int ev)
105{
106 smc_args args = { 0 };
107 smc_ret_values ret;
108
Sandrine Bailleux17795062018-12-13 16:02:41 +0100109 args.fid = SDEI_EVENT_DISABLE;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200110 args.arg1 = ev;
111 ret = tftf_smc(&args);
112 return ret.ret0;
113}
114
115int64_t sdei_pe_mask(void)
116{
117 smc_args args = { 0 };
118 smc_ret_values ret;
119
Sandrine Bailleux17795062018-12-13 16:02:41 +0100120 args.fid = SDEI_PE_MASK;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200121 ret = tftf_smc(&args);
122 return ret.ret0;
123}
124
125int64_t sdei_pe_unmask(void)
126{
127 smc_args args = { 0 };
128 smc_ret_values ret;
129
Sandrine Bailleux17795062018-12-13 16:02:41 +0100130 args.fid = SDEI_PE_UNMASK;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200131 ret = tftf_smc(&args);
132 return ret.ret0;
133}
134
135int64_t sdei_private_reset(void)
136{
137 smc_args args = { 0 };
138 smc_ret_values ret;
139
Sandrine Bailleux17795062018-12-13 16:02:41 +0100140 args.fid = SDEI_PRIVATE_RESET;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200141 ret = tftf_smc(&args);
142 return ret.ret0;
143}
144
145int64_t sdei_shared_reset(void)
146{
147 smc_args args = { 0 };
148 smc_ret_values ret;
149
Sandrine Bailleux17795062018-12-13 16:02:41 +0100150 args.fid = SDEI_SHARED_RESET;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200151 ret = tftf_smc(&args);
152 return ret.ret0;
153}
154
155int64_t sdei_event_signal(uint64_t mpidr)
156{
157 smc_args args = { 0 };
158 smc_ret_values ret;
159
Sandrine Bailleux17795062018-12-13 16:02:41 +0100160 args.fid = SDEI_EVENT_SIGNAL;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200161 args.arg1 = 0; /* must be event 0 */
162 args.arg2 = mpidr;
163 ret = tftf_smc(&args);
164 return ret.ret0;
165}
166
167int64_t sdei_event_status(int32_t ev)
168{
169 smc_args args = { 0 };
170 smc_ret_values ret;
171
Sandrine Bailleux17795062018-12-13 16:02:41 +0100172 args.fid = SDEI_EVENT_STATUS;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200173 args.arg1 = ev;
174 ret = tftf_smc(&args);
175 return ret.ret0;
176}
177
178int64_t sdei_event_routing_set(int32_t ev, uint64_t flags)
179{
180 smc_args args = { 0 };
181 smc_ret_values ret;
182
Sandrine Bailleux17795062018-12-13 16:02:41 +0100183 args.fid = SDEI_EVENT_ROUTING_SET;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200184 args.arg1 = ev;
185 args.arg2 = flags;
186 ret = tftf_smc(&args);
187 return ret.ret0;
188}
189
190int64_t sdei_event_context(uint32_t param)
191{
192 smc_args args = { 0 };
193 smc_ret_values ret;
194
Sandrine Bailleux17795062018-12-13 16:02:41 +0100195 args.fid = SDEI_EVENT_CONTEXT;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200196 args.arg1 = param;
197 ret = tftf_smc(&args);
198 return ret.ret0;
199}
200
201int64_t sdei_event_complete(uint32_t flags)
202{
203 smc_args args = { 0 };
204 smc_ret_values ret;
205
Sandrine Bailleux17795062018-12-13 16:02:41 +0100206 args.fid = SDEI_EVENT_COMPLETE;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200207 args.arg1 = flags;
208 ret = tftf_smc(&args);
209 return ret.ret0;
210}
211
212int64_t sdei_event_complete_and_resume(uint64_t addr)
213{
214 smc_args args = { 0 };
215 smc_ret_values ret;
216
Sandrine Bailleux17795062018-12-13 16:02:41 +0100217 args.fid = SDEI_EVENT_COMPLETE_AND_RESUME;
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200218 args.arg1 = addr;
219 ret = tftf_smc(&args);
220 return ret.ret0;
221}