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

VxWorks

开发平台:

C/C++

  1. /* ROmInit.s - ROM bootcode for SBC8548 BSP */
  2. /*
  3.  * Copyright (c) 2006-2007 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /*
  10. modification history
  11. --------------------
  12. 01c,25may07,b_m  add BOOT_FLASH macro to support boot device selection.
  13. 01b,03apr07,b_m  MPC8548 rev.2 update.
  14. 01a,30jan06,kds  Modify from cds8548 01a.
  15. */
  16. .data
  17. #define _ASMLANGUAGE
  18. #include <vxWorks.h>
  19. #include <sysLib.h>
  20. #include <asm.h>
  21. #include <config.h>
  22. #include <regs.h>
  23. #include <arch/ppc/mmuE500Lib.h>
  24. FUNC_EXPORT(romInit)
  25. FUNC_EXPORT(_romInit)
  26. FUNC_IMPORT(romStart)
  27. #define WRITEADR(reg1,reg2,addr32,val) 
  28. lis reg1, HI(addr32); 
  29. ori reg1, reg1, LO(addr32); 
  30. lis reg2, HI(val); 
  31. ori reg2, reg2, LO(val); 
  32. stw reg2, 0(reg1)
  33. #define WRITEOFFSET(regbase,reg2,offset,val) 
  34.         lis reg2, HI(val); 
  35.         ori reg2, reg2, LO(val); 
  36. stw reg2, offset(regbase);
  37. _WRS_TEXT_SEG_START
  38. .fill 0x100,1,0
  39. FUNC_BEGIN(romInit)
  40. FUNC_BEGIN(_romInit)
  41. bl     resetEntry
  42. romWarm:
  43. bl     warm
  44.         .ascii   "Copyright 1984-2006 Wind River Systems, Inc."
  45.         .balign 4
  46. cold:
  47. li    r2, BOOT_COLD
  48. b     start
  49. /* defines for memory initialization */
  50. warm:
  51. mr     r2,r3
  52. start:
  53.         /* turn off exceptions */
  54.         mfmsr   r3                      /* r3 = msr              */
  55.         INT_MASK (r3, r4)               /* mask EE and CE bit    */
  56.         rlwinm  r4, r4, 0, 20, 18       /* turn off _PPC_MSR_ME  */
  57.         mtmsr   r4                      /* msr = r4              */
  58.         isync
  59.         xor     r0, r0, r0
  60.         addi    r1, r0, -1
  61.         mtspr   DEC, r0
  62.         mtspr   TBL, r0
  63.         mtspr   TBU, r0
  64.         mtspr   TSR, r1
  65.         mtspr   TCR, r0
  66.         mtspr   ESR, r0                 /* clear Exception Syndrome Reg */
  67.         mtspr   XER, r0                 /*  clear Fixed-Point Exception Reg */
  68. xor   r6, r6, r6
  69. msync
  70. isync
  71. mtspr L1CSR0, r6 /* Disable the Data cache */
  72.         li   r6, 0x0002
  73. msync
  74. isync
  75. mtspr L1CSR0, r6 /* Invalidate the Data cache */
  76.         li    r6, 0x0000
  77.         msync
  78. isync
  79. mtspr L1CSR1, r6  /* Disable the Instruction cache */
  80.         li   r6, 0x0002
  81.         msync
  82. isync
  83. mtspr L1CSR1, r6 /* Invalidate the Instruction cache */
  84.         isync
  85.         li   r6, 0x0000
  86. msync
  87. isync
  88. mtspr L1CSR1, r6        /* temp disable the Instruction cache */
  89.         isync
  90.         li r7, 0x0001
  91. msync
  92. isync
  93. mtspr L1CSR1, r7 /* enable the instruction cache */
  94. msync
  95. isync
  96.         /* Set the pciAutoconfig check to FALSE */
  97. xor     r5,r5,r5                /* Zero r5 */
  98. lis     r6,HIADJ(PCI_AUTO_CONFIG_ADRS)
  99. addi r6,r6,LO(PCI_AUTO_CONFIG_ADRS)
  100. stw     r5,0(r6)
  101. xor     r6,r6,r6
  102. xor     r7,r7,r7
  103. mullw   r7,r7,r6
  104.         lis     sp, HI(STACK_ADRS)
  105.         ori     sp, sp, LO(STACK_ADRS)
  106.         addi    sp, sp, -FRAMEBASESZ
  107.         lis     r6, HI(romInit)
  108.         ori     r6, r6, LO(romInit)
  109.         lis     r7, HI(romStart)
  110.         ori     r7, r7, LO(romStart)
  111.         lis     r8, HI(ROM_TEXT_ADRS)
  112.         ori     r8, r8, LO(ROM_TEXT_ADRS)
  113. sub r6, r7, r6 /* routine - entry point */
  114. add r6, r6, r8  /* + ROM base */
  115.         mtspr   LR, r6
  116.         mr      r3, r2
  117.         blr
  118. FUNC_END(_romInit)
  119. FUNC_END(romInit)
  120. /***************************************************************************
  121. *
  122. * resetEntry - rom entry point
  123. *
  124. *
  125. */
  126. #if   defined(_GNU_TOOL)
  127. .section .boot, "ax", @progbits
  128. #elif defined(_DIAB_TOOL)
  129.         .section .boot, 4, "rx"
  130. #else
  131. #error "Please add a correctly spelled .section directive for your toolchain."
  132. #endif
  133. FUNC_BEGIN(resetEntry)
  134. FUNC_LABEL(_resetEntry)
  135. xor   r6, r6, r6
  136. msync
  137. isync
  138. mtspr L1CSR0, r6 /* Disable the Data cache */
  139.         li   r6, 0x0002
  140. msync
  141. isync
  142. mtspr L1CSR0, r6 /* Invalidate the Data cache */
  143.         li    r6, 0x0000
  144.         msync
  145. isync
  146. mtspr L1CSR1, r6  /* Disable the Instruction cache */
  147.         li   r6, 0x0002
  148.         msync
  149. isync
  150. mtspr L1CSR1, r6 /* Invalidate the Instruction cache */
  151.         isync
  152.         li   r6, 0x0000
  153. msync
  154. isync
  155. mtspr L1CSR1, r6        /* temp disable the Instruction cache */
  156.         isync
  157.         li r7, 0x0000      /* FIXME: Should be "li r7, 0x0001" to */
  158.         msync                   /*        enable instruction cache.    */
  159. isync
  160. mtspr L1CSR1, r7 /* enable the instruction cache */
  161. msync
  162. isync
  163.         /* Clear SRR0, CSRR0, MCSRR0, SRR1, CSRR1 , MCSRR1, IVPR */
  164. xor   r0,r0,r0
  165.         mtspr SRR0, r0          /* Save/restore register 0 */
  166.         mtspr SRR1, r0          /* Save/restore register 1 */
  167.         mtspr CSRR0, r0         /* Critical save/restore register 0 */
  168.         mtspr CSRR1, r0         /* Critical save/restore register 1 */
  169.         mtspr MCSRR0, r0        /* Machine check save/restore register 0 */
  170.         mtspr MCSRR1, r0        /* Machine check save/restore register 1 */
  171.         mtspr ESR, r0           /* Exception syndrone register */
  172.         mtspr MCSR, r0          /* Machine check syndrone register */
  173.         mtspr DEAR, r0          /* Data exception address register */
  174.         mtspr DBCR0, r0         /* Debug control register 0 */
  175.         mtspr DBCR1, r0         /* Debug control register 1 */
  176.         mtspr DBCR2, r0         /* Debug control register 2 */
  177.         mtspr IAC1, r0          /* Instruction address compare 1 */
  178.         mtspr IAC2, r0          /* Instruction address compare 2 */
  179.         mtspr DAC1, r0          /* Data address compare 1 */
  180.         mtspr DAC2, r0          /* Data address compare 1 */
  181.         mfspr r1, DBSR          /* Debug status register */
  182.         mtspr DBSR, r1          /* DBSR bits corresponding to 1 bits in the
  183.                                  * GPR is cleared using mtspr
  184.                                  */
  185.         mtspr PID0, r0          /* Process ID 0 register */
  186.         mtspr PID1, r0          /* Process ID 1 register */
  187.         mtspr PID2, r0          /* Process ID 2 register */
  188.         mtspr TCR, r0           /* Timer control register */
  189.         mtspr 1013, r0          /* Branch unit control and status register */
  190. mtspr MAS4, r0          /* MMU assist register 4 */
  191. mtspr MAS6, r0          /* MMU assist register 6 */
  192. isync
  193. lis   r1,0xfff0         /* IPVR[32-47] provides high-order 16 bits */
  194. ori   r1,r1,0xfff0      /* of the exception processing routines.   */
  195.                                 /* The 16-bit vector offsets are concatenated
  196.                                  * to the right of IVPR[32-47] to form the
  197.                                  * address of the exception processing routine.
  198.                                  */
  199.         mtspr IVPR, r1          /* Interrupt vector prefix register */
  200.         /* Set up vector offsets */
  201.         addi  r3, r0, 0x100
  202.         mtspr IVOR0, r3         /* Critical input */
  203.         addi  r3, r0, 0x200
  204.         mtspr IVOR1, r3         /* Machine check */
  205.         addi  r3, r0, 0x300
  206.         mtspr IVOR2, r3         /* Data storage */
  207.         addi  r3, r0, 0x400
  208.         mtspr IVOR3, r3         /* Instruction storage */
  209.         addi  r3, r0, 0x500
  210.         mtspr IVOR4, r3         /* External input */
  211.         addi  r3, r0, 0x600
  212.         mtspr IVOR5, r3         /* Alignment */
  213.         addi  r3, r0, 0x700
  214.         mtspr IVOR6, r3         /* Program */
  215.         /* skipping IVOR7 0x800: no FPU on e500 */
  216.         addi  r3, r0, 0x900
  217.         mtspr IVOR8, r3         /* System call */
  218.         /* skipping IVOR9 0xa00: no aux processor on e500 */
  219.         addi  r3, r0, 0xb00
  220.         mtspr IVOR10, r3        /* Decrementer */
  221.         addi  r3, r0, 0xc00
  222.         mtspr IVOR11, r3        /* Fixed-interval timer interrupt */
  223.         addi  r3, r0, 0xd00
  224.         mtspr IVOR12, r3        /* Watchdog timer interrupt */
  225.         addi  r3, r0, 0xe00
  226.         mtspr IVOR13, r3        /* Data TLB error */
  227.         addi  r3, r0, 0xf00
  228.         mtspr IVOR14, r3        /* Instruction TLB error */
  229.         addi  r3, r0, 0x1000
  230.         mtspr IVOR15, r3        /* Debug */
  231.         addi  r3, r0, 0x1100       /* SPU is e500 specific */
  232.         mtspr IVOR32, r3        /* SPE APU unavailable */
  233.         addi  r3, r0, 0x1200       /* FP data is e500 specific */
  234.         mtspr IVOR33, r3        /* Embedded floating-point data exception */
  235.         addi  r3, r0, 0x1300       /* FP round is e500 specific */
  236.         mtspr IVOR34, r3        /* Embedded floating-point round exception */
  237.         addi  r3, r0, 0x1400       /* perf mon is e500 specific */
  238.         mtspr IVOR35, r3        /* Performance monitor */
  239. li    r2,0x1e           /* Invalidate TLB0 and TLB1 flash */
  240. mtspr MMUCSR0, r2
  241. isync
  242. li    r3,4
  243. li    r4,0
  244. tlbivax r4,r3           /* TLB invalidate */
  245. nop
  246. b postTable
  247. platpllTable:
  248. .long 0x00000203
  249. .long 0x04050607
  250. .long 0x08090A00
  251. .long 0x0C000000
  252. .long 0x10000000
  253. .long 0x14000000
  254. postTable:
  255.         /*
  256.          * Write TLB entry for initial program memory page
  257.          *
  258.          * - Specify EPN, RPN, and TSIZE as appropriate for system
  259.          * - Set valid bit
  260.          * - Specify TID=0
  261.          * - Specify TS=0 or else MSR[IS,DS] must be set to correspond to TS=1
  262.          * - Specify storage attributes (W, I, M, G, E, U0 - U3) as appropriate
  263.          * - Enable supervisor mode fetch, read, and write access (SX, SR, SW)
  264.          */
  265.         /*
  266.          * TLB1 #0.  ROM - non-cached 0xf0000000 -> 0xfffffffff.
  267.  * 256MB
  268.          * Attributes: SX/SW/SR **PROTECTED**
  269.          */
  270.         /* MMU Assit Register 0 (MAS0)
  271.          *           35          44  47        63
  272.          * +-----+--------+-----+------+-----+----+
  273.          * | --- | TLBSEL | --- | ESEL | --- | NV |
  274.          * +-----+--------+-----+------+-----+----+
  275.          * TLBSEL  Selects TLB for access (0 = TLB0, 1 = TLB1)
  276.          * ESEL    Entry select. Number of entry in selected array to be used
  277.          *         for tlbwe.
  278.          * NV      Next victim.
  279.          */
  280.         addis  r4,0,0x1000           /* TLBSEL = TLB1(CAM) , ESEL = 0 */
  281.         ori    r4,r4,0x0000
  282.         mtspr  MAS0, r4
  283.         /* MAS Register 1 (MAS1)
  284.          *  32    33          40 47        51  52   55
  285.          * +---+-------+-----+-----+-----+----+-------+-----+
  286.          * | V | IPROT | --- | TID | --- | TS | TSIZE | --- |
  287.          * +---+-------+-----+-----+-----+----+-------+-----+
  288.          * V      TLB valid bit
  289.          * IPROT  Invalidate protect.
  290.          *        1 = Entry is protected from invalidation, 0 = Otherwise.
  291.          * TID    Translation identity.
  292.          * TS     Translation space
  293.          * TSIZE  Translation size
  294.          *        0001  4KB     0010  16KB      0011  64KB      0100  256KB
  295.          *        0101  1MB     0110  4MB       0111  16MB      1000  64MB
  296.          *        1001  256MB   1010  1GB       1011   4GB
  297.          */
  298.         addis  r5,0,0xc000           /* V = 1, IPROT = 1, TID = 0*/
  299.         ori    r5,r5,_MMU_TLB_SZ_256M  /* TS = 0, TSIZE = 256 MByte page size*/
  300.         mtspr  MAS1, r5
  301.         /* MAS Register 2 (MAS2)
  302.          *  32 51        57   58  59  60  61  62  63
  303.          * +-----+-----+----+----+---+---+---+---+---+
  304.          * | EPN | --- | X0 | X1 | W | I | M | G | E |
  305.          * +-----+-----+----+----+---+---+---+---+---+
  306.          * EPN  Effective page number.
  307.          * X0   Implementation-dependent page attribute.
  308.          * X1   Implementation-dependent page attribute.
  309.          * W    Write-through (0 = write-back, 1 = write through)
  310.          * I    Caching-inhibited
  311.          * M    Memory coherency required
  312.          * G    Guarded
  313.          * E    Endianness. (0 = big-endian, 1 = little-endian)
  314.          */
  315.         addis  r6,0,0xf000           /* EPN = 0xf0000000*/
  316.         ori    r6,r6,0x000a          /* WIMGE = 01010 */
  317.         mtspr  MAS2, r6
  318.         /* MAS Register 3 (MAS3)
  319.          *  32 51       54   57  58   59   60   61   62   63
  320.          * +-----+-----+-------+----+----+----+----+----+----+
  321.          * | RPN | --- | U0-U3 | UX | SX | UW | SW | UR | SR |
  322.          * +-----+-----+-------+----+----+----+----+----+----+
  323.          * RPN   Real page number
  324.          * U0-U3 User attribute bits.
  325.          * UX/SX User/supervisor execute permission  bit
  326.          * UW/SW User/supervisor write permission bit
  327.          * UR/SR User/supervisor read permission bit
  328.          */
  329.         addis  r7,0,0xf000           /* RPN = 0xf0000000*/
  330.         ori    r7,r7,0x0015          /* Supervisor XWR*/
  331.         mtspr  MAS3, r7
  332.         isync
  333.         msync
  334.         tlbwe
  335.         tlbsync
  336.         /*
  337.          * TLB1 #1.  Main SDRAM - Not Cached
  338.  * LOCAL_MEM_LOCAL_ADRS -> LOCAL_MEM_LOCAL_ADRS + 256MB 
  339.          * Attributes: UX/UW/UR/SX/SW/SR
  340.          */
  341.         addis  r4,0,0x1001           /* TLBSEL = TLB1(CAM) , ESEL = 1*/
  342.         ori    r4,r4,0x0000
  343.         mtspr  MAS0, r4
  344.         addis  r5,0,0xc000           /* V = 1, IPROT = 1, TID = 0*/
  345.         ori    r5,r5,_MMU_TLB_SZ_256M  /* TS = 0, TSIZE = 256 MByte page size*/
  346.         mtspr  MAS1, r5
  347.         addis  r6,0,HI(LOCAL_MEM_LOCAL_ADRS) /* EPN = LOCAL_MEM_LOCAL_ADRS */
  348.         ori    r6,r6,0x000a          /* WIMGE = 01010*/
  349.         mtspr  MAS2, r6
  350.         addis  r7,0,HI(LOCAL_MEM_LOCAL_ADRS)  /* RPN = LOCAL_MEM_LOCAL_ADRS */
  351.         ori    r7,r7,0x003f          /* User/Supervisor XWR*/
  352.         mtspr  MAS3, r7
  353.         isync
  354.         msync
  355.         tlbwe
  356.         tlbsync
  357. #if (LOCAL_MEM_SIZE > 0x10000000)
  358.         /*
  359.          * TLB1 #3.  Main SDRAM  - Not Cached
  360.  * LOCAL_MEM_LOCAL_ADRS + 256MB -> LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE
  361.          * Attributes: UX/UW/UR/SX/SW/SR
  362.          */
  363.         addis  r4,0,0x1003           /* TLBSEL = TLB1(CAM) , ESEL = 3*/
  364.         ori    r4,r4,0x0000
  365.         mtspr  MAS0, r4
  366.         addis  r5,0,0xc000           /* V = 1, IPROT = 1, TID = 0*/
  367.         ori    r5,r5,_MMU_TLB_SZ_256M  /* TS = 0, TSIZE = 256 MByte page size*/
  368.         mtspr  MAS1, r5
  369.         addis  r6,0,HI(LOCAL_MEM_LOCAL_ADRS + 0x10000000) /* EPN = LOCAL_MEM_LOCAL_ADRS */
  370.         ori    r6,r6,0x000a          /* WIMGE = 01010*/
  371.         mtspr  MAS2, r6
  372.         addis  r7,0,HI(LOCAL_MEM_LOCAL_ADRS + 0x10000000)  /* RPN = LOCAL_MEM_LOCAL_ADRS */
  373.         ori    r7,r7,0x003f          /* User/Supervisor XWR*/
  374.         mtspr  MAS3, r7
  375.         isync
  376.         msync
  377.         tlbwe
  378.         tlbsync
  379. #endif
  380. /*
  381.          * TLB1 #2.  CCSBAR
  382.          * Attributes: UX/UW/UR/SX/SW/SR
  383.          */
  384.         addis  r4,0,0x1002          /* TLBSEL = TLB1(CAM) , ESEL = 2*/
  385.         ori    r4,r4,0x0000
  386.         mtspr  MAS0, r4
  387.         addis  r5,0,0x8000           /* V = 1, IPROT = 0, TID = 0*/
  388.         ori    r5,r5,_MMU_TLB_SZ_1M /* TS = 0, TSIZE = 64 MByte page size*/
  389.         mtspr  MAS1, r5
  390.         addis  r6,0,HI(CCSBAR) /* EPN = CCSBAR */
  391.         ori    r6,r6,0x000a          /* WIMGE = 01010 */
  392.         mtspr  MAS2, r6
  393.         addis  r7,0,HI(CCSBAR) /* RPN = CCSBAR */
  394.         ori    r7,r7,0x0015          /* Supervisor XWR*/
  395.         mtspr  MAS3, r7
  396.         isync
  397.         msync
  398.         tlbwe
  399.         tlbsync
  400. #ifdef INCLUDE_SYSLED
  401.         /*
  402.          * TLB1 #3.  LED - guarded 0xe8000000 -> 0xe8ffffff.
  403.  * 1MB
  404.          * Attributes: SX/SW/SR
  405.          */
  406.         addis  r4,0,0x1004           /* TLBSEL = TLB1(CAM) , ESEL = 4 */
  407.         ori    r4,r4,0x0000
  408.         mtspr  MAS0, r4
  409.         addis  r5,0,0xc000           /* V = 1, IPROT = 1, TID = 0*/
  410.         ori    r5,r5,_MMU_TLB_SZ_1M  /* TS = 0, TSIZE = 1 MByte page size*/
  411.         mtspr  MAS1, r5
  412.         addis  r6,0,HI(ALPHA_LED_BASE_ADRS)  /* EPN = 0xe8000000*/
  413.         ori    r6,r6,0x000a          /* WIMGE = 10110 */
  414.         mtspr  MAS2, r6
  415.         addis  r7,0,HI(ALPHA_LED_BASE_ADRS)  /* RPN = 0xe8000000*/
  416.         ori    r7,r7,0x0015          /* Supervisor XWR*/
  417.         mtspr  MAS3, r7
  418.         tlbwe
  419.         tlbsync
  420. #endif /* 
  421.         /********************************************/
  422.         /* Setup the memory mapped register address */
  423.         /*******************************************/
  424. isync
  425. sync
  426. lis     r6,HI(CCSBAR)           /* Load the new CCSBAR to r6 */
  427. ori     r6,r6, LO(CCSBAR)
  428. isync
  429.         /* CCSRBAR (Default value = 0xfffff700)
  430.          *        8        23
  431.          * +-----+-----------+-----+
  432.          * | --- | BASE_ADDR | --- |
  433.          * +-----+-----------+-----+
  434.          */
  435. srwi    r5, r6, 12              /* Adjust CCSBAR for BASE_ADDR field */
  436. lis     r7,HI(0xff700000)       /* Read current value of CCSRBAR */
  437. ori     r7,r7,LO(0xff700000)
  438. lwz     r4, 0(r7)
  439. isync
  440. sync
  441. mbar 0
  442. stw     r5,0(r7)                /* Write the new value to CCSRBAR */
  443. sync
  444. isync
  445. mbar 0
  446. lis    r5,0xffff                /* Perform a load of an address that */
  447. ori    r5, r5,0xf800            /* does not access configuration     */
  448. lwz    r4, 0 (r5)               /* space or the on-chip SRAM, but    */
  449. isync                           /* has an address mapping already in */
  450.                                         /* effect (e.g, boot ROM)            */
  451. li     r4,0x2000                /* Busy wait for 0x2000 loop */
  452. mtctr   r4
  453. ccsrbarWait:
  454. nop
  455. bdnz    ccsrbarWait
  456.         /**************************************/
  457.         /* Configure Memory Map for Local Bus */
  458.         /**************************************/
  459. /* Memory mapped region base address for Local Bus 0 and 1 */
  460. WRITEADR(r6,r7,M85XX_LAWBAR0(CCSBAR), 0xf0000)
  461. WRITEADR(r6,r7,M85XX_LAWAR0(CCSBAR),
  462.  LAWAR_ENABLE | LAWAR_TGTIF_LBC | LAWAR_SIZE_256MB )
  463. isync
  464.         /* Memory mapped region base address for Local Bus 2 */  
  465. WRITEADR(r6,r7,M85XX_LAWBAR2(CCSBAR), 0xe8000)
  466. WRITEADR(r6,r7,M85XX_LAWAR2(CCSBAR),
  467.  LAWAR_ENABLE | LAWAR_TGTIF_LBC | LAWAR_SIZE_128MB )
  468. isync
  469.         /* Flash 0 */
  470. /* load BR0 */
  471. WRITEADR(r6,r7,M85XX_BR0 (CCSBAR),0xf8001001)
  472. /* load OR0 */
  473. WRITEADR(r6,r7,M85XX_OR0 (CCSBAR),0xf8000ff7)
  474.         /* Flash 1 */
  475.         /* load BR1 */
  476.         WRITEADR(r6,r7,M85XX_BR1 (CCSBAR),0xf0001001)
  477.         /* load OR1 */
  478.         WRITEADR(r6,r7,M85XX_OR1 (CCSBAR),0xf8000ff7)
  479. #ifdef INCLUDE_SYSLED
  480.         /* Alphanumeric LED Display */
  481.         /* load BR2 */
  482.         WRITEADR(r6,r7,M85XX_BR2 (CCSBAR),0xe8000801)
  483.         /* load OR2 */
  484.         WRITEADR(r6,r7,M85XX_OR2 (CCSBAR),0xfff00ff7)
  485. #endif /* INCLUDE_SYSLED */
  486.         isync
  487. isync
  488. sync
  489. mbar 0
  490. /* Initialise the Local Bus Controller */
  491. li      r4,0x2000
  492. mtctr   r4
  493. WRITEADR(r6,r7,M85XX_DCR0(CCSBAR),0xbc0f1bf0)
  494. WRITEADR(r6,r7,M85XX_DCR1(CCSBAR),0x00078080)
  495. WRITEADR(r6,r7,M85XX_LCRR(CCSBAR),0x00000002)
  496. isync
  497. sync
  498. mbar 0
  499. dllDelay4:
  500. nop
  501. bdnz    dllDelay4
  502. /* Memory mapped region base address */
  503. WRITEADR(r6,r7,M85XX_LAWBAR1(CCSBAR),
  504.  DDR_SDRAM_LOCAL_ADRS >> LAWBAR_ADRS_SHIFT)
  505. WRITEADR(r6,r7,M85XX_LAWAR1(CCSBAR),
  506.  LAWAR_ENABLE | LAWAR_TGTIF_DDRSDRAM | LAWAR_SIZE_512MB )
  507. isync
  508.         /* POR PLL Status Register(PORPLLSR)
  509.          *    10        15       16             17         26        30
  510.          * +-+------------+--------------+--------------+-+------------+---+
  511.          * |-| e500_Ratio | PCI1_clk_sel | PCI2_clk_sel |-| Plat_Ratio | 0 |
  512.          * +-+------------+--------------+--------------+-+------------+---+
  513.          * e500_Ratio    Clock ratio between the e500 core and the CCB clock.
  514.          *               000010 1:1         000110 3:1
  515.          *               000011 3:2         000111 7:2
  516.          *               000100 2:1         001000 4:1
  517.          *               000101 5:2         001001 9:2
  518.          * PCI1_clk_sel  Clock used for PCI1/PCI-X
  519.          *               0 PCI1 runs off of PCI1_CLK
  520.          *               1 PCI1 runs off of SYSCLK
  521.          * PCI2_clk_sel  Clock used for PCI2
  522.          *               0 PCI2 runs off of PCI2_CLK
  523.          *               1 PCI2 runs off of SYSCLK
  524.          * Plat_Ratio    Clock ratio between the CCB clock and SYSCLK
  525.          *               00010 2:1, 00011 3:1, 00100 4:1, etc.,
  526.          */
  527. lis r7, HI(M85XX_PORPLLSR(CCSBAR))
  528. ori     r7, r7, LO(M85XX_PORPLLSR(CCSBAR))
  529. lwz     r7, 0(r7)
  530. andi.   r7, r7, 0x3e
  531. srwi    r7, r7, 1
  532. /* Get multiplier from table */
  533. lis     r8, HI(0xffffffff)
  534. ori     r8, r8, LO(platpllTable)
  535. add     r8, r8, r7
  536. lbz     r8, 0(r8)
  537. cmpwi   r8,0 /* Test for unsupported freq */
  538. beq     checkStop  /* Jump to 0 */
  539. /* Initialize the DDR Memory controller */
  540.         lis r6, HI(DDRBA)
  541.         ori r6, r6, LO(DDRBA) /* r6 = DDR base */
  542.         /* DDR SDRAM Clock Control (DDR_SDRAM_CLK_CNTL)
  543.          *        5          8
  544.          * +-----+------------+-----+
  545.          * | --- | CLK_ADJUST | --- |
  546.          * +-----+------------+-----+
  547.          * CLK_ADJUST  Clock adjust
  548.          *   0000 Clock will be launched aligned with address/command
  549.          *   0001 Clock will be launched 1/8 applied cycle after address/command
  550.          *    ....
  551.          *   0111 Clock will be launched 7/8 applied cycle after address/command
  552.          */
  553. WRITEOFFSET(r6,r7,(DDR_SDRAM_CLK_CTRL), 0x02000000)
  554.         /* Chip Select Memory Bound (CSn_BNDS)
  555.          *        4   15       20  31
  556.          * +-----+------+-----+------+
  557.          * | --- |  SA  | --- |  EA  |
  558.          * +-----+------+-----+------+
  559.          * SA  Starting address for chip select. This value is compared against
  560.          *     the 12 msbs of the 36-bit address.
  561.          * EA  Ending address for chip select.
  562.          * DDR SDRAM Address 0x0 0000 0000 - 0x0 1FFF FFFF (512 MB)
  563.          */
  564. WRITEOFFSET(r6,r7,(CS0_BNDS), 0x000001ff)
  565. WRITEOFFSET(r6,r7,(CS1_BNDS), 0x00000000)
  566. WRITEOFFSET(r6,r7,(CS2_BNDS), 0x00000000)
  567. WRITEOFFSET(r6,r7,(CS3_BNDS), 0x00000000)
  568.         /* Chip Select Configuration (CSn_CONFIG)
  569.          *     0           8    9         11     13        15
  570.          * +-------+---+-------+------------+---+------------+
  571.          * | CS_EN | - | AP_EN | ODT_RD_CFG | - | ODT_WR_CFG |
  572.          * +-------+---+-------+------------+---+------------+
  573.          *  16        17     21         23     29         31
  574.          * +------------+---+-------------+---+-------------+
  575.          * | BA_BITS_CS | - | ROW_BITS_CS | - | COL_BITS_CS |
  576.          * +------------+---+-------------+---+-------------+
  577.          * CS_EN        Chip select enable
  578.          * AP_EN        Chip select auto-precharge enable
  579.          * ODT_RD_CFG   ODT for read configuration. Only for DDR2.
  580.          * ODT_WR_CFG   ODT for write configuration. Only for DDR2.
  581.          * BA_BITS_CS   Number of bank bits for SDRAM on chip select.
  582.          *              00  2 logical bank bits
  583.          *              01  3 logical bank bits
  584.          * ROW_BITS_CS  Number of row bits for SDRAM on chip select.
  585.          *              000  12 row bits     011  15 row bits
  586.          *              001  13 row bits     100  16 row bits
  587.          *              010  14 row bits
  588.          * COL_BITS_CS  Number of column bit on chip select. (For DDR)
  589.          *              000  8 column bits   010  10 column bits
  590.          *              001  9 column bits   011  11 column bits
  591.          * Micron DDR SDRAM
  592.          *
  593.          *                MT9VDDT3272H MT9VDDT6472H    MT9VDDT12872H
  594.          * Size           256MB        512MB           1GB
  595.          * Refresh count  8K           8K              8K
  596.          * Row addr       8K(A0-A12)   8K(A0-A12)      16K(A0-A13)
  597.          * Device bank    4(BA0,BA1)   4(BA0,BA1)      4(BA0,BA1)
  598.          * Column addr    1K(A0-A9)    2K(A0-A9, A11)  2K(A0-A9, A11)
  599.          * Module Rank    1(S0#)       1(S0#)          1(S0#)
  600.          */
  601. WRITEOFFSET(r6,r7,(CS0_CONFIG), 0x80800103)
  602. WRITEOFFSET(r6,r7,(CS1_CONFIG), 0x00000000)
  603. WRITEOFFSET(r6,r7,(CS2_CONFIG), 0x00000000)
  604. WRITEOFFSET(r6,r7,(CS3_CONFIG), 0x00000000)
  605. /* Assume that platform ratio is correctly set to 400MHz */
  606. DDRInit400:
  607.         /* clock will be launched 1/2 applied cycle after address/command */
  608. WRITEOFFSET(r6,r7,(DDR_SDRAM_CLK_CTRL), 0x02000000)
  609.         /* tRFC = 70ns = 14 clk (at 200MHz) */ 
  610. WRITEOFFSET(r6,r7,(EXTENDED_REF_REC), 0x00010000)
  611.         /*
  612.          * RWT          Read-to-write turnaround. (default CL - WL + BL/2 + 2)
  613.          * WRT          Write-to-read turnaround. (default WL - CL + BL/2 + 1)
  614.          * RRT          Read-to-read turnaround. (default 3 cycles)
  615.          * WWT          Write-to-write turnaround. (default 2 cycles)
  616.          * ACT_PD_EXT   Active powerdown exit timing.
  617.          * PRE_PD_EXIT  Precharge powerdown exit timing.
  618.          * ODT_PD_EXIT  ODT powerdown exit timing.
  619.          * MRS_CYC      Mode register set cycle time.
  620.          */
  621. WRITEOFFSET(r6,r7,(TIMING_CFG_0), 0x3f110102)
  622.         /* PRETOACT(tRP)   15ns  (3 clk)
  623.          * ACTTOPRE(tRAS)  40ns  (8 clk)
  624.          * ACTTORW(tRCD)   15ns  (3 clk)
  625.          * CASLAT                (2 clk)
  626.          * REFREC(tRFC)    70ns  (14 clk)
  627.          * WRREC(tWR)      15ns  (3 clk)
  628.          * ACTTOACT(tRRD)  10ns  (2 clk)
  629.          * WRTORD(tWTR)          (2 clk)
  630.          */
  631. WRITEOFFSET(r6,r7,(TIMING_CFG_1), 0x30356322)
  632.         /* ADD_LAT         0
  633.          * CPO             %11111 (auto calibration)
  634.          * WR_LAT          4 cycles
  635.          * RD_TO_PRE       2 cycles
  636.          * WR_DATA_DELAY   1 (2/8 clk delay)
  637.          * CKE_PLS         3 cycles
  638.          * FOUR_ACT        7 cycles
  639.          */ 
  640. WRITEOFFSET(r6,r7,(TIMING_CFG_2), 0x0f884441)
  641.         /* Enable DDR interface only after all DDR registers are configured. */ 
  642. #ifdef INCLUDE_DDR_ECC
  643. WRITEOFFSET(r6,r7,(DDR_SDRAM_CFG), 0x62208000)
  644. #else /* INCLUDE_DDR_ECC */
  645. WRITEOFFSET(r6,r7,(DDR_SDRAM_CFG), 0x42208000)
  646. #endif /* INCLUDE_DDR_ECC */
  647.         /* */
  648. WRITEOFFSET(r6,r7,(DDR_SDRAM_CFG_2), 0x00001000)
  649.         /* SDMODE = Normal, CL(3), Sequential, Burst(4 bytes) */
  650. WRITEOFFSET(r6,r7,(DDR_SDRAM_MODE_CFG), 0x40000132)
  651. WRITEOFFSET(r6,r7,(DDR_SDRAM_MODE_CFG_2), 0x00000000)
  652. WRITEOFFSET(r6,r7,(DDR_SDRAM_MD_CNTL), 0x0)
  653.         /* Refresh Interfal (tREFI) = 7.8us (1560clk) */
  654. WRITEOFFSET(r6,r7,(DDR_SDRAM_INTERVAL), 0x05080000)
  655. WRITEOFFSET(r6,r7,(DDR_DATA_INIT), 0x0000000)
  656. #if 0
  657. WRITEOFFSET(r6,r7,(0xf08), 0x0000200)
  658. #endif
  659. finalDDRInit:
  660. lis    r4,HI(CCSBAR|DDR_IO_OVCR)
  661. ori    r4,r4,LO(CCSBAR|DDR_IO_OVCR)
  662. lis    r7,0x9000
  663. stw    r7,0(r4)
  664.    isync
  665. li      r4,0x2000
  666. mtctr   r4
  667. ddrDelay:
  668. nop
  669. bdnz    ddrDelay
  670. #ifdef INCLUDE_DDR_ECC
  671. WRITEOFFSET(r6,r7,(DDR_SDRAM_CFG), 0xE2208000)
  672. #else /* INCLUDE_DDR_ECC */
  673. WRITEOFFSET(r6,r7,(DDR_SDRAM_CFG), 0xC2208000)
  674. #endif /* INCLUDE_DDR_ECC */
  675. isync
  676. /*
  677.  * Now that memory is stable we reset TLB entries for standard
  678.  * operation
  679.  */
  680.         /*
  681.          * TLB1 #0.  ROM - writethrough cached 0xf0000000 -> 0xffffffff.
  682.  * 256MB
  683.          * Attributes: SX/SW/SR **PROTECTED**
  684.          */
  685.         addis  r4,0,0x1000           /* TLBSEL = TLB1(CAM) , ESEL = 0 */
  686.         ori    r4,r4,0x0000
  687.         mtspr  MAS0, r4
  688.         addis  r5,0,0xc000           /* V = 1, IPROT = 1, TID = 0*/
  689.         ori    r5,r5,_MMU_TLB_SZ_256M  /* TS = 0, TSIZE = 16 MByte page size*/
  690.         mtspr  MAS1, r5
  691.         addis  r6,0,0xf000           /* EPN = 0xf0000000*/
  692.         ori    r6,r6,0x0016          /* WIMGE = 10110 */
  693.         mtspr  MAS2, r6
  694.         addis  r7,0,0xf000           /* RPN = 0xf0000000*/
  695.         ori    r7,r7,0x0015          /* Supervisor XWR*/
  696.         mtspr  MAS3, r7
  697.         tlbwe
  698.         tlbsync
  699.         /*
  700.          * TLB1 #1.  Main SDRAM - Cached with Coherence
  701.  * LOCAL_MEM_LOCAL_ADRS -> LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE
  702.          * Attributes: UX/UW/UR/SX/SW/SR
  703.          */
  704.         addis  r4,0,0x1001           /* TLBSEL = TLB1(CAM) , ESEL = 1*/
  705.         ori    r4,r4,0x0000
  706.         mtspr  MAS0, r4
  707.         addis  r5,0,0xc000           /* V = 1, IPROT = 1, TID = 0*/
  708.         ori    r5,r5,_MMU_TLB_SZ_256M  /* TS = 0, TSIZE = 512 MByte page size*/
  709.         mtspr  MAS1, r5
  710.         addis  r6,0,HI(LOCAL_MEM_LOCAL_ADRS) /* EPN = LOCAL_MEM_LOCAL_ADRS */
  711.         ori    r6,r6,0x0004          /* WIMGE = 00000 */
  712.         mtspr  MAS2, r6
  713.         addis  r7,0,HI(LOCAL_MEM_LOCAL_ADRS)  /* RPN = LOCAL_MEM_LOCAL_ADRS */
  714.         ori    r7,r7,0x003f          /* User/Supervisor XWR*/
  715.         mtspr  MAS3, r7
  716.         tlbwe
  717.         tlbsync
  718. #if (LOCAL_MEM_SIZE > 0x10000000)
  719.         /*
  720.          * TLB1 #3.  Main SDRAM - Cached with Coherence
  721.  * LOCAL_MEM_LOCAL_ADRS -> LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE
  722.          * Attributes: UX/UW/UR/SX/SW/SR
  723.          */
  724.         addis  r4,0,0x1003           /* TLBSEL = TLB1(CAM) , ESEL = 3*/
  725.         ori    r4,r4,0x0000
  726.         mtspr  MAS0, r4
  727.         addis  r5,0,0xc000           /* V = 1, IPROT = 1, TID = 0*/
  728.         ori    r5,r5,_MMU_TLB_SZ_256M  /* TS = 0, TSIZE = 512 MByte page size*/
  729.         mtspr  MAS1, r5
  730.         addis  r6,0,HI(LOCAL_MEM_LOCAL_ADRS + 0x10000000) /* EPN = LOCAL_MEM_LOCAL_ADRS */
  731.         ori    r6,r6,0x0004          /* WIMGE = 00000 */
  732.         mtspr  MAS2, r6
  733.         addis  r7,0,HI(LOCAL_MEM_LOCAL_ADRS + 0x10000000)  /* RPN = LOCAL_MEM_LOCAL_ADRS */
  734.         ori    r7,r7,0x003f          /* User/Supervisor XWR*/
  735.         mtspr  MAS3, r7
  736.         tlbwe
  737.         tlbsync
  738. #endif
  739.         /*
  740.          * TLB1 #2.  CCSRBAR - guarded 0xe0000000 -> 0xe0ffffff.
  741.  * 1MB
  742.          * Attributes: SX/SW/SR
  743.          */
  744.         addis  r4,0,0x1002           /* TLBSEL = TLB1(CAM) , ESEL = 2 */
  745.         ori    r4,r4,0x0000
  746.         mtspr  MAS0, r4
  747.         addis  r5,0,0xc000           /* V = 1, IPROT = 0, TID = 0*/
  748.         ori    r5,r5,_MMU_TLB_SZ_1M  /* TS = 0, TSIZE = 1 MByte page size*/
  749.         mtspr  MAS1, r5
  750.         addis  r6,0,HI(CCSBAR)           /* EPN = 0xe0000000*/
  751.         ori    r6,r6,0x000a          /* WIMGE = 10110 */
  752.         mtspr  MAS2, r6
  753.         addis  r7,0,HI(CCSBAR)           /* RPN = 0xe0000000*/
  754.         ori    r7,r7,0x003f          /* Supervisor XWR*/
  755.         mtspr  MAS3, r7
  756.         tlbwe
  757.         tlbsync
  758. #ifdef INCLUDE_SYSLED
  759.         /*
  760.          * TLB1 #4.  LED - guarded 0xe8000000 -> 0xe8ffffff.
  761.  * 1MB
  762.          * Attributes: SX/SW/SR
  763.          */
  764.         addis  r4,0,0x1004           /* TLBSEL = TLB1(CAM) , ESEL = 4 */
  765.         ori    r4,r4,0x0000
  766.         mtspr  MAS0, r4
  767.         addis  r5,0,0xc000           /* V = 1, IPROT = 0, TID = 0*/
  768.         ori    r5,r5,_MMU_TLB_SZ_1M  /* TS = 0, TSIZE = 1 MByte page size*/
  769.         mtspr  MAS1, r5
  770.         addis  r6,0,HI(ALPHA_LED_BASE_ADRS)  /* EPN = 0xe8000000*/
  771.         ori    r6,r6,0x000a          /* WIMGE = 10110 */
  772.         mtspr  MAS2, r6
  773.         addis  r7,0,HI(ALPHA_LED_BASE_ADRS)  /* RPN = 0xe8000000*/
  774.         ori    r7,r7,0x003f          /* Supervisor XWR*/
  775.         mtspr  MAS3, r7
  776.         tlbwe
  777.         tlbsync
  778. #endif /* INCLUDE_SYSLED */
  779.         b  cold
  780. checkStop:
  781. ba 0x0
  782. FUNC_END(resetEntry)
  783. #if   defined(_GNU_TOOL)
  784. .section .reset, "ax", @progbits
  785. #elif defined(_DIAB_TOOL)
  786. .section .reset, 4, "rx"
  787. #else
  788. #error "Please add a correctly spelled .section directive for your toolchain."
  789. #endif
  790. FUNC_BEGIN(resetVector)
  791. b resetEntry
  792. FUNC_END(resetVector)