lowlevel_init.S 1016 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (C) 2012 Nobuhiro Iwamatsu <nobuhiro.Iwamatsu.yj@renesas.com>
  3. * Copyright (C) 2012 Renesas Solutions Corp.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <config.h>
  8. #include <linux/linkage.h>
  9. ENTRY(lowlevel_init)
  10. ldr r0, =MERAM_BASE
  11. mov r1, #0x0
  12. str r1, [r0]
  13. mrc p15, 0, r0, c0, c0, 5
  14. ands r0, r0, #0xF
  15. beq lowlevel_init__
  16. b wait_interrupt
  17. .pool
  18. .align 4
  19. wait_interrupt:
  20. #ifdef ICCICR
  21. ldr r1, =ICCICR
  22. mov r2, #0x0
  23. str r2, [r1]
  24. mov r2, #0xF0
  25. adds r1, r1, #4 /* ICCPMR */
  26. str r2, [r1]
  27. ldr r1, =ICCICR
  28. mov r2, #0x1
  29. str r2, [r1]
  30. #endif
  31. wait_loop:
  32. .long 0xE320F003 /* wfi */
  33. ldr r2, [r1, #0xC]
  34. str r2, [r1, #0x10]
  35. ldr r0, =MERAM_BASE
  36. ldr r2, [r0]
  37. cmp r2, #0
  38. movne pc, r2
  39. b wait_loop
  40. wait_loop_end:
  41. .pool
  42. .align 4
  43. lowlevel_init__:
  44. mov r0, #0x200000
  45. loop0:
  46. subs r0, r0, #1
  47. bne loop0
  48. ldr sp, MERAM_STACK
  49. b s_init
  50. .pool
  51. .align 4
  52. ENDPROC(lowlevel_init)
  53. .ltorg
  54. MERAM_STACK:
  55. .word LOW_LEVEL_MERAM_STACK