iPXE
efi_driver.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  */
19 
20 FILE_LICENCE ( GPL2_OR_LATER );
21 FILE_SECBOOT ( PERMITTED );
22 
23 #include <stddef.h>
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <string.h>
27 #include <errno.h>
28 #include <ipxe/version.h>
29 #include <ipxe/efi/efi.h>
33 #include <ipxe/efi/efi_strings.h>
34 #include <ipxe/efi/efi_path.h>
35 #include <ipxe/efi/efi_driver.h>
36 
37 /** @file
38  *
39  * EFI driver interface
40  *
41  */
42 
44 
45 /** List of controlled EFI devices */
46 static LIST_HEAD ( efi_devices );
47 
48 /** We are currently disconnecting drivers */
50 
51 /**
52  * Allocate new EFI device
53  *
54  * @v device EFI device handle
55  * @ret efidev EFI device, or NULL on error
56  */
58  struct efi_device *efidev = NULL;
60  EFI_DEVICE_PATH_PROTOCOL *path_end;
61  size_t path_len;
62  int rc;
63 
64  /* Open device path */
66  &path ) ) != 0 ) {
67  DBGC ( device, "EFIDRV %s could not open device path: %s\n",
68  efi_handle_name ( device ), strerror ( rc ) );
69  return NULL;
70  }
71  path_len = ( efi_path_len ( path ) + sizeof ( *path_end ) );
72 
73  /* Allocate and initialise structure */
74  efidev = zalloc ( sizeof ( *efidev ) + path_len );
75  if ( ! efidev )
76  return NULL;
77  efidev->device = device;
78  efidev->dev.desc.bus_type = BUS_TYPE_EFI;
79  efidev->path = ( ( ( void * ) efidev ) + sizeof ( *efidev ) );
80  memcpy ( efidev->path, path, path_len );
81  INIT_LIST_HEAD ( &efidev->dev.children );
82  list_add ( &efidev->dev.siblings, &efi_devices );
83 
84  return efidev;
85 }
86 
87 /**
88  * Free EFI device
89  *
90  * @v efidev EFI device
91  */
92 void efidev_free ( struct efi_device *efidev ) {
93 
94  assert ( list_empty ( &efidev->dev.children ) );
95  list_del ( &efidev->dev.siblings );
96  free ( efidev );
97 }
98 
99 /**
100  * Find EFI device
101  *
102  * @v device EFI device handle (or child handle)
103  * @ret efidev EFI device, or NULL if not found
104  */
106  struct efi_device *efidev;
107 
108  /* Avoid false positive matches against NULL children */
109  if ( ! device )
110  return NULL;
111 
112  /* Look for an existing EFI device */
113  list_for_each_entry ( efidev, &efi_devices, dev.siblings ) {
114  if ( ( device == efidev->device ) ||
115  ( device == efidev->child ) ) {
116  return efidev;
117  }
118  }
119 
120  return NULL;
121 }
122 
123 /**
124  * Get parent EFI device
125  *
126  * @v dev Generic device
127  * @ret efidev Parent EFI device, or NULL
128  */
129 struct efi_device * efidev_parent ( struct device *dev ) {
130  struct device *parent;
131  struct efi_device *efidev;
132 
133  /* Walk upwards until we find a registered EFI device */
134  while ( ( parent = dev->parent ) ) {
135  list_for_each_entry ( efidev, &efi_devices, dev.siblings ) {
136  if ( parent == &efidev->dev )
137  return efidev;
138  }
139  dev = parent;
140  }
141 
142  return NULL;
143 }
144 
145 /**
146  * Check to see if driver supports a device
147  *
148  * @v driver EFI driver
149  * @v device EFI device
150  * @v child Path to child device, if any
151  * @ret efirc EFI status code
152  */
153 static EFI_STATUS EFIAPI
156  struct efi_driver *efidrv;
157  unsigned int count;
158  int rc;
159 
160  DBGCP ( device, "EFIDRV %s DRIVER_SUPPORTED",
161  efi_handle_name ( device ) );
162  if ( child )
163  DBGCP ( device, " (child %s)", efi_devpath_text ( child ) );
164  DBGCP ( device, "\n" );
165 
166  /* Do nothing if we are already driving this device */
167  if ( efidev_find ( device ) != NULL ) {
168  DBGCP ( device, "EFIDRV %s is already started\n",
169  efi_handle_name ( device ) );
170  return EFI_ALREADY_STARTED;
171  }
172 
173  /* Count drivers claiming to support this device */
174  count = 0;
175  for_each_table_entry ( efidrv, EFI_DRIVERS ) {
176  if ( ( rc = efidrv->supported ( device ) ) == 0 ) {
177  DBGC ( device, "EFIDRV %s has driver \"%s\"\n",
178  efi_handle_name ( device ), efidrv->name );
179  count++;
180  }
181  }
182 
183  /* Check that we have at least one driver */
184  if ( ! count ) {
185  DBGCP ( device, "EFIDRV %s has no driver\n",
186  efi_handle_name ( device ) );
187  return EFI_UNSUPPORTED;
188  }
189 
190  return 0;
191 }
192 
193 /**
194  * Attach driver to device
195  *
196  * @v driver EFI driver
197  * @v device EFI device
198  * @v child Path to child device, if any
199  * @ret efirc EFI status code
200  */
201 static EFI_STATUS EFIAPI
204  struct efi_driver *efidrv;
205  struct efi_device *efidev;
206  struct efi_saved_tpl tpl;
207  EFI_STATUS efirc;
208  int rc;
209 
210  DBGC ( device, "EFIDRV %s DRIVER_START", efi_handle_name ( device ) );
211  if ( child )
212  DBGC ( device, " (child %s)", efi_devpath_text ( child ) );
213  DBGC ( device, "\n" );
214 
215  /* Do nothing if we are already driving this device */
216  efidev = efidev_find ( device );
217  if ( efidev ) {
218  DBGCP ( device, "EFIDRV %s is already started\n",
219  efi_handle_name ( device ) );
220  efirc = EFI_ALREADY_STARTED;
221  goto err_already_started;
222  }
223 
224  /* Raise TPL */
225  efi_raise_tpl ( &tpl );
226 
227  /* Do nothing if we are currently disconnecting drivers */
228  if ( efi_driver_disconnecting ) {
229  DBGC ( device, "EFIDRV %s refusing to start during "
230  "disconnection\n", efi_handle_name ( device ) );
231  efirc = EFI_NOT_READY;
232  goto err_disconnecting;
233  }
234 
235  /* Add new device */
236  efidev = efidev_alloc ( device );
237  if ( ! efidev ) {
238  efirc = EFI_OUT_OF_RESOURCES;
239  goto err_alloc;
240  }
241 
242  /* Try to start this device */
243  for_each_table_entry ( efidrv, EFI_DRIVERS ) {
244  if ( ( rc = efidrv->supported ( device ) ) != 0 ) {
245  DBGC ( device, "EFIDRV %s is not supported by driver "
246  "\"%s\": %s\n", efi_handle_name ( device ),
247  efidrv->name,
248  strerror ( rc ) );
249  continue;
250  }
251  if ( ( rc = efidrv->start ( efidev ) ) == 0 ) {
252  efidev->driver = efidrv;
253  DBGC ( device, "EFIDRV %s using driver \"%s\"\n",
255  efidev->driver->name );
256  efi_restore_tpl ( &tpl );
257  return 0;
258  }
259  DBGC ( device, "EFIDRV %s could not start driver \"%s\": %s\n",
260  efi_handle_name ( device ), efidrv->name,
261  strerror ( rc ) );
262  }
263  efirc = EFI_UNSUPPORTED;
264 
265  efidev_free ( efidev );
266  err_alloc:
267  err_disconnecting:
268  efi_restore_tpl ( &tpl );
269  err_already_started:
270  return efirc;
271 }
272 
273 /**
274  * Detach driver from device
275  *
276  * @v driver EFI driver
277  * @v device EFI device
278  * @v pci PCI device
279  * @v num_children Number of child devices
280  * @v children List of child devices
281  * @ret efirc EFI status code
282  */
283 static EFI_STATUS EFIAPI
285  EFI_HANDLE device, UINTN num_children,
286  EFI_HANDLE *children ) {
287  struct efi_driver *efidrv;
288  struct efi_device *efidev;
289  struct efi_saved_tpl tpl;
290  UINTN i;
291 
292  DBGC ( device, "EFIDRV %s DRIVER_STOP", efi_handle_name ( device ) );
293  for ( i = 0 ; i < num_children ; i++ ) {
294  DBGC ( device, "%s%s", ( i ? ", " : " child " ),
295  efi_handle_name ( children[i] ) );
296  }
297  DBGC ( device, "\n" );
298 
299  /* Do nothing unless we are driving this device */
300  efidev = efidev_find ( device );
301  if ( ! efidev ) {
302  DBGCP ( device, "EFIDRV %s is not started\n",
303  efi_handle_name ( device ) );
304  return 0;
305  }
306 
307  /* Raise TPL */
308  efi_raise_tpl ( &tpl );
309 
310  /* Stop this device */
311  efidrv = efidev->driver;
312  assert ( efidrv != NULL );
313  efidrv->stop ( efidev );
314  efidev_free ( efidev );
315 
316  efi_restore_tpl ( &tpl );
317  return 0;
318 }
319 
320 /** EFI driver binding protocol */
323  .Start = efi_driver_start,
324  .Stop = efi_driver_stop,
325 };
326 
327 /**
328  * Look up driver name
329  *
330  * @v wtf Component name protocol
331  * @v language Language to use
332  * @v driver_name Driver name to fill in
333  * @ret efirc EFI status code
334  */
335 static EFI_STATUS EFIAPI
337  CHAR8 *language __unused, CHAR16 **driver_name ) {
338  const wchar_t *name;
339 
341  *driver_name = ( ( wchar_t * ) name );
342  return 0;
343 }
344 
345 /**
346  * Look up controller name
347  *
348  * @v wtf Component name protocol
349  * @v device Device
350  * @v child Child device, or NULL
351  * @v language Language to use
352  * @v driver_name Device name to fill in
353  * @ret efirc EFI status code
354  */
355 static EFI_STATUS EFIAPI
358  CHAR8 *language, CHAR16 **controller_name ) {
360  int rc;
361 
362  /* Delegate to the EFI_COMPONENT_NAME2_PROTOCOL instance
363  * installed on child handle, if present.
364  */
365  if ( ( child != NULL ) &&
367  &name2 ) ) == 0 ) ) {
368  return name2->GetControllerName ( name2, device, child,
369  language, controller_name );
370  }
371 
372  /* Otherwise, let EFI use the default Device Path Name */
373  return EFI_UNSUPPORTED;
374 }
375 
376 /** EFI component name protocol */
379  .GetControllerName = efi_driver_controller_name,
380  .SupportedLanguages = "en",
381 };
382 
383 /**
384  * Install EFI driver
385  *
386  * @ret rc Return status code
387  */
388 int efi_driver_install ( void ) {
390  EFI_STATUS efirc;
391  int rc;
392 
393  /* Calculate driver version number. We use the build
394  * timestamp (in seconds since the Epoch) shifted right by six
395  * bits: this gives us an approximately one-minute resolution
396  * and a scheme which will last until the year 10680.
397  */
399 
400  /* Install protocols on image handle */
403  if ( ( efirc = bs->InstallMultipleProtocolInterfaces (
407  NULL ) ) != 0 ) {
408  rc = -EEFI ( efirc );
409  DBGC ( &efi_driver_binding, "EFIDRV could not install "
410  "protocols: %s\n", strerror ( rc ) );
411  return rc;
412  }
413 
414  return 0;
415 }
416 
417 /**
418  * Uninstall EFI driver
419  *
420  */
421 void efi_driver_uninstall ( void ) {
423 
424  /* Uninstall protocols */
429 }
430 
431 /**
432  * Try to disconnect an existing EFI driver
433  *
434  * @v device EFI device
435  * @v protocol Protocol GUID
436  * @ret rc Return status code
437  */
442  EFI_HANDLE driver;
443  UINTN count;
444  unsigned int i;
445  EFI_STATUS efirc;
446  int rc;
447 
448  /* Retrieve list of openers */
449  if ( ( efirc = bs->OpenProtocolInformation ( device, protocol, &openers,
450  &count ) ) != 0 ) {
451  rc = -EEFI ( efirc );
452  DBGC ( device, "EFIDRV %s could not list %s openers: %s\n",
454  strerror ( rc ) );
455  goto err_list;
456  }
457 
458  /* Identify BY_DRIVER opener */
459  driver = NULL;
460  for ( i = 0 ; i < count ; i++ ) {
461  opener = &openers[i];
462  if ( opener->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER ) {
463  driver = opener->AgentHandle;
464  break;
465  }
466  }
467 
468  /* Try to disconnect driver */
469  DBGC ( device, "EFIDRV %s disconnecting %s drivers\n",
471  if ( driver ) {
472  DBGC ( device, "EFIDRV %s disconnecting %s driver ",
474  DBGC ( device, "%s\n", efi_handle_name ( driver ) );
475  if ( ( rc = efi_disconnect ( device, driver ) ) != 0 ) {
476  DBGC ( device, "EFIDRV %s could not disconnect ",
477  efi_handle_name ( device ) );
478  DBGC ( device, "%s: %s\n",
479  efi_handle_name ( driver ), strerror ( rc ) );
480  goto err_disconnect;
481  }
482  }
483 
484  /* Success */
485  rc = 0;
486 
487  err_disconnect:
488  bs->FreePool ( openers );
489  err_list:
490  return rc;
491 }
492 
493 /**
494  * Try to connect EFI driver
495  *
496  * @v device EFI device
497  * @ret rc Return status code
498  */
501  struct efi_driver *efidrv;
502  EFI_STATUS efirc;
503  int rc;
504 
505  /* Check if we want to drive this device */
507  NULL ) ) != 0 ) {
508  /* Not supported; not an error */
509  return 0;
510  }
511 
512  /* Disconnect any existing drivers */
513  DBGC2 ( device, "EFIDRV %s before disconnecting:\n",
514  efi_handle_name ( device ) );
516  DBGC ( device, "EFIDRV %s disconnecting existing drivers\n",
517  efi_handle_name ( device ) );
520  if ( ! efidrv->exclude )
521  continue;
522  if ( ( rc = efidrv->supported ( device ) ) != 0 )
523  continue;
524  if ( ( rc = efidrv->exclude ( device ) ) != 0 ) {
525  DBGC ( device, "EFIDRV %s could not disconnect "
526  "drivers: %s\n", efi_handle_name ( device ),
527  strerror ( rc ) );
528  /* Ignore the error and attempt to connect anyway */
529  }
530  }
532  DBGC2 ( device, "EFIDRV %s after disconnecting:\n",
533  efi_handle_name ( device ) );
535 
536  /* Connect our driver */
537  DBGC ( device, "EFIDRV %s connecting new drivers\n",
538  efi_handle_name ( device ) );
539  if ( ( rc = efi_connect ( device, driver ) ) != 0 ) {
540  DBGC ( device, "EFIDRV %s could not connect new drivers: "
541  "%s\n", efi_handle_name ( device ), strerror ( rc ) );
542  DBGC ( device, "EFIDRV %s connecting driver directly\n",
543  efi_handle_name ( device ) );
544  if ( ( efirc = efi_driver_start ( &efi_driver_binding, device,
545  NULL ) ) != 0 ) {
546  rc = -EEFI ( efirc );
547  DBGC ( device, "EFIDRV %s could not connect driver "
548  "directly: %s\n", efi_handle_name ( device ),
549  strerror ( rc ) );
550  return rc;
551  }
552  }
553  DBGC2 ( device, "EFIDRV %s after connecting:\n",
554  efi_handle_name ( device ) );
556 
557  return 0;
558 }
559 
560 /**
561  * Try to disconnect EFI driver
562  *
563  * @v device EFI device
564  * @ret rc Return status code
565  */
568 
569  /* Disconnect our driver */
571  efi_disconnect ( device, driver );
573 
574  return 0;
575 }
576 
577 /**
578  * Reconnect original EFI driver
579  *
580  * @v device EFI device
581  * @ret rc Return status code
582  */
584 
585  /* Reconnect any available driver */
586  efi_connect ( device, NULL );
587 
588  return 0;
589 }
590 
591 /**
592  * Connect/disconnect EFI driver from all handles
593  *
594  * @v method Connect/disconnect method
595  * @ret rc Return status code
596  */
597 static int efi_driver_handles ( int ( * method ) ( EFI_HANDLE handle ) ) {
599  EFI_HANDLE *handles;
600  UINTN num_handles;
601  EFI_STATUS efirc;
602  UINTN i;
603  int rc;
604 
605  /* Enumerate all handles */
606  if ( ( efirc = bs->LocateHandleBuffer ( AllHandles, NULL, NULL,
607  &num_handles,
608  &handles ) ) != 0 ) {
609  rc = -EEFI ( efirc );
610  DBGC ( &efi_driver_binding, "EFIDRV could not list handles: "
611  "%s\n", strerror ( rc ) );
612  goto err_locate;
613  }
614 
615  /* Connect/disconnect driver from all handles */
616  for ( i = 0 ; i < num_handles ; i++ ) {
617  if ( ( rc = method ( handles[i] ) ) != 0 ) {
618  /* Ignore errors and continue to process
619  * remaining handles.
620  */
621  }
622  }
623 
624  /* Success */
625  rc = 0;
626 
627  bs->FreePool ( handles );
628  err_locate:
629  return rc;
630 }
631 
632 /**
633  * Connect EFI driver to all possible devices
634  *
635  * @ret rc Return status code
636  */
638 
639  DBGC ( &efi_driver_binding, "EFIDRV connecting our drivers\n" );
641 }
642 
643 /**
644  * Disconnect EFI driver from all possible devices
645  *
646  * @ret rc Return status code
647  */
649 
650  DBGC ( &efi_driver_binding, "EFIDRV disconnecting our drivers\n" );
652 }
653 
654 /**
655  * Reconnect original EFI drivers to all possible devices
656  *
657  * @ret rc Return status code
658  */
660 
661  DBGC ( &efi_driver_binding, "EFIDRV reconnecting old drivers\n" );
663 }
int efi_driver_connect_all(void)
Connect EFI driver to all possible devices.
Definition: efi_driver.c:637
void efi_driver_uninstall(void)
Uninstall EFI driver.
Definition: efi_driver.c:421
UEFI DriverBinding Protocol is defined in UEFI specification.
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2099
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:118
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1986
static int efi_driver_connect(EFI_HANDLE device)
Try to connect EFI driver.
Definition: efi_driver.c:499
EFI Oprn Protocol Information Entry.
Definition: UefiSpec.h:1432
static EFI_STATUS EFIAPI efi_driver_name(EFI_COMPONENT_NAME2_PROTOCOL *wtf __unused, CHAR8 *language __unused, CHAR16 **driver_name)
Look up driver name.
Definition: efi_driver.c:336
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:175
struct efi_driver * driver
Driver for this device.
Definition: efi_driver.h:28
#define EFI_ALREADY_STARTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:135
The device path protocol as defined in UEFI 2.0.
This protocol is used to retrieve user readable names of drivers and controllers managed by UEFI Driv...
EFI driver interface.
int efi_connect(EFI_HANDLE device, EFI_HANDLE driver)
Connect UEFI driver(s)
Definition: efi_connect.c:58
EFI_HANDLE AgentHandle
Definition: UefiSpec.h:1433
FILE_LICENCE(GPL2_OR_LATER)
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:70
128 bit buffer containing a unique identifier value.
Definition: Base.h:216
Error codes.
Retrieve all the handles in the handle database.
Definition: UefiSpec.h:1522
void efi_raise_tpl(struct efi_saved_tpl *tpl)
Raise task priority level to internal level.
Definition: efi_init.c:383
EFI_DRIVER_BINDING_SUPPORTED Supported
EFI strings.
static EFI_STATUS EFIAPI efi_driver_controller_name(EFI_COMPONENT_NAME2_PROTOCOL *wtf __unused, EFI_HANDLE device, EFI_HANDLE child, CHAR8 *language, CHAR16 **controller_name)
Look up controller name.
Definition: efi_driver.c:356
void(* stop)(struct efi_device *efidev)
Detach driver from device.
Definition: efi_driver.h:63
void efidev_free(struct efi_device *efidev)
Free EFI device.
Definition: efi_driver.c:92
static int efi_driver_disconnecting
We are currently disconnecting drivers.
Definition: efi_driver.c:49
static struct efi_device * efidev_find(EFI_HANDLE device)
Find EFI device.
Definition: efi_driver.c:105
#define DBGC(...)
Definition: compiler.h:505
#define EFI_OPEN_PROTOCOL_BY_DRIVER
Definition: UefiSpec.h:1358
static LIST_HEAD(efi_devices)
List of controlled EFI devices.
EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2010
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:174
EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME GetControllerName
unsigned short CHAR16
EFI_HANDLE device
EFI device handle.
Definition: efi_driver.h:22
int(* exclude)(EFI_HANDLE device)
Exclude existing drivers.
Definition: efi_driver.h:43
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:46
uint8_t method
Definition: ib_mad.h:15
#define for_each_table_entry_reverse(pointer, table)
Iterate through all entries within a linker table in reverse order.
Definition: tables.h:441
uint16_t device
Device ID.
Definition: ena.h:24
struct device * parent
Bus device.
Definition: device.h:89
#define EFI_OUT_OF_RESOURCES
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:124
int(* supported)(EFI_HANDLE device)
Check if driver supports device.
Definition: efi_driver.h:50
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:137
static EFI_STATUS EFIAPI efi_driver_supported(EFI_DRIVER_BINDING_PROTOCOL *driver __unused, EFI_HANDLE device, EFI_DEVICE_PATH_PROTOCOL *child)
Check to see if driver supports a device.
Definition: efi_driver.c:154
#define list_del(list)
Delete an entry from a list.
Definition: list.h:120
EFI_HANDLE child
EFI child device handle (if present)
Definition: efi_driver.h:24
const wchar_t product_wname[]
Wide-character product name string.
Definition: version.c:86
A hardware device.
Definition: device.h:77
char unsigned long const char unsigned long char ** children
Definition: xenstore.h:26
void * memcpy(void *dest, const void *src, size_t len) __nonnull
FILE_SECBOOT(PERMITTED)
void efi_driver_reconnect_all(void)
Reconnect original EFI drivers to all possible devices.
Definition: efi_driver.c:659
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
char wtf[42]
Authenticator response string.
Definition: mschapv2.h:18
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:432
#define __unused
Declare a variable or data structure as unused.
Definition: compiler.h:573
UEFI Component Name 2 Protocol as defined in the UEFI 2.1 specification.
EFI_COMPONENT_NAME2_GET_DRIVER_NAME GetDriverName
UINT32 Attributes
Definition: UefiSpec.h:1435
struct efi_device * efidev_alloc(EFI_HANDLE device)
Allocate new EFI device.
Definition: efi_driver.c:57
static unsigned int count
Number of entries.
Definition: dwmac.h:225
static EFI_STATUS EFIAPI efi_driver_start(EFI_DRIVER_BINDING_PROTOCOL *driver __unused, EFI_HANDLE device, EFI_DEVICE_PATH_PROTOCOL *child)
Attach driver to device.
Definition: efi_driver.c:202
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition: efi_debug.c:247
unsigned long build_timestamp
Build timestamp.
Definition: version.c:59
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:652
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
#define EFIAPI
static int efi_driver_reconnect(EFI_HANDLE device)
Reconnect original EFI driver.
Definition: efi_driver.c:583
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
EFI Boot Services Table.
Definition: UefiSpec.h:1931
static int efi_driver_handles(int(*method)(EFI_HANDLE handle))
Connect/disconnect EFI driver from all handles.
Definition: efi_driver.c:597
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:36
EFI_HANDLE DriverBindingHandle
The handle on which this instance of the EFI_DRIVER_BINDING_PROTOCOL is installed.
struct list_head siblings
Devices on the same bus.
Definition: device.h:85
void efi_driver_disconnect_all(void)
Disconnect EFI driver from all possible devices.
Definition: efi_driver.c:648
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:386
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces
Definition: UefiSpec.h:2011
#define efi_open(handle, protocol, interface)
Open protocol for ephemeral use.
Definition: efi.h:444
int efi_driver_exclude(EFI_HANDLE device, EFI_GUID *protocol)
Try to disconnect an existing EFI driver.
Definition: efi_driver.c:438
EFI device paths.
UINT64 UINTN
Unsigned value of native width.
#define EFI_NOT_READY
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:121
An EFI device.
Definition: efi_driver.h:18
This protocol provides the services required to determine if a driver supports a given controller.
EFI_GUID efi_device_path_protocol_guid
Device path protocol GUID.
Definition: efi_guid.c:169
Version number.
const char * efi_guid_ntoa(CONST EFI_GUID *guid)
Convert GUID to a printable string.
Definition: efi_guid.c:726
EFI_GUID efi_component_name2_protocol_guid
Component name 2 protocol GUID.
Definition: efi_guid.c:161
#define BUS_TYPE_EFI
EFI bus type.
Definition: device.h:62
EFI_HANDLE ImageHandle
The image handle of the UEFI driver that produced this instance of the EFI_DRIVER_BINDING_PROTOCOL.
EFI_FREE_POOL FreePool
Definition: UefiSpec.h:1950
EFI_OPEN_PROTOCOL_INFORMATION OpenProtocolInformation
Definition: UefiSpec.h:2002
EFI API.
const wchar_t build_wname[]
Wide-character build name string.
Definition: version.c:92
An EFI driver.
Definition: efi_driver.h:34
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:46
unsigned int bus_type
Bus type.
Definition: device.h:25
An EFI saved task priority level.
Definition: efi.h:80
#define DBGC2(...)
Definition: compiler.h:522
static EFI_DRIVER_BINDING_PROTOCOL efi_driver_binding
EFI driver binding protocol.
Definition: efi_driver.c:43
char CHAR8
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:32
struct list_head children
Devices attached to this device.
Definition: device.h:87
#define DBGC2_EFI_PROTOCOLS(...)
Definition: efi.h:358
static EFI_STATUS EFIAPI efi_driver_stop(EFI_DRIVER_BINDING_PROTOCOL *driver __unused, EFI_HANDLE device, UINTN num_children, EFI_HANDLE *children)
Detach driver from device.
Definition: efi_driver.c:284
const char * name
Name.
Definition: efi_driver.h:36
struct device_description desc
Device description.
Definition: device.h:83
#define DBGCP(...)
Definition: compiler.h:539
static int efi_driver_disconnect(EFI_HANDLE device)
Try to disconnect EFI driver.
Definition: efi_driver.c:566
EFI_SYSTEM_TABLE * efi_systab
uint16_t protocol
Protocol ID.
Definition: stp.h:19
EFI_DEVICE_PATH_PROTOCOL * path
EFI device path copy.
Definition: efi_driver.h:26
struct efi_device * efidev_parent(struct device *dev)
Get parent EFI device.
Definition: efi_driver.c:129
static EFI_COMPONENT_NAME2_PROTOCOL efi_wtf
EFI component name protocol.
Definition: efi_driver.c:377
#define EFI_DRIVERS
EFI driver table.
Definition: efi_driver.h:67
struct device dev
Generic device.
Definition: efi_driver.h:20
uint16_t handle
Handle.
Definition: smbios.h:17
EFI_GUID efi_driver_binding_protocol_guid
Driver binding protocol GUID.
Definition: efi_guid.c:209
void efi_restore_tpl(struct efi_saved_tpl *tpl)
Restore task priority level.
Definition: efi_init.c:399
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
String functions.
int efi_driver_install(void)
Install EFI driver.
Definition: efi_driver.c:388
Definition: efi.h:62
EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer
Definition: UefiSpec.h:2008
int(* start)(struct efi_device *efidev)
Attach driver to device.
Definition: efi_driver.h:57
UINT32 Version
The version number of the UEFI driver that produced the EFI_DRIVER_BINDING_PROTOCOL.
int efi_disconnect(EFI_HANDLE device, EFI_HANDLE driver)
Disconnect UEFI driver(s)
Definition: efi_connect.c:90