blob: b77d823868bc58332c4c7f604f052d479fb09c3a [file] [log] [blame]
Patrick Delaunaye70f70a2018-03-12 10:46:11 +01001/*
2 * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
3 *
4 * SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
5 */
6
7#ifndef _RAM_STM32MP1_DDR_H
8#define _RAM_STM32MP1_DDR_H
9
10enum stm32mp1_ddr_interact_step {
11 STEP_DDR_RESET,
12 STEP_CTL_INIT,
13 STEP_PHY_INIT,
14 STEP_DDR_READY,
15 STEP_RUN,
16};
17
18/* DDR CTL and DDR PHY REGISTERS */
19struct stm32mp1_ddrctl;
20struct stm32mp1_ddrphy;
21
22/**
23 * struct ddr_info
24 *
25 * @dev: pointer for the device
26 * @info: UCLASS RAM information
27 * @ctl: DDR controleur base address
28 * @clk: DDR clock
29 * @phy: DDR PHY base address
30 * @rcc: rcc base address
31 */
32struct ddr_info {
33 struct udevice *dev;
34 struct ram_info info;
35 struct clk clk;
36 struct stm32mp1_ddrctl *ctl;
37 struct stm32mp1_ddrphy *phy;
38 u32 rcc;
39};
40
41struct stm32mp1_ddrctrl_reg {
42 u32 mstr;
43 u32 mrctrl0;
44 u32 mrctrl1;
45 u32 derateen;
46 u32 derateint;
47 u32 pwrctl;
48 u32 pwrtmg;
49 u32 hwlpctl;
50 u32 rfshctl0;
51 u32 rfshctl3;
52 u32 crcparctl0;
53 u32 zqctl0;
54 u32 dfitmg0;
55 u32 dfitmg1;
56 u32 dfilpcfg0;
57 u32 dfiupd0;
58 u32 dfiupd1;
59 u32 dfiupd2;
60 u32 dfiphymstr;
61 u32 odtmap;
62 u32 dbg0;
63 u32 dbg1;
64 u32 dbgcmd;
65 u32 poisoncfg;
66 u32 pccfg;
67
68};
69
70struct stm32mp1_ddrctrl_timing {
71 u32 rfshtmg;
72 u32 dramtmg0;
73 u32 dramtmg1;
74 u32 dramtmg2;
75 u32 dramtmg3;
76 u32 dramtmg4;
77 u32 dramtmg5;
78 u32 dramtmg6;
79 u32 dramtmg7;
80 u32 dramtmg8;
81 u32 dramtmg14;
82 u32 odtcfg;
83};
84
85struct stm32mp1_ddrctrl_map {
86 u32 addrmap1;
87 u32 addrmap2;
88 u32 addrmap3;
89 u32 addrmap4;
90 u32 addrmap5;
91 u32 addrmap6;
92 u32 addrmap9;
93 u32 addrmap10;
94 u32 addrmap11;
95};
96
97struct stm32mp1_ddrctrl_perf {
98 u32 sched;
99 u32 sched1;
100 u32 perfhpr1;
101 u32 perflpr1;
102 u32 perfwr1;
103 u32 pcfgr_0;
104 u32 pcfgw_0;
105 u32 pcfgqos0_0;
106 u32 pcfgqos1_0;
107 u32 pcfgwqos0_0;
108 u32 pcfgwqos1_0;
109 u32 pcfgr_1;
110 u32 pcfgw_1;
111 u32 pcfgqos0_1;
112 u32 pcfgqos1_1;
113 u32 pcfgwqos0_1;
114 u32 pcfgwqos1_1;
115};
116
117struct stm32mp1_ddrphy_reg {
118 u32 pgcr;
119 u32 aciocr;
120 u32 dxccr;
121 u32 dsgcr;
122 u32 dcr;
123 u32 odtcr;
124 u32 zq0cr1;
125 u32 dx0gcr;
126 u32 dx1gcr;
127 u32 dx2gcr;
128 u32 dx3gcr;
129};
130
131struct stm32mp1_ddrphy_timing {
132 u32 ptr0;
133 u32 ptr1;
134 u32 ptr2;
135 u32 dtpr0;
136 u32 dtpr1;
137 u32 dtpr2;
138 u32 mr0;
139 u32 mr1;
140 u32 mr2;
141 u32 mr3;
142};
143
144struct stm32mp1_ddrphy_cal {
145 u32 dx0dllcr;
146 u32 dx0dqtr;
147 u32 dx0dqstr;
148 u32 dx1dllcr;
149 u32 dx1dqtr;
150 u32 dx1dqstr;
151 u32 dx2dllcr;
152 u32 dx2dqtr;
153 u32 dx2dqstr;
154 u32 dx3dllcr;
155 u32 dx3dqtr;
156 u32 dx3dqstr;
157};
158
159struct stm32mp1_ddr_info {
160 const char *name;
161 u16 speed; /* in MHZ */
162 u32 size; /* memory size in byte = col * row * width */
163};
164
165struct stm32mp1_ddr_config {
166 struct stm32mp1_ddr_info info;
167 struct stm32mp1_ddrctrl_reg c_reg;
168 struct stm32mp1_ddrctrl_timing c_timing;
169 struct stm32mp1_ddrctrl_map c_map;
170 struct stm32mp1_ddrctrl_perf c_perf;
171 struct stm32mp1_ddrphy_reg p_reg;
172 struct stm32mp1_ddrphy_timing p_timing;
173 struct stm32mp1_ddrphy_cal p_cal;
174};
175
176int stm32mp1_ddr_clk_enable(struct ddr_info *priv, u16 mem_speed);
177void stm32mp1_ddrphy_init(struct stm32mp1_ddrphy *phy, u32 pir);
178void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl);
179void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
180 u32 rfshctl3,
181 u32 pwrctl);
182
183void stm32mp1_ddr_init(
184 struct ddr_info *priv,
185 const struct stm32mp1_ddr_config *config);
186
187int stm32mp1_dump_reg(const struct ddr_info *priv,
188 const char *name);
189
190void stm32mp1_edit_reg(const struct ddr_info *priv,
191 char *name,
192 char *string);
193
194int stm32mp1_dump_param(const struct stm32mp1_ddr_config *config,
195 const char *name);
196
197void stm32mp1_edit_param(const struct stm32mp1_ddr_config *config,
198 char *name,
199 char *string);
200
201void stm32mp1_dump_info(
202 const struct ddr_info *priv,
203 const struct stm32mp1_ddr_config *config);
204
205bool stm32mp1_ddr_interactive(
206 void *priv,
207 enum stm32mp1_ddr_interact_step step,
208 const struct stm32mp1_ddr_config *config);
209
210#endif