1 /* *********************************************************************
2 * SB1250 Board Support Package
4 * DRAM Startup Module File: sb1250_draminit.c
6 * This module contains code to initialize and start the DRAM
7 * controller on the SB1250.
9 * This is the fancy new init module, written in "C".
11 * Author: Mitch Lichtenberg (mpl@broadcom.com)
13 *********************************************************************
15 * Copyright 2000,2001,2002,2003
16 * Broadcom Corporation. All rights reserved.
18 * This software is furnished under license and may be used and
19 * copied only in accordance with the following terms and
20 * conditions. Subject to these conditions, you may download,
21 * copy, install, use, modify and distribute modified or unmodified
22 * copies of this software in source and/or binary form. No title
23 * or ownership is transferred hereby.
25 * 1) Any source code used, modified or distributed must reproduce
26 * and retain this copyright notice and list of conditions
27 * as they appear in the source file.
29 * 2) No right is granted to use any trade name, trademark, or
30 * logo of Broadcom Corporation. The "Broadcom Corporation"
31 * name may not be used to endorse or promote products derived
32 * from this software without the prior written permission of
33 * Broadcom Corporation.
35 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
36 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
37 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
38 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
39 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
40 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
41 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
42 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
43 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
44 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
45 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
46 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
47 * THE POSSIBILITY OF SUCH DAMAGE.
48 ********************************************************************* */
51 * This code can be linked into non-CFE, non-SB1250 things like SOCVIEW, a JTAG
52 * tool. In that case it's not even running on a 1250, but we can
53 * borrow the code to generate timing values for us.
55 * The _MCSTANDALONE_ ifdef is normally turned *off* for firmware use,
56 * but programs like "memconfig" (CFE host tool) or SOCVIEW use it
57 * to allow us to run the memory initialization outside a 1250.
66 #include "sb1250_regs.h"
67 #include "sb1250_mc.h"
68 #include "sb1250_smbus.h"
69 #include "sb1250_scd.h"
72 * Uncomment to use data mover to zero memory
73 * Note: this is not a good idea in Pass1, since we'll
74 * be running cacheable noncoherent at this point in the
77 /* #define _DMZERO_ */
80 #include "sb1250_dma.h"
83 /* *********************************************************************
85 ********************************************************************* */
88 * This constant represents the "round trip" time of your board.
89 * Measured from the pins on the BCM1250, it is the time from the
90 * rising edge of the MCLK pin to the rising edge of the DQS coming
91 * back from the memory.
93 * It is used in the calculation of which cycle responses are expected
94 * from the memory for a given request. The units are in tenths of
98 #define DEFAULT_MEMORY_ROUNDTRIP_TIME 25 /* 2.5ns (default) */
99 #define DEFAULT_MEMORY_ROUNDTRIP_TIME_FCRAM 20 /* 2.0ns for FCRAM */
102 #define PASS1_DLL_SCALE_NUMERATOR 30 /* 30/400 = 0.075 */
103 #define PASS1_DLL_SCALE_DENOMINATOR 400
104 #define PASS1_DLL_OFFSET 63 /* 63/400 = 0.1575 */
106 #define PASS2_DLL_SCALE_NUMERATOR 30 /* 30/400 = 0.075 */
107 #define PASS2_DLL_SCALE_DENOMINATOR 400
108 #define PASS2_DLL_OFFSET 63 /* 63/400 = 0.1575 */
112 * The constants below were created by careful measurement of
113 * BCM1250 parts. The units are in tenths of nanoseconds
114 * to be compatible with the rest of the calculations in sb1250_auto_timing.
117 #define SB1250_MIN_R2W_TIME 30 /* 3.0 ns */
118 #define SB1250_MIN_DQS_MARGIN 25
119 #define SB1250_WINDOW_OPEN_OFFSET 18
120 #define SB1250_CLOSE_01_OFFSET 34
121 #define SB1250_CLOSE_02_OFFSET 22
122 #define SB1250_CLOSE_12_OFFSET 24
126 /* *********************************************************************
128 ********************************************************************* */
131 #include "lib_types.h"
133 typedef unsigned char uint8_t;
134 typedef unsigned short uint16_t;
135 typedef unsigned int uint32_t;
136 typedef unsigned long long uint64_t;
140 * For SOCVIEW and non-CFE, non-MIPS stuff, make sure the "port"
141 * data type is 64 bits. Otherwise we take our cue from 'long'
142 * which will be pointer-sized.
145 #if defined(_MCSTANDALONE_)
146 typedef long long sbport_t
;
148 typedef long sbport_t
;
152 #include "bsp_config.h"
158 /* *********************************************************************
160 ********************************************************************* */
163 * This module needs to be compiled with mips64 to ensure that 64-bit
164 * values are in 64-bit registers and that reads/writes of 64-bit numbers
165 * are done with the ld/sd instructions.
167 #if !defined(__mips64) && !defined(_MCSTANDALONE_)
168 #error "This module MUST be compiled with __mips64. See the comments for details."
172 * Configure some stuff here if not running under the firmware.
176 #define CFG_DRAM_ECC 0
177 #define CFG_DRAM_SMBUS_CHANNEL 0
178 #define CFG_DRAM_SMBUS_BASE 0x54
179 #define CFG_DRAM_BLOCK_SIZE 32
184 * Clock configuration parameters, except for the MCLK ratio
185 * which is set according to the value of the PLL divide ratio.
188 #define V_MC_CLKCONFIG_VALUE_PASS1 V_MC_ADDR_SKEW(0x0F) | \
189 V_MC_DQO_SKEW(0x8) | \
190 V_MC_DQI_SKEW(0x8) | \
191 V_MC_ADDR_DRIVE(0xF) | \
192 V_MC_DATA_DRIVE(0xF) | \
195 #define V_MC_CLKCONFIG_VALUE V_MC_ADDR_SKEW(0x08) | \
196 V_MC_DQO_SKEW(0x8) | \
197 V_MC_DQI_SKEW(0x8) | \
198 V_MC_ADDR_DRIVE(0xF) | \
199 V_MC_DATA_DRIVE(0xF) | \
200 V_MC_CLOCK_DRIVE(0xF)
203 * These belong in some SB1250-specific file I'm sure.
206 #define MC_CHANNELS 2 /* we have two channels */
207 #define MC_CHIPSELS 4 /* and four chipsels per channel */
210 /* *********************************************************************
212 ********************************************************************* */
216 * You really don't want to know about this. During testing, we futz
217 * with the 100mhz clock and store the actual speed of the clock
218 * in the PromICE so we can make the calculations work out correctly
219 * (and automatically)
221 #define SB1250_REFCLK (*((uint64_t *) PHYS_TO_K1(0x1FC00018)))
222 #undef K_SMB_FREQ_100KHZ
223 #define K_SMB_FREQ_100KHZ ((SB1250_REFCLK*10)/8)
226 * If non-CFE, non-MIPS, make the refclk an input parameter.
228 #if defined(_MCSTANDALONE_)
229 int sb1250_refclk
= 100;
230 int dram_cas_latency
;
232 #define SB1250_REFCLK sb1250_refclk
237 * Define our reference clock. The default is 100MHz unless
238 * overridden. You can override this in your bsp_config.h file.
241 #ifdef SB1250_REFCLK_HZ
242 #define SB1250_REFCLK ((SB1250_REFCLK_HZ)/1000000)
245 #ifndef SB1250_REFCLK
246 #define SB1250_REFCLK 100 /* speed of refclk, in Mhz */
249 /* *********************************************************************
251 ********************************************************************* */
254 * For the general case, reads/writes to MC CSRs are just pointer
255 * references. In SOCVIEW and other non-CFE, non-MIPS programs, we hook the
256 * read/write calls to let us supply the data from somewhere else.
259 #if defined(_MCSTANDALONE_)
260 #define PHYS_TO_K1(x) (x)
261 #define WRITECSR(csr,val) sbwritecsr(csr,val)
262 #define READCSR(csr) sbreadcsr(csr)
263 extern void sbwritecsr(uint64_t,uint64_t);
264 extern uint64_t sbreadcsr(uint64_t);
265 #else /* normal case */
266 #define WRITECSR(csr,val) *((volatile uint64_t *) (csr)) = (val)
267 #define READCSR(csr) (*((volatile uint64_t *) (csr)))
270 /* *********************************************************************
272 ********************************************************************* */
275 #define JEDEC_SDRAM_MRVAL_CAS15 0x52 /* 4-byte bursts, sequential, CAS 1.5 */
276 #define JEDEC_SDRAM_MRVAL_CAS2 0x22 /* 4-byte bursts, sequential, CAS 2 */
277 #define JEDEC_SDRAM_MRVAL_CAS25 0x62 /* 4-byte bursts, sequential, CAS 2.5 */
278 #define JEDEC_SDRAM_MRVAL_CAS3 0x32 /* 4-byte bursts, sequential, CAS 3 */
279 #define JEDEC_SDRAM_MRVAL_CAS35 0x72 /* 4-byte bursts, sequential, CAS 3.5 */
280 #define JEDEC_SDRAM_MRVAL_RESETDLL 0x100
281 #define JEDEC_SDRAM_EMRVAL 0x00
283 #define FCRAM_MRVAL 0x32
284 #define FCRAM_EMRVAL 0
286 #define SGRAM_MRVAL 0x32 /* 4-byte bursts, sequential, CAS 3 */
287 #define SGRAM_MRVAL_RESETDLL 0x400
288 #define SGRAM_EMRVAL 0x02
291 * DECTO10THS(x) - this converts a BCD-style number found in
292 * JEDEC SPDs to a regular number. So, 0x75 might mean "7.5ns"
293 * and we convert this into tenths (75 decimal). Many of the
294 * calculations for the timing are done in terms of tenths of nanoseconds
297 #define DECTO10THS(x) ((((x) >> 4)*10)+((x) & 0x0F))
299 /* *********************************************************************
300 * Configuration parameter values
301 ********************************************************************* */
303 #ifndef CFG_DRAM_MIN_tMEMCLK
304 #define CFG_DRAM_MIN_tMEMCLK DRT10(8,0) /* 8 ns, 125Mhz */
307 #ifndef CFG_DRAM_INTERLEAVE
308 #define CFG_DRAM_INTERLEAVE 0
311 #ifndef CFG_DRAM_SMBUS_CHANNEL
312 #define CFG_DRAM_SMBUS_CHANNEL 0
315 #ifndef CFG_DRAM_SMBUS_BASE
316 #define CFG_DRAM_SMBUS_BASE 0x54
320 #define CFG_DRAM_ECC 0
323 #ifndef CFG_DRAM_BLOCK_SIZE
324 #define CFG_DRAM_BLOCK_SIZE 32
327 #ifndef CFG_DRAM_CSINTERLEAVE
328 #define CFG_DRAM_CSINTERLEAVE 0
331 /* *********************************************************************
332 * Memory region sizes (SB1250-specific)
333 ********************************************************************* */
335 #define REGION0_LOC 0x0000
336 #define REGION0_SIZE 256
338 #define REGION1_LOC 0x0800
339 #define REGION1_SIZE 512
341 #define REGION2_LOC 0x0C00
342 #define REGION2_SIZE 256
344 #define REGION3_LOC 0x1000
345 #define REGION3_SIZE (508*1024) /* 508 GB! */
347 /* *********************************************************************
348 * Global Data structure
350 * This is a hideous hack. We're going to actually use "memory"
351 * before it is configured. The L1 DCache will be clean before
352 * we get here, so we'll just locate this structure in memory
353 * (at 0, for example) and "hope" we don't need to evict anything.
354 * If we keep the data below 256 cache lines, we'll only use one way
355 * of each cache line. That's 8K, more than enough.
357 * This data structure needs to be used both for our data and the
358 * "C" stack, so be careful when you edit it!
359 ********************************************************************* */
361 typedef struct csdata_s
{ /* Geometry information from table */
362 uint8_t rows
; /* or SMBbus */
367 uint8_t spd_dramtype
; /* SPD[2] */
368 uint8_t spd_tCK_25
; /* SPD[9] tCK @ CAS 2.5 */
369 uint8_t spd_tCK_20
; /* SPD[23] tCK @ CAS 2.0 */
370 uint8_t spd_tCK_10
; /* SPD[25] tCK @ CAS 1.0 */
371 uint8_t spd_rfsh
; /* SPD[12] Refresh Rate */
372 uint8_t spd_caslatency
; /* SPD[18] CAS Latencies Supported */
373 uint8_t spd_attributes
; /* SPD[21] Attributes */
374 uint8_t spd_tRAS
; /* SPD[30] */
375 uint8_t spd_tRP
; /* SPD[27] */
376 uint8_t spd_tRRD
; /* SPD[28] */
377 uint8_t spd_tRCD
; /* SPD[29] */
378 uint8_t spd_tRFC
; /* SPD[42] */
379 uint8_t spd_tRC
; /* SPD[41] */
381 } csdata_t
; /* total size: 16 bytes */
383 #define CS_PRESENT 1 /* chipsel is present (in use) */
384 #define CS_AUTO_TIMING 2 /* chipsel has timing information */
386 #define CS_CASLAT_10 0x20 /* upper four bits are the CAS latency */
387 #define CS_CASLAT_15 0x30 /* we selected. bits 7..5 are the */
388 #define CS_CASLAT_20 0x40 /* whole number and bit 4 is the */
389 #define CS_CASLAT_25 0x50 /* fraction. */
390 #define CS_CASLAT_30 0x60
391 #define CS_CASLAT_MASK 0xF0
392 #define CS_CASLAT_SHIFT 4
394 typedef struct mcdata_s
{ /* Information per memory controller */
395 uint32_t cfgcsint
; /* try to interleave this many CS bits */
396 uint32_t csint
; /* # of chip select interleave bits */
397 uint16_t mintmemclk
; /* minimum tMemClk */
398 uint16_t roundtrip
; /* Round trip time from CLK to returned DQS at BCM1250 pin */
399 uint32_t dramtype
; /* DRAM Type */
400 uint32_t pagepolicy
; /* Page policy */
401 uint32_t blksize
; /* Block Size */
402 uint32_t flags
; /* ECC enabled */
403 uint16_t tCK
; /* tCK for manual timing */
404 uint16_t rfsh
; /* refresh rate for manual timing */
405 uint64_t clkconfig
; /* default clock config */
406 uint64_t mantiming
; /* manual timing */
407 csdata_t csdata
[MC_CHIPSELS
]; /* Total size: 48 + 16*4 = 112 bytes */
410 typedef struct initdata_s
{
411 uint64_t dscr
[4]; /* Data Mover descriptor (one cache line)*/
412 uint32_t flags
; /* various flags */
413 uint32_t inuse
; /* indicates MC is in use */
414 uint32_t pintbit
; /* port interleave bit */
415 uint16_t firstchan
; /* first channel */
416 uint16_t soctype
; /* SOC type */
417 uint64_t ttlbytes
; /* total bytes */
418 mcdata_t mc
[MC_CHANNELS
]; /* data per memory controller */
419 } initdata_t
; /* Total size: 56 + 112*2 = 280 bytes */
421 #define M_MCINIT_TRYPINTLV 1 /* Try to do port interleaving */
422 #define M_MCINIT_PINTLV 2 /* Actually do port interleaving */
426 /* *********************************************************************
427 * Configuration data structure
428 ********************************************************************* */
430 #include "sb1250_draminit.h"
432 /* *********************************************************************
435 * WARNING WARNING WARNING!
437 * This module is *very magical*! We are using the cache as
438 * SRAM, and we're running as relocatable code *before* the code
439 * is relocated and *before* the GP register is set up.
441 * Therefore, there should be NO data declared in the data
442 * segment - all data must be allocated in the .text segment
443 * and references to this data must be calculated by an inline
446 * If you grep the disassembly of this file, you should not see
447 * ANY references to the GP register.
448 ********************************************************************* */
451 #ifdef _MCSTANDALONE_NOISY_
452 static char *sb1250_rectypes
[] = {"MCR_GLOBALS","MCR_CHCFG","MCR_TIMING",
453 "MCR_CLKCFG","MCR_GEOM","MCR_CFG",
457 /* *********************************************************************
460 * This module attempts to initialize the DRAM controllers on
461 * the SB1250. Each DRAM controller can control four chip
462 * selects, or two double-sided DDR SDRAM DIMMs. Therefore, at
463 * most four DIMMs can be attached.
465 * We will assume that all of the DIMMs are connected to the same
466 * SMBUS serial bus, and are addressed sequentially starting from
467 * module 0. The first two DIMMs will be assigned to memory
468 * controller #0 and the second two DIMMs will be assigned to
469 * memory controller #1.
471 * There is one serial ROM per DIMM, and we will assume that the
472 * front and back of the DIMM are the same memory configuration.
473 * The first DIMM will be configured for CS0 and CS1, and the
474 * second DIMM will be configured for CS2 and CS3. If the DIMM
475 * has only one side, it will be assigned to CS0 or CS2.
477 * No interleaving will be configured by this routine, but it
478 * should not be difficult to modify it should that be necessary.
480 * This entire routine needs to run from registers (no read/write
483 * The steps to initialize the DRAM controller are:
485 * * Read the SPD, verify DDR SDRAMs or FCRAMs
486 * * Obtain #rows, #cols, #banks, and module size
487 * * Calculate row, column, and bank masks
488 * * Calculate chip selects
489 * * Calculate timing register. Note that we assume that
490 * all banks will use the same timing.
491 * * Repeat for each DRAM.
493 * DIMM0 -> MCTL0 : CS0, CS1 SPD Addr = 0x54
494 * DIMM1 -> MCTL0 : CS2, CS3 SPD Addr = 0x55
495 * DIMM2 -> MCTL1 : CS0, CS1 SPD Addr = 0x56
496 * DIMM3 -> MCTL1 : CS2, CS3 SPD Addr = 0x57
498 * DRAM Controller registers are programmed in the following order:
502 * MC_TEST_DATA, MC_TEST_ECC
504 * MC_CSx_ROWS, MC_CSx_COLS
505 * (repeated for each bank)
507 * MC_CS_START, MC_CS_END
515 * (delay after each mode setting ??)
517 * Once the registers are initialized, the DRAM is activated by
518 * sending it the following sequence of commands:
521 * EMRS (extended mode register set)
522 * MRS (mode register set)
525 * AR (auto-refresh again)
526 * MRS (mode register set)
528 * then wait 200 memory clock cycles without accessing DRAM.
530 * Following initialization, the ECC bits must be cleared. This
531 * can be accomplished by disabling ECC checking on both memory
532 * controllers, and then zeroing all memory via the mapping
534 ********************************************************************* */
536 /* *********************************************************************
538 * Address Bit Assignment Algorithm:
540 * Good performance can be achieved by taking the following steps
541 * when assigning address bits to the row, column, and interleave
542 * masks. You will need to know the following:
544 * - The number of rows, columns, and banks on the memory devices
545 * - The block size (larger tends to be better for sequential
547 * - Whether you will interleave chip-selects
548 * - Whether you will be using both memory controllers and want
549 * to interleave between them
551 * By choosing the masks carefully you can maximize the number of
552 * open SDRAM banks and reduce access times for nearby and sequential
555 * The diagram below depicts a physical address and the order
556 * that the bits should be placed into the masks. Start with the
557 * least significant bit and assign bits to the row, column, bank,
558 * and interleave registers in the following order:
560 * <------------Physical Address--------------->
561 * Bits: RRRRRRR..R CCCCCCCC..C NN BB P CC xx000
562 * Step: 7 6 5 4 3 2 1
565 * R = Row Address Bit (MC_CSX_ROW register)
566 * C = Column Address Bit (MC_CSX_COL register)
567 * N = Chip Select (MC_CS_INTERLEAVE)
568 * (when interleaving via chip selects)
569 * B = Bank Bit (MC_CSX_BA register)
570 * P = Port Select bit (MC_CONFIG register)
571 * (when interleaving memory channels)
572 * x = Does not matter (MC_CSX_COL register)
573 * (internally driven by controller)
576 * When an address bit is "assigned" it is set in one of the masks
577 * in the MC_CSX_ROW, MC_CSX_COL, MC_CSX_BA, or MC_CS_INTERLEAVE
581 * 1. The bottom 3 bits are ignored and should be set to zero.
582 * The next two bits are also ignored, but are considered
583 * to be column bits, so they should be taken from the
584 * total column bits supported by the device.
586 * 2. The next two bits are used for column interleave. For
587 * 32-byte blocks (and no column interleave), do not use
588 * any column bits. For 64-byte blocks, use one column
589 * bit, and for 128 byte blocks, use two column bits. Subtract
590 * the column bits assigned in this step from the total.
592 * 3. If you are using both memory controllers and wish to interleave
593 * between them, assign one bit for the controller interleave. The
594 * bit number is assigned in the MC_CONFIG register.
596 * 4. These bits represent the bank bits on the memory device.
597 * If the device has 4 banks, assign 2 bits in the MC_CSX_BA
600 * 5. If you are interleaving via chip-selects, set one or two
601 * bits in the MC_CS_INTERLEAVE register for the bits that will
604 * 6. The remaining column bits are assigned in the MC_CSX_COL
607 * 7. The row bits are assigned in the MC_CSX_ROW register.
609 ********************************************************************* */
613 /* *********************************************************************
614 * sb1250_find_timingcs(mc)
616 * For a given memory controller, choose the chip select whose
617 * timing values will be used to base the TIMING and MCLOCK_CFG
621 * mc - memory controller
624 * chip select index, or -1 if no active chip selects.
625 ********************************************************************* */
628 static int sb1250_find_timingcs(mcdata_t
*mc
)
632 /* for now, the first one with data is the one we pick */
634 for (idx
= 0; idx
< MC_CHIPSELS
; idx
++) {
635 if (mc
->csdata
[idx
].flags
& CS_PRESENT
) return idx
;
641 /* *********************************************************************
642 * sb1250_auto_timing(mcidx,tdata)
644 * Program the memory controller's timing registers based on the
645 * timing information stored with the chip select data. For DIMMs
646 * this information comes from the SPDs, otherwise it was entered
647 * from the datasheets into the tables in the init modules.
650 * mcidx - memory controller index (0 or 1)
651 * tdata - a chip select data (csdata_t)
655 ********************************************************************* */
657 static void sb1250_auto_timing(int mcidx
,mcdata_t
*mc
,csdata_t
*tdata
)
662 unsigned int clk_ratio
;
663 unsigned int refrate
;
664 unsigned int ref_freq
;
665 unsigned int caslatency
;
667 unsigned int spd_tCK_25
;
668 unsigned int spd_tCK_20
;
669 unsigned int spd_tCK_10
;
670 unsigned int tCpuClk
;
671 unsigned int tMemClk
;
673 unsigned int w2rIdle
,r2wIdle
,r2rIdle
;
674 unsigned int tCrD
,tCrDh
,tFIFO
;
677 unsigned int tRP
,tRRD
,tRCD
,tRCw
,tRCr
,tCwCr
,tRFC
;
684 /* Timing window variables */
686 int addrSkew
,dqiSkew
,dqoSkew
,clkDrive
;
687 int n01_open
,n02_open
,n12_open
;
688 int n01_close
,n02_close
,n12_close
;
690 int addrAdjust
,dqiAdjust
,dqoAdjust
;
692 int dllScaleNum
,dllScaleDenom
,dllOffset
;
696 * We need our cpu clock for all sorts of things.
699 sysrev
= READCSR(PHYS_TO_K1(A_SCD_SYSTEM_REVISION
));
700 #if defined(_VERILOG_) || defined(_FUNCSIM_)
701 plldiv
= 16; /* 800MHz CPU for RTL simulation */
703 plldiv
= G_SYS_PLL_DIV(READCSR(PHYS_TO_K1(A_SCD_SYSTEM_CFG
)));
710 * Compute tCpuClk, in picoseconds to avoid rounding errors.
713 * tCpuClk = 1/fCpuClk
714 * = 1/(100MHz * plldiv/2)
715 * = 2/(100MHz*plldiv)
716 * = 2/(100*plldiv) us
718 * = 2000000/plldiv 10ths of ns
720 * If SB1250_REFCLK is in MHz, then:
721 * 2/(SB1250_REFCLK*plldiv) us
722 * = 2000/(SB1250_REFCLK*plldiv) ns
723 * = 2000000/(SB1250_REFCLK*plldiv) ps
725 * However, we want to round the result to the nearest integer,
726 * so we double the numerator (to 4000000) to get one more bit
727 * of precision in the quotient, then add one and scale it back down
730 /* tCpuClk is in picoseconds */
731 tCpuClk
= ((4000000/(SB1250_REFCLK
*plldiv
))+1)/2;
733 spd_tCK_25
= DECTO10THS(tdata
->spd_tCK_25
);
734 spd_tCK_20
= DECTO10THS(tdata
->spd_tCK_20
);
735 spd_tCK_10
= DECTO10THS(tdata
->spd_tCK_10
);
738 * Compute the target tMemClk, in units of tenths of nanoseconds
739 * to be similar to the JEDEC SPD values. This will be
741 * MAX(MIN_tMEMCLK,spd_tCK_25)
744 tMemClk
= spd_tCK_25
;
745 if (mc
->mintmemclk
> tMemClk
) tMemClk
= mc
->mintmemclk
;
748 * Now compute our clock ratio (the amount we'll divide tCpuClk by
749 * to get as close as possible to tMemClk without exceeding it
751 * It's (tMemClk*100) here because tCpuClk is in picoseconds
754 clk_ratio
= ((tMemClk
*100) + tCpuClk
- 1) / tCpuClk
;
755 if (clk_ratio
< 4) clk_ratio
= 4;
756 if (clk_ratio
> 9) clk_ratio
= 9;
759 * BCM112x A1 parts do not function properly with MC ratio 5.
760 * (This is fixed in A2 parts.) On BCM112x before A2, When
761 * that ratio would be used, back off to 6.
763 if ((SYS_SOC_TYPE(sysrev
) == K_SYS_SOC_TYPE_BCM1120
||
764 SYS_SOC_TYPE(sysrev
) == K_SYS_SOC_TYPE_BCM1125
||
765 SYS_SOC_TYPE(sysrev
) == K_SYS_SOC_TYPE_BCM1125H
) &&
766 G_SYS_REVISION(sysrev
) < K_SYS_REVISION_BCM112x_A2
&&
772 * Now, recompute tMemClk using the new clk_ratio. This gives us
773 * the actual tMemClk that the memory controller will generate
776 * fMemClk = SB1250_REFCLK * plldiv / (2 * clk_ratio) Mhz
778 * tMemClk = 1/fMemClk us
779 * = (2 * clk_ratio) / (SB1250_REFCLK * plldiv) us
780 * = 10000 * (2 * clk_ratio) / (SB1250_REFCLK * plldiv) 0.1ns
782 * The resulting tMemClk is in tenths of nanoseconds so we
783 * can compare it with the SPD values. The x10000 converts
787 tMemClk
= (10000 * 2 * clk_ratio
)/(SB1250_REFCLK
* plldiv
);
789 /* Calculate the refresh rate */
791 switch (tdata
->spd_rfsh
& JEDEC_RFSH_MASK
) {
792 case JEDEC_RFSH_64khz
: ref_freq
= 64; break;
793 case JEDEC_RFSH_256khz
: ref_freq
= 256; break;
794 case JEDEC_RFSH_128khz
: ref_freq
= 128; break;
795 case JEDEC_RFSH_32khz
: ref_freq
= 32; break;
796 case JEDEC_RFSH_8khz
: ref_freq
= 16; break;
797 default: ref_freq
= 8; break;
801 * Compute the target refresh value, in Khz/16. We know
802 * the rate that the DIMMs expect (in Khz, above). So we need
803 * to calculate what the MemClk is divided by to get that value.
804 * There is an internal divide-by-16 in the 1250 in the refresh
808 * refrate = (plldiv/2)*SB1250_REFCLK*1000 Khz /(ref_freq*16*clk_ratio)
811 refrate
= ((plldiv
* SB1250_REFCLK
* 1000 / 2) / (ref_freq
*16*clk_ratio
)) - 1;
814 * Calculate CAS Latency in half cycles. The low bit indicates
815 * half a cycle, so 2 (0010) = 1 cycle and 3 (0011) = 1.5 cycles
818 res
= tdata
->spd_caslatency
;
819 if (res
& JEDEC_CASLAT_35
) caslatency
= (3 << 1) + 1; /* 3.5 */
820 else if (res
& JEDEC_CASLAT_30
) caslatency
= (3 << 1); /* 3.0 */
821 else if (res
& JEDEC_CASLAT_25
) caslatency
= (2 << 1) + 1; /* 2.5 */
822 else if (res
& JEDEC_CASLAT_20
) caslatency
= (2 << 1); /* 2.0 */
823 else if (res
& JEDEC_CASLAT_15
) caslatency
= (1 << 1) + 1; /* 1.5 */
824 else caslatency
= (1 << 1); /* 1.0 */
826 if ((spd_tCK_10
!= 0) && (spd_tCK_10
<= tMemClk
)) {
827 caslatency
-= (1 << 1); /* subtract 1.0 */
829 else if ((spd_tCK_20
!= 0) && (spd_tCK_20
<= tMemClk
)) {
830 caslatency
-= 1; /* subtract 0.5 */
834 * Store the CAS latency in the chip select info
837 tdata
->flags
&= ~CS_CASLAT_MASK
;
838 tdata
->flags
|= (((caslatency
<< CS_CASLAT_SHIFT
)) & CS_CASLAT_MASK
);
839 #ifdef _MCSTANDALONE_
840 dram_cas_latency
= caslatency
;
841 dram_tMemClk
= tMemClk
;
845 * Now, on to the timing parameters.
848 w2rIdle
= 1; /* Needs to be set on all parts. */
851 /* ======================================================================== */
854 * New "Window" calculations
857 n01_open
= -SB1250_WINDOW_OPEN_OFFSET
;
858 n02_open
= -SB1250_WINDOW_OPEN_OFFSET
;
859 n12_open
= tMemClk
/2 - SB1250_WINDOW_OPEN_OFFSET
;
860 n01_close
= tMemClk
- SB1250_CLOSE_01_OFFSET
;
861 n02_close
= 3*tMemClk
/2 - SB1250_CLOSE_02_OFFSET
;
862 n12_close
= 7*tMemClk
/4 - SB1250_CLOSE_12_OFFSET
;
863 minDqsMargin
= SB1250_MIN_DQS_MARGIN
;
865 if (SYS_SOC_TYPE(sysrev
) == K_SYS_SOC_TYPE_BCM1250
&&
866 G_SYS_REVISION(sysrev
) >= K_SYS_REVISION_PASS1
&&
867 G_SYS_REVISION(sysrev
) < K_SYS_REVISION_PASS2
) {
869 dllScaleNum
= PASS1_DLL_SCALE_NUMERATOR
;
870 dllScaleDenom
= PASS1_DLL_SCALE_DENOMINATOR
;
871 dllOffset
= PASS1_DLL_OFFSET
;
874 /* pass2+ BCM1250, or BCM112x */
875 dllScaleNum
= PASS2_DLL_SCALE_NUMERATOR
;
876 dllScaleDenom
= PASS2_DLL_SCALE_DENOMINATOR
;
877 dllOffset
= PASS2_DLL_OFFSET
;
882 * Get fields out of the clock config register
885 dqiSkew
= (int) G_MC_DQI_SKEW(mc
->clkconfig
);
886 dqoSkew
= (int) G_MC_DQO_SKEW(mc
->clkconfig
);
887 addrSkew
= (int) G_MC_ADDR_SKEW(mc
->clkconfig
);
888 clkDrive
= (int) G_MC_CLOCK_DRIVE(mc
->clkconfig
);
891 * get initial values for tCrD and dqsArrival
894 tCrD
= (caslatency
>> 1);
895 dqsArrival
= mc
->roundtrip
;
896 if (caslatency
& 1) {
897 dqsArrival
+= tMemClk
/2;
901 * need to adjust for settings of skew values.
902 * can either add to dqsArrival or subtract from
906 addrAdjust
= (addrSkew
- 8) * ((int)tMemClk
* dllScaleNum
- dllOffset
) / (8 * dllScaleDenom
);
907 dqiAdjust
= (dqiSkew
- 8) * ((int)tMemClk
* dllScaleNum
- dllOffset
) / (8 * dllScaleDenom
);
908 dqsArrival
+= addrAdjust
+ dqiAdjust
;
910 /* for pass 2, dqoAdjust applies only to n12_Close */
911 dqoAdjust
= (dqoSkew
- 8) * (tMemClk
* dllScaleNum
- dllOffset
) / (8 * dllScaleDenom
);
912 n12_close
+= dqoAdjust
;
915 * adjust window for clock drive strength
916 * Don't be tempted to turn this into an array. It will break the
920 case 0: dqsArrival
+= 10; break;
921 case 1: dqsArrival
+= 4; break;
922 case 2: dqsArrival
+= 3; break;
923 case 3: dqsArrival
+= 2; break;
924 case 4: dqsArrival
+= 2; break;
925 case 5: dqsArrival
+= 1; break;
926 case 6: dqsArrival
+= 1; break;
927 case 7: dqsArrival
+= 1; break;
928 case 8: dqsArrival
+= 8; break;
929 case 9: dqsArrival
+= 2; break;
930 case 0xa: dqsArrival
+= 1; break;
937 /* shouldn't get here */
941 while ((n02_close
- dqsArrival
< minDqsMargin
) &&
942 (n12_close
- dqsArrival
< minDqsMargin
)) {
943 /* very late DQS arrival; shift latency by one tick */
944 #ifdef _MCSTANDALONE_NOISY_
945 printf("DRAM: Very late DQS arrival, shift latency one tick\n");
948 dqsArrival
-= tMemClk
;
951 if ((dqsArrival
- n01_open
>= minDqsMargin
) &&
952 (n01_close
- dqsArrival
>= minDqsMargin
)) {
956 #ifdef _MCSTANDALONE_NOISY_
957 printf("DRAM: DQS arrival in n,0,1 window\n");
960 else if ((dqsArrival
- n02_open
>= minDqsMargin
) &&
961 (n02_close
- dqsArrival
>= minDqsMargin
)) {
965 #ifdef _MCSTANDALONE_NOISY_
966 printf("DRAM: DQS arrival in n,0,2 window\n");
969 else if ((dqsArrival
- n12_open
>= minDqsMargin
) &&
970 (n12_close
- dqsArrival
>= minDqsMargin
)) {
974 #ifdef _MCSTANDALONE_NOISY_
975 printf("DRAM: DQS arrival in n,1,2 window\n");
980 * minDqsMargin is probably set too high
985 #ifdef _MCSTANDALONE_NOISY_
986 printf("DRAM: Default: DQS arrival in n,0,2 window\n");
990 r2wIdle
= ((tMemClk
- dqsArrival
) < SB1250_MIN_R2W_TIME
);
993 * Pass1 BCM112x parts do not function properly with
994 * M_MC_r2wIDLE_TWOCYCLES clear, so we set r2wIdle here for them
995 * so that that flag will be set later.
997 if ((SYS_SOC_TYPE(sysrev
) == K_SYS_SOC_TYPE_BCM1120
||
998 SYS_SOC_TYPE(sysrev
) == K_SYS_SOC_TYPE_BCM1125
||
999 SYS_SOC_TYPE(sysrev
) == K_SYS_SOC_TYPE_BCM1125H
) &&
1000 1 /* XXXCGD: When fixed, check revision! */) {
1005 * Above stuff just calculated tCrDh, tCrD, and tFIFO
1008 /* ======================================================================== */
1010 /* Recompute tMemClk as a fixed-point 6.2 value */
1012 tMemClk
= (4000 * 2 * clk_ratio
) / (SB1250_REFCLK
* plldiv
);
1014 tRAS
= ( ((unsigned int)(tdata
->spd_tRAS
))*4 + tMemClk
-1) / tMemClk
;
1016 tRP
= ( ((unsigned int)(tdata
->spd_tRP
)) + tMemClk
-1) / tMemClk
;
1017 tRRD
= ( ((unsigned int)(tdata
->spd_tRRD
)) + tMemClk
-1) / tMemClk
;
1018 tRCD
= ( ((unsigned int)(tdata
->spd_tRCD
)) + tMemClk
-1) / tMemClk
;
1021 * Check for registered DIMMs, or if we are "forcing" registered
1022 * DIMMs, as might be the case of regular unregistered DIMMs
1023 * behind an external register.
1026 switch (mc
->dramtype
) {
1028 /* For FCRAMs, tCwD is always caslatency - 1 */
1029 tCwD
= (caslatency
>> 1) - 1;
1030 tRCD
= 1; /* always 1 for FCRAM */
1031 tRP
= 1; /* always 1 for FCRAM */
1034 /* Otherwise calculate based on registered attribute */
1035 if ((tdata
->spd_attributes
& JEDEC_ATTRIB_REG
) ||
1036 (mc
->flags
& MCFLG_FORCEREG
)) { /* registered DIMM */
1040 else { /* standard unbuffered DIMM */
1047 * Calculate the rest of the timing parameters based on above values.
1050 if (tdata
->spd_tRFC
== 0) {
1051 tRFC
= 1 + tRP
+ tRAS
;
1054 tRFC
= ( ((unsigned int) tdata
->spd_tRFC
)*4 + tMemClk
-1) / tMemClk
;
1057 if (tRFC
> 15) tRFC
= 15;
1059 if (tdata
->spd_tRC
== 0) {
1060 tRCw
= (tRAS
+ tRP
+ 2) - 1;
1061 tRCr
= (tRAS
+ tRP
) - 1;
1064 tRCw
= ( (((unsigned int)(tdata
->spd_tRC
))*4 + tMemClk
-1) / tMemClk
) + 2 - 1;
1065 tRCr
= ( (((unsigned int)(tdata
->spd_tRC
))*4 + tMemClk
-1) / tMemClk
) - 1;
1068 tCwCr
= tRCw
+ 1 - (tRCD
+ tCwD
+ 2 + 1);
1071 * Finally, put it all together in the timing register.
1075 timing1
= V_MC_tRCD(tRCD
) |
1077 (tCrDh
? M_tCrDh
: 0) |
1086 (w2rIdle
? M_MC_w2rIDLE_TWOCYCLES
: 0) |
1087 (r2wIdle
? M_MC_r2wIDLE_TWOCYCLES
: 0) |
1088 (r2rIdle
? M_MC_r2rIDLE_TWOCYCLES
: 0);
1090 mclkcfg
= V_MC_CLK_RATIO(clk_ratio
) |
1091 V_MC_REF_RATE(refrate
);
1093 /* Merge in drive strengths from the MC structure */
1094 mclkcfg
|= mc
->clkconfig
;
1096 base
= PHYS_TO_K1(A_MC_BASE(mcidx
));
1097 WRITECSR(base
+R_MC_TIMING1
,timing1
);
1100 /* Smash in some defaults for Verilog simulation */
1101 mclkcfg
&= ~(M_MC_CLK_RATIO
| M_MC_DLL_DEFAULT
| M_MC_REF_RATE
);
1102 mclkcfg
|= V_MC_CLK_RATIO_3X
| V_MC_REF_RATE(K_MC_REF_RATE_200MHz
) |
1103 V_MC_DLL_DEFAULT(0x18);
1106 WRITECSR(base
+R_MC_MCLK_CFG
,mclkcfg
);
1111 /* *********************************************************************
1112 * SB1250_MANUAL_TIMING(mcidx,mc)
1114 * Program the timing registers, for the case of user-specified
1115 * timing parameters (don't calculate values based on datasheet
1116 * values, just stuff the info into the MC registers)
1119 * mcidx - memory controller index
1120 * mc - memory controller data
1124 ********************************************************************* */
1126 static void sb1250_manual_timing(int mcidx
,mcdata_t
*mc
)
1128 unsigned int plldiv
;
1129 unsigned int clk_ratio
;
1130 unsigned int refrate
;
1131 unsigned int ref_freq
;
1132 unsigned int tCpuClk
;
1133 unsigned int tMemClk
;
1141 * We need our cpu clock for all sorts of things.
1144 #if defined(_VERILOG_) || defined(_FUNCSIM_)
1145 plldiv
= 16; /* 800MHz CPU for RTL simulation */
1147 plldiv
= G_SYS_PLL_DIV(READCSR(PHYS_TO_K1(A_SCD_SYSTEM_CFG
)));
1153 /* See comments in auto_timing for details */
1154 tCpuClk
= 2000000/(SB1250_REFCLK
*plldiv
); /* tCpuClk is in picoseconds */
1156 /* Compute MAX(MIN_tMEMCLK,spd_tCK_25) */
1157 tMemClk
= DECTO10THS(mc
->tCK
);
1158 if (mc
->mintmemclk
> tMemClk
) tMemClk
= mc
->mintmemclk
;
1160 clk_ratio
= ((tMemClk
*100) + tCpuClk
- 1) / tCpuClk
;
1161 if (clk_ratio
< 4) clk_ratio
= 4;
1162 if (clk_ratio
> 9) clk_ratio
= 9;
1164 /* recompute tMemClk using the new clk_ratio */
1166 tMemClk
= (10000 * 2 * clk_ratio
)/(SB1250_REFCLK
* plldiv
);
1168 /* Calculate the refresh rate */
1170 switch (mc
->rfsh
& JEDEC_RFSH_MASK
) {
1171 case JEDEC_RFSH_64khz
: ref_freq
= 64; break;
1172 case JEDEC_RFSH_256khz
: ref_freq
= 256; break;
1173 case JEDEC_RFSH_128khz
: ref_freq
= 128; break;
1174 case JEDEC_RFSH_32khz
: ref_freq
= 32; break;
1175 case JEDEC_RFSH_8khz
: ref_freq
= 16; break;
1176 default: ref_freq
= 8; break;
1179 refrate
= ((plldiv
* SB1250_REFCLK
* 1000 / 2) / (ref_freq
*16*clk_ratio
)) - 1;
1181 timing1
= mc
->mantiming
;
1182 mclkcfg
= V_MC_CLK_RATIO(clk_ratio
) |
1183 V_MC_REF_RATE(refrate
);
1185 /* Merge in drive strengths from the MC structure */
1186 mclkcfg
|= mc
->clkconfig
;
1188 base
= PHYS_TO_K1(A_MC_BASE(mcidx
));
1189 WRITECSR(base
+R_MC_TIMING1
,timing1
);
1192 /* Smash in some defaults for Verilog simulation */
1193 mclkcfg
&= ~(M_MC_CLK_RATIO
| M_MC_DLL_DEFAULT
| M_MC_REF_RATE
);
1194 mclkcfg
|= V_MC_CLK_RATIO_3X
| V_MC_REF_RATE(K_MC_REF_RATE_200MHz
) |
1195 V_MC_DLL_DEFAULT(0x18);
1198 WRITECSR(base
+R_MC_MCLK_CFG
,mclkcfg
);
1204 /* *********************************************************************
1205 * Default DRAM init table
1207 * This is just here to make SB1250 BSPs easier to write.
1208 * If you've hooked up standard JEDEC SDRAMs in a standard
1209 * way with all your SPD ROMs on one SMBus channel,
1210 * This table is for you.
1212 * Otherwise, copy it into your board_init.S file and
1213 * modify it, and return a pointer to the table from
1214 * the board_draminfo routine.
1216 * (See the CFE manual for more details)
1217 ********************************************************************* */
1219 #if !defined(_MCSTANDALONE_) /* no tables in the non-CFE, non-MIPS version */
1222 static const mc_initrec_t draminittab_11xx
[5] __attribute__ ((section(".text"))) = {
1225 * Globals: No interleaving
1228 DRAM_GLOBALS(MC_NOPORTINTLV
),
1231 * Memory channel 0: manually configure for verilog runs
1232 * Configure chip select 0.
1235 DRAM_CHAN_CFG(MC_CHAN0
, 80, JEDEC
, CASCHECK
, BLKSIZE32
, NOCSINTLV
, ECCDISABLE
, 0),
1237 DRAM_CS_GEOM(MC_CS0
, 12, 8, 2),
1238 DRAM_CS_TIMING(DRT10(7,5), JEDEC_RFSH_64khz
, JEDEC_CASLAT_25
, 0, 45, DRT4(20,0), DRT4(15,0), DRT4(20,0), 0, 0),
1243 static const mc_initrec_t draminittab_12xx
[5] __attribute__ ((section(".text"))) = {
1246 * Globals: No interleaving
1249 DRAM_GLOBALS(MC_NOPORTINTLV
),
1252 * Memory channel 0: manually configure for verilog runs
1253 * Configure chip select 0.
1256 DRAM_CHAN_CFG(MC_CHAN0
, 80, JEDEC
, CASCHECK
, BLKSIZE32
, NOCSINTLV
, ECCDISABLE
, 0),
1258 DRAM_CS_GEOM(MC_CS0
, 12, 8, 2),
1259 DRAM_CS_TIMING(DRT10(7,5), JEDEC_RFSH_64khz
, JEDEC_CASLAT_25
, 0, 45, DRT4(20,0), DRT4(15,0), DRT4(20,0), 0, 0),
1266 #define DEVADDR (CFG_DRAM_SMBUS_BASE)
1267 #define DEFCHAN (CFG_DRAM_SMBUS_CHANNEL)
1268 static const mc_initrec_t draminittab_12xx
[8] __attribute__ ((section(".text"))) = {
1271 * Global data: Interleave mode from bsp_config.h
1274 DRAM_GLOBALS(CFG_DRAM_INTERLEAVE
), /* do port interleaving if possible */
1277 * Memory channel 0: Configure via SMBUS, Automatic Timing
1278 * Assumes SMBus device numbers are arranged such
1279 * that the first two addresses are CS0,1 and CS2,3 on MC0
1280 * and the second two addresses are CS0,1 and CS2,3 on MC1
1283 DRAM_CHAN_CFG(MC_CHAN0
, CFG_DRAM_MIN_tMEMCLK
, DRAM_TYPE_SPD
, CASCHECK
, CFG_DRAM_BLOCK_SIZE
, CFG_DRAM_CSINTERLEAVE
, CFG_DRAM_ECC
, 0),
1285 DRAM_CS_SPD(MC_CS0
, 0, DEFCHAN
, DEVADDR
+0),
1286 DRAM_CS_SPD(MC_CS2
, 0, DEFCHAN
, DEVADDR
+1),
1289 * Memory channel 1: Configure via SMBUS
1292 DRAM_CHAN_CFG(MC_CHAN1
, CFG_DRAM_MIN_tMEMCLK
, DRAM_TYPE_SPD
, CASCHECK
, CFG_DRAM_BLOCK_SIZE
, CFG_DRAM_CSINTERLEAVE
, CFG_DRAM_ECC
, 0),
1294 DRAM_CS_SPD(MC_CS0
, 0, DEFCHAN
, DEVADDR
+2),
1295 DRAM_CS_SPD(MC_CS2
, 0, DEFCHAN
, DEVADDR
+3),
1305 static const mc_initrec_t draminittab_11xx
[5] __attribute__ ((section(".text"))) = {
1308 * Global data: Interleave mode from bsp_config.h
1311 DRAM_GLOBALS(0), /* no port interleaving on 11xx */
1314 * Memory channel 1: Configure via SMBUS
1317 DRAM_CHAN_CFG(MC_CHAN1
, CFG_DRAM_MIN_tMEMCLK
, DRAM_TYPE_SPD
, CASCHECK
, CFG_DRAM_BLOCK_SIZE
, CFG_DRAM_CSINTERLEAVE
, CFG_DRAM_ECC
, 0),
1319 DRAM_CS_SPD(MC_CS0
, 0, DEFCHAN
, DEVADDR
+0),
1320 DRAM_CS_SPD(MC_CS2
, 0, DEFCHAN
, DEVADDR
+1),
1334 /* *********************************************************************
1335 * SB1250_SMBUS_INIT()
1337 * Initialize SMBUS channel
1340 * chan - SMBus channel number, 0 or 1
1343 * smbus_base - KSEG1 address of SMBus channel
1347 ********************************************************************* */
1349 static sbport_t
sb1250_smbus_init(int chan
)
1353 base
= PHYS_TO_K1(A_SMB_BASE(chan
));
1355 WRITECSR(base
+R_SMB_FREQ
,K_SMB_FREQ_100KHZ
);
1356 WRITECSR(base
+R_SMB_CONTROL
,0);
1362 /* *********************************************************************
1363 * SB1250_SMBUS_WAITREADY()
1365 * Wait for SMBUS channel to be ready.
1368 * smbus_base - SMBus channel base (K1seg addr)
1371 * ret0 - 0 if no error occured, else -1
1375 ********************************************************************* */
1377 static int sb1250_smbus_waitready(sbport_t base
)
1382 * Wait for busy bit to clear
1386 status
= READCSR(base
+R_SMB_STATUS
);
1387 if (!(status
& M_SMB_BUSY
)) break;
1391 * Isolate error bit and clear error status
1394 status
&= M_SMB_ERROR
;
1395 WRITECSR(base
+R_SMB_STATUS
,status
);
1401 return (status
) ? -1 : 0;
1406 /* *********************************************************************
1407 * SB1250_SMBUS_READBYTE()
1409 * Read a byte from a serial ROM attached to an SMBus channel
1412 * base - SMBus channel base address (K1seg addr)
1413 * dev - address of device on SMBUS
1414 * offset - address of byte within device on SMBUS
1417 * byte from device (-1 indicates an error)
1418 ********************************************************************* */
1421 static int sb1250_smbus_readbyte(sbport_t base
,unsigned int dev
,unsigned int offset
)
1426 * Wait for channel to be ready
1429 res
= sb1250_smbus_waitready(base
);
1430 if (res
< 0) return res
;
1433 * Set up a READ BYTE command. This command has no associated
1434 * data field, the command code is the data
1437 WRITECSR(base
+R_SMB_CMD
,offset
);
1438 WRITECSR(base
+R_SMB_START
,dev
| V_SMB_TT(K_SMB_TT_CMD_RD1BYTE
));
1441 * Wait for the command to complete
1444 res
= sb1250_smbus_waitready(base
);
1445 if (res
< 0) return res
;
1448 * Return the data byte
1451 return (int) ((READCSR(base
+R_SMB_DATA
)) & 0xFF);
1455 /* *********************************************************************
1456 * SB1250_DRAM_GETINFO
1458 * Process a single init table entry and move data into the
1459 * memory controller's data structure.
1462 * smbase - points to base of SMbus device to read from
1463 * mc - memory controller data
1464 * init - pointer to current user init table entry
1468 ********************************************************************* */
1470 static void sb1250_dram_getinfo(unsigned int smbchan
,
1471 unsigned int smbdev
,
1477 unsigned char spd
[JEDEC_SPD_MAX
];
1479 csdata_t
*cs
= &(mc
->csdata
[chipsel
]);
1482 smbase
= sb1250_smbus_init(smbchan
);
1485 * Read just the memory type to see if the RAM is present.
1488 res
= sb1250_smbus_readbyte(smbase
,smbdev
,JEDEC_SPD_MEMTYPE
);
1490 if ((res
< 0) || ((res
!= JEDEC_MEMTYPE_DDRSDRAM
) &&
1491 (res
!= JEDEC_MEMTYPE_DDRSDRAM2
) &&
1492 (res
!= SPD_MEMTYPE_FCRAM
))) {
1493 return; /* invalid or no memory installed */
1497 * Now go back and read everything.
1501 for (idx
= 0; idx
< JEDEC_SPD_MAX
; idx
++) {
1502 res
= sb1250_smbus_readbyte(smbase
,smbdev
,idx
);
1507 if (res
< 0) return; /* some SMBus error */
1510 cs
->rows
= spd
[JEDEC_SPD_ROWS
];
1511 cs
->cols
= spd
[JEDEC_SPD_COLS
];
1514 * Determine how many bits the banks represent. Unlike
1515 * the rows/columns, the bank byte says how *many* banks
1516 * there are, not how many bits represent banks
1519 switch (spd
[JEDEC_SPD_BANKS
]) {
1520 case 2: /* 2 banks = 1 bits */
1524 case 4: /* 4 banks = 2 bits */
1528 case 8: /* 8 banks = 3 bits */
1532 case 16: /* 16 banks = 4 bits */
1536 default: /* invalid bank count */
1542 * Read timing parameters from the DIMM. By this time we kind of trust
1545 cs
->spd_dramtype
= spd
[JEDEC_SPD_MEMTYPE
];
1546 cs
->spd_tCK_25
= spd
[JEDEC_SPD_tCK25
];
1547 cs
->spd_tCK_20
= spd
[JEDEC_SPD_tCK20
];
1548 cs
->spd_tCK_10
= spd
[JEDEC_SPD_tCK10
];
1549 cs
->spd_rfsh
= spd
[JEDEC_SPD_RFSH
];
1550 cs
->spd_caslatency
= spd
[JEDEC_SPD_CASLATENCIES
];
1551 cs
->spd_attributes
= spd
[JEDEC_SPD_ATTRIBUTES
];
1552 cs
->spd_tRAS
= spd
[JEDEC_SPD_tRAS
];
1553 cs
->spd_tRP
= spd
[JEDEC_SPD_tRP
];
1554 cs
->spd_tRRD
= spd
[JEDEC_SPD_tRRD
];
1555 cs
->spd_tRCD
= spd
[JEDEC_SPD_tRCD
];
1556 cs
->spd_tRFC
= spd
[JEDEC_SPD_tRFC
];
1557 cs
->spd_tRC
= spd
[JEDEC_SPD_tRC
];
1560 * Okay, we got all the required data. mark this CS present.
1563 cs
->flags
= CS_PRESENT
| CS_AUTO_TIMING
;
1566 * If the module width is not 72 for any DIMM, disable ECC for this
1567 * channel. All DIMMs must support ECC for us to enable it.
1570 if (spd
[JEDEC_SPD_WIDTH
] != 72) mc
->flags
&= ~MCFLG_ECC_ENABLE
;
1573 * If it was a double-sided DIMM, also mark the odd chip select
1577 if ((spd
[JEDEC_SPD_SIDES
] == 2) && !(mc
->flags
& MCFLG_BIGMEM
)) {
1578 csdata_t
*oddcs
= &(mc
->csdata
[chipsel
| 1]);
1580 oddcs
->rows
= cs
->rows
;
1581 oddcs
->cols
= cs
->cols
;
1582 oddcs
->banks
= cs
->banks
;
1583 oddcs
->flags
= CS_PRESENT
;
1585 oddcs
->spd_dramtype
= spd
[JEDEC_SPD_MEMTYPE
];
1586 oddcs
->spd_tCK_25
= spd
[JEDEC_SPD_tCK25
];
1587 oddcs
->spd_tCK_20
= spd
[JEDEC_SPD_tCK20
];
1588 oddcs
->spd_tCK_10
= spd
[JEDEC_SPD_tCK10
];
1589 oddcs
->spd_rfsh
= spd
[JEDEC_SPD_RFSH
];
1590 oddcs
->spd_caslatency
= spd
[JEDEC_SPD_CASLATENCIES
];
1591 oddcs
->spd_attributes
= spd
[JEDEC_SPD_ATTRIBUTES
];
1592 oddcs
->spd_tRAS
= spd
[JEDEC_SPD_tRAS
];
1593 oddcs
->spd_tRP
= spd
[JEDEC_SPD_tRP
];
1594 oddcs
->spd_tRRD
= spd
[JEDEC_SPD_tRRD
];
1595 oddcs
->spd_tRCD
= spd
[JEDEC_SPD_tRCD
];
1596 oddcs
->spd_tRFC
= spd
[JEDEC_SPD_tRFC
];
1597 oddcs
->spd_tRC
= spd
[JEDEC_SPD_tRC
];
1603 /* *********************************************************************
1604 * SB1250_DRAM_READPARAMS(d,init)
1606 * Read all the parameters from the user parameter table and
1607 * digest them into our local data structure. This routine basically
1608 * walks the table and calls the routine above to handle each
1612 * d - our data structure (our RAM data)
1613 * init - pointer to user config table
1617 ********************************************************************* */
1619 static void sb1250_dram_readparams(initdata_t
*d
,const draminittab_t
*init
)
1625 sysrev
= READCSR(PHYS_TO_K1(A_SCD_SYSTEM_REVISION
));
1628 * Assume we're starting on the first channel. We should have a CHCFG record
1629 * to set the initial channel number, this is just in case.
1631 mc
= &(d
->mc
[d
->firstchan
]);
1633 /* Default clock config unless overridden */
1634 if (G_SYS_REVISION(sysrev
) >= K_SYS_REVISION_PASS1
&&
1635 G_SYS_REVISION(sysrev
) < K_SYS_REVISION_PASS2
) {
1637 mc
->clkconfig
= V_MC_CLKCONFIG_VALUE_PASS1
;
1641 mc
->clkconfig
= V_MC_CLKCONFIG_VALUE
;
1644 cs
= &(mc
->csdata
[0]);
1646 while (init
->mcr
.mcr_type
!= MCR_EOT
) {
1648 #ifdef _MCSTANDALONE_NOISY_
1649 printf("DRAM: Processing record '%s'\n",sb1250_rectypes
[init
->mcr
.mcr_type
]);
1652 switch (init
->mcr
.mcr_type
) {
1655 if (init
->gbl
.gbl_intlv_ch
) d
->flags
|= M_MCINIT_TRYPINTLV
;
1659 mc
= &(d
->mc
[init
->cfg
.cfg_chan
]);
1660 mc
->mintmemclk
= DECTO10THS(init
->cfg
.cfg_mintmemclk
);
1661 mc
->dramtype
= init
->cfg
.cfg_dramtype
;
1662 mc
->pagepolicy
= init
->cfg
.cfg_pagepolicy
;
1663 mc
->blksize
= init
->cfg
.cfg_blksize
;
1664 mc
->cfgcsint
= init
->cfg
.cfg_intlv_cs
;
1666 /* Default clock config unless overridden */
1667 if (G_SYS_REVISION(sysrev
) >= K_SYS_REVISION_PASS1
&&
1668 G_SYS_REVISION(sysrev
) < K_SYS_REVISION_PASS2
) {
1670 mc
->clkconfig
= V_MC_CLKCONFIG_VALUE_PASS1
;
1674 mc
->clkconfig
= V_MC_CLKCONFIG_VALUE
;
1677 mc
->flags
= (init
->cfg
.cfg_ecc
& MCFLG_ECC_ENABLE
) |
1678 (init
->cfg
.cfg_flags
& (MCFLG_FORCEREG
| MCFLG_BIGMEM
));
1679 mc
->roundtrip
= DECTO10THS(init
->cfg
.cfg_roundtrip
);
1680 if (mc
->roundtrip
== 0 && mc
->dramtype
!= DRAM_TYPE_SPD
) {
1682 * Only set default roundtrip if mem type is specified, else wait
1683 * to get type from SPD
1685 mc
->roundtrip
= (mc
->dramtype
== FCRAM
) ?
1686 DEFAULT_MEMORY_ROUNDTRIP_TIME_FCRAM
: DEFAULT_MEMORY_ROUNDTRIP_TIME
;
1688 if (mc
->dramtype
== FCRAM
) mc
->pagepolicy
= CLOSED
; /*FCRAM must be closed page policy*/
1689 cs
= &(mc
->csdata
[0]);
1693 cs
->spd_tCK_25
= init
->tmg
.tmg_tCK
;
1696 cs
->spd_rfsh
= init
->tmg
.tmg_rfsh
;
1697 cs
->spd_caslatency
= init
->tmg
.tmg_caslatency
;
1698 cs
->spd_attributes
= init
->tmg
.tmg_attributes
;
1699 cs
->spd_tRAS
= init
->tmg
.tmg_tRAS
;
1700 cs
->spd_tRP
= init
->tmg
.tmg_tRP
;
1701 cs
->spd_tRRD
= init
->tmg
.tmg_tRRD
;
1702 cs
->spd_tRCD
= init
->tmg
.tmg_tRCD
;
1703 cs
->spd_tRFC
= init
->tmg
.tmg_tRFC
;
1704 cs
->spd_tRC
= init
->tmg
.tmg_tRC
;
1709 V_MC_ADDR_SKEW((uint64_t)(init
->clk
.clk_addrskew
)) |
1710 V_MC_DQO_SKEW((uint64_t)(init
->clk
.clk_dqoskew
)) |
1711 V_MC_DQI_SKEW((uint64_t)(init
->clk
.clk_dqiskew
)) |
1712 V_MC_ADDR_DRIVE((uint64_t)(init
->clk
.clk_addrdrive
)) |
1713 V_MC_DATA_DRIVE((uint64_t)(init
->clk
.clk_datadrive
)) |
1714 V_MC_CLOCK_DRIVE((uint64_t)(init
->clk
.clk_clkdrive
));
1718 cs
= &(mc
->csdata
[init
->geom
.geom_csel
]);
1719 cs
->rows
= init
->geom
.geom_rows
;
1720 cs
->cols
= init
->geom
.geom_cols
;
1721 cs
->banks
= init
->geom
.geom_banks
;
1722 cs
->flags
|= CS_PRESENT
;
1726 cs
= &(mc
->csdata
[init
->spd
.spd_csel
]);
1727 sb1250_dram_getinfo(init
->spd
.spd_smbuschan
,
1728 init
->spd
.spd_smbusdev
,
1730 init
->spd
.spd_csel
);
1732 if (mc
->dramtype
== DRAM_TYPE_SPD
) {
1733 /* Use the DRAM type we get from the SPD */
1734 if (cs
->spd_dramtype
== SPD_MEMTYPE_FCRAM
){
1735 mc
->dramtype
= FCRAM
;
1736 mc
->pagepolicy
= CLOSED
;
1737 if (mc
->roundtrip
== 0) mc
->roundtrip
= DEFAULT_MEMORY_ROUNDTRIP_TIME_FCRAM
;
1740 mc
->dramtype
= JEDEC
;
1741 if (mc
->roundtrip
== 0) mc
->roundtrip
= DEFAULT_MEMORY_ROUNDTRIP_TIME
;
1744 mc
->rfsh
= cs
->spd_rfsh
;
1748 /* Manual timing - pick record up as bytes because we cannot
1749 guarantee the alignment of the "mtm_timing" field in our
1750 structure -- each row is 12 bytes, not good */
1751 mc
->rfsh
= (uint16_t) init
->mtm
.mtm_rfsh
; /* units: JEDEC refresh value */
1752 mc
->tCK
= (uint16_t) init
->mtm
.mtm_tCK
; /* units: BCD, like SPD */
1754 (((uint64_t) init
->mtm
.mtm_timing
[0]) << 56) |
1755 (((uint64_t) init
->mtm
.mtm_timing
[1]) << 48) |
1756 (((uint64_t) init
->mtm
.mtm_timing
[2]) << 40) |
1757 (((uint64_t) init
->mtm
.mtm_timing
[3]) << 32) |
1758 (((uint64_t) init
->mtm
.mtm_timing
[4]) << 24) |
1759 (((uint64_t) init
->mtm
.mtm_timing
[5]) << 16) |
1760 (((uint64_t) init
->mtm
.mtm_timing
[6]) << 8) |
1761 (((uint64_t) init
->mtm
.mtm_timing
[7]) << 0);
1772 * Okay, now we've internalized all the data from the SPDs
1773 * and/or the init table.
1780 /* *********************************************************************
1781 * SB1250_DRAMINIT_DELAY
1783 * This little routine delays at least 200 microseconds.
1793 ********************************************************************* */
1795 /* 200 microseconds = 5KHz, so delay 1GHz/5Khz = 200,000 cycles */
1798 #define DRAMINIT_DELAY_CNT "50"
1800 #define DRAMINIT_DELAY_CNT "(1000000000/5000)"
1803 #if defined(_MCSTANDALONE_)
1804 #define DRAMINIT_DELAY() /* not running on a 1250, no delays */
1806 #define DRAMINIT_DELAY() sb1250_draminit_delay()
1808 static void sb1250_draminit_delay(void)
1810 __asm(" li $9," DRAMINIT_DELAY_CNT
" ; "
1813 " .set push ; .set mips64 ; ssnop ; ssnop ; .set pop ;"
1821 /* *********************************************************************
1822 * MAKEDRAMMASK(dest,width,pos)
1824 * Create a 64-bit mask for the DRAM config registers
1827 * width - number of '1' bits to set
1828 * pos - position (from the right) of the first '1' bit
1831 * mask with specified with at specified position
1832 ********************************************************************* */
1834 #define MAKEDRAMMASK(width,pos) _SB_MAKEMASK(width,pos)
1837 /* *********************************************************************
1838 * SB1250_JEDEC_INITCMDS
1840 * Issue the sequence of DRAM init commands (JEDEC SDRAMs)
1843 * mcnum - memory controller index (0/1)
1844 * mc - pointer to data for this memory controller
1845 * csel - which chip select to send init commands for
1846 * lmbank - for largemem systems, the cs qualifiers to be
1848 * tdata - chip select to use as a template for timing data
1852 ********************************************************************* */
1854 static void sb1250_jedec_initcmds(int mcnum
,mcdata_t
*mc
,int csel
,
1855 int lmbank
,csdata_t
*tdata
)
1863 csmask
= M_MC_CS0
<< csel
; /* convert chip select # to mask */
1865 if (mc
->flags
& MCFLG_BIGMEM
) {
1867 * so that the banks will all get their precharge signals,
1868 * put the CS qualifiers out on CS[2:3].
1870 csmask
|= (uint64_t)(lmbank
<< 6);
1873 cmd
= (sbport_t
) PHYS_TO_K1(A_MC_REGISTER(mcnum
,R_MC_DRAMCMD
));
1874 mode
= (sbport_t
) PHYS_TO_K1(A_MC_REGISTER(mcnum
,R_MC_DRAMMODE
));
1877 * Using the data in the timing template, figure out which
1878 * CAS latency command to issue.
1881 switch (tdata
->flags
& CS_CASLAT_MASK
) {
1883 casbits
= V_MC_MODE(JEDEC_SDRAM_MRVAL_CAS3
);
1887 casbits
= V_MC_MODE(JEDEC_SDRAM_MRVAL_CAS25
);
1890 casbits
= V_MC_MODE(JEDEC_SDRAM_MRVAL_CAS2
);
1893 casbits
= V_MC_MODE(JEDEC_SDRAM_MRVAL_CAS15
);
1898 * Set up for doing mode register writes to the SDRAMs
1900 * First time, we set bit 8 to reset the DLL
1903 modebits
= V_MC_EMODE(JEDEC_SDRAM_EMRVAL
) |
1904 V_MC_MODE(JEDEC_SDRAM_MRVAL_RESETDLL
) |
1905 V_MC_DRAM_TYPE(JEDEC
);
1907 WRITECSR(mode
,modebits
| casbits
);
1909 WRITECSR(cmd
,csmask
| V_MC_COMMAND_CLRPWRDN
);
1912 WRITECSR(cmd
,csmask
| V_MC_COMMAND_PRE
);
1915 WRITECSR(cmd
,csmask
| V_MC_COMMAND_EMRS
);
1918 WRITECSR(cmd
,csmask
| V_MC_COMMAND_MRS
);
1921 WRITECSR(cmd
,csmask
| V_MC_COMMAND_PRE
);
1924 WRITECSR(cmd
,csmask
| V_MC_COMMAND_AR
);
1927 WRITECSR(cmd
,csmask
| V_MC_COMMAND_AR
);
1931 * This time, clear bit 8 to start the DLL
1934 modebits
= V_MC_EMODE(JEDEC_SDRAM_EMRVAL
) |
1935 V_MC_DRAM_TYPE(JEDEC
);
1937 WRITECSR(mode
,modebits
| casbits
);
1938 WRITECSR(cmd
,csmask
| V_MC_COMMAND_MRS
);
1943 /* *********************************************************************
1944 * SB1250_SGRAM_INITCMDS
1946 * Issue the sequence of DRAM init commands. (SGRAMs)
1947 * Note: this routine does not support "big memory" (external decode)
1950 * mcnum - memory controller index (0/1)
1951 * mc - pointer to data for this memory controller
1952 * csel - which chip select to send init commands for
1953 * tdata - chip select to use as a template for timing data
1957 ********************************************************************* */
1959 static void sb1250_sgram_initcmds(int mcnum
,mcdata_t
*mc
,int csel
,csdata_t
*tdata
)
1965 csmask
= M_MC_CS0
<< csel
; /* convert chip select # to mask */
1966 cmd
= (sbport_t
) PHYS_TO_K1(A_MC_REGISTER(mcnum
,R_MC_DRAMCMD
));
1967 mode
= (sbport_t
) PHYS_TO_K1(A_MC_REGISTER(mcnum
,R_MC_DRAMMODE
));
1970 WRITECSR(cmd
,csmask
| V_MC_COMMAND_CLRPWRDN
);
1973 WRITECSR(cmd
,csmask
| V_MC_COMMAND_PRE
);
1977 * Set up for doing mode register writes to the SDRAMs
1979 * mode 0x62 is "sequential 4-byte bursts, CAS Latency 2.5"
1980 * mode 0x22 is "sequential 4-byte bursts, CAS Latency 2"
1982 * First time, we set bit 8 to reset the DLL
1985 WRITECSR(mode
,V_MC_EMODE(SGRAM_EMRVAL
) |
1986 V_MC_MODE(SGRAM_MRVAL
) |
1987 V_MC_MODE(SGRAM_MRVAL_RESETDLL
) |
1988 V_MC_DRAM_TYPE(SGRAM
));
1990 WRITECSR(cmd
,csmask
| V_MC_COMMAND_EMRS
);
1993 WRITECSR(cmd
,csmask
| V_MC_COMMAND_MRS
);
1996 WRITECSR(cmd
,csmask
| V_MC_COMMAND_PRE
);
1999 WRITECSR(cmd
,csmask
| V_MC_COMMAND_AR
);
2002 WRITECSR(cmd
,csmask
| V_MC_COMMAND_AR
);
2006 * This time, clear bit 8 to start the DLL
2009 WRITECSR(mode
,V_MC_EMODE(SGRAM_EMRVAL
) |
2010 V_MC_MODE(SGRAM_MRVAL
) |
2011 V_MC_DRAM_TYPE(SGRAM
));
2012 WRITECSR(cmd
,csmask
| V_MC_COMMAND_MRS
);
2017 /* *********************************************************************
2018 * SB1250_FCRAM_INITCMDS
2020 * Issue the sequence of DRAM init commands. (FCRAMs)
2021 * Note: this routine does not support "big memory" (external decode)
2024 * mcnum - memory controller index (0/1)
2025 * mc - pointer to data for this memory controller
2026 * csel - which chip select to send init commands for
2027 * tdata - chip select to use as a template for timing data
2031 ********************************************************************* */
2033 static void sb1250_fcram_initcmds(int mcnum
,mcdata_t
*mc
,int csel
,csdata_t
*tdata
)
2039 csmask
= M_MC_CS0
<< csel
; /* convert chip select # to mask */
2040 cmd
= (sbport_t
) PHYS_TO_K1(A_MC_REGISTER(mcnum
,R_MC_DRAMCMD
));
2041 mode
= (sbport_t
) PHYS_TO_K1(A_MC_REGISTER(mcnum
,R_MC_DRAMMODE
));
2045 * For FCRAMs the type must be set first, since much of the
2046 * init state machine is done in hardware.
2049 WRITECSR(mode
, V_MC_DRAM_TYPE(FCRAM
));
2050 DRAMINIT_DELAY(); /* Required delay for FCRAM */
2052 WRITECSR(cmd
,csmask
| V_MC_COMMAND_CLRPWRDN
);
2055 WRITECSR(cmd
,csmask
| K_MC_COMMAND_PRE
);
2059 * Set up for doing mode register writes to the FCRAMs
2061 * mode 0x32 is "sequential 4-byte bursts, CAS Latency 3.0"
2064 WRITECSR(mode
,V_MC_EMODE(FCRAM_EMRVAL
) |
2065 V_MC_MODE(FCRAM_MRVAL
) |
2066 V_MC_DRAM_TYPE(FCRAM
));
2068 WRITECSR(cmd
,csmask
| V_MC_COMMAND_EMRS
);
2071 WRITECSR(cmd
,csmask
| V_MC_COMMAND_MRS
);
2074 WRITECSR(cmd
,csmask
| V_MC_COMMAND_AR
);
2077 WRITECSR(cmd
,csmask
| V_MC_COMMAND_AR
);
2081 * Do 4 dummy writes, one to each bank, to get the
2085 #ifndef _MCSTANDALONE_ /* only on real hardware */
2087 volatile uint64_t *ptr
;
2089 ptr
= (volatile uint64_t *) PHYS_TO_K1(0);
2090 *(ptr
+(0x00>>3)) = 0;
2091 *(ptr
+(0x20>>3)) = 0;
2092 *(ptr
+(0x40>>3)) = 0;
2093 *(ptr
+(0x60>>3)) = 0;
2102 /* *********************************************************************
2105 * Do row/column/bank initialization for 128-byte interleaved
2106 * mode, and also interleave across ports. You need to have
2107 * the same geometry DIMMs installed on both memory
2108 * channels for this to work.
2110 * Interleaved modes will assign address bits in the following
2113 * RRRRRRRR...R CCCCCCCC...C NN BB P CC xx000
2115 * Where 'R' are row address bits,
2116 * 'C' are column address bits
2117 * 'N' are chip-select bits
2118 * 'B' are bank select bits
2119 * 'P' is the channel (port) select
2120 * 'x' is ignored by the MC, but will be set to '1'.
2127 ********************************************************************* */
2128 static void sb1250_dram_intlv(initdata_t
*d
)
2130 int ttlbits
; /* bit counter */
2131 int rows
,columns
,banks
;
2141 int num_csint
= 1 << d
->mc
[0].csint
;
2144 d
->ttlbytes
= 0; /* start with zero memory */
2147 * Loop through each chip select
2150 mc0base
= PHYS_TO_K1(A_MC_BASE(0));
2151 mc1base
= PHYS_TO_K1(A_MC_BASE(1));
2153 for (csidx
= 0; csidx
< MC_CHIPSELS
; csidx
++) {
2156 * Address of CS-specific registers
2159 csx0base
= mc0base
+ R_MC_CSX_BASE
+ csidx
*MC_CSX_SPACING
;
2160 csx1base
= mc1base
+ R_MC_CSX_BASE
+ csidx
*MC_CSX_SPACING
;
2163 * Ignore this chipsel if we're not using it
2166 if (!(d
->mc
[0].csdata
[csidx
].flags
& CS_PRESENT
)) continue;
2167 if (!(d
->mc
[1].csdata
[csidx
].flags
& CS_PRESENT
)) continue;
2170 * Remember we did something to this MC. We won't bother
2171 * activating controllers we don't use.
2174 d
->inuse
|= 3; /* we're using both controllers 0 and 1 */
2177 * Dig the geometry out of the structure
2180 columns
= d
->mc
[0].csdata
[csidx
].cols
;
2181 rows
= d
->mc
[0].csdata
[csidx
].rows
;
2182 banks
= d
->mc
[0].csdata
[csidx
].banks
;
2185 * The lowest 3 bits are never set in any mask.
2186 * They represent the byte width of the DIMM.
2192 * The first two bits are always set and are part of the
2193 * column bits. Actually, the MC ignores these bits
2194 * but we set them here for clarity.
2196 * Depending on the block size, 0, 1, or 2 additional
2197 * bits are used for column interleave.
2199 * When interleaving ports, we always have a block
2200 * size of 128. It will work to use other block sizes,
2201 * but performance will suffer.
2204 switch (d
->mc
[0].blksize
) {
2205 case 32: t
= 2; break; /* 32-byte interleave */
2206 case 64: t
= 3; break; /* 64-byte interleave */
2207 default: t
= 4; break; /* 128-byte interleave */
2211 colmask
= MAKEDRAMMASK(t
,ttlbits
);
2215 * add 1 to 'ttlbits' to account for the bit we're
2216 * using for port intleave. The current value
2217 * of 'ttlbits' also happens to be the
2218 * bit number for port interleaving.
2221 d
->pintbit
= ttlbits
; /* interleave bit is right here */
2226 * Now do the bank mask
2229 mask
= MAKEDRAMMASK(banks
,ttlbits
);
2231 WRITECSR(csx0base
+R_MC_CSX_BA
,mask
);
2232 WRITECSR(csx1base
+R_MC_CSX_BA
,mask
);
2235 * Now do the chip select mask
2238 if ((d
->mc
[0].csint
> 0) &&
2239 (csidx
< num_csint
)) {
2240 mask
= MAKEDRAMMASK(d
->mc
[0].csint
,ttlbits
);
2241 ttlbits
+= d
->mc
[0].csint
;
2242 WRITECSR(mc0base
+R_MC_CS_INTERLEAVE
,mask
);
2243 WRITECSR(mc1base
+R_MC_CS_INTERLEAVE
,mask
);
2247 * Do the rest of the column bits
2250 mask
= MAKEDRAMMASK(columns
,ttlbits
);
2252 WRITECSR(csx0base
+R_MC_CSX_COL
,colmask
);
2253 WRITECSR(csx1base
+R_MC_CSX_COL
,colmask
);
2257 * Finally, do the rows. If we're in "big" memory
2258 * mode, two additional row bits are used for the
2262 if (d
->mc
[0].flags
& MCFLG_BIGMEM
) {
2263 rows
+= 2; /* add two bits for chip select */
2265 * The "bigmem" bit will be set in the MC_CONFIG
2266 * register back in the main routine.
2270 mask
= MAKEDRAMMASK(rows
,ttlbits
);
2272 WRITECSR(csx0base
+R_MC_CSX_ROW
,mask
);
2273 WRITECSR(csx1base
+R_MC_CSX_ROW
,mask
);
2276 * The total size of this DIMM is 1 << ttlbits, which is inflated by a
2277 * factor of num_csint to cover all interleaved chip selects.
2280 dimmsize
= ((uint64_t) 1) << ttlbits
;
2283 * Program the start and end registers. The start address is 0
2284 * our if csidx is cs-interleaved; otherwise, the start address
2285 * is the current "ttlbytes".
2288 if (csidx
< num_csint
) {
2289 d
->ttlbytes
+= dimmsize
>> d
->mc
[0].csint
;
2292 mask
= READCSR(mc0base
+R_MC_CS_START
);
2293 tmp
= d
->ttlbytes
>> 24;
2294 if (tmp
>= 0x40) tmp
= (0x100 + (tmp
- 0x40)); /* Adj for exp space */
2295 mask
|= (tmp
<< (16*csidx
));
2296 WRITECSR(mc0base
+R_MC_CS_START
,mask
);
2298 mask
= READCSR(mc1base
+R_MC_CS_START
);
2299 tmp
= d
->ttlbytes
>> 24;
2300 if (tmp
>= 0x40) tmp
= (0x100 + (tmp
- 0x40)); /* Adj for exp space */
2301 mask
|= (tmp
<< (16*csidx
));
2302 WRITECSR(mc1base
+R_MC_CS_START
,mask
);
2304 d
->ttlbytes
+= dimmsize
;
2305 dimmsize
= d
->ttlbytes
; /* setup dimmsize for cs_end below */
2308 mask
= READCSR(mc0base
+R_MC_CS_END
);
2309 tmp
= dimmsize
>> 24;
2310 if (tmp
> 0x40) tmp
= (0x100 + (tmp
- 0x40)); /* Adj for exp space */
2311 mask
|= (tmp
<< (16*csidx
));
2312 WRITECSR(mc0base
+R_MC_CS_END
,mask
);
2314 mask
= READCSR(mc1base
+R_MC_CS_END
);
2315 tmp
= dimmsize
>> 24;
2316 if (tmp
> 0x40) tmp
= (0x100 + (tmp
- 0x40)); /* Adj for exp space */
2317 mask
|= (tmp
<< (16*csidx
));
2318 WRITECSR(mc1base
+R_MC_CS_END
,mask
);
2325 /* *********************************************************************
2328 * Do row/column/bank initialization for MSB-CS (noninterleaved)
2329 * mode. This is only separated out of the main loop to make things
2330 * read easier, it's not a generally useful subroutine by itself.
2333 * initdata_t structure
2336 * memory controller initialized
2337 ********************************************************************* */
2339 static void sb1250_dram_msbcs(initdata_t
*d
)
2341 int ttlbits
; /* bit counter */
2342 int rows
,columns
,banks
;
2351 d
->ttlbytes
= 0; /* start with zero memory */
2354 * Loop through each memory controller and each chip select
2355 * within each memory controller.
2358 for (mcidx
= d
->firstchan
; mcidx
< MC_CHANNELS
; mcidx
++) {
2359 int num_csint
= 1 << d
->mc
[mcidx
].csint
;
2360 uint64_t channel_start
= d
->ttlbytes
;
2364 mcbase
= PHYS_TO_K1(A_MC_BASE(mcidx
));
2366 for (csidx
= 0; csidx
< MC_CHIPSELS
; csidx
++) {
2369 * Address of CS-specific registers
2372 csxbase
= mcbase
+ R_MC_CSX_BASE
+ csidx
* MC_CSX_SPACING
;
2375 * Ignore this chipsel if we're not using it
2378 if (!(d
->mc
[mcidx
].csdata
[csidx
].flags
& CS_PRESENT
)) continue;
2381 * Remember we did something to this MC. We won't bother
2382 * activating controllers we don't use.
2385 d
->inuse
|= (1 << mcidx
);
2388 * Dig the geometry out of the structure
2391 columns
= d
->mc
[mcidx
].csdata
[csidx
].cols
;
2392 rows
= d
->mc
[mcidx
].csdata
[csidx
].rows
;
2393 banks
= d
->mc
[mcidx
].csdata
[csidx
].banks
;
2396 * The lowest 3 bits are never set in any mask.
2397 * They represent the byte width of the DIMM.
2403 * The first two bits are always set and are part of the
2404 * column bits. Actually, the MC ignores these bits
2405 * but we set them here for clarity.
2407 * Depending on the block size, 0, 1, or 2 additional
2408 * bits are used for column interleave.
2411 switch (d
->mc
[mcidx
].blksize
) {
2412 case 32: t
= 2; break; /* 32-byte interleave */
2413 case 64: t
= 3; break; /* 64-byte interleave */
2414 default: t
= 4; break; /* 128-byte interleave */
2418 colmask
= MAKEDRAMMASK(t
,ttlbits
);
2422 * Now do the bank mask
2425 mask
= MAKEDRAMMASK(banks
,ttlbits
);
2427 WRITECSR(csxbase
+R_MC_CSX_BA
,mask
);
2430 * Now do the chip select mask
2433 if ((d
->mc
[mcidx
].csint
> 0) &&
2434 (csidx
< num_csint
)) {
2435 mask
= MAKEDRAMMASK(d
->mc
[mcidx
].csint
,ttlbits
);
2436 ttlbits
+= d
->mc
[mcidx
].csint
;
2437 WRITECSR(mcbase
+R_MC_CS_INTERLEAVE
,mask
);
2441 * Do the rest of the column bits
2444 mask
= MAKEDRAMMASK(columns
,ttlbits
);
2446 WRITECSR(csxbase
+R_MC_CSX_COL
,colmask
);
2450 * Finally, do the rows. If we're in "big" memory
2451 * mode, two additional row bits are used for the
2455 if (d
->mc
[mcidx
].flags
& MCFLG_BIGMEM
) {
2456 rows
+= 2; /* add two bits for chip select */
2458 * The "bigmem" bit will be set in the MC_CONFIG
2459 * register back in the main routine.
2463 mask
= MAKEDRAMMASK(rows
,ttlbits
);
2465 WRITECSR(csxbase
+R_MC_CSX_ROW
,mask
);
2468 * The total size of this DIMM is 1 << ttlbits, which is inflated
2469 * by a factor of num_csint to cover all interleaved chip selects.
2472 dimmsize
= ((uint64_t) 1) << ttlbits
;
2475 * Program the start and end registers. The start address is
2476 * channel_start if csidx is cs-interleaved; otherwise, the
2477 * start address is the current "ttlbytes".
2480 if (csidx
< num_csint
) {
2481 mask
= READCSR(mcbase
+R_MC_CS_START
);
2482 tmp
= (channel_start
>> 24);
2483 if (tmp
>= 0x40) tmp
= (0x100 + (tmp
- 0x40)); /* Adj for exp space */
2484 mask
|= (tmp
<< (16*csidx
));
2485 WRITECSR(mcbase
+R_MC_CS_START
,mask
);
2487 d
->ttlbytes
+= dimmsize
>> d
->mc
[mcidx
].csint
;
2488 end_addr
= channel_start
+ dimmsize
;
2491 mask
= READCSR(mcbase
+R_MC_CS_START
);
2492 tmp
= d
->ttlbytes
>> 24;
2493 if (tmp
>= 0x40) tmp
= (0x100 + (tmp
- 0x40)); /* Adj for exp space */
2494 mask
|= (tmp
<< (16*csidx
));
2495 WRITECSR(mcbase
+R_MC_CS_START
,mask
);
2497 d
->ttlbytes
+= dimmsize
;
2498 end_addr
= d
->ttlbytes
;
2501 mask
= READCSR(mcbase
+R_MC_CS_END
);
2502 tmp
= end_addr
>> 24;
2503 if (tmp
> 0x40) tmp
= (0x100 + (tmp
- 0x40)); /* Adj for exp space */
2504 mask
|= (tmp
<< (16*csidx
));
2505 WRITECSR(mcbase
+R_MC_CS_END
,mask
);
2511 /* *********************************************************************
2512 * SB1250_DRAM_ANALYZE(d)
2514 * Analyze the DRAM parameters, determine if we can do
2515 * port interleaving mode
2521 * nothing (fields in initdata are updated)
2522 ********************************************************************* */
2524 static void sb1250_dram_analyze(initdata_t
*d
)
2531 * Determine if we can do port interleaving. This is possible if
2532 * the DIMMs on each channel are the same.
2535 for (csidx
= 0; csidx
< MC_CHIPSELS
; csidx
++) {
2536 if (d
->mc
[0].csdata
[csidx
].rows
!= d
->mc
[1].csdata
[csidx
].rows
) break;
2537 if (d
->mc
[0].csdata
[csidx
].cols
!= d
->mc
[1].csdata
[csidx
].cols
) break;
2538 if (d
->mc
[0].csdata
[csidx
].banks
!= d
->mc
[1].csdata
[csidx
].banks
) break;
2539 if (d
->mc
[0].csdata
[csidx
].flags
!= d
->mc
[1].csdata
[csidx
].flags
) break;
2543 * If the per-controller flags don't match, no port interleaving.
2544 * I.e., you can't mix and match ECC, big memory, etc.
2547 if (d
->mc
[0].flags
!= d
->mc
[1].flags
) csidx
= 0;
2550 * Done with checks, see if we can do it.
2553 if (csidx
== MC_CHIPSELS
) {
2555 * All channels are the same, we can interleave. If we were asked
2556 * to try it, then enable it.
2558 if (d
->flags
& M_MCINIT_TRYPINTLV
) d
->flags
|= M_MCINIT_PINTLV
;
2562 * Determine how many CS interleave bits (0, 1, or 2) will work.
2563 * Memory channels are checked separately. If port (i.e., channel)
2564 * interleaving is allowed, each channel will end up with the same number
2565 * of CS interleave bits.
2566 * Note: No support for interleaving only chip selects 2 & 3.
2569 for (mcidx
= d
->firstchan
; mcidx
< MC_CHANNELS
; mcidx
++) {
2570 /* Forbid CS interleaving if any of:
2574 if ((d
->mc
[mcidx
].cfgcsint
> 0) &&
2575 !(d
->mc
[mcidx
].flags
& MCFLG_BIGMEM
) &&
2576 (d
->mc
[mcidx
].csdata
[0].flags
& CS_PRESENT
)) {
2578 for (csidx
= 1; csidx
< MC_CHIPSELS
; csidx
++) {
2579 /* CS csidx must be present */
2580 if (!(d
->mc
[mcidx
].csdata
[csidx
].flags
& CS_PRESENT
)) break;
2581 /* CS csidx must match geometry of CS 0 */
2582 if (d
->mc
[mcidx
].csdata
[0].rows
!= d
->mc
[mcidx
].csdata
[csidx
].rows
)
2584 if (d
->mc
[mcidx
].csdata
[0].cols
!= d
->mc
[mcidx
].csdata
[csidx
].cols
)
2586 if (d
->mc
[mcidx
].csdata
[0].banks
!=
2587 d
->mc
[mcidx
].csdata
[csidx
].banks
)
2590 /* csidx = 1st CS index that can't be interleaved;
2591 Convert csidx to a number of CS interleave address bits */
2593 /* Cap csint by the csinterleave attribute on the channel */
2594 if (csint
> d
->mc
[mcidx
].cfgcsint
) {
2595 csint
= d
->mc
[mcidx
].cfgcsint
;
2597 /* Forbid CS interleaving into the hole in the memory address
2598 space; i,e., cap the port-and-CS-interleaved CS size at 1 GB.
2599 Remove this code when sb1250_dram_intlv() can deal with CS
2600 sizes that span the hole. */
2602 int addr_bits
= 30; /* 1 GB */
2603 addr_bits
-= 3; /* 8 byte data bus width */
2604 addr_bits
-= d
->mc
[mcidx
].csdata
[0].rows
;
2605 addr_bits
-= d
->mc
[mcidx
].csdata
[0].cols
;
2606 addr_bits
-= d
->mc
[mcidx
].csdata
[0].banks
;
2607 if (d
->flags
& M_MCINIT_PINTLV
) addr_bits
-= 1;
2608 if (addr_bits
< 0) addr_bits
= 0;
2609 if (addr_bits
< csint
) csint
= addr_bits
;
2611 /* Return csint to caller */
2612 d
->mc
[mcidx
].csint
= csint
;
2620 #if !defined(_MCSTANDALONE_) /* When not linked into firmware, no RAM zeroing */
2622 /* *********************************************************************
2623 * SB1250_DRAM_ZERO1MB(d,addr)
2625 * Zero one megabyte of memory starting at the specified address.
2626 * 'addr' is in megabytes.
2629 * d - initdata structure
2630 * addr - starting address, expressed as a megabyte index
2634 ********************************************************************* */
2637 static void sb1250_dram_zero1mb(initdata_t
*d
,uint64_t addr
)
2639 __asm(" .set push ; .set noreorder ; .set mips64 ; "
2641 " ori $8,$9,0x80 ; "
2643 " bnel $0,$0,.+4 ; "
2645 " lui $10,0xB800 ; "
2646 " dsll32 $10,$10,0 ; "
2648 " or $10,$10,$12 ; "
2659 " sub $11,$11,64 ; "
2660 " bne $11,$0,ClrLoop ; "
2666 : : "r"(addr
) : "$8","$9","$10","$11","$12");
2670 /* *********************************************************************
2671 * SB1250_DRAM_ZERO1MB(d,addr)
2673 * Zero one megabyte of memory starting at the specified address.
2674 * 'addr' is in megabytes.
2677 * d - initdata structure
2678 * addr - starting address, expressed as a megabyte index
2682 ********************************************************************* */
2685 static void sb1250_dram_zero1mb(initdata_t
*d
,uint64_t addr
)
2692 * Build the descriptor
2695 d
->dscr
[0] = (addr
<< 20) |
2696 M_DM_DSCRA_ZERO_MEM
|
2697 M_DM_DSCRA_UN_DEST
| M_DM_DSCRA_UN_SRC
|
2698 V_DM_DSCRA_DIR_SRC_CONST
|
2699 V_DM_DSCRA_DIR_DEST_INCR
;
2700 d
->dscr
[1] = V_DM_DSCRB_SRC_LENGTH(0);
2702 /* Flush the descriptor out. We need to do this in Pass1
2703 because we're in cacheable noncoherent mode right now and
2704 the core will not respond to the DM's request for the descriptor. */
2706 __asm
__volatile ("cache 0x15,0(%0) ; " :: "r"(d
));
2709 * Give the descriptor to the data mover
2712 dmreg
= PHYS_TO_K1(A_DM_REGISTER(0,R_DM_DSCR_BASE
));
2713 baseaddr
= (uint64_t) K0_TO_PHYS((long)d
->dscr
) |
2714 V_DM_DSCR_BASE_PRIORITY(0) |
2715 V_DM_DSCR_BASE_RINGSZ(4) |
2716 M_DM_DSCR_BASE_ENABL
|
2717 M_DM_DSCR_BASE_RESET
;
2718 WRITECSR(dmreg
,baseaddr
);
2720 dmreg
= PHYS_TO_K1(A_DM_REGISTER(0,R_DM_DSCR_COUNT
));
2724 * Wait for the request to complete
2727 while ((READCSR(dmreg
) & 0xFFFF) > 0) {
2728 /* Do something that doesn't involve the ZBBus to give
2729 the DM some extra time */
2730 for (idx
= 0; idx
< 10000; idx
++) ; /* NULL LOOP */
2737 /* *********************************************************************
2738 * SB1250_DRAM_ZERO(d)
2740 * Zero memory, using the data mover.
2743 * d - initdata structure
2747 ********************************************************************* */
2748 static void sb1250_dram_zero(initdata_t
*d
)
2752 uint64_t curmb
; /* current address in megabytes */
2754 maxmem
= (int) (d
->ttlbytes
>> 20);
2757 for (idx
= 0; idx
< (int) maxmem
; idx
++) {
2758 sb1250_dram_zero1mb(d
,curmb
);
2760 if (curmb
== (REGION0_LOC
+REGION0_SIZE
)) curmb
= REGION1_LOC
;
2761 else if (curmb
== (REGION1_LOC
+REGION1_SIZE
)) curmb
= REGION2_LOC
;
2762 else if (curmb
== (REGION2_LOC
+REGION2_SIZE
)) curmb
= REGION3_LOC
;
2770 /* *********************************************************************
2771 * SB1250_DRAM_INIT()
2773 * Initialize DRAM connected to the specified DRAM controller
2774 * The DRAM will be configured without interleaving, as sequential
2778 * a0 - zero to use default memconfig table
2779 * or KSEG1 address of mem config table
2782 * v0 - total amount of installed DRAM
2786 ********************************************************************* */
2788 uint64_t sb1250_dram_init_real(const draminittab_t
*init
,initdata_t
*d
);
2789 uint64_t sb1250_dram_init_real(const draminittab_t
*init
,initdata_t
*d
)
2801 const draminittab_t
*init_11xx
;
2802 const draminittab_t
*init_12xx
;
2804 #if !defined(_MCSTANDALONE_)
2805 #if CFG_EMBEDDED_PIC
2806 __asm(".set push ; .set noreorder ; "
2809 "LoadREL1: la %0,draminittab_11xx-LoadREL1 ; "
2812 : "=r"(init_11xx
) :: "$31");
2814 __asm(".set push ; .set noreorder ; "
2817 "LoadREL2: la %0,draminittab_12xx-LoadREL2 ; "
2820 : "=r"(init_12xx
) :: "$31");
2822 init_11xx
= (draminittab_t
*) draminittab_11xx
;
2823 init_12xx
= (draminittab_t
*) draminittab_12xx
;
2828 * Zero the entire initdata structure
2831 d32
= (uint32_t *) d
;
2832 for (idx
= 0; idx
< sizeof(initdata_t
)/sizeof(uint32_t); idx
++) {
2837 * Determine system SOC type so we will know what channels
2838 * to initialize. The hybrid parts have 1250s inside,
2839 * so even though there are only pins for 1 channel the
2840 * registers are there for both, so we need to initialize them.
2841 * The "real" 1125s only have one channel.
2844 cfgbits
= READCSR(PHYS_TO_K1(A_SCD_SYSTEM_REVISION
));
2845 d
->soctype
= SYS_SOC_TYPE(cfgbits
);
2847 switch (d
->soctype
) {
2848 case K_SYS_SOC_TYPE_BCM1120
:
2849 case K_SYS_SOC_TYPE_BCM1125
:
2851 #if !defined(_MCSTANDALONE_)
2852 if (!init
) init
= init_11xx
;
2856 case K_SYS_SOC_TYPE_BCM1250
:
2857 case K_SYS_SOC_TYPE_BCM1125H
:
2860 #if !defined(_MCSTANDALONE_)
2861 if (!init
) init
= init_12xx
;
2866 * Begin by initializing the memory channels to some known state.
2867 * Set the "BERR_DISABLE" bit for now while we initialize the channels,
2868 * this will be cleared again before the routine exits.
2871 #ifdef _MCSTANDALONE_NOISY_
2872 printf("DRAM: Initializing memory controller.\n");
2875 for (mcidx
= d
->firstchan
; mcidx
< MC_CHANNELS
; mcidx
++) {
2876 mcbase
= PHYS_TO_K1(A_MC_BASE(mcidx
));
2878 WRITECSR(mcbase
+R_MC_CONFIG
,V_MC_CONFIG_DEFAULT
| M_MC_ECC_DISABLE
|
2879 V_MC_CS_MODE_MSB_CS
| M_MC_BERR_DISABLE
);
2880 WRITECSR(mcbase
+R_MC_CS_START
,0);
2881 WRITECSR(mcbase
+R_MC_CS_END
,0);
2882 WRITECSR(mcbase
+R_MC_CS_INTERLEAVE
,0);
2883 WRITECSR(mcbase
+R_MC_CS_ATTR
,0);
2884 WRITECSR(mcbase
+R_MC_TEST_DATA
,0);
2885 WRITECSR(mcbase
+R_MC_TEST_ECC
,0);
2889 * Read the parameters
2892 sb1250_dram_readparams(d
,init
);
2895 * Analyze parameters
2898 sb1250_dram_analyze(d
);
2901 * Configure chip selects
2904 if (d
->flags
& M_MCINIT_PINTLV
) {
2905 sb1250_dram_intlv(d
);
2906 cfgbits
= V_MC_CHANNEL_SEL(d
->pintbit
);
2909 sb1250_dram_msbcs(d
);
2914 * Okay, initialize the DRAM controller(s)
2917 for (mcidx
= d
->firstchan
; mcidx
< MC_CHANNELS
; mcidx
++) {
2919 uint64_t mc_cfgbits
= cfgbits
;
2922 * Skip this controller if we did nothing
2924 if (!(d
->inuse
& (1 << mcidx
))) continue;
2927 * Get the base address of the controller
2929 mcbase
= PHYS_TO_K1(A_MC_BASE(mcidx
));
2935 mc
= &(d
->mc
[mcidx
]);
2938 * Program the clock config register. This starts the clock to the
2939 * SDRAMs. Need to wait 200us after doing this. (6.4.6.1)
2941 * Find the slowest chip/dimm among the chip selects on this
2942 * controller and use that for computing the timing values.
2945 csidx
= sb1250_find_timingcs(mc
);
2946 if (csidx
< 0) continue; /* should not happen */
2948 tdata
= &(d
->mc
[mcidx
].csdata
[csidx
]); /* remember for use below */
2950 if (mc
->mantiming
) {
2951 sb1250_manual_timing(mcidx
,mc
);
2954 sb1250_auto_timing(mcidx
,mc
,tdata
);
2960 * Set up the memory controller config and timing registers.
2964 case 0: mc_cfgbits
|= V_MC_CS_MODE_MSB_CS
; break;
2965 case 1: mc_cfgbits
|= V_MC_CS_MODE_MIXED_CS_32
; break;
2966 case 2: mc_cfgbits
|= V_MC_CS_MODE_INTLV_CS
; break;
2969 mc_cfgbits
|= V_MC_WR_LIMIT_DEFAULT
| V_MC_AGE_LIMIT_DEFAULT
|
2970 V_MC_BANK0_MAP_DEFAULT
| V_MC_BANK1_MAP_DEFAULT
|
2971 V_MC_BANK2_MAP_DEFAULT
| V_MC_BANK3_MAP_DEFAULT
|
2972 V_MC_QUEUE_SIZE_DEFAULT
;
2974 /* Give IOB1 priority (config bit is only on channel 1) */
2976 if (mcidx
== 1) mc_cfgbits
|= M_MC_IOB1HIGHPRIORITY
;
2978 WRITECSR(mcbase
+R_MC_CONFIG
,mc_cfgbits
| M_MC_ECC_DISABLE
| M_MC_BERR_DISABLE
);
2981 dramtype
= d
->mc
[mcidx
].dramtype
;
2984 * Set the page policy
2987 WRITECSR(mcbase
+R_MC_CS_ATTR
,
2988 V_MC_CS0_PAGE(mc
->pagepolicy
) |
2989 V_MC_CS1_PAGE(mc
->pagepolicy
) |
2990 V_MC_CS2_PAGE(mc
->pagepolicy
) |
2991 V_MC_CS3_PAGE(mc
->pagepolicy
));
2994 * Okay, now do the following sequence:
2995 * PRE-EMRS-MRS-PRE-AR-AR-MRS. Do this for each chip select,
2996 * one at a time for each enabled chip select.
2999 for (csidx
= 0; csidx
< MC_CHIPSELS
; csidx
++) {
3000 if (mc
->csdata
[csidx
].flags
& CS_PRESENT
) {
3004 if (mc
->flags
& MCFLG_BIGMEM
) {
3005 sb1250_jedec_initcmds(mcidx
,mc
,csidx
,0,tdata
);
3006 sb1250_jedec_initcmds(mcidx
,mc
,csidx
,1,tdata
);
3007 sb1250_jedec_initcmds(mcidx
,mc
,csidx
,2,tdata
);
3008 sb1250_jedec_initcmds(mcidx
,mc
,csidx
,3,tdata
);
3010 * If in "big memory mode" turn on the "external decode"
3011 * switch here. We never turn it off.
3014 if (mc
->flags
& MCFLG_BIGMEM
) {
3016 port
= PHYS_TO_K1(A_MC_REGISTER(mcidx
,R_MC_DRAMMODE
));
3017 WRITECSR(port
,M_MC_EXTERNALDECODE
);
3021 sb1250_jedec_initcmds(mcidx
,mc
,csidx
,0,tdata
);
3025 sb1250_sgram_initcmds(mcidx
,mc
,csidx
,tdata
);
3028 sb1250_fcram_initcmds(mcidx
,mc
,csidx
,tdata
);
3031 #ifdef _MCSTANDALONE_NOISY_
3032 printf("DRAM: Channel DRAM type declared as DRAM_TYPE_SPD, but no SPD DRAM type found.\n");
3041 * Kill the BERR_DISABLE bit for this controller
3044 reg
= READCSR(mcbase
+R_MC_CONFIG
);
3045 reg
&= ~M_MC_BERR_DISABLE
;
3046 WRITECSR(mcbase
+R_MC_CONFIG
,reg
);
3049 #if !defined(_MCSTANDALONE_)
3051 * Zero the contents of memory to set the ECC bits correctly.
3052 * Do it for all memory if either channel is enabled for ECC.
3055 for (mcidx
= d
->firstchan
; mcidx
< MC_CHANNELS
; mcidx
++) {
3056 if (!(d
->inuse
& (1 << mcidx
))) continue;
3057 if (d
->mc
[mcidx
].flags
& MCFLG_ECC_ENABLE
) {
3058 sb1250_dram_zero(d
);
3065 * Turn on the ECC in the memory controller for those channels
3066 * that we've specified.
3069 for (mcidx
= d
->firstchan
; mcidx
< MC_CHANNELS
; mcidx
++) {
3070 if (!(d
->inuse
& (1 << mcidx
))) continue;
3071 if (!(d
->mc
[mcidx
].flags
& MCFLG_ECC_ENABLE
)) continue; /* ecc not enabled */
3072 mcbase
= PHYS_TO_K1(A_MC_BASE(mcidx
));
3073 reg
= READCSR(mcbase
+R_MC_CONFIG
);
3074 reg
&= ~M_MC_ECC_DISABLE
;
3075 WRITECSR(mcbase
+R_MC_CONFIG
,reg
);
3079 * Return the total amount of memory initialized, in megabytes
3082 #ifdef _MCSTANDALONE_NOISY_
3083 printf("DRAM: Total memory: %dMB.\n",(unsigned int)(d
->ttlbytes
>> 20));
3086 return (d
->ttlbytes
>> 20);
3090 /* *********************************************************************
3091 * XXSB1250_DRAMINIT()
3093 * This is a hideous hack. To help keep things all in one module,
3094 * and to aid in relocation (remember, it's tough to do a
3095 * PC-relative branch to an external symbol), here is an
3096 * assembly stub to get things ready to call the above C routine.
3097 * We turn off the bus errors on both memory controllers, set up
3098 * a small stack, and branch to the C routine to handle the rest.
3101 * register a0 - user initialization table
3104 * register v0 - size of memory, in bytes
3105 ********************************************************************* */
3107 #if !defined(_MCSTANDALONE_)
3108 static void __attribute__ ((unused
)) xxsb1250_draminit(const draminittab_t
*init
)
3110 __asm(" .globl sb1250_dram_init ; "
3111 "sb1250_dram_init: ; "
3112 " dli $10,0x30158A00C9800000 ; " /* Set the BERR_DISABLE bits */
3113 " lui $8,0xb005 ; " /* and ECC_DISABLE bits */
3114 " sd $10,0x1100($8) ; " /* do MC 0 */
3115 " sd $10,0x2100($8) ; " /* do MC 1 */
3117 " li $29,0x9FFFFFF0 ; " /* Set up a stack pointer */
3118 " li $5,0x9FFFFC00 ; " /* Pass pointer to data area */
3120 " li $29,0x80000400 ; " /* Set up a stack pointer */
3121 " li $5,0x80000000 ; " /* Pass pointer to data area */
3123 " b sb1250_dram_init_real ; "); /* Branch to real init routine */
3127 #else /* _MCSTANDALONE_ */
3130 * SOCVIEW and non-CFE, non-MIPS things don't need any magic since they
3131 * are not running on the 1250. Just call the main routine.
3133 uint64_t sb1250_dram_init(const draminittab_t
*init
,initdata_t
*d
)
3135 initdata_t initdata
;
3136 return sb1250_dram_init_real(init
,&initdata
);
3141 /* *********************************************************************
3142 * End (yes, 3000 lines of memory controller init code. Sheesh!)
3143 ********************************************************************* */