headsmp.S 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * Entry of the second core for CSR Marco dual-core SMP SoCs
  3. *
  4. * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
  5. *
  6. * Licensed under GPLv2 or later.
  7. */
  8. #include <linux/linkage.h>
  9. #include <linux/init.h>
  10. __INIT
  11. /*
  12. * Cold boot and hardware reset show different behaviour,
  13. * system will be always panic if we warm-reset the board
  14. * Here we invalidate L1 of CPU1 to make sure there isn't
  15. * uninitialized data written into memory later
  16. */
  17. ENTRY(v7_invalidate_l1)
  18. mov r0, #0
  19. mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
  20. mcr p15, 2, r0, c0, c0, 0
  21. mrc p15, 1, r0, c0, c0, 0
  22. ldr r1, =0x7fff
  23. and r2, r1, r0, lsr #13
  24. ldr r1, =0x3ff
  25. and r3, r1, r0, lsr #3 @ NumWays - 1
  26. add r2, r2, #1 @ NumSets
  27. and r0, r0, #0x7
  28. add r0, r0, #4 @ SetShift
  29. clz r1, r3 @ WayShift
  30. add r4, r3, #1 @ NumWays
  31. 1: sub r2, r2, #1 @ NumSets--
  32. mov r3, r4 @ Temp = NumWays
  33. 2: subs r3, r3, #1 @ Temp--
  34. mov r5, r3, lsl r1
  35. mov r6, r2, lsl r0
  36. orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
  37. mcr p15, 0, r5, c7, c6, 2
  38. bgt 2b
  39. cmp r2, #0
  40. bgt 1b
  41. dsb
  42. isb
  43. mov pc, lr
  44. ENDPROC(v7_invalidate_l1)
  45. /*
  46. * SIRFSOC specific entry point for secondary CPUs. This provides
  47. * a "holding pen" into which all secondary cores are held until we're
  48. * ready for them to initialise.
  49. */
  50. ENTRY(sirfsoc_secondary_startup)
  51. bl v7_invalidate_l1
  52. mrc p15, 0, r0, c0, c0, 5
  53. and r0, r0, #15
  54. adr r4, 1f
  55. ldmia r4, {r5, r6}
  56. sub r4, r4, r5
  57. add r6, r6, r4
  58. pen: ldr r7, [r6]
  59. cmp r7, r0
  60. bne pen
  61. /*
  62. * we've been released from the holding pen: secondary_stack
  63. * should now contain the SVC stack for this core
  64. */
  65. b secondary_startup
  66. ENDPROC(sirfsoc_secondary_startup)
  67. .align
  68. 1: .long .
  69. .long pen_release