mp.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * (C) Copyright 2019 Xilinx, Inc.
  4. * Siva Durga Prasad <siva.durga.prasad.paladugu@amd.com>>
  5. */
  6. #include <common.h>
  7. #include <asm/io.h>
  8. #include <asm/arch/hardware.h>
  9. #include <asm/arch/sys_proto.h>
  10. #define HALT 0
  11. #define RELEASE 1
  12. #define VERSAL_RPU_CFG_CPU_HALT_MASK 0x01
  13. #define VERSAL_RPU_GLBL_CTRL_SPLIT_LOCK_MASK 0x08
  14. #define VERSAL_RPU_GLBL_CTRL_TCM_COMB_MASK 0x40
  15. #define VERSAL_RPU_GLBL_CTRL_SLCLAMP_MASK 0x10
  16. #define VERSAL_CRLAPB_RST_LPD_AMBA_RST_MASK 0x04
  17. #define VERSAL_CRLAPB_RST_LPD_R50_RST_MASK 0x01
  18. #define VERSAL_CRLAPB_RST_LPD_R51_RST_MASK 0x02
  19. #define VERSAL_CRL_RST_CPU_R5_RESET_PGE_MASK 0x10
  20. #define VERSAL_CRLAPB_CPU_R5_CTRL_CLKACT_MASK 0x1000000
  21. static void set_r5_halt_mode(u8 halt, u8 mode)
  22. {
  23. u32 tmp;
  24. tmp = readl(&rpu_base->rpu0_cfg);
  25. if (halt == HALT)
  26. tmp &= ~VERSAL_RPU_CFG_CPU_HALT_MASK;
  27. else
  28. tmp |= VERSAL_RPU_CFG_CPU_HALT_MASK;
  29. writel(tmp, &rpu_base->rpu0_cfg);
  30. if (mode == TCM_LOCK) {
  31. tmp = readl(&rpu_base->rpu1_cfg);
  32. if (halt == HALT)
  33. tmp &= ~VERSAL_RPU_CFG_CPU_HALT_MASK;
  34. else
  35. tmp |= VERSAL_RPU_CFG_CPU_HALT_MASK;
  36. writel(tmp, &rpu_base->rpu1_cfg);
  37. }
  38. }
  39. static void set_r5_tcm_mode(u8 mode)
  40. {
  41. u32 tmp;
  42. tmp = readl(&rpu_base->rpu_glbl_ctrl);
  43. if (mode == TCM_LOCK) {
  44. tmp &= ~VERSAL_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
  45. tmp |= VERSAL_RPU_GLBL_CTRL_TCM_COMB_MASK |
  46. VERSAL_RPU_GLBL_CTRL_SLCLAMP_MASK;
  47. } else {
  48. tmp |= VERSAL_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
  49. tmp &= ~(VERSAL_RPU_GLBL_CTRL_TCM_COMB_MASK |
  50. VERSAL_RPU_GLBL_CTRL_SLCLAMP_MASK);
  51. }
  52. writel(tmp, &rpu_base->rpu_glbl_ctrl);
  53. }
  54. static void release_r5_reset(u8 mode)
  55. {
  56. u32 tmp;
  57. tmp = readl(&crlapb_base->rst_cpu_r5);
  58. tmp &= ~(VERSAL_CRLAPB_RST_LPD_AMBA_RST_MASK |
  59. VERSAL_CRLAPB_RST_LPD_R50_RST_MASK |
  60. VERSAL_CRL_RST_CPU_R5_RESET_PGE_MASK);
  61. if (mode == TCM_LOCK)
  62. tmp &= ~VERSAL_CRLAPB_RST_LPD_R51_RST_MASK;
  63. writel(tmp, &crlapb_base->rst_cpu_r5);
  64. }
  65. static void enable_clock_r5(void)
  66. {
  67. u32 tmp;
  68. tmp = readl(&crlapb_base->cpu_r5_ctrl);
  69. tmp |= VERSAL_CRLAPB_CPU_R5_CTRL_CLKACT_MASK;
  70. writel(tmp, &crlapb_base->cpu_r5_ctrl);
  71. }
  72. void initialize_tcm(bool mode)
  73. {
  74. if (!mode) {
  75. set_r5_tcm_mode(TCM_LOCK);
  76. set_r5_halt_mode(HALT, TCM_LOCK);
  77. enable_clock_r5();
  78. release_r5_reset(TCM_LOCK);
  79. } else {
  80. set_r5_tcm_mode(TCM_SPLIT);
  81. set_r5_halt_mode(HALT, TCM_SPLIT);
  82. enable_clock_r5();
  83. release_r5_reset(TCM_SPLIT);
  84. }
  85. }
  86. void tcm_init(u8 mode)
  87. {
  88. puts("WARNING: Initializing TCM overwrites TCM content\n");
  89. initialize_tcm(mode);
  90. memset((void *)VERSAL_TCM_BASE_ADDR, 0, VERSAL_TCM_SIZE);
  91. }