• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7800-V1.0.2.28/target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/ddr2/
1/*******************************************************************************
2Copyright (C) Marvell International Ltd. and its affiliates
3
4This software file (the "File") is owned and distributed by Marvell
5International Ltd. and/or its affiliates ("Marvell") under the following
6alternative licensing terms.  Once you have made an election to distribute the
7File under one of the following license alternatives, please (i) delete this
8introductory statement regarding license alternatives, (ii) delete the two
9license alternatives that you have not elected to use and (iii) preserve the
10Marvell copyright notice above.
11
12********************************************************************************
13Marvell Commercial License Option
14
15If you received this File from Marvell and you have entered into a commercial
16license agreement (a "Commercial License") with Marvell, the File is licensed
17to you under the terms of the applicable Commercial License.
18
19********************************************************************************
20Marvell GPL License Option
21
22If you received this File from Marvell, you may opt to use, redistribute and/or
23modify this File in accordance with the terms and conditions of the General
24Public License Version 2, June 1991 (the "GPL License"), a copy of which is
25available along with the File in the license.txt file or by writing to the Free
26Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
27on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
28
29THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
30WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
31DISCLAIMED.  The GPL License provides additional details about this warranty
32disclaimer.
33********************************************************************************
34Marvell BSD License Option
35
36If you received this File from Marvell, you may opt to use, redistribute and/or
37modify this File under the following licensing terms.
38Redistribution and use in source and binary forms, with or without modification,
39are permitted provided that the following conditions are met:
40
41    *   Redistributions of source code must retain the above copyright notice,
42	    this list of conditions and the following disclaimer.
43
44    *   Redistributions in binary form must reproduce the above copyright
45        notice, this list of conditions and the following disclaimer in the
46        documentation and/or other materials provided with the distribution.
47
48    *   Neither the name of Marvell nor the names of its contributors may be
49        used to endorse or promote products derived from this software without
50        specific prior written permission.
51
52THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
53ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
54WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
55DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
56ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
57(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
58LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
59ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
61SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62
63*******************************************************************************/
64
65/*******************************************************************************
66* mvDramIfBasicAsm.s
67*
68* DESCRIPTION:
69*       Memory full detection and best timing configuration is done in
70*       C code. C runtime environment requires a stack. This module API
71*       initialize DRAM interface chip select 0 for basic functionality for
72*       the use of stack.
73*       The module API assumes DRAM information is stored in I2C EEPROM reside
74*       in a given I2C address MV_BOARD_DIMM0_I2C_ADDR. The I2C EEPROM
75*       internal data structure is assumed to be orgenzied in common DRAM
76*       vendor SPD structure.
77*       NOTE: DFCDL values are assumed to be already initialized prior to
78*       this module API activity.
79*
80*
81* DEPENDENCIES:
82*       None.
83*
84*******************************************************************************/
85
86/* includes */
87#define	_ASMLANGUAGE
88#define MV_ASMLANGUAGE
89#include "mvOsAsm.h"
90#include "mvSysHwConfig.h"
91#include "mvDramIfRegs.h"
92#include "mvDramIfConfig.h"
93#include "ctrlEnv/sys/mvCpuIfRegs.h"
94#include "pex/mvPexRegs.h"
95#include "ctrlEnv/mvCtrlEnvSpec.h"
96#include "mvCommon.h"
97
98/* defines  */
99
100/* locals   */
101.data
102.globl _mvDramIfConfig
103.text
104.globl _mvDramIfMemInit
105
106/*******************************************************************************
107* _mvDramIfConfig - Basic DRAM interface initialization.
108*
109* DESCRIPTION:
110*       The function will initialize the following DRAM parameters using the
111*       values prepared by mvDramIfDetect routine. Values are located
112*       in predefined registers.
113*
114* INPUT:
115*       None.
116*
117* OUTPUT:
118*       None.
119*
120* RETURN:
121*       None.
122*
123*******************************************************************************/
124
125_mvDramIfConfig:
126
127        /* Save register on stack */
128	cmp	sp, #0
129	beq	no_stack_s
130save_on_stack:
131        stmdb	sp!, {r1, r2, r3, r4}
132no_stack_s:
133
134	/* Dunit FTDLL Configuration Register */
135	/* 0) Write to SDRAM FTDLL coniguration register */
136        ldr     r4, = SDRAM_FTDLL_REG_DEFAULT_LEFT;
137        ldr     r1, =(INTER_REGS_BASE + SDRAM_FTDLL_CONFIG_LEFT_REG)
138        str     r4, [r1]
139        ldr     r4, = SDRAM_FTDLL_REG_DEFAULT_RIGHT;
140        ldr     r1, =(INTER_REGS_BASE + SDRAM_FTDLL_CONFIG_RIGHT_REG)
141        str     r4, [r1]
142        ldr     r4, = SDRAM_FTDLL_REG_DEFAULT_UP;
143        ldr     r1, =(INTER_REGS_BASE + SDRAM_FTDLL_CONFIG_UP_REG)
144        str     r4, [r1]
145
146	/* 1) Write to SDRAM coniguration register */
147        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG1)
148        ldr     r4, [r1]
149        ldr     r1, =(INTER_REGS_BASE + SDRAM_CONFIG_REG)
150        str     r4, [r1]
151
152	/* 2) Write Dunit control low register */
153        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG3)
154        ldr     r4, [r1]
155        ldr     r1, =(INTER_REGS_BASE + SDRAM_DUNIT_CTRL_REG)
156        str     r4, [r1]
157
158	/* 2) Write Dunit control high register */
159        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG13)
160        ldr     r4, [r1]
161        ldr     r1, =(INTER_REGS_BASE + SDRAM_DUNIT_CTRL_HI_REG)
162        str     r4, [r1]
163
164        /* 3) Write SDRAM address control register */
165        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG4)
166        ldr     r4, [r1]
167        ldr     r1, =(INTER_REGS_BASE + SDRAM_ADDR_CTRL_REG)
168        str     r4, [r1]
169#if defined(MV_STATIC_DRAM_ON_BOARD)
170        /* 4) Write SDRAM bank 0 size register */
171        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG0)
172        ldr     r4, [r1]
173        ldr     r1, =(INTER_REGS_BASE + SDRAM_SIZE_REG(0,0))
174        str     r4, [r1]
175#endif
176
177        /* 5) Write SDRAM open pages control register */
178        ldr     r1, =(INTER_REGS_BASE + SDRAM_OPEN_PAGE_CTRL_REG)
179        ldr     r4, =SDRAM_OPEN_PAGES_CTRL_REG_DV
180        str     r4, [r1]
181
182        /* 6) Write SDRAM timing Low register */
183        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG5)
184        ldr     r4, [r1]
185        ldr     r1, =(INTER_REGS_BASE + SDRAM_TIMING_CTRL_LOW_REG)
186        str     r4, [r1]
187
188        /* 7) Write SDRAM timing High register */
189        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG6)
190        ldr     r4, [r1]
191        ldr     r1, =(INTER_REGS_BASE + SDRAM_TIMING_CTRL_HIGH_REG)
192        str     r4, [r1]
193
194        /* Config DDR2 On Die Termination (ODT) registers */
195        /* Write SDRAM DDR2 ODT control low register */
196        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG7)
197        ldr     r4, [r1]
198        ldr     r1, =(INTER_REGS_BASE + DDR2_SDRAM_ODT_CTRL_LOW_REG)
199        str     r4, [r1]
200
201        /* Write SDRAM DDR2 ODT control high register */
202        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG8)
203        ldr     r4, [r1]
204        ldr     r1, =(INTER_REGS_BASE + DDR2_SDRAM_ODT_CTRL_HIGH_REG)
205        str     r4, [r1]
206
207        /* Write SDRAM DDR2 Dunit ODT control register */
208        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG9)
209        ldr     r4, [r1]
210        ldr     r1, =(INTER_REGS_BASE + DDR2_DUNIT_ODT_CONTROL_REG)
211        str     r4, [r1]
212
213        /* Write DDR2 SDRAM timing Low register */
214        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG11)
215        ldr     r4, [r1]
216        ldr     r1, =(INTER_REGS_BASE + SDRAM_DDR2_TIMING_LO_REG)
217        str     r4, [r1]
218
219        /* Write DDR2 SDRAM timing High register */
220        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG12)
221        ldr     r4, [r1]
222        ldr     r1, =(INTER_REGS_BASE + SDRAM_DDR2_TIMING_HI_REG)
223        str     r4, [r1]
224
225        /* 8) Write SDRAM mode register */
226        /* The CPU must not attempt to change the SDRAM Mode register setting */
227        /* prior to DRAM controller completion of the DRAM initialization     */
228        /* sequence. To guarantee this restriction, it is recommended that    */
229        /* the CPU sets the SDRAM Operation register to NOP command, performs */
230        /* read polling until the register is back in Normal operation value, */
231        /* and then sets SDRAM Mode register to its new value.               */
232
233	/* 8.1 write 'nop' to SDRAM operation */
234        mov     r4, #0x5                 /* 'NOP' command              */
235        MV_REG_WRITE_ASM(r4, r1, SDRAM_OPERATION_REG)
236
237        /* 8.2 poll SDRAM operation. Make sure its back to normal operation   */
238_sdramOpPoll1:
239        ldr     r4, [r1]
240        cmp     r4, #0                          /* '0' = Normal SDRAM Mode    */
241        bne     _sdramOpPoll1
242
243        /* 8.3 Now its safe to write new value to SDRAM Mode register         */
244        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG2)
245        ldr     r4, [r1]
246        ldr     r1, =(INTER_REGS_BASE + SDRAM_MODE_REG)
247        str     r4, [r1]
248
249        /* 8.4 Make the Dunit write the DRAM its new mode                     */
250        mov     r4, #0x3                 /* Mode Register Set command  */
251        MV_REG_WRITE_ASM (r4, r1, SDRAM_OPERATION_REG)
252
253        /* 8.5 poll SDRAM operation. Make sure its back to normal operation   */
254_sdramOpPoll2:
255        ldr     r4, [r1]
256        cmp     r4, #0                          /* '0' = Normal SDRAM Mode    */
257        bne     _sdramOpPoll2
258
259        /* Now its safe to write new value to SDRAM Extended Mode regist */
260        ldr     r1, =(INTER_REGS_BASE + DRAM_BUF_REG10)
261        ldr     r4, [r1]
262        ldr     r1, =(INTER_REGS_BASE + SDRAM_EXTENDED_MODE_REG)
263        str     r4, [r1]
264
265        /* 9) Write SDRAM Extended mode register This operation should be     */
266        /*    done for each memory bank                                       */
267        /* write 'nop' to SDRAM operation */
268        mov     r4, #0x5                 /* 'NOP' command              */
269        MV_REG_WRITE_ASM (r4, r1, SDRAM_OPERATION_REG)
270
271        /* poll SDRAM operation. Make sure its back to normal operation   */
272_sdramOpPoll3:
273        ldr     r4, [r1]
274        cmp     r4, #0                          /* '0' = Normal SDRAM Mode    */
275        bne     _sdramOpPoll3
276        /* Go over each of the Banks */
277        ldr     r3, =0          /* r3 = DRAM bank Num */
278
279extModeLoop:
280        /* Set the SDRAM Operation Control to each of the DRAM banks          */
281        mov     r4, r3   /* Do not swap the bank counter value */
282        MV_REG_WRITE_ASM (r4, r1, SDRAM_OPERATION_CTRL_REG)
283
284        /* Make the Dunit write the DRAM its new mode                     */
285        mov     r4, #0x4        /* Extended Mode Register Set command  */
286        MV_REG_WRITE_ASM (r4, r1, SDRAM_OPERATION_REG)
287
288        /* poll SDRAM operation. Make sure its back to normal operation   */
289_sdramOpPoll4:
290        ldr     r4, [r1]
291        cmp     r4, #0                          /* '0' = Normal SDRAM Mode    */
292        bne     _sdramOpPoll4
293
294        add     r3, r3, #1
295        cmp     r3, #4         /* 4 = Number of banks */
296        bne     extModeLoop
297
298extModeEnd:
299cmp	sp, #0
300	beq	no_stack_l
301	mov     r1, LR                        	/* Save link register */
302#if defined(MV78XX0)
303	bl   	_mvDramIfMemInit
304#endif
305	mov	LR,r1				/* restore link register */
306load_from_stack:
307	/* Restore registers */
308        ldmia	sp!, {r1, r2, r3, r4}
309no_stack_l:
310
311        mov     pc, lr
312
313
314/*******************************************************************************
315* _mvDramIfEccMemInit - Basic DRAM ECC initialization.
316*
317* DESCRIPTION:
318*
319* INPUT:
320*       None.
321*
322* OUTPUT:
323*       None.
324*
325* RETURN:
326*       None.
327*
328*******************************************************************************/
329#define XOR_CHAN0         0   /* XOR channel 0 used for memory initialization */
330#define XOR_UNIT0         0   /* XOR unit 0 used for memory initialization */
331#define XOR_ADDR_DEC_WIN0 0   /* Enable DRAM access using XOR decode window 0 */
332/* XOR engine register offsets macros */
333#define XOR_CONFIG_REG(chan)                (XOR_UNIT_BASE(0) + 0x10 + ((chan)    * 4))
334#define XOR_ACTIVATION_REG(chan)            (XOR_UNIT_BASE(0) + 0x20 + ((chan)    * 4))
335#define XOR_CAUSE_REG			            (XOR_UNIT_BASE(0) + 0x30)
336#define XOR_ERROR_CAUSE_REG                 (XOR_UNIT_BASE(0) + 0x50)
337#define XOR_ERROR_ADDR_REG                  (XOR_UNIT_BASE(0) + 0x60)
338#define XOR_INIT_VAL_LOW_REG                (XOR_UNIT_BASE(0) + 0x2E0)
339#define XOR_INIT_VAL_HIGH_REG               (XOR_UNIT_BASE(0) + 0x2E4)
340#define XOR_DST_PTR_REG(chan)               (XOR_UNIT_BASE(0) + 0x2B0 + ((chan)    * 4))
341#define XOR_BLOCK_SIZE_REG(chan)            (XOR_UNIT_BASE(0) + 0x2C0 + ((chan)    * 4))
342
343/* XOR Engine Address Decoding Register Map */
344#define XOR_WINDOW_CTRL_REG(unit,chan)     (XOR_UNIT_BASE(unit)+(0x240 + ((chan) * 4)))
345#define XOR_BASE_ADDR_REG(unit,winNum)     (XOR_UNIT_BASE(unit)+(0x250 + ((winNum) * 4)))
346#define XOR_SIZE_MASK_REG(unit,winNum)     (XOR_UNIT_BASE(unit)+(0x270 + ((winNum) * 4)))
347
348.globl _mvDramIfEccMemInit
349/*******************************************************************************
350* _mvDramIfEccMemInit  - mem init for dram cs
351*
352* DESCRIPTION:
353*       This function will clean the cs by ussing the XOR mem init.
354*
355* INPUT:
356*       r0 - dram bank number.
357*
358* OUTPUT:
359*	none
360*/
361_mvDramIfEccMemInit:
362
363        /* Save register on stack */
364	cmp	sp, #0
365	beq	no_stack_s1
366save_on_stack1:
367        stmdb	sp!, {r0,r1, r2, r3, r4, r5, r6}
368no_stack_s1:
369
370	ldr	r1, = 0
371
372        /* Disable all XOR address decode windows to avoid possible overlap */
373        MV_REG_WRITE_ASM (r1, r5, (XOR_WINDOW_CTRL_REG(XOR_UNIT0,XOR_CHAN0)))
374
375        /* Init r5 to first XOR_SIZE_MASK_REG */
376		mov		r5, r0, LSL #3
377        add     r5, r5,#0x1500
378        add     r5, r5,#0x04
379        add     r5, r5,#(INTER_REGS_BASE)
380        ldr     r6, [r5]
381        HTOLL(r6,r5)
382        MV_REG_WRITE_ASM (r6, r5, XOR_SIZE_MASK_REG(XOR_UNIT0,XOR_ADDR_DEC_WIN0))
383
384	mov		r5, r0, LSL #3
385        add     r5, r5,#0x1500
386        add     r5, r5,#(INTER_REGS_BASE)
387        ldr     r6, [r5]
388        /* Update destination & size */
389        MV_REG_WRITE_ASM(r6, r5, XOR_DST_PTR_REG(XOR_CHAN0))
390        HTOLL(r6,r5)
391        /* Init r6 to first XOR_BASE_ADDR_REG */
392	ldr	r4, = 0xf
393	ldr	r5, = 0x1
394	mov	r5, r5, LSL r0
395	bic	r4, r4, r5
396	mov 	r4, r4, LSL #8
397
398        orr	r6, r6, r4
399        MV_REG_WRITE_ASM (r6, r5, XOR_BASE_ADDR_REG(XOR_UNIT0,XOR_ADDR_DEC_WIN0))
400
401	ldr	r6, = 0xff0001
402        MV_REG_WRITE_ASM (r6, r5, XOR_WINDOW_CTRL_REG(XOR_UNIT0,XOR_CHAN0))
403
404        /* Configure XOR engine for memory init function.           */
405        MV_REG_READ_ASM (r6, r5, XOR_CONFIG_REG(XOR_CHAN0))
406        and	r6, r6, #~0x7        	/* Clear operation mode field      */
407        orr     r6, r6, #0x4             /* Set operation to memory init    */
408        MV_REG_WRITE_ASM(r6, r5, XOR_CONFIG_REG(XOR_CHAN0))
409
410        /* Set initVal in the XOR Engine Initial Value Registers       */
411	ldr	r6, = 0xfeedfeed
412        MV_REG_WRITE_ASM(r6, r5, XOR_INIT_VAL_LOW_REG)
413	ldr	r6, = 0xfeedfeed
414        MV_REG_WRITE_ASM(r6, r5, XOR_INIT_VAL_HIGH_REG)
415
416        /* Set block size using DRAM bank size  */
417
418	mov	r5, r0, LSL #3
419        add     r5, r5,#0x1500
420        add     r5, r5,#0x04
421        add     r5, r5,#(INTER_REGS_BASE)
422
423        ldr     r6, [r5]
424        HTOLL(r6,r5)
425	and	r6, r6, #SCSR_SIZE_MASK
426	mov	r5, r6, LSR #SCSR_SIZE_OFFS
427        add	r5, r5, #1
428	mov	r6, r5, LSL #SCSR_SIZE_OFFS
429        MV_REG_WRITE_ASM(r6, r5, XOR_BLOCK_SIZE_REG(XOR_CHAN0))
430
431        /* Clean interrupt cause*/
432        MV_REG_WRITE_ASM(r1, r5, XOR_CAUSE_REG)
433
434        /* Clean error interrupt cause*/
435        MV_REG_READ_ASM(r6, r5, XOR_ERROR_CAUSE_REG)
436        MV_REG_READ_ASM(r6, r5, XOR_ERROR_ADDR_REG)
437
438        /* Start transfer */
439        MV_REG_READ_ASM (r6, r5, XOR_ACTIVATION_REG(XOR_CHAN0))
440        orr     r6, r6, #0x1 /* Preform start command      */
441        MV_REG_WRITE_ASM(r6, r5, XOR_ACTIVATION_REG(XOR_CHAN0))
442
443        /* Wait for engine to finish */
444waitForComplete:
445        MV_REG_READ_ASM(r6, r5, XOR_CAUSE_REG)
446        and   	r6, r6, #2
447	cmp	r6, #0
448        beq     waitForComplete
449
450        /* Clear all error report registers */
451        MV_REG_WRITE_ASM(r1, r5, SDRAM_SINGLE_BIT_ERR_CNTR_REG)
452        MV_REG_WRITE_ASM(r1, r5, SDRAM_DOUBLE_BIT_ERR_CNTR_REG)
453
454        MV_REG_WRITE_ASM(r1, r5, SDRAM_ERROR_CAUSE_REG)
455
456	cmp	sp, #0
457	beq	no_stack_l1
458load_from_stack1:
459        ldmia	sp!, {r0, r1, r2, r3, r4, r5, r6}
460no_stack_l1:
461        mov     pc, lr
462
463
464/*******************************************************************************
465* mvDramIfMemInit - Use XOR to clear all memory.
466*
467* DESCRIPTION:
468*       Use assembler function _mvDramIfEccMemInit to fill all memory with FEADFEAD pattern.
469* INPUT:
470*       None.
471*
472* OUTPUT:
473*       None.
474*
475* RETURN:
476*       None.
477*
478*******************************************************************************/
479#if defined(MV78XX0)
480
481_mvDramIfMemInit:
482        stmdb	sp!, {r0,r1, r2, r3, r4, r5, r6}
483	mov     r6, LR                 /* Save link register */
484    	/* Check if dram bank 0 has to be init for ECC */
485	MV_REG_READ_ASM (r0, r5, SDRAM_SIZE_REG(0,0))
486	and 	r3, r0, #SCSR_WIN_EN
487        cmp     r3, #0
488	beq   	no_bank_0
489	MV_REG_READ_ASM(r0, r5,  SDRAM_BASE_ADDR_REG(0,0))
490        cmp     r0, #0
491	beq   	no_bank_0
492	mov	r0,#0
493	bl	_mvDramIfEccMemInit
494
495no_bank_0:
496    	/* Check if dram bank 1 has to be init for ECC */
497        MV_REG_READ_ASM (r0, r5, SDRAM_SIZE_REG(0,1))
498	and 	r0, r0, #SCSR_WIN_EN
499        cmp     r0, #0
500	beq   	no_bank_1
501	mov	r0,#1
502	bl	_mvDramIfEccMemInit
503no_bank_1:
504    	/* Check if dram bank 2 has to be init for ECC */
505    	MV_REG_READ_ASM (r0, r5, SDRAM_SIZE_REG(0,2))
506	and 	r0, r0, #SCSR_WIN_EN
507        cmp     r0, #0
508	beq   	no_bank_2
509	MV_REG_READ_ASM(r0, r5,  SDRAM_BASE_ADDR_REG(0,2))
510        cmp     r0, #0
511	beq   	no_bank_2
512	mov	r0,#2
513	bl	_mvDramIfEccMemInit
514
515no_bank_2:
516    	/* Check if dram bank 3 has to be init for ECC */
517	MV_REG_READ_ASM (r0, r5, SDRAM_SIZE_REG(0,3))
518	and 	r0, r0, #SCSR_WIN_EN
519	cmp     r0, #0
520	beq   	no_bank_3
521	mov	r0,#3
522	bl	_mvDramIfEccMemInit
523no_bank_3:
524	mov     LR ,r6                /* restore link register */
525	ldmia	sp!, {r0, r1, r2, r3, r4, r5, r6}
526	mov     pc, lr
527#endif
528
529