blob: fff251254393a93f96d6865a60ea556f75da43f2 [file] [log] [blame]
Bo Lv72d0e902023-01-02 14:27:34 +00001// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 */
5
6#include <common.h>
7#include <asm/io.h>
8#include <asm/arch/io.h>
9#include <asm/arch/secure_apb.h>
10#include <asm/arch/romboot.h>
11#include <asm/arch/cpu_reset.h>
12#include <amlogic/cpu_id.h>
13
14int do_ddr2pll(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
15{
16 char *endp;
17 unsigned long pll, zqcr;
18
19 /* need at least two arguments */
20 if (argc < 2)
21 goto usage;
22
23 pll = simple_strtoul(argv[1], &endp,0);
24 if (*argv[1] == 0 || *endp != 0) {
25 printf ("Error: Wrong format parament!\n");
26 return 1;
27 }
28 if (argc >2)
29 {
30 zqcr = simple_strtoul(argv[2], &endp, 16);
31 if (*argv[2] == 0 || *endp != 0) {
32 zqcr = 0;
33 }
34 }
35 else
36 {
37 zqcr = 0;
38 }
39
40#if defined(CONFIG_M6TV) || defined(CONFIG_M6TVD)
41 writel(zqcr | (0x3c << 24), P_PREG_STICKY_REG0);
42#else
43 writel(zqcr | (0xf13 << 20), P_PREG_STICKY_REG0);
44#endif
45 writel(pll | (readl(P_PREG_STICKY_REG1)), P_PREG_STICKY_REG1);
46 printf("Set pll done [0x%08x]\n", readl(P_PREG_STICKY_REG1));
47#ifdef CONFIG_M8B
48 writel(0xf080000 | 2000, WATCHDOG_TC);
49#else
50 reset_system();
51#endif
52
53 return 0;
54
55usage:
56 cmd_usage(cmdtp);
57 return 1;
58}
59
60U_BOOT_CMD(
61 d2pll, 5, 1, do_ddr2pll,
62 "DDR set PLL function",
63 "DDR PLL set: d2pll PLL [ZQCR], e...g... 0x1022c.\n"
64);
65
66#define DDR_FULL_TEST_CTRL_BIT 21 //use sticky1 bit21
67int do_ddrft(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) {
68 unsigned long ddr_full_test = 0;
69 //printf("sticky1: 0x%x\n", readl(P_PREG_STICKY_REG1));
70
71 if (get_cpu_id().family_id <= MESON_CPU_MAJOR_ID_GXTVBB) {
72 printf("Only support gxl/gxm/txl... chips!\n");
73 return 0;
74 }
75
76 if (argc == 1) {
77 /* no parameters, switch 1/0 */
78 if ((readl(P_PREG_STICKY_REG1)) & (1<<DDR_FULL_TEST_CTRL_BIT)) {
79 writel((~(1<<DDR_FULL_TEST_CTRL_BIT)) & (readl(P_PREG_STICKY_REG1)), P_PREG_STICKY_REG1);
80 }
81 else {
82 writel((1<<DDR_FULL_TEST_CTRL_BIT) | (readl(P_PREG_STICKY_REG1)), P_PREG_STICKY_REG1);
83 }
84 }
85 else if (argc == 2) {
86 ddr_full_test = simple_strtoul(argv[1], NULL,0);
87 if (ddr_full_test)
88 ddr_full_test = 1;
89 writel((~(1<<DDR_FULL_TEST_CTRL_BIT)) & (readl(P_PREG_STICKY_REG1)), P_PREG_STICKY_REG1);
90 writel((ddr_full_test << DDR_FULL_TEST_CTRL_BIT) | (readl(P_PREG_STICKY_REG1)), P_PREG_STICKY_REG1);
91 }
92
93 //printf("sticky1: 0x%x\n", readl(P_PREG_STICKY_REG1));
94 if (readl(P_PREG_STICKY_REG1) & (1<<DDR_FULL_TEST_CTRL_BIT))
95 printf("ddr full test enabled!\n");
96 else
97 printf("ddr full test disabled!\n");
98 return 0;
99}
100
101/* ddr full test support, co-work with d2pll function */
102/*
103 before d2pll command, use
104 ddrft 1
105 cmd enable ddr full test function
106*/
107U_BOOT_CMD(
108 ddrft, 5, 1, do_ddrft,
109 "Enable/Disable ddr full test at runtime\n\nOnly support gxl/gxm/txl",
110 "[1/0]\n"
111);
112
113int do_ddr_sram_tune(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
114{
115 char *endp;
116 unsigned long pll, zqcr;
117
118 /* need at least two arguments */
119 if (argc < 2)
120 goto usage;
121
122 pll = simple_strtoul(argv[1], &endp, 16);
123 if (*argv[1] == 0 || *endp != 0) {
124 printf ("Error: Wrong format parament!\n");
125 return 1;
126 }
127
128 if (argc >2)
129 {
130 zqcr = simple_strtoul(argv[2], &endp, 16);
131 if (*argv[2] == 0 || *endp != 0) {
132 zqcr = 0;
133 }
134 }
135 else
136 {
137 zqcr = 0;
138 }
139#if defined(CONFIG_M6TV) || defined(CONFIG_M6TVD)
140 writel(zqcr | (0x3c << 24), P_PREG_STICKY_REG0);
141#else
142 writel(zqcr | (0xf13 << 20), P_PREG_STICKY_REG0);
143#endif
144 //writel(P_PREG_STICKY_REG1, pll);
145 writel(pll|(1<<31), P_PREG_STICKY_REG1);//modify
146 printf("Set pll done [0x%08x]\n", readl(P_PREG_STICKY_REG1));
147#ifdef CONFIG_M8B
148 writel(0xf080000 | 2000, WATCHDOG_TC);
149#else
150 reset_system();
151#endif
152
153 return 0;
154
155usage:
156 cmd_usage(cmdtp);
157 return 1;
158}
159
160U_BOOT_CMD(
161 ddr_sram_tune, 5, 1, do_ddr_sram_tune,
162 "DDR sram tune dqs",
163 "ddr_sram_tune PLL [ZQCR], e...g... 0x1022c.\n\n"
164);
165