xref: /rk3399_rockchip-uboot/cmd/atags.c (revision e44e77a648805130e541c8dd46252464d1d9c2c0)
1 // SPDX-License-Identifier:     GPL-2.0+
2 /*
3  * (C) Copyright 2021 Rockchip Electronics Co., Ltd.
4  *
5  */
6 
7 #include <common.h>
8 #include <asm/arch/rk_atags.h>
9 #if CONFIG_IS_ENABLED(TINY_FRAMEWORK)
10 #include <debug_uart.h>
11 #endif
12 
atags_stat(void)13 static void atags_stat(void)
14 {
15 	u32 start = ATAGS_PHYS_BASE, end = ATAGS_PHYS_BASE + ATAGS_SIZE;
16 	u32 in_use = 0, in_available = 0;
17 	struct tag *t;
18 
19 	if (!atags_is_available())
20 		return;
21 
22 	for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) {
23 		if (atags_overflow(t))
24 			return;
25 
26 		if (atags_bad_magic(t->hdr.magic))
27 			return;
28 
29 		in_use += (t->hdr.size << 2);
30 	}
31 
32 	in_available = ATAGS_SIZE - in_use;
33 
34 	printf("ATAGS state:\n");
35 	printf("              addr = 0x%08x ~ 0x%08x\n", start, end);
36 	printf("        Total size = 0x%08x\n", ATAGS_SIZE);
37 	printf("       in use size = 0x%08x\n", in_use);
38 	printf("    available size = 0x%08x\n", in_available);
39 }
40 
atags_print_tag(struct tag * t)41 static void atags_print_tag(struct tag *t)
42 {
43 	u32 i;
44 
45 	if (!t)
46 		return;
47 
48 	switch (t->hdr.magic) {
49 	case ATAG_SERIAL:
50 		printf("[serial]:\n");
51 		printf("     magic = 0x%x\n", t->hdr.magic);
52 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
53 		printf("   version = 0x%x\n", t->u.serial.version);
54 		printf("    enable = 0x%x\n", t->u.serial.enable);
55 		printf("      addr = 0x%llx\n", t->u.serial.addr);
56 		printf("  baudrate = %d\n", t->u.serial.baudrate);
57 		printf("    m_mode = 0x%x\n", t->u.serial.m_mode);
58 		printf("        id = 0x%x\n", t->u.serial.id);
59 		for (i = 0; i < ARRAY_SIZE(t->u.serial.reserved); i++)
60 			printf("    res[%d] = 0x%x\n", i, t->u.serial.reserved[i]);
61 		printf("      hash = 0x%x\n", t->u.serial.hash);
62 		break;
63 	case ATAG_BOOTDEV:
64 		printf("[bootdev]:\n");
65 		printf("     magic = 0x%x\n", t->hdr.magic);
66 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
67 		printf("   version = 0x%x\n", t->u.bootdev.version);
68 		printf("   devtype = 0x%x\n", t->u.bootdev.devtype);
69 		printf("    devnum = 0x%x\n", t->u.bootdev.devnum);
70 		printf("      mode = 0x%x\n", t->u.bootdev.mode);
71 		for (i = 0; i < ARRAY_SIZE(t->u.bootdev.reserved); i++)
72 			printf("    res[%d] = 0x%x\n",
73 			       i, t->u.bootdev.reserved[i]);
74 		printf("      hash = 0x%x\n", t->u.bootdev.hash);
75 		break;
76 	case ATAG_TOS_MEM:
77 		printf("[tos_mem]:\n");
78 		printf("     magic = 0x%x\n", t->hdr.magic);
79 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
80 		printf("   version = 0x%x\n", t->u.tos_mem.version);
81 		printf("   tee_mem:\n");
82 		printf("            name = %s\n", t->u.tos_mem.tee_mem.name);
83 		printf("        phy_addr = 0x%llx\n", t->u.tos_mem.tee_mem.phy_addr);
84 		printf("            size = 0x%x\n", t->u.tos_mem.tee_mem.size);
85 		printf("           flags = 0x%x\n", t->u.tos_mem.tee_mem.flags);
86 		printf("   drm_mem:\n");
87 		printf("            name = %s\n", t->u.tos_mem.drm_mem.name);
88 		printf("        phy_addr = 0x%llx\n", t->u.tos_mem.drm_mem.phy_addr);
89 		printf("            size = 0x%x\n", t->u.tos_mem.drm_mem.size);
90 		printf("           flags = 0x%x\n", t->u.tos_mem.drm_mem.flags);
91 		for (i = 0; i < ARRAY_SIZE(t->u.tos_mem.reserved); i++)
92 			printf("   res[%d] = 0x%llx\n", i, t->u.tos_mem.reserved[i]);
93 		printf("     res1 = 0x%x\n", t->u.tos_mem.reserved1);
94 		printf("     hash = 0x%x\n", t->u.tos_mem.hash);
95 		break;
96 	case ATAG_DDR_MEM:
97 		printf("[ddr_mem]:\n");
98 		printf("     magic = 0x%x\n", t->hdr.magic);
99 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
100 		printf("     count = 0x%x\n", t->u.ddr_mem.count);
101 		printf("   version = 0x%x\n", t->u.ddr_mem.version);
102 		for (i = 0; i < ARRAY_SIZE(t->u.ddr_mem.bank); i++)
103 			printf("  bank[%d] = 0x%llx\n", i, t->u.ddr_mem.bank[i]);
104 		printf("     flags = 0x%x\n", t->u.ddr_mem.flags);
105 		for (i = 0; i < ARRAY_SIZE(t->u.ddr_mem.data); i++)
106 			printf("  data[%d] = 0x%x\n", i, t->u.ddr_mem.data[i]);
107 		printf("      hash = 0x%x\n", t->u.ddr_mem.hash);
108 		break;
109 	case ATAG_RAM_PARTITION:
110 		printf("[ram_partition]:\n");
111 		printf("     magic = 0x%x\n", t->hdr.magic);
112 		printf("   version = 0x%x\n", t->u.ram_part.version);
113 		printf("     count = 0x%x\n", t->u.ram_part.count);
114 		for (i = 0; i < ARRAY_SIZE(t->u.ram_part.reserved); i++)
115 			printf("    res[%d] = 0x%x\n", i, t->u.ram_part.reserved[i]);
116 
117 		printf("    Part:  Name       Start Addr      Size\t\n");
118 		for (i = 0; i < ARRAY_SIZE(t->u.ram_part.part); i++)
119 			printf("%16s      0x%08llx      0x%08llx\n",
120 			       t->u.ram_part.part[i].name,
121 			       t->u.ram_part.part[i].start,
122 			       t->u.ram_part.part[i].size);
123 		for (i = 0; i < ARRAY_SIZE(t->u.ram_part.reserved1); i++)
124 			printf("   res1[%d] = 0x%x\n", i, t->u.ram_part.reserved1[i]);
125 		printf("      hash = 0x%x\n", t->u.ram_part.hash);
126 		break;
127 	case ATAG_ATF_MEM:
128 		printf("[atf_mem]:\n");
129 		printf("     magic = 0x%x\n", t->hdr.magic);
130 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
131 		printf("   version = 0x%x\n", t->u.atf_mem.version);
132 		printf("  phy_addr = 0x%llx\n", t->u.atf_mem.phy_addr);
133 		printf("      size = 0x%x\n", t->u.atf_mem.size);
134 		for (i = 0; i < ARRAY_SIZE(t->u.atf_mem.reserved); i++)
135 			printf("    res[%d] = 0x%x\n", i, t->u.atf_mem.reserved[i]);
136 		printf("      hash = 0x%x\n", t->u.atf_mem.hash);
137 		break;
138 	case ATAG_PUB_KEY:
139 		printf("[pub_key_mem]:\n");
140 		printf("     magic = 0x%x\n", t->hdr.magic);
141 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
142 		printf("   version = 0x%x\n", t->u.pub_key.version);
143 		printf("      hash = 0x%x\n", t->u.pub_key.hash);
144 		break;
145 	case ATAG_SOC_INFO:
146 		printf("[soc_info]:\n");
147 		printf("     magic = 0x%x\n", t->hdr.magic);
148 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
149 		printf("   version = 0x%x\n", t->u.soc.version);
150 		printf("      name = 0x%x\n", t->u.soc.name);
151 		printf("     flags = 0x%x\n", t->u.soc.flags);
152 		for (i = 0; i < ARRAY_SIZE(t->u.soc.reserved); i++)
153 			printf("    res[%d] = 0x%x\n", i, t->u.soc.reserved[i]);
154 		printf("      hash = 0x%x\n", t->u.soc.hash);
155 		break;
156 	case ATAG_BOOT1_PARAM:
157 		printf("[boot1 param]:\n");
158 		printf("     magic = 0x%x\n", t->hdr.magic);
159 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
160 		printf("   version = 0x%x\n", t->u.boot1p.version);
161 		for (i = 0; i < ARRAY_SIZE(t->u.boot1p.param); i++)
162 			printf("  param[%d] = 0x%x\n", i, t->u.boot1p.param[i]);
163 		for (i = 0; i < ARRAY_SIZE(t->u.boot1p.reserved); i++)
164 			printf("    res[%d] = 0x%x\n", i, t->u.boot1p.reserved[i]);
165 		printf("      hash = 0x%x\n", t->u.boot1p.hash);
166 		break;
167 	case ATAG_CORE:
168 		printf("[core]:\n");
169 		printf("     magic = 0x%x\n", t->hdr.magic);
170 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
171 		printf("     flags = 0x%x\n", t->u.core.flags);
172 		printf("  pagesize = 0x%x\n", t->u.core.pagesize);
173 		printf("   rootdev = 0x%x\n", t->u.core.rootdev);
174 		break;
175 	case ATAG_PSTORE:
176 		printf("[pstore]:\n");
177 		printf("     magic = 0x%x\n", t->hdr.magic);
178 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
179 		for (i = 0; i < ARRAY_SIZE(t->u.pstore.buf); i++)
180 			printf("  table[%d] = 0x%x@0x%x\n", i, t->u.pstore.buf[i].size, t->u.pstore.buf[i].addr);
181 		break;
182 	case ATAG_FWVER:
183 		printf("[fwver]:\n");
184 		printf("     magic = 0x%x\n", t->hdr.magic);
185 		printf("      size = 0x%x\n\n", t->hdr.size << 2);
186 		printf("   version = 0x%x\n", t->u.fwver.version);
187 		for (i = 0; i < FW_MAX; i++)
188 			printf("    ver[%d] = %s\n", i, t->u.fwver.ver[i]);
189 		break;
190 	default:
191 		printf("%s: magic(%x) is not support\n", __func__, t->hdr.magic);
192 	}
193 
194 	printf("\n");
195 }
196 
atags_print_all_tags(void)197 static void atags_print_all_tags(void)
198 {
199 	struct tag *t;
200 
201 	if (!atags_is_available())
202 		return;
203 
204 	for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) {
205 		if (atags_overflow(t))
206 			return;
207 
208 		if (atags_bad_magic(t->hdr.magic))
209 			return;
210 
211 		atags_print_tag(t);
212 	}
213 }
214 
do_dump_atags(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])215 static int do_dump_atags(cmd_tbl_t *cmdtp, int flag,
216 			 int argc, char * const argv[])
217 {
218 	atags_print_all_tags();
219 	atags_stat();
220 
221 	return 0;
222 }
223 
224 U_BOOT_CMD(
225 	atags, 1, 1, do_dump_atags,
226 	"Dump all atags",
227 	""
228 );
229