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 static struct efi_device_path * EFIAPI create_device_node(
74 	uint8_t node_type, uint8_t node_sub_type, uint16_t node_length)
75 {
76 	EFI_ENTRY("%u, %u, %u", node_type, node_sub_type, node_length);
77 	return EFI_EXIT(NULL);
78 }
79 
80 const struct efi_device_path_utilities_protocol efi_device_path_utilities = {
81 	.get_device_path_size = get_device_path_size,
82 	.duplicate_device_path = duplicate_device_path,
83 	.append_device_path = append_device_path,
84 	.append_device_node = append_device_node,
85 	.append_device_path_instance = append_device_path_instance,
86 	.get_next_device_path_instance = get_next_device_path_instance,
87 	.is_device_path_multi_instance = is_device_path_multi_instance,
88 	.create_device_node = create_device_node,
89 };
90