xref: /arm-trusted-firmware/plat/rockchip/rk3399/drivers/dram/dram.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef DRAM_H
8*91f16700Schasinglulu #define DRAM_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <stdint.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <dram_regs.h>
13*91f16700Schasinglulu #include <plat_private.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu enum {
16*91f16700Schasinglulu 	DDR3 = 3,
17*91f16700Schasinglulu 	LPDDR2 = 5,
18*91f16700Schasinglulu 	LPDDR3 = 6,
19*91f16700Schasinglulu 	LPDDR4 = 7,
20*91f16700Schasinglulu 	UNUSED = 0xff
21*91f16700Schasinglulu };
22*91f16700Schasinglulu 
23*91f16700Schasinglulu struct rk3399_ddr_pctl_regs {
24*91f16700Schasinglulu 	uint32_t denali_ctl[CTL_REG_NUM];
25*91f16700Schasinglulu };
26*91f16700Schasinglulu 
27*91f16700Schasinglulu struct rk3399_ddr_publ_regs {
28*91f16700Schasinglulu 	/*
29*91f16700Schasinglulu 	 * PHY registers from 0 to 90 for slice1.
30*91f16700Schasinglulu 	 * These are used to restore slice1-4 on resume.
31*91f16700Schasinglulu 	 */
32*91f16700Schasinglulu 	uint32_t phy0[91];
33*91f16700Schasinglulu 	/*
34*91f16700Schasinglulu 	 * PHY registers from 512 to 895.
35*91f16700Schasinglulu 	 * Only registers 0-37 of each 128 register range are used.
36*91f16700Schasinglulu 	 */
37*91f16700Schasinglulu 	uint32_t phy512[3][38];
38*91f16700Schasinglulu 	uint32_t phy896[63];
39*91f16700Schasinglulu };
40*91f16700Schasinglulu 
41*91f16700Schasinglulu struct rk3399_ddr_pi_regs {
42*91f16700Schasinglulu 	uint32_t denali_pi[PI_REG_NUM];
43*91f16700Schasinglulu };
44*91f16700Schasinglulu union noc_ddrtiminga0 {
45*91f16700Schasinglulu 	uint32_t d32;
46*91f16700Schasinglulu 	struct {
47*91f16700Schasinglulu 		unsigned acttoact : 6;
48*91f16700Schasinglulu 		unsigned reserved0 : 2;
49*91f16700Schasinglulu 		unsigned rdtomiss : 6;
50*91f16700Schasinglulu 		unsigned reserved1 : 2;
51*91f16700Schasinglulu 		unsigned wrtomiss : 6;
52*91f16700Schasinglulu 		unsigned reserved2 : 2;
53*91f16700Schasinglulu 		unsigned readlatency : 8;
54*91f16700Schasinglulu 	} b;
55*91f16700Schasinglulu };
56*91f16700Schasinglulu 
57*91f16700Schasinglulu union noc_ddrtimingb0 {
58*91f16700Schasinglulu 	uint32_t d32;
59*91f16700Schasinglulu 	struct {
60*91f16700Schasinglulu 		unsigned rdtowr : 5;
61*91f16700Schasinglulu 		unsigned reserved0 : 3;
62*91f16700Schasinglulu 		unsigned wrtord : 5;
63*91f16700Schasinglulu 		unsigned reserved1 : 3;
64*91f16700Schasinglulu 		unsigned rrd : 4;
65*91f16700Schasinglulu 		unsigned reserved2 : 4;
66*91f16700Schasinglulu 		unsigned faw : 6;
67*91f16700Schasinglulu 		unsigned reserved3 : 2;
68*91f16700Schasinglulu 	} b;
69*91f16700Schasinglulu };
70*91f16700Schasinglulu 
71*91f16700Schasinglulu union noc_ddrtimingc0 {
72*91f16700Schasinglulu 	uint32_t d32;
73*91f16700Schasinglulu 	struct {
74*91f16700Schasinglulu 		unsigned burstpenalty : 4;
75*91f16700Schasinglulu 		unsigned reserved0 : 4;
76*91f16700Schasinglulu 		unsigned wrtomwr : 6;
77*91f16700Schasinglulu 		unsigned reserved1 : 18;
78*91f16700Schasinglulu 	} b;
79*91f16700Schasinglulu };
80*91f16700Schasinglulu 
81*91f16700Schasinglulu union noc_devtodev0 {
82*91f16700Schasinglulu 	uint32_t d32;
83*91f16700Schasinglulu 	struct {
84*91f16700Schasinglulu 		unsigned busrdtord : 3;
85*91f16700Schasinglulu 		unsigned reserved0 : 1;
86*91f16700Schasinglulu 		unsigned busrdtowr : 3;
87*91f16700Schasinglulu 		unsigned reserved1 : 1;
88*91f16700Schasinglulu 		unsigned buswrtord : 3;
89*91f16700Schasinglulu 		unsigned reserved2 : 1;
90*91f16700Schasinglulu 		unsigned buswrtowr : 3;
91*91f16700Schasinglulu 		unsigned reserved3 : 17;
92*91f16700Schasinglulu 	} b;
93*91f16700Schasinglulu };
94*91f16700Schasinglulu 
95*91f16700Schasinglulu union noc_ddrmode {
96*91f16700Schasinglulu 	uint32_t d32;
97*91f16700Schasinglulu 	struct {
98*91f16700Schasinglulu 		unsigned autoprecharge : 1;
99*91f16700Schasinglulu 		unsigned bypassfiltering : 1;
100*91f16700Schasinglulu 		unsigned fawbank : 1;
101*91f16700Schasinglulu 		unsigned burstsize : 2;
102*91f16700Schasinglulu 		unsigned mwrsize : 2;
103*91f16700Schasinglulu 		unsigned reserved2 : 1;
104*91f16700Schasinglulu 		unsigned forceorder : 8;
105*91f16700Schasinglulu 		unsigned forceorderstate : 8;
106*91f16700Schasinglulu 		unsigned reserved3 : 8;
107*91f16700Schasinglulu 	} b;
108*91f16700Schasinglulu };
109*91f16700Schasinglulu 
110*91f16700Schasinglulu struct rk3399_msch_timings {
111*91f16700Schasinglulu 	union noc_ddrtiminga0 ddrtiminga0;
112*91f16700Schasinglulu 	union noc_ddrtimingb0 ddrtimingb0;
113*91f16700Schasinglulu 	union noc_ddrtimingc0 ddrtimingc0;
114*91f16700Schasinglulu 	union noc_devtodev0 devtodev0;
115*91f16700Schasinglulu 	union noc_ddrmode ddrmode;
116*91f16700Schasinglulu 	uint32_t agingx0;
117*91f16700Schasinglulu };
118*91f16700Schasinglulu 
119*91f16700Schasinglulu struct rk3399_sdram_channel {
120*91f16700Schasinglulu 	unsigned char rank;
121*91f16700Schasinglulu 	/* col = 0, means this channel is invalid */
122*91f16700Schasinglulu 	unsigned char col;
123*91f16700Schasinglulu 	/* 3:8bank, 2:4bank */
124*91f16700Schasinglulu 	unsigned char bk;
125*91f16700Schasinglulu 	/* channel buswidth, 2:32bit, 1:16bit, 0:8bit */
126*91f16700Schasinglulu 	unsigned char bw;
127*91f16700Schasinglulu 	/* die buswidth, 2:32bit, 1:16bit, 0:8bit */
128*91f16700Schasinglulu 	unsigned char dbw;
129*91f16700Schasinglulu 	/* row_3_4 = 1: 6Gb or 12Gb die
130*91f16700Schasinglulu 	 * row_3_4 = 0: normal die, power of 2
131*91f16700Schasinglulu 	 */
132*91f16700Schasinglulu 	unsigned char row_3_4;
133*91f16700Schasinglulu 	unsigned char cs0_row;
134*91f16700Schasinglulu 	unsigned char cs1_row;
135*91f16700Schasinglulu 	uint32_t ddrconfig;
136*91f16700Schasinglulu 	struct rk3399_msch_timings noc_timings;
137*91f16700Schasinglulu };
138*91f16700Schasinglulu 
139*91f16700Schasinglulu struct rk3399_sdram_params {
140*91f16700Schasinglulu 	struct rk3399_sdram_channel ch[2];
141*91f16700Schasinglulu 	uint32_t ddr_freq;
142*91f16700Schasinglulu 	unsigned char dramtype;
143*91f16700Schasinglulu 	unsigned char num_channels;
144*91f16700Schasinglulu 	unsigned char stride;
145*91f16700Schasinglulu 	unsigned char odt;
146*91f16700Schasinglulu 	struct rk3399_ddr_pctl_regs pctl_regs;
147*91f16700Schasinglulu 	struct rk3399_ddr_pi_regs pi_regs;
148*91f16700Schasinglulu 	struct rk3399_ddr_publ_regs phy_regs;
149*91f16700Schasinglulu 	uint32_t rx_cal_dqs[2][4];
150*91f16700Schasinglulu };
151*91f16700Schasinglulu 
152*91f16700Schasinglulu extern struct rk3399_sdram_params sdram_config;
153*91f16700Schasinglulu 
154*91f16700Schasinglulu void dram_init(void);
155*91f16700Schasinglulu 
156*91f16700Schasinglulu #endif /* DRAM_H */
157