mt-headsmp.S 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <linux/linkage.h>
  2. #include <linux/init.h>
  3. __CPUINIT
  4. CCI400_SI3_SNOOP_CONTROL:
  5. .long 0x10394000
  6. CCI400_STATUS:
  7. .long 0x1039000C
  8. MP1_AXI_CONFIG:
  9. .long 0x1020022C
  10. ENTRY(mt_secondary_startup)
  11. /*
  12. MRRC p15, 1, r0, r1, c15 @ read cpu extended control register
  13. ORR r0, r0, #0x040
  14. MCRR p15, 1, r0, r1, c15 @ write cpu extended control register
  15. DSB
  16. ISB
  17. */
  18. /* CONFIG_ARM_ERRATA_836870, prevent software livelock */
  19. mrc p15, 0, r9, c0, c0, 0 @ MIDR
  20. movw r10, #0xfff0
  21. movt r10, #0xff0f
  22. and r9, r10
  23. movw r10, #0xD030
  24. movt r10, #0x410F
  25. teq r9, r10
  26. bne 1f
  27. mrrc p15, 0, r0, r1, c15 @ Read CPU Auxiliary Control Register
  28. orr r0, r0, #0x01000000 @ set CPUACTLR[24] = 1
  29. mcrr p15, 0, r0, r1, c15 @ Write CPU Auxiliary Control Register
  30. dsb
  31. isb
  32. 1:
  33. mrc p15, 0, r0, c0, c0, 5 @ MPIDR
  34. ubfx r0, r0, #8, #4 @ Cluster Id
  35. cmp r0, #0 @ Cluster 1
  36. beq cluster0
  37. ldr r2, MP1_AXI_CONFIG
  38. ldr r1, [r2]
  39. bic r1, r1, #0x10
  40. str r1, [r2]
  41. ldr r2, CCI400_SI3_SNOOP_CONTROL
  42. ldr r1, [r2]
  43. orr r1, r1, #0x3
  44. str r1, [r2]
  45. ldr r2, CCI400_STATUS
  46. b 1f
  47. 0:
  48. dsb
  49. 1:
  50. ldr r1, [r2]
  51. tst r1, #1
  52. bne 0b
  53. cluster0:
  54. b secondary_startup
  55. END(mt_secondary_startup)