scan_manager.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. * Copyright (C) 2013 Altera Corporation <www.altera.com>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <asm/io.h>
  8. #include <asm/arch/freeze_controller.h>
  9. #include <asm/arch/scan_manager.h>
  10. DECLARE_GLOBAL_DATA_PTR;
  11. static const struct socfpga_scan_manager *scan_manager_base =
  12. (void *)(SOCFPGA_SCANMGR_ADDRESS);
  13. static const struct socfpga_freeze_controller *freeze_controller_base =
  14. (void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
  15. /*
  16. * Function to check IO scan chain engine status and wait if the engine is
  17. * is active. Poll the IO scan chain engine till maximum iteration reached.
  18. */
  19. static inline uint32_t scan_chain_engine_is_idle(uint32_t max_iter)
  20. {
  21. uint32_t scanmgr_status;
  22. scanmgr_status = readl(&scan_manager_base->stat);
  23. /* Poll the engine until the scan engine is inactive */
  24. while (SCANMGR_STAT_ACTIVE_GET(scanmgr_status) ||
  25. (SCANMGR_STAT_WFIFOCNT_GET(scanmgr_status) > 0)) {
  26. max_iter--;
  27. if (max_iter > 0)
  28. scanmgr_status = readl(&scan_manager_base->stat);
  29. else
  30. return 0;
  31. }
  32. return 1;
  33. }
  34. /**
  35. * scan_mgr_io_scan_chain_prg() - Program HPS IO Scan Chain
  36. * @io_scan_chain_id: IO scan chain ID
  37. */
  38. static int scan_mgr_io_scan_chain_prg(const unsigned int io_scan_chain_id)
  39. {
  40. uint16_t tdi_tdo_header;
  41. uint32_t io_program_iter;
  42. uint32_t io_scan_chain_data_residual;
  43. uint32_t residual;
  44. uint32_t i, ret;
  45. uint32_t index = 0;
  46. uint32_t io_scan_chain_len_in_bits;
  47. const unsigned long *iocsr_scan_chain;
  48. ret = iocsr_get_config_table(io_scan_chain_id, &iocsr_scan_chain,
  49. &io_scan_chain_len_in_bits);
  50. if (ret)
  51. return 1;
  52. /*
  53. * De-assert reinit if the IO scan chain is intended for HIO. In
  54. * this, its the chain 3.
  55. */
  56. if (io_scan_chain_id == 3)
  57. clrbits_le32(&freeze_controller_base->hioctrl,
  58. SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK);
  59. /*
  60. * Check if the scan chain engine is inactive and the
  61. * WFIFO is empty before enabling the IO scan chain
  62. */
  63. if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
  64. return 1;
  65. /*
  66. * Enable IO Scan chain based on scan chain id
  67. * Note: only one chain can be enabled at a time
  68. */
  69. setbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
  70. /*
  71. * Calculate number of iteration needed for full 128-bit (4 x32-bits)
  72. * bits shifting. Each TDI_TDO packet can shift in maximum 128-bits
  73. */
  74. io_program_iter = io_scan_chain_len_in_bits >>
  75. IO_SCAN_CHAIN_128BIT_SHIFT;
  76. io_scan_chain_data_residual = io_scan_chain_len_in_bits &
  77. IO_SCAN_CHAIN_128BIT_MASK;
  78. /* Construct TDI_TDO packet for 128-bit IO scan chain (2 bytes) */
  79. tdi_tdo_header = TDI_TDO_HEADER_FIRST_BYTE |
  80. (TDI_TDO_MAX_PAYLOAD << TDI_TDO_HEADER_SECOND_BYTE_SHIFT);
  81. /* Program IO scan chain in 128-bit iteration */
  82. for (i = 0; i < io_program_iter; i++) {
  83. /* write TDI_TDO packet header to scan manager */
  84. writel(tdi_tdo_header, &scan_manager_base->fifo_double_byte);
  85. /* calculate array index. Multiply by 4 as write 4 x 32bits */
  86. index = i * 4;
  87. /* write 4 successive 32-bit IO scan chain data into WFIFO */
  88. writel(iocsr_scan_chain[index],
  89. &scan_manager_base->fifo_quad_byte);
  90. writel(iocsr_scan_chain[index + 1],
  91. &scan_manager_base->fifo_quad_byte);
  92. writel(iocsr_scan_chain[index + 2],
  93. &scan_manager_base->fifo_quad_byte);
  94. writel(iocsr_scan_chain[index + 3],
  95. &scan_manager_base->fifo_quad_byte);
  96. /*
  97. * Check if the scan chain engine has completed the
  98. * IO scan chain data shifting
  99. */
  100. if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
  101. goto error;
  102. }
  103. /* Calculate array index for final TDI_TDO packet */
  104. index = io_program_iter * 4;
  105. /* Final TDI_TDO packet if any */
  106. if (io_scan_chain_data_residual) {
  107. /*
  108. * Calculate number of quad bytes FIFO write
  109. * needed for the final TDI_TDO packet
  110. */
  111. io_program_iter = io_scan_chain_data_residual >>
  112. IO_SCAN_CHAIN_32BIT_SHIFT;
  113. /*
  114. * Construct TDI_TDO packet for remaining IO
  115. * scan chain (2 bytes)
  116. */
  117. tdi_tdo_header = TDI_TDO_HEADER_FIRST_BYTE |
  118. ((io_scan_chain_data_residual - 1) <<
  119. TDI_TDO_HEADER_SECOND_BYTE_SHIFT);
  120. /*
  121. * Program the last part of IO scan chain write TDI_TDO packet
  122. * header (2 bytes) to scan manager
  123. */
  124. writel(tdi_tdo_header, &scan_manager_base->fifo_double_byte);
  125. for (i = 0; i < io_program_iter; i++) {
  126. /*
  127. * write remaining scan chain data into scan
  128. * manager WFIFO with 4 bytes write
  129. */
  130. writel(iocsr_scan_chain[index + i],
  131. &scan_manager_base->fifo_quad_byte);
  132. }
  133. index += io_program_iter;
  134. residual = io_scan_chain_data_residual &
  135. IO_SCAN_CHAIN_32BIT_MASK;
  136. if (IO_SCAN_CHAIN_PAYLOAD_24BIT < residual) {
  137. /*
  138. * write the last 4B scan chain data
  139. * into scan manager WFIFO
  140. */
  141. writel(iocsr_scan_chain[index],
  142. &scan_manager_base->fifo_quad_byte);
  143. } else {
  144. /*
  145. * write the remaining 1 - 3 bytes scan chain
  146. * data into scan manager WFIFO byte by byte
  147. * to prevent JTAG engine shifting unused data
  148. * from the FIFO and mistaken the data as a
  149. * valid command (even though unused bits are
  150. * set to 0, but just to prevent hardware
  151. * glitch)
  152. */
  153. for (i = 0; i < residual; i += 8) {
  154. writel(((iocsr_scan_chain[index] >> i)
  155. & IO_SCAN_CHAIN_BYTE_MASK),
  156. &scan_manager_base->fifo_single_byte);
  157. }
  158. }
  159. /*
  160. * Check if the scan chain engine has completed the
  161. * IO scan chain data shifting
  162. */
  163. if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
  164. goto error;
  165. }
  166. /* Disable IO Scan chain when configuration done*/
  167. clrbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
  168. return 0;
  169. error:
  170. /* Disable IO Scan chain when error detected */
  171. clrbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
  172. return 1;
  173. }
  174. int scan_mgr_configure_iocsr(void)
  175. {
  176. int status = 0;
  177. /* configure the IOCSR through scan chain */
  178. status |= scan_mgr_io_scan_chain_prg(0);
  179. status |= scan_mgr_io_scan_chain_prg(1);
  180. status |= scan_mgr_io_scan_chain_prg(2);
  181. status |= scan_mgr_io_scan_chain_prg(3);
  182. return status;
  183. }