summaryrefslogtreecommitdiffstats
path: root/arch/ppc/include/asm/fsl_ddr_sdram.h
blob: 444bcbc497053799c8fd8172020fce38b356a91c (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
/*
 * 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_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

#if defined(CONFIG_FSL_DDR2)
#define FSL_DDR_MIN_TCKE_PULSE_WIDTH_DDR	(3)
typedef struct ddr2_spd_eeprom_s generic_spd_eeprom_t;
#define FSL_SDRAM_TYPE	SDRAM_TYPE_DDR2
#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;
	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;
	/* 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;
	uint32_t half_strength_driver_enable;
	uint32_t twoT_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;
	/* Automatic self refresh */
	uint32_t auto_self_refresh_en;
	/* 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