xref: /rk3399_rockchip-uboot/arch/arm/mach-uniphier/dram/cmd_ddrphy.c (revision aac477eca88dd81b18b48573ababee5112d571f3)
19ca66164SMasahiro Yamada /*
24e3d8406SMasahiro Yamada  * Copyright (C) 2014      Panasonic Corporation
3*bf520917SMasahiro Yamada  * Copyright (C) 2015-2017 Socionext Inc.
44e3d8406SMasahiro Yamada  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
59ca66164SMasahiro Yamada  *
69ca66164SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
79ca66164SMasahiro Yamada  */
89ca66164SMasahiro Yamada 
99ca66164SMasahiro Yamada #include <common.h>
109ca66164SMasahiro Yamada #include <linux/io.h>
111b1f2319SMasahiro Yamada #include <linux/sizes.h>
12107b3fb4SMasahiro Yamada 
131b1f2319SMasahiro Yamada #include "../soc-info.h"
14107b3fb4SMasahiro Yamada #include "ddrphy-regs.h"
159ca66164SMasahiro Yamada 
169ca66164SMasahiro Yamada /* Select either decimal or hexadecimal */
179ca66164SMasahiro Yamada #if 1
189ca66164SMasahiro Yamada #define PRINTF_FORMAT "%2d"
199ca66164SMasahiro Yamada #else
209ca66164SMasahiro Yamada #define PRINTF_FORMAT "%02x"
219ca66164SMasahiro Yamada #endif
229ca66164SMasahiro Yamada /* field separator */
239ca66164SMasahiro Yamada #define FS "   "
249ca66164SMasahiro Yamada 
255f49845eSMasahiro Yamada #define ptr_to_uint(p)	((unsigned int)(unsigned long)(p))
265f49845eSMasahiro Yamada 
27*bf520917SMasahiro Yamada #define UNIPHIER_MAX_NR_DDRPHY		4
28*bf520917SMasahiro Yamada 
29*bf520917SMasahiro Yamada struct uniphier_ddrphy_param {
30*bf520917SMasahiro Yamada 	unsigned int soc_id;
31*bf520917SMasahiro Yamada 	unsigned int nr_phy;
32*bf520917SMasahiro Yamada 	struct {
33adf55f63SMasahiro Yamada 		resource_size_t base;
34adf55f63SMasahiro Yamada 		unsigned int nr_dx;
35*bf520917SMasahiro Yamada 	} phy[UNIPHIER_MAX_NR_DDRPHY];
361b1f2319SMasahiro Yamada };
371b1f2319SMasahiro Yamada 
38*bf520917SMasahiro Yamada static const struct uniphier_ddrphy_param uniphier_ddrphy_param[] = {
39*bf520917SMasahiro Yamada 	{
40*bf520917SMasahiro Yamada 		.soc_id = UNIPHIER_LD4_ID,
41*bf520917SMasahiro Yamada 		.nr_phy = 2,
42*bf520917SMasahiro Yamada 		.phy = {
43adf55f63SMasahiro Yamada 			{ .base = 0x5bc01000, .nr_dx = 2, },
44adf55f63SMasahiro Yamada 			{ .base = 0x5be01000, .nr_dx = 2, },
45*bf520917SMasahiro Yamada 		},
46*bf520917SMasahiro Yamada 	},
47*bf520917SMasahiro Yamada 	{
48*bf520917SMasahiro Yamada 		.soc_id = UNIPHIER_PRO4_ID,
49*bf520917SMasahiro Yamada 		.nr_phy = 4,
50*bf520917SMasahiro Yamada 		.phy = {
51adf55f63SMasahiro Yamada 			{ .base = 0x5bc01000, .nr_dx = 2, },
52adf55f63SMasahiro Yamada 			{ .base = 0x5bc02000, .nr_dx = 2, },
53adf55f63SMasahiro Yamada 			{ .base = 0x5be01000, .nr_dx = 2, },
54adf55f63SMasahiro Yamada 			{ .base = 0x5be02000, .nr_dx = 2, },
55*bf520917SMasahiro Yamada 		},
56*bf520917SMasahiro Yamada 	},
57*bf520917SMasahiro Yamada 	{
58*bf520917SMasahiro Yamada 		.soc_id = UNIPHIER_SLD8_ID,
59*bf520917SMasahiro Yamada 		.nr_phy = 2,
60*bf520917SMasahiro Yamada 		.phy = {
61adf55f63SMasahiro Yamada 			{ .base = 0x5bc01000, .nr_dx = 2, },
62adf55f63SMasahiro Yamada 			{ .base = 0x5be01000, .nr_dx = 2, },
63*bf520917SMasahiro Yamada 		},
64*bf520917SMasahiro Yamada 	},
65*bf520917SMasahiro Yamada 	{
66*bf520917SMasahiro Yamada 		.soc_id = UNIPHIER_LD11_ID,
67*bf520917SMasahiro Yamada 		.nr_phy = 1,
68*bf520917SMasahiro Yamada 		.phy = {
695f49845eSMasahiro Yamada 			{ .base = 0x5bc01000, .nr_dx = 4, },
70*bf520917SMasahiro Yamada 		},
71*bf520917SMasahiro Yamada 	},
725f49845eSMasahiro Yamada };
UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_ddrphy_param,uniphier_ddrphy_param)73*bf520917SMasahiro Yamada UNIPHIER_DEFINE_SOCDATA_FUNC(uniphier_get_ddrphy_param, uniphier_ddrphy_param)
745f49845eSMasahiro Yamada 
756dd34ae4SMasahiro Yamada static void print_bdl(void __iomem *reg, int n)
769ca66164SMasahiro Yamada {
776dd34ae4SMasahiro Yamada 	u32 val = readl(reg);
786dd34ae4SMasahiro Yamada 	int i;
796dd34ae4SMasahiro Yamada 
806dd34ae4SMasahiro Yamada 	for (i = 0; i < n; i++)
816dd34ae4SMasahiro Yamada 		printf(FS PRINTF_FORMAT, (val >> i * 6) & 0x3f);
829ca66164SMasahiro Yamada }
839ca66164SMasahiro Yamada 
dump_loop(const struct uniphier_ddrphy_param * param,void (* callback)(void __iomem *))84*bf520917SMasahiro Yamada static void dump_loop(const struct uniphier_ddrphy_param *param,
856dd34ae4SMasahiro Yamada 		      void (*callback)(void __iomem *))
869ca66164SMasahiro Yamada {
876dd34ae4SMasahiro Yamada 	void __iomem *phy_base, *dx_base;
88*bf520917SMasahiro Yamada 	int phy, dx;
899ca66164SMasahiro Yamada 
90*bf520917SMasahiro Yamada 	for (phy = 0; phy < param->nr_phy; phy++) {
91*bf520917SMasahiro Yamada 		phy_base = ioremap(param->phy[phy].base, SZ_4K);
926dd34ae4SMasahiro Yamada 		dx_base = phy_base + PHY_DX_BASE;
939ca66164SMasahiro Yamada 
94*bf520917SMasahiro Yamada 		for (dx = 0; dx < param->phy[phy].nr_dx; dx++) {
95*bf520917SMasahiro Yamada 			printf("PHY%dDX%d:", phy, dx);
966dd34ae4SMasahiro Yamada 			(*callback)(dx_base);
976dd34ae4SMasahiro Yamada 			dx_base += PHY_DX_STRIDE;
989ca66164SMasahiro Yamada 			printf("\n");
999ca66164SMasahiro Yamada 		}
1001b1f2319SMasahiro Yamada 
1016dd34ae4SMasahiro Yamada 		iounmap(phy_base);
1029ca66164SMasahiro Yamada 	}
1039ca66164SMasahiro Yamada }
1049ca66164SMasahiro Yamada 
__wbdl_dump(void __iomem * dx_base)1056dd34ae4SMasahiro Yamada static void __wbdl_dump(void __iomem *dx_base)
1069ca66164SMasahiro Yamada {
1076dd34ae4SMasahiro Yamada 	print_bdl(dx_base + PHY_DX_BDLR0, 5);
1086dd34ae4SMasahiro Yamada 	print_bdl(dx_base + PHY_DX_BDLR1, 5);
1099ca66164SMasahiro Yamada 
1106dd34ae4SMasahiro Yamada 	printf(FS "(+" PRINTF_FORMAT ")",
1116dd34ae4SMasahiro Yamada 	       readl(dx_base + PHY_DX_LCDLR1) & 0xff);
1129ca66164SMasahiro Yamada }
1139ca66164SMasahiro Yamada 
wbdl_dump(const struct uniphier_ddrphy_param * param)114*bf520917SMasahiro Yamada static void wbdl_dump(const struct uniphier_ddrphy_param *param)
1159ca66164SMasahiro Yamada {
1169ca66164SMasahiro Yamada 	printf("\n--- Write Bit Delay Line ---\n");
1179ca66164SMasahiro Yamada 	printf("           DQ0  DQ1  DQ2  DQ3  DQ4  DQ5  DQ6  DQ7   DM  DQS  (WDQD)\n");
1189ca66164SMasahiro Yamada 
119*bf520917SMasahiro Yamada 	dump_loop(param, &__wbdl_dump);
1209ca66164SMasahiro Yamada }
1219ca66164SMasahiro Yamada 
__rbdl_dump(void __iomem * dx_base)1226dd34ae4SMasahiro Yamada static void __rbdl_dump(void __iomem *dx_base)
1239ca66164SMasahiro Yamada {
1246dd34ae4SMasahiro Yamada 	print_bdl(dx_base + PHY_DX_BDLR3, 5);
1256dd34ae4SMasahiro Yamada 	print_bdl(dx_base + PHY_DX_BDLR4, 4);
1269ca66164SMasahiro Yamada 
1276dd34ae4SMasahiro Yamada 	printf(FS "(+" PRINTF_FORMAT ")",
1286dd34ae4SMasahiro Yamada 	       (readl(dx_base + PHY_DX_LCDLR1) >> 8) & 0xff);
1299ca66164SMasahiro Yamada }
1309ca66164SMasahiro Yamada 
rbdl_dump(const struct uniphier_ddrphy_param * param)131*bf520917SMasahiro Yamada static void rbdl_dump(const struct uniphier_ddrphy_param *param)
1329ca66164SMasahiro Yamada {
1339ca66164SMasahiro Yamada 	printf("\n--- Read Bit Delay Line ---\n");
1349ca66164SMasahiro Yamada 	printf("           DQ0  DQ1  DQ2  DQ3  DQ4  DQ5  DQ6  DQ7   DM  (RDQSD)\n");
1359ca66164SMasahiro Yamada 
136*bf520917SMasahiro Yamada 	dump_loop(param, &__rbdl_dump);
1379ca66164SMasahiro Yamada }
1389ca66164SMasahiro Yamada 
__wld_dump(void __iomem * dx_base)1396dd34ae4SMasahiro Yamada static void __wld_dump(void __iomem *dx_base)
1409ca66164SMasahiro Yamada {
1419ca66164SMasahiro Yamada 	int rank;
1426dd34ae4SMasahiro Yamada 	u32 lcdlr0 = readl(dx_base + PHY_DX_LCDLR0);
1436dd34ae4SMasahiro Yamada 	u32 gtr = readl(dx_base + PHY_DX_GTR);
1449ca66164SMasahiro Yamada 
1459ca66164SMasahiro Yamada 	for (rank = 0; rank < 4; rank++) {
1469ca66164SMasahiro Yamada 		u32 wld = (lcdlr0 >> (8 * rank)) & 0xff; /* Delay */
1479ca66164SMasahiro Yamada 		u32 wlsl = (gtr >> (12 + 2 * rank)) & 0x3; /* System Latency */
1489ca66164SMasahiro Yamada 
1499ca66164SMasahiro Yamada 		printf(FS PRINTF_FORMAT "%sT", wld,
1509ca66164SMasahiro Yamada 		       wlsl == 0 ? "-1" : wlsl == 1 ? "+0" : "+1");
1519ca66164SMasahiro Yamada 	}
1529ca66164SMasahiro Yamada }
1539ca66164SMasahiro Yamada 
wld_dump(const struct uniphier_ddrphy_param * param)154*bf520917SMasahiro Yamada static void wld_dump(const struct uniphier_ddrphy_param *param)
1559ca66164SMasahiro Yamada {
1569ca66164SMasahiro Yamada 	printf("\n--- Write Leveling Delay ---\n");
1579ca66164SMasahiro Yamada 	printf("           Rank0   Rank1   Rank2   Rank3\n");
1589ca66164SMasahiro Yamada 
159*bf520917SMasahiro Yamada 	dump_loop(param, &__wld_dump);
1609ca66164SMasahiro Yamada }
1619ca66164SMasahiro Yamada 
__dqsgd_dump(void __iomem * dx_base)1626dd34ae4SMasahiro Yamada static void __dqsgd_dump(void __iomem *dx_base)
1639ca66164SMasahiro Yamada {
1649ca66164SMasahiro Yamada 	int rank;
1656dd34ae4SMasahiro Yamada 	u32 lcdlr2 = readl(dx_base + PHY_DX_LCDLR2);
1666dd34ae4SMasahiro Yamada 	u32 gtr = readl(dx_base + PHY_DX_GTR);
1679ca66164SMasahiro Yamada 
1689ca66164SMasahiro Yamada 	for (rank = 0; rank < 4; rank++) {
1699ca66164SMasahiro Yamada 		u32 dqsgd = (lcdlr2 >> (8 * rank)) & 0xff; /* Delay */
1709ca66164SMasahiro Yamada 		u32 dgsl = (gtr >> (3 * rank)) & 0x7; /* System Latency */
1719ca66164SMasahiro Yamada 
1729ca66164SMasahiro Yamada 		printf(FS PRINTF_FORMAT "+%dT", dqsgd, dgsl);
1739ca66164SMasahiro Yamada 	}
1749ca66164SMasahiro Yamada }
1759ca66164SMasahiro Yamada 
dqsgd_dump(const struct uniphier_ddrphy_param * param)176*bf520917SMasahiro Yamada static void dqsgd_dump(const struct uniphier_ddrphy_param *param)
1779ca66164SMasahiro Yamada {
1789ca66164SMasahiro Yamada 	printf("\n--- DQS Gating Delay ---\n");
1799ca66164SMasahiro Yamada 	printf("           Rank0   Rank1   Rank2   Rank3\n");
1809ca66164SMasahiro Yamada 
181*bf520917SMasahiro Yamada 	dump_loop(param, &__dqsgd_dump);
1829ca66164SMasahiro Yamada }
1839ca66164SMasahiro Yamada 
__mdl_dump(void __iomem * dx_base)1846dd34ae4SMasahiro Yamada static void __mdl_dump(void __iomem *dx_base)
1859ca66164SMasahiro Yamada {
1869ca66164SMasahiro Yamada 	int i;
1876dd34ae4SMasahiro Yamada 	u32 mdl = readl(dx_base + PHY_DX_MDLR);
188*bf520917SMasahiro Yamada 
1899ca66164SMasahiro Yamada 	for (i = 0; i < 3; i++)
1909ca66164SMasahiro Yamada 		printf(FS PRINTF_FORMAT, (mdl >> (8 * i)) & 0xff);
1919ca66164SMasahiro Yamada }
1929ca66164SMasahiro Yamada 
mdl_dump(const struct uniphier_ddrphy_param * param)193*bf520917SMasahiro Yamada static void mdl_dump(const struct uniphier_ddrphy_param *param)
1949ca66164SMasahiro Yamada {
1959ca66164SMasahiro Yamada 	printf("\n--- Master Delay Line ---\n");
1969ca66164SMasahiro Yamada 	printf("          IPRD TPRD MDLD\n");
1979ca66164SMasahiro Yamada 
198*bf520917SMasahiro Yamada 	dump_loop(param, &__mdl_dump);
1999ca66164SMasahiro Yamada }
2009ca66164SMasahiro Yamada 
2019ca66164SMasahiro Yamada #define REG_DUMP(x)							\
2026dd34ae4SMasahiro Yamada 	{ int ofst = PHY_ ## x; void __iomem *reg = phy_base + ofst;	\
2035f49845eSMasahiro Yamada 		printf("%3d: %-10s: %08x : %08x\n",			\
2045f49845eSMasahiro Yamada 		       ofst >> PHY_REG_SHIFT, #x,			\
2055f49845eSMasahiro Yamada 		       ptr_to_uint(reg), readl(reg)); }
2066dd34ae4SMasahiro Yamada 
2076dd34ae4SMasahiro Yamada #define DX_REG_DUMP(dx, x)						\
2086dd34ae4SMasahiro Yamada 	{ int ofst = PHY_DX_BASE + PHY_DX_STRIDE * (dx) +		\
2096dd34ae4SMasahiro Yamada 			PHY_DX_## x;					\
2106dd34ae4SMasahiro Yamada 		void __iomem *reg = phy_base + ofst;			\
2115f49845eSMasahiro Yamada 		printf("%3d: DX%d%-7s: %08x : %08x\n",			\
2125f49845eSMasahiro Yamada 		       ofst >> PHY_REG_SHIFT, (dx), #x,			\
2135f49845eSMasahiro Yamada 		       ptr_to_uint(reg), readl(reg)); }
2149ca66164SMasahiro Yamada 
reg_dump(const struct uniphier_ddrphy_param * param)215*bf520917SMasahiro Yamada static void reg_dump(const struct uniphier_ddrphy_param *param)
2169ca66164SMasahiro Yamada {
2176dd34ae4SMasahiro Yamada 	void __iomem *phy_base;
218*bf520917SMasahiro Yamada 	int phy, dx;
2199ca66164SMasahiro Yamada 
2209ca66164SMasahiro Yamada 	printf("\n--- DDR PHY registers ---\n");
2219ca66164SMasahiro Yamada 
222*bf520917SMasahiro Yamada 	for (phy = 0; phy < param->nr_phy; phy++) {
223*bf520917SMasahiro Yamada 		phy_base = ioremap(param->phy[phy].base, SZ_4K);
2249ca66164SMasahiro Yamada 
225*bf520917SMasahiro Yamada 		printf("== PHY%d (base: %08x) ==\n",
226*bf520917SMasahiro Yamada 		       phy, ptr_to_uint(phy_base));
2271b1f2319SMasahiro Yamada 		printf(" No: Name      : Address  : Data\n");
2289ca66164SMasahiro Yamada 
2296dd34ae4SMasahiro Yamada 		REG_DUMP(RIDR);
2306dd34ae4SMasahiro Yamada 		REG_DUMP(PIR);
2316dd34ae4SMasahiro Yamada 		REG_DUMP(PGCR0);
2326dd34ae4SMasahiro Yamada 		REG_DUMP(PGCR1);
2336dd34ae4SMasahiro Yamada 		REG_DUMP(PGSR0);
2346dd34ae4SMasahiro Yamada 		REG_DUMP(PGSR1);
2356dd34ae4SMasahiro Yamada 		REG_DUMP(PLLCR);
2366dd34ae4SMasahiro Yamada 		REG_DUMP(PTR0);
2376dd34ae4SMasahiro Yamada 		REG_DUMP(PTR1);
2386dd34ae4SMasahiro Yamada 		REG_DUMP(PTR2);
2396dd34ae4SMasahiro Yamada 		REG_DUMP(PTR3);
2406dd34ae4SMasahiro Yamada 		REG_DUMP(PTR4);
2416dd34ae4SMasahiro Yamada 		REG_DUMP(ACMDLR);
2426dd34ae4SMasahiro Yamada 		REG_DUMP(ACBDLR);
2436dd34ae4SMasahiro Yamada 		REG_DUMP(DXCCR);
2446dd34ae4SMasahiro Yamada 		REG_DUMP(DSGCR);
2456dd34ae4SMasahiro Yamada 		REG_DUMP(DCR);
2466dd34ae4SMasahiro Yamada 		REG_DUMP(DTPR0);
2476dd34ae4SMasahiro Yamada 		REG_DUMP(DTPR1);
2486dd34ae4SMasahiro Yamada 		REG_DUMP(DTPR2);
2496dd34ae4SMasahiro Yamada 		REG_DUMP(MR0);
2506dd34ae4SMasahiro Yamada 		REG_DUMP(MR1);
2516dd34ae4SMasahiro Yamada 		REG_DUMP(MR2);
2526dd34ae4SMasahiro Yamada 		REG_DUMP(MR3);
2531b1f2319SMasahiro Yamada 
254*bf520917SMasahiro Yamada 		for (dx = 0; dx < param->phy[phy].nr_dx; dx++) {
2556dd34ae4SMasahiro Yamada 			DX_REG_DUMP(dx, GCR);
2566dd34ae4SMasahiro Yamada 			DX_REG_DUMP(dx, GTR);
2576dd34ae4SMasahiro Yamada 		}
2586dd34ae4SMasahiro Yamada 
2596dd34ae4SMasahiro Yamada 		iounmap(phy_base);
2609ca66164SMasahiro Yamada 	}
2619ca66164SMasahiro Yamada }
2629ca66164SMasahiro Yamada 
do_ddr(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])2639ca66164SMasahiro Yamada static int do_ddr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
2649ca66164SMasahiro Yamada {
265*bf520917SMasahiro Yamada 	const struct uniphier_ddrphy_param *param;
266*bf520917SMasahiro Yamada 	char *cmd;
2671b1f2319SMasahiro Yamada 
268*bf520917SMasahiro Yamada 	param = uniphier_get_ddrphy_param();
269*bf520917SMasahiro Yamada 	if (!param) {
2701b1f2319SMasahiro Yamada 		printf("unsupported SoC\n");
2711b1f2319SMasahiro Yamada 		return CMD_RET_FAILURE;
2721b1f2319SMasahiro Yamada 	}
2739ca66164SMasahiro Yamada 
2749ca66164SMasahiro Yamada 	if (argc == 1)
2759ca66164SMasahiro Yamada 		cmd = "all";
276*bf520917SMasahiro Yamada 	else
277*bf520917SMasahiro Yamada 		cmd = argv[1];
2789ca66164SMasahiro Yamada 
2799ca66164SMasahiro Yamada 	if (!strcmp(cmd, "wbdl") || !strcmp(cmd, "all"))
280*bf520917SMasahiro Yamada 		wbdl_dump(param);
2819ca66164SMasahiro Yamada 
2829ca66164SMasahiro Yamada 	if (!strcmp(cmd, "rbdl") || !strcmp(cmd, "all"))
283*bf520917SMasahiro Yamada 		rbdl_dump(param);
2849ca66164SMasahiro Yamada 
2859ca66164SMasahiro Yamada 	if (!strcmp(cmd, "wld") || !strcmp(cmd, "all"))
286*bf520917SMasahiro Yamada 		wld_dump(param);
2879ca66164SMasahiro Yamada 
2889ca66164SMasahiro Yamada 	if (!strcmp(cmd, "dqsgd") || !strcmp(cmd, "all"))
289*bf520917SMasahiro Yamada 		dqsgd_dump(param);
2909ca66164SMasahiro Yamada 
2919ca66164SMasahiro Yamada 	if (!strcmp(cmd, "mdl") || !strcmp(cmd, "all"))
292*bf520917SMasahiro Yamada 		mdl_dump(param);
2939ca66164SMasahiro Yamada 
2949ca66164SMasahiro Yamada 	if (!strcmp(cmd, "reg") || !strcmp(cmd, "all"))
295*bf520917SMasahiro Yamada 		reg_dump(param);
2969ca66164SMasahiro Yamada 
2971b1f2319SMasahiro Yamada 	return CMD_RET_SUCCESS;
2989ca66164SMasahiro Yamada }
2999ca66164SMasahiro Yamada 
3009ca66164SMasahiro Yamada U_BOOT_CMD(
3019ca66164SMasahiro Yamada 	ddr,	2,	1,	do_ddr,
3029ca66164SMasahiro Yamada 	"UniPhier DDR PHY parameters dumper",
303c21fc7e2SMasahiro Yamada 	"- dump all of the following\n"
3049ca66164SMasahiro Yamada 	"ddr wbdl - dump Write Bit Delay\n"
3059ca66164SMasahiro Yamada 	"ddr rbdl - dump Read Bit Delay\n"
3069ca66164SMasahiro Yamada 	"ddr wld - dump Write Leveling\n"
3079ca66164SMasahiro Yamada 	"ddr dqsgd - dump DQS Gating Delay\n"
3089ca66164SMasahiro Yamada 	"ddr mdl - dump Master Delay Line\n"
3099ca66164SMasahiro Yamada 	"ddr reg - dump registers\n"
3109ca66164SMasahiro Yamada );
311