blob: 14e923c6589f0d754db69dc36659234bc24edcdd [file] [log] [blame]
Mario Six2161e552018-07-31 11:44:11 +02001/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * (C) Copyright 2017
4 * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5 */
6
Tom Rini55a297c2021-04-19 16:18:49 -04007#ifndef __SYSINFO_H__
8#define __SYSINFO_H__
9
Max Krummenacher0e226eb2024-01-18 19:10:47 +010010#include <linux/errno.h>
11
Simon Glass3ba929a2020-10-30 21:38:53 -060012struct udevice;
13
Raymond Mao8fe07312024-12-06 14:54:21 -080014#define SYSINFO_CACHE_LVL_MAX 3
15
Mario Six2161e552018-07-31 11:44:11 +020016/*
17 * This uclass encapsulates hardware methods to gather information about a
Simon Glass458b66a2020-11-05 06:32:05 -070018 * sysinfo or a specific device such as hard-wired GPIOs on GPIO expanders,
Mario Six2161e552018-07-31 11:44:11 +020019 * read-only data in flash ICs, or similar.
20 *
21 * The interface offers functions to read the usual standard data types (bool,
22 * int, string) from the device, each of which is identified by a static
23 * numeric ID (which will usually be defined as a enum in a header file).
24 *
Simon Glass458b66a2020-11-05 06:32:05 -070025 * If for example the sysinfo had a read-only serial number flash IC, we could
Mario Six2161e552018-07-31 11:44:11 +020026 * call
27 *
Simon Glass458b66a2020-11-05 06:32:05 -070028 * ret = sysinfo_detect(dev);
Mario Six2161e552018-07-31 11:44:11 +020029 * if (ret) {
Simon Glass458b66a2020-11-05 06:32:05 -070030 * debug("sysinfo device not found.");
Mario Six2161e552018-07-31 11:44:11 +020031 * return ret;
32 * }
33 *
Simon Glass458b66a2020-11-05 06:32:05 -070034 * ret = sysinfo_get_int(dev, ID_SERIAL_NUMBER, &serial);
Mario Six2161e552018-07-31 11:44:11 +020035 * if (ret) {
36 * debug("Error when reading serial number from device.");
37 * return ret;
38 * }
39 *
40 * to read the serial number.
41 */
42
Simon Glasscf67d6d2021-02-04 21:17:23 -070043/** enum sysinfo_id - Standard IDs defined by U-Boot */
44enum sysinfo_id {
Simon Glassff3edc22024-10-31 18:50:23 +010045 SYSID_NONE,
Simon Glasscf67d6d2021-02-04 21:17:23 -070046
Raymond Mao8fe07312024-12-06 14:54:21 -080047 /* BIOS Information (Type 0) */
48 SYSID_SM_BIOS_VENDOR,
49 SYSID_SM_BIOS_VER,
50 SYSID_SM_BIOS_REL_DATE,
51
52 /* System Information (Type 1) */
Simon Glassff3edc22024-10-31 18:50:23 +010053 SYSID_SM_SYSTEM_MANUFACTURER,
54 SYSID_SM_SYSTEM_PRODUCT,
55 SYSID_SM_SYSTEM_VERSION,
56 SYSID_SM_SYSTEM_SERIAL,
Raymond Mao8fe07312024-12-06 14:54:21 -080057 SYSID_SM_SYSTEM_WAKEUP,
Simon Glassff3edc22024-10-31 18:50:23 +010058 SYSID_SM_SYSTEM_SKU,
59 SYSID_SM_SYSTEM_FAMILY,
Baocheng Su5cb083e2025-02-18 10:36:10 +080060 SYSID_SM_SYSTEM_UUID,
Raymond Mao8fe07312024-12-06 14:54:21 -080061
62 /* Baseboard (or Module) Information (Type 2) */
Simon Glassff3edc22024-10-31 18:50:23 +010063 SYSID_SM_BASEBOARD_MANUFACTURER,
64 SYSID_SM_BASEBOARD_PRODUCT,
65 SYSID_SM_BASEBOARD_VERSION,
66 SYSID_SM_BASEBOARD_SERIAL,
67 SYSID_SM_BASEBOARD_ASSET_TAG,
Raymond Mao8fe07312024-12-06 14:54:21 -080068 SYSID_SM_BASEBOARD_FEATURE,
69 SYSID_SM_BASEBOARD_CHASSIS_LOCAT,
70 SYSID_SM_BASEBOARD_TYPE,
71 SYSID_SM_BASEBOARD_OBJS_NUM,
72 SYSID_SM_BASEBOARD_OBJS_HANDLE,
73
74 /* System Enclosure or Chassis (Type 3) */
75 SYSID_SM_ENCLOSURE_MANUFACTURER,
76 SYSID_SM_ENCLOSURE_VERSION,
77 SYSID_SM_ENCLOSURE_SERIAL,
78 SYSID_SM_ENCLOSURE_ASSET_TAG,
79 SYSID_SM_ENCLOSURE_TYPE,
80 SYSID_SM_ENCLOSURE_BOOTUP,
81 SYSID_SM_ENCLOSURE_POW,
82 SYSID_SM_ENCLOSURE_THERMAL,
83 SYSID_SM_ENCLOSURE_SECURITY,
84 SYSID_SM_ENCLOSURE_OEM,
85 SYSID_SM_ENCLOSURE_HEIGHT,
86 SYSID_SM_ENCLOSURE_POWCORE_NUM,
87 SYSID_SM_ENCLOSURE_ELEMENT_CNT,
88 SYSID_SM_ENCLOSURE_ELEMENT_LEN,
89 SYSID_SM_ENCLOSURE_ELEMENTS,
90 SYSID_SM_ENCLOSURE_SKU,
91
92 /* Processor Information (Type 4) */
93 SYSID_SM_PROCESSOR_SOCKET,
94 SYSID_SM_PROCESSOR_TYPE,
95 SYSID_SM_PROCESSOR_MANUFACT,
96 SYSID_SM_PROCESSOR_ID,
97 SYSID_SM_PROCESSOR_VERSION,
98 SYSID_SM_PROCESSOR_VOLTAGE,
99 SYSID_SM_PROCESSOR_EXT_CLOCK,
100 SYSID_SM_PROCESSOR_MAX_SPEED,
101 SYSID_SM_PROCESSOR_CUR_SPEED,
102 SYSID_SM_PROCESSOR_STATUS,
103 SYSID_SM_PROCESSOR_UPGRADE,
104 SYSID_SM_PROCESSOR_SN,
105 SYSID_SM_PROCESSOR_ASSET_TAG,
106 SYSID_SM_PROCESSOR_PN,
107 SYSID_SM_PROCESSOR_CORE_CNT,
108 SYSID_SM_PROCESSOR_CORE_EN,
109 SYSID_SM_PROCESSOR_THREAD_CNT,
110 SYSID_SM_PROCESSOR_CHARA,
111 SYSID_SM_PROCESSOR_FAMILY,
112 SYSID_SM_PROCESSOR_FAMILY2,
113 SYSID_SM_PROCESSOR_CORE_CNT2,
114 SYSID_SM_PROCESSOR_CORE_EN2,
115 SYSID_SM_PROCESSOR_THREAD_CNT2,
116 SYSID_SM_PROCESSOR_THREAD_EN,
117
118 /*
119 * Cache Information (Type 7)
120 * Each of the id should reserve space for up to
121 * SYSINFO_CACHE_LVL_MAX levels of cache
122 */
123 SYSID_SM_CACHE_LEVEL,
124 SYSID_SM_CACHE_HANDLE,
125 SYSID_SM_CACHE_INFO_START,
126 SYSID_SM_CACHE_SOCKET = SYSID_SM_CACHE_INFO_START,
127 SYSID_SM_CACHE_CONFIG =
128 SYSID_SM_CACHE_SOCKET + SYSINFO_CACHE_LVL_MAX,
129 SYSID_SM_CACHE_MAX_SIZE =
130 SYSID_SM_CACHE_CONFIG + SYSINFO_CACHE_LVL_MAX,
131 SYSID_SM_CACHE_INST_SIZE =
132 SYSID_SM_CACHE_MAX_SIZE + SYSINFO_CACHE_LVL_MAX,
133 SYSID_SM_CACHE_SUPSRAM_TYPE =
134 SYSID_SM_CACHE_INST_SIZE + SYSINFO_CACHE_LVL_MAX,
135 SYSID_SM_CACHE_CURSRAM_TYPE =
136 SYSID_SM_CACHE_SUPSRAM_TYPE + SYSINFO_CACHE_LVL_MAX,
137 SYSID_SM_CACHE_SPEED =
138 SYSID_SM_CACHE_CURSRAM_TYPE + SYSINFO_CACHE_LVL_MAX,
139 SYSID_SM_CACHE_ERRCOR_TYPE =
140 SYSID_SM_CACHE_SPEED + SYSINFO_CACHE_LVL_MAX,
141 SYSID_SM_CACHE_SCACHE_TYPE =
142 SYSID_SM_CACHE_ERRCOR_TYPE + SYSINFO_CACHE_LVL_MAX,
143 SYSID_SM_CACHE_ASSOC =
144 SYSID_SM_CACHE_SCACHE_TYPE + SYSINFO_CACHE_LVL_MAX,
145 SYSID_SM_CACHE_MAX_SIZE2 =
146 SYSID_SM_CACHE_ASSOC + SYSINFO_CACHE_LVL_MAX,
147 SYSID_SM_CACHE_INST_SIZE2 =
148 SYSID_SM_CACHE_MAX_SIZE2 + SYSINFO_CACHE_LVL_MAX,
149 SYSID_SM_CACHE_INFO_END =
150 SYSID_SM_CACHE_INST_SIZE2 + SYSINFO_CACHE_LVL_MAX - 1,
Simon Glasscf67d6d2021-02-04 21:17:23 -0700151
Simon Glass43bc5432021-03-21 16:50:06 +1300152 /* For show_board_info() */
Simon Glassff3edc22024-10-31 18:50:23 +0100153 SYSID_BOARD_MODEL,
154 SYSID_BOARD_MANUFACTURER,
155 SYSID_PRIOR_STAGE_VERSION,
156 SYSID_PRIOR_STAGE_DATE,
Simon Glass43bc5432021-03-21 16:50:06 +1300157
Simon Glasscf67d6d2021-02-04 21:17:23 -0700158 /* First value available for downstream/board used */
Simon Glassff3edc22024-10-31 18:50:23 +0100159 SYSID_USER = 0x1000,
Simon Glasscf67d6d2021-02-04 21:17:23 -0700160};
161
Simon Glass458b66a2020-11-05 06:32:05 -0700162struct sysinfo_ops {
Mario Six2161e552018-07-31 11:44:11 +0200163 /**
164 * detect() - Run the hardware info detection procedure for this
165 * device.
166 * @dev: The device containing the information
167 *
168 * This operation might take a long time (e.g. read from EEPROM,
169 * check the presence of a device on a bus etc.), hence this is not
170 * done in the probe() method, but later during operation in this
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400171 * dedicated method. This method will be called before any other
172 * methods.
Mario Six2161e552018-07-31 11:44:11 +0200173 *
174 * Return: 0 if OK, -ve on error.
175 */
176 int (*detect)(struct udevice *dev);
177
178 /**
179 * get_bool() - Read a specific bool data value that describes the
180 * hardware setup.
Simon Glass458b66a2020-11-05 06:32:05 -0700181 * @dev: The sysinfo instance to gather the data.
Mario Six2161e552018-07-31 11:44:11 +0200182 * @id: A unique identifier for the bool value to be read.
183 * @val: Pointer to a buffer that receives the value read.
184 *
185 * Return: 0 if OK, -ve on error.
186 */
187 int (*get_bool)(struct udevice *dev, int id, bool *val);
188
189 /**
190 * get_int() - Read a specific int data value that describes the
191 * hardware setup.
Simon Glass458b66a2020-11-05 06:32:05 -0700192 * @dev: The sysinfo instance to gather the data.
Mario Six2161e552018-07-31 11:44:11 +0200193 * @id: A unique identifier for the int value to be read.
194 * @val: Pointer to a buffer that receives the value read.
195 *
196 * Return: 0 if OK, -ve on error.
197 */
198 int (*get_int)(struct udevice *dev, int id, int *val);
199
200 /**
201 * get_str() - Read a specific string data value that describes the
202 * hardware setup.
Simon Glass458b66a2020-11-05 06:32:05 -0700203 * @dev: The sysinfo instance to gather the data.
Mario Six2161e552018-07-31 11:44:11 +0200204 * @id: A unique identifier for the string value to be read.
205 * @size: The size of the buffer to receive the string data.
206 * @val: Pointer to a buffer that receives the value read.
207 *
208 * Return: 0 if OK, -ve on error.
209 */
210 int (*get_str)(struct udevice *dev, int id, size_t size, char *val);
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200211
212 /**
Raymond Mao860fa8b2024-12-06 14:54:19 -0800213 * get_data() - Read a specific string data value that describes the
214 * hardware setup.
215 * @dev: The sysinfo instance to gather the data.
216 * @id: A unique identifier for the data area to be get.
217 * @data: Pointer to the address of the data area.
218 * @size: Pointer to the size of the data area.
219 *
220 * Return: 0 if OK, -ve on error.
221 */
222 int (*get_data)(struct udevice *dev, int id, void **data, size_t *size);
223
224 /**
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200225 * get_fit_loadable - Get the name of an image to load from FIT
226 * This function can be used to provide the image names based on runtime
227 * detection. A classic use-case would when DTBOs are used to describe
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400228 * additional daughter cards.
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200229 *
Simon Glass458b66a2020-11-05 06:32:05 -0700230 * @dev: The sysinfo instance to gather the data.
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200231 * @index: Index of the image. Starts at 0 and gets incremented
232 * after each call to this function.
233 * @type: The type of image. For example, "fdt" for DTBs
234 * @strp: A pointer to string. Untouched if the function fails
235 *
236 * Return: 0 if OK, -ENOENT if no loadable is available else -ve on
237 * error.
238 */
239 int (*get_fit_loadable)(struct udevice *dev, int index,
240 const char *type, const char **strp);
Mario Six2161e552018-07-31 11:44:11 +0200241};
242
Simon Glass458b66a2020-11-05 06:32:05 -0700243#define sysinfo_get_ops(dev) ((struct sysinfo_ops *)(dev)->driver->ops)
Mario Six2161e552018-07-31 11:44:11 +0200244
Simon Glass10e6f792021-02-04 21:17:21 -0700245#if CONFIG_IS_ENABLED(SYSINFO)
Mario Six2161e552018-07-31 11:44:11 +0200246/**
Simon Glass458b66a2020-11-05 06:32:05 -0700247 * sysinfo_detect() - Run the hardware info detection procedure for this device.
Mario Six2161e552018-07-31 11:44:11 +0200248 *
249 * @dev: The device containing the information
250 *
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400251 * This function must be called before any other accessor function for this
252 * device.
253 *
Mario Six2161e552018-07-31 11:44:11 +0200254 * Return: 0 if OK, -ve on error.
255 */
Simon Glass458b66a2020-11-05 06:32:05 -0700256int sysinfo_detect(struct udevice *dev);
Mario Six2161e552018-07-31 11:44:11 +0200257
258/**
Simon Glass458b66a2020-11-05 06:32:05 -0700259 * sysinfo_get_bool() - Read a specific bool data value that describes the
Mario Six2161e552018-07-31 11:44:11 +0200260 * hardware setup.
Simon Glass458b66a2020-11-05 06:32:05 -0700261 * @dev: The sysinfo instance to gather the data.
Mario Six2161e552018-07-31 11:44:11 +0200262 * @id: A unique identifier for the bool value to be read.
263 * @val: Pointer to a buffer that receives the value read.
264 *
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400265 * Return: 0 if OK, -EPERM if called before sysinfo_detect(), else -ve on
266 * error.
Mario Six2161e552018-07-31 11:44:11 +0200267 */
Simon Glass458b66a2020-11-05 06:32:05 -0700268int sysinfo_get_bool(struct udevice *dev, int id, bool *val);
Mario Six2161e552018-07-31 11:44:11 +0200269
270/**
Simon Glass458b66a2020-11-05 06:32:05 -0700271 * sysinfo_get_int() - Read a specific int data value that describes the
Mario Six2161e552018-07-31 11:44:11 +0200272 * hardware setup.
Simon Glass458b66a2020-11-05 06:32:05 -0700273 * @dev: The sysinfo instance to gather the data.
Mario Six2161e552018-07-31 11:44:11 +0200274 * @id: A unique identifier for the int value to be read.
275 * @val: Pointer to a buffer that receives the value read.
276 *
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400277 * Return: 0 if OK, -EPERM if called before sysinfo_detect(), else -ve on
278 * error.
Mario Six2161e552018-07-31 11:44:11 +0200279 */
Simon Glass458b66a2020-11-05 06:32:05 -0700280int sysinfo_get_int(struct udevice *dev, int id, int *val);
Mario Six2161e552018-07-31 11:44:11 +0200281
282/**
Simon Glass458b66a2020-11-05 06:32:05 -0700283 * sysinfo_get_str() - Read a specific string data value that describes the
Mario Six2161e552018-07-31 11:44:11 +0200284 * hardware setup.
Simon Glass458b66a2020-11-05 06:32:05 -0700285 * @dev: The sysinfo instance to gather the data.
Mario Six2161e552018-07-31 11:44:11 +0200286 * @id: A unique identifier for the string value to be read.
287 * @size: The size of the buffer to receive the string data.
288 * @val: Pointer to a buffer that receives the value read.
289 *
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400290 * Return: 0 if OK, -EPERM if called before sysinfo_detect(), else -ve on
291 * error.
Mario Six2161e552018-07-31 11:44:11 +0200292 */
Simon Glass458b66a2020-11-05 06:32:05 -0700293int sysinfo_get_str(struct udevice *dev, int id, size_t size, char *val);
Mario Six2161e552018-07-31 11:44:11 +0200294
295/**
Raymond Mao860fa8b2024-12-06 14:54:19 -0800296 * sysinfo_get_data() - Get a data area from the platform.
297 * @dev: The sysinfo instance to gather the data.
298 * @id: A unique identifier for the data area to be get.
299 * @data: Pointer to the address of the data area.
300 * @size: Pointer to the size of the data area.
301 *
302 * Return: 0 if OK, -EPERM if called before sysinfo_detect(), else -ve on
303 * error.
304 */
305int sysinfo_get_data(struct udevice *dev, int id, void **data, size_t *size);
306
307/**
Simon Glass458b66a2020-11-05 06:32:05 -0700308 * sysinfo_get() - Return the sysinfo device for the sysinfo in question.
309 * @devp: Pointer to structure to receive the sysinfo device.
Mario Six2161e552018-07-31 11:44:11 +0200310 *
Simon Glass458b66a2020-11-05 06:32:05 -0700311 * Since there can only be at most one sysinfo instance, the API can supply a
Mario Six2161e552018-07-31 11:44:11 +0200312 * function that returns the unique device. This is especially useful for use
Simon Glass458b66a2020-11-05 06:32:05 -0700313 * in sysinfo files.
Mario Six2161e552018-07-31 11:44:11 +0200314 *
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400315 * Return: 0 if OK, -EPERM if called before sysinfo_detect(), else -ve on
316 * error.
Mario Six2161e552018-07-31 11:44:11 +0200317 */
Simon Glass458b66a2020-11-05 06:32:05 -0700318int sysinfo_get(struct udevice **devp);
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200319
320/**
Simon Glass458b66a2020-11-05 06:32:05 -0700321 * sysinfo_get_fit_loadable - Get the name of an image to load from FIT
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200322 * This function can be used to provide the image names based on runtime
323 * detection. A classic use-case would when DTBOs are used to describe
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400324 * additional daughter cards.
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200325 *
Simon Glass458b66a2020-11-05 06:32:05 -0700326 * @dev: The sysinfo instance to gather the data.
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200327 * @index: Index of the image. Starts at 0 and gets incremented
328 * after each call to this function.
329 * @type: The type of image. For example, "fdt" for DTBs
330 * @strp: A pointer to string. Untouched if the function fails
331 *
332 *
Sean Anderson6ccf10a2021-04-20 10:50:56 -0400333 * Return: 0 if OK, -EPERM if called before sysinfo_detect(), -ENOENT if no
334 * loadable is available else -ve on error.
Jean-Jacques Hiblot7815fc12019-10-22 16:39:19 +0200335 */
Simon Glass458b66a2020-11-05 06:32:05 -0700336int sysinfo_get_fit_loadable(struct udevice *dev, int index, const char *type,
337 const char **strp);
Jean-Jacques Hiblot98823aa2019-10-22 16:39:20 +0200338
339#else
340
Simon Glass458b66a2020-11-05 06:32:05 -0700341static inline int sysinfo_detect(struct udevice *dev)
Jean-Jacques Hiblot98823aa2019-10-22 16:39:20 +0200342{
343 return -ENOSYS;
344}
345
Simon Glass458b66a2020-11-05 06:32:05 -0700346static inline int sysinfo_get_bool(struct udevice *dev, int id, bool *val)
Jean-Jacques Hiblot98823aa2019-10-22 16:39:20 +0200347{
348 return -ENOSYS;
349}
350
Simon Glass458b66a2020-11-05 06:32:05 -0700351static inline int sysinfo_get_int(struct udevice *dev, int id, int *val)
Jean-Jacques Hiblot98823aa2019-10-22 16:39:20 +0200352{
353 return -ENOSYS;
354}
355
Simon Glass458b66a2020-11-05 06:32:05 -0700356static inline int sysinfo_get_str(struct udevice *dev, int id, size_t size,
357 char *val)
Jean-Jacques Hiblot98823aa2019-10-22 16:39:20 +0200358{
359 return -ENOSYS;
360}
361
Raymond Mao860fa8b2024-12-06 14:54:19 -0800362static inline int sysinfo_get_data(struct udevice *dev, int id, void **data,
363 size_t *size)
364{
365 return -ENOSYS;
366}
367
Simon Glass458b66a2020-11-05 06:32:05 -0700368static inline int sysinfo_get(struct udevice **devp)
Jean-Jacques Hiblot98823aa2019-10-22 16:39:20 +0200369{
370 return -ENOSYS;
371}
372
Simon Glass458b66a2020-11-05 06:32:05 -0700373static inline int sysinfo_get_fit_loadable(struct udevice *dev, int index,
374 const char *type, const char **strp)
Jean-Jacques Hiblot98823aa2019-10-22 16:39:20 +0200375{
376 return -ENOSYS;
377}
378
379#endif
Tom Rini55a297c2021-04-19 16:18:49 -0400380#endif