pvr_fw_startstop.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. // SPDX-License-Identifier: GPL-2.0-only OR MIT
  2. /* Copyright (c) 2023 Imagination Technologies Ltd. */
  3. #include "pvr_device.h"
  4. #include "pvr_fw.h"
  5. #include "pvr_fw_meta.h"
  6. #include "pvr_fw_startstop.h"
  7. #include "pvr_rogue_cr_defs.h"
  8. #include "pvr_rogue_meta.h"
  9. #include "pvr_vm.h"
  10. #include <linux/compiler.h>
  11. #include <linux/delay.h>
  12. #include <linux/ktime.h>
  13. #include <linux/types.h>
  14. #define POLL_TIMEOUT_USEC 1000000
  15. static void
  16. rogue_axi_ace_list_init(struct pvr_device *pvr_dev)
  17. {
  18. /* Setup AXI-ACE config. Set everything to outer cache. */
  19. u64 reg_val =
  20. (3U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_NON_SNOOPING_SHIFT) |
  21. (3U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_NON_SNOOPING_SHIFT) |
  22. (2U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_CACHE_MAINTENANCE_SHIFT) |
  23. (2U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_COHERENT_SHIFT) |
  24. (2U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_COHERENT_SHIFT) |
  25. (2U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWCACHE_COHERENT_SHIFT) |
  26. (2U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_COHERENT_SHIFT) |
  27. (2U << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_CACHE_MAINTENANCE_SHIFT);
  28. pvr_cr_write64(pvr_dev, ROGUE_CR_AXI_ACE_LITE_CONFIGURATION, reg_val);
  29. }
  30. static void
  31. rogue_bif_init(struct pvr_device *pvr_dev)
  32. {
  33. dma_addr_t pc_dma_addr;
  34. u64 pc_addr;
  35. /* Acquire the address of the Kernel Page Catalogue. */
  36. pc_dma_addr = pvr_vm_get_page_table_root_addr(pvr_dev->kernel_vm_ctx);
  37. /* Write the kernel catalogue base. */
  38. pc_addr = ((((u64)pc_dma_addr >> ROGUE_CR_BIF_CAT_BASE0_ADDR_ALIGNSHIFT)
  39. << ROGUE_CR_BIF_CAT_BASE0_ADDR_SHIFT) &
  40. ~ROGUE_CR_BIF_CAT_BASE0_ADDR_CLRMSK);
  41. pvr_cr_write64(pvr_dev, BIF_CAT_BASEX(MMU_CONTEXT_MAPPING_FWPRIV),
  42. pc_addr);
  43. }
  44. static int
  45. rogue_slc_init(struct pvr_device *pvr_dev)
  46. {
  47. u16 slc_cache_line_size_bits;
  48. u32 reg_val;
  49. int err;
  50. /*
  51. * SLC Misc control.
  52. *
  53. * Note: This is a 64bit register and we set only the lower 32bits
  54. * leaving the top 32bits (ROGUE_CR_SLC_CTRL_MISC_SCRAMBLE_BITS)
  55. * unchanged from the HW default.
  56. */
  57. reg_val = (pvr_cr_read32(pvr_dev, ROGUE_CR_SLC_CTRL_MISC) &
  58. ROGUE_CR_SLC_CTRL_MISC_ENABLE_PSG_HAZARD_CHECK_EN) |
  59. ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_PVR_HASH1;
  60. err = PVR_FEATURE_VALUE(pvr_dev, slc_cache_line_size_bits, &slc_cache_line_size_bits);
  61. if (err)
  62. return err;
  63. /* Bypass burst combiner if SLC line size is smaller than 1024 bits. */
  64. if (slc_cache_line_size_bits < 1024)
  65. reg_val |= ROGUE_CR_SLC_CTRL_MISC_BYPASS_BURST_COMBINER_EN;
  66. if (PVR_HAS_QUIRK(pvr_dev, 71242) && !PVR_HAS_FEATURE(pvr_dev, gpu_multicore_support))
  67. reg_val |= ROGUE_CR_SLC_CTRL_MISC_LAZYWB_OVERRIDE_EN;
  68. pvr_cr_write32(pvr_dev, ROGUE_CR_SLC_CTRL_MISC, reg_val);
  69. return 0;
  70. }
  71. /**
  72. * pvr_fw_start() - Start FW processor and boot firmware
  73. * @pvr_dev: Target PowerVR device.
  74. *
  75. * Returns:
  76. * * 0 on success, or
  77. * * Any error returned by rogue_slc_init().
  78. */
  79. int
  80. pvr_fw_start(struct pvr_device *pvr_dev)
  81. {
  82. bool has_reset2 = PVR_HAS_FEATURE(pvr_dev, xe_tpu2);
  83. u64 soft_reset_mask;
  84. int err;
  85. if (PVR_HAS_FEATURE(pvr_dev, pbe2_in_xe))
  86. soft_reset_mask = ROGUE_CR_SOFT_RESET__PBE2_XE__MASKFULL;
  87. else
  88. soft_reset_mask = ROGUE_CR_SOFT_RESET_MASKFULL;
  89. if (PVR_HAS_FEATURE(pvr_dev, sys_bus_secure_reset)) {
  90. /*
  91. * Disable the default sys_bus_secure protection to perform
  92. * minimal setup.
  93. */
  94. pvr_cr_write32(pvr_dev, ROGUE_CR_SYS_BUS_SECURE, 0);
  95. (void)pvr_cr_read32(pvr_dev, ROGUE_CR_SYS_BUS_SECURE); /* Fence write */
  96. }
  97. /* Set Rogue in soft-reset. */
  98. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET, soft_reset_mask);
  99. if (has_reset2)
  100. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET2, ROGUE_CR_SOFT_RESET2_MASKFULL);
  101. /* Read soft-reset to fence previous write in order to clear the SOCIF pipeline. */
  102. (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET);
  103. if (has_reset2)
  104. (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET2);
  105. /* Take Rascal and Dust out of reset. */
  106. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET,
  107. soft_reset_mask ^ ROGUE_CR_SOFT_RESET_RASCALDUSTS_EN);
  108. if (has_reset2)
  109. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET2, 0);
  110. (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET);
  111. if (has_reset2)
  112. (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET2);
  113. /* Take everything out of reset but the FW processor. */
  114. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET, ROGUE_CR_SOFT_RESET_GARTEN_EN);
  115. if (has_reset2)
  116. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET2, 0);
  117. (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET);
  118. if (has_reset2)
  119. (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET2);
  120. err = rogue_slc_init(pvr_dev);
  121. if (err)
  122. goto err_reset;
  123. /* Initialise Firmware wrapper. */
  124. pvr_dev->fw_dev.defs->wrapper_init(pvr_dev);
  125. /* We must init the AXI-ACE interface before first BIF transaction. */
  126. rogue_axi_ace_list_init(pvr_dev);
  127. if (pvr_dev->fw_dev.processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) {
  128. /* Initialise BIF. */
  129. rogue_bif_init(pvr_dev);
  130. }
  131. /* Need to wait for at least 16 cycles before taking the FW processor out of reset ... */
  132. udelay(3);
  133. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET, 0x0);
  134. (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET);
  135. /* ... and afterwards. */
  136. udelay(3);
  137. return 0;
  138. err_reset:
  139. /* Put everything back into soft-reset. */
  140. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET, soft_reset_mask);
  141. return err;
  142. }
  143. /**
  144. * pvr_fw_stop() - Stop FW processor
  145. * @pvr_dev: Target PowerVR device.
  146. *
  147. * Returns:
  148. * * 0 on success, or
  149. * * Any error returned by pvr_cr_poll_reg32().
  150. */
  151. int
  152. pvr_fw_stop(struct pvr_device *pvr_dev)
  153. {
  154. const u32 sidekick_idle_mask = ROGUE_CR_SIDEKICK_IDLE_MASKFULL &
  155. ~(ROGUE_CR_SIDEKICK_IDLE_GARTEN_EN |
  156. ROGUE_CR_SIDEKICK_IDLE_SOCIF_EN |
  157. ROGUE_CR_SIDEKICK_IDLE_HOSTIF_EN);
  158. bool skip_garten_idle = false;
  159. u32 reg_value;
  160. int err;
  161. /*
  162. * Wait for Sidekick/Jones to signal IDLE except for the Garten Wrapper.
  163. * For cores with the LAYOUT_MARS feature, SIDEKICK would have been
  164. * powered down by the FW.
  165. */
  166. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_SIDEKICK_IDLE, sidekick_idle_mask,
  167. sidekick_idle_mask, POLL_TIMEOUT_USEC);
  168. if (err)
  169. return err;
  170. /* Unset MTS DM association with threads. */
  171. pvr_cr_write32(pvr_dev, ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC,
  172. ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC_MASKFULL &
  173. ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC_DM_ASSOC_CLRMSK);
  174. pvr_cr_write32(pvr_dev, ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC,
  175. ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC_MASKFULL &
  176. ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC_DM_ASSOC_CLRMSK);
  177. pvr_cr_write32(pvr_dev, ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC,
  178. ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC_MASKFULL &
  179. ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC_DM_ASSOC_CLRMSK);
  180. pvr_cr_write32(pvr_dev, ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC,
  181. ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC_MASKFULL &
  182. ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC_DM_ASSOC_CLRMSK);
  183. /* Extra Idle checks. */
  184. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_BIF_STATUS_MMU, 0,
  185. ROGUE_CR_BIF_STATUS_MMU_MASKFULL,
  186. POLL_TIMEOUT_USEC);
  187. if (err)
  188. return err;
  189. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_BIFPM_STATUS_MMU, 0,
  190. ROGUE_CR_BIFPM_STATUS_MMU_MASKFULL,
  191. POLL_TIMEOUT_USEC);
  192. if (err)
  193. return err;
  194. if (!PVR_HAS_FEATURE(pvr_dev, xt_top_infrastructure)) {
  195. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_BIF_READS_EXT_STATUS, 0,
  196. ROGUE_CR_BIF_READS_EXT_STATUS_MASKFULL,
  197. POLL_TIMEOUT_USEC);
  198. if (err)
  199. return err;
  200. }
  201. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_BIFPM_READS_EXT_STATUS, 0,
  202. ROGUE_CR_BIFPM_READS_EXT_STATUS_MASKFULL,
  203. POLL_TIMEOUT_USEC);
  204. if (err)
  205. return err;
  206. err = pvr_cr_poll_reg64(pvr_dev, ROGUE_CR_SLC_STATUS1, 0,
  207. ROGUE_CR_SLC_STATUS1_MASKFULL,
  208. POLL_TIMEOUT_USEC);
  209. if (err)
  210. return err;
  211. /*
  212. * Wait for SLC to signal IDLE.
  213. * For cores with the LAYOUT_MARS feature, SLC would have been powered
  214. * down by the FW.
  215. */
  216. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_SLC_IDLE,
  217. ROGUE_CR_SLC_IDLE_MASKFULL,
  218. ROGUE_CR_SLC_IDLE_MASKFULL, POLL_TIMEOUT_USEC);
  219. if (err)
  220. return err;
  221. /*
  222. * Wait for Sidekick/Jones to signal IDLE except for the Garten Wrapper.
  223. * For cores with the LAYOUT_MARS feature, SIDEKICK would have been powered
  224. * down by the FW.
  225. */
  226. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_SIDEKICK_IDLE, sidekick_idle_mask,
  227. sidekick_idle_mask, POLL_TIMEOUT_USEC);
  228. if (err)
  229. return err;
  230. if (pvr_dev->fw_dev.processor_type == PVR_FW_PROCESSOR_TYPE_META) {
  231. err = pvr_meta_cr_read32(pvr_dev, META_CR_TxVECINT_BHALT, &reg_value);
  232. if (err)
  233. return err;
  234. /*
  235. * Wait for Sidekick/Jones to signal IDLE including the Garten
  236. * Wrapper if there is no debugger attached (TxVECINT_BHALT =
  237. * 0x0).
  238. */
  239. if (reg_value)
  240. skip_garten_idle = true;
  241. }
  242. if (!skip_garten_idle) {
  243. err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_SIDEKICK_IDLE,
  244. ROGUE_CR_SIDEKICK_IDLE_GARTEN_EN,
  245. ROGUE_CR_SIDEKICK_IDLE_GARTEN_EN,
  246. POLL_TIMEOUT_USEC);
  247. if (err)
  248. return err;
  249. }
  250. if (PVR_HAS_FEATURE(pvr_dev, pbe2_in_xe))
  251. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET,
  252. ROGUE_CR_SOFT_RESET__PBE2_XE__MASKFULL);
  253. else
  254. pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET, ROGUE_CR_SOFT_RESET_MASKFULL);
  255. return 0;
  256. }