summaryrefslogtreecommitdiff
path: root/arch/x86/lib/hob.c
blob: dcee29b04cfe409fc889a1ea0ac47f0799788d39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// SPDX-License-Identifier: Intel
/*
 * Copyright (C) 2013, Intel Corporation
 * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
 */

#include <common.h>
#include <asm/hob.h>

/**
 * Returns the next instance of a HOB type from the starting HOB.
 *
 * @type:     HOB type to search
 * @hob_list: A pointer to the HOB list
 *
 * @retval:   A HOB object with matching type; Otherwise NULL.
 */
const struct hob_header *hob_get_next_hob(uint type, const void *hob_list)
{
	const struct hob_header *hdr;

	hdr = hob_list;

	/* Parse the HOB list until end of list or matching type is found */
	while (!end_of_hob(hdr)) {
		if (hdr->type == type)
			return hdr;

		hdr = get_next_hob(hdr);
	}

	return NULL;
}

/**
 * Returns the next instance of the matched GUID HOB from the starting HOB.
 *
 * @guid:     GUID to search
 * @hob_list: A pointer to the HOB list
 *
 * @retval:   A HOB object with matching GUID; Otherwise NULL.
 */
const struct hob_header *hob_get_next_guid_hob(const efi_guid_t *guid,
					       const void *hob_list)
{
	const struct hob_header *hdr;
	struct hob_guid *guid_hob;

	hdr = hob_list;
	while ((hdr = hob_get_next_hob(HOB_TYPE_GUID_EXT, hdr))) {
		guid_hob = (struct hob_guid *)hdr;
		if (!guidcmp(guid, &guid_hob->name))
			break;
		hdr = get_next_hob(hdr);
	}

	return hdr;
}

/**
 * This function retrieves a GUID HOB data buffer and size.
 *
 * @hob_list:      A HOB list pointer.
 * @len:           A pointer to the GUID HOB data buffer length.
 *                 If the GUID HOB is located, the length will be updated.
 * @guid           A pointer to HOB GUID.
 *
 * @retval NULL:   Failed to find the GUID HOB.
 * @retval others: GUID HOB data buffer pointer.
 */
void *hob_get_guid_hob_data(const void *hob_list, u32 *len,
			    const efi_guid_t *guid)
{
	const struct hob_header *guid_hob;

	guid_hob = hob_get_next_guid_hob(guid, hob_list);
	if (!guid_hob)
		return NULL;

	if (len)
		*len = get_guid_hob_data_size(guid_hob);

	return get_guid_hob_data(guid_hob);
}