Commit 9bd4e5911b750837515466bc7449087698b88e0e
Committed by
Wolfgang Denk
1 parent
39aa1a7348
Exists in
master
and in
54 other branches
FSL DDR: Convert SBC8641D to new DDR code.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Showing 4 changed files with 99 additions and 8 deletions Side-by-side Diff
board/sbc8641d/Makefile
... | ... | @@ -25,10 +25,12 @@ |
25 | 25 | |
26 | 26 | LIB = $(obj)lib$(BOARD).a |
27 | 27 | |
28 | -COBJS := $(BOARD).o law.o | |
28 | +COBJS-y += $(BOARD).o | |
29 | +COBJS-y += law.o | |
30 | +COBJS-$(CONFIG_FSL_DDR2) += ddr.o | |
29 | 31 | |
30 | -SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) | |
31 | -OBJS := $(addprefix $(obj),$(COBJS)) | |
32 | +SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c) | |
33 | +OBJS := $(addprefix $(obj),$(COBJS-y)) | |
32 | 34 | SOBJS := $(addprefix $(obj),$(SOBJS)) |
33 | 35 | |
34 | 36 | $(LIB): $(obj).depend $(OBJS) $(SOBJS) |
board/sbc8641d/ddr.c
1 | +/* | |
2 | + * Copyright 2008 Freescale Semiconductor, Inc. | |
3 | + * | |
4 | + * This program is free software; you can redistribute it and/or | |
5 | + * modify it under the terms of the GNU General Public License | |
6 | + * Version 2 as published by the Free Software Foundation. | |
7 | + */ | |
8 | + | |
9 | +#include <common.h> | |
10 | +#include <i2c.h> | |
11 | + | |
12 | +#include <asm/fsl_ddr_sdram.h> | |
13 | + | |
14 | +static void | |
15 | +get_spd(ddr2_spd_eeprom_t *spd, unsigned char i2c_address) | |
16 | +{ | |
17 | + i2c_read(i2c_address, 0, 1, (uchar *)spd, sizeof(ddr2_spd_eeprom_t)); | |
18 | +} | |
19 | + | |
20 | +unsigned int fsl_ddr_get_mem_data_rate(void) | |
21 | +{ | |
22 | + return get_bus_freq(0); | |
23 | +} | |
24 | + | |
25 | +void fsl_ddr_get_spd(ddr2_spd_eeprom_t *ctrl_dimms_spd, | |
26 | + unsigned int ctrl_num) | |
27 | +{ | |
28 | + unsigned int i; | |
29 | + unsigned int i2c_address = 0; | |
30 | + | |
31 | + for (i = 0; i < CONFIG_DIMM_SLOTS_PER_CTLR; i++) { | |
32 | + if (ctrl_num == 0 && i == 0) { | |
33 | + i2c_address = SPD_EEPROM_ADDRESS1; | |
34 | + } | |
35 | + if (ctrl_num == 0 && i == 1) { | |
36 | + i2c_address = SPD_EEPROM_ADDRESS2; | |
37 | + } | |
38 | + if (ctrl_num == 1 && i == 0) { | |
39 | + i2c_address = SPD_EEPROM_ADDRESS3; | |
40 | + } | |
41 | + if (ctrl_num == 1 && i == 1) { | |
42 | + i2c_address = SPD_EEPROM_ADDRESS4; | |
43 | + } | |
44 | + get_spd(&(ctrl_dimms_spd[i]), i2c_address); | |
45 | + } | |
46 | +} | |
47 | + | |
48 | +void fsl_ddr_board_options(memctl_options_t *popts, unsigned int ctrl_num) | |
49 | +{ | |
50 | + /* | |
51 | + * Factors to consider for clock adjust: | |
52 | + * - number of chips on bus | |
53 | + * - position of slot | |
54 | + * - DDR1 vs. DDR2? | |
55 | + * - ??? | |
56 | + * | |
57 | + * This needs to be determined on a board-by-board basis. | |
58 | + * 0110 3/4 cycle late | |
59 | + * 0111 7/8 cycle late | |
60 | + */ | |
61 | + popts->clk_adjust = 7; | |
62 | + | |
63 | + /* | |
64 | + * Factors to consider for CPO: | |
65 | + * - frequency | |
66 | + * - ddr1 vs. ddr2 | |
67 | + */ | |
68 | + popts->cpo_override = 10; | |
69 | + | |
70 | + /* | |
71 | + * Factors to consider for write data delay: | |
72 | + * - number of DIMMs | |
73 | + * | |
74 | + * 1 = 1/4 clock delay | |
75 | + * 2 = 1/2 clock delay | |
76 | + * 3 = 3/4 clock delay | |
77 | + * 4 = 1 clock delay | |
78 | + * 5 = 5/4 clock delay | |
79 | + * 6 = 3/2 clock delay | |
80 | + */ | |
81 | + popts->write_data_delay = 3; | |
82 | + | |
83 | + /* | |
84 | + * Factors to consider for half-strength driver enable: | |
85 | + * - number of DIMMs installed | |
86 | + */ | |
87 | + popts->half_strength_driver_enable = 0; | |
88 | +} |
board/sbc8641d/sbc8641d.c
... | ... | @@ -34,7 +34,7 @@ |
34 | 34 | #include <asm/processor.h> |
35 | 35 | #include <asm/immap_86xx.h> |
36 | 36 | #include <asm/immap_fsl_pci.h> |
37 | -#include <spd_sdram.h> | |
37 | +#include <asm/fsl_ddr_sdram.h> | |
38 | 38 | #include <libfdt.h> |
39 | 39 | #include <fdt_support.h> |
40 | 40 | |
... | ... | @@ -42,7 +42,6 @@ |
42 | 42 | extern void ddr_enable_ecc (unsigned int dram_size); |
43 | 43 | #endif |
44 | 44 | |
45 | -void sdram_init (void); | |
46 | 45 | long int fixed_sdram (void); |
47 | 46 | |
48 | 47 | int board_early_init_f (void) |
... | ... | @@ -62,7 +61,7 @@ |
62 | 61 | long dram_size = 0; |
63 | 62 | |
64 | 63 | #if defined(CONFIG_SPD_EEPROM) |
65 | - dram_size = spd_sdram (); | |
64 | + dram_size = fsl_ddr_sdram(); | |
66 | 65 | #else |
67 | 66 | dram_size = fixed_sdram (); |
68 | 67 | #endif |
include/configs/sbc8641d.h
... | ... | @@ -61,8 +61,6 @@ |
61 | 61 | #define CONFIG_HIGH_BATS 1 /* High BATs supported and enabled */ |
62 | 62 | |
63 | 63 | #undef CONFIG_SPD_EEPROM /* Do not use SPD EEPROM for DDR setup*/ |
64 | -#undef CONFIG_DDR_DLL /* possible DLL fix needed */ | |
65 | -#define CONFIG_DDR_2T_TIMING /* Sets the 2T timing bit */ | |
66 | 64 | #undef CONFIG_DDR_ECC /* only for ECC DDR module */ |
67 | 65 | #define CONFIG_ECC_INIT_VIA_DDRCONTROLLER /* DDR controller or DMA? */ |
68 | 66 | #define CONFIG_MEM_INIT_VALUE 0xDeadBeef |
... | ... | @@ -113,6 +111,10 @@ |
113 | 111 | #define CONFIG_VERY_BIG_RAM |
114 | 112 | |
115 | 113 | #define MPC86xx_DDR_SDRAM_CLK_CNTL |
114 | + | |
115 | +#define CONFIG_NUM_DDR_CONTROLLERS 2 | |
116 | +#define CONFIG_DIMM_SLOTS_PER_CTLR 2 | |
117 | +#define CONFIG_CHIP_SELECTS_PER_CTRL (2 * CONFIG_DIMM_SLOTS_PER_CTLR) | |
116 | 118 | |
117 | 119 | #if defined(CONFIG_SPD_EEPROM) |
118 | 120 | /* |