sim85e2.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * arch/v850/kernel/sim85e2.c -- Machine-specific stuff for
  3. * V850E2 RTL simulator
  4. *
  5. * Copyright (C) 2002,03 NEC Electronics Corporation
  6. * Copyright (C) 2002,03 Miles Bader <miles@gnu.org>
  7. *
  8. * This file is subject to the terms and conditions of the GNU General
  9. * Public License. See the file COPYING in the main directory of this
  10. * archive for more details.
  11. *
  12. * Written by Miles Bader <miles@gnu.org>
  13. */
  14. #include <linux/config.h>
  15. #include <linux/kernel.h>
  16. #include <linux/module.h>
  17. #include <linux/init.h>
  18. #include <linux/mm.h>
  19. #include <linux/swap.h>
  20. #include <linux/bootmem.h>
  21. #include <linux/irq.h>
  22. #include <asm/atomic.h>
  23. #include <asm/page.h>
  24. #include <asm/machdep.h>
  25. #include "mach.h"
  26. /* There are 4 possible areas we can use:
  27. IRAM (1MB) is fast for instruction fetches, but slow for data
  28. DRAM (1020KB) is fast for data, but slow for instructions
  29. ERAM is cached, so should be fast for both insns and data
  30. SDRAM is external DRAM, similar to ERAM
  31. */
  32. #define INIT_MEMC_FOR_SDRAM
  33. #define USE_SDRAM_AREA
  34. #define KERNEL_IN_SDRAM_AREA
  35. #define DCACHE_MODE V850E2_CACHE_BTSC_DCM_WT
  36. /*#define DCACHE_MODE V850E2_CACHE_BTSC_DCM_WB_ALLOC*/
  37. #ifdef USE_SDRAM_AREA
  38. #define RAM_START SDRAM_ADDR
  39. #define RAM_END (SDRAM_ADDR + SDRAM_SIZE)
  40. #else
  41. /* When we use DRAM, we need to account for the fact that the end of it is
  42. used for R0_RAM. */
  43. #define RAM_START DRAM_ADDR
  44. #define RAM_END R0_RAM_ADDR
  45. #endif
  46. extern void memcons_setup (void);
  47. #ifdef KERNEL_IN_SDRAM_AREA
  48. #define EARLY_INIT_SECTION_ATTR __attribute__ ((section (".early.text")))
  49. #else
  50. #define EARLY_INIT_SECTION_ATTR __init
  51. #endif
  52. void EARLY_INIT_SECTION_ATTR mach_early_init (void)
  53. {
  54. /* The sim85e2 simulator tracks `undefined' values, so to make
  55. debugging easier, we begin by zeroing out all otherwise
  56. undefined registers. This is not strictly necessary.
  57. The registers we zero are:
  58. Every GPR except:
  59. stack-pointer (r3)
  60. task-pointer (r16)
  61. our return addr (r31)
  62. Every system register (SPR) that we know about except for
  63. the PSW (SPR 5), which we zero except for the
  64. disable-interrupts bit.
  65. */
  66. /* GPRs */
  67. asm volatile (" mov r0, r1 ; mov r0, r2 ");
  68. asm volatile ("mov r0, r4 ; mov r0, r5 ; mov r0, r6 ; mov r0, r7 ");
  69. asm volatile ("mov r0, r8 ; mov r0, r9 ; mov r0, r10; mov r0, r11");
  70. asm volatile ("mov r0, r12; mov r0, r13; mov r0, r14; mov r0, r15");
  71. asm volatile (" mov r0, r17; mov r0, r18; mov r0, r19");
  72. asm volatile ("mov r0, r20; mov r0, r21; mov r0, r22; mov r0, r23");
  73. asm volatile ("mov r0, r24; mov r0, r25; mov r0, r26; mov r0, r27");
  74. asm volatile ("mov r0, r28; mov r0, r29; mov r0, r30");
  75. /* SPRs */
  76. asm volatile ("ldsr r0, 0; ldsr r0, 1; ldsr r0, 2; ldsr r0, 3");
  77. asm volatile ("ldsr r0, 4");
  78. asm volatile ("addi 0x20, r0, r1; ldsr r1, 5"); /* PSW */
  79. asm volatile ("ldsr r0, 16; ldsr r0, 17; ldsr r0, 18; ldsr r0, 19");
  80. asm volatile ("ldsr r0, 20");
  81. #ifdef INIT_MEMC_FOR_SDRAM
  82. /* Settings for SDRAM controller. */
  83. V850E2_VSWC = 0x0042;
  84. V850E2_BSC = 0x9286;
  85. V850E2_BCT(0) = 0xb000; /* was: 0 */
  86. V850E2_BCT(1) = 0x000b;
  87. V850E2_ASC = 0;
  88. V850E2_LBS = 0xa9aa; /* was: 0xaaaa */
  89. V850E2_LBC(0) = 0;
  90. V850E2_LBC(1) = 0; /* was: 0x3 */
  91. V850E2_BCC = 0;
  92. V850E2_RFS(4) = 0x800a; /* was: 0xf109 */
  93. V850E2_SCR(4) = 0x2091; /* was: 0x20a1 */
  94. V850E2_RFS(3) = 0x800c;
  95. V850E2_SCR(3) = 0x20a1;
  96. V850E2_DWC(0) = 0;
  97. V850E2_DWC(1) = 0;
  98. #endif
  99. #if 0
  100. #ifdef CONFIG_V850E2_SIM85E2S
  101. /* Turn on the caches. */
  102. V850E2_CACHE_BTSC = V850E2_CACHE_BTSC_ICM | DCACHE_MODE;
  103. V850E2_BHC = 0x1010;
  104. #elif CONFIG_V850E2_SIM85E2C
  105. V850E2_CACHE_BTSC |= (V850E2_CACHE_BTSC_ICM | V850E2_CACHE_BTSC_DCM0);
  106. V850E2_BUSM_BHC = 0xFFFF;
  107. #endif
  108. #else
  109. V850E2_BHC = 0;
  110. #endif
  111. /* Don't stop the simulator at `halt' instructions. */
  112. SIM85E2_NOTHAL = 1;
  113. /* Ensure that the simulator halts on a panic, instead of going
  114. into an infinite loop inside the panic function. */
  115. panic_timeout = -1;
  116. }
  117. void __init mach_setup (char **cmdline)
  118. {
  119. memcons_setup ();
  120. }
  121. void mach_get_physical_ram (unsigned long *ram_start, unsigned long *ram_len)
  122. {
  123. *ram_start = RAM_START;
  124. *ram_len = RAM_END - RAM_START;
  125. }
  126. void __init mach_sched_init (struct irqaction *timer_action)
  127. {
  128. /* The simulator actually cycles through all interrupts
  129. periodically. We just pay attention to IRQ0, which gives us
  130. 1/64 the rate of the periodic interrupts. */
  131. setup_irq (0, timer_action);
  132. }
  133. void mach_gettimeofday (struct timespec *tv)
  134. {
  135. tv->tv_sec = 0;
  136. tv->tv_nsec = 0;
  137. }
  138. /* Interrupts */
  139. struct v850e_intc_irq_init irq_inits[] = {
  140. { "IRQ", 0, NUM_MACH_IRQS, 1, 7 },
  141. { 0 }
  142. };
  143. struct hw_interrupt_type hw_itypes[1];
  144. /* Initialize interrupts. */
  145. void __init mach_init_irqs (void)
  146. {
  147. v850e_intc_init_irq_types (irq_inits, hw_itypes);
  148. }
  149. void machine_halt (void) __attribute__ ((noreturn));
  150. void machine_halt (void)
  151. {
  152. SIM85E2_SIMFIN = 0; /* Halt immediately. */
  153. for (;;) {}
  154. }
  155. void machine_restart (char *__unused)
  156. {
  157. machine_halt ();
  158. }
  159. void machine_power_off (void)
  160. {
  161. machine_halt ();
  162. }