]> git.sur5r.net Git - u-boot/blob - lib/efi_loader/efi_boottime.c
Merge branch 'master' of git://git.denx.de/u-boot-sunxi
[u-boot] / lib / efi_loader / efi_boottime.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  *  EFI application boot time services
4  *
5  *  Copyright (c) 2016 Alexander Graf
6  */
7
8 #include <common.h>
9 #include <div64.h>
10 #include <efi_loader.h>
11 #include <environment.h>
12 #include <malloc.h>
13 #include <linux/libfdt_env.h>
14 #include <u-boot/crc.h>
15 #include <bootm.h>
16 #include <inttypes.h>
17 #include <watchdog.h>
18
19 DECLARE_GLOBAL_DATA_PTR;
20
21 /* Task priority level */
22 static efi_uintn_t efi_tpl = TPL_APPLICATION;
23
24 /* This list contains all the EFI objects our payload has access to */
25 LIST_HEAD(efi_obj_list);
26
27 /* List of all events */
28 LIST_HEAD(efi_events);
29
30 /*
31  * If we're running on nasty systems (32bit ARM booting into non-EFI Linux)
32  * we need to do trickery with caches. Since we don't want to break the EFI
33  * aware boot path, only apply hacks when loading exiting directly (breaking
34  * direct Linux EFI booting along the way - oh well).
35  */
36 static bool efi_is_direct_boot = true;
37
38 /*
39  * EFI can pass arbitrary additional "tables" containing vendor specific
40  * information to the payload. One such table is the FDT table which contains
41  * a pointer to a flattened device tree blob.
42  *
43  * In most cases we want to pass an FDT to the payload, so reserve one slot of
44  * config table space for it. The pointer gets populated by do_bootefi_exec().
45  */
46 static struct efi_configuration_table __efi_runtime_data efi_conf_table[16];
47
48 #ifdef CONFIG_ARM
49 /*
50  * The "gd" pointer lives in a register on ARM and AArch64 that we declare
51  * fixed when compiling U-Boot. However, the payload does not know about that
52  * restriction so we need to manually swap its and our view of that register on
53  * EFI callback entry/exit.
54  */
55 static volatile void *efi_gd, *app_gd;
56 #endif
57
58 static int entry_count;
59 static int nesting_level;
60 /* GUID of the device tree table */
61 const efi_guid_t efi_guid_fdt = EFI_FDT_GUID;
62 /* GUID of the EFI_DRIVER_BINDING_PROTOCOL */
63 const efi_guid_t efi_guid_driver_binding_protocol =
64                         EFI_DRIVER_BINDING_PROTOCOL_GUID;
65
66 /* event group ExitBootServices() invoked */
67 const efi_guid_t efi_guid_event_group_exit_boot_services =
68                         EFI_EVENT_GROUP_EXIT_BOOT_SERVICES;
69 /* event group SetVirtualAddressMap() invoked */
70 const efi_guid_t efi_guid_event_group_virtual_address_change =
71                         EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE;
72 /* event group memory map changed */
73 const efi_guid_t efi_guid_event_group_memory_map_change =
74                         EFI_EVENT_GROUP_MEMORY_MAP_CHANGE;
75 /* event group boot manager about to boot */
76 const efi_guid_t efi_guid_event_group_ready_to_boot =
77                         EFI_EVENT_GROUP_READY_TO_BOOT;
78 /* event group ResetSystem() invoked (before ExitBootServices) */
79 const efi_guid_t efi_guid_event_group_reset_system =
80                         EFI_EVENT_GROUP_RESET_SYSTEM;
81
82 static efi_status_t EFIAPI efi_disconnect_controller(
83                                         efi_handle_t controller_handle,
84                                         efi_handle_t driver_image_handle,
85                                         efi_handle_t child_handle);
86
87 /* Called on every callback entry */
88 int __efi_entry_check(void)
89 {
90         int ret = entry_count++ == 0;
91 #ifdef CONFIG_ARM
92         assert(efi_gd);
93         app_gd = gd;
94         gd = efi_gd;
95 #endif
96         return ret;
97 }
98
99 /* Called on every callback exit */
100 int __efi_exit_check(void)
101 {
102         int ret = --entry_count == 0;
103 #ifdef CONFIG_ARM
104         gd = app_gd;
105 #endif
106         return ret;
107 }
108
109 /* Called from do_bootefi_exec() */
110 void efi_save_gd(void)
111 {
112 #ifdef CONFIG_ARM
113         efi_gd = gd;
114 #endif
115 }
116
117 /*
118  * Special case handler for error/abort that just forces things back
119  * to u-boot world so we can dump out an abort msg, without any care
120  * about returning back to UEFI world.
121  */
122 void efi_restore_gd(void)
123 {
124 #ifdef CONFIG_ARM
125         /* Only restore if we're already in EFI context */
126         if (!efi_gd)
127                 return;
128         gd = efi_gd;
129 #endif
130 }
131
132 /**
133  * indent_string - returns a string for indenting with two spaces per level
134  *
135  * A maximum of ten indent levels is supported. Higher indent levels will be
136  * truncated.
137  *
138  * @level:              indent level
139  * Return Value:        A string for indenting with two spaces per level is
140  *                      returned.
141  */
142 static const char *indent_string(int level)
143 {
144         const char *indent = "                    ";
145         const int max = strlen(indent);
146
147         level = min(max, level * 2);
148         return &indent[max - level];
149 }
150
151 const char *__efi_nesting(void)
152 {
153         return indent_string(nesting_level);
154 }
155
156 const char *__efi_nesting_inc(void)
157 {
158         return indent_string(nesting_level++);
159 }
160
161 const char *__efi_nesting_dec(void)
162 {
163         return indent_string(--nesting_level);
164 }
165
166 /**
167  * efi_queue_event - queue an EFI event
168  *
169  * This function queues the notification function of the event for future
170  * execution.
171  *
172  * The notification function is called if the task priority level of the
173  * event is higher than the current task priority level.
174  *
175  * For the SignalEvent service see efi_signal_event_ext.
176  *
177  * @event:      event to signal
178  * @check_tpl:  check the TPL level
179  */
180 static void efi_queue_event(struct efi_event *event, bool check_tpl)
181 {
182         if (event->notify_function) {
183                 event->is_queued = true;
184                 /* Check TPL */
185                 if (check_tpl && efi_tpl >= event->notify_tpl)
186                         return;
187                 EFI_CALL_VOID(event->notify_function(event,
188                                                      event->notify_context));
189         }
190         event->is_queued = false;
191 }
192
193 /**
194  * efi_signal_event - signal an EFI event
195  *
196  * This function signals an event. If the event belongs to an event group
197  * all events of the group are signaled. If they are of type EVT_NOTIFY_SIGNAL
198  * their notification function is queued.
199  *
200  * For the SignalEvent service see efi_signal_event_ext.
201  *
202  * @event:      event to signal
203  * @check_tpl:  check the TPL level
204  */
205 void efi_signal_event(struct efi_event *event, bool check_tpl)
206 {
207         if (event->group) {
208                 struct efi_event *evt;
209
210                 /*
211                  * The signaled state has to set before executing any
212                  * notification function
213                  */
214                 list_for_each_entry(evt, &efi_events, link) {
215                         if (!evt->group || guidcmp(evt->group, event->group))
216                                 continue;
217                         if (evt->is_signaled)
218                                 continue;
219                         evt->is_signaled = true;
220                         if (evt->type & EVT_NOTIFY_SIGNAL &&
221                             evt->notify_function)
222                                 evt->is_queued = true;
223                 }
224                 list_for_each_entry(evt, &efi_events, link) {
225                         if (!evt->group || guidcmp(evt->group, event->group))
226                                 continue;
227                         if (evt->is_queued)
228                                 efi_queue_event(evt, check_tpl);
229                 }
230         } else if (!event->is_signaled) {
231                 event->is_signaled = true;
232                 if (event->type & EVT_NOTIFY_SIGNAL)
233                         efi_queue_event(event, check_tpl);
234         }
235 }
236
237 /**
238  * efi_raise_tpl - raise the task priority level
239  *
240  * This function implements the RaiseTpl service.
241  * See the Unified Extensible Firmware Interface (UEFI) specification
242  * for details.
243  *
244  * @new_tpl:            new value of the task priority level
245  * Return Value:        old value of the task priority level
246  */
247 static unsigned long EFIAPI efi_raise_tpl(efi_uintn_t new_tpl)
248 {
249         efi_uintn_t old_tpl = efi_tpl;
250
251         EFI_ENTRY("0x%zx", new_tpl);
252
253         if (new_tpl < efi_tpl)
254                 debug("WARNING: new_tpl < current_tpl in %s\n", __func__);
255         efi_tpl = new_tpl;
256         if (efi_tpl > TPL_HIGH_LEVEL)
257                 efi_tpl = TPL_HIGH_LEVEL;
258
259         EFI_EXIT(EFI_SUCCESS);
260         return old_tpl;
261 }
262
263 /**
264  * efi_restore_tpl - lower the task priority level
265  *
266  * This function implements the RestoreTpl service.
267  * See the Unified Extensible Firmware Interface (UEFI) specification
268  * for details.
269  *
270  * @old_tpl:    value of the task priority level to be restored
271  */
272 static void EFIAPI efi_restore_tpl(efi_uintn_t old_tpl)
273 {
274         EFI_ENTRY("0x%zx", old_tpl);
275
276         if (old_tpl > efi_tpl)
277                 debug("WARNING: old_tpl > current_tpl in %s\n", __func__);
278         efi_tpl = old_tpl;
279         if (efi_tpl > TPL_HIGH_LEVEL)
280                 efi_tpl = TPL_HIGH_LEVEL;
281
282         /*
283          * Lowering the TPL may have made queued events eligible for execution.
284          */
285         efi_timer_check();
286
287         EFI_EXIT(EFI_SUCCESS);
288 }
289
290 /**
291  * efi_allocate_pages_ext - allocate memory pages
292  *
293  * This function implements the AllocatePages service.
294  * See the Unified Extensible Firmware Interface (UEFI) specification
295  * for details.
296  *
297  * @type:               type of allocation to be performed
298  * @memory_type:        usage type of the allocated memory
299  * @pages:              number of pages to be allocated
300  * @memory:             allocated memory
301  * Return Value:        status code
302  */
303 static efi_status_t EFIAPI efi_allocate_pages_ext(int type, int memory_type,
304                                                   efi_uintn_t pages,
305                                                   uint64_t *memory)
306 {
307         efi_status_t r;
308
309         EFI_ENTRY("%d, %d, 0x%zx, %p", type, memory_type, pages, memory);
310         r = efi_allocate_pages(type, memory_type, pages, memory);
311         return EFI_EXIT(r);
312 }
313
314 /**
315  * efi_free_pages_ext - Free memory pages.
316  *
317  * This function implements the FreePages service.
318  * See the Unified Extensible Firmware Interface (UEFI) specification
319  * for details.
320  *
321  * @memory:             start of the memory area to be freed
322  * @pages:              number of pages to be freed
323  * Return Value:        status code
324  */
325 static efi_status_t EFIAPI efi_free_pages_ext(uint64_t memory,
326                                               efi_uintn_t pages)
327 {
328         efi_status_t r;
329
330         EFI_ENTRY("%" PRIx64 ", 0x%zx", memory, pages);
331         r = efi_free_pages(memory, pages);
332         return EFI_EXIT(r);
333 }
334
335 /**
336  * efi_get_memory_map_ext - get map describing memory usage
337  *
338  * This function implements the GetMemoryMap service.
339  * See the Unified Extensible Firmware Interface (UEFI) specification
340  * for details.
341  *
342  * @memory_map_size:    on entry the size, in bytes, of the memory map buffer,
343  *                      on exit the size of the copied memory map
344  * @memory_map:         buffer to which the memory map is written
345  * @map_key:            key for the memory map
346  * @descriptor_size:    size of an individual memory descriptor
347  * @descriptor_version: version number of the memory descriptor structure
348  * Return Value:        status code
349  */
350 static efi_status_t EFIAPI efi_get_memory_map_ext(
351                                         efi_uintn_t *memory_map_size,
352                                         struct efi_mem_desc *memory_map,
353                                         efi_uintn_t *map_key,
354                                         efi_uintn_t *descriptor_size,
355                                         uint32_t *descriptor_version)
356 {
357         efi_status_t r;
358
359         EFI_ENTRY("%p, %p, %p, %p, %p", memory_map_size, memory_map,
360                   map_key, descriptor_size, descriptor_version);
361         r = efi_get_memory_map(memory_map_size, memory_map, map_key,
362                                descriptor_size, descriptor_version);
363         return EFI_EXIT(r);
364 }
365
366 /**
367  * efi_allocate_pool_ext - allocate memory from pool
368  *
369  * This function implements the AllocatePool service.
370  * See the Unified Extensible Firmware Interface (UEFI) specification
371  * for details.
372  *
373  * @pool_type:          type of the pool from which memory is to be allocated
374  * @size:               number of bytes to be allocated
375  * @buffer:             allocated memory
376  * Return Value:        status code
377  */
378 static efi_status_t EFIAPI efi_allocate_pool_ext(int pool_type,
379                                                  efi_uintn_t size,
380                                                  void **buffer)
381 {
382         efi_status_t r;
383
384         EFI_ENTRY("%d, %zd, %p", pool_type, size, buffer);
385         r = efi_allocate_pool(pool_type, size, buffer);
386         return EFI_EXIT(r);
387 }
388
389 /**
390  * efi_free_pool_ext - free memory from pool
391  *
392  * This function implements the FreePool service.
393  * See the Unified Extensible Firmware Interface (UEFI) specification
394  * for details.
395  *
396  * @buffer:             start of memory to be freed
397  * Return Value:        status code
398  */
399 static efi_status_t EFIAPI efi_free_pool_ext(void *buffer)
400 {
401         efi_status_t r;
402
403         EFI_ENTRY("%p", buffer);
404         r = efi_free_pool(buffer);
405         return EFI_EXIT(r);
406 }
407
408 /**
409  * efi_add_handle - add a new object to the object list
410  *
411  * The protocols list is initialized.
412  * The object handle is set.
413  *
414  * @obj:        object to be added
415  */
416 void efi_add_handle(struct efi_object *obj)
417 {
418         if (!obj)
419                 return;
420         INIT_LIST_HEAD(&obj->protocols);
421         obj->handle = obj;
422         list_add_tail(&obj->link, &efi_obj_list);
423 }
424
425 /**
426  * efi_create_handle - create handle
427  *
428  * @handle:             new handle
429  * Return Value:        status code
430  */
431 efi_status_t efi_create_handle(efi_handle_t *handle)
432 {
433         struct efi_object *obj;
434
435         obj = calloc(1, sizeof(struct efi_object));
436         if (!obj)
437                 return EFI_OUT_OF_RESOURCES;
438
439         efi_add_handle(obj);
440         *handle = obj->handle;
441
442         return EFI_SUCCESS;
443 }
444
445 /**
446  * efi_search_protocol - find a protocol on a handle.
447  *
448  * @handle:             handle
449  * @protocol_guid:      GUID of the protocol
450  * @handler:            reference to the protocol
451  * Return Value:        status code
452  */
453 efi_status_t efi_search_protocol(const efi_handle_t handle,
454                                  const efi_guid_t *protocol_guid,
455                                  struct efi_handler **handler)
456 {
457         struct efi_object *efiobj;
458         struct list_head *lhandle;
459
460         if (!handle || !protocol_guid)
461                 return EFI_INVALID_PARAMETER;
462         efiobj = efi_search_obj(handle);
463         if (!efiobj)
464                 return EFI_INVALID_PARAMETER;
465         list_for_each(lhandle, &efiobj->protocols) {
466                 struct efi_handler *protocol;
467
468                 protocol = list_entry(lhandle, struct efi_handler, link);
469                 if (!guidcmp(protocol->guid, protocol_guid)) {
470                         if (handler)
471                                 *handler = protocol;
472                         return EFI_SUCCESS;
473                 }
474         }
475         return EFI_NOT_FOUND;
476 }
477
478 /**
479  * efi_remove_protocol - delete protocol from a handle
480  *
481  * @handle:                     handle from which the protocol shall be deleted
482  * @protocol:                   GUID of the protocol to be deleted
483  * @protocol_interface:         interface of the protocol implementation
484  * Return Value:                status code
485  */
486 efi_status_t efi_remove_protocol(const efi_handle_t handle,
487                                  const efi_guid_t *protocol,
488                                  void *protocol_interface)
489 {
490         struct efi_handler *handler;
491         efi_status_t ret;
492
493         ret = efi_search_protocol(handle, protocol, &handler);
494         if (ret != EFI_SUCCESS)
495                 return ret;
496         if (guidcmp(handler->guid, protocol))
497                 return EFI_INVALID_PARAMETER;
498         if (handler->protocol_interface != protocol_interface)
499                 return EFI_INVALID_PARAMETER;
500         list_del(&handler->link);
501         free(handler);
502         return EFI_SUCCESS;
503 }
504
505 /**
506  * efi_remove_all_protocols - delete all protocols from a handle
507  *
508  * @handle:             handle from which the protocols shall be deleted
509  * Return Value:        status code
510  */
511 efi_status_t efi_remove_all_protocols(const efi_handle_t handle)
512 {
513         struct efi_object *efiobj;
514         struct efi_handler *protocol;
515         struct efi_handler *pos;
516
517         efiobj = efi_search_obj(handle);
518         if (!efiobj)
519                 return EFI_INVALID_PARAMETER;
520         list_for_each_entry_safe(protocol, pos, &efiobj->protocols, link) {
521                 efi_status_t ret;
522
523                 ret = efi_remove_protocol(handle, protocol->guid,
524                                           protocol->protocol_interface);
525                 if (ret != EFI_SUCCESS)
526                         return ret;
527         }
528         return EFI_SUCCESS;
529 }
530
531 /**
532  * efi_delete_handle - delete handle
533  *
534  * @obj:        handle to delete
535  */
536 void efi_delete_handle(struct efi_object *obj)
537 {
538         if (!obj)
539                 return;
540         efi_remove_all_protocols(obj->handle);
541         list_del(&obj->link);
542         free(obj);
543 }
544
545 /**
546  * efi_is_event - check if a pointer is a valid event
547  *
548  * @event:              pointer to check
549  * Return Value:        status code
550  */
551 static efi_status_t efi_is_event(const struct efi_event *event)
552 {
553         const struct efi_event *evt;
554
555         if (!event)
556                 return EFI_INVALID_PARAMETER;
557         list_for_each_entry(evt, &efi_events, link) {
558                 if (evt == event)
559                         return EFI_SUCCESS;
560         }
561         return EFI_INVALID_PARAMETER;
562 }
563
564 /**
565  * efi_create_event - create an event
566  *
567  * This function is used inside U-Boot code to create an event.
568  *
569  * For the API function implementing the CreateEvent service see
570  * efi_create_event_ext.
571  *
572  * @type:               type of the event to create
573  * @notify_tpl:         task priority level of the event
574  * @notify_function:    notification function of the event
575  * @notify_context:     pointer passed to the notification function
576  * @group:              event group
577  * @event:              created event
578  * Return Value:        status code
579  */
580 efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
581                               void (EFIAPI *notify_function) (
582                                         struct efi_event *event,
583                                         void *context),
584                               void *notify_context, efi_guid_t *group,
585                               struct efi_event **event)
586 {
587         struct efi_event *evt;
588
589         if (event == NULL)
590                 return EFI_INVALID_PARAMETER;
591
592         if ((type & EVT_NOTIFY_SIGNAL) && (type & EVT_NOTIFY_WAIT))
593                 return EFI_INVALID_PARAMETER;
594
595         if ((type & (EVT_NOTIFY_SIGNAL | EVT_NOTIFY_WAIT)) &&
596             notify_function == NULL)
597                 return EFI_INVALID_PARAMETER;
598
599         evt = calloc(1, sizeof(struct efi_event));
600         if (!evt)
601                 return EFI_OUT_OF_RESOURCES;
602         evt->type = type;
603         evt->notify_tpl = notify_tpl;
604         evt->notify_function = notify_function;
605         evt->notify_context = notify_context;
606         evt->group = group;
607         /* Disable timers on bootup */
608         evt->trigger_next = -1ULL;
609         evt->is_queued = false;
610         evt->is_signaled = false;
611         list_add_tail(&evt->link, &efi_events);
612         *event = evt;
613         return EFI_SUCCESS;
614 }
615
616 /*
617  * efi_create_event_ex - create an event in a group
618  *
619  * This function implements the CreateEventEx service.
620  * See the Unified Extensible Firmware Interface (UEFI) specification
621  * for details.
622  *
623  * @type:               type of the event to create
624  * @notify_tpl:         task priority level of the event
625  * @notify_function:    notification function of the event
626  * @notify_context:     pointer passed to the notification function
627  * @event:              created event
628  * @event_group:        event group
629  * Return Value:        status code
630  */
631 efi_status_t EFIAPI efi_create_event_ex(uint32_t type, efi_uintn_t notify_tpl,
632                                         void (EFIAPI *notify_function) (
633                                                         struct efi_event *event,
634                                                         void *context),
635                                         void *notify_context,
636                                         efi_guid_t *event_group,
637                                         struct efi_event **event)
638 {
639         EFI_ENTRY("%d, 0x%zx, %p, %p, %pUl", type, notify_tpl, notify_function,
640                   notify_context, event_group);
641         return EFI_EXIT(efi_create_event(type, notify_tpl, notify_function,
642                                          notify_context, event_group, event));
643 }
644
645 /**
646  * efi_create_event_ext - create an event
647  *
648  * This function implements the CreateEvent service.
649  * See the Unified Extensible Firmware Interface (UEFI) specification
650  * for details.
651  *
652  * @type:               type of the event to create
653  * @notify_tpl:         task priority level of the event
654  * @notify_function:    notification function of the event
655  * @notify_context:     pointer passed to the notification function
656  * @event:              created event
657  * Return Value:        status code
658  */
659 static efi_status_t EFIAPI efi_create_event_ext(
660                         uint32_t type, efi_uintn_t notify_tpl,
661                         void (EFIAPI *notify_function) (
662                                         struct efi_event *event,
663                                         void *context),
664                         void *notify_context, struct efi_event **event)
665 {
666         EFI_ENTRY("%d, 0x%zx, %p, %p", type, notify_tpl, notify_function,
667                   notify_context);
668         return EFI_EXIT(efi_create_event(type, notify_tpl, notify_function,
669                                          notify_context, NULL, event));
670 }
671
672 /**
673  * efi_timer_check - check if a timer event has occurred
674  *
675  * Check if a timer event has occurred or a queued notification function should
676  * be called.
677  *
678  * Our timers have to work without interrupts, so we check whenever keyboard
679  * input or disk accesses happen if enough time elapsed for them to fire.
680  */
681 void efi_timer_check(void)
682 {
683         struct efi_event *evt;
684         u64 now = timer_get_us();
685
686         list_for_each_entry(evt, &efi_events, link) {
687                 if (evt->is_queued)
688                         efi_queue_event(evt, true);
689                 if (!(evt->type & EVT_TIMER) || now < evt->trigger_next)
690                         continue;
691                 switch (evt->trigger_type) {
692                 case EFI_TIMER_RELATIVE:
693                         evt->trigger_type = EFI_TIMER_STOP;
694                         break;
695                 case EFI_TIMER_PERIODIC:
696                         evt->trigger_next += evt->trigger_time;
697                         break;
698                 default:
699                         continue;
700                 }
701                 evt->is_signaled = false;
702                 efi_signal_event(evt, true);
703         }
704         WATCHDOG_RESET();
705 }
706
707 /**
708  * efi_set_timer - set the trigger time for a timer event or stop the event
709  *
710  * This is the function for internal usage in U-Boot. For the API function
711  * implementing the SetTimer service see efi_set_timer_ext.
712  *
713  * @event:              event for which the timer is set
714  * @type:               type of the timer
715  * @trigger_time:       trigger period in multiples of 100ns
716  * Return Value:                status code
717  */
718 efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type,
719                            uint64_t trigger_time)
720 {
721         /* Check that the event is valid */
722         if (efi_is_event(event) != EFI_SUCCESS || !(event->type & EVT_TIMER))
723                 return EFI_INVALID_PARAMETER;
724
725         /*
726          * The parameter defines a multiple of 100ns.
727          * We use multiples of 1000ns. So divide by 10.
728          */
729         do_div(trigger_time, 10);
730
731         switch (type) {
732         case EFI_TIMER_STOP:
733                 event->trigger_next = -1ULL;
734                 break;
735         case EFI_TIMER_PERIODIC:
736         case EFI_TIMER_RELATIVE:
737                 event->trigger_next = timer_get_us() + trigger_time;
738                 break;
739         default:
740                 return EFI_INVALID_PARAMETER;
741         }
742         event->trigger_type = type;
743         event->trigger_time = trigger_time;
744         event->is_signaled = false;
745         return EFI_SUCCESS;
746 }
747
748 /**
749  * efi_set_timer_ext - Set the trigger time for a timer event or stop the event
750  *
751  * This function implements the SetTimer service.
752  * See the Unified Extensible Firmware Interface (UEFI) specification
753  * for details.
754  *
755  * @event:              event for which the timer is set
756  * @type:               type of the timer
757  * @trigger_time:       trigger period in multiples of 100ns
758  * Return Value:        status code
759  */
760 static efi_status_t EFIAPI efi_set_timer_ext(struct efi_event *event,
761                                              enum efi_timer_delay type,
762                                              uint64_t trigger_time)
763 {
764         EFI_ENTRY("%p, %d, %" PRIx64, event, type, trigger_time);
765         return EFI_EXIT(efi_set_timer(event, type, trigger_time));
766 }
767
768 /**
769  * efi_wait_for_event - wait for events to be signaled
770  *
771  * This function implements the WaitForEvent service.
772  * See the Unified Extensible Firmware Interface (UEFI) specification
773  * for details.
774  *
775  * @num_events:         number of events to be waited for
776  * @event:              events to be waited for
777  * @index:              index of the event that was signaled
778  * Return Value:        status code
779  */
780 static efi_status_t EFIAPI efi_wait_for_event(efi_uintn_t num_events,
781                                               struct efi_event **event,
782                                               efi_uintn_t *index)
783 {
784         int i;
785
786         EFI_ENTRY("%zd, %p, %p", num_events, event, index);
787
788         /* Check parameters */
789         if (!num_events || !event)
790                 return EFI_EXIT(EFI_INVALID_PARAMETER);
791         /* Check TPL */
792         if (efi_tpl != TPL_APPLICATION)
793                 return EFI_EXIT(EFI_UNSUPPORTED);
794         for (i = 0; i < num_events; ++i) {
795                 if (efi_is_event(event[i]) != EFI_SUCCESS)
796                         return EFI_EXIT(EFI_INVALID_PARAMETER);
797                 if (!event[i]->type || event[i]->type & EVT_NOTIFY_SIGNAL)
798                         return EFI_EXIT(EFI_INVALID_PARAMETER);
799                 if (!event[i]->is_signaled)
800                         efi_queue_event(event[i], true);
801         }
802
803         /* Wait for signal */
804         for (;;) {
805                 for (i = 0; i < num_events; ++i) {
806                         if (event[i]->is_signaled)
807                                 goto out;
808                 }
809                 /* Allow events to occur. */
810                 efi_timer_check();
811         }
812
813 out:
814         /*
815          * Reset the signal which is passed to the caller to allow periodic
816          * events to occur.
817          */
818         event[i]->is_signaled = false;
819         if (index)
820                 *index = i;
821
822         return EFI_EXIT(EFI_SUCCESS);
823 }
824
825 /**
826  * efi_signal_event_ext - signal an EFI event
827  *
828  * This function implements the SignalEvent service.
829  * See the Unified Extensible Firmware Interface (UEFI) specification
830  * for details.
831  *
832  * This functions sets the signaled state of the event and queues the
833  * notification function for execution.
834  *
835  * @event:              event to signal
836  * Return Value:        status code
837  */
838 static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event)
839 {
840         EFI_ENTRY("%p", event);
841         if (efi_is_event(event) != EFI_SUCCESS)
842                 return EFI_EXIT(EFI_INVALID_PARAMETER);
843         efi_signal_event(event, true);
844         return EFI_EXIT(EFI_SUCCESS);
845 }
846
847 /**
848  * efi_close_event - close an EFI event
849  *
850  * This function implements the CloseEvent service.
851  * See the Unified Extensible Firmware Interface (UEFI) specification
852  * for details.
853  *
854  * @event:              event to close
855  * Return Value:        status code
856  */
857 static efi_status_t EFIAPI efi_close_event(struct efi_event *event)
858 {
859         EFI_ENTRY("%p", event);
860         if (efi_is_event(event) != EFI_SUCCESS)
861                 return EFI_EXIT(EFI_INVALID_PARAMETER);
862         list_del(&event->link);
863         free(event);
864         return EFI_EXIT(EFI_SUCCESS);
865 }
866
867 /**
868  * efi_check_event - check if an event is signaled
869  *
870  * This function implements the CheckEvent service.
871  * See the Unified Extensible Firmware Interface (UEFI) specification
872  * for details.
873  *
874  * If an event is not signaled yet, the notification function is queued.
875  * The signaled state is cleared.
876  *
877  * @event:              event to check
878  * Return Value:        status code
879  */
880 static efi_status_t EFIAPI efi_check_event(struct efi_event *event)
881 {
882         EFI_ENTRY("%p", event);
883         efi_timer_check();
884         if (efi_is_event(event) != EFI_SUCCESS ||
885             event->type & EVT_NOTIFY_SIGNAL)
886                 return EFI_EXIT(EFI_INVALID_PARAMETER);
887         if (!event->is_signaled)
888                 efi_queue_event(event, true);
889         if (event->is_signaled) {
890                 event->is_signaled = false;
891                 return EFI_EXIT(EFI_SUCCESS);
892         }
893         return EFI_EXIT(EFI_NOT_READY);
894 }
895
896 /**
897  * efi_search_obj - find the internal EFI object for a handle
898  *
899  * @handle:             handle to find
900  * Return Value:        EFI object
901  */
902 struct efi_object *efi_search_obj(const efi_handle_t handle)
903 {
904         struct efi_object *efiobj;
905
906         list_for_each_entry(efiobj, &efi_obj_list, link) {
907                 if (efiobj->handle == handle)
908                         return efiobj;
909         }
910
911         return NULL;
912 }
913
914 /**
915  * efi_open_protocol_info_entry - create open protocol info entry and add it
916  *                                to a protocol
917  *
918  * @handler:            handler of a protocol
919  * Return Value:        open protocol info entry
920  */
921 static struct efi_open_protocol_info_entry *efi_create_open_info(
922                         struct efi_handler *handler)
923 {
924         struct efi_open_protocol_info_item *item;
925
926         item = calloc(1, sizeof(struct efi_open_protocol_info_item));
927         if (!item)
928                 return NULL;
929         /* Append the item to the open protocol info list. */
930         list_add_tail(&item->link, &handler->open_infos);
931
932         return &item->info;
933 }
934
935 /**
936  * efi_delete_open_info - remove an open protocol info entry from a protocol
937  *
938  * @item:               open protocol info entry to delete
939  * Return Value:        status code
940  */
941 static efi_status_t efi_delete_open_info(
942                         struct efi_open_protocol_info_item *item)
943 {
944         list_del(&item->link);
945         free(item);
946         return EFI_SUCCESS;
947 }
948
949 /**
950  * efi_add_protocol - install new protocol on a handle
951  *
952  * @handle:                     handle on which the protocol shall be installed
953  * @protocol:                   GUID of the protocol to be installed
954  * @protocol_interface:         interface of the protocol implementation
955  * Return Value:                status code
956  */
957 efi_status_t efi_add_protocol(const efi_handle_t handle,
958                               const efi_guid_t *protocol,
959                               void *protocol_interface)
960 {
961         struct efi_object *efiobj;
962         struct efi_handler *handler;
963         efi_status_t ret;
964
965         efiobj = efi_search_obj(handle);
966         if (!efiobj)
967                 return EFI_INVALID_PARAMETER;
968         ret = efi_search_protocol(handle, protocol, NULL);
969         if (ret != EFI_NOT_FOUND)
970                 return EFI_INVALID_PARAMETER;
971         handler = calloc(1, sizeof(struct efi_handler));
972         if (!handler)
973                 return EFI_OUT_OF_RESOURCES;
974         handler->guid = protocol;
975         handler->protocol_interface = protocol_interface;
976         INIT_LIST_HEAD(&handler->open_infos);
977         list_add_tail(&handler->link, &efiobj->protocols);
978         if (!guidcmp(&efi_guid_device_path, protocol))
979                 EFI_PRINT("installed device path '%pD'\n", protocol_interface);
980         return EFI_SUCCESS;
981 }
982
983 /**
984  * efi_install_protocol_interface - install protocol interface
985  *
986  * This function implements the InstallProtocolInterface service.
987  * See the Unified Extensible Firmware Interface (UEFI) specification
988  * for details.
989  *
990  * @handle:                     handle on which the protocol shall be installed
991  * @protocol:                   GUID of the protocol to be installed
992  * @protocol_interface_type:    type of the interface to be installed,
993  *                              always EFI_NATIVE_INTERFACE
994  * @protocol_interface:         interface of the protocol implementation
995  * Return Value:                status code
996  */
997 static efi_status_t EFIAPI efi_install_protocol_interface(
998                         void **handle, const efi_guid_t *protocol,
999                         int protocol_interface_type, void *protocol_interface)
1000 {
1001         efi_status_t r;
1002
1003         EFI_ENTRY("%p, %pUl, %d, %p", handle, protocol, protocol_interface_type,
1004                   protocol_interface);
1005
1006         if (!handle || !protocol ||
1007             protocol_interface_type != EFI_NATIVE_INTERFACE) {
1008                 r = EFI_INVALID_PARAMETER;
1009                 goto out;
1010         }
1011
1012         /* Create new handle if requested. */
1013         if (!*handle) {
1014                 r = efi_create_handle(handle);
1015                 if (r != EFI_SUCCESS)
1016                         goto out;
1017                 debug("%sEFI: new handle %p\n", indent_string(nesting_level),
1018                       *handle);
1019         } else {
1020                 debug("%sEFI: handle %p\n", indent_string(nesting_level),
1021                       *handle);
1022         }
1023         /* Add new protocol */
1024         r = efi_add_protocol(*handle, protocol, protocol_interface);
1025 out:
1026         return EFI_EXIT(r);
1027 }
1028
1029 /**
1030  * efi_get_drivers - get all drivers associated to a controller
1031  *
1032  * The allocated buffer has to be freed with free().
1033  *
1034  * @efiobj:                     handle of the controller
1035  * @protocol:                   protocol guid (optional)
1036  * @number_of_drivers:          number of child controllers
1037  * @driver_handle_buffer:       handles of the the drivers
1038  * Return Value:                status code
1039  */
1040 static efi_status_t efi_get_drivers(struct efi_object *efiobj,
1041                                     const efi_guid_t *protocol,
1042                                     efi_uintn_t *number_of_drivers,
1043                                     efi_handle_t **driver_handle_buffer)
1044 {
1045         struct efi_handler *handler;
1046         struct efi_open_protocol_info_item *item;
1047         efi_uintn_t count = 0, i;
1048         bool duplicate;
1049
1050         /* Count all driver associations */
1051         list_for_each_entry(handler, &efiobj->protocols, link) {
1052                 if (protocol && guidcmp(handler->guid, protocol))
1053                         continue;
1054                 list_for_each_entry(item, &handler->open_infos, link) {
1055                         if (item->info.attributes &
1056                             EFI_OPEN_PROTOCOL_BY_DRIVER)
1057                                 ++count;
1058                 }
1059         }
1060         /*
1061          * Create buffer. In case of duplicate driver assignments the buffer
1062          * will be too large. But that does not harm.
1063          */
1064         *number_of_drivers = 0;
1065         *driver_handle_buffer = calloc(count, sizeof(efi_handle_t));
1066         if (!*driver_handle_buffer)
1067                 return EFI_OUT_OF_RESOURCES;
1068         /* Collect unique driver handles */
1069         list_for_each_entry(handler, &efiobj->protocols, link) {
1070                 if (protocol && guidcmp(handler->guid, protocol))
1071                         continue;
1072                 list_for_each_entry(item, &handler->open_infos, link) {
1073                         if (item->info.attributes &
1074                             EFI_OPEN_PROTOCOL_BY_DRIVER) {
1075                                 /* Check this is a new driver */
1076                                 duplicate = false;
1077                                 for (i = 0; i < *number_of_drivers; ++i) {
1078                                         if ((*driver_handle_buffer)[i] ==
1079                                             item->info.agent_handle)
1080                                                 duplicate = true;
1081                                 }
1082                                 /* Copy handle to buffer */
1083                                 if (!duplicate) {
1084                                         i = (*number_of_drivers)++;
1085                                         (*driver_handle_buffer)[i] =
1086                                                 item->info.agent_handle;
1087                                 }
1088                         }
1089                 }
1090         }
1091         return EFI_SUCCESS;
1092 }
1093
1094 /**
1095  * efi_disconnect_all_drivers - disconnect all drivers from a controller
1096  *
1097  * This function implements the DisconnectController service.
1098  * See the Unified Extensible Firmware Interface (UEFI) specification
1099  * for details.
1100  *
1101  * @efiobj:             handle of the controller
1102  * @protocol:           protocol guid (optional)
1103  * @child_handle:       handle of the child to destroy
1104  * Return Value:        status code
1105  */
1106 static efi_status_t efi_disconnect_all_drivers(
1107                                 struct efi_object *efiobj,
1108                                 const efi_guid_t *protocol,
1109                                 efi_handle_t child_handle)
1110 {
1111         efi_uintn_t number_of_drivers;
1112         efi_handle_t *driver_handle_buffer;
1113         efi_status_t r, ret;
1114
1115         ret = efi_get_drivers(efiobj, protocol, &number_of_drivers,
1116                               &driver_handle_buffer);
1117         if (ret != EFI_SUCCESS)
1118                 return ret;
1119
1120         ret = EFI_NOT_FOUND;
1121         while (number_of_drivers) {
1122                 r = EFI_CALL(efi_disconnect_controller(
1123                                 efiobj->handle,
1124                                 driver_handle_buffer[--number_of_drivers],
1125                                 child_handle));
1126                 if (r == EFI_SUCCESS)
1127                         ret = r;
1128         }
1129         free(driver_handle_buffer);
1130         return ret;
1131 }
1132
1133 /**
1134  * efi_uninstall_protocol_interface - uninstall protocol interface
1135  *
1136  * This function implements the UninstallProtocolInterface service.
1137  * See the Unified Extensible Firmware Interface (UEFI) specification
1138  * for details.
1139  *
1140  * @handle:                     handle from which the protocol shall be removed
1141  * @protocol:                   GUID of the protocol to be removed
1142  * @protocol_interface:         interface to be removed
1143  * Return Value:                status code
1144  */
1145 static efi_status_t EFIAPI efi_uninstall_protocol_interface(
1146                                 efi_handle_t handle, const efi_guid_t *protocol,
1147                                 void *protocol_interface)
1148 {
1149         struct efi_object *efiobj;
1150         struct efi_handler *handler;
1151         struct efi_open_protocol_info_item *item;
1152         struct efi_open_protocol_info_item *pos;
1153         efi_status_t r;
1154
1155         EFI_ENTRY("%p, %pUl, %p", handle, protocol, protocol_interface);
1156
1157         /* Check handle */
1158         efiobj = efi_search_obj(handle);
1159         if (!efiobj) {
1160                 r = EFI_INVALID_PARAMETER;
1161                 goto out;
1162         }
1163         /* Find the protocol on the handle */
1164         r = efi_search_protocol(handle, protocol, &handler);
1165         if (r != EFI_SUCCESS)
1166                 goto out;
1167         /* Disconnect controllers */
1168         efi_disconnect_all_drivers(efiobj, protocol, NULL);
1169         if (!list_empty(&handler->open_infos)) {
1170                 r =  EFI_ACCESS_DENIED;
1171                 goto out;
1172         }
1173         /* Close protocol */
1174         list_for_each_entry_safe(item, pos, &handler->open_infos, link) {
1175                 if (item->info.attributes ==
1176                         EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL ||
1177                     item->info.attributes == EFI_OPEN_PROTOCOL_GET_PROTOCOL ||
1178                     item->info.attributes == EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
1179                         list_del(&item->link);
1180         }
1181         if (!list_empty(&handler->open_infos)) {
1182                 r =  EFI_ACCESS_DENIED;
1183                 goto out;
1184         }
1185         r = efi_remove_protocol(handle, protocol, protocol_interface);
1186 out:
1187         return EFI_EXIT(r);
1188 }
1189
1190 /**
1191  * efi_register_protocol_notify - register an event for notification when a
1192  *                                protocol is installed.
1193  *
1194  * This function implements the RegisterProtocolNotify service.
1195  * See the Unified Extensible Firmware Interface (UEFI) specification
1196  * for details.
1197  *
1198  * @protocol:           GUID of the protocol whose installation shall be
1199  *                      notified
1200  * @event:              event to be signaled upon installation of the protocol
1201  * @registration:       key for retrieving the registration information
1202  * Return Value:        status code
1203  */
1204 static efi_status_t EFIAPI efi_register_protocol_notify(
1205                                                 const efi_guid_t *protocol,
1206                                                 struct efi_event *event,
1207                                                 void **registration)
1208 {
1209         EFI_ENTRY("%pUl, %p, %p", protocol, event, registration);
1210         return EFI_EXIT(EFI_OUT_OF_RESOURCES);
1211 }
1212
1213 /**
1214  * efi_search - determine if an EFI handle implements a protocol
1215  *
1216  * See the documentation of the LocateHandle service in the UEFI specification.
1217  *
1218  * @search_type:        selection criterion
1219  * @protocol:           GUID of the protocol
1220  * @search_key:         registration key
1221  * @efiobj:             handle
1222  * Return Value:        0 if the handle implements the protocol
1223  */
1224 static int efi_search(enum efi_locate_search_type search_type,
1225                       const efi_guid_t *protocol, void *search_key,
1226                       struct efi_object *efiobj)
1227 {
1228         efi_status_t ret;
1229
1230         switch (search_type) {
1231         case ALL_HANDLES:
1232                 return 0;
1233         case BY_REGISTER_NOTIFY:
1234                 /* TODO: RegisterProtocolNotify is not implemented yet */
1235                 return -1;
1236         case BY_PROTOCOL:
1237                 ret = efi_search_protocol(efiobj->handle, protocol, NULL);
1238                 return (ret != EFI_SUCCESS);
1239         default:
1240                 /* Invalid search type */
1241                 return -1;
1242         }
1243 }
1244
1245 /**
1246  * efi_locate_handle - locate handles implementing a protocol
1247  *
1248  * This function is meant for U-Boot internal calls. For the API implementation
1249  * of the LocateHandle service see efi_locate_handle_ext.
1250  *
1251  * @search_type:        selection criterion
1252  * @protocol:           GUID of the protocol
1253  * @search_key:         registration key
1254  * @buffer_size:        size of the buffer to receive the handles in bytes
1255  * @buffer:             buffer to receive the relevant handles
1256  * Return Value:        status code
1257  */
1258 static efi_status_t efi_locate_handle(
1259                         enum efi_locate_search_type search_type,
1260                         const efi_guid_t *protocol, void *search_key,
1261                         efi_uintn_t *buffer_size, efi_handle_t *buffer)
1262 {
1263         struct efi_object *efiobj;
1264         efi_uintn_t size = 0;
1265
1266         /* Check parameters */
1267         switch (search_type) {
1268         case ALL_HANDLES:
1269                 break;
1270         case BY_REGISTER_NOTIFY:
1271                 if (!search_key)
1272                         return EFI_INVALID_PARAMETER;
1273                 /* RegisterProtocolNotify is not implemented yet */
1274                 return EFI_UNSUPPORTED;
1275         case BY_PROTOCOL:
1276                 if (!protocol)
1277                         return EFI_INVALID_PARAMETER;
1278                 break;
1279         default:
1280                 return EFI_INVALID_PARAMETER;
1281         }
1282
1283         /*
1284          * efi_locate_handle_buffer uses this function for
1285          * the calculation of the necessary buffer size.
1286          * So do not require a buffer for buffersize == 0.
1287          */
1288         if (!buffer_size || (*buffer_size && !buffer))
1289                 return EFI_INVALID_PARAMETER;
1290
1291         /* Count how much space we need */
1292         list_for_each_entry(efiobj, &efi_obj_list, link) {
1293                 if (!efi_search(search_type, protocol, search_key, efiobj))
1294                         size += sizeof(void *);
1295         }
1296
1297         if (*buffer_size < size) {
1298                 *buffer_size = size;
1299                 return EFI_BUFFER_TOO_SMALL;
1300         }
1301
1302         *buffer_size = size;
1303         if (size == 0)
1304                 return EFI_NOT_FOUND;
1305
1306         /* Then fill the array */
1307         list_for_each_entry(efiobj, &efi_obj_list, link) {
1308                 if (!efi_search(search_type, protocol, search_key, efiobj))
1309                         *buffer++ = efiobj->handle;
1310         }
1311
1312         return EFI_SUCCESS;
1313 }
1314
1315 /**
1316  * efi_locate_handle_ext - locate handles implementing a protocol.
1317  *
1318  * This function implements the LocateHandle service.
1319  * See the Unified Extensible Firmware Interface (UEFI) specification
1320  * for details.
1321  *
1322  * @search_type:        selection criterion
1323  * @protocol:           GUID of the protocol
1324  * @search_key:         registration key
1325  * @buffer_size:        size of the buffer to receive the handles in bytes
1326  * @buffer:             buffer to receive the relevant handles
1327  * Return Value:        0 if the handle implements the protocol
1328  */
1329 static efi_status_t EFIAPI efi_locate_handle_ext(
1330                         enum efi_locate_search_type search_type,
1331                         const efi_guid_t *protocol, void *search_key,
1332                         efi_uintn_t *buffer_size, efi_handle_t *buffer)
1333 {
1334         EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key,
1335                   buffer_size, buffer);
1336
1337         return EFI_EXIT(efi_locate_handle(search_type, protocol, search_key,
1338                         buffer_size, buffer));
1339 }
1340
1341 /**
1342  * efi_remove_configuration_table - collapses configuration table entries,
1343  *                                  removing index i
1344  *
1345  * @i:  index of the table entry to be removed
1346  */
1347 static void efi_remove_configuration_table(int i)
1348 {
1349         struct efi_configuration_table *this = &efi_conf_table[i];
1350         struct efi_configuration_table *next = &efi_conf_table[i + 1];
1351         struct efi_configuration_table *end = &efi_conf_table[systab.nr_tables];
1352
1353         memmove(this, next, (ulong)end - (ulong)next);
1354         systab.nr_tables--;
1355 }
1356
1357 /**
1358  * efi_install_configuration_table - adds, updates, or removes a configuration
1359  *                                   table
1360  *
1361  * This function is used for internal calls. For the API implementation of the
1362  * InstallConfigurationTable service see efi_install_configuration_table_ext.
1363  *
1364  * @guid:               GUID of the installed table
1365  * @table:              table to be installed
1366  * Return Value:        status code
1367  */
1368 efi_status_t efi_install_configuration_table(const efi_guid_t *guid,
1369                                              void *table)
1370 {
1371         struct efi_event *evt;
1372         int i;
1373
1374         if (!guid)
1375                 return EFI_INVALID_PARAMETER;
1376
1377         /* Check for guid override */
1378         for (i = 0; i < systab.nr_tables; i++) {
1379                 if (!guidcmp(guid, &efi_conf_table[i].guid)) {
1380                         if (table)
1381                                 efi_conf_table[i].table = table;
1382                         else
1383                                 efi_remove_configuration_table(i);
1384                         goto out;
1385                 }
1386         }
1387
1388         if (!table)
1389                 return EFI_NOT_FOUND;
1390
1391         /* No override, check for overflow */
1392         if (i >= ARRAY_SIZE(efi_conf_table))
1393                 return EFI_OUT_OF_RESOURCES;
1394
1395         /* Add a new entry */
1396         memcpy(&efi_conf_table[i].guid, guid, sizeof(*guid));
1397         efi_conf_table[i].table = table;
1398         systab.nr_tables = i + 1;
1399
1400 out:
1401         /* Notify that the configuration table was changed */
1402         list_for_each_entry(evt, &efi_events, link) {
1403                 if (evt->group && !guidcmp(evt->group, guid)) {
1404                         efi_signal_event(evt, false);
1405                         break;
1406                 }
1407         }
1408
1409         return EFI_SUCCESS;
1410 }
1411
1412 /**
1413  * efi_install_configuration_table_ex - Adds, updates, or removes a
1414  *                                      configuration table.
1415  *
1416  * This function implements the InstallConfigurationTable service.
1417  * See the Unified Extensible Firmware Interface (UEFI) specification
1418  * for details.
1419  *
1420  * @guid:               GUID of the installed table
1421  * @table:              table to be installed
1422  * Return Value:        status code
1423  */
1424 static efi_status_t EFIAPI efi_install_configuration_table_ext(efi_guid_t *guid,
1425                                                                void *table)
1426 {
1427         EFI_ENTRY("%pUl, %p", guid, table);
1428         return EFI_EXIT(efi_install_configuration_table(guid, table));
1429 }
1430
1431 /**
1432  * efi_setup_loaded_image - initialize a loaded image
1433  *
1434  * Initialize a loaded_image_info and loaded_image_info object with correct
1435  * protocols, boot-device, etc.
1436  *
1437  * @info:               loaded image info to be passed to the entry point of the
1438  *                      image
1439  * @obj:                internal object associated with the loaded image
1440  * @device_path:        device path of the loaded image
1441  * @file_path:          file path of the loaded image
1442  * Return Value:        status code
1443  */
1444 efi_status_t efi_setup_loaded_image(
1445                         struct efi_loaded_image *info, struct efi_object *obj,
1446                         struct efi_device_path *device_path,
1447                         struct efi_device_path *file_path)
1448 {
1449         efi_status_t ret;
1450
1451         /* Add internal object to object list */
1452         efi_add_handle(obj);
1453         /* efi_exit() assumes that the handle points to the info */
1454         obj->handle = info;
1455
1456         info->file_path = file_path;
1457
1458         if (device_path) {
1459                 info->device_handle = efi_dp_find_obj(device_path, NULL);
1460                 /*
1461                  * When asking for the device path interface, return
1462                  * bootefi_device_path
1463                  */
1464                 ret = efi_add_protocol(obj->handle, &efi_guid_device_path,
1465                                        device_path);
1466                 if (ret != EFI_SUCCESS)
1467                         goto failure;
1468         }
1469
1470         /*
1471          * When asking for the loaded_image interface, just
1472          * return handle which points to loaded_image_info
1473          */
1474         ret = efi_add_protocol(obj->handle, &efi_guid_loaded_image, info);
1475         if (ret != EFI_SUCCESS)
1476                 goto failure;
1477
1478         ret = efi_add_protocol(obj->handle,
1479                                &efi_guid_device_path_to_text_protocol,
1480                                (void *)&efi_device_path_to_text);
1481         if (ret != EFI_SUCCESS)
1482                 goto failure;
1483
1484         ret = efi_add_protocol(obj->handle,
1485                                &efi_guid_device_path_utilities_protocol,
1486                                (void *)&efi_device_path_utilities);
1487         if (ret != EFI_SUCCESS)
1488                 goto failure;
1489
1490         return ret;
1491 failure:
1492         printf("ERROR: Failure to install protocols for loaded image\n");
1493         return ret;
1494 }
1495
1496 /**
1497  * efi_load_image_from_path - load an image using a file path
1498  *
1499  * @file_path:          the path of the image to load
1500  * @buffer:             buffer containing the loaded image
1501  * Return Value:        status code
1502  */
1503 efi_status_t efi_load_image_from_path(struct efi_device_path *file_path,
1504                                       void **buffer)
1505 {
1506         struct efi_file_info *info = NULL;
1507         struct efi_file_handle *f;
1508         static efi_status_t ret;
1509         efi_uintn_t bs;
1510
1511         f = efi_file_from_path(file_path);
1512         if (!f)
1513                 return EFI_DEVICE_ERROR;
1514
1515         bs = 0;
1516         EFI_CALL(ret = f->getinfo(f, (efi_guid_t *)&efi_file_info_guid,
1517                                   &bs, info));
1518         if (ret == EFI_BUFFER_TOO_SMALL) {
1519                 info = malloc(bs);
1520                 EFI_CALL(ret = f->getinfo(f, (efi_guid_t *)&efi_file_info_guid,
1521                                           &bs, info));
1522         }
1523         if (ret != EFI_SUCCESS)
1524                 goto error;
1525
1526         ret = efi_allocate_pool(EFI_LOADER_DATA, info->file_size, buffer);
1527         if (ret)
1528                 goto error;
1529
1530         bs = info->file_size;
1531         EFI_CALL(ret = f->read(f, &bs, *buffer));
1532
1533 error:
1534         free(info);
1535         EFI_CALL(f->close(f));
1536
1537         if (ret != EFI_SUCCESS) {
1538                 efi_free_pool(*buffer);
1539                 *buffer = NULL;
1540         }
1541
1542         return ret;
1543 }
1544
1545 /**
1546  * efi_load_image - load an EFI image into memory
1547  *
1548  * This function implements the LoadImage service.
1549  * See the Unified Extensible Firmware Interface (UEFI) specification
1550  * for details.
1551  *
1552  * @boot_policy:        true for request originating from the boot manager
1553  * @parent_image:       the caller's image handle
1554  * @file_path:          the path of the image to load
1555  * @source_buffer:      memory location from which the image is installed
1556  * @source_size:        size of the memory area from which the image is
1557  *                      installed
1558  * @image_handle:       handle for the newly installed image
1559  * Return Value:        status code
1560  */
1561 static efi_status_t EFIAPI efi_load_image(bool boot_policy,
1562                                           efi_handle_t parent_image,
1563                                           struct efi_device_path *file_path,
1564                                           void *source_buffer,
1565                                           efi_uintn_t source_size,
1566                                           efi_handle_t *image_handle)
1567 {
1568         struct efi_loaded_image *info;
1569         struct efi_object *obj;
1570         efi_status_t ret;
1571
1572         EFI_ENTRY("%d, %p, %pD, %p, %zd, %p", boot_policy, parent_image,
1573                   file_path, source_buffer, source_size, image_handle);
1574
1575         if (!image_handle || !parent_image) {
1576                 ret = EFI_INVALID_PARAMETER;
1577                 goto error;
1578         }
1579
1580         if (!source_buffer && !file_path) {
1581                 ret = EFI_NOT_FOUND;
1582                 goto error;
1583         }
1584
1585         info = calloc(1, sizeof(*info));
1586         if (!info) {
1587                 ret = EFI_OUT_OF_RESOURCES;
1588                 goto error;
1589         }
1590         obj = calloc(1, sizeof(*obj));
1591         if (!obj) {
1592                 free(info);
1593                 ret = EFI_OUT_OF_RESOURCES;
1594                 goto error;
1595         }
1596
1597         if (!source_buffer) {
1598                 struct efi_device_path *dp, *fp;
1599
1600                 ret = efi_load_image_from_path(file_path, &source_buffer);
1601                 if (ret != EFI_SUCCESS)
1602                         goto failure;
1603                 /*
1604                  * split file_path which contains both the device and
1605                  * file parts:
1606                  */
1607                 efi_dp_split_file_path(file_path, &dp, &fp);
1608                 ret = efi_setup_loaded_image(info, obj, dp, fp);
1609                 if (ret != EFI_SUCCESS)
1610                         goto failure;
1611         } else {
1612                 /* In this case, file_path is the "device" path, ie.
1613                  * something like a HARDWARE_DEVICE:MEMORY_MAPPED
1614                  */
1615                 ret = efi_setup_loaded_image(info, obj, file_path, NULL);
1616                 if (ret != EFI_SUCCESS)
1617                         goto failure;
1618         }
1619         info->reserved = efi_load_pe(source_buffer, info);
1620         if (!info->reserved) {
1621                 ret = EFI_UNSUPPORTED;
1622                 goto failure;
1623         }
1624         info->system_table = &systab;
1625         info->parent_handle = parent_image;
1626         *image_handle = obj->handle;
1627         return EFI_EXIT(EFI_SUCCESS);
1628 failure:
1629         free(info);
1630         efi_delete_handle(obj);
1631 error:
1632         return EFI_EXIT(ret);
1633 }
1634
1635 /**
1636  * efi_start_image - dall the entry point of an image
1637  *
1638  * This function implements the StartImage service.
1639  * See the Unified Extensible Firmware Interface (UEFI) specification
1640  * for details.
1641  *
1642  * @image_handle:       handle of the image
1643  * @exit_data_size:     size of the buffer
1644  * @exit_data:          buffer to receive the exit data of the called image
1645  * Return Value:        status code
1646  */
1647 static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
1648                                            unsigned long *exit_data_size,
1649                                            s16 **exit_data)
1650 {
1651         EFIAPI efi_status_t (*entry)(efi_handle_t image_handle,
1652                                      struct efi_system_table *st);
1653         struct efi_loaded_image *info = image_handle;
1654         efi_status_t ret;
1655
1656         EFI_ENTRY("%p, %p, %p", image_handle, exit_data_size, exit_data);
1657         entry = info->reserved;
1658
1659         efi_is_direct_boot = false;
1660
1661         /* call the image! */
1662         if (setjmp(&info->exit_jmp)) {
1663                 /*
1664                  * We called the entry point of the child image with EFI_CALL
1665                  * in the lines below. The child image called the Exit() boot
1666                  * service efi_exit() which executed the long jump that brought
1667                  * us to the current line. This implies that the second half
1668                  * of the EFI_CALL macro has not been executed.
1669                  */
1670 #ifdef CONFIG_ARM
1671                 /*
1672                  * efi_exit() called efi_restore_gd(). We have to undo this
1673                  * otherwise __efi_entry_check() will put the wrong value into
1674                  * app_gd.
1675                  */
1676                 gd = app_gd;
1677 #endif
1678                 /*
1679                  * To get ready to call EFI_EXIT below we have to execute the
1680                  * missed out steps of EFI_CALL.
1681                  */
1682                 assert(__efi_entry_check());
1683                 debug("%sEFI: %lu returned by started image\n",
1684                       __efi_nesting_dec(),
1685                       (unsigned long)((uintptr_t)info->exit_status &
1686                                       ~EFI_ERROR_MASK));
1687                 return EFI_EXIT(info->exit_status);
1688         }
1689
1690         ret = EFI_CALL(entry(image_handle, &systab));
1691
1692         /*
1693          * Usually UEFI applications call Exit() instead of returning.
1694          * But because the world doesn not consist of ponies and unicorns,
1695          * we're happy to emulate that behavior on behalf of a payload
1696          * that forgot.
1697          */
1698         return EFI_CALL(systab.boottime->exit(image_handle, ret, 0, NULL));
1699 }
1700
1701 /**
1702  * efi_exit - leave an EFI application or driver
1703  *
1704  * This function implements the Exit service.
1705  * See the Unified Extensible Firmware Interface (UEFI) specification
1706  * for details.
1707  *
1708  * @image_handle:       handle of the application or driver that is exiting
1709  * @exit_status:        status code
1710  * @exit_data_size:     size of the buffer in bytes
1711  * @exit_data:          buffer with data describing an error
1712  * Return Value:        status code
1713  */
1714 static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle,
1715                                     efi_status_t exit_status,
1716                                     unsigned long exit_data_size,
1717                                     int16_t *exit_data)
1718 {
1719         /*
1720          * We require that the handle points to the original loaded
1721          * image protocol interface.
1722          *
1723          * For getting the longjmp address this is safer than locating
1724          * the protocol because the protocol may have been reinstalled
1725          * pointing to another memory location.
1726          *
1727          * TODO: We should call the unload procedure of the loaded
1728          *       image protocol.
1729          */
1730         struct efi_loaded_image *loaded_image_info = (void *)image_handle;
1731
1732         EFI_ENTRY("%p, %ld, %ld, %p", image_handle, exit_status,
1733                   exit_data_size, exit_data);
1734
1735         /* Make sure entry/exit counts for EFI world cross-overs match */
1736         EFI_EXIT(exit_status);
1737
1738         /*
1739          * But longjmp out with the U-Boot gd, not the application's, as
1740          * the other end is a setjmp call inside EFI context.
1741          */
1742         efi_restore_gd();
1743
1744         loaded_image_info->exit_status = exit_status;
1745         longjmp(&loaded_image_info->exit_jmp, 1);
1746
1747         panic("EFI application exited");
1748 }
1749
1750 /**
1751  * efi_unload_image - unload an EFI image
1752  *
1753  * This function implements the UnloadImage service.
1754  * See the Unified Extensible Firmware Interface (UEFI) specification
1755  * for details.
1756  *
1757  * @image_handle:       handle of the image to be unloaded
1758  * Return Value:        status code
1759  */
1760 static efi_status_t EFIAPI efi_unload_image(efi_handle_t image_handle)
1761 {
1762         struct efi_object *efiobj;
1763
1764         EFI_ENTRY("%p", image_handle);
1765         efiobj = efi_search_obj(image_handle);
1766         if (efiobj)
1767                 list_del(&efiobj->link);
1768
1769         return EFI_EXIT(EFI_SUCCESS);
1770 }
1771
1772 /**
1773  * efi_exit_caches - fix up caches for EFI payloads if necessary
1774  */
1775 static void efi_exit_caches(void)
1776 {
1777 #if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
1778         /*
1779          * Grub on 32bit ARM needs to have caches disabled before jumping into
1780          * a zImage, but does not know of all cache layers. Give it a hand.
1781          */
1782         if (efi_is_direct_boot)
1783                 cleanup_before_linux();
1784 #endif
1785 }
1786
1787 /**
1788  * efi_exit_boot_services - stop all boot services
1789  *
1790  * This function implements the ExitBootServices service.
1791  * See the Unified Extensible Firmware Interface (UEFI) specification
1792  * for details.
1793  *
1794  * All timer events are disabled.
1795  * For exit boot services events the notification function is called.
1796  * The boot services are disabled in the system table.
1797  *
1798  * @image_handle:       handle of the loaded image
1799  * @map_key:            key of the memory map
1800  * Return Value:        status code
1801  */
1802 static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
1803                                                   unsigned long map_key)
1804 {
1805         struct efi_event *evt;
1806
1807         EFI_ENTRY("%p, %ld", image_handle, map_key);
1808
1809         /* Make sure that notification functions are not called anymore */
1810         efi_tpl = TPL_HIGH_LEVEL;
1811
1812         /* Check if ExitBootServices has already been called */
1813         if (!systab.boottime)
1814                 return EFI_EXIT(EFI_SUCCESS);
1815
1816         /* Add related events to the event group */
1817         list_for_each_entry(evt, &efi_events, link) {
1818                 if (evt->type == EVT_SIGNAL_EXIT_BOOT_SERVICES)
1819                         evt->group = &efi_guid_event_group_exit_boot_services;
1820         }
1821         /* Notify that ExitBootServices is invoked. */
1822         list_for_each_entry(evt, &efi_events, link) {
1823                 if (evt->group &&
1824                     !guidcmp(evt->group,
1825                              &efi_guid_event_group_exit_boot_services)) {
1826                         efi_signal_event(evt, false);
1827                         break;
1828                 }
1829         }
1830
1831         /* TODO Should persist EFI variables here */
1832
1833         board_quiesce_devices();
1834
1835         /* Fix up caches for EFI payloads if necessary */
1836         efi_exit_caches();
1837
1838         /* This stops all lingering devices */
1839         bootm_disable_interrupts();
1840
1841         /* Disable boottime services */
1842         systab.con_in_handle = NULL;
1843         systab.con_in = NULL;
1844         systab.con_out_handle = NULL;
1845         systab.con_out = NULL;
1846         systab.stderr_handle = NULL;
1847         systab.std_err = NULL;
1848         systab.boottime = NULL;
1849
1850         /* Recalculate CRC32 */
1851         systab.hdr.crc32 = 0;
1852         systab.hdr.crc32 = crc32(0, (const unsigned char *)&systab,
1853                                  sizeof(struct efi_system_table));
1854
1855         /* Give the payload some time to boot */
1856         efi_set_watchdog(0);
1857         WATCHDOG_RESET();
1858
1859         return EFI_EXIT(EFI_SUCCESS);
1860 }
1861
1862 /**
1863  * efi_get_next_monotonic_count - get next value of the counter
1864  *
1865  * This function implements the NextMonotonicCount service.
1866  * See the Unified Extensible Firmware Interface (UEFI) specification
1867  * for details.
1868  *
1869  * @count:              returned value of the counter
1870  * Return Value:        status code
1871  */
1872 static efi_status_t EFIAPI efi_get_next_monotonic_count(uint64_t *count)
1873 {
1874         static uint64_t mono;
1875
1876         EFI_ENTRY("%p", count);
1877         *count = mono++;
1878         return EFI_EXIT(EFI_SUCCESS);
1879 }
1880
1881 /**
1882  * efi_stall - sleep
1883  *
1884  * This function implements the Stall sercive.
1885  * See the Unified Extensible Firmware Interface (UEFI) specification
1886  * for details.
1887  *
1888  * @microseconds:       period to sleep in microseconds
1889  * Return Value:        status code
1890  */
1891 static efi_status_t EFIAPI efi_stall(unsigned long microseconds)
1892 {
1893         EFI_ENTRY("%ld", microseconds);
1894         udelay(microseconds);
1895         return EFI_EXIT(EFI_SUCCESS);
1896 }
1897
1898 /**
1899  * efi_set_watchdog_timer - reset the watchdog timer
1900  *
1901  * This function implements the SetWatchdogTimer service.
1902  * See the Unified Extensible Firmware Interface (UEFI) specification
1903  * for details.
1904  *
1905  * @timeout:            seconds before reset by watchdog
1906  * @watchdog_code:      code to be logged when resetting
1907  * @data_size:          size of buffer in bytes
1908  * @watchdog_data:      buffer with data describing the reset reason
1909  * Return Value:        status code
1910  */
1911 static efi_status_t EFIAPI efi_set_watchdog_timer(unsigned long timeout,
1912                                                   uint64_t watchdog_code,
1913                                                   unsigned long data_size,
1914                                                   uint16_t *watchdog_data)
1915 {
1916         EFI_ENTRY("%ld, 0x%" PRIx64 ", %ld, %p", timeout, watchdog_code,
1917                   data_size, watchdog_data);
1918         return EFI_EXIT(efi_set_watchdog(timeout));
1919 }
1920
1921 /**
1922  * efi_close_protocol - close a protocol
1923  *
1924  * This function implements the CloseProtocol service.
1925  * See the Unified Extensible Firmware Interface (UEFI) specification
1926  * for details.
1927  *
1928  * @handle:             handle on which the protocol shall be closed
1929  * @protocol:           GUID of the protocol to close
1930  * @agent_handle:       handle of the driver
1931  * @controller_handle:  handle of the controller
1932  * Return Value:        status code
1933  */
1934 static efi_status_t EFIAPI efi_close_protocol(efi_handle_t handle,
1935                                               const efi_guid_t *protocol,
1936                                               efi_handle_t agent_handle,
1937                                               efi_handle_t controller_handle)
1938 {
1939         struct efi_handler *handler;
1940         struct efi_open_protocol_info_item *item;
1941         struct efi_open_protocol_info_item *pos;
1942         efi_status_t r;
1943
1944         EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, agent_handle,
1945                   controller_handle);
1946
1947         if (!agent_handle) {
1948                 r = EFI_INVALID_PARAMETER;
1949                 goto out;
1950         }
1951         r = efi_search_protocol(handle, protocol, &handler);
1952         if (r != EFI_SUCCESS)
1953                 goto out;
1954
1955         r = EFI_NOT_FOUND;
1956         list_for_each_entry_safe(item, pos, &handler->open_infos, link) {
1957                 if (item->info.agent_handle == agent_handle &&
1958                     item->info.controller_handle == controller_handle) {
1959                         efi_delete_open_info(item);
1960                         r = EFI_SUCCESS;
1961                         break;
1962                 }
1963         }
1964 out:
1965         return EFI_EXIT(r);
1966 }
1967
1968 /**
1969  * efi_open_protocol_information - provide information about then open status
1970  *                                 of a protocol on a handle
1971  *
1972  * This function implements the OpenProtocolInformation service.
1973  * See the Unified Extensible Firmware Interface (UEFI) specification
1974  * for details.
1975  *
1976  * @handle:             handle for which the information shall be retrieved
1977  * @protocol:           GUID of the protocol
1978  * @entry_buffer:       buffer to receive the open protocol information
1979  * @entry_count:        number of entries available in the buffer
1980  * Return Value:        status code
1981  */
1982 static efi_status_t EFIAPI efi_open_protocol_information(
1983                         efi_handle_t handle, const efi_guid_t *protocol,
1984                         struct efi_open_protocol_info_entry **entry_buffer,
1985                         efi_uintn_t *entry_count)
1986 {
1987         unsigned long buffer_size;
1988         unsigned long count;
1989         struct efi_handler *handler;
1990         struct efi_open_protocol_info_item *item;
1991         efi_status_t r;
1992
1993         EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, entry_buffer,
1994                   entry_count);
1995
1996         /* Check parameters */
1997         if (!entry_buffer) {
1998                 r = EFI_INVALID_PARAMETER;
1999                 goto out;
2000         }
2001         r = efi_search_protocol(handle, protocol, &handler);
2002         if (r != EFI_SUCCESS)
2003                 goto out;
2004
2005         /* Count entries */
2006         count = 0;
2007         list_for_each_entry(item, &handler->open_infos, link) {
2008                 if (item->info.open_count)
2009                         ++count;
2010         }
2011         *entry_count = count;
2012         *entry_buffer = NULL;
2013         if (!count) {
2014                 r = EFI_SUCCESS;
2015                 goto out;
2016         }
2017
2018         /* Copy entries */
2019         buffer_size = count * sizeof(struct efi_open_protocol_info_entry);
2020         r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
2021                               (void **)entry_buffer);
2022         if (r != EFI_SUCCESS)
2023                 goto out;
2024         list_for_each_entry_reverse(item, &handler->open_infos, link) {
2025                 if (item->info.open_count)
2026                         (*entry_buffer)[--count] = item->info;
2027         }
2028 out:
2029         return EFI_EXIT(r);
2030 }
2031
2032 /**
2033  * efi_protocols_per_handle - get protocols installed on a handle
2034  *
2035  * This function implements the ProtocolsPerHandleService.
2036  * See the Unified Extensible Firmware Interface (UEFI) specification
2037  * for details.
2038  *
2039  * @handle:                     handle for which the information is retrieved
2040  * @protocol_buffer:            buffer with protocol GUIDs
2041  * @protocol_buffer_count:      number of entries in the buffer
2042  * Return Value:                status code
2043  */
2044 static efi_status_t EFIAPI efi_protocols_per_handle(
2045                         efi_handle_t handle, efi_guid_t ***protocol_buffer,
2046                         efi_uintn_t *protocol_buffer_count)
2047 {
2048         unsigned long buffer_size;
2049         struct efi_object *efiobj;
2050         struct list_head *protocol_handle;
2051         efi_status_t r;
2052
2053         EFI_ENTRY("%p, %p, %p", handle, protocol_buffer,
2054                   protocol_buffer_count);
2055
2056         if (!handle || !protocol_buffer || !protocol_buffer_count)
2057                 return EFI_EXIT(EFI_INVALID_PARAMETER);
2058
2059         *protocol_buffer = NULL;
2060         *protocol_buffer_count = 0;
2061
2062         efiobj = efi_search_obj(handle);
2063         if (!efiobj)
2064                 return EFI_EXIT(EFI_INVALID_PARAMETER);
2065
2066         /* Count protocols */
2067         list_for_each(protocol_handle, &efiobj->protocols) {
2068                 ++*protocol_buffer_count;
2069         }
2070
2071         /* Copy guids */
2072         if (*protocol_buffer_count) {
2073                 size_t j = 0;
2074
2075                 buffer_size = sizeof(efi_guid_t *) * *protocol_buffer_count;
2076                 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
2077                                       (void **)protocol_buffer);
2078                 if (r != EFI_SUCCESS)
2079                         return EFI_EXIT(r);
2080                 list_for_each(protocol_handle, &efiobj->protocols) {
2081                         struct efi_handler *protocol;
2082
2083                         protocol = list_entry(protocol_handle,
2084                                               struct efi_handler, link);
2085                         (*protocol_buffer)[j] = (void *)protocol->guid;
2086                         ++j;
2087                 }
2088         }
2089
2090         return EFI_EXIT(EFI_SUCCESS);
2091 }
2092
2093 /**
2094  * efi_locate_handle_buffer - locate handles implementing a protocol
2095  *
2096  * This function implements the LocateHandleBuffer service.
2097  * See the Unified Extensible Firmware Interface (UEFI) specification
2098  * for details.
2099  *
2100  * @search_type:        selection criterion
2101  * @protocol:           GUID of the protocol
2102  * @search_key:         registration key
2103  * @no_handles:         number of returned handles
2104  * @buffer:             buffer with the returned handles
2105  * Return Value:        status code
2106  */
2107 static efi_status_t EFIAPI efi_locate_handle_buffer(
2108                         enum efi_locate_search_type search_type,
2109                         const efi_guid_t *protocol, void *search_key,
2110                         efi_uintn_t *no_handles, efi_handle_t **buffer)
2111 {
2112         efi_status_t r;
2113         efi_uintn_t buffer_size = 0;
2114
2115         EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key,
2116                   no_handles, buffer);
2117
2118         if (!no_handles || !buffer) {
2119                 r = EFI_INVALID_PARAMETER;
2120                 goto out;
2121         }
2122         *no_handles = 0;
2123         *buffer = NULL;
2124         r = efi_locate_handle(search_type, protocol, search_key, &buffer_size,
2125                               *buffer);
2126         if (r != EFI_BUFFER_TOO_SMALL)
2127                 goto out;
2128         r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
2129                               (void **)buffer);
2130         if (r != EFI_SUCCESS)
2131                 goto out;
2132         r = efi_locate_handle(search_type, protocol, search_key, &buffer_size,
2133                               *buffer);
2134         if (r == EFI_SUCCESS)
2135                 *no_handles = buffer_size / sizeof(efi_handle_t);
2136 out:
2137         return EFI_EXIT(r);
2138 }
2139
2140 /**
2141  * efi_locate_protocol - find an interface implementing a protocol
2142  *
2143  * This function implements the LocateProtocol service.
2144  * See the Unified Extensible Firmware Interface (UEFI) specification
2145  * for details.
2146  *
2147  * @protocol:           GUID of the protocol
2148  * @registration:       registration key passed to the notification function
2149  * @protocol_interface: interface implementing the protocol
2150  * Return Value:        status code
2151  */
2152 static efi_status_t EFIAPI efi_locate_protocol(const efi_guid_t *protocol,
2153                                                void *registration,
2154                                                void **protocol_interface)
2155 {
2156         struct list_head *lhandle;
2157         efi_status_t ret;
2158
2159         EFI_ENTRY("%pUl, %p, %p", protocol, registration, protocol_interface);
2160
2161         if (!protocol || !protocol_interface)
2162                 return EFI_EXIT(EFI_INVALID_PARAMETER);
2163
2164         list_for_each(lhandle, &efi_obj_list) {
2165                 struct efi_object *efiobj;
2166                 struct efi_handler *handler;
2167
2168                 efiobj = list_entry(lhandle, struct efi_object, link);
2169
2170                 ret = efi_search_protocol(efiobj->handle, protocol, &handler);
2171                 if (ret == EFI_SUCCESS) {
2172                         *protocol_interface = handler->protocol_interface;
2173                         return EFI_EXIT(EFI_SUCCESS);
2174                 }
2175         }
2176         *protocol_interface = NULL;
2177
2178         return EFI_EXIT(EFI_NOT_FOUND);
2179 }
2180
2181 /**
2182  * efi_locate_device_path - Get the device path and handle of an device
2183  *                          implementing a protocol
2184  *
2185  * This function implements the LocateDevicePath service.
2186  * See the Unified Extensible Firmware Interface (UEFI) specification
2187  * for details.
2188  *
2189  * @protocol:           GUID of the protocol
2190  * @device_path:        device path
2191  * @device:             handle of the device
2192  * Return Value:        status code
2193  */
2194 static efi_status_t EFIAPI efi_locate_device_path(
2195                         const efi_guid_t *protocol,
2196                         struct efi_device_path **device_path,
2197                         efi_handle_t *device)
2198 {
2199         struct efi_device_path *dp;
2200         size_t i;
2201         struct efi_handler *handler;
2202         efi_handle_t *handles;
2203         size_t len, len_dp;
2204         size_t len_best = 0;
2205         efi_uintn_t no_handles;
2206         u8 *remainder;
2207         efi_status_t ret;
2208
2209         EFI_ENTRY("%pUl, %p, %p", protocol, device_path, device);
2210
2211         if (!protocol || !device_path || !*device_path || !device) {
2212                 ret = EFI_INVALID_PARAMETER;
2213                 goto out;
2214         }
2215
2216         /* Find end of device path */
2217         len = efi_dp_instance_size(*device_path);
2218
2219         /* Get all handles implementing the protocol */
2220         ret = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL, protocol, NULL,
2221                                                 &no_handles, &handles));
2222         if (ret != EFI_SUCCESS)
2223                 goto out;
2224
2225         for (i = 0; i < no_handles; ++i) {
2226                 /* Find the device path protocol */
2227                 ret = efi_search_protocol(handles[i], &efi_guid_device_path,
2228                                           &handler);
2229                 if (ret != EFI_SUCCESS)
2230                         continue;
2231                 dp = (struct efi_device_path *)handler->protocol_interface;
2232                 len_dp = efi_dp_instance_size(dp);
2233                 /*
2234                  * This handle can only be a better fit
2235                  * if its device path length is longer than the best fit and
2236                  * if its device path length is shorter of equal the searched
2237                  * device path.
2238                  */
2239                 if (len_dp <= len_best || len_dp > len)
2240                         continue;
2241                 /* Check if dp is a subpath of device_path */
2242                 if (memcmp(*device_path, dp, len_dp))
2243                         continue;
2244                 *device = handles[i];
2245                 len_best = len_dp;
2246         }
2247         if (len_best) {
2248                 remainder = (u8 *)*device_path + len_best;
2249                 *device_path = (struct efi_device_path *)remainder;
2250                 ret = EFI_SUCCESS;
2251         } else {
2252                 ret = EFI_NOT_FOUND;
2253         }
2254 out:
2255         return EFI_EXIT(ret);
2256 }
2257
2258 /**
2259  * Install multiple protocol interfaces.
2260  *
2261  * This function implements the MultipleProtocolInterfaces service.
2262  * See the Unified Extensible Firmware Interface (UEFI) specification
2263  * for details.
2264  *
2265  * @handle:             handle on which the protocol interfaces shall be
2266  *                      installed
2267  * @...:                NULL terminated argument list with pairs of protocol
2268  *                      GUIDS and interfaces
2269  * Return Value:        status code
2270  */
2271 static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces(
2272                         void **handle, ...)
2273 {
2274         EFI_ENTRY("%p", handle);
2275
2276         va_list argptr;
2277         const efi_guid_t *protocol;
2278         void *protocol_interface;
2279         efi_status_t r = EFI_SUCCESS;
2280         int i = 0;
2281
2282         if (!handle)
2283                 return EFI_EXIT(EFI_INVALID_PARAMETER);
2284
2285         va_start(argptr, handle);
2286         for (;;) {
2287                 protocol = va_arg(argptr, efi_guid_t*);
2288                 if (!protocol)
2289                         break;
2290                 protocol_interface = va_arg(argptr, void*);
2291                 r = EFI_CALL(efi_install_protocol_interface(
2292                                                 handle, protocol,
2293                                                 EFI_NATIVE_INTERFACE,
2294                                                 protocol_interface));
2295                 if (r != EFI_SUCCESS)
2296                         break;
2297                 i++;
2298         }
2299         va_end(argptr);
2300         if (r == EFI_SUCCESS)
2301                 return EFI_EXIT(r);
2302
2303         /* If an error occurred undo all changes. */
2304         va_start(argptr, handle);
2305         for (; i; --i) {
2306                 protocol = va_arg(argptr, efi_guid_t*);
2307                 protocol_interface = va_arg(argptr, void*);
2308                 EFI_CALL(efi_uninstall_protocol_interface(handle, protocol,
2309                                                           protocol_interface));
2310         }
2311         va_end(argptr);
2312
2313         return EFI_EXIT(r);
2314 }
2315
2316 /**
2317  * efi_uninstall_multiple_protocol_interfaces - uninstall multiple protocol
2318  *                                              interfaces
2319  *
2320  * This function implements the UninstallMultipleProtocolInterfaces service.
2321  * See the Unified Extensible Firmware Interface (UEFI) specification
2322  * for details.
2323  *
2324  * @handle:             handle from which the protocol interfaces shall be
2325  *                      removed
2326  * @...:                NULL terminated argument list with pairs of protocol
2327  *                      GUIDS and interfaces
2328  * Return Value:        status code
2329  */
2330 static efi_status_t EFIAPI efi_uninstall_multiple_protocol_interfaces(
2331                         void *handle, ...)
2332 {
2333         EFI_ENTRY("%p", handle);
2334
2335         va_list argptr;
2336         const efi_guid_t *protocol;
2337         void *protocol_interface;
2338         efi_status_t r = EFI_SUCCESS;
2339         size_t i = 0;
2340
2341         if (!handle)
2342                 return EFI_EXIT(EFI_INVALID_PARAMETER);
2343
2344         va_start(argptr, handle);
2345         for (;;) {
2346                 protocol = va_arg(argptr, efi_guid_t*);
2347                 if (!protocol)
2348                         break;
2349                 protocol_interface = va_arg(argptr, void*);
2350                 r = EFI_CALL(efi_uninstall_protocol_interface(
2351                                                 handle, protocol,
2352                                                 protocol_interface));
2353                 if (r != EFI_SUCCESS)
2354                         break;
2355                 i++;
2356         }
2357         va_end(argptr);
2358         if (r == EFI_SUCCESS)
2359                 return EFI_EXIT(r);
2360
2361         /* If an error occurred undo all changes. */
2362         va_start(argptr, handle);
2363         for (; i; --i) {
2364                 protocol = va_arg(argptr, efi_guid_t*);
2365                 protocol_interface = va_arg(argptr, void*);
2366                 EFI_CALL(efi_install_protocol_interface(&handle, protocol,
2367                                                         EFI_NATIVE_INTERFACE,
2368                                                         protocol_interface));
2369         }
2370         va_end(argptr);
2371
2372         return EFI_EXIT(r);
2373 }
2374
2375 /**
2376  * efi_calculate_crc32 - calculate cyclic redundancy code
2377  *
2378  * This function implements the CalculateCrc32 service.
2379  * See the Unified Extensible Firmware Interface (UEFI) specification
2380  * for details.
2381  *
2382  * @data:               buffer with data
2383  * @data_size:          size of buffer in bytes
2384  * @crc32_p:            cyclic redundancy code
2385  * Return Value:        status code
2386  */
2387 static efi_status_t EFIAPI efi_calculate_crc32(void *data,
2388                                                unsigned long data_size,
2389                                                uint32_t *crc32_p)
2390 {
2391         EFI_ENTRY("%p, %ld", data, data_size);
2392         *crc32_p = crc32(0, data, data_size);
2393         return EFI_EXIT(EFI_SUCCESS);
2394 }
2395
2396 /**
2397  * efi_copy_mem - copy memory
2398  *
2399  * This function implements the CopyMem service.
2400  * See the Unified Extensible Firmware Interface (UEFI) specification
2401  * for details.
2402  *
2403  * @destination:        destination of the copy operation
2404  * @source:             source of the copy operation
2405  * @length:             number of bytes to copy
2406  */
2407 static void EFIAPI efi_copy_mem(void *destination, const void *source,
2408                                 size_t length)
2409 {
2410         EFI_ENTRY("%p, %p, %ld", destination, source, (unsigned long)length);
2411         memcpy(destination, source, length);
2412         EFI_EXIT(EFI_SUCCESS);
2413 }
2414
2415 /**
2416  * efi_set_mem - Fill memory with a byte value.
2417  *
2418  * This function implements the SetMem service.
2419  * See the Unified Extensible Firmware Interface (UEFI) specification
2420  * for details.
2421  *
2422  * @buffer:             buffer to fill
2423  * @size:               size of buffer in bytes
2424  * @value:              byte to copy to the buffer
2425  */
2426 static void EFIAPI efi_set_mem(void *buffer, size_t size, uint8_t value)
2427 {
2428         EFI_ENTRY("%p, %ld, 0x%x", buffer, (unsigned long)size, value);
2429         memset(buffer, value, size);
2430         EFI_EXIT(EFI_SUCCESS);
2431 }
2432
2433 /**
2434  * efi_protocol_open - open protocol interface on a handle
2435  *
2436  * @handler:            handler of a protocol
2437  * @protocol_interface: interface implementing the protocol
2438  * @agent_handle:       handle of the driver
2439  * @controller_handle:  handle of the controller
2440  * @attributes:         attributes indicating how to open the protocol
2441  * Return Value:        status code
2442  */
2443 static efi_status_t efi_protocol_open(
2444                         struct efi_handler *handler,
2445                         void **protocol_interface, void *agent_handle,
2446                         void *controller_handle, uint32_t attributes)
2447 {
2448         struct efi_open_protocol_info_item *item;
2449         struct efi_open_protocol_info_entry *match = NULL;
2450         bool opened_by_driver = false;
2451         bool opened_exclusive = false;
2452
2453         /* If there is no agent, only return the interface */
2454         if (!agent_handle)
2455                 goto out;
2456
2457         /* For TEST_PROTOCOL ignore interface attribute */
2458         if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
2459                 *protocol_interface = NULL;
2460
2461         /*
2462          * Check if the protocol is already opened by a driver with the same
2463          * attributes or opened exclusively
2464          */
2465         list_for_each_entry(item, &handler->open_infos, link) {
2466                 if (item->info.agent_handle == agent_handle) {
2467                         if ((attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) &&
2468                             (item->info.attributes == attributes))
2469                                 return EFI_ALREADY_STARTED;
2470                 }
2471                 if (item->info.attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE)
2472                         opened_exclusive = true;
2473         }
2474
2475         /* Only one controller can open the protocol exclusively */
2476         if (opened_exclusive && attributes &
2477             (EFI_OPEN_PROTOCOL_EXCLUSIVE | EFI_OPEN_PROTOCOL_BY_DRIVER))
2478                 return EFI_ACCESS_DENIED;
2479
2480         /* Prepare exclusive opening */
2481         if (attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) {
2482                 /* Try to disconnect controllers */
2483                 list_for_each_entry(item, &handler->open_infos, link) {
2484                         if (item->info.attributes ==
2485                                         EFI_OPEN_PROTOCOL_BY_DRIVER)
2486                                 EFI_CALL(efi_disconnect_controller(
2487                                                 item->info.controller_handle,
2488                                                 item->info.agent_handle,
2489                                                 NULL));
2490                 }
2491                 opened_by_driver = false;
2492                 /* Check if all controllers are disconnected */
2493                 list_for_each_entry(item, &handler->open_infos, link) {
2494                         if (item->info.attributes & EFI_OPEN_PROTOCOL_BY_DRIVER)
2495                                 opened_by_driver = true;
2496                 }
2497                 /* Only one controller can be conncected */
2498                 if (opened_by_driver)
2499                         return EFI_ACCESS_DENIED;
2500         }
2501
2502         /* Find existing entry */
2503         list_for_each_entry(item, &handler->open_infos, link) {
2504                 if (item->info.agent_handle == agent_handle &&
2505                     item->info.controller_handle == controller_handle)
2506                         match = &item->info;
2507         }
2508         /* None found, create one */
2509         if (!match) {
2510                 match = efi_create_open_info(handler);
2511                 if (!match)
2512                         return EFI_OUT_OF_RESOURCES;
2513         }
2514
2515         match->agent_handle = agent_handle;
2516         match->controller_handle = controller_handle;
2517         match->attributes = attributes;
2518         match->open_count++;
2519
2520 out:
2521         /* For TEST_PROTOCOL ignore interface attribute. */
2522         if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
2523                 *protocol_interface = handler->protocol_interface;
2524
2525         return EFI_SUCCESS;
2526 }
2527
2528 /**
2529  * efi_open_protocol - open protocol interface on a handle
2530  *
2531  * This function implements the OpenProtocol interface.
2532  * See the Unified Extensible Firmware Interface (UEFI) specification
2533  * for details.
2534  *
2535  * @handle:             handle on which the protocol shall be opened
2536  * @protocol:           GUID of the protocol
2537  * @protocol_interface: interface implementing the protocol
2538  * @agent_handle:       handle of the driver
2539  * @controller_handle:  handle of the controller
2540  * @attributes:         attributes indicating how to open the protocol
2541  * Return Value:        status code
2542  */
2543 static efi_status_t EFIAPI efi_open_protocol(
2544                         void *handle, const efi_guid_t *protocol,
2545                         void **protocol_interface, void *agent_handle,
2546                         void *controller_handle, uint32_t attributes)
2547 {
2548         struct efi_handler *handler;
2549         efi_status_t r = EFI_INVALID_PARAMETER;
2550
2551         EFI_ENTRY("%p, %pUl, %p, %p, %p, 0x%x", handle, protocol,
2552                   protocol_interface, agent_handle, controller_handle,
2553                   attributes);
2554
2555         if (!handle || !protocol ||
2556             (!protocol_interface && attributes !=
2557              EFI_OPEN_PROTOCOL_TEST_PROTOCOL)) {
2558                 goto out;
2559         }
2560
2561         switch (attributes) {
2562         case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL:
2563         case EFI_OPEN_PROTOCOL_GET_PROTOCOL:
2564         case EFI_OPEN_PROTOCOL_TEST_PROTOCOL:
2565                 break;
2566         case EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER:
2567                 if (controller_handle == handle)
2568                         goto out;
2569                 /* fall-through */
2570         case EFI_OPEN_PROTOCOL_BY_DRIVER:
2571         case EFI_OPEN_PROTOCOL_BY_DRIVER | EFI_OPEN_PROTOCOL_EXCLUSIVE:
2572                 /* Check that the controller handle is valid */
2573                 if (!efi_search_obj(controller_handle))
2574                         goto out;
2575                 /* fall-through */
2576         case EFI_OPEN_PROTOCOL_EXCLUSIVE:
2577                 /* Check that the agent handle is valid */
2578                 if (!efi_search_obj(agent_handle))
2579                         goto out;
2580                 break;
2581         default:
2582                 goto out;
2583         }
2584
2585         r = efi_search_protocol(handle, protocol, &handler);
2586         if (r != EFI_SUCCESS)
2587                 goto out;
2588
2589         r = efi_protocol_open(handler, protocol_interface, agent_handle,
2590                               controller_handle, attributes);
2591 out:
2592         return EFI_EXIT(r);
2593 }
2594
2595 /**
2596  * efi_handle_protocol - get interface of a protocol on a handle
2597  *
2598  * This function implements the HandleProtocol service.
2599  * See the Unified Extensible Firmware Interface (UEFI) specification
2600  * for details.
2601  *
2602  * @handle:             handle on which the protocol shall be opened
2603  * @protocol:           GUID of the protocol
2604  * @protocol_interface: interface implementing the protocol
2605  * Return Value:        status code
2606  */
2607 static efi_status_t EFIAPI efi_handle_protocol(efi_handle_t handle,
2608                                                const efi_guid_t *protocol,
2609                                                void **protocol_interface)
2610 {
2611         return efi_open_protocol(handle, protocol, protocol_interface, NULL,
2612                                  NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
2613 }
2614
2615 /**
2616  * efi_bind_controller - bind a single driver to a controller
2617  *
2618  * @controller_handle:          controller handle
2619  * @driver_image_handle:        driver handle
2620  * @remain_device_path:         remaining path
2621  * Return Value:                status code
2622  */
2623 static efi_status_t efi_bind_controller(
2624                         efi_handle_t controller_handle,
2625                         efi_handle_t driver_image_handle,
2626                         struct efi_device_path *remain_device_path)
2627 {
2628         struct efi_driver_binding_protocol *binding_protocol;
2629         efi_status_t r;
2630
2631         r = EFI_CALL(efi_open_protocol(driver_image_handle,
2632                                        &efi_guid_driver_binding_protocol,
2633                                        (void **)&binding_protocol,
2634                                        driver_image_handle, NULL,
2635                                        EFI_OPEN_PROTOCOL_GET_PROTOCOL));
2636         if (r != EFI_SUCCESS)
2637                 return r;
2638         r = EFI_CALL(binding_protocol->supported(binding_protocol,
2639                                                  controller_handle,
2640                                                  remain_device_path));
2641         if (r == EFI_SUCCESS)
2642                 r = EFI_CALL(binding_protocol->start(binding_protocol,
2643                                                      controller_handle,
2644                                                      remain_device_path));
2645         EFI_CALL(efi_close_protocol(driver_image_handle,
2646                                     &efi_guid_driver_binding_protocol,
2647                                     driver_image_handle, NULL));
2648         return r;
2649 }
2650
2651 /**
2652  * efi_connect_single_controller - connect a single driver to a controller
2653  *
2654  * @controller_handle:          controller
2655  * @driver_image_handle:        driver
2656  * @remain_device_path:         remainting path
2657  * Return Value:                status code
2658  */
2659 static efi_status_t efi_connect_single_controller(
2660                         efi_handle_t controller_handle,
2661                         efi_handle_t *driver_image_handle,
2662                         struct efi_device_path *remain_device_path)
2663 {
2664         efi_handle_t *buffer;
2665         size_t count;
2666         size_t i;
2667         efi_status_t r;
2668         size_t connected = 0;
2669
2670         /* Get buffer with all handles with driver binding protocol */
2671         r = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL,
2672                                               &efi_guid_driver_binding_protocol,
2673                                               NULL, &count, &buffer));
2674         if (r != EFI_SUCCESS)
2675                 return r;
2676
2677         /*  Context Override */
2678         if (driver_image_handle) {
2679                 for (; *driver_image_handle; ++driver_image_handle) {
2680                         for (i = 0; i < count; ++i) {
2681                                 if (buffer[i] == *driver_image_handle) {
2682                                         buffer[i] = NULL;
2683                                         r = efi_bind_controller(
2684                                                         controller_handle,
2685                                                         *driver_image_handle,
2686                                                         remain_device_path);
2687                                         /*
2688                                          * For drivers that do not support the
2689                                          * controller or are already connected
2690                                          * we receive an error code here.
2691                                          */
2692                                         if (r == EFI_SUCCESS)
2693                                                 ++connected;
2694                                 }
2695                         }
2696                 }
2697         }
2698
2699         /*
2700          * TODO: Some overrides are not yet implemented:
2701          * - Platform Driver Override
2702          * - Driver Family Override Search
2703          * - Bus Specific Driver Override
2704          */
2705
2706         /* Driver Binding Search */
2707         for (i = 0; i < count; ++i) {
2708                 if (buffer[i]) {
2709                         r = efi_bind_controller(controller_handle,
2710                                                 buffer[i],
2711                                                 remain_device_path);
2712                         if (r == EFI_SUCCESS)
2713                                 ++connected;
2714                 }
2715         }
2716
2717         efi_free_pool(buffer);
2718         if (!connected)
2719                 return EFI_NOT_FOUND;
2720         return EFI_SUCCESS;
2721 }
2722
2723 /**
2724  * efi_connect_controller - connect a controller to a driver
2725  *
2726  * This function implements the ConnectController service.
2727  * See the Unified Extensible Firmware Interface (UEFI) specification
2728  * for details.
2729  *
2730  * First all driver binding protocol handles are tried for binding drivers.
2731  * Afterwards all handles that have openened a protocol of the controller
2732  * with EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER are connected to drivers.
2733  *
2734  * @controller_handle:          handle of the controller
2735  * @driver_image_handle:        handle of the driver
2736  * @remain_device_path:         device path of a child controller
2737  * @recursive:                  true to connect all child controllers
2738  * Return Value:                status code
2739  */
2740 static efi_status_t EFIAPI efi_connect_controller(
2741                         efi_handle_t controller_handle,
2742                         efi_handle_t *driver_image_handle,
2743                         struct efi_device_path *remain_device_path,
2744                         bool recursive)
2745 {
2746         efi_status_t r;
2747         efi_status_t ret = EFI_NOT_FOUND;
2748         struct efi_object *efiobj;
2749
2750         EFI_ENTRY("%p, %p, %p, %d", controller_handle, driver_image_handle,
2751                   remain_device_path, recursive);
2752
2753         efiobj = efi_search_obj(controller_handle);
2754         if (!efiobj) {
2755                 ret = EFI_INVALID_PARAMETER;
2756                 goto out;
2757         }
2758
2759         r = efi_connect_single_controller(controller_handle,
2760                                           driver_image_handle,
2761                                           remain_device_path);
2762         if (r == EFI_SUCCESS)
2763                 ret = EFI_SUCCESS;
2764         if (recursive) {
2765                 struct efi_handler *handler;
2766                 struct efi_open_protocol_info_item *item;
2767
2768                 list_for_each_entry(handler, &efiobj->protocols, link) {
2769                         list_for_each_entry(item, &handler->open_infos, link) {
2770                                 if (item->info.attributes &
2771                                     EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
2772                                         r = EFI_CALL(efi_connect_controller(
2773                                                 item->info.controller_handle,
2774                                                 driver_image_handle,
2775                                                 remain_device_path,
2776                                                 recursive));
2777                                         if (r == EFI_SUCCESS)
2778                                                 ret = EFI_SUCCESS;
2779                                 }
2780                         }
2781                 }
2782         }
2783         /*  Check for child controller specified by end node */
2784         if (ret != EFI_SUCCESS && remain_device_path &&
2785             remain_device_path->type == DEVICE_PATH_TYPE_END)
2786                 ret = EFI_SUCCESS;
2787 out:
2788         return EFI_EXIT(ret);
2789 }
2790
2791 /**
2792  * efi_reinstall_protocol_interface - reinstall protocol interface
2793  *
2794  * This function implements the ReinstallProtocolInterface service.
2795  * See the Unified Extensible Firmware Interface (UEFI) specification
2796  * for details.
2797  *
2798  * The old interface is uninstalled. The new interface is installed.
2799  * Drivers are connected.
2800  *
2801  * @handle:                     handle on which the protocol shall be
2802  *                              reinstalled
2803  * @protocol:                   GUID of the protocol to be installed
2804  * @old_interface:              interface to be removed
2805  * @new_interface:              interface to be installed
2806  * Return Value:                status code
2807  */
2808 static efi_status_t EFIAPI efi_reinstall_protocol_interface(
2809                         efi_handle_t handle, const efi_guid_t *protocol,
2810                         void *old_interface, void *new_interface)
2811 {
2812         efi_status_t ret;
2813
2814         EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface,
2815                   new_interface);
2816         ret = EFI_CALL(efi_uninstall_protocol_interface(handle, protocol,
2817                                                         old_interface));
2818         if (ret != EFI_SUCCESS)
2819                 goto out;
2820         ret = EFI_CALL(efi_install_protocol_interface(&handle, protocol,
2821                                                       EFI_NATIVE_INTERFACE,
2822                                                       new_interface));
2823         if (ret != EFI_SUCCESS)
2824                 goto out;
2825         /*
2826          * The returned status code has to be ignored.
2827          * Do not create an error if no suitable driver for the handle exists.
2828          */
2829         EFI_CALL(efi_connect_controller(handle, NULL, NULL, true));
2830 out:
2831         return EFI_EXIT(ret);
2832 }
2833
2834 /**
2835  * efi_get_child_controllers - get all child controllers associated to a driver
2836  *
2837  * The allocated buffer has to be freed with free().
2838  *
2839  * @efiobj:                     handle of the controller
2840  * @driver_handle:              handle of the driver
2841  * @number_of_children:         number of child controllers
2842  * @child_handle_buffer:        handles of the the child controllers
2843  * Return Value:                status code
2844  */
2845 static efi_status_t efi_get_child_controllers(
2846                                 struct efi_object *efiobj,
2847                                 efi_handle_t driver_handle,
2848                                 efi_uintn_t *number_of_children,
2849                                 efi_handle_t **child_handle_buffer)
2850 {
2851         struct efi_handler *handler;
2852         struct efi_open_protocol_info_item *item;
2853         efi_uintn_t count = 0, i;
2854         bool duplicate;
2855
2856         /* Count all child controller associations */
2857         list_for_each_entry(handler, &efiobj->protocols, link) {
2858                 list_for_each_entry(item, &handler->open_infos, link) {
2859                         if (item->info.agent_handle == driver_handle &&
2860                             item->info.attributes &
2861                             EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER)
2862                                 ++count;
2863                 }
2864         }
2865         /*
2866          * Create buffer. In case of duplicate child controller assignments
2867          * the buffer will be too large. But that does not harm.
2868          */
2869         *number_of_children = 0;
2870         *child_handle_buffer = calloc(count, sizeof(efi_handle_t));
2871         if (!*child_handle_buffer)
2872                 return EFI_OUT_OF_RESOURCES;
2873         /* Copy unique child handles */
2874         list_for_each_entry(handler, &efiobj->protocols, link) {
2875                 list_for_each_entry(item, &handler->open_infos, link) {
2876                         if (item->info.agent_handle == driver_handle &&
2877                             item->info.attributes &
2878                             EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
2879                                 /* Check this is a new child controller */
2880                                 duplicate = false;
2881                                 for (i = 0; i < *number_of_children; ++i) {
2882                                         if ((*child_handle_buffer)[i] ==
2883                                             item->info.controller_handle)
2884                                                 duplicate = true;
2885                                 }
2886                                 /* Copy handle to buffer */
2887                                 if (!duplicate) {
2888                                         i = (*number_of_children)++;
2889                                         (*child_handle_buffer)[i] =
2890                                                 item->info.controller_handle;
2891                                 }
2892                         }
2893                 }
2894         }
2895         return EFI_SUCCESS;
2896 }
2897
2898 /**
2899  * efi_disconnect_controller - disconnect a controller from a driver
2900  *
2901  * This function implements the DisconnectController service.
2902  * See the Unified Extensible Firmware Interface (UEFI) specification
2903  * for details.
2904  *
2905  * @controller_handle:          handle of the controller
2906  * @driver_image_handle:        handle of the driver
2907  * @child_handle:               handle of the child to destroy
2908  * Return Value:                status code
2909  */
2910 static efi_status_t EFIAPI efi_disconnect_controller(
2911                                 efi_handle_t controller_handle,
2912                                 efi_handle_t driver_image_handle,
2913                                 efi_handle_t child_handle)
2914 {
2915         struct efi_driver_binding_protocol *binding_protocol;
2916         efi_handle_t *child_handle_buffer = NULL;
2917         size_t number_of_children = 0;
2918         efi_status_t r;
2919         size_t stop_count = 0;
2920         struct efi_object *efiobj;
2921
2922         EFI_ENTRY("%p, %p, %p", controller_handle, driver_image_handle,
2923                   child_handle);
2924
2925         efiobj = efi_search_obj(controller_handle);
2926         if (!efiobj) {
2927                 r = EFI_INVALID_PARAMETER;
2928                 goto out;
2929         }
2930
2931         if (child_handle && !efi_search_obj(child_handle)) {
2932                 r = EFI_INVALID_PARAMETER;
2933                 goto out;
2934         }
2935
2936         /* If no driver handle is supplied, disconnect all drivers */
2937         if (!driver_image_handle) {
2938                 r = efi_disconnect_all_drivers(efiobj, NULL, child_handle);
2939                 goto out;
2940         }
2941
2942         /* Create list of child handles */
2943         if (child_handle) {
2944                 number_of_children = 1;
2945                 child_handle_buffer = &child_handle;
2946         } else {
2947                 efi_get_child_controllers(efiobj,
2948                                           driver_image_handle,
2949                                           &number_of_children,
2950                                           &child_handle_buffer);
2951         }
2952
2953         /* Get the driver binding protocol */
2954         r = EFI_CALL(efi_open_protocol(driver_image_handle,
2955                                        &efi_guid_driver_binding_protocol,
2956                                        (void **)&binding_protocol,
2957                                        driver_image_handle, NULL,
2958                                        EFI_OPEN_PROTOCOL_GET_PROTOCOL));
2959         if (r != EFI_SUCCESS)
2960                 goto out;
2961         /* Remove the children */
2962         if (number_of_children) {
2963                 r = EFI_CALL(binding_protocol->stop(binding_protocol,
2964                                                     controller_handle,
2965                                                     number_of_children,
2966                                                     child_handle_buffer));
2967                 if (r == EFI_SUCCESS)
2968                         ++stop_count;
2969         }
2970         /* Remove the driver */
2971         if (!child_handle)
2972                 r = EFI_CALL(binding_protocol->stop(binding_protocol,
2973                                                     controller_handle,
2974                                                     0, NULL));
2975         if (r == EFI_SUCCESS)
2976                 ++stop_count;
2977         EFI_CALL(efi_close_protocol(driver_image_handle,
2978                                     &efi_guid_driver_binding_protocol,
2979                                     driver_image_handle, NULL));
2980
2981         if (stop_count)
2982                 r = EFI_SUCCESS;
2983         else
2984                 r = EFI_NOT_FOUND;
2985 out:
2986         if (!child_handle)
2987                 free(child_handle_buffer);
2988         return EFI_EXIT(r);
2989 }
2990
2991 static const struct efi_boot_services efi_boot_services = {
2992         .hdr = {
2993                 .headersize = sizeof(struct efi_table_hdr),
2994         },
2995         .raise_tpl = efi_raise_tpl,
2996         .restore_tpl = efi_restore_tpl,
2997         .allocate_pages = efi_allocate_pages_ext,
2998         .free_pages = efi_free_pages_ext,
2999         .get_memory_map = efi_get_memory_map_ext,
3000         .allocate_pool = efi_allocate_pool_ext,
3001         .free_pool = efi_free_pool_ext,
3002         .create_event = efi_create_event_ext,
3003         .set_timer = efi_set_timer_ext,
3004         .wait_for_event = efi_wait_for_event,
3005         .signal_event = efi_signal_event_ext,
3006         .close_event = efi_close_event,
3007         .check_event = efi_check_event,
3008         .install_protocol_interface = efi_install_protocol_interface,
3009         .reinstall_protocol_interface = efi_reinstall_protocol_interface,
3010         .uninstall_protocol_interface = efi_uninstall_protocol_interface,
3011         .handle_protocol = efi_handle_protocol,
3012         .reserved = NULL,
3013         .register_protocol_notify = efi_register_protocol_notify,
3014         .locate_handle = efi_locate_handle_ext,
3015         .locate_device_path = efi_locate_device_path,
3016         .install_configuration_table = efi_install_configuration_table_ext,
3017         .load_image = efi_load_image,
3018         .start_image = efi_start_image,
3019         .exit = efi_exit,
3020         .unload_image = efi_unload_image,
3021         .exit_boot_services = efi_exit_boot_services,
3022         .get_next_monotonic_count = efi_get_next_monotonic_count,
3023         .stall = efi_stall,
3024         .set_watchdog_timer = efi_set_watchdog_timer,
3025         .connect_controller = efi_connect_controller,
3026         .disconnect_controller = efi_disconnect_controller,
3027         .open_protocol = efi_open_protocol,
3028         .close_protocol = efi_close_protocol,
3029         .open_protocol_information = efi_open_protocol_information,
3030         .protocols_per_handle = efi_protocols_per_handle,
3031         .locate_handle_buffer = efi_locate_handle_buffer,
3032         .locate_protocol = efi_locate_protocol,
3033         .install_multiple_protocol_interfaces =
3034                         efi_install_multiple_protocol_interfaces,
3035         .uninstall_multiple_protocol_interfaces =
3036                         efi_uninstall_multiple_protocol_interfaces,
3037         .calculate_crc32 = efi_calculate_crc32,
3038         .copy_mem = efi_copy_mem,
3039         .set_mem = efi_set_mem,
3040         .create_event_ex = efi_create_event_ex,
3041 };
3042
3043 static uint16_t __efi_runtime_data firmware_vendor[] = L"Das U-Boot";
3044
3045 struct efi_system_table __efi_runtime_data systab = {
3046         .hdr = {
3047                 .signature = EFI_SYSTEM_TABLE_SIGNATURE,
3048                 .revision = 2 << 16 | 70, /* 2.7 */
3049                 .headersize = sizeof(struct efi_table_hdr),
3050         },
3051         .fw_vendor = (long)firmware_vendor,
3052         .con_in = (void *)&efi_con_in,
3053         .con_out = (void *)&efi_con_out,
3054         .std_err = (void *)&efi_con_out,
3055         .runtime = (void *)&efi_runtime_services,
3056         .boottime = (void *)&efi_boot_services,
3057         .nr_tables = 0,
3058         .tables = (void *)efi_conf_table,
3059 };