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

VxWorks

开发平台:

C/C++

  1. /*
  2.     Copyright 2001, Broadcom Corporation
  3.     All Rights Reserved.
  4.     
  5.     This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
  6.     the contents of this file may not be disclosed to third parties, copied or
  7.     duplicated in any form, in whole or in part, without the prior written
  8.     permission of Broadcom Corporation.
  9. */
  10. /* romInit.s - BCM47XX ROM initialization module */
  11. /* modified from IDT S134 ROM initialization module */
  12. /* Copyright 1984-1996 Wind River Systems, Inc. */
  13.         .data
  14.         .globl  copyright_wind_river
  15. /*
  16. DESCRIPTION
  17. This module contains the entry code for the VxWorks bootrom.
  18. The entry point romInit, is the first code executed on power-up.
  19. The routine sysToMonitor() jumps to romInit() to perform a
  20. "warm boot".
  21. */
  22. #define _ASMLANGUAGE            /* used by vxworks include files */
  23. #include "vxWorks.h"
  24. #include "arch/mips/ivMips.h"
  25. #include "arch/mips/asmMips.h"
  26. #include "arch/mips/esfMips.h"
  27. #include "sysLib.h"
  28. #include "config.h"
  29. /* 47xx specific includes */
  30. #if 0
  31. #include "sbsdram.h"
  32. #include "sbextif.h"
  33. #endif
  34. #undef SDRAM_INIT
  35. #undef SDRAM_CONFIG
  36. #undef SDRAM_REFRESH
  37. #define SDRAM_INIT_1MX16X4    0x0419 /* 1Meg X 16 X 4 banks */
  38. #define SDRAM_INIT_2MX16X4    0x0c29 /* 2Meg X 16 X 4 banks */
  39. #define SDRAM_CONFIG  0x0000
  40. #define SDRAM_REFRESH 0x8040
  41. #define CORECLK_125_PCI_33
  42. #undef CORECLK_125_PCI_25
  43. #undef CORECLK_100_PCI_33
  44. #undef CORECLK_100_PCI_25
  45. #define  WATCHDOG_OFFSET        0x40
  46. #define  CLOCK_CTRL_N_OFFSET    0x44
  47. #define  CLOCK_CTRL_SB_OFFSET   0x48
  48. #define  CLOCK_CTRL_PCI_OFFSET  0x4c
  49. /* Clock control default values */
  50. #define CC_DEF_N 0x0009 /* Default values for bcm4710 */
  51. #define CC_DEF_100 0x04020011
  52. #define CC_DEF_M CC_DEF_100
  53. #define CC_DEF_M33 0x11030011
  54. #define CC_DEF_M25 0x11050011
  55. /* Clock control values for 125Mhz */
  56. #define CC_125_N 0x0802
  57. #define CC_125_M 0x04020009
  58. #define CC_125_M25 0x11090009
  59. #define CC_125_M33 0x11090005
  60. #define   RAM_DST_ADRS  RAM_HIGH_ADRS
  61. /* internals */
  62. .globl romInit /* start of system code */
  63.         .globl  romReboot               /* sw reboot address */
  64. /* externals */
  65. .globl romStart /* system initialization routine */
  66.  
  67. /* external defs */
  68. .extern end 0 /* end of program */
  69. .extern etext 0 /* end of text section */
  70. .extern _fbss 0 /* start of bss section */
  71. .extern _fdata 0 /* start of data section */
  72. .data
  73. /* ensure data segment is 16-byte aligned */
  74. .align  4
  75. _sdata:
  76. .asciiz "start of data"
  77. .text
  78. /*
  79.  * relocate an address
  80.  * Make the address an uncached address
  81.  * This will trash ra!
  82.  */
  83. #define RELOC(toreg,address) 
  84.         bal     9f; 
  85. 9:; 
  86.         la      toreg,address; 
  87.         addu    toreg,ra; 
  88.         la      ra,9b; 
  89.         subu    toreg,ra
  90. #define RVECENT(f,n) 
  91. b f; nop
  92. #define XVECENT(f,bev) 
  93. b f; li k0,bev
  94. .text
  95. promEntry:
  96. romInit:
  97. _romInit:
  98. .set noreorder
  99. RVECENT(__romInit,0) /* PROM entry point */
  100. RVECENT(romReboot,1) /* software reboot */
  101. RVECENT(romReserved,2)
  102. RVECENT(romReserved,3)
  103. RVECENT(romReserved,4)
  104. RVECENT(romReserved,5)
  105. RVECENT(romReserved,6)
  106. RVECENT(romReserved,7)
  107. RVECENT(romReserved,8)
  108. RVECENT(romReserved,9)
  109. RVECENT(romReserved,10)
  110. RVECENT(romReserved,11)
  111. RVECENT(romReserved,12)
  112. RVECENT(romReserved,13)
  113. RVECENT(romReserved,14)
  114. RVECENT(romReserved,15)
  115. RVECENT(romReserved,16)
  116. RVECENT(romReserved,17) 
  117. RVECENT(romReserved,18)
  118. RVECENT(romReserved,19)
  119. RVECENT(romReserved,20)
  120. RVECENT(romReserved,21)
  121. RVECENT(romReserved,22)
  122. RVECENT(romReserved,23)
  123. RVECENT(romReserved,24)
  124. RVECENT(romReserved,25)
  125. RVECENT(romReserved,26)
  126. RVECENT(romReserved,27)
  127. RVECENT(romReserved,28)
  128. RVECENT(romReserved,29)
  129. RVECENT(romReserved,30)
  130. RVECENT(romReserved,31)
  131. RVECENT(romReserved,32)
  132. RVECENT(romReserved,33)
  133. RVECENT(romReserved,34)
  134. RVECENT(romReserved,35)
  135. RVECENT(romReserved,36)
  136. RVECENT(romReserved,37)
  137. RVECENT(romReserved,38)
  138. RVECENT(romReserved,39)
  139. RVECENT(romReserved,40)
  140. RVECENT(romReserved,41)
  141. RVECENT(romReserved,42)
  142. RVECENT(romReserved,43)
  143. RVECENT(romReserved,44)
  144. RVECENT(romReserved,45)
  145. RVECENT(romReserved,46)
  146. RVECENT(romReserved,47)
  147. #if CPU==RC32364
  148.         XVECENT(romExcHandle,0x380)
  149. #else
  150. RVECENT(romReserved,48)
  151. #endif
  152. RVECENT(romReserved,49)
  153. RVECENT(romReserved,50)
  154. RVECENT(romReserved,51)
  155. RVECENT(romReserved,52)
  156. RVECENT(romReserved,53)
  157. RVECENT(romReserved,54)
  158. RVECENT(romReserved,55)
  159. RVECENT(romReserved,56)
  160. RVECENT(romReserved,57)
  161. RVECENT(romReserved,58)
  162. RVECENT(romReserved,59)
  163. RVECENT(romReserved,60)
  164. RVECENT(romReserved,61)
  165. RVECENT(romReserved,62)
  166. RVECENT(romReserved,63)
  167. #if CPU_VAR==RC32364
  168. XVECENT(romExcHandle,0x200) /* bfc00200: RC32364 tlbmiss vector */
  169. #else
  170. RVECENT(romReserved,64)
  171. #endif
  172. RVECENT(romReserved,65)
  173. RVECENT(romReserved,66)
  174. RVECENT(romReserved,67)
  175. RVECENT(romReserved,68)
  176. RVECENT(romReserved,69)
  177. RVECENT(romReserved,70)
  178. RVECENT(romReserved,71)
  179. RVECENT(romReserved,72)
  180. RVECENT(romReserved,73)
  181. RVECENT(romReserved,74)
  182. RVECENT(romReserved,75)
  183. RVECENT(romReserved,76)
  184. RVECENT(romReserved,77)
  185. RVECENT(romReserved,78)
  186. RVECENT(romReserved,79)
  187. RVECENT(romReserved,80)
  188. RVECENT(romReserved,81)
  189. RVECENT(romReserved,82)
  190. RVECENT(romReserved,83)
  191. RVECENT(romReserved,84)
  192. RVECENT(romReserved,85)
  193. RVECENT(romReserved,86)
  194. RVECENT(romReserved,87)
  195. RVECENT(romReserved,88)
  196. RVECENT(romReserved,89)
  197. RVECENT(romReserved,90)
  198. RVECENT(romReserved,91)
  199. RVECENT(romReserved,92)
  200. RVECENT(romReserved,93)
  201. RVECENT(romReserved,94)
  202. RVECENT(romReserved,95)
  203. #if CPU_VAR==RC32364
  204. XVECENT(romExcHandle,0x300) /* bfc00300: RC32364 cache vector */
  205. #else
  206. RVECENT(romReserved,96)
  207. #endif
  208. RVECENT(romReserved,97)
  209. RVECENT(romReserved,98)
  210. RVECENT(romReserved,99)
  211. RVECENT(romReserved,100)
  212. RVECENT(romReserved,101)
  213. RVECENT(romReserved,102)
  214. RVECENT(romReserved,103)
  215. RVECENT(romReserved,104)
  216. RVECENT(romReserved,105)
  217. RVECENT(romReserved,106)
  218. RVECENT(romReserved,107)
  219. RVECENT(romReserved,108)
  220. RVECENT(romReserved,109)
  221. RVECENT(romReserved,110)
  222. RVECENT(romReserved,111)
  223. #if CPU_VAR==RC32364
  224. XVECENT(romExcHandle,0x380) /* bfc00380: RC32364 general vector */
  225. #else
  226. RVECENT(romReserved,112)
  227. #endif
  228. RVECENT(romReserved,113)
  229. RVECENT(romReserved,114)
  230. RVECENT(romReserved,115)
  231. RVECENT(romReserved,116)
  232. RVECENT(romReserved,116)
  233. RVECENT(romReserved,118)
  234. RVECENT(romReserved,119)
  235. RVECENT(romReserved,120)
  236. RVECENT(romReserved,121)
  237. RVECENT(romReserved,122)
  238. RVECENT(romReserved,123)
  239. RVECENT(romReserved,124)
  240. RVECENT(romReserved,125)
  241. RVECENT(romReserved,126)
  242. RVECENT(romReserved,127)
  243. /* We hope there are no more reserved vectors!
  244.  * 128 * 8 == 1024 == 0x400
  245.  * so this is address R_VEC+0x400 == 0xbfc00400
  246.  */
  247. .set reorder
  248. .align 4
  249. /********************************************************************************
  250. *
  251. * romInit - entry point for VxWorks in ROM
  252. *
  253. * romInit 
  254. *     (
  255. *     int startType
  256. *     )
  257. */
  258. __romInit: /* force power-on startType        */
  259.         .set    nomove
  260.         # set SR and CAUSE to something sensible
  261.         li      v0,SR_BEV
  262. #if 0
  263.         .set noreorder
  264.         .set noat
  265. #endif
  266.         mtc0    v0,C0_SR
  267.         mtc0    zero,C0_CAUSE
  268.         mtc0    zero,$18        # C0_WATCHLO
  269.         mtc0    zero,$19        # C0_WATCHHI
  270.         /***********
  271.          * Initialize the hardware
  272.          ***********/
  273.         li      t0, 2
  274.         mtc0    $16, t0
  275.         nop
  276.         /*  Enable "PCMCIA" chip select -- that's where LEDs reside */
  277.         li      a0, 0xb8007000
  278.         li      a1, 1
  279.         sw      a1, 0x10(a0)
  280.         /*  Enable external uart on the asynch chip select */
  281.         sw      a1, 0x20(a0)            /* enable the async interface */
  282.         li      a1, 0x01020a0c          /* prog wait cnt for ext uart */
  283.         sw      a1, 0x24(a0)
  284.         RELOC(a0,Init_msg)
  285.         bal     displaymsg
  286.         nop
  287.         /* Core clock selection */
  288. #ifdef CORECLK_125_PCI_33
  289.         li  t0, CC_125_N
  290.         li  t1, CC_125_M
  291.         li  t2, CC_125_M33
  292. #define CORECLK_XXX_PCI_YY
  293. #endif
  294. #ifdef  CORECLK_125_PCI_25
  295.         li  t0, CC_125_N
  296.         li  t1, CC_125_M
  297.         li  t2, CC_125_M25
  298. #define CORECLK_XXX_PCI_YY
  299. #endif
  300. #ifdef CORECLK_100_PCI_33
  301.         li  t0, CC_DEF_N
  302.         li  t1, CC_DEF_M
  303.         li  t2, CC_DEF_M33
  304. #define CORECLK_XXX_PCI_YY
  305. #endif
  306. #ifdef CORECLK_100_PCI_25
  307.         li  t0, CC_DEF_N
  308.         li  t1, CC_DEF_M
  309.         li  t2, CC_DEF_M25
  310. #define CORECLK_XXX_PCI_YY
  311. #endif
  312. #ifdef CORECLK_XXX_PCI_YY
  313.         li  a0, KSEG1ADDRASM(BCM4710_REG_EXTIF)
  314.         lw  a1, CLOCK_CTRL_N_OFFSET(a0)
  315.         bne a1, t0, 1f
  316.         nop
  317.         lw  a1, CLOCK_CTRL_SB_OFFSET(a0)
  318.         bne a1, t1, 1f
  319.         nop
  320.         lw  a1, CLOCK_CTRL_PCI_OFFSET(a0)
  321.         beq a1, t2, 2f
  322.         nop
  323. 1:
  324.         sw  t0, CLOCK_CTRL_N_OFFSET(a0)
  325.         sw  t1, CLOCK_CTRL_SB_OFFSET(a0)
  326.         sw  t2, CLOCK_CTRL_PCI_OFFSET(a0)
  327.         RELOC(a0,clk_set)
  328.         bal     displaymsg
  329.         /* Watchdog reset */
  330.         li  a0, KSEG1ADDRASM(BCM4710_REG_EXTIF)
  331.         li  a1, 1
  332.         sw  a1, WATCHDOG_OFFSET(a0)
  333. 3:     b 3b
  334.         nop
  335. 2:
  336. #endif
  337.         RELOC(a0,Init_msg1)
  338.         bal     displaymsg
  339.         nop
  340.         li      t0, SDRAM_INIT_2MX16X4
  341.         li      a0, 0xbf004000  /* board ID Addr */
  342.         lbu     a1, 0(a0)       /* board ID */
  343.         beq     a1, 0x0e, lm_32MB /* BOARD_ID_LM_1_32MB = 0x0e */
  344.         nop
  345.         beq     a1, 0x81, lm_32MB /* BOARD_ID_MBZ_32MB = 0x81 */
  346.         nop
  347.         li      t0, SDRAM_INIT_1MX16X4
  348. lm_32MB:
  349.         li      t1, SDRAM_CONFIG
  350.         li      t2, SDRAM_REFRESH
  351.         /* SDRAM init */      
  352.         li a0, 0xB8000f98
  353.         li      a1, 0x00030001
  354.         sw      a1, 0(a0)
  355.         lw      a1, 0(a0)       /* use multiple loads to insert a delay */
  356.         lw      a1, 0(a0)
  357.         lw      a1, 0(a0)
  358.         li      a1, 0x00030000
  359.         sw      a1, 0(a0)
  360.         lw      a1, 0(a0)       /* use multiple loads to insert a delay */
  361.         lw      a1, 0(a0)
  362.         lw      a1, 0(a0)
  363.         li      a1, 0x00010000
  364.         sw      a1, 0(a0)
  365.         lw      a1, 0(a0)       /* use multiple loads to insert a delay */
  366.         lw      a1, 0(a0)
  367.         lw      a1, 0(a0)
  368.         li      a0, 0xB8000000          # SDRAM registers
  369.         sw      t1, 4(a0)               # SDRAM config
  370.         li      a1, 0x000a
  371.         sw      a1, 0(a0)               # SDRAM precharge
  372.         li      a1, 0x0009              # SDRAM refresh
  373.         sw      a1, 0(a0)               # 1st refresh of power up sequence
  374.         sw      a1, 0(a0)               # 2nd refresh of power up sequence
  375.         sw      a1, 0(a0)               # 3rd refresh of power up sequence
  376.         sw      a1, 0(a0)               # 4th refresh of power up sequence
  377.         sw      a1, 0(a0)               # 5th refresh of power up sequence
  378.         sw      a1, 0(a0)               # 6th refresh of power up sequence
  379.         sw      a1, 0(a0)               # 7th refresh of power up sequence
  380.         sw      a1, 0(a0)               # 8th refresh of power up sequence
  381.         li      a1, 0x000c
  382.         sw      a1, 0(a0)               # SDRAM mode reg select
  383.         sw      t0, 0(a0)               # SDRAM init
  384.         sw      t2, 8(a0)               # SDRAM refresh
  385.      
  386.         /** End of 47xx SDRAM Init code **/
  387.         RELOC(a0,sdrm_msg)
  388.         bal     displaymsg
  389. li      a0, BOOT_CLEAR /* Says to clear memory. BOOT_NORMAL says don't. */
  390. /*
  391.    * If there was some way to distinguish between a cold and warm
  392.  * restart AND the memory system is guaranteed to be intact then
  393.          * we could load BOOT_NORMAL instead
  394.    */
  395. romReboot:                              /* sw reboot inherits a0 startType */
  396.         move    s0, a0                  /* save startType */
  397.         
  398. .set nomove
  399. /* disable all interrupts,  */
  400.         li      t1, 0xfffffffe
  401. li t0, SR_BEV           /* select boot exception handlers */ 
  402.         and     t0, t1               /* IE bit in status reg becomes 0 */
  403.         li      t1, ~SR_IE
  404.         and     t0, t1
  405. mtc0 t0, C0_SR
  406. /* clear software interrupts */
  407. mtc0 zero, C0_CAUSE
  408. mtc0 zero, C0_IWATCH
  409. mtc0 zero, C0_DWATCH
  410.         .set    move
  411.         andi    a0, s0, BOOT_CLEAR
  412. bal romCacheReset  /*initialise caches */
  413.         andi    t0, s0, BOOT_CLEAR
  414. beqz    t0, romWarm
  415.         RELOC(a0,bss_msg)
  416. bal displaymsg
  417. #ifdef SDRAM_ECC
  418. bal romClearEdac
  419. nop
  420. b  6f
  421. nop
  422. #endif
  423. romWarm:
  424. /* zap the BSS */
  425.         la a0,_fbss
  426. la a1,_end
  427. subu a1,a0
  428. srl a1,2
  429.         li      a2,0xfffffff0
  430.         and     a1,a1,a2
  431.         li      a2,0xfffffff0
  432.         and     a0,a0,a2
  433. move a2,zero
  434. bal _bfillLongs
  435. 6:
  436.         RELOC(a0,stak_msg)
  437. bal displaymsg
  438. /* give us as long as possible before a clock interrupt */ 
  439. li t0, 1
  440. mtc0 t0, C0_COUNT
  441. mtc0 zero, C0_COMPARE 
  442.         RELOC(a0,roms_msg)
  443. bal displaymsg
  444. /* set stack to grow down from beginning of data and call init */
  445. la gp, _gp /* set global ptr from compiler */
  446. la sp, STACK_ADRS /* set stack to begin of data */
  447. subu sp, 16 /* give me some room */
  448.         move    a0, s0                  /* push arg = start type */
  449. RELOC(t0, romStart)
  450. jal t0 /* never returns - starts up kernel  */
  451. j ra /* just in case */
  452. 1: b 1b
  453. Init_msg:
  454. .ascii "Init"
  455. r_Fail:
  456. .ascii "Fail"
  457. clk_set:
  458.         .ascii  "CLKS"
  459. Init_msg1:
  460.         .ascii  "SDIN"
  461. roms_msg:
  462.         .ascii  "roms"
  463. sdrm_msg:
  464. .ascii "sdrm"
  465. bss_msg:
  466. .ascii "bss "
  467. stak_msg:
  468. .ascii "stak"
  469. /*******************************************************************************
  470. *
  471. * romReserved -  Handle a jump to an unknown vector
  472. *
  473. * romReserved ()
  474. *
  475. */
  476. .ent romReserved
  477. romReserved:
  478. b romInit /* just start over */
  479. .end romReserved
  480. .ent _bfillLongs
  481. _bfillLongs:
  482.         move    v0,ra           /* save return address */
  483.         bltu    a1,8,2f
  484.         RELOC(t0,1f)            /* run the loop from cache */
  485. nop
  486. j t0
  487. 1: sw a2,0(a0)
  488. sw a2,4(a0)
  489. sw a2,8(a0)
  490. sw a2,12(a0)
  491. sw a2,16(a0)
  492. sw a2,20(a0)
  493. sw a2,24(a0)
  494. sw a2,28(a0)
  495. subu a1,8
  496. addu a0,32
  497. bgeu a1,8,1b
  498. 2: beqz a1,2f
  499. 1: subu a1,1
  500. sw a2,0(a0)
  501. addu a0,4
  502. bnez a1,1b
  503. 2: j v0
  504. .end _bfillLongs
  505. /*
  506.  * cacheop macro to automate cache operations
  507.  * first some helpers...
  508.  */
  509. #define _mincache(size, maxsize) 
  510.         .set noat ; 
  511.         sltu    AT,size,maxsize;         
  512.         bnez    AT,9f     ;         
  513. move   size,maxsize ;
  514.         .set at ; 
  515. 9:
  516. #define _align(minaddr, maxaddr, linesize) 
  517.         .set noat;
  518. subu AT,linesize,1 ;
  519. not AT ;
  520. and minaddr,AT ;
  521. addu maxaddr,-1 ;
  522. and maxaddr,AT ;
  523.         .set at
  524. #define CACHELINE_SIZE  16
  525. #define ICACHE_SIZE     (8*1024)
  526. #define DCACHE_SIZE     (4*1024)
  527. #define KSEG0BASE       0x80000000
  528. #define C0_TAGLO        $28
  529. #define C0_TAGHI        $29
  530. #define CACHE_OP( code, type ) ( ((code) << 2) | (type) )
  531. #define ICACHE_INDEX_INVALIDATE CACHE_OP(0x0, 0)
  532. #define ICACHE_INDEX_LOAD_TAG CACHE_OP(0x1, 0)
  533. #define ICACHE_INDEX_STORE_TAG CACHE_OP(0x2, 0)
  534. #define DCACHE_INDEX_WRITEBACK_INVALIDATE CACHE_OP(0x0, 1)
  535. #define DCACHE_INDEX_LOAD_TAG CACHE_OP(0x1, 1)
  536. #define DCACHE_INDEX_STORE_TAG CACHE_OP(0x2, 1)
  537. #define ICACHE_ADDR_HIT_INVALIDATE CACHE_OP(0x4, 0)
  538. #define ICACHE_ADDR_FILL CACHE_OP(0x5, 0)
  539. #define ICACHE_ADDR_FETCH_LOCK CACHE_OP(0x7, 0)
  540. #define DCACHE_ADDR_HIT_INVALIDATE CACHE_OP(0x4, 1)
  541. #define DCACHE_ADDR_HIT_WRITEBACK_INVALIDATE CACHE_OP(0x5, 1)
  542. #define DCACHE_ADDR_HIT_WRITEBACK CACHE_OP(0x6, 1)
  543. #define DCACHE_ADDR_FETCH_LOCK CACHE_OP(0x7, 1)
  544. /*******************************************************************************
  545. *
  546. * romCacheReset - low level initialisation of the primary caches
  547. *
  548. *
  549. * RETURNS: N/A
  550. *
  551. * void romCacheReset
  552. */
  553.         .set mips3
  554. .set noreorder
  555. .ent romCacheReset
  556. romCacheReset:
  557.         /*  a0 = cache size
  558.  *  a1 = line  size
  559.  */
  560.         li      a0, ICACHE_SIZE
  561.         li      a1, CACHELINE_SIZE 
  562.         /* CFLUSH */
  563. mtc0    zero, C0_TAGLO 
  564. mtc0    zero, C0_TAGHI      /* TagHi is not really used */
  565. /* Calc an address that will correspond to the first cache line */
  566. li a2, KSEG0BASE
  567. /* Calc an address that will correspond to the last cache line  */
  568. addu a3, a2, a0
  569. subu    a3, a1
  570. /* Loop through all lines, invalidating each of them */
  571. 1:
  572. cache ICACHE_INDEX_STORE_TAG, 0(a2) /* clear tag */
  573. bne a2, a3, 1b
  574. addu a2, a1
  575.         /* DFLUSH INV */
  576.                 
  577. /*  a0 = cache size
  578.  *  a1 = line  size
  579.  */
  580.         li      a0, DCACHE_SIZE
  581.         li      a1, CACHELINE_SIZE 
  582. mtc0    zero, C0_TAGLO 
  583. mtc0    zero, C0_TAGHI      /* TagHi is not really used */
  584. /* Calc an address that will correspond to the first cache line */
  585. li a2, KSEG0BASE
  586. /* Calc an address that will correspond to the last cache line  */
  587. addu a3, a2, a0
  588. subu    a3, a1
  589. /* Loop through all lines, invalidating each of them */
  590. 1:
  591. cache DCACHE_INDEX_STORE_TAG, 0(a2) /* clear tag */
  592. bne a2, a3, 1b
  593. addu a2, a1
  594. j ra
  595. .end romCacheReset
  596.         .set    mips0
  597. .set  reorder
  598. /*******************************************************************************
  599. *
  600. * romClearEdac - clear error detection and correction logic
  601. *
  602. * This routine clears the memory and error detection logic by
  603. * doing word writes to each DRAM location.  It sizes memory by
  604. * probing memory locations.
  605. */
  606. .ent romClearEdac
  607. romClearEdac:
  608. mfc0 v1,C0_SR /* disable parity errors */
  609. or v0,v1,SR_DE
  610. mtc0 v0,C0_SR
  611. move  v0,ra /* save return address */
  612.         RELOC(t0,1f)            /* run the loop from cache */
  613.         and     t0,0x1fffffff
  614.         or      t0,K0BASE
  615.         j       t0
  616. 1:
  617. li     a0,(LOCAL_MEM_SIZE | K1BASE )
  618.         
  619. clearloop:
  620. sw zero, -4(a0)
  621. sw zero, -8(a0)
  622. sw zero, -12(a0)
  623. sw zero, -16(a0)
  624. sw zero, -20(a0)
  625. sw zero, -24(a0)
  626. sw zero, -28(a0)
  627. sw zero, -32(a0)
  628. subu a0, 32
  629. bne a0, K1BASE, clearloop 
  630.         nop
  631. done:
  632. mtc0 v1,C0_SR
  633. j v0
  634. .end romClearEdac
  635. /*******************************************************************************
  636. *
  637. * displaymsg - display a 4-character message on the alpha LEDS
  638. *
  639. */
  640.         .globl  displaymsg
  641.         .ent    displaymsg
  642. displaymsg:
  643. #if 0
  644.         DELAY(PREDELAY)
  645. #endif
  646. li a2, MBZ_LED_ADDR_ASM
  647.         lbu     a1,0(a0) /* get char from bootrom */
  648.         sb      a1,0(a2)
  649.         lbu     a1,1(a0)
  650.         sb      a1,1(a2)
  651.         lbu     a1,2(a0)
  652.         sb      a1,2(a2)
  653.         lbu     a1,3(a0)
  654.         sb      a1,3(a2)
  655. #if 0
  656.         DELAY(POSTDELAY)
  657. #endif
  658.         j       ra
  659. nop
  660.          .end   displaymsg
  661. /*******************************************************************************
  662. *
  663. * romExcHandle - rom based exception/interrupt handler
  664. *
  665. * This routine is invoked on an exception or interrupt while
  666. * the status register is using the bootstrap exception vectors.
  667. * It saves a state frame to a known uncached location so someone
  668. * can examine the data over the VME.  It also displays a summary of the
  669. * error on the boards alphanumeric display.
  670. *
  671. * THIS ROUTIINE IS NOT CALLABLE FROM "C"
  672. *
  673. */
  674. #define ROM_ISP_BASE 0xa0100000
  675. .ent romExcHandle
  676. romExcHandle:
  677. .set noat
  678. li sp, ROM_ISP_BASE  /* sp to known uncached location */
  679. SW sp, E_STK_SP-ESTKSIZE(sp) /* save sp in new intstk frame */
  680. subu sp, ESTKSIZE /* make new exc stk frame */
  681. SW k0, E_STK_K0(sp)  /* save k0, (exception type) */
  682. SW AT, E_STK_AT(sp) /* save asmbler resvd reg */
  683. .set at
  684. SW v0, E_STK_V0(sp) /* save func return 0, used
  685.    to hold masked cause */
  686. mfc0 k1, C0_BADVADDR /* read bad VA reg */
  687. sw k1, E_STK_BADVADDR(sp) /* save bad VA on stack */
  688. mfc0 k1, C0_EPC /* read exception pc */
  689. sw k1, E_STK_EPC(sp) /* save EPC on stack */
  690. mfc0 v0, C0_CAUSE /* read cause register */
  691. sw v0, E_STK_CAUSE(sp) /* save cause on stack */
  692. mfc0 k1, C0_SR /* read status register */
  693. sw k1, E_STK_SR(sp) /* save status on stack */
  694. .set noat
  695. mflo AT /* read entry lo reg */
  696. SW AT,E_STK_LO(sp) /* save entry lo reg */
  697. mfhi AT /* read entry hi reg */
  698. SW AT,E_STK_HI(sp) /* save entry hi reg */
  699. .set at
  700. SW zero, E_STK_ZERO(sp) /* save zero ?! */
  701. SW v1,E_STK_V1(sp) /* save func return 1 */
  702. SW a0,E_STK_A0(sp) /* save passed param 0 */
  703. SW a1,E_STK_A1(sp) /* save passed param 1 */
  704. SW a2,E_STK_A2(sp) /* save passed param 2 */
  705. SW a3,E_STK_A3(sp) /* save passed param 3 */
  706. SW t0,E_STK_T0(sp) /* save temp reg 0 */
  707. SW t1,E_STK_T1(sp) /* save temp reg 1 */
  708. SW t2,E_STK_T2(sp) /* save temp reg 2 */
  709. SW t3,E_STK_T3(sp) /* save temp reg 3 */
  710. SW t4,E_STK_T4(sp) /* save temp reg 4 */
  711. SW t5,E_STK_T5(sp) /* save temp reg 5 */
  712. SW t6,E_STK_T6(sp) /* save temp reg 6 */
  713. SW t7,E_STK_T7(sp) /* save temp reg 7 */
  714. SW t8,E_STK_T8(sp) /* save temp reg 8 */
  715. SW t9,E_STK_T9(sp) /* save temp reg 9 */
  716. SW s0,E_STK_S0(sp) /* save saved reg 0 */
  717. SW s1,E_STK_S1(sp) /* save saved reg 1 */
  718. SW s2,E_STK_S2(sp) /* save saved reg 2 */
  719. SW s3,E_STK_S3(sp) /* save saved reg 3 */
  720. SW s4,E_STK_S4(sp) /* save saved reg 4 */
  721. SW s5,E_STK_S5(sp) /* save saved reg 5 */
  722. SW s6,E_STK_S6(sp) /* save saved reg 6 */
  723. SW s7,E_STK_S7(sp) /* save saved reg 7 */
  724. SW s8,E_STK_FP(sp) /* save saved reg 8 */
  725. SW gp,E_STK_GP(sp) /* save global pointer? */
  726. SW ra,E_STK_RA(sp) /* save return address */
  727. .end    romExcHandle            /* that's all folks */
  728. #define ROMCYCLE 1180 /* 1.18us cycle */
  729. #define ROMMS 1000000/(ROMCYCLE*2)
  730. /*
  731.  * delay for r microseconds
  732.  */
  733. #define ASMRDELAY(r) 
  734. .set noreorder; 
  735. .set noat; 
  736. move AT,r; 
  737. 99:; 
  738. bne AT,zero,99b; 
  739. subu AT,1; 
  740. .set at; 
  741. .set reorder
  742. /*
  743.  * delay for n milliseconds
  744.  */
  745. #define DELAY(n)
  746. .set noat ;
  747. li AT,(n*ROMMS) ;
  748. ASMRDELAY(AT) ;
  749. .set at
  750. #define PREDELAY 1000
  751. #define ONDELAY 4000
  752. #define OFFDELAY 400
  753. #define POSTDELAY 1000
  754. #define BLIPDISPLAY(bcrrp,bcrrv)
  755. DELAY(ONDELAY) ; 
  756. DELAY(OFFDELAY)
  757. /* Data for the display of Exception Info */
  758. exctypes:
  759. #if CPU_VAR==RC32364
  760. .word 0x200; .ascii "tlb "
  761. .word 0x300; .ascii "cach"
  762. .word 0x380; .ascii "gen "
  763. #endif /* CPU_VAR==RC32364 */
  764. .word 0; .ascii "????"
  765. r_epc: .ascii "epc "
  766. r_cr: .ascii "cr  "
  767. r_sr: .ascii "sr  "
  768. r_badvaddr:
  769. .ascii "badv"
  770. r_ra: .ascii "ra  "