]> git.sur5r.net Git - u-boot/blob - lib/efi_loader/efi_device_path_utilities.c
e73188b242ccd6bc8ae68147f289ef0c954e720d
[u-boot] / lib / efi_loader / efi_device_path_utilities.c
1 /*
2  *  EFI device path interface
3  *
4  *  Copyright (c) 2017 Leif Lindholm
5  *
6  *  SPDX-License-Identifier:     GPL-2.0+
7  */
8
9 #include <common.h>
10 #include <efi_loader.h>
11
12 const efi_guid_t efi_guid_device_path_utilities_protocol =
13                 EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID;
14
15 static efi_uintn_t EFIAPI get_device_path_size(
16         const struct efi_device_path *device_path)
17 {
18         efi_uintn_t sz = 0;
19
20         EFI_ENTRY("%p", device_path);
21         /* size includes the END node: */
22         if (device_path)
23                 sz = efi_dp_size(device_path) + sizeof(struct efi_device_path);
24         return EFI_EXIT(sz);
25 }
26
27 static struct efi_device_path * EFIAPI duplicate_device_path(
28         const struct efi_device_path *device_path)
29 {
30         EFI_ENTRY("%p", device_path);
31         return EFI_EXIT(efi_dp_dup(device_path));
32 }
33
34 static struct efi_device_path * EFIAPI append_device_path(
35         const struct efi_device_path *src1,
36         const struct efi_device_path *src2)
37 {
38         EFI_ENTRY("%p, %p", src1, src2);
39         return EFI_EXIT(efi_dp_append(src1, src2));
40 }
41
42 static struct efi_device_path * EFIAPI append_device_node(
43         const struct efi_device_path *device_path,
44         const struct efi_device_path *device_node)
45 {
46         EFI_ENTRY("%p, %p", device_path, device_node);
47         return EFI_EXIT(efi_dp_append_node(device_path, device_node));
48 }
49
50 static struct efi_device_path * EFIAPI append_device_path_instance(
51         const struct efi_device_path *device_path,
52         const struct efi_device_path *device_path_instance)
53 {
54         EFI_ENTRY("%p, %p", device_path, device_path_instance);
55         return EFI_EXIT(NULL);
56 }
57
58 static struct efi_device_path * EFIAPI get_next_device_path_instance(
59         struct efi_device_path **device_path_instance,
60         efi_uintn_t *device_path_instance_size)
61 {
62         EFI_ENTRY("%p, %p", device_path_instance, device_path_instance_size);
63         return EFI_EXIT(NULL);
64 }
65
66 static bool EFIAPI is_device_path_multi_instance(
67         const struct efi_device_path *device_path)
68 {
69         EFI_ENTRY("%p", device_path);
70         return EFI_EXIT(false);
71 }
72
73 /*
74  * Create device node.
75  *
76  * This function implements the CreateDeviceNode service of the device path
77  * utilities protocol.
78  *
79  * See the Unified Extensible Firmware Interface (UEFI) specification
80  * for details.
81  *
82  * @node_type           node type
83  * @node_sub_type       node sub type
84  * @node_length         node length
85  * @return              device path node
86  */
87 static struct efi_device_path * EFIAPI create_device_node(
88         uint8_t node_type, uint8_t node_sub_type, uint16_t node_length)
89 {
90         EFI_ENTRY("%u, %u, %u", node_type, node_sub_type, node_length);
91         return EFI_EXIT(efi_dp_create_device_node(node_type, node_sub_type,
92                         node_length));
93 }
94
95 const struct efi_device_path_utilities_protocol efi_device_path_utilities = {
96         .get_device_path_size = get_device_path_size,
97         .duplicate_device_path = duplicate_device_path,
98         .append_device_path = append_device_path,
99         .append_device_node = append_device_node,
100         .append_device_path_instance = append_device_path_instance,
101         .get_next_device_path_instance = get_next_device_path_instance,
102         .is_device_path_multi_instance = is_device_path_multi_instance,
103         .create_device_node = create_device_node,
104 };