1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#define pr_fmt(fmt) "efi: " fmt
27
28#include <linux/bug.h>
29#include <linux/efi.h>
30#include <linux/irqflags.h>
31#include <linux/mutex.h>
32#include <linux/semaphore.h>
33#include <linux/stringify.h>
34#include <linux/workqueue.h>
35#include <linux/completion.h>
36
37#include <asm/efi.h>
38
39
40
41
42
43#define efi_call_virt(f, args...) \
44 efi_call_virt_pointer(efi.systab->runtime, f, args)
45#define __efi_call_virt(f, args...) \
46 __efi_call_virt_pointer(efi.systab->runtime, f, args)
47
48struct efi_runtime_work efi_rts_work;
49
50
51
52
53
54
55
56
57
58
59
60#define efi_queue_work(_rts, _arg1, _arg2, _arg3, _arg4, _arg5) \
61({ \
62 efi_rts_work.status = EFI_ABORTED; \
63 \
64 if (!efi_enabled(EFI_RUNTIME_SERVICES)) { \
65 pr_warn_once("EFI Runtime Services are disabled!\n"); \
66 goto exit; \
67 } \
68 \
69 init_completion(&efi_rts_work.efi_rts_comp); \
70 INIT_WORK(&efi_rts_work.work, efi_call_rts); \
71 efi_rts_work.arg1 = _arg1; \
72 efi_rts_work.arg2 = _arg2; \
73 efi_rts_work.arg3 = _arg3; \
74 efi_rts_work.arg4 = _arg4; \
75 efi_rts_work.arg5 = _arg5; \
76 efi_rts_work.efi_rts_id = _rts; \
77 \
78
79
80
81 \
82 if (queue_work(efi_rts_wq, &efi_rts_work.work)) \
83 wait_for_completion(&efi_rts_work.efi_rts_comp); \
84 else \
85 pr_err("Failed to queue work to efi_rts_wq.\n"); \
86 \
87exit: \
88 efi_rts_work.efi_rts_id = NONE; \
89 efi_rts_work.status; \
90})
91
92void efi_call_virt_check_flags(unsigned long flags, const char *call)
93{
94 unsigned long cur_flags, mismatch;
95
96 local_save_flags(cur_flags);
97
98 mismatch = flags ^ cur_flags;
99 if (!WARN_ON_ONCE(mismatch & ARCH_EFI_IRQ_FLAGS_MASK))
100 return;
101
102 add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_NOW_UNRELIABLE);
103 pr_err_ratelimited(FW_BUG "IRQ flags corrupted (0x%08lx=>0x%08lx) by EFI %s\n",
104 flags, cur_flags, call);
105 local_irq_restore(flags);
106}
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147static DEFINE_SEMAPHORE(efi_runtime_lock);
148
149
150
151
152#ifdef CONFIG_X86_UV
153extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock);
154#endif
155
156
157
158
159
160
161
162
163
164
165
166static void efi_call_rts(struct work_struct *work)
167{
168 void *arg1, *arg2, *arg3, *arg4, *arg5;
169 efi_status_t status = EFI_NOT_FOUND;
170
171 arg1 = efi_rts_work.arg1;
172 arg2 = efi_rts_work.arg2;
173 arg3 = efi_rts_work.arg3;
174 arg4 = efi_rts_work.arg4;
175 arg5 = efi_rts_work.arg5;
176
177 switch (efi_rts_work.efi_rts_id) {
178 case GET_TIME:
179 status = efi_call_virt(get_time, (efi_time_t *)arg1,
180 (efi_time_cap_t *)arg2);
181 break;
182 case SET_TIME:
183 status = efi_call_virt(set_time, (efi_time_t *)arg1);
184 break;
185 case GET_WAKEUP_TIME:
186 status = efi_call_virt(get_wakeup_time, (efi_bool_t *)arg1,
187 (efi_bool_t *)arg2, (efi_time_t *)arg3);
188 break;
189 case SET_WAKEUP_TIME:
190 status = efi_call_virt(set_wakeup_time, *(efi_bool_t *)arg1,
191 (efi_time_t *)arg2);
192 break;
193 case GET_VARIABLE:
194 status = efi_call_virt(get_variable, (efi_char16_t *)arg1,
195 (efi_guid_t *)arg2, (u32 *)arg3,
196 (unsigned long *)arg4, (void *)arg5);
197 break;
198 case GET_NEXT_VARIABLE:
199 status = efi_call_virt(get_next_variable, (unsigned long *)arg1,
200 (efi_char16_t *)arg2,
201 (efi_guid_t *)arg3);
202 break;
203 case SET_VARIABLE:
204 status = efi_call_virt(set_variable, (efi_char16_t *)arg1,
205 (efi_guid_t *)arg2, *(u32 *)arg3,
206 *(unsigned long *)arg4, (void *)arg5);
207 break;
208 case QUERY_VARIABLE_INFO:
209 status = efi_call_virt(query_variable_info, *(u32 *)arg1,
210 (u64 *)arg2, (u64 *)arg3, (u64 *)arg4);
211 break;
212 case GET_NEXT_HIGH_MONO_COUNT:
213 status = efi_call_virt(get_next_high_mono_count, (u32 *)arg1);
214 break;
215 case UPDATE_CAPSULE:
216 status = efi_call_virt(update_capsule,
217 (efi_capsule_header_t **)arg1,
218 *(unsigned long *)arg2,
219 *(unsigned long *)arg3);
220 break;
221 case QUERY_CAPSULE_CAPS:
222 status = efi_call_virt(query_capsule_caps,
223 (efi_capsule_header_t **)arg1,
224 *(unsigned long *)arg2, (u64 *)arg3,
225 (int *)arg4);
226 break;
227 default:
228
229
230
231
232
233 pr_err("Requested executing invalid EFI Runtime Service.\n");
234 }
235 efi_rts_work.status = status;
236 complete(&efi_rts_work.efi_rts_comp);
237}
238
239static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
240{
241 efi_status_t status;
242
243 if (down_interruptible(&efi_runtime_lock))
244 return EFI_ABORTED;
245 status = efi_queue_work(GET_TIME, tm, tc, NULL, NULL, NULL);
246 up(&efi_runtime_lock);
247 return status;
248}
249
250static efi_status_t virt_efi_set_time(efi_time_t *tm)
251{
252 efi_status_t status;
253
254 if (down_interruptible(&efi_runtime_lock))
255 return EFI_ABORTED;
256 status = efi_queue_work(SET_TIME, tm, NULL, NULL, NULL, NULL);
257 up(&efi_runtime_lock);
258 return status;
259}
260
261static efi_status_t virt_efi_get_wakeup_time(efi_bool_t *enabled,
262 efi_bool_t *pending,
263 efi_time_t *tm)
264{
265 efi_status_t status;
266
267 if (down_interruptible(&efi_runtime_lock))
268 return EFI_ABORTED;
269 status = efi_queue_work(GET_WAKEUP_TIME, enabled, pending, tm, NULL,
270 NULL);
271 up(&efi_runtime_lock);
272 return status;
273}
274
275static efi_status_t virt_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
276{
277 efi_status_t status;
278
279 if (down_interruptible(&efi_runtime_lock))
280 return EFI_ABORTED;
281 status = efi_queue_work(SET_WAKEUP_TIME, &enabled, tm, NULL, NULL,
282 NULL);
283 up(&efi_runtime_lock);
284 return status;
285}
286
287static efi_status_t virt_efi_get_variable(efi_char16_t *name,
288 efi_guid_t *vendor,
289 u32 *attr,
290 unsigned long *data_size,
291 void *data)
292{
293 efi_status_t status;
294
295 if (down_interruptible(&efi_runtime_lock))
296 return EFI_ABORTED;
297 status = efi_queue_work(GET_VARIABLE, name, vendor, attr, data_size,
298 data);
299 up(&efi_runtime_lock);
300 return status;
301}
302
303static efi_status_t virt_efi_get_next_variable(unsigned long *name_size,
304 efi_char16_t *name,
305 efi_guid_t *vendor)
306{
307 efi_status_t status;
308
309 if (down_interruptible(&efi_runtime_lock))
310 return EFI_ABORTED;
311 status = efi_queue_work(GET_NEXT_VARIABLE, name_size, name, vendor,
312 NULL, NULL);
313 up(&efi_runtime_lock);
314 return status;
315}
316
317static efi_status_t virt_efi_set_variable(efi_char16_t *name,
318 efi_guid_t *vendor,
319 u32 attr,
320 unsigned long data_size,
321 void *data)
322{
323 efi_status_t status;
324
325 if (down_interruptible(&efi_runtime_lock))
326 return EFI_ABORTED;
327 status = efi_queue_work(SET_VARIABLE, name, vendor, &attr, &data_size,
328 data);
329 up(&efi_runtime_lock);
330 return status;
331}
332
333static efi_status_t
334virt_efi_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
335 u32 attr, unsigned long data_size,
336 void *data)
337{
338 efi_status_t status;
339
340 if (down_trylock(&efi_runtime_lock))
341 return EFI_NOT_READY;
342
343 status = efi_call_virt(set_variable, name, vendor, attr, data_size,
344 data);
345 up(&efi_runtime_lock);
346 return status;
347}
348
349
350static efi_status_t virt_efi_query_variable_info(u32 attr,
351 u64 *storage_space,
352 u64 *remaining_space,
353 u64 *max_variable_size)
354{
355 efi_status_t status;
356
357 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
358 return EFI_UNSUPPORTED;
359
360 if (down_interruptible(&efi_runtime_lock))
361 return EFI_ABORTED;
362 status = efi_queue_work(QUERY_VARIABLE_INFO, &attr, storage_space,
363 remaining_space, max_variable_size, NULL);
364 up(&efi_runtime_lock);
365 return status;
366}
367
368static efi_status_t
369virt_efi_query_variable_info_nonblocking(u32 attr,
370 u64 *storage_space,
371 u64 *remaining_space,
372 u64 *max_variable_size)
373{
374 efi_status_t status;
375
376 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
377 return EFI_UNSUPPORTED;
378
379 if (down_trylock(&efi_runtime_lock))
380 return EFI_NOT_READY;
381
382 status = efi_call_virt(query_variable_info, attr, storage_space,
383 remaining_space, max_variable_size);
384 up(&efi_runtime_lock);
385 return status;
386}
387
388static efi_status_t virt_efi_get_next_high_mono_count(u32 *count)
389{
390 efi_status_t status;
391
392 if (down_interruptible(&efi_runtime_lock))
393 return EFI_ABORTED;
394 status = efi_queue_work(GET_NEXT_HIGH_MONO_COUNT, count, NULL, NULL,
395 NULL, NULL);
396 up(&efi_runtime_lock);
397 return status;
398}
399
400static void virt_efi_reset_system(int reset_type,
401 efi_status_t status,
402 unsigned long data_size,
403 efi_char16_t *data)
404{
405 if (down_interruptible(&efi_runtime_lock)) {
406 pr_warn("failed to invoke the reset_system() runtime service:\n"
407 "could not get exclusive access to the firmware\n");
408 return;
409 }
410 efi_rts_work.efi_rts_id = RESET_SYSTEM;
411 __efi_call_virt(reset_system, reset_type, status, data_size, data);
412 up(&efi_runtime_lock);
413}
414
415static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules,
416 unsigned long count,
417 unsigned long sg_list)
418{
419 efi_status_t status;
420
421 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
422 return EFI_UNSUPPORTED;
423
424 if (down_interruptible(&efi_runtime_lock))
425 return EFI_ABORTED;
426 status = efi_queue_work(UPDATE_CAPSULE, capsules, &count, &sg_list,
427 NULL, NULL);
428 up(&efi_runtime_lock);
429 return status;
430}
431
432static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules,
433 unsigned long count,
434 u64 *max_size,
435 int *reset_type)
436{
437 efi_status_t status;
438
439 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
440 return EFI_UNSUPPORTED;
441
442 if (down_interruptible(&efi_runtime_lock))
443 return EFI_ABORTED;
444 status = efi_queue_work(QUERY_CAPSULE_CAPS, capsules, &count,
445 max_size, reset_type, NULL);
446 up(&efi_runtime_lock);
447 return status;
448}
449
450void efi_native_runtime_setup(void)
451{
452 efi.get_time = virt_efi_get_time;
453 efi.set_time = virt_efi_set_time;
454 efi.get_wakeup_time = virt_efi_get_wakeup_time;
455 efi.set_wakeup_time = virt_efi_set_wakeup_time;
456 efi.get_variable = virt_efi_get_variable;
457 efi.get_next_variable = virt_efi_get_next_variable;
458 efi.set_variable = virt_efi_set_variable;
459 efi.set_variable_nonblocking = virt_efi_set_variable_nonblocking;
460 efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
461 efi.reset_system = virt_efi_reset_system;
462 efi.query_variable_info = virt_efi_query_variable_info;
463 efi.query_variable_info_nonblocking = virt_efi_query_variable_info_nonblocking;
464 efi.update_capsule = virt_efi_update_capsule;
465 efi.query_capsule_caps = virt_efi_query_capsule_caps;
466}
467