xref: /aosp_15_r20/external/coreboot/payloads/libpayload/include/cbfs.h (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 
3 #ifndef _CBFS_H_
4 #define _CBFS_H_
5 
6 #include <commonlib/bsd/cb_err.h>
7 #include <commonlib/bsd/cbfs_mdata.h>
8 #include <endian.h>
9 #include <stdbool.h>
10 
11 
12 /**********************************************************************************************
13  *                                  CBFS FILE ACCESS APIs                                     *
14  **********************************************************************************************/
15 
16 /* For documentation look in src/include/cbfs.h file in the main coreboot source tree. */
17 
18 static inline size_t cbfs_load(const char *name, void *buf, size_t size);
19 static inline size_t cbfs_ro_load(const char *name, void *buf, size_t size);
20 static inline size_t cbfs_unverified_area_load(const char *area, const char *name, void *buf,
21 					       size_t size);
22 
23 static inline void *cbfs_map(const char *name, size_t *size_out);
24 static inline void *cbfs_ro_map(const char *name, size_t *size_out);
25 static inline void *cbfs_unverified_area_map(const char *area, const char *name,
26 					     size_t *size_out);
27 
28 void cbfs_unmap(void *mapping);
29 
30 static inline size_t cbfs_get_size(const char *name);
31 static inline size_t cbfs_ro_get_size(const char *name);
32 
33 static inline enum cbfs_type cbfs_get_type(const char *name);
34 static inline enum cbfs_type cbfs_ro_get_type(const char *name);
35 
36 static inline bool cbfs_file_exists(const char *name);
37 static inline bool cbfs_ro_file_exists(const char *name);
38 
39 /**********************************************************************************************
40  *                         INTERNAL HELPERS FOR INLINES, DO NOT USE.                          *
41  **********************************************************************************************/
42 ssize_t _cbfs_boot_lookup(const char *name, bool force_ro, union cbfs_mdata *mdata);
43 
44 void *_cbfs_load(const char *name, void *buf, size_t *size_inout, bool force_ro);
45 
46 void *_cbfs_unverified_area_load(const char *area, const char *name, void *buf,
47 				 size_t *size_inout);
48 
49 /**********************************************************************************************
50  *                                  INLINE IMPLEMENTATIONS                                    *
51  **********************************************************************************************/
52 
cbfs_map(const char * name,size_t * size_out)53 static inline void *cbfs_map(const char *name, size_t *size_out)
54 {
55 	return _cbfs_load(name, NULL, size_out, false);
56 }
57 
cbfs_ro_map(const char * name,size_t * size_out)58 static inline void *cbfs_ro_map(const char *name, size_t *size_out)
59 {
60 	return _cbfs_load(name, NULL, size_out, true);
61 }
62 
cbfs_unverified_area_map(const char * area,const char * name,size_t * size_out)63 static inline void *cbfs_unverified_area_map(const char *area, const char *name,
64 					     size_t *size_out)
65 {
66 	return _cbfs_unverified_area_load(area, name, NULL, size_out);
67 }
68 
cbfs_load(const char * name,void * buf,size_t size)69 static inline size_t cbfs_load(const char *name, void *buf, size_t size)
70 {
71 	if (_cbfs_load(name, buf, &size, false))
72 		return size;
73 	else
74 		return 0;
75 }
76 
cbfs_ro_load(const char * name,void * buf,size_t size)77 static inline size_t cbfs_ro_load(const char *name, void *buf, size_t size)
78 {
79 	if (_cbfs_load(name, buf, &size, true))
80 		return size;
81 	else
82 		return 0;
83 }
84 
cbfs_unverified_area_load(const char * area,const char * name,void * buf,size_t size)85 static inline size_t cbfs_unverified_area_load(const char *area, const char *name, void *buf,
86 					       size_t size)
87 {
88 	if (_cbfs_unverified_area_load(area, name, buf, &size))
89 		return size;
90 	else
91 		return 0;
92 }
93 
cbfs_get_size(const char * name)94 static inline size_t cbfs_get_size(const char *name)
95 {
96 	union cbfs_mdata mdata;
97 	if (_cbfs_boot_lookup(name, false, &mdata) < 0)
98 		return 0;
99 	else
100 		return be32toh(mdata.h.len);
101 }
102 
cbfs_ro_get_size(const char * name)103 static inline size_t cbfs_ro_get_size(const char *name)
104 {
105 	union cbfs_mdata mdata;
106 	if (_cbfs_boot_lookup(name, true, &mdata) < 0)
107 		return 0;
108 	else
109 		return be32toh(mdata.h.len);
110 }
111 
cbfs_get_type(const char * name)112 static inline enum cbfs_type cbfs_get_type(const char *name)
113 {
114 	union cbfs_mdata mdata;
115 	if (_cbfs_boot_lookup(name, false, &mdata) < 0)
116 		return CBFS_TYPE_NULL;
117 	else
118 		return be32toh(mdata.h.type);
119 }
120 
cbfs_ro_get_type(const char * name)121 static inline enum cbfs_type cbfs_ro_get_type(const char *name)
122 {
123 	union cbfs_mdata mdata;
124 	if (_cbfs_boot_lookup(name, true, &mdata) < 0)
125 		return CBFS_TYPE_NULL;
126 	else
127 		return be32toh(mdata.h.type);
128 }
129 
cbfs_file_exists(const char * name)130 static inline bool cbfs_file_exists(const char *name)
131 {
132 	union cbfs_mdata mdata;
133 	return _cbfs_boot_lookup(name, false, &mdata) >= 0;
134 }
135 
cbfs_ro_file_exists(const char * name)136 static inline bool cbfs_ro_file_exists(const char *name)
137 {
138 	union cbfs_mdata mdata;
139 	return _cbfs_boot_lookup(name, true, &mdata) >= 0;
140 }
141 
142 #endif
143