xref: /openbmc/u-boot/drivers/ddr/marvell/a38x/ddr_topology_def.h (revision 8cb8c0c6a83bef319023ac2e967a85e1e92e18bc)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0 */
2f1df9364SStefan Roese /*
3f1df9364SStefan Roese  * Copyright (C) Marvell International Ltd. and its affiliates
4f1df9364SStefan Roese  */
5f1df9364SStefan Roese 
6f1df9364SStefan Roese #ifndef _DDR_TOPOLOGY_DEF_H
7f1df9364SStefan Roese #define _DDR_TOPOLOGY_DEF_H
8f1df9364SStefan Roese 
9f1df9364SStefan Roese #include "ddr3_training_ip_def.h"
102b4ffbf6SChris Packham #include "mv_ddr_topology.h"
112b4ffbf6SChris Packham #include "mv_ddr_spd.h"
122b4ffbf6SChris Packham #include "ddr3_logging_def.h"
1390bcc3d3SMarek Behún 
14*ebb1a593SChris Packham #define MV_DDR_MAX_BUS_NUM	9
15*ebb1a593SChris Packham #define MV_DDR_MAX_IFACE_NUM	1
16*ebb1a593SChris Packham 
17f1df9364SStefan Roese struct bus_params {
18f1df9364SStefan Roese 	/* Chip Select (CS) bitmask (bits 0-CS0, bit 1- CS1 ...) */
19f1df9364SStefan Roese 	u8 cs_bitmask;
20f1df9364SStefan Roese 
21f1df9364SStefan Roese 	/*
22f1df9364SStefan Roese 	 * mirror enable/disable
23f1df9364SStefan Roese 	 * (bits 0-CS0 mirroring, bit 1- CS1 mirroring ...)
24f1df9364SStefan Roese 	 */
25f1df9364SStefan Roese 	int mirror_enable_bitmask;
26f1df9364SStefan Roese 
27f1df9364SStefan Roese 	/* DQS Swap (polarity) - true if enable */
28f1df9364SStefan Roese 	int is_dqs_swap;
29f1df9364SStefan Roese 
30f1df9364SStefan Roese 	/* CK swap (polarity) - true if enable */
31f1df9364SStefan Roese 	int is_ck_swap;
32f1df9364SStefan Roese };
33f1df9364SStefan Roese 
34f1df9364SStefan Roese struct if_params {
35f1df9364SStefan Roese 	/* bus configuration */
36*ebb1a593SChris Packham 	struct bus_params as_bus_params[MV_DDR_MAX_BUS_NUM];
37f1df9364SStefan Roese 
38f1df9364SStefan Roese 	/* Speed Bin Table */
39*ebb1a593SChris Packham 	enum mv_ddr_speed_bin speed_bin_index;
40f1df9364SStefan Roese 
412b4ffbf6SChris Packham 	/* sdram device width */
422b4ffbf6SChris Packham 	enum mv_ddr_dev_width bus_width;
43f1df9364SStefan Roese 
442b4ffbf6SChris Packham 	/* total sdram capacity per die, megabits */
452b4ffbf6SChris Packham 	enum mv_ddr_die_capacity memory_size;
46f1df9364SStefan Roese 
47f1df9364SStefan Roese 	/* The DDR frequency for each interfaces */
48*ebb1a593SChris Packham 	enum mv_ddr_freq memory_freq;
49f1df9364SStefan Roese 
50f1df9364SStefan Roese 	/*
51f1df9364SStefan Roese 	 * delay CAS Write Latency
52f1df9364SStefan Roese 	 * - 0 for using default value (jedec suggested)
53f1df9364SStefan Roese 	 */
54f1df9364SStefan Roese 	u8 cas_wl;
55f1df9364SStefan Roese 
56f1df9364SStefan Roese 	/*
57f1df9364SStefan Roese 	 * delay CAS Latency
58f1df9364SStefan Roese 	 * - 0 for using default value (jedec suggested)
59f1df9364SStefan Roese 	 */
60f1df9364SStefan Roese 	u8 cas_l;
61f1df9364SStefan Roese 
62f1df9364SStefan Roese 	/* operation temperature */
632b4ffbf6SChris Packham 	enum mv_ddr_temperature interface_temp;
64e6f61622SChris Packham 
65e6f61622SChris Packham 	/* 2T vs 1T mode (by default computed from number of CSs) */
66e6f61622SChris Packham 	enum mv_ddr_timing timing;
67f1df9364SStefan Roese };
68f1df9364SStefan Roese 
69*ebb1a593SChris Packham /* memory electrical configuration */
70*ebb1a593SChris Packham struct mv_ddr_mem_edata {
71*ebb1a593SChris Packham 	enum mv_ddr_rtt_nom_park_evalue rtt_nom;
72*ebb1a593SChris Packham 	enum mv_ddr_rtt_nom_park_evalue rtt_park[MAX_CS_NUM];
73*ebb1a593SChris Packham 	enum mv_ddr_rtt_wr_evalue rtt_wr[MAX_CS_NUM];
74*ebb1a593SChris Packham 	enum mv_ddr_dic_evalue dic;
75*ebb1a593SChris Packham };
76*ebb1a593SChris Packham 
77*ebb1a593SChris Packham /* phy electrical configuration */
78*ebb1a593SChris Packham struct mv_ddr_phy_edata {
79*ebb1a593SChris Packham 	enum mv_ddr_ohm_evalue drv_data_p;
80*ebb1a593SChris Packham 	enum mv_ddr_ohm_evalue drv_data_n;
81*ebb1a593SChris Packham 	enum mv_ddr_ohm_evalue drv_ctrl_p;
82*ebb1a593SChris Packham 	enum mv_ddr_ohm_evalue drv_ctrl_n;
83*ebb1a593SChris Packham 	enum mv_ddr_ohm_evalue odt_p[MAX_CS_NUM];
84*ebb1a593SChris Packham 	enum mv_ddr_ohm_evalue odt_n[MAX_CS_NUM];
85*ebb1a593SChris Packham };
86*ebb1a593SChris Packham 
87*ebb1a593SChris Packham /* mac electrical configuration */
88*ebb1a593SChris Packham struct mv_ddr_mac_edata {
89*ebb1a593SChris Packham 	enum mv_ddr_odt_cfg_evalue odt_cfg_pat;
90*ebb1a593SChris Packham 	enum mv_ddr_odt_cfg_evalue odt_cfg_wr;
91*ebb1a593SChris Packham 	enum mv_ddr_odt_cfg_evalue odt_cfg_rd;
92*ebb1a593SChris Packham };
93*ebb1a593SChris Packham 
94*ebb1a593SChris Packham struct mv_ddr_edata {
95*ebb1a593SChris Packham 	struct mv_ddr_mem_edata mem_edata;
96*ebb1a593SChris Packham 	struct mv_ddr_phy_edata phy_edata;
97*ebb1a593SChris Packham 	struct mv_ddr_mac_edata mac_edata;
98*ebb1a593SChris Packham };
99*ebb1a593SChris Packham 
1002b4ffbf6SChris Packham struct mv_ddr_topology_map {
1012b4ffbf6SChris Packham 	/* debug level configuration */
1022b4ffbf6SChris Packham 	enum mv_ddr_debug_level debug_level;
1032b4ffbf6SChris Packham 
104f1df9364SStefan Roese 	/* Number of interfaces (default is 12) */
105f1df9364SStefan Roese 	u8 if_act_mask;
106f1df9364SStefan Roese 
107f1df9364SStefan Roese 	/* Controller configuration per interface */
108*ebb1a593SChris Packham 	struct if_params interface_params[MV_DDR_MAX_IFACE_NUM];
109f1df9364SStefan Roese 
110f1df9364SStefan Roese 	/* Bit mask for active buses */
1112b4ffbf6SChris Packham 	u16 bus_act_mask;
1122b4ffbf6SChris Packham 
1132b4ffbf6SChris Packham 	/* source of ddr configuration data */
1142b4ffbf6SChris Packham 	enum mv_ddr_cfg_src cfg_src;
1152b4ffbf6SChris Packham 
1162b4ffbf6SChris Packham 	/* raw spd data */
1172b4ffbf6SChris Packham 	union mv_ddr_spd_data spd_data;
1182b4ffbf6SChris Packham 
1192b4ffbf6SChris Packham 	/* timing parameters */
1202b4ffbf6SChris Packham 	unsigned int timing_data[MV_DDR_TDATA_LAST];
121*ebb1a593SChris Packham 
122*ebb1a593SChris Packham 	/* electrical configuration */
123*ebb1a593SChris Packham 	struct mv_ddr_edata edata;
124*ebb1a593SChris Packham 
125*ebb1a593SChris Packham 	/* electrical parameters */
126*ebb1a593SChris Packham 	unsigned int electrical_data[MV_DDR_EDATA_LAST];
127f1df9364SStefan Roese };
128f1df9364SStefan Roese 
129*ebb1a593SChris Packham enum mv_ddr_iface_mode {
130*ebb1a593SChris Packham 	MV_DDR_RAR_ENA,
131*ebb1a593SChris Packham 	MV_DDR_RAR_DIS,
132*ebb1a593SChris Packham };
133*ebb1a593SChris Packham 
134*ebb1a593SChris Packham enum mv_ddr_iface_state {
135*ebb1a593SChris Packham 	MV_DDR_IFACE_NRDY,	/* not ready */
136*ebb1a593SChris Packham 	MV_DDR_IFACE_INIT,	/* init'd */
137*ebb1a593SChris Packham 	MV_DDR_IFACE_RDY,	/* ready */
138*ebb1a593SChris Packham 	MV_DDR_IFACE_DNE	/* does not exist */
139*ebb1a593SChris Packham };
140*ebb1a593SChris Packham 
141*ebb1a593SChris Packham enum mv_ddr_validation {
142*ebb1a593SChris Packham 	MV_DDR_VAL_DIS,
143*ebb1a593SChris Packham 	MV_DDR_VAL_RX,
144*ebb1a593SChris Packham 	MV_DDR_VAL_TX,
145*ebb1a593SChris Packham 	MV_DDR_VAL_RX_TX
146*ebb1a593SChris Packham };
147*ebb1a593SChris Packham 
148*ebb1a593SChris Packham struct mv_ddr_iface {
149*ebb1a593SChris Packham 	/* base addr of ap ddr interface belongs to */
150*ebb1a593SChris Packham 	unsigned int ap_base;
151*ebb1a593SChris Packham 
152*ebb1a593SChris Packham 	/* ddr interface id */
153*ebb1a593SChris Packham 	unsigned int id;
154*ebb1a593SChris Packham 
155*ebb1a593SChris Packham 	/* ddr interface state */
156*ebb1a593SChris Packham 	enum mv_ddr_iface_state state;
157*ebb1a593SChris Packham 
158*ebb1a593SChris Packham 	/* ddr interface mode (rar enabled/disabled) */
159*ebb1a593SChris Packham 	enum mv_ddr_iface_mode iface_mode;
160*ebb1a593SChris Packham 
161*ebb1a593SChris Packham 	/* ddr interface base address */
162*ebb1a593SChris Packham 	unsigned long long iface_base_addr;
163*ebb1a593SChris Packham 
164*ebb1a593SChris Packham 	/* ddr interface size - ddr flow will update this parameter */
165*ebb1a593SChris Packham 	unsigned long long iface_byte_size;
166*ebb1a593SChris Packham 
167*ebb1a593SChris Packham 	/* ddr i2c spd data address */
168*ebb1a593SChris Packham 	unsigned int spd_data_addr;
169*ebb1a593SChris Packham 
170*ebb1a593SChris Packham 	/* ddr i2c spd page 0 select address */
171*ebb1a593SChris Packham 	unsigned int spd_page_sel_addr;
172*ebb1a593SChris Packham 
173*ebb1a593SChris Packham 	/* ddr interface validation mode */
174*ebb1a593SChris Packham 	enum mv_ddr_validation validation;
175*ebb1a593SChris Packham 
176*ebb1a593SChris Packham 	/* ddr interface topology map */
177*ebb1a593SChris Packham 	struct mv_ddr_topology_map tm;
178*ebb1a593SChris Packham };
179*ebb1a593SChris Packham 
180*ebb1a593SChris Packham struct mv_ddr_iface *mv_ddr_iface_get(void);
181*ebb1a593SChris Packham 
182f1df9364SStefan Roese /* DDR3 training global configuration parameters */
183f1df9364SStefan Roese struct tune_train_params {
184f1df9364SStefan Roese 	u32 ck_delay;
185f1df9364SStefan Roese 	u32 phy_reg3_val;
1862b4ffbf6SChris Packham 	u32 g_zpri_data;
1872b4ffbf6SChris Packham 	u32 g_znri_data;
1882b4ffbf6SChris Packham 	u32 g_zpri_ctrl;
1892b4ffbf6SChris Packham 	u32 g_znri_ctrl;
1902b4ffbf6SChris Packham 	u32 g_zpodt_data;
1912b4ffbf6SChris Packham 	u32 g_znodt_data;
1922b4ffbf6SChris Packham 	u32 g_zpodt_ctrl;
1932b4ffbf6SChris Packham 	u32 g_znodt_ctrl;
1942b4ffbf6SChris Packham 	u32 g_dic;
1952b4ffbf6SChris Packham 	u32 g_odt_config;
1962b4ffbf6SChris Packham 	u32 g_rtt_nom;
1972b4ffbf6SChris Packham 	u32 g_rtt_wr;
1982b4ffbf6SChris Packham 	u32 g_rtt_park;
199f1df9364SStefan Roese };
200f1df9364SStefan Roese 
201f1df9364SStefan Roese #endif /* _DDR_TOPOLOGY_DEF_H */
202