Path: blob/master/arch/m68k/platform/68360/head-ram.S
10819 views
/* arch/m68knommu/platform/68360/head-ram.S1*2* Startup code for Motorola 683603*4* Copyright 2001 (C) SED Systems, a Division of Calian Ltd.5* Based on: arch/m68knommu/platform/68328/pilot/crt0_rom.S6* Based on: arch/m68knommu/platform/68360/uCquicc/crt0_rom.S, 2.0.38.1.pre77* uClinux Kernel8* Copyright (C) Michael Leslie <[email protected]>9* Based on: arch/m68knommu/platform/68EZ328/ucsimm/crt0_rom.S10* Copyright (C) 1998 D. Jeff Dionne <[email protected]>,11*12*/13#define ASSEMBLY1415.global _stext16.global _start1718.global _rambase19.global _ramvec20.global _ramstart21.global _ramend2223.global _quicc_base24.global _periph_base2526#define RAMEND (CONFIG_RAMBASE + CONFIG_RAMSIZE)27#define ROMEND (CONFIG_ROMBASE + CONFIG_ROMSIZE)2829#define REGB 0x100030#define PEPAR (_dprbase + REGB + 0x0016)31#define GMR (_dprbase + REGB + 0x0040)32#define OR0 (_dprbase + REGB + 0x0054)33#define BR0 (_dprbase + REGB + 0x0050)34#define OR1 (_dprbase + REGB + 0x0064)35#define BR1 (_dprbase + REGB + 0x0060)36#define OR4 (_dprbase + REGB + 0x0094)37#define BR4 (_dprbase + REGB + 0x0090)38#define OR6 (_dprbase + REGB + 0x00b4)39#define BR6 (_dprbase + REGB + 0x00b0)40#define OR7 (_dprbase + REGB + 0x00c4)41#define BR7 (_dprbase + REGB + 0x00c0)4243#define MCR (_dprbase + REGB + 0x0000)44#define AVR (_dprbase + REGB + 0x0008)4546#define SYPCR (_dprbase + REGB + 0x0022)4748#define PLLCR (_dprbase + REGB + 0x0010)49#define CLKOCR (_dprbase + REGB + 0x000C)50#define CDVCR (_dprbase + REGB + 0x0014)5152#define BKAR (_dprbase + REGB + 0x0030)53#define BKCR (_dprbase + REGB + 0x0034)54#define SWIV (_dprbase + REGB + 0x0023)55#define PICR (_dprbase + REGB + 0x0026)56#define PITR (_dprbase + REGB + 0x002A)5758/* Define for all memory configuration */59#define MCU_SIM_GMR 0x0000000060#define SIM_OR_MASK 0x0fffffff6162/* Defines for chip select zero - the flash */63#define SIM_OR0_MASK 0x2000000264#define SIM_BR0_MASK 0x00000001656667/* Defines for chip select one - the RAM */68#define SIM_OR1_MASK 0x1000000069#define SIM_BR1_MASK 0x000000017071#define MCU_SIM_MBAR_ADRS 0x0003ff0072#define MCU_SIM_MBAR_BA_MASK 0xfffff00073#define MCU_SIM_MBAR_AS_MASK 0x000000017475#define MCU_SIM_PEPAR 0x00B47677#define MCU_DISABLE_INTRPTS 0x270078#define MCU_SIM_AVR 0x007980#define MCU_SIM_MCR 0x00005cff8182#define MCU_SIM_CLKOCR 0x0083#define MCU_SIM_PLLCR 0x800084#define MCU_SIM_CDVCR 0x00008586#define MCU_SIM_SYPCR 0x000087#define MCU_SIM_SWIV 0x0088#define MCU_SIM_PICR 0x000089#define MCU_SIM_PITR 0x0000909192#include <asm/m68360_regs.h>939495/*96* By the time this RAM specific code begins to execute, DPRAM97* and DRAM should already be mapped and accessible.98*/99100.text101_start:102_stext:103nop104ori.w #MCU_DISABLE_INTRPTS, %sr /* disable interrupts: */105/* We should not need to setup the boot stack the reset should do it. */106movea.l #RAMEND, %sp /*set up stack at the end of DRAM:*/107108set_mbar_register:109moveq.l #0x07, %d1 /* Setup MBAR */110movec %d1, %dfc111112lea.l MCU_SIM_MBAR_ADRS, %a0113move.l #_dprbase, %d0114andi.l #MCU_SIM_MBAR_BA_MASK, %d0115ori.l #MCU_SIM_MBAR_AS_MASK, %d0116moves.l %d0, %a0@117118moveq.l #0x05, %d1119movec.l %d1, %dfc120121/* Now we can begin to access registers in DPRAM */122123set_sim_mcr:124/* Set Module Configuration Register */125move.l #MCU_SIM_MCR, MCR126127/* to do: Determine cause of reset */128129/*130* configure system clock MC68360 p. 6-40131* (value +1)*osc/128 = system clock132*/133set_sim_clock:134move.w #MCU_SIM_PLLCR, PLLCR135move.b #MCU_SIM_CLKOCR, CLKOCR136move.w #MCU_SIM_CDVCR, CDVCR137138/* Wait for the PLL to settle */139move.w #16384, %d0140pll_settle_wait:141subi.w #1, %d0142bne pll_settle_wait143144/* Setup the system protection register, and watchdog timer register */145move.b #MCU_SIM_SWIV, SWIV146move.w #MCU_SIM_PICR, PICR147move.w #MCU_SIM_PITR, PITR148move.w #MCU_SIM_SYPCR, SYPCR149150/* Clear DPRAM - system + parameter */151movea.l #_dprbase, %a0152movea.l #_dprbase+0x2000, %a1153154/* Copy 0 to %a0 until %a0 == %a1 */155clear_dpram:156movel #0, %a0@+157cmpal %a0, %a1158bhi clear_dpram159160configure_memory_controller:161/* Set up Global Memory Register (GMR) */162move.l #MCU_SIM_GMR, %d0163move.l %d0, GMR164165configure_chip_select_0:166move.l #RAMEND, %d0167subi.l #__ramstart, %d0168subq.l #0x01, %d0169eori.l #SIM_OR_MASK, %d0170ori.l #SIM_OR0_MASK, %d0171move.l %d0, OR0172173move.l #__ramstart, %d0174ori.l #SIM_BR0_MASK, %d0175move.l %d0, BR0176177configure_chip_select_1:178move.l #ROMEND, %d0179subi.l #__rom_start, %d0180subq.l #0x01, %d0181eori.l #SIM_OR_MASK, %d0182ori.l #SIM_OR1_MASK, %d0183move.l %d0, OR1184185move.l #__rom_start, %d0186ori.l #SIM_BR1_MASK, %d0187move.l %d0, BR1188189move.w #MCU_SIM_PEPAR, PEPAR190191/* point to vector table: */192move.l #_romvec, %a0193move.l #_ramvec, %a1194copy_vectors:195move.l %a0@, %d0196move.l %d0, %a1@197move.l %a0@, %a1@198addq.l #0x04, %a0199addq.l #0x04, %a1200cmp.l #_start, %a0201blt copy_vectors202203move.l #_ramvec, %a1204movec %a1, %vbr205206207/* Copy data segment from ROM to RAM */208moveal #_stext, %a0209moveal #_sdata, %a1210moveal #_edata, %a2211212/* Copy %a0 to %a1 until %a1 == %a2 */213LD1:214move.l %a0@, %d0215addq.l #0x04, %a0216move.l %d0, %a1@217addq.l #0x04, %a1218cmp.l #_edata, %a1219blt LD1220221moveal #_sbss, %a0222moveal #_ebss, %a1223224/* Copy 0 to %a0 until %a0 == %a1 */225L1:226movel #0, %a0@+227cmpal %a0, %a1228bhi L1229230load_quicc:231move.l #_dprbase, _quicc_base232233store_ram_size:234/* Set ram size information */235move.l #_sdata, _rambase236move.l #_ebss, _ramstart237move.l #RAMEND, %d0238sub.l #0x1000, %d0 /* Reserve 4K for stack space.*/239move.l %d0, _ramend /* Different from RAMEND.*/240241pea 0242pea env243pea %sp@(4)244pea 0245246lea init_thread_union, %a2247lea 0x2000(%a2), %sp248249lp:250jsr start_kernel251252_exit:253jmp _exit254255256.data257.align 4258env:259.long 0260_quicc_base:261.long 0262_periph_base:263.long 0264_ramvec:265.long 0266_rambase:267.long 0268_ramstart:269.long 0270_ramend:271.long 0272_dprbase:273.long 0xffffe000274275.text276277/*278* These are the exception vectors at boot up, they are copied into RAM279* and then overwritten as needed.280*/281282.section ".data..initvect","awx"283.long RAMEND /* Reset: Initial Stack Pointer - 0. */284.long _start /* Reset: Initial Program Counter - 1. */285.long buserr /* Bus Error - 2. */286.long trap /* Address Error - 3. */287.long trap /* Illegal Instruction - 4. */288.long trap /* Divide by zero - 5. */289.long trap /* CHK, CHK2 Instructions - 6. */290.long trap /* TRAPcc, TRAPV Instructions - 7. */291.long trap /* Privilege Violation - 8. */292.long trap /* Trace - 9. */293.long trap /* Line 1010 Emulator - 10. */294.long trap /* Line 1111 Emualtor - 11. */295.long trap /* Harware Breakpoint - 12. */296.long trap /* (Reserved for Coprocessor Protocol Violation)- 13. */297.long trap /* Format Error - 14. */298.long trap /* Uninitialized Interrupt - 15. */299.long trap /* (Unassigned, Reserver) - 16. */300.long trap /* (Unassigned, Reserver) - 17. */301.long trap /* (Unassigned, Reserver) - 18. */302.long trap /* (Unassigned, Reserver) - 19. */303.long trap /* (Unassigned, Reserver) - 20. */304.long trap /* (Unassigned, Reserver) - 21. */305.long trap /* (Unassigned, Reserver) - 22. */306.long trap /* (Unassigned, Reserver) - 23. */307.long trap /* Spurious Interrupt - 24. */308.long trap /* Level 1 Interrupt Autovector - 25. */309.long trap /* Level 2 Interrupt Autovector - 26. */310.long trap /* Level 3 Interrupt Autovector - 27. */311.long trap /* Level 4 Interrupt Autovector - 28. */312.long trap /* Level 5 Interrupt Autovector - 29. */313.long trap /* Level 6 Interrupt Autovector - 30. */314.long trap /* Level 7 Interrupt Autovector - 31. */315.long system_call /* Trap Instruction Vectors 0 - 32. */316.long trap /* Trap Instruction Vectors 1 - 33. */317.long trap /* Trap Instruction Vectors 2 - 34. */318.long trap /* Trap Instruction Vectors 3 - 35. */319.long trap /* Trap Instruction Vectors 4 - 36. */320.long trap /* Trap Instruction Vectors 5 - 37. */321.long trap /* Trap Instruction Vectors 6 - 38. */322.long trap /* Trap Instruction Vectors 7 - 39. */323.long trap /* Trap Instruction Vectors 8 - 40. */324.long trap /* Trap Instruction Vectors 9 - 41. */325.long trap /* Trap Instruction Vectors 10 - 42. */326.long trap /* Trap Instruction Vectors 11 - 43. */327.long trap /* Trap Instruction Vectors 12 - 44. */328.long trap /* Trap Instruction Vectors 13 - 45. */329.long trap /* Trap Instruction Vectors 14 - 46. */330.long trap /* Trap Instruction Vectors 15 - 47. */331.long 0 /* (Reserved for Coprocessor) - 48. */332.long 0 /* (Reserved for Coprocessor) - 49. */333.long 0 /* (Reserved for Coprocessor) - 50. */334.long 0 /* (Reserved for Coprocessor) - 51. */335.long 0 /* (Reserved for Coprocessor) - 52. */336.long 0 /* (Reserved for Coprocessor) - 53. */337.long 0 /* (Reserved for Coprocessor) - 54. */338.long 0 /* (Reserved for Coprocessor) - 55. */339.long 0 /* (Reserved for Coprocessor) - 56. */340.long 0 /* (Reserved for Coprocessor) - 57. */341.long 0 /* (Reserved for Coprocessor) - 58. */342.long 0 /* (Unassigned, Reserved) - 59. */343.long 0 /* (Unassigned, Reserved) - 60. */344.long 0 /* (Unassigned, Reserved) - 61. */345.long 0 /* (Unassigned, Reserved) - 62. */346.long 0 /* (Unassigned, Reserved) - 63. */347/* The assignment of these vectors to the CPM is */348/* dependent on the configuration of the CPM vba */349/* fields. */350.long 0 /* (User-Defined Vectors 1) CPM Error - 64. */351.long 0 /* (User-Defined Vectors 2) CPM Parallel IO PC11- 65. */352.long 0 /* (User-Defined Vectors 3) CPM Parallel IO PC10- 66. */353.long 0 /* (User-Defined Vectors 4) CPM SMC2 / PIP - 67. */354.long 0 /* (User-Defined Vectors 5) CPM SMC1 - 68. */355.long 0 /* (User-Defined Vectors 6) CPM SPI - 69. */356.long 0 /* (User-Defined Vectors 7) CPM Parallel IO PC9 - 70. */357.long 0 /* (User-Defined Vectors 8) CPM Timer 4 - 71. */358.long 0 /* (User-Defined Vectors 9) CPM Reserved - 72. */359.long 0 /* (User-Defined Vectors 10) CPM Parallel IO PC8- 73. */360.long 0 /* (User-Defined Vectors 11) CPM Parallel IO PC7- 74. */361.long 0 /* (User-Defined Vectors 12) CPM Parallel IO PC6- 75. */362.long 0 /* (User-Defined Vectors 13) CPM Timer 3 - 76. */363.long 0 /* (User-Defined Vectors 14) CPM Reserved - 77. */364.long 0 /* (User-Defined Vectors 15) CPM Parallel IO PC5- 78. */365.long 0 /* (User-Defined Vectors 16) CPM Parallel IO PC4- 79. */366.long 0 /* (User-Defined Vectors 17) CPM Reserved - 80. */367.long 0 /* (User-Defined Vectors 18) CPM RISC Timer Tbl - 81. */368.long 0 /* (User-Defined Vectors 19) CPM Timer 2 - 82. */369.long 0 /* (User-Defined Vectors 21) CPM Reserved - 83. */370.long 0 /* (User-Defined Vectors 22) CPM IDMA2 - 84. */371.long 0 /* (User-Defined Vectors 23) CPM IDMA1 - 85. */372.long 0 /* (User-Defined Vectors 24) CPM SDMA Bus Err - 86. */373.long 0 /* (User-Defined Vectors 25) CPM Parallel IO PC3- 87. */374.long 0 /* (User-Defined Vectors 26) CPM Parallel IO PC2- 88. */375.long 0 /* (User-Defined Vectors 27) CPM Timer 1 - 89. */376.long 0 /* (User-Defined Vectors 28) CPM Parallel IO PC1- 90. */377.long 0 /* (User-Defined Vectors 29) CPM SCC 4 - 91. */378.long 0 /* (User-Defined Vectors 30) CPM SCC 3 - 92. */379.long 0 /* (User-Defined Vectors 31) CPM SCC 2 - 93. */380.long 0 /* (User-Defined Vectors 32) CPM SCC 1 - 94. */381.long 0 /* (User-Defined Vectors 33) CPM Parallel IO PC0- 95. */382/* I don't think anything uses the vectors after here. */383.long 0 /* (User-Defined Vectors 34) - 96. */384.long 0,0,0,0,0 /* (User-Defined Vectors 35 - 39). */385.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 40 - 49). */386.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 50 - 59). */387.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 60 - 69). */388.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 70 - 79). */389.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 80 - 89). */390.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 90 - 99). */391.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 100 - 109). */392.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 110 - 119). */393.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 120 - 129). */394.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 130 - 139). */395.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 140 - 149). */396.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 150 - 159). */397.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 160 - 169). */398.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 170 - 179). */399.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 180 - 189). */400.long 0,0,0 /* (User-Defined Vectors 190 - 192). */401.text402ignore: rte403404405