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