|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 2011 Michael Brown <[email protected]>. ! 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., 675 Mass Ave, Cambridge, MA 02139, USA. ! 17: */ ! 18: ! 19: FILE_LICENCE ( GPL2_OR_LATER ); ! 20: ! 21: #include <stddef.h> ! 22: #include <stdio.h> ! 23: #include <ipxe/efi/efi.h> ! 24: #include <ipxe/efi/Protocol/DriverBinding.h> ! 25: #include <ipxe/efi/Protocol/ComponentName2.h> ! 26: #include <ipxe/efi/efi_strings.h> ! 27: #include <ipxe/efi/efi_driver.h> ! 28: #include <config/general.h> ! 29: ! 30: /** @file ! 31: * ! 32: * EFI driver interface ! 33: * ! 34: */ ! 35: ! 36: /** EFI driver binding protocol GUID */ ! 37: static EFI_GUID efi_driver_binding_protocol_guid ! 38: = EFI_DRIVER_BINDING_PROTOCOL_GUID; ! 39: ! 40: /** EFI component name protocol GUID */ ! 41: static EFI_GUID efi_component_name2_protocol_guid ! 42: = EFI_COMPONENT_NAME2_PROTOCOL_GUID; ! 43: ! 44: /** ! 45: * Find end of device path ! 46: * ! 47: * @v path Path to device ! 48: * @ret path_end End of device path ! 49: */ ! 50: EFI_DEVICE_PATH_PROTOCOL * efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path ) { ! 51: ! 52: while ( path->Type != END_DEVICE_PATH_TYPE ) { ! 53: path = ( ( ( void * ) path ) + ! 54: /* There's this amazing new-fangled thing known as ! 55: * a UINT16, but who wants to use one of those? */ ! 56: ( ( path->Length[1] << 8 ) | path->Length[0] ) ); ! 57: } ! 58: ! 59: return path; ! 60: } ! 61: ! 62: /** ! 63: * Look up driver name ! 64: * ! 65: * @v wtf Component name protocol ! 66: * @v language Language to use ! 67: * @v driver_name Driver name to fill in ! 68: * @ret efirc EFI status code ! 69: */ ! 70: static EFI_STATUS EFIAPI ! 71: efi_driver_get_driver_name ( EFI_COMPONENT_NAME2_PROTOCOL *wtf, ! 72: CHAR8 *language __unused, CHAR16 **driver_name ) { ! 73: struct efi_driver *efidrv = ! 74: container_of ( wtf, struct efi_driver, wtf ); ! 75: ! 76: *driver_name = efidrv->wname; ! 77: return 0; ! 78: } ! 79: ! 80: /** ! 81: * Look up controller name ! 82: * ! 83: * @v wtf Component name protocol ! 84: * @v device Device ! 85: * @v child Child device, or NULL ! 86: * @v language Language to use ! 87: * @v driver_name Device name to fill in ! 88: * @ret efirc EFI status code ! 89: */ ! 90: static EFI_STATUS EFIAPI ! 91: efi_driver_get_controller_name ( EFI_COMPONENT_NAME2_PROTOCOL *wtf __unused, ! 92: EFI_HANDLE device __unused, ! 93: EFI_HANDLE child __unused, ! 94: CHAR8 *language __unused, ! 95: CHAR16 **controller_name __unused ) { ! 96: ! 97: /* Just let EFI use the default Device Path Name */ ! 98: return EFI_UNSUPPORTED; ! 99: } ! 100: ! 101: /** ! 102: * Install EFI driver ! 103: * ! 104: * @v efidrv EFI driver ! 105: * @ret efirc EFI status code ! 106: */ ! 107: EFI_STATUS efi_driver_install ( struct efi_driver *efidrv ) { ! 108: EFI_BOOT_SERVICES *bs = efi_systab->BootServices; ! 109: EFI_DRIVER_BINDING_PROTOCOL *driver = &efidrv->driver; ! 110: EFI_COMPONENT_NAME2_PROTOCOL *wtf = &efidrv->wtf; ! 111: EFI_STATUS efirc; ! 112: ! 113: /* Configure driver binding protocol */ ! 114: driver->ImageHandle = efi_image_handle; ! 115: ! 116: /* Configure component name protocol */ ! 117: wtf->GetDriverName = efi_driver_get_driver_name; ! 118: wtf->GetControllerName = efi_driver_get_controller_name; ! 119: wtf->SupportedLanguages = "en"; ! 120: ! 121: /* Fill in driver name */ ! 122: efi_snprintf ( efidrv->wname, ! 123: ( sizeof ( efidrv->wname ) / ! 124: sizeof ( efidrv->wname[0] ) ), ! 125: PRODUCT_SHORT_NAME " - %s", efidrv->name ); ! 126: ! 127: /* Install driver */ ! 128: if ( ( efirc = bs->InstallMultipleProtocolInterfaces ( ! 129: &driver->DriverBindingHandle, ! 130: &efi_driver_binding_protocol_guid, driver, ! 131: &efi_component_name2_protocol_guid, wtf, ! 132: NULL ) ) != 0 ) { ! 133: DBGC ( efidrv, "EFIDRV %s could not install protocol: %s\n", ! 134: efidrv->name, efi_strerror ( efirc ) ); ! 135: return efirc; ! 136: } ! 137: ! 138: DBGC ( efidrv, "EFIDRV %s installed\n", efidrv->name ); ! 139: return 0; ! 140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.