start.S 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * armboot - Startup Code for ARM1176 CPU-core
  3. *
  4. * Copyright (c) 2007 Samsung Electronics
  5. *
  6. * Copyright (C) 2008
  7. * Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
  8. *
  9. * SPDX-License-Identifier: GPL-2.0+
  10. *
  11. * 2007-09-21 - Restructured codes by jsgood (jsgood.yang@samsung.com)
  12. * 2007-09-21 - Added MoviNAND and OneNAND boot codes by
  13. * jsgood (jsgood.yang@samsung.com)
  14. * Base codes by scsuh (sc.suh)
  15. */
  16. #include <asm-offsets.h>
  17. #include <config.h>
  18. #ifndef CONFIG_SYS_PHY_UBOOT_BASE
  19. #define CONFIG_SYS_PHY_UBOOT_BASE CONFIG_SYS_UBOOT_BASE
  20. #endif
  21. /*
  22. *************************************************************************
  23. *
  24. * Startup Code (reset vector)
  25. *
  26. * do important init only if we don't start from memory!
  27. * setup Memory and board specific bits prior to relocation.
  28. * relocate armboot to ram
  29. * setup stack
  30. *
  31. *************************************************************************
  32. */
  33. .globl reset
  34. reset:
  35. /*
  36. * set the cpu to SVC32 mode
  37. */
  38. mrs r0, cpsr
  39. bic r0, r0, #0x3f
  40. orr r0, r0, #0xd3
  41. msr cpsr, r0
  42. /*
  43. *************************************************************************
  44. *
  45. * CPU_init_critical registers
  46. *
  47. * setup important registers
  48. * setup memory timing
  49. *
  50. *************************************************************************
  51. */
  52. /*
  53. * we do sys-critical inits only at reboot,
  54. * not when booting from ram!
  55. */
  56. cpu_init_crit:
  57. /*
  58. * When booting from NAND - it has definitely been a reset, so, no need
  59. * to flush caches and disable the MMU
  60. */
  61. #ifndef CONFIG_SPL_BUILD
  62. /*
  63. * flush v4 I/D caches
  64. */
  65. mov r0, #0
  66. mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
  67. mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
  68. /*
  69. * disable MMU stuff and caches
  70. */
  71. mrc p15, 0, r0, c1, c0, 0
  72. bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
  73. bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
  74. orr r0, r0, #0x00000002 @ set bit 1 (A) Align
  75. orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
  76. /* Prepare to disable the MMU */
  77. adr r2, mmu_disable_phys
  78. sub r2, r2, #(CONFIG_SYS_PHY_UBOOT_BASE - CONFIG_SYS_TEXT_BASE)
  79. b mmu_disable
  80. .align 5
  81. /* Run in a single cache-line */
  82. mmu_disable:
  83. mcr p15, 0, r0, c1, c0, 0
  84. nop
  85. nop
  86. mov pc, r2
  87. mmu_disable_phys:
  88. #endif
  89. /*
  90. * Go setup Memory and board specific bits prior to relocation.
  91. */
  92. bl lowlevel_init /* go setup pll,mux,memory */
  93. bl _main
  94. /*------------------------------------------------------------------------------*/
  95. .globl c_runtime_cpu_setup
  96. c_runtime_cpu_setup:
  97. mov pc, lr