Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/efi/libefi/efi_driver_utils.c
34859 views
1
/*-
2
* Copyright (c) 2017 Eric McCorkle
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#include <stdbool.h>
28
29
#include <efi.h>
30
#include <efilib.h>
31
32
#include "efi_driver_utils.h"
33
34
static EFI_GUID DriverBindingProtocolGUID = DRIVER_BINDING_PROTOCOL;
35
36
EFI_STATUS
37
connect_controllers(EFI_GUID *filter)
38
{
39
EFI_STATUS status;
40
EFI_HANDLE *handles;
41
UINTN nhandles, i, hsize;
42
43
nhandles = 0;
44
hsize = 0;
45
status = BS->LocateHandle(ByProtocol, filter, NULL,
46
&hsize, NULL);
47
48
if(status != EFI_BUFFER_TOO_SMALL) {
49
return (status);
50
}
51
52
handles = malloc(hsize);
53
if (handles == NULL)
54
return (EFI_OUT_OF_RESOURCES);
55
nhandles = hsize / sizeof(EFI_HANDLE);
56
57
status = BS->LocateHandle(ByProtocol, filter, NULL,
58
&hsize, handles);
59
60
if(EFI_ERROR(status)) {
61
return (status);
62
}
63
64
for(i = 0; i < nhandles; i++) {
65
BS->ConnectController(handles[i], NULL, NULL, true);
66
}
67
68
free(handles);
69
70
return (status);
71
}
72
73
EFI_STATUS
74
install_driver(EFI_DRIVER_BINDING *driver)
75
{
76
EFI_STATUS status;
77
78
driver->ImageHandle = IH;
79
driver->DriverBindingHandle = NULL;
80
status = BS->InstallMultipleProtocolInterfaces(
81
&(driver->DriverBindingHandle),
82
&DriverBindingProtocolGUID, driver,
83
NULL);
84
85
if (EFI_ERROR(status)) {
86
printf("Failed to install driver (%ld)!\n",
87
EFI_ERROR_CODE(status));
88
}
89
90
return (status);
91
}
92
93