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
105462 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 "efi.h"
28
#include "efilib.h"
29
#include "efi_driver_utils.h"
30
31
static EFI_GUID DriverBindingProtocolGUID = EFI_DRIVER_BINDING_PROTOCOL_GUID;
32
33
EFI_STATUS
34
connect_controllers(EFI_GUID *filter)
35
{
36
EFI_STATUS status;
37
EFI_HANDLE *handles;
38
UINTN nhandles, i, hsize;
39
40
nhandles = 0;
41
hsize = 0;
42
status = BS->LocateHandle(ByProtocol, filter, NULL,
43
&hsize, NULL);
44
45
if(status != EFI_BUFFER_TOO_SMALL) {
46
return (status);
47
}
48
49
handles = malloc(hsize);
50
if (handles == NULL)
51
return (EFI_OUT_OF_RESOURCES);
52
nhandles = hsize / sizeof(EFI_HANDLE);
53
54
status = BS->LocateHandle(ByProtocol, filter, NULL,
55
&hsize, handles);
56
57
if(EFI_ERROR(status)) {
58
return (status);
59
}
60
61
for(i = 0; i < nhandles; i++) {
62
BS->ConnectController(handles[i], NULL, NULL, true);
63
}
64
65
free(handles);
66
67
return (status);
68
}
69
70
EFI_STATUS
71
install_driver(EFI_DRIVER_BINDING_PROTOCOL *driver)
72
{
73
EFI_STATUS status;
74
75
driver->ImageHandle = IH;
76
driver->DriverBindingHandle = NULL;
77
status = BS->InstallMultipleProtocolInterfaces(
78
&(driver->DriverBindingHandle),
79
&DriverBindingProtocolGUID, driver,
80
NULL);
81
82
if (EFI_ERROR(status)) {
83
printf("Failed to install driver (%ld)!\n",
84
DECODE_ERROR(status));
85
}
86
87
return (status);
88
}
89
90