xref: /rk3399_ARM-atf/plat/rockchip/rk3399/drivers/dram/dram.h (revision 951752dd6cb7c729d3dc3d0d8cb77db661e894fe)
1fe877779SCaesar Wang /*
2fe877779SCaesar Wang  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3fe877779SCaesar Wang  *
4fe877779SCaesar Wang  * Redistribution and use in source and binary forms, with or without
5fe877779SCaesar Wang  * modification, are permitted provided that the following conditions are met:
6fe877779SCaesar Wang  *
7fe877779SCaesar Wang  * Redistributions of source code must retain the above copyright notice, this
8fe877779SCaesar Wang  * list of conditions and the following disclaimer.
9fe877779SCaesar Wang  *
10fe877779SCaesar Wang  * Redistributions in binary form must reproduce the above copyright notice,
11fe877779SCaesar Wang  * this list of conditions and the following disclaimer in the documentation
12fe877779SCaesar Wang  * and/or other materials provided with the distribution.
13fe877779SCaesar Wang  *
14fe877779SCaesar Wang  * Neither the name of ARM nor the names of its contributors may be used
15fe877779SCaesar Wang  * to endorse or promote products derived from this software without specific
16fe877779SCaesar Wang  * prior written permission.
17fe877779SCaesar Wang  *
18fe877779SCaesar Wang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19fe877779SCaesar Wang  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20fe877779SCaesar Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21fe877779SCaesar Wang  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22fe877779SCaesar Wang  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23fe877779SCaesar Wang  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24fe877779SCaesar Wang  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25fe877779SCaesar Wang  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26fe877779SCaesar Wang  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27fe877779SCaesar Wang  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28fe877779SCaesar Wang  * POSSIBILITY OF SUCH DAMAGE.
29fe877779SCaesar Wang  */
30fe877779SCaesar Wang 
31613038bcSCaesar Wang #ifndef __SOC_ROCKCHIP_RK3399_DRAM_H__
32613038bcSCaesar Wang #define __SOC_ROCKCHIP_RK3399_DRAM_H__
331830f790SXing Zheng 
341830f790SXing Zheng #include <dram_regs.h>
35613038bcSCaesar Wang #include <plat_private.h>
36613038bcSCaesar Wang #include <stdint.h>
37fe877779SCaesar Wang 
38613038bcSCaesar Wang enum {
39613038bcSCaesar Wang 	DDR3 = 3,
40613038bcSCaesar Wang 	LPDDR2 = 5,
41613038bcSCaesar Wang 	LPDDR3 = 6,
42613038bcSCaesar Wang 	LPDDR4 = 7,
43613038bcSCaesar Wang 	UNUSED = 0xff
44613038bcSCaesar Wang };
45fe877779SCaesar Wang 
46fe877779SCaesar Wang struct rk3399_ddr_pctl_regs {
47613038bcSCaesar Wang 	uint32_t denali_ctl[CTL_REG_NUM];
48fe877779SCaesar Wang };
49fe877779SCaesar Wang 
50fe877779SCaesar Wang struct rk3399_ddr_publ_regs {
51613038bcSCaesar Wang 	uint32_t denali_phy[PHY_REG_NUM];
52fe877779SCaesar Wang };
53fe877779SCaesar Wang 
54fe877779SCaesar Wang struct rk3399_ddr_pi_regs {
55613038bcSCaesar Wang 	uint32_t denali_pi[PI_REG_NUM];
56fe877779SCaesar Wang };
57fe877779SCaesar Wang union noc_ddrtiminga0 {
58fe877779SCaesar Wang 	uint32_t d32;
59fe877779SCaesar Wang 	struct {
60fe877779SCaesar Wang 		unsigned acttoact : 6;
61fe877779SCaesar Wang 		unsigned reserved0 : 2;
62fe877779SCaesar Wang 		unsigned rdtomiss : 6;
63fe877779SCaesar Wang 		unsigned reserved1 : 2;
64fe877779SCaesar Wang 		unsigned wrtomiss : 6;
65fe877779SCaesar Wang 		unsigned reserved2 : 2;
66fe877779SCaesar Wang 		unsigned readlatency : 8;
67fe877779SCaesar Wang 	} b;
68fe877779SCaesar Wang };
69fe877779SCaesar Wang 
70fe877779SCaesar Wang union noc_ddrtimingb0 {
71fe877779SCaesar Wang 	uint32_t d32;
72fe877779SCaesar Wang 	struct {
73fe877779SCaesar Wang 		unsigned rdtowr : 5;
74fe877779SCaesar Wang 		unsigned reserved0 : 3;
75fe877779SCaesar Wang 		unsigned wrtord : 5;
76fe877779SCaesar Wang 		unsigned reserved1 : 3;
77fe877779SCaesar Wang 		unsigned rrd : 4;
78fe877779SCaesar Wang 		unsigned reserved2 : 4;
79fe877779SCaesar Wang 		unsigned faw : 6;
80fe877779SCaesar Wang 		unsigned reserved3 : 2;
81fe877779SCaesar Wang 	} b;
82fe877779SCaesar Wang };
83fe877779SCaesar Wang 
84fe877779SCaesar Wang union noc_ddrtimingc0 {
85fe877779SCaesar Wang 	uint32_t d32;
86fe877779SCaesar Wang 	struct {
87fe877779SCaesar Wang 		unsigned burstpenalty : 4;
88fe877779SCaesar Wang 		unsigned reserved0 : 4;
89fe877779SCaesar Wang 		unsigned wrtomwr : 6;
90fe877779SCaesar Wang 		unsigned reserved1 : 18;
91fe877779SCaesar Wang 	} b;
92fe877779SCaesar Wang };
93fe877779SCaesar Wang 
94fe877779SCaesar Wang union noc_devtodev0 {
95fe877779SCaesar Wang 	uint32_t d32;
96fe877779SCaesar Wang 	struct {
97fe877779SCaesar Wang 		unsigned busrdtord : 3;
98fe877779SCaesar Wang 		unsigned reserved0 : 1;
99fe877779SCaesar Wang 		unsigned busrdtowr : 3;
100fe877779SCaesar Wang 		unsigned reserved1 : 1;
101fe877779SCaesar Wang 		unsigned buswrtord : 3;
102fe877779SCaesar Wang 		unsigned reserved2 : 1;
103fe877779SCaesar Wang 		unsigned buswrtowr : 3;
104fe877779SCaesar Wang 		unsigned reserved3 : 17;
105fe877779SCaesar Wang 	} b;
106fe877779SCaesar Wang };
107fe877779SCaesar Wang 
108fe877779SCaesar Wang union noc_ddrmode {
109fe877779SCaesar Wang 	uint32_t d32;
110fe877779SCaesar Wang 	struct {
111fe877779SCaesar Wang 		unsigned autoprecharge : 1;
112fe877779SCaesar Wang 		unsigned bypassfiltering : 1;
113fe877779SCaesar Wang 		unsigned fawbank : 1;
114fe877779SCaesar Wang 		unsigned burstsize : 2;
115fe877779SCaesar Wang 		unsigned mwrsize : 2;
116fe877779SCaesar Wang 		unsigned reserved2 : 1;
117fe877779SCaesar Wang 		unsigned forceorder : 8;
118fe877779SCaesar Wang 		unsigned forceorderstate : 8;
119fe877779SCaesar Wang 		unsigned reserved3 : 8;
120fe877779SCaesar Wang 	} b;
121fe877779SCaesar Wang };
122fe877779SCaesar Wang 
123fe877779SCaesar Wang struct rk3399_msch_timings {
124fe877779SCaesar Wang 	union noc_ddrtiminga0 ddrtiminga0;
125fe877779SCaesar Wang 	union noc_ddrtimingb0 ddrtimingb0;
126fe877779SCaesar Wang 	union noc_ddrtimingc0 ddrtimingc0;
127fe877779SCaesar Wang 	union noc_devtodev0 devtodev0;
128fe877779SCaesar Wang 	union noc_ddrmode ddrmode;
129fe877779SCaesar Wang 	uint32_t agingx0;
130fe877779SCaesar Wang };
131613038bcSCaesar Wang 
132fe877779SCaesar Wang struct rk3399_sdram_channel {
133fe877779SCaesar Wang 	unsigned char rank;
134fe877779SCaesar Wang 	/* col = 0, means this channel is invalid */
135fe877779SCaesar Wang 	unsigned char col;
136fe877779SCaesar Wang 	/* 3:8bank, 2:4bank */
137fe877779SCaesar Wang 	unsigned char bk;
138fe877779SCaesar Wang 	/* channel buswidth, 2:32bit, 1:16bit, 0:8bit */
139fe877779SCaesar Wang 	unsigned char bw;
140fe877779SCaesar Wang 	/* die buswidth, 2:32bit, 1:16bit, 0:8bit */
141fe877779SCaesar Wang 	unsigned char dbw;
142fe877779SCaesar Wang 	/* row_3_4 = 1: 6Gb or 12Gb die
143fe877779SCaesar Wang 	 * row_3_4 = 0: normal die, power of 2
144fe877779SCaesar Wang 	 */
145fe877779SCaesar Wang 	unsigned char row_3_4;
146fe877779SCaesar Wang 	unsigned char cs0_row;
147fe877779SCaesar Wang 	unsigned char cs1_row;
148fe877779SCaesar Wang 	uint32_t ddrconfig;
149fe877779SCaesar Wang 	struct rk3399_msch_timings noc_timings;
150fe877779SCaesar Wang };
151fe877779SCaesar Wang 
152fe877779SCaesar Wang struct rk3399_sdram_params {
153fe877779SCaesar Wang 	struct rk3399_sdram_channel ch[2];
154fe877779SCaesar Wang 	uint32_t ddr_freq;
155fe877779SCaesar Wang 	unsigned char dramtype;
156fe877779SCaesar Wang 	unsigned char num_channels;
157fe877779SCaesar Wang 	unsigned char stride;
158fe877779SCaesar Wang 	unsigned char odt;
159fe877779SCaesar Wang 	struct rk3399_ddr_pctl_regs pctl_regs;
160fe877779SCaesar Wang 	struct rk3399_ddr_pi_regs pi_regs;
161fe877779SCaesar Wang 	struct rk3399_ddr_publ_regs phy_regs;
162*951752ddSDerek Basehore 	uint32_t rx_cal_dqs[2][4];
163fe877779SCaesar Wang };
164fe877779SCaesar Wang 
165613038bcSCaesar Wang extern __sramdata struct rk3399_sdram_params sdram_config;
166fe877779SCaesar Wang 
167613038bcSCaesar Wang void dram_init(void);
168fe877779SCaesar Wang 
169fe877779SCaesar Wang #endif
170