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