Merge git://git.denx.de/u-boot-fsl-qoriq
[oweals/u-boot.git] / drivers / ram / stm32mp1 / stm32mp1_ddr.h
1 /*
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
10 enum 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 */
19 struct stm32mp1_ddrctl;
20 struct 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  */
32 struct 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
41 struct 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
70 struct 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
85 struct 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
97 struct 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
117 struct 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
131 struct 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
144 struct 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
159 struct stm32mp1_ddr_info {
160         const char *name;
161         u16 speed; /* in MHZ */
162         u32 size;  /* memory size in byte = col * row * width */
163 };
164
165 struct 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
176 int stm32mp1_ddr_clk_enable(struct ddr_info *priv, u16 mem_speed);
177 void stm32mp1_ddrphy_init(struct stm32mp1_ddrphy *phy, u32 pir);
178 void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl);
179 void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
180                               u32 rfshctl3,
181                               u32 pwrctl);
182
183 void stm32mp1_ddr_init(
184         struct ddr_info *priv,
185         const struct stm32mp1_ddr_config *config);
186
187 int stm32mp1_dump_reg(const struct ddr_info *priv,
188                       const char *name);
189
190 void stm32mp1_edit_reg(const struct ddr_info *priv,
191                        char *name,
192                        char *string);
193
194 int stm32mp1_dump_param(const struct stm32mp1_ddr_config *config,
195                         const char *name);
196
197 void stm32mp1_edit_param(const struct stm32mp1_ddr_config *config,
198                          char *name,
199                          char *string);
200
201 void stm32mp1_dump_info(
202         const struct ddr_info *priv,
203         const struct stm32mp1_ddr_config *config);
204
205 bool stm32mp1_ddr_interactive(
206         void *priv,
207         enum stm32mp1_ddr_interact_step step,
208         const struct stm32mp1_ddr_config *config);
209
210 #endif