romInit.s
上传用户:yingyi0918
上传日期:2022-06-26
资源大小:214k
文件大小:17k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* romInit.s - IDT 79PMC438 ROM initialization module */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * This file has been developed or significantly modified by the
  6.  * MIPS Center of Excellence Dedicated Engineering Staff.
  7.  * This notice is as per the MIPS Center of Excellence Master Partner
  8.  * Agreement, do not remove this notice without checking first with
  9.  * WR/Platforms MIPS Center of Excellence engineering management.
  10.  */
  11. .data
  12.         .globl  copyright_wind_river
  13. /*
  14. modification history
  15. --------------------
  16. 01a,19Oct02,krao  New Code from IDT for IDT79PMC438 Board.
  17. */
  18. /*
  19. DESCRIPTION
  20. This module contains the entry code for the VxWorks bootrom.
  21. The entry point romInit, is the first code executed on power-up.
  22. The routine sysToMonitor() jumps to romInit() to perform a
  23. "warm boot".
  24. */
  25. /*includes */
  26. #define _ASMLANGUAGE
  27. #include "vxWorks.h"
  28. #include "arch/mips/ivMips.h"
  29. #include "arch/mips/asmMips.h"
  30. #include "arch/mips/esfMips.h"
  31. #include "sysLib.h"
  32. #include "config.h"
  33. /* defines */
  34. #define ROM_ISP_BASE 0xa0100000   /* ROM exception save area                */
  35.  
  36. /* externals */
  37. .extern cache4kcReset
  38.  
  39. /* locals */
  40.  
  41. /* source file includes */
  42. #include "romMipsInit.s"                          /* MIPS common startup code */
  43.  
  44. /*****************************************************************************
  45. *
  46. * sysMemInit - Initialize memory and chip selects.
  47. *
  48. * This function performs low-level memory chip select and controller
  49. * initialization. It is called by romMipsInit.s/romReboot very
  50. * early in the ROM boot sequence.
  51. *
  52. * RETURNS: N/A
  53. *
  54. * void sysMemInit (void)
  55. *
  56. */
  57. .ent sysMemInit
  58. sysMemInit:
  59. /*  Disable WatchDog Timer  */
  60.  
  61. li t1, DISABLE_TIMER
  62. li t0, WTC_CTL_REG
  63. sw t1, 0(t0)
  64. nop 
  65. li t0, ERR_CNTL_STATUS
  66. lw t1, 0(t0)
  67. li t2, ERR_CNTL_VALUE
  68. and t1, t2
  69. sw t1, 0(t0)
  70.     
  71. /* Reduce Bus Timeout Count */
  72.     
  73. li t1, TIMEOUT_COUNT
  74. li t0, BT_TIMER_COMPARE
  75. sw t1, 0(t0)
  76. /* Program The GPIO Registers */
  77. li t1, GPIO_DATA_REG
  78. sw zero, 0(t1)
  79. li t1, GPIO_INT_LVL
  80. sw  zero, 0(t1)
  81. /*Initialize CS0 - either EPROM or flash */
  82. li t0, DEV_CTL_BASE     
  83. li t1, MCR_CS0_BS       
  84. sw t1, DEV0BASE_OFF(t0)
  85. li t1, MCR_CS0_MASK
  86. sw t1, DEV0MASK_OFF(t0)
  87. li t1, MCR_CS0_CTRL
  88. sw t1, DEV0C_OFF(t0)
  89. li t1, MCR_CS0_TC
  90. sw t1, DEV0TC_OFF(t0)
  91. /*Initialize CS1 - either flash or EPROM  */
  92.  
  93.   li t0, DEV_CTL_BASE     
  94. li t1, MCR_CS1_BS       
  95. sw t1, DEV1BASE_OFF(t0)
  96. li t1, MCR_CS1_MASK
  97. sw t1, DEV1MASK_OFF(t0)
  98. li t1, MCR_CS1_CTRL
  99. sw t1, DEV1C_OFF(t0)
  100. li t1, MCR_CS1_TC
  101. sw t1, DEV1TC_OFF(t0)
  102. /* Initialize CS2 - 8 bit port */
  103. li t0, DEV_CTL_BASE     
  104. li t1, MCR_CS2_BS       
  105. sw t1, DEV2BASE_OFF(t0)
  106. li t1, MCR_CS2_MASK
  107. sw t1, DEV2MASK_OFF(t0)
  108. li t1, MCR_CS2_CTRL
  109. sw t1, DEV2C_OFF(t0)
  110. li t1, MCR_CS2_TC
  111. sw t1, DEV2TC_OFF(t0)   
  112. /* Initialize CS3 - 16 bit port */
  113. li t0, DEV_CTL_BASE     
  114. li t1, MCR_CS3_BS       
  115. sw t1, DEV3BASE_OFF(t0)
  116. li t1, MCR_CS3_MASK
  117. sw t1, DEV3MASK_OFF(t0)
  118. li t1, MCR_CS3_CTRL
  119. sw t1, DEV3C_OFF(t0)
  120. li t1, MCR_CS3_TC
  121. sw t1, DEV3TC_OFF(t0)
  122. /* GPIO Controller setting */ 
  123.  
  124. li t0, PIO_FUNCSEL_REG
  125. li t1, PIO_FUNCSEL_VAL
  126. sw t1, 0x0(t0)
  127. /* DDR Initialization starts here */
  128. li t0, DDRD_LLC_REG             /* Hidden register in RC32438    */
  129. li t1, DDRD_LLC_VAL
  130. sw t1, 0x0(t0)
  131. li     t1, 0x0              /* Add 200 microseconds of delay */
  132. li     t2, DELAY_200USEC
  133. 1:
  134. add    t1, 1
  135. bne    t1, t2, 1b
  136. nop
  137. /* Load the DDR Controller Base Address */
  138. li t0, DDR_BASE
  139. li  t1, DDRC_VAL_AT_INIT         /*load DDRC reset refresh enable */
  140. sw t1, 0x10(t0)
  141. sw  zero, 4(t0)
  142. sw zero, 0xc(t0)
  143. sw zero, 0x18(t0)
  144. /* Store DDR0BASE */
  145. li t1, DDR0_BASE_VAL
  146. sw t1, 0x0(t0)
  147. /* Store DDR0MASK */
  148. li t1, DDR0_MASK_VAL
  149. sw t1, 0x4(t0)
  150. /* Load DDR1MASK to disable CS1 */
  151. li t1, DDR1_BASE_VAL
  152. sw t1, 0x08(t0)
  153. li t1, DDR1_MASK_VAL
  154. sw t1, 0x0C(t0)
  155. /* Load DDR0AMASK to disable alternate Mapping */
  156. li t1, DDR0_BASE_VAL
  157. sw t1, 0x14(t0)
  158. li t1, DDR0_AMASK_VAL
  159. sw t1, 0x18(t0)
  160. li t1, DDR_CUST_NOP
  161. sw t1, 0x20(t0)
  162. li t2, DATA_PATTERN
  163. li t1, 0xA0000000 | DDR0_BASE_VAL
  164. sw  t2, 0x0(t1)
  165. li t1, 0x0
  166. li t2, DELAY_200USEC
  167. 1:
  168. add t1, 1
  169. bne t1, t2, 1b
  170. nop
  171. /* Register t0 carries pointer to the DDR_BASE: 0xB8018000 */
  172. li t1, DDR_CUST_PRECHARGE
  173. sw t1, 0x20(t0)      /* Write to DDR Custom transaction register */
  174.  
  175. /* Generate A10 high to pre-charge both the banks */
  176. li t2, DATA_PATTERN
  177. li t1, 0xA0001000 | DDR0_BASE_VAL
  178. sw t2, 0x0(t1)
  179. /* Register t0 carries pointer to the DDR_BASE: 0xB8018000 */
  180. li t1, DDR_LD_EMODE_REG
  181. sw t1, 0x20(t0)      /* Write to DDR Custom transaction register */
  182.  
  183. /* Generate EMODE register contents on A12-A0 */
  184. li t2, DATA_PATTERN
  185. li t1, 0xA0000000 | DDR_EMODE_VAL | DDR0_BASE_VAL
  186. sw t2, 0x0(t1)
  187.  
  188. /* Register t0 carries pointer to the DDR_BASE: 0xB8018000 */
  189. li t1, DDR_LD_MODE_REG
  190. sw t1, 0x20 (t0)     /* Write to DDR Custom transaction register */
  191. /* Generate Mode register contents on the address bus A12-A0  */
  192. li t2, DATA_PATTERN
  193. li t1, 0xA0000000 | DDR_DLL_RES_MODE_VAL | DDR0_BASE_VAL
  194. sw t2, 0x0(t1)
  195. /* Delay of  1.6 microseconds ~ 300 delay iteration value */
  196. li t1, 0x0
  197. li t2, 500
  198. 1:
  199. add t1, 1
  200. bne t1, t2, 1b
  201. nop
  202. /* Register t0 carries pointer to the DDR_BASE: 0xB8018000 */
  203. li t1, DDR_CUST_PRECHARGE
  204. sw t1, 0x20(t0)      /* Write to DDR Custom transaction register */
  205.  
  206. /* Generate A10 high to pre-charge both the banks */
  207. li t2, DATA_PATTERN
  208. li t1, 0xA0001000 | DDR0_BASE_VAL
  209. sw t2, 0x0(t1)
  210. /* Implements 9 cycles of Auto refresh allowing sufficient margin for
  211.  * stability
  212.  */
  213.  
  214. li t4, 9
  215. li t3, 0
  216. 1:
  217. li t1, DDR_CUST_REFRESH
  218. sw t1, 0x20(t0)      /* Write to DDR Custom transaction register */
  219. /* Read it back to flush CPU write buffers */
  220. lw    t1, 0x20(t0)  
  221. /* Perform a write to DDR space to register the command  */
  222. li t2, DATA_PATTERN
  223. li t1, 0xA0000000 | DDR0_BASE_VAL
  224. sw t2, 0x0(t1)
  225. add t3, 1
  226. bne t3, t4, 1b
  227. nop
  228. /* Register t0 carries pointer to the DDR_BASE: 0xB8018000 */
  229. li t1, DDR_LD_MODE_REG
  230. sw t1, 0x20(t0)      /* Write to DDR Custom transaction register */
  231.  
  232. /* Generate Mode Register contents on the address bus A12-A0 */
  233. li t2, DATA_PATTERN
  234. li t1, 0xA0000000 | DDR_DLL_MODE_VAL | DDR0_BASE_VAL
  235. sw t2, 0x0(t1)
  236. /* Post DDR SDRAM initialization code :
  237.  * Initialize the refresh timer with fast refresh count 
  238.  */
  239.  
  240. li t0, RCOUNT  
  241. li t1, DDR_REF_CMP_FAST
  242. /* Set the RCOMPARE register */
  243. sw t1, 0x4(t0)
  244.  
  245. /* Enable the Refresh timer */
  246. li t1, 0x1             /* CE set to enabled the  Refresh counter */
  247. sw t1, 0x08(t0)
  248.       /* Enable RE-refresh enable in the DDRC register */
  249. li t0, DDR_BASE
  250. li t1, DDRC_VAL_NORMAL
  251. sw t1, 0x10(t0)
  252.  
  253. /* Add 200 microseconds of delay */
  254. li t1, 0x0
  255. li t2, DELAY_200USEC
  256. 1:
  257. add t1, 1
  258. bne t1, t2, 1b
  259. nop
  260.  
  261.   /* Disable the refresh counter before changing the compare value */
  262.  
  263.   li t0, RCOUNT 
  264. li t1, 0x0
  265. sw t1, 0x08(t0)
  266. /* Set the RCOMPARE register */
  267.       
  268. li t1, DDR_REF_CMP_VAL
  269. sw t1, 0x4(t0)
  270. /* Enable the Refresh timer */
  271. li t1, 0x1             /* CE set to enabled the  Refresh counter */
  272. sw t1, 0x08(t0)
  273. /* Add 200 microseconds of delay */
  274. li t1, 0x0
  275. li t2, DELAY_200USEC
  276. 1:
  277. add t1, 1
  278. bne t1, t2, 1b
  279. nop
  280. nop
  281. /* This completes the DDR controller and the DDR SDRAM initialization 
  282.  * and the DDR memory is ready for use.
  283.  */
  284. /* Disable the write transaction merging in IPBus arbiter control reg */
  285.    
  286. li t0, IPAC
  287. li t1, IPAC_VALUE
  288. sw t1, 0x0(t0)
  289. nop
  290. nop   
  291. j ra                  /* just in case                           */
  292. nop
  293. .end sysMemInit
  294. /*****************************************************************************
  295. *
  296. * sysCacheInit - Initialize RC32438 cache
  297. *
  298. * This function performs low-level cache initialization. It is called by
  299. * romMipsInit.s/romReboot very early in the ROM boot sequence.
  300. *
  301. * RETURNS: N/A
  302. *
  303. * void sysCacheInit (void)
  304. *
  305. */
  306. .ent sysCacheInit
  307. sysCacheInit:
  308.  
  309. move s7, ra          /* Save return address */
  310.  
  311. #if defined AUTO_CACHE_DETECT
  312. detect:
  313. /* the 4kc  processors carry enough information in the
  314.    CONFIG1 register to identify the cache size and line size of the
  315.    data and instruction caches. since this information may change
  316.    from one variant to another, the only safe way to know how to 
  317.    specify the cache sizes is to read the CONFIG1 fields and act 
  318.    accordingly. 
  319.   
  320.    The instruction cache information is:
  321. line size  = IL
  322. cache size = IS * IL * IA
  323.    Similarly, the data cache information is:
  324. line size  = DL
  325. cache size = DS * DL * DA
  326.    The following processing is performed on the fields coming from
  327.    CONFIG1 to translate the bit patterns into the correct values:
  328.    IS, DS: (number of cache lines)
  329. 64 shifted left by n, where 'n' is the value from the
  330. IS or DS field in CONFIG1. Technically, if 'n' is 7, the
  331. value is invalid (reserved), but since this should not happen,
  332. we don't test for it. The result implements the following table:
  333. n value
  334. 0 64
  335. 1 128
  336. 2 256
  337. 3 512
  338. 4 1024
  339. 5 2048
  340. 6 4096
  341. 7 8192 (invalid)
  342.     IL, DL (number of bytes per cache line)
  343. 2 shifted left by n, where 'n' is the value from the
  344. IL or DL field in CONFIG1. If the result is '2', the value
  345. is set to 0, because if IL or DL is 0, there is no cache.
  346. also, there is an invalid value calculated if 'n' is 7, since
  347. that value is reserved. But since it should not happen, we don't
  348. test for it. The result implements the following table:
  349. n value
  350. 0 0 (after adjustment)
  351. 1 4
  352. 2 8
  353. 3 16
  354. 4 32
  355. 5 64
  356. 6 128
  357. 7 256 (invalid)
  358.     IA, DA (number of cache ways)
  359. n + 1, where 'n' is the value from the IA or DA field of the
  360. CONFIG1 register. This implements the following table:
  361. n value
  362. 0 1 (direct mapped)
  363. 1 2
  364. 2 3
  365. 3 4
  366. 4 5
  367. 5 6
  368. 6 7
  369. 7 8
  370. */ 
  371. /* read the config1 register to determine the cache parameters */
  372. /* N.B.: the mfc0 instruction to access config1 is not supported by
  373.    the assembler, so we have to synthesize it. */
  374. .word 0x40028001
  375. /* calculate instruction cache parameters */
  376. lui v1, (IDT32438_CONFIG1_IS_MSK >> 16)
  377. and v1, v1,v0
  378. srl v1, v1,IDT32438_CONFIG1_IS_SHF
  379. li t0, 64
  380. sll t0, v1                      /* number of cache lines */
  381. lui v1, (IDT32438_CONFIG1_IA_MSK >> 16)
  382. and v1, v1, v0
  383. srl v1, v1, IDT32438_CONFIG1_IA_SHF
  384. add t1, v1, 1                      /* number of cache ways  */
  385. mul t0, t0, t1                      /* t0 = IS * IA          */
  386. lui v1, (IDT32438_CONFIG1_IL_MSK >> 16)
  387. and v1, v1, v0
  388. srl v1, v1, IDT32438_CONFIG1_IL_SHF
  389. li t1, 2
  390. sll t1, t1, v1                       /* t1 = IL              */
  391. bnez t1, 1f
  392. li t1, 0
  393. 1:
  394. mul t0, t0, t1                       /* t0 = IS * IA * IL    */
  395. /* calculate data cache parameters */
  396. andi v1, v0, IDT32438_CONFIG1_DS_MSK
  397. srl v1, v1, IDT32438_CONFIG1_DS_SHF
  398. li t2, 64
  399. sll t2, v1                       /* number of cache line */
  400. andi v1, v0, IDT32438_CONFIG1_DA_MSK
  401. srl v1, v1, IDT32438_CONFIG1_DA_SHF
  402. add t3, v1, 1                       /* number of cache ways */
  403. mul t2, t2, t3                       /* t2 = DS * DA         */
  404. andi v1, v0, IDT32438_CONFIG1_DL_MSK
  405. srl v1, v1, IDT32438_CONFIG1_DL_SHF
  406. li t3, 2
  407. sll t3, t3, v1                       /* t3 = DL              */
  408. bnez t3, 1f
  409. li t3, 0
  410. 1:
  411. mul t2, t2, t3                       /* t2 = DS * DA * DL    */
  412. /* t0..t3 are now loaded with cache parameters */
  413. #else
  414. li t0, ICACHE_SIZE               /* I-cache size         */
  415. li t1, ICACHE_LINE_SIZE               /* I-cache line size    */
  416. li t2, DCACHE_SIZE               /* D-cache size         */
  417. li t3, DCACHE_LINE_SIZE               /* D-cache line size    */
  418. #endif
  419.  
  420.         move a0, s0                       /* start type           */
  421. RELOC(v0,cache4kcReset)
  422. andi a0, s0, BOOT_CLEAR
  423.  
  424. jal v0
  425. nop
  426.         move    ra, s7
  427.  
  428.   j       ra
  429.  
  430. .end sysCacheInit
  431. /*****************************************************************************
  432. *
  433. * romClearEdac - clear error detection and correction logic
  434. *
  435. * This routine clears the memory and error detection logic by
  436. * doing word writes to each DRAM location.  It sizes memory by
  437. * probing memory locations. It is called by romMipsInit.s/romReboot 
  438. * very early in the ROM boot sequence.
  439. *
  440. * RETURNS: N/A
  441. *
  442. * void romClearEdac (void)
  443. *
  444. */
  445. .ent romClearEdac
  446. romClearEdac:
  447. mfc0 v1, C0_SR                    /* disable parity errors   */
  448. or v0, v1, SR_DE
  449. mtc0 v0, C0_SR
  450. HAZARD_CP_WRITE
  451. move  v0, ra                    /* save return address     */
  452.         RELOC(t0,1f)                               /* run the loop from cache */
  453.         and     t0, 0x1fffffff
  454.         or      t0, K0BASE
  455.         j       t0
  456. 1:
  457. li     a0, (LOCAL_MEM_SIZE | K1BASE )
  458.         
  459. clearloop:
  460. sw zero, -4(a0)
  461. sw zero, -8(a0)
  462. sw zero, -12(a0)
  463. sw zero, -16(a0)
  464. sw zero, -20(a0)
  465. sw zero, -24(a0)
  466. sw zero, -28(a0)
  467. sw zero, -32(a0)
  468. subu a0, 32
  469. bne a0, K1BASE, clearloop 
  470.         nop
  471. done:
  472. mtc0 v1, C0_SR
  473. HAZARD_CP_WRITE
  474. j v0
  475. .end romClearEdac 
  476. /*****************************************************************************
  477. * romExcHandle - ROM based exception/interrupt handler
  478. *
  479. * This routine is invoked on an exception or interrupt while
  480. * the status register is using the bootstrap exception vectors.
  481. * It saves a state frame to a known uncached location and displays a
  482. * summary of the error on the board's alphanumeric LED display.
  483. *
  484. * THIS ROUTIINE IS NOT CALLABLE FROM "C"
  485. *
  486. * RETURNS: N/A
  487. *
  488. * void romExcHandle (void)
  489. */
  490. .ent romExcHandle
  491. romExcHandle:
  492.  
  493. .set noat
  494. li sp, ROM_ISP_BASE          /* sp to known uncached location    */
  495. SW sp, E_STK_SP-ESTKSIZE(sp) /* save sp in new intstk frame      */
  496. subu sp, ESTKSIZE              /* make new exc stk frame           */
  497. SW k0, E_STK_K0(sp)          /* save k0, (exception type)        */
  498. SW AT, E_STK_AT(sp)          /* save asmbler resvd reg           */
  499. .set at
  500. SW v0, E_STK_V0(sp)          /* save func return 0, used         */
  501.                                           /* To hold masked cause             */
  502. mfc0 k1, C0_BADVADDR           /* read bad VA reg                  */
  503. sw k1, E_STK_BADVADDR(sp)    /* save bad VA on stack             */
  504. mfc0 k1, C0_EPC                /* read exception pc                */
  505. sw k1, E_STK_EPC(sp)         /* save EPC on stack                */
  506. mfc0 v0, C0_CAUSE              /* read cause register              */
  507. sw v0, E_STK_CAUSE(sp)       /* save cause on stack              */
  508. mfc0 k1, C0_SR                 /* read status register             */
  509. sw k1, E_STK_SR(sp)          /* save status on stack             */
  510. .set noat 
  511. mflo AT                        /* read entry lo reg                */
  512. SW AT, E_STK_LO(sp)          /* save entry lo reg                */
  513. mfhi AT                        /* read entry hi reg                */
  514. SW AT, E_STK_HI(sp)          /* save entry hi reg                */
  515. .set at
  516. SW zero, E_STK_ZERO(sp)      /* save zero ?!                     */
  517. SW v1, E_STK_V1(sp)          /* save func return 1               */
  518. SW a0, E_STK_A0(sp)          /* save passed param 0              */
  519. SW a1, E_STK_A1(sp)          /* save passed param 1              */
  520. SW a2, E_STK_A2(sp)          /* save passed param 2              */
  521. SW a3, E_STK_A3(sp)          /* save passed param 3              */
  522. SW t0, E_STK_T0(sp)          /* save temp reg 0                  */
  523. SW t1, E_STK_T1(sp)          /* save temp reg 1                  */
  524.   SW t2, E_STK_T2(sp)          /* save temp reg 2                  */
  525. SW t3, E_STK_T3(sp)          /* save temp reg 3                  */
  526. SW t4, E_STK_T4(sp)          /* save temp reg 4                  */
  527. SW t5, E_STK_T5(sp)          /* save temp reg 5                  */
  528. SW t6, E_STK_T6(sp)          /* save temp reg 6                  */
  529. SW t7, E_STK_T7(sp)          /* save temp reg 7                  */
  530. SW t8, E_STK_T8(sp)          /* save temp reg 8                  */
  531. SW t9, E_STK_T9(sp)          /* save temp reg 9                  */
  532. SW s0, E_STK_S0(sp)          /* save saved reg 0                 */
  533. SW s1, E_STK_S1(sp)          /* save saved reg 1                 */
  534. SW s2, E_STK_S2(sp)          /* save saved reg 2                 */
  535. SW s3, E_STK_S3(sp)          /* save saved reg 3                 */
  536. SW s4, E_STK_S4(sp)          /* save saved reg 4                 */
  537. SW s5, E_STK_S5(sp)          /* save saved reg 5                 */
  538. SW s6, E_STK_S6(sp)          /* save saved reg 6                 */
  539. SW s7, E_STK_S7(sp)          /* save saved reg 7                 */
  540. SW s8, E_STK_FP(sp)          /* save saved reg 8                 */
  541. SW gp, E_STK_GP(sp)          /* save global pointer?             */
  542. SW ra, E_STK_RA(sp)          /* save return address              */
  543. excLoop:
  544.         b       excLoop
  545. .end    romExcHandle
  546.  
  547.