Path: blob/master/arch/m68k/platform/68360/head-rom.S
10819 views
/* arch/m68knommu/platform/68360/head-rom.S1*2* Startup code for Motorola 683603*4* Copyright (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*/1314.global _stext15.global _sbss16.global _start1718.global _rambase19.global _ramvec20.global _ramstart21.global _ramend2223.global _quicc_base24.global _periph_base2526#define RAMEND (CONFIG_RAMBASE + CONFIG_RAMSIZE)2728#define REGB 0x100029#define PEPAR (_dprbase + REGB + 0x0016)30#define GMR (_dprbase + REGB + 0x0040)31#define OR0 (_dprbase + REGB + 0x0054)32#define BR0 (_dprbase + REGB + 0x0050)3334#define OR1 (_dprbase + REGB + 0x0064)35#define BR1 (_dprbase + REGB + 0x0060)3637#define OR2 (_dprbase + REGB + 0x0074)38#define BR2 (_dprbase + REGB + 0x0070)3940#define OR3 (_dprbase + REGB + 0x0084)41#define BR3 (_dprbase + REGB + 0x0080)4243#define OR4 (_dprbase + REGB + 0x0094)44#define BR4 (_dprbase + REGB + 0x0090)4546#define OR5 (_dprbase + REGB + 0x00A4)47#define BR5 (_dprbase + REGB + 0x00A0)4849#define OR6 (_dprbase + REGB + 0x00b4)50#define BR6 (_dprbase + REGB + 0x00b0)5152#define OR7 (_dprbase + REGB + 0x00c4)53#define BR7 (_dprbase + REGB + 0x00c0)5455#define MCR (_dprbase + REGB + 0x0000)56#define AVR (_dprbase + REGB + 0x0008)5758#define SYPCR (_dprbase + REGB + 0x0022)5960#define PLLCR (_dprbase + REGB + 0x0010)61#define CLKOCR (_dprbase + REGB + 0x000C)62#define CDVCR (_dprbase + REGB + 0x0014)6364#define BKAR (_dprbase + REGB + 0x0030)65#define BKCR (_dprbase + REGB + 0x0034)66#define SWIV (_dprbase + REGB + 0x0023)67#define PICR (_dprbase + REGB + 0x0026)68#define PITR (_dprbase + REGB + 0x002A)6970/* Define for all memory configuration */71#define MCU_SIM_GMR 0x0000000072#define SIM_OR_MASK 0x0fffffff7374/* Defines for chip select zero - the flash */75#define SIM_OR0_MASK 0x2000000076#define SIM_BR0_MASK 0x000000017778/* Defines for chip select one - the RAM */79#define SIM_OR1_MASK 0x1000000080#define SIM_BR1_MASK 0x000000018182#define MCU_SIM_MBAR_ADRS 0x0003ff0083#define MCU_SIM_MBAR_BA_MASK 0xfffff00084#define MCU_SIM_MBAR_AS_MASK 0x000000018586#define MCU_SIM_PEPAR 0x00B48788#define MCU_DISABLE_INTRPTS 0x270089#define MCU_SIM_AVR 0x009091#define MCU_SIM_MCR 0x00005cff9293#define MCU_SIM_CLKOCR 0x0094#define MCU_SIM_PLLCR 0x800095#define MCU_SIM_CDVCR 0x00009697#define MCU_SIM_SYPCR 0x000098#define MCU_SIM_SWIV 0x0099#define MCU_SIM_PICR 0x0000100#define MCU_SIM_PITR 0x0000101102103#include <asm/m68360_regs.h>104105106/*107* By the time this RAM specific code begins to execute, DPRAM108* and DRAM should already be mapped and accessible.109*/110111.text112_start:113_stext:114nop115ori.w #MCU_DISABLE_INTRPTS, %sr /* disable interrupts: */116/* We should not need to setup the boot stack the reset should do it. */117movea.l #RAMEND, %sp /* set up stack at the end of DRAM:*/118119120set_mbar_register:121moveq.l #0x07, %d1 /* Setup MBAR */122movec %d1, %dfc123124lea.l MCU_SIM_MBAR_ADRS, %a0125move.l #_dprbase, %d0126andi.l #MCU_SIM_MBAR_BA_MASK, %d0127ori.l #MCU_SIM_MBAR_AS_MASK, %d0128moves.l %d0, %a0@129130moveq.l #0x05, %d1131movec.l %d1, %dfc132133/* Now we can begin to access registers in DPRAM */134135set_sim_mcr:136/* Set Module Configuration Register */137move.l #MCU_SIM_MCR, MCR138139/* to do: Determine cause of reset */140141/*142* configure system clock MC68360 p. 6-40143* (value +1)*osc/128 = system clock144* or145* (value + 1)*osc = system clock146* You do not need to divide the oscillator by 128 unless you want to.147*/148set_sim_clock:149move.w #MCU_SIM_PLLCR, PLLCR150move.b #MCU_SIM_CLKOCR, CLKOCR151move.w #MCU_SIM_CDVCR, CDVCR152153/* Wait for the PLL to settle */154move.w #16384, %d0155pll_settle_wait:156subi.w #1, %d0157bne pll_settle_wait158159/* Setup the system protection register, and watchdog timer register */160move.b #MCU_SIM_SWIV, SWIV161move.w #MCU_SIM_PICR, PICR162move.w #MCU_SIM_PITR, PITR163move.w #MCU_SIM_SYPCR, SYPCR164165/* Clear DPRAM - system + parameter */166movea.l #_dprbase, %a0167movea.l #_dprbase+0x2000, %a1168169/* Copy 0 to %a0 until %a0 == %a1 */170clear_dpram:171movel #0, %a0@+172cmpal %a0, %a1173bhi clear_dpram174175configure_memory_controller:176/* Set up Global Memory Register (GMR) */177move.l #MCU_SIM_GMR, %d0178move.l %d0, GMR179180configure_chip_select_0:181move.l #0x00400000, %d0182subq.l #0x01, %d0183eori.l #SIM_OR_MASK, %d0184ori.l #SIM_OR0_MASK, %d0185move.l %d0, OR0186187move.l #__rom_start, %d0188ori.l #SIM_BR0_MASK, %d0189move.l %d0, BR0190191move.l #0x0, BR1192move.l #0x0, BR2193move.l #0x0, BR3194move.l #0x0, BR4195move.l #0x0, BR5196move.l #0x0, BR6197move.l #0x0, BR7198199move.w #MCU_SIM_PEPAR, PEPAR200201/* point to vector table: */202move.l #_romvec, %a0203move.l #_ramvec, %a1204copy_vectors:205move.l %a0@, %d0206move.l %d0, %a1@207move.l %a0@, %a1@208addq.l #0x04, %a0209addq.l #0x04, %a1210cmp.l #_start, %a0211blt copy_vectors212213move.l #_ramvec, %a1214movec %a1, %vbr215216217/* Copy data segment from ROM to RAM */218moveal #_etext, %a0219moveal #_sdata, %a1220moveal #_edata, %a2221222/* Copy %a0 to %a1 until %a1 == %a2 */223LD1:224move.l %a0@, %d0225addq.l #0x04, %a0226move.l %d0, %a1@227addq.l #0x04, %a1228cmp.l #_edata, %a1229blt LD1230231moveal #_sbss, %a0232moveal #_ebss, %a1233234/* Copy 0 to %a0 until %a0 == %a1 */235L1:236movel #0, %a0@+237cmpal %a0, %a1238bhi L1239240load_quicc:241move.l #_dprbase, _quicc_base242243store_ram_size:244/* Set ram size information */245move.l #_sdata, _rambase246move.l #_ebss, _ramstart247move.l #RAMEND, %d0248sub.l #0x1000, %d0 /* Reserve 4K for stack space.*/249move.l %d0, _ramend /* Different from RAMEND.*/250251pea 0252pea env253pea %sp@(4)254pea 0255256lea init_thread_union, %a2257lea 0x2000(%a2), %sp258259lp:260jsr start_kernel261262_exit:263jmp _exit264265266.data267.align 4268env:269.long 0270_quicc_base:271.long 0272_periph_base:273.long 0274_ramvec:275.long 0276_rambase:277.long 0278_ramstart:279.long 0280_ramend:281.long 0282_dprbase:283.long 0xffffe000284285286.text287288/*289* These are the exception vectors at boot up, they are copied into RAM290* and then overwritten as needed.291*/292293.section ".data..initvect","awx"294.long RAMEND /* Reset: Initial Stack Pointer - 0. */295.long _start /* Reset: Initial Program Counter - 1. */296.long buserr /* Bus Error - 2. */297.long trap /* Address Error - 3. */298.long trap /* Illegal Instruction - 4. */299.long trap /* Divide by zero - 5. */300.long trap /* CHK, CHK2 Instructions - 6. */301.long trap /* TRAPcc, TRAPV Instructions - 7. */302.long trap /* Privilege Violation - 8. */303.long trap /* Trace - 9. */304.long trap /* Line 1010 Emulator - 10. */305.long trap /* Line 1111 Emualtor - 11. */306.long trap /* Harware Breakpoint - 12. */307.long trap /* (Reserved for Coprocessor Protocol Violation)- 13. */308.long trap /* Format Error - 14. */309.long trap /* Uninitialized Interrupt - 15. */310.long trap /* (Unassigned, Reserver) - 16. */311.long trap /* (Unassigned, Reserver) - 17. */312.long trap /* (Unassigned, Reserver) - 18. */313.long trap /* (Unassigned, Reserver) - 19. */314.long trap /* (Unassigned, Reserver) - 20. */315.long trap /* (Unassigned, Reserver) - 21. */316.long trap /* (Unassigned, Reserver) - 22. */317.long trap /* (Unassigned, Reserver) - 23. */318.long trap /* Spurious Interrupt - 24. */319.long trap /* Level 1 Interrupt Autovector - 25. */320.long trap /* Level 2 Interrupt Autovector - 26. */321.long trap /* Level 3 Interrupt Autovector - 27. */322.long trap /* Level 4 Interrupt Autovector - 28. */323.long trap /* Level 5 Interrupt Autovector - 29. */324.long trap /* Level 6 Interrupt Autovector - 30. */325.long trap /* Level 7 Interrupt Autovector - 31. */326.long system_call /* Trap Instruction Vectors 0 - 32. */327.long trap /* Trap Instruction Vectors 1 - 33. */328.long trap /* Trap Instruction Vectors 2 - 34. */329.long trap /* Trap Instruction Vectors 3 - 35. */330.long trap /* Trap Instruction Vectors 4 - 36. */331.long trap /* Trap Instruction Vectors 5 - 37. */332.long trap /* Trap Instruction Vectors 6 - 38. */333.long trap /* Trap Instruction Vectors 7 - 39. */334.long trap /* Trap Instruction Vectors 8 - 40. */335.long trap /* Trap Instruction Vectors 9 - 41. */336.long trap /* Trap Instruction Vectors 10 - 42. */337.long trap /* Trap Instruction Vectors 11 - 43. */338.long trap /* Trap Instruction Vectors 12 - 44. */339.long trap /* Trap Instruction Vectors 13 - 45. */340.long trap /* Trap Instruction Vectors 14 - 46. */341.long trap /* Trap Instruction Vectors 15 - 47. */342.long 0 /* (Reserved for Coprocessor) - 48. */343.long 0 /* (Reserved for Coprocessor) - 49. */344.long 0 /* (Reserved for Coprocessor) - 50. */345.long 0 /* (Reserved for Coprocessor) - 51. */346.long 0 /* (Reserved for Coprocessor) - 52. */347.long 0 /* (Reserved for Coprocessor) - 53. */348.long 0 /* (Reserved for Coprocessor) - 54. */349.long 0 /* (Reserved for Coprocessor) - 55. */350.long 0 /* (Reserved for Coprocessor) - 56. */351.long 0 /* (Reserved for Coprocessor) - 57. */352.long 0 /* (Reserved for Coprocessor) - 58. */353.long 0 /* (Unassigned, Reserved) - 59. */354.long 0 /* (Unassigned, Reserved) - 60. */355.long 0 /* (Unassigned, Reserved) - 61. */356.long 0 /* (Unassigned, Reserved) - 62. */357.long 0 /* (Unassigned, Reserved) - 63. */358/* The assignment of these vectors to the CPM is */359/* dependent on the configuration of the CPM vba */360/* fields. */361.long 0 /* (User-Defined Vectors 1) CPM Error - 64. */362.long 0 /* (User-Defined Vectors 2) CPM Parallel IO PC11- 65. */363.long 0 /* (User-Defined Vectors 3) CPM Parallel IO PC10- 66. */364.long 0 /* (User-Defined Vectors 4) CPM SMC2 / PIP - 67. */365.long 0 /* (User-Defined Vectors 5) CPM SMC1 - 68. */366.long 0 /* (User-Defined Vectors 6) CPM SPI - 69. */367.long 0 /* (User-Defined Vectors 7) CPM Parallel IO PC9 - 70. */368.long 0 /* (User-Defined Vectors 8) CPM Timer 4 - 71. */369.long 0 /* (User-Defined Vectors 9) CPM Reserved - 72. */370.long 0 /* (User-Defined Vectors 10) CPM Parallel IO PC8- 73. */371.long 0 /* (User-Defined Vectors 11) CPM Parallel IO PC7- 74. */372.long 0 /* (User-Defined Vectors 12) CPM Parallel IO PC6- 75. */373.long 0 /* (User-Defined Vectors 13) CPM Timer 3 - 76. */374.long 0 /* (User-Defined Vectors 14) CPM Reserved - 77. */375.long 0 /* (User-Defined Vectors 15) CPM Parallel IO PC5- 78. */376.long 0 /* (User-Defined Vectors 16) CPM Parallel IO PC4- 79. */377.long 0 /* (User-Defined Vectors 17) CPM Reserved - 80. */378.long 0 /* (User-Defined Vectors 18) CPM RISC Timer Tbl - 81. */379.long 0 /* (User-Defined Vectors 19) CPM Timer 2 - 82. */380.long 0 /* (User-Defined Vectors 21) CPM Reserved - 83. */381.long 0 /* (User-Defined Vectors 22) CPM IDMA2 - 84. */382.long 0 /* (User-Defined Vectors 23) CPM IDMA1 - 85. */383.long 0 /* (User-Defined Vectors 24) CPM SDMA Bus Err - 86. */384.long 0 /* (User-Defined Vectors 25) CPM Parallel IO PC3- 87. */385.long 0 /* (User-Defined Vectors 26) CPM Parallel IO PC2- 88. */386.long 0 /* (User-Defined Vectors 27) CPM Timer 1 - 89. */387.long 0 /* (User-Defined Vectors 28) CPM Parallel IO PC1- 90. */388.long 0 /* (User-Defined Vectors 29) CPM SCC 4 - 91. */389.long 0 /* (User-Defined Vectors 30) CPM SCC 3 - 92. */390.long 0 /* (User-Defined Vectors 31) CPM SCC 2 - 93. */391.long 0 /* (User-Defined Vectors 32) CPM SCC 1 - 94. */392.long 0 /* (User-Defined Vectors 33) CPM Parallel IO PC0- 95. */393/* I don't think anything uses the vectors after here. */394.long 0 /* (User-Defined Vectors 34) - 96. */395.long 0,0,0,0,0 /* (User-Defined Vectors 35 - 39). */396.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 40 - 49). */397.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 50 - 59). */398.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 60 - 69). */399.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 70 - 79). */400.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 80 - 89). */401.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 90 - 99). */402.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 100 - 109). */403.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 110 - 119). */404.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 120 - 129). */405.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 130 - 139). */406.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 140 - 149). */407.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 150 - 159). */408.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 160 - 169). */409.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 170 - 179). */410.long 0,0,0,0,0,0,0,0,0,0 /* (User-Defined Vectors 180 - 189). */411.long 0,0,0 /* (User-Defined Vectors 190 - 192). */412.text413ignore: rte414415416