1c9552895SMasahiro Yamada /*
2*513cfaccSMasahiro Yamada * Copyright (C) 2015-2017 Socionext Inc.
3*513cfaccSMasahiro Yamada * Author: Masahiro Yamada <yamada.masahiro@socionext.com>
4c9552895SMasahiro Yamada *
5c9552895SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+
6c9552895SMasahiro Yamada */
7c9552895SMasahiro Yamada
8c9552895SMasahiro Yamada #include <common.h>
9c9552895SMasahiro Yamada #include <linux/io.h>
10*513cfaccSMasahiro Yamada #include <linux/sizes.h>
11c9552895SMasahiro Yamada
12*513cfaccSMasahiro Yamada #include "../soc-info.h"
13c9552895SMasahiro Yamada #include "ddrmphy-regs.h"
14c9552895SMasahiro Yamada
15c9552895SMasahiro Yamada /* Select either decimal or hexadecimal */
16c9552895SMasahiro Yamada #if 1
17c9552895SMasahiro Yamada #define PRINTF_FORMAT "%2d"
18c9552895SMasahiro Yamada #else
19c9552895SMasahiro Yamada #define PRINTF_FORMAT "%02x"
20c9552895SMasahiro Yamada #endif
21c9552895SMasahiro Yamada /* field separator */
22c9552895SMasahiro Yamada #define FS " "
23c9552895SMasahiro Yamada
24*513cfaccSMasahiro Yamada #define ptr_to_uint(p) ((unsigned int)(unsigned long)(p))
25*513cfaccSMasahiro Yamada
26*513cfaccSMasahiro Yamada #define UNIPHIER_MAX_NR_DDRMPHY 3
27*513cfaccSMasahiro Yamada
28*513cfaccSMasahiro Yamada struct uniphier_ddrmphy_param {
29*513cfaccSMasahiro Yamada unsigned int soc_id;
30*513cfaccSMasahiro Yamada unsigned int nr_phy;
31*513cfaccSMasahiro Yamada struct {
32*513cfaccSMasahiro Yamada resource_size_t base;
33*513cfaccSMasahiro Yamada unsigned int nr_zq;
34*513cfaccSMasahiro Yamada unsigned int nr_dx;
35*513cfaccSMasahiro Yamada } phy[UNIPHIER_MAX_NR_DDRMPHY];
36*513cfaccSMasahiro Yamada };
37*513cfaccSMasahiro Yamada
38*513cfaccSMasahiro Yamada static const struct uniphier_ddrmphy_param uniphier_ddrmphy_param[] = {
39c9552895SMasahiro Yamada {
40*513cfaccSMasahiro Yamada .soc_id = UNIPHIER_PXS2_ID,
41*513cfaccSMasahiro Yamada .nr_phy = 3,
42*513cfaccSMasahiro Yamada .phy = {
43*513cfaccSMasahiro Yamada { .base = 0x5b830000, .nr_zq = 3, .nr_dx = 4, },
44*513cfaccSMasahiro Yamada { .base = 0x5ba30000, .nr_zq = 3, .nr_dx = 4, },
45*513cfaccSMasahiro Yamada { .base = 0x5bc30000, .nr_zq = 2, .nr_dx = 2, },
46*513cfaccSMasahiro Yamada },
47*513cfaccSMasahiro Yamada },
48c9552895SMasahiro Yamada {
49*513cfaccSMasahiro Yamada .soc_id = UNIPHIER_LD6B_ID,
50*513cfaccSMasahiro Yamada .nr_phy = 3,
51*513cfaccSMasahiro Yamada .phy = {
52*513cfaccSMasahiro Yamada { .base = 0x5b830000, .nr_zq = 3, .nr_dx = 4, },
53*513cfaccSMasahiro Yamada { .base = 0x5ba30000, .nr_zq = 3, .nr_dx = 4, },
54*513cfaccSMasahiro Yamada { .base = 0x5bc30000, .nr_zq = 2, .nr_dx = 2, },
55*513cfaccSMasahiro Yamada },
56*513cfaccSMasahiro Yamada },
57*513cfaccSMasahiro Yamada };
UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_ddrmphy_param,uniphier_ddrmphy_param)58*513cfaccSMasahiro Yamada UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_ddrmphy_param, uniphier_ddrmphy_param)
59c9552895SMasahiro Yamada
60c9552895SMasahiro Yamada static void print_bdl(void __iomem *reg, int n)
61c9552895SMasahiro Yamada {
62c9552895SMasahiro Yamada u32 val = readl(reg);
63c9552895SMasahiro Yamada int i;
64c9552895SMasahiro Yamada
65c9552895SMasahiro Yamada for (i = 0; i < n; i++)
66c9552895SMasahiro Yamada printf(FS PRINTF_FORMAT, (val >> i * 8) & 0x1f);
67c9552895SMasahiro Yamada }
68c9552895SMasahiro Yamada
dump_loop(const struct uniphier_ddrmphy_param * param,void (* callback)(void __iomem *))69*513cfaccSMasahiro Yamada static void dump_loop(const struct uniphier_ddrmphy_param *param,
70*513cfaccSMasahiro Yamada void (*callback)(void __iomem *))
71c9552895SMasahiro Yamada {
72*513cfaccSMasahiro Yamada void __iomem *phy_base, *dx_base;
73*513cfaccSMasahiro Yamada int phy, dx;
74c9552895SMasahiro Yamada
75*513cfaccSMasahiro Yamada for (phy = 0; phy < param->nr_phy; phy++) {
76*513cfaccSMasahiro Yamada phy_base = ioremap(param->phy[phy].base, SZ_4K);
77*513cfaccSMasahiro Yamada dx_base = phy_base + MPHY_DX_BASE;
78c9552895SMasahiro Yamada
79*513cfaccSMasahiro Yamada for (dx = 0; dx < param->phy[phy].nr_dx; dx++) {
80*513cfaccSMasahiro Yamada printf("PHY%dDX%d:", phy, dx);
81c9552895SMasahiro Yamada (*callback)(dx_base);
82fada9eafSMasahiro Yamada dx_base += MPHY_DX_STRIDE;
83c9552895SMasahiro Yamada printf("\n");
84c9552895SMasahiro Yamada }
85*513cfaccSMasahiro Yamada
86*513cfaccSMasahiro Yamada iounmap(phy_base);
87c9552895SMasahiro Yamada }
88c9552895SMasahiro Yamada }
89c9552895SMasahiro Yamada
zq_dump(const struct uniphier_ddrmphy_param * param)90*513cfaccSMasahiro Yamada static void zq_dump(const struct uniphier_ddrmphy_param *param)
91c9552895SMasahiro Yamada {
92*513cfaccSMasahiro Yamada void __iomem *phy_base, *zq_base;
93*513cfaccSMasahiro Yamada u32 val;
94*513cfaccSMasahiro Yamada int phy, zq, i;
95c9552895SMasahiro Yamada
96c9552895SMasahiro Yamada printf("\n--- Impedance Data ---\n");
97c9552895SMasahiro Yamada printf(" ZPD ZPU OPD OPU ZDV ODV\n");
98c9552895SMasahiro Yamada
99*513cfaccSMasahiro Yamada for (phy = 0; phy < param->nr_phy; phy++) {
100*513cfaccSMasahiro Yamada phy_base = ioremap(param->phy[phy].base, SZ_4K);
101*513cfaccSMasahiro Yamada zq_base = phy_base + MPHY_ZQ_BASE;
102c9552895SMasahiro Yamada
103*513cfaccSMasahiro Yamada for (zq = 0; zq < param->phy[phy].nr_zq; zq++) {
104*513cfaccSMasahiro Yamada printf("PHY%dZQ%d:", phy, zq);
105c9552895SMasahiro Yamada
106*513cfaccSMasahiro Yamada val = readl(zq_base + MPHY_ZQ_DR);
107c9552895SMasahiro Yamada for (i = 0; i < 4; i++) {
108*513cfaccSMasahiro Yamada printf(FS PRINTF_FORMAT, val & 0x7f);
109*513cfaccSMasahiro Yamada val >>= 7;
110c9552895SMasahiro Yamada }
111c9552895SMasahiro Yamada
112*513cfaccSMasahiro Yamada val = readl(zq_base + MPHY_ZQ_PR);
113c9552895SMasahiro Yamada for (i = 0; i < 2; i++) {
114*513cfaccSMasahiro Yamada printf(FS PRINTF_FORMAT, val & 0xf);
115*513cfaccSMasahiro Yamada val >>= 4;
116c9552895SMasahiro Yamada }
117c9552895SMasahiro Yamada
118fada9eafSMasahiro Yamada zq_base += MPHY_ZQ_STRIDE;
119c9552895SMasahiro Yamada printf("\n");
120c9552895SMasahiro Yamada }
121*513cfaccSMasahiro Yamada
122*513cfaccSMasahiro Yamada iounmap(phy_base);
123c9552895SMasahiro Yamada }
124c9552895SMasahiro Yamada }
125c9552895SMasahiro Yamada
__wbdl_dump(void __iomem * dx_base)126c9552895SMasahiro Yamada static void __wbdl_dump(void __iomem *dx_base)
127c9552895SMasahiro Yamada {
128fada9eafSMasahiro Yamada print_bdl(dx_base + MPHY_DX_BDLR0, 4);
129fada9eafSMasahiro Yamada print_bdl(dx_base + MPHY_DX_BDLR1, 4);
130fada9eafSMasahiro Yamada print_bdl(dx_base + MPHY_DX_BDLR2, 2);
131c9552895SMasahiro Yamada
132c9552895SMasahiro Yamada printf(FS "(+" PRINTF_FORMAT ")",
133fada9eafSMasahiro Yamada readl(dx_base + MPHY_DX_LCDLR1) & 0xff);
134c9552895SMasahiro Yamada }
135c9552895SMasahiro Yamada
wbdl_dump(const struct uniphier_ddrmphy_param * param)136*513cfaccSMasahiro Yamada static void wbdl_dump(const struct uniphier_ddrmphy_param *param)
137c9552895SMasahiro Yamada {
138c9552895SMasahiro Yamada printf("\n--- Write Bit Delay Line ---\n");
139c9552895SMasahiro Yamada printf(" DQ0 DQ1 DQ2 DQ3 DQ4 DQ5 DQ6 DQ7 DM DQS (WDQD)\n");
140c9552895SMasahiro Yamada
141*513cfaccSMasahiro Yamada dump_loop(param, &__wbdl_dump);
142c9552895SMasahiro Yamada }
143c9552895SMasahiro Yamada
__rbdl_dump(void __iomem * dx_base)144c9552895SMasahiro Yamada static void __rbdl_dump(void __iomem *dx_base)
145c9552895SMasahiro Yamada {
146fada9eafSMasahiro Yamada print_bdl(dx_base + MPHY_DX_BDLR3, 4);
147fada9eafSMasahiro Yamada print_bdl(dx_base + MPHY_DX_BDLR4, 4);
148fada9eafSMasahiro Yamada print_bdl(dx_base + MPHY_DX_BDLR5, 1);
149c9552895SMasahiro Yamada
150c9552895SMasahiro Yamada printf(FS "(+" PRINTF_FORMAT ")",
151fada9eafSMasahiro Yamada (readl(dx_base + MPHY_DX_LCDLR1) >> 8) & 0xff);
152c9552895SMasahiro Yamada
153c9552895SMasahiro Yamada printf(FS "(+" PRINTF_FORMAT ")",
154fada9eafSMasahiro Yamada (readl(dx_base + MPHY_DX_LCDLR1) >> 16) & 0xff);
155c9552895SMasahiro Yamada }
156c9552895SMasahiro Yamada
rbdl_dump(const struct uniphier_ddrmphy_param * param)157*513cfaccSMasahiro Yamada static void rbdl_dump(const struct uniphier_ddrmphy_param *param)
158c9552895SMasahiro Yamada {
159c9552895SMasahiro Yamada printf("\n--- Read Bit Delay Line ---\n");
160c9552895SMasahiro Yamada printf(" DQ0 DQ1 DQ2 DQ3 DQ4 DQ5 DQ6 DQ7 DM (RDQSD) (RDQSND)\n");
161c9552895SMasahiro Yamada
162*513cfaccSMasahiro Yamada dump_loop(param, &__rbdl_dump);
163c9552895SMasahiro Yamada }
164c9552895SMasahiro Yamada
__wld_dump(void __iomem * dx_base)165c9552895SMasahiro Yamada static void __wld_dump(void __iomem *dx_base)
166c9552895SMasahiro Yamada {
167c9552895SMasahiro Yamada int rank;
168fada9eafSMasahiro Yamada u32 lcdlr0 = readl(dx_base + MPHY_DX_LCDLR0);
169fada9eafSMasahiro Yamada u32 gtr = readl(dx_base + MPHY_DX_GTR);
170c9552895SMasahiro Yamada
171c9552895SMasahiro Yamada for (rank = 0; rank < 4; rank++) {
172c9552895SMasahiro Yamada u32 wld = (lcdlr0 >> (8 * rank)) & 0xff; /* Delay */
173c9552895SMasahiro Yamada u32 wlsl = (gtr >> (12 + 2 * rank)) & 0x3; /* System Latency */
174c9552895SMasahiro Yamada
175c9552895SMasahiro Yamada printf(FS PRINTF_FORMAT "%sT", wld,
176c9552895SMasahiro Yamada wlsl == 0 ? "-1" : wlsl == 1 ? "+0" : "+1");
177c9552895SMasahiro Yamada }
178c9552895SMasahiro Yamada }
179c9552895SMasahiro Yamada
wld_dump(const struct uniphier_ddrmphy_param * param)180*513cfaccSMasahiro Yamada static void wld_dump(const struct uniphier_ddrmphy_param *param)
181c9552895SMasahiro Yamada {
182c9552895SMasahiro Yamada printf("\n--- Write Leveling Delay ---\n");
183c9552895SMasahiro Yamada printf(" Rank0 Rank1 Rank2 Rank3\n");
184c9552895SMasahiro Yamada
185*513cfaccSMasahiro Yamada dump_loop(param, &__wld_dump);
186c9552895SMasahiro Yamada }
187c9552895SMasahiro Yamada
__dqsgd_dump(void __iomem * dx_base)188c9552895SMasahiro Yamada static void __dqsgd_dump(void __iomem *dx_base)
189c9552895SMasahiro Yamada {
190c9552895SMasahiro Yamada int rank;
191fada9eafSMasahiro Yamada u32 lcdlr2 = readl(dx_base + MPHY_DX_LCDLR2);
192fada9eafSMasahiro Yamada u32 gtr = readl(dx_base + MPHY_DX_GTR);
193c9552895SMasahiro Yamada
194c9552895SMasahiro Yamada for (rank = 0; rank < 4; rank++) {
195c9552895SMasahiro Yamada u32 dqsgd = (lcdlr2 >> (8 * rank)) & 0xff; /* Delay */
196c9552895SMasahiro Yamada u32 dgsl = (gtr >> (3 * rank)) & 0x7; /* System Latency */
197c9552895SMasahiro Yamada
198c9552895SMasahiro Yamada printf(FS PRINTF_FORMAT "+%dT", dqsgd, dgsl);
199c9552895SMasahiro Yamada }
200c9552895SMasahiro Yamada }
201c9552895SMasahiro Yamada
dqsgd_dump(const struct uniphier_ddrmphy_param * param)202*513cfaccSMasahiro Yamada static void dqsgd_dump(const struct uniphier_ddrmphy_param *param)
203c9552895SMasahiro Yamada {
204c9552895SMasahiro Yamada printf("\n--- DQS Gating Delay ---\n");
205c9552895SMasahiro Yamada printf(" Rank0 Rank1 Rank2 Rank3\n");
206c9552895SMasahiro Yamada
207*513cfaccSMasahiro Yamada dump_loop(param, &__dqsgd_dump);
208c9552895SMasahiro Yamada }
209c9552895SMasahiro Yamada
__mdl_dump(void __iomem * dx_base)210c9552895SMasahiro Yamada static void __mdl_dump(void __iomem *dx_base)
211c9552895SMasahiro Yamada {
212c9552895SMasahiro Yamada int i;
213fada9eafSMasahiro Yamada u32 mdl = readl(dx_base + MPHY_DX_MDLR);
214c9552895SMasahiro Yamada
215c9552895SMasahiro Yamada for (i = 0; i < 3; i++)
216c9552895SMasahiro Yamada printf(FS PRINTF_FORMAT, (mdl >> (8 * i)) & 0xff);
217c9552895SMasahiro Yamada }
218c9552895SMasahiro Yamada
mdl_dump(const struct uniphier_ddrmphy_param * param)219*513cfaccSMasahiro Yamada static void mdl_dump(const struct uniphier_ddrmphy_param *param)
220c9552895SMasahiro Yamada {
221c9552895SMasahiro Yamada printf("\n--- Master Delay Line ---\n");
222c9552895SMasahiro Yamada printf(" IPRD TPRD MDLD\n");
223c9552895SMasahiro Yamada
224*513cfaccSMasahiro Yamada dump_loop(param, &__mdl_dump);
225c9552895SMasahiro Yamada }
226c9552895SMasahiro Yamada
227c9552895SMasahiro Yamada #define REG_DUMP(x) \
228fada9eafSMasahiro Yamada { int ofst = MPHY_ ## x; void __iomem *reg = phy_base + ofst; \
229c9552895SMasahiro Yamada printf("%3d: %-10s: %p : %08x\n", \
230fada9eafSMasahiro Yamada ofst >> MPHY_SHIFT, #x, reg, readl(reg)); }
231c9552895SMasahiro Yamada
232c9552895SMasahiro Yamada #define DX_REG_DUMP(dx, x) \
233fada9eafSMasahiro Yamada { int ofst = MPHY_DX_BASE + MPHY_DX_STRIDE * (dx) + \
234fada9eafSMasahiro Yamada MPHY_DX_## x; \
235c9552895SMasahiro Yamada void __iomem *reg = phy_base + ofst; \
236c9552895SMasahiro Yamada printf("%3d: DX%d%-7s: %p : %08x\n", \
237fada9eafSMasahiro Yamada ofst >> MPHY_SHIFT, (dx), #x, reg, readl(reg)); }
238c9552895SMasahiro Yamada
reg_dump(const struct uniphier_ddrmphy_param * param)239*513cfaccSMasahiro Yamada static void reg_dump(const struct uniphier_ddrmphy_param *param)
240c9552895SMasahiro Yamada {
241c9552895SMasahiro Yamada void __iomem *phy_base;
242*513cfaccSMasahiro Yamada int phy, dx;
243c9552895SMasahiro Yamada
244*513cfaccSMasahiro Yamada printf("\n--- DDR Multi PHY registers ---\n");
245c9552895SMasahiro Yamada
246*513cfaccSMasahiro Yamada for (phy = 0; phy < param->nr_phy; phy++) {
247*513cfaccSMasahiro Yamada phy_base = ioremap(param->phy[phy].base, SZ_4K);
248c9552895SMasahiro Yamada
249*513cfaccSMasahiro Yamada printf("== PHY%d (base: %08x) ==\n", phy,
250*513cfaccSMasahiro Yamada ptr_to_uint(phy_base));
251c9552895SMasahiro Yamada printf(" No: Name : Address : Data\n");
252c9552895SMasahiro Yamada
253c9552895SMasahiro Yamada REG_DUMP(RIDR);
254c9552895SMasahiro Yamada REG_DUMP(PIR);
255c9552895SMasahiro Yamada REG_DUMP(PGCR0);
256c9552895SMasahiro Yamada REG_DUMP(PGCR1);
257c9552895SMasahiro Yamada REG_DUMP(PGCR2);
258c9552895SMasahiro Yamada REG_DUMP(PGCR3);
259c9552895SMasahiro Yamada REG_DUMP(PGSR0);
260c9552895SMasahiro Yamada REG_DUMP(PGSR1);
261c9552895SMasahiro Yamada REG_DUMP(PLLCR);
262c9552895SMasahiro Yamada REG_DUMP(PTR0);
263c9552895SMasahiro Yamada REG_DUMP(PTR1);
264c9552895SMasahiro Yamada REG_DUMP(PTR2);
265c9552895SMasahiro Yamada REG_DUMP(PTR3);
266c9552895SMasahiro Yamada REG_DUMP(PTR4);
267c9552895SMasahiro Yamada REG_DUMP(ACMDLR);
268c9552895SMasahiro Yamada REG_DUMP(ACBDLR0);
269c9552895SMasahiro Yamada REG_DUMP(DXCCR);
270c9552895SMasahiro Yamada REG_DUMP(DSGCR);
271c9552895SMasahiro Yamada REG_DUMP(DCR);
272c9552895SMasahiro Yamada REG_DUMP(DTPR0);
273c9552895SMasahiro Yamada REG_DUMP(DTPR1);
274c9552895SMasahiro Yamada REG_DUMP(DTPR2);
275c9552895SMasahiro Yamada REG_DUMP(DTPR3);
276c9552895SMasahiro Yamada REG_DUMP(MR0);
277c9552895SMasahiro Yamada REG_DUMP(MR1);
278c9552895SMasahiro Yamada REG_DUMP(MR2);
279c9552895SMasahiro Yamada REG_DUMP(MR3);
280c9552895SMasahiro Yamada
281*513cfaccSMasahiro Yamada for (dx = 0; dx < param->phy[phy].nr_dx; dx++) {
282c9552895SMasahiro Yamada DX_REG_DUMP(dx, GCR0);
283c9552895SMasahiro Yamada DX_REG_DUMP(dx, GCR1);
284c9552895SMasahiro Yamada DX_REG_DUMP(dx, GCR2);
285c9552895SMasahiro Yamada DX_REG_DUMP(dx, GCR3);
286c9552895SMasahiro Yamada DX_REG_DUMP(dx, GTR);
287c9552895SMasahiro Yamada }
288*513cfaccSMasahiro Yamada
289*513cfaccSMasahiro Yamada iounmap(phy_base);
290c9552895SMasahiro Yamada }
291c9552895SMasahiro Yamada }
292c9552895SMasahiro Yamada
do_ddrm(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])293c9552895SMasahiro Yamada static int do_ddrm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
294c9552895SMasahiro Yamada {
295*513cfaccSMasahiro Yamada const struct uniphier_ddrmphy_param *param;
296*513cfaccSMasahiro Yamada char *cmd;
297*513cfaccSMasahiro Yamada
298*513cfaccSMasahiro Yamada param = uniphier_get_ddrmphy_param();
299*513cfaccSMasahiro Yamada if (!param) {
300*513cfaccSMasahiro Yamada printf("unsupported SoC\n");
301*513cfaccSMasahiro Yamada return CMD_RET_FAILURE;
302*513cfaccSMasahiro Yamada }
303c9552895SMasahiro Yamada
304c9552895SMasahiro Yamada if (argc == 1)
305c9552895SMasahiro Yamada cmd = "all";
306*513cfaccSMasahiro Yamada else
307*513cfaccSMasahiro Yamada cmd = argv[1];
308c9552895SMasahiro Yamada
309c9552895SMasahiro Yamada if (!strcmp(cmd, "zq") || !strcmp(cmd, "all"))
310*513cfaccSMasahiro Yamada zq_dump(param);
311c9552895SMasahiro Yamada
312c9552895SMasahiro Yamada if (!strcmp(cmd, "wbdl") || !strcmp(cmd, "all"))
313*513cfaccSMasahiro Yamada wbdl_dump(param);
314c9552895SMasahiro Yamada
315c9552895SMasahiro Yamada if (!strcmp(cmd, "rbdl") || !strcmp(cmd, "all"))
316*513cfaccSMasahiro Yamada rbdl_dump(param);
317c9552895SMasahiro Yamada
318c9552895SMasahiro Yamada if (!strcmp(cmd, "wld") || !strcmp(cmd, "all"))
319*513cfaccSMasahiro Yamada wld_dump(param);
320c9552895SMasahiro Yamada
321c9552895SMasahiro Yamada if (!strcmp(cmd, "dqsgd") || !strcmp(cmd, "all"))
322*513cfaccSMasahiro Yamada dqsgd_dump(param);
323c9552895SMasahiro Yamada
324c9552895SMasahiro Yamada if (!strcmp(cmd, "mdl") || !strcmp(cmd, "all"))
325*513cfaccSMasahiro Yamada mdl_dump(param);
326c9552895SMasahiro Yamada
327c9552895SMasahiro Yamada if (!strcmp(cmd, "reg") || !strcmp(cmd, "all"))
328*513cfaccSMasahiro Yamada reg_dump(param);
329c9552895SMasahiro Yamada
330*513cfaccSMasahiro Yamada return CMD_RET_SUCCESS;
331c9552895SMasahiro Yamada }
332c9552895SMasahiro Yamada
333c9552895SMasahiro Yamada U_BOOT_CMD(
334c9552895SMasahiro Yamada ddrm, 2, 1, do_ddrm,
335*513cfaccSMasahiro Yamada "UniPhier DDR Multi PHY parameters dumper",
336c21fc7e2SMasahiro Yamada "- dump all of the following\n"
337c9552895SMasahiro Yamada "ddrm zq - dump Impedance Data\n"
338c9552895SMasahiro Yamada "ddrm wbdl - dump Write Bit Delay\n"
339c9552895SMasahiro Yamada "ddrm rbdl - dump Read Bit Delay\n"
340c9552895SMasahiro Yamada "ddrm wld - dump Write Leveling\n"
341c9552895SMasahiro Yamada "ddrm dqsgd - dump DQS Gating Delay\n"
342c9552895SMasahiro Yamada "ddrm mdl - dump Master Delay Line\n"
343c9552895SMasahiro Yamada "ddrm reg - dump registers\n"
344c9552895SMasahiro Yamada );
345