1322038Simp/*- 2322038Simp * Copyright (c) 2017 Eric McCorkle 3322038Simp * All rights reserved. 4322038Simp * 5322038Simp * Redistribution and use in source and binary forms, with or without 6322038Simp * modification, are permitted provided that the following conditions 7322038Simp * are met: 8322038Simp * 1. Redistributions of source code must retain the above copyright 9322038Simp * notice, this list of conditions and the following disclaimer. 10322038Simp * 2. Redistributions in binary form must reproduce the above copyright 11322038Simp * notice, this list of conditions and the following disclaimer in the 12322038Simp * documentation and/or other materials provided with the distribution. 13322038Simp * 14322038Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15322038Simp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16322038Simp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17322038Simp * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18322038Simp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19322038Simp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20322038Simp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21322038Simp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22322038Simp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23322038Simp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24322038Simp * SUCH DAMAGE. 25322038Simp * 26322038Simp * $FreeBSD: stable/11/stand/efi/libefi/efi_driver_utils.c 329114 2018-02-11 02:27:50Z kevans $ 27322038Simp */ 28322038Simp 29322038Simp#include <stdbool.h> 30322038Simp 31322038Simp#include <efi.h> 32322038Simp#include <efilib.h> 33322038Simp 34322038Simp#include "efi_driver_utils.h" 35322038Simp 36322038Simpstatic EFI_GUID DriverBindingProtocolGUID = DRIVER_BINDING_PROTOCOL; 37322038Simp 38322038SimpEFI_STATUS 39322038Simpconnect_controllers(EFI_GUID *filter) 40322038Simp{ 41322038Simp EFI_STATUS status; 42322038Simp EFI_HANDLE *handles; 43322038Simp UINTN nhandles, i, hsize; 44322038Simp 45322038Simp nhandles = 0; 46322038Simp hsize = 0; 47322038Simp status = BS->LocateHandle(ByProtocol, filter, NULL, 48322038Simp &hsize, NULL); 49322038Simp 50322038Simp if(status != EFI_BUFFER_TOO_SMALL) { 51322038Simp return (status); 52322038Simp } 53322038Simp 54322038Simp handles = malloc(hsize); 55322038Simp nhandles = hsize / sizeof(EFI_HANDLE); 56322038Simp 57322038Simp status = BS->LocateHandle(ByProtocol, filter, NULL, 58322038Simp &hsize, handles); 59322038Simp 60322038Simp if(EFI_ERROR(status)) { 61322038Simp return (status); 62322038Simp } 63322038Simp 64322038Simp for(i = 0; i < nhandles; i++) { 65322038Simp BS->ConnectController(handles[i], NULL, NULL, true); 66322038Simp } 67322038Simp 68322038Simp free(handles); 69322038Simp 70322038Simp return (status); 71322038Simp} 72322038Simp 73322038SimpEFI_STATUS 74322038Simpinstall_driver(EFI_DRIVER_BINDING *driver) 75322038Simp{ 76322038Simp EFI_STATUS status; 77322038Simp 78322038Simp driver->ImageHandle = IH; 79322038Simp driver->DriverBindingHandle = NULL; 80322038Simp status = BS->InstallMultipleProtocolInterfaces( 81322038Simp &(driver->DriverBindingHandle), 82322038Simp &DriverBindingProtocolGUID, driver, 83322038Simp NULL); 84322038Simp 85322038Simp if (EFI_ERROR(status)) { 86322038Simp printf("Failed to install driver (%ld)!\n", 87322038Simp EFI_ERROR_CODE(status)); 88322038Simp } 89322038Simp 90322038Simp return (status); 91322038Simp} 92