1 // SPDX-License-Identifier: GPL-2.0+
2 
3 #include <dm.h>
4 #include <init.h>
5 #include <sysinfo.h>
6 #include <asm/global_data.h>
7 #include <linux/libfdt.h>
8 #include <linux/compiler.h>
9 
10 DECLARE_GLOBAL_DATA_PTR;
11 
checkboard(void)12 int __weak checkboard(void)
13 {
14 	return 0;
15 }
16 
17 static const struct to_show {
18 	const char *name;
19 	enum sysinfo_id id;
20 } to_show[] = {
21 	{ "Manufacturer", SYSID_BOARD_MANUFACTURER},
22 	{ "Prior-stage version", SYSID_PRIOR_STAGE_VERSION },
23 	{ "Prior-stage date", SYSID_PRIOR_STAGE_DATE },
24 	{ /* sentinel */ }
25 };
26 
try_sysinfo(void)27 static int try_sysinfo(void)
28 {
29 	struct udevice *dev;
30 	char str[80];
31 	int ret;
32 
33 	/* This might provide more detail */
34 	ret = sysinfo_get(&dev);
35 	if (ret)
36 		return ret;
37 
38 	ret = sysinfo_detect(dev);
39 	if (ret)
40 		return ret;
41 
42 	ret = sysinfo_get_str(dev, SYSID_BOARD_MODEL, sizeof(str), str);
43 	if (ret)
44 		return ret;
45 	printf("Model: %s\n", str);
46 
47 	if (IS_ENABLED(CONFIG_SYSINFO_EXTRA)) {
48 		const struct to_show *item;
49 
50 		for (item = to_show; item->id; item++) {
51 			ret = sysinfo_get_str(dev, item->id, sizeof(str), str);
52 			if (!ret)
53 				printf("%s: %s\n", item->name, str);
54 		}
55 	}
56 
57 	return 0;
58 }
59 
show_board_info(void)60 int show_board_info(void)
61 {
62 	if (IS_ENABLED(CONFIG_OF_CONTROL)) {
63 		int ret = -ENOSYS;
64 
65 		if (IS_ENABLED(CONFIG_SYSINFO))
66 			ret = try_sysinfo();
67 
68 		/* Fail back to the main 'model' if available */
69 		if (ret) {
70 			const char *model;
71 
72 			model = fdt_getprop(gd->fdt_blob, 0, "model", NULL);
73 			if (model)
74 				printf("Model: %s\n", model);
75 		}
76 	}
77 
78 	return checkboard();
79 }
80