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