summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/include/asm/fsl_ddr_sdram.h
blob: f4732389f66718c580aa96ba9b5aa5aee37d2d1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/*
 * Copyright 2012 GE Intelligent Platforms, Inc.
 * Copyright 2008-2011 Freescale Semiconductor, Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * Version 2 as published by the Free Software Foundation.
 */

#ifndef FSL_DDR_MEMCTL_H
#define FSL_DDR_MEMCTL_H

#include <ddr_spd.h>

/* Basic DDR Technology. */
#define SDRAM_TYPE_DDR1    2
#define SDRAM_TYPE_DDR2    3
#define SDRAM_TYPE_LPDDR1  6
#define SDRAM_TYPE_DDR3    7

#define DDR_BL4	4
#define DDR_BC4	DDR_BL4
#define DDR_OTF	6
#define DDR_BL8	8

#define DDR2_RTT_OFF		0
#define DDR2_RTT_75_OHM		1
#define DDR2_RTT_150_OHM	2
#define DDR2_RTT_50_OHM		3
#define DDR3_RTT_OFF		0
#define DDR3_RTT_40_OHM		3

#define FSL_DDR_MIN_TCKE_PULSE_WIDTH_DDR	(3)
#if defined(CONFIG_FSL_DDR2)
typedef struct ddr2_spd_eeprom generic_spd_eeprom_t;
#define FSL_SDRAM_TYPE	SDRAM_TYPE_DDR2
#elif defined(CONFIG_FSL_DDR3)
typedef struct ddr3_spd_eeprom generic_spd_eeprom_t;
#define FSL_SDRAM_TYPE	SDRAM_TYPE_DDR3
#endif

#define FSL_DDR_ODT_NEVER		0x0
#define FSL_DDR_ODT_CS			0x1
#define FSL_DDR_ODT_ALL_OTHER_CS	0x2
#define FSL_DDR_ODT_OTHER_DIMM		0x3
#define FSL_DDR_ODT_ALL			0x4
#define FSL_DDR_ODT_SAME_DIMM		0x5
#define FSL_DDR_ODT_CS_AND_OTHER_DIMM	0x6
#define FSL_DDR_ODT_OTHER_CS_ONSAMEDIMM	0x7

#define SDRAM_CS_CONFIG_EN		0x80000000

/* DDR_SDRAM_CFG - DDR SDRAM Control Configuration */
#define SDRAM_CFG_MEM_EN		0x80000000
#define SDRAM_CFG_SREN			0x40000000
#define SDRAM_CFG_ECC_EN		0x20000000
#define SDRAM_CFG_RD_EN			0x10000000
#define SDRAM_CFG_SDRAM_TYPE_DDR1	0x02000000
#define SDRAM_CFG_SDRAM_TYPE_DDR2	0x03000000
#define SDRAM_CFG_SDRAM_TYPE_MASK	0x07000000
#define SDRAM_CFG_SDRAM_TYPE_SHIFT	24
#define SDRAM_CFG_DYN_PWR		0x00200000
#define SDRAM_CFG_32_BE			0x00080000
#define SDRAM_CFG_16_BE			0x00100000
#define SDRAM_CFG_8_BE			0x00040000
#define SDRAM_CFG_NCAP			0x00020000
#define SDRAM_CFG_2T_EN			0x00008000
#define SDRAM_CFG_BI			0x00000001

#define SDRAM_CFG2_D_INIT		0x00000010
#define SDRAM_CFG2_ODT_CFG_MASK		0x00600000
#define SDRAM_CFG2_ODT_NEVER		0
#define SDRAM_CFG2_ODT_ONLY_WRITE	1
#define SDRAM_CFG2_ODT_ONLY_READ	2
#define SDRAM_CFG2_ODT_ALWAYS		3

#define MAX_CHIP_SELECTS_PER_CTRL	4
#define MAX_DIMM_SLOTS_PER_CTLR		4

/*
 * Memory controller characteristics and I2C parameters to
 * read the SPD data.
 */
struct ddr_board_info_s {
	uint32_t fsl_ddr_ver;
	void __iomem *ddr_base;
	uint32_t cs_per_ctrl;
	uint32_t dimm_slots_per_ctrl;
	uint32_t i2c_bus;
	uint32_t i2c_slave;
	uint32_t i2c_speed;
	void __iomem *i2c_base;
	const uint8_t *spd_i2c_addr;
};

/*
 * Generalized parameters for memory controller configuration,
 * might be a little specific to the FSL memory controller
 */
struct memctl_options_s {
	struct ddr_board_info_s *board_info;
	uint32_t sdram_type;
	/*
	 * Memory organization parameters
	 *
	 * if DIMM is present in the system
	 * where DIMMs are with respect to chip select
	 * where chip selects are with respect to memory boundaries
	 */
	uint32_t registered_dimm_en;
	/* Options local to a Chip Select */
	struct cs_local_opts_s {
		uint32_t auto_precharge;
		uint32_t odt_rd_cfg;
		uint32_t odt_wr_cfg;
		uint32_t odt_rtt_norm;
		uint32_t odt_rtt_wr;
	} cs_local_opts[MAX_CHIP_SELECTS_PER_CTRL];
	/* DLL reset disable */
	uint32_t dll_rst_dis;
	/* Operational mode parameters */
	uint32_t ECC_mode;
	uint32_t ECC_init_using_memctl;
	uint32_t data_init;
	/* Use DQS? maybe only with DDR2? */
	uint32_t DQS_config;
	uint32_t self_refresh_in_sleep;
	uint32_t dynamic_power;
	uint32_t data_bus_width;
	uint32_t burst_length;
	uint32_t otf_burst_chop_en;
	uint32_t mirrored_dimm;
	uint32_t ap_en;
	uint32_t x4_en;
	/* Global Timing Parameters */
	uint32_t cas_latency_override;
	uint32_t cas_latency_override_value;
	uint32_t use_derated_caslat;
	uint32_t additive_latency_override;
	uint32_t additive_latency_override_value;
	uint32_t clk_adjust;
	uint32_t cpo_override;
	uint32_t write_data_delay;
	/* Write leveling */
	uint32_t wrlvl_override;
	uint32_t wrlvl_sample;
	uint32_t wrlvl_start;
	uint32_t wrlvl_ctl_2;
	uint32_t wrlvl_ctl_3;
	uint32_t half_strength_driver_enable;
	uint32_t twoT_en;
	uint32_t threet_en;
	uint32_t bstopre;
	uint32_t tCKE_clock_pulse_width_ps;
	uint32_t tFAW_window_four_activates_ps;
	/* Rtt impedance */
	uint32_t rtt_override;
	uint32_t rtt_override_value;
	uint32_t rtt_wr_override_value;
	/* Automatic self refresh */
	uint32_t auto_self_refresh_en;
	uint32_t sr_it;
	/* ZQ calibration */
	uint32_t zq_en;
	/* Write leveling */
	uint32_t wrlvl_en;
	/* RCW override for RDIMM */
	uint32_t rcw_override;
	uint32_t rcw_1;
	uint32_t rcw_2;
	/* control register 1 */
	uint32_t ddr_cdr1;
	uint32_t ddr_cdr2;
	/* read-to-write turnaround */
	uint32_t trwt_override;
	uint32_t trwt;
	/* Powerdon timings. */
	uint32_t txp;
	uint32_t taxpd;
	uint32_t txard;
	/* Load mode cycle time */
	uint32_t tmrd;
};

extern phys_size_t fsl_ddr_sdram(void);
extern phys_size_t fixed_sdram(void);
#endif