hal_wbm.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. /**
  19. * hal_setup_link_idle_list - Setup scattered idle list using the
  20. * buffer list provided
  21. *
  22. * @hal_soc: Opaque HAL SOC handle
  23. * @scatter_bufs_base_paddr: Array of physical base addresses
  24. * @scatter_bufs_base_vaddr: Array of virtual base addresses
  25. * @num_scatter_bufs: Number of scatter buffers in the above lists
  26. * @scatter_buf_size: Size of each scatter buffer
  27. * @last_buf_end_offset: Offset to the last entry
  28. * @num_entries: Total entries of all scatter bufs
  29. *
  30. */
  31. static void
  32. hal_setup_link_idle_list_generic(struct hal_soc *soc,
  33. qdf_dma_addr_t scatter_bufs_base_paddr[],
  34. void *scatter_bufs_base_vaddr[],
  35. uint32_t num_scatter_bufs,
  36. uint32_t scatter_buf_size,
  37. uint32_t last_buf_end_offset,
  38. uint32_t num_entries)
  39. {
  40. int i;
  41. uint32_t *prev_buf_link_ptr = NULL;
  42. uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size;
  43. uint32_t val;
  44. /* Link the scatter buffers */
  45. for (i = 0; i < num_scatter_bufs; i++) {
  46. if (i > 0) {
  47. prev_buf_link_ptr[0] =
  48. scatter_bufs_base_paddr[i] & 0xffffffff;
  49. prev_buf_link_ptr[1] = HAL_SM(
  50. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  51. BASE_ADDRESS_39_32,
  52. ((uint64_t)(scatter_bufs_base_paddr[i])
  53. >> 32)) | HAL_SM(
  54. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  55. ADDRESS_MATCH_TAG,
  56. ADDRESS_MATCH_TAG_VAL);
  57. }
  58. prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] +
  59. scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE);
  60. }
  61. /* TBD: Register programming partly based on MLD & the rest based on
  62. * inputs from HW team. Not complete yet.
  63. */
  64. reg_scatter_buf_size = (scatter_buf_size -
  65. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE)/64;
  66. reg_tot_scatter_buf_size = ((scatter_buf_size -
  67. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs)/64;
  68. HAL_REG_WRITE(soc,
  69. HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR(
  70. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  71. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, SCATTER_BUFFER_SIZE,
  72. reg_scatter_buf_size) |
  73. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, LINK_DESC_IDLE_LIST_MODE,
  74. 0x1));
  75. HAL_REG_WRITE(soc,
  76. HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR(
  77. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  78. HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE,
  79. SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST,
  80. reg_tot_scatter_buf_size));
  81. HAL_REG_WRITE(soc,
  82. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR(
  83. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  84. scatter_bufs_base_paddr[0] & 0xffffffff);
  85. HAL_REG_WRITE(soc,
  86. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  87. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  88. ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) &
  89. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK);
  90. HAL_REG_WRITE(soc,
  91. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  92. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  93. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  94. BASE_ADDRESS_39_32, ((uint64_t)(scatter_bufs_base_paddr[0])
  95. >> 32)) |
  96. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  97. ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL));
  98. /* ADDRESS_MATCH_TAG field in the above register is expected to match
  99. * with the upper bits of link pointer. The above write sets this field
  100. * to zero and we are also setting the upper bits of link pointers to
  101. * zero while setting up the link list of scatter buffers above
  102. */
  103. /* Setup head and tail pointers for the idle list */
  104. HAL_REG_WRITE(soc,
  105. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  106. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  107. scatter_bufs_base_paddr[num_scatter_bufs-1] & 0xffffffff);
  108. HAL_REG_WRITE(soc,
  109. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR(
  110. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  111. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  112. BUFFER_ADDRESS_39_32,
  113. ((uint64_t)(scatter_bufs_base_paddr[num_scatter_bufs-1])
  114. >> 32)) |
  115. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  116. HEAD_POINTER_OFFSET, last_buf_end_offset >> 2));
  117. HAL_REG_WRITE(soc,
  118. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  119. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  120. scatter_bufs_base_paddr[0] & 0xffffffff);
  121. HAL_REG_WRITE(soc,
  122. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR(
  123. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  124. scatter_bufs_base_paddr[0] & 0xffffffff);
  125. HAL_REG_WRITE(soc,
  126. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR(
  127. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  128. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  129. BUFFER_ADDRESS_39_32,
  130. ((uint64_t)(scatter_bufs_base_paddr[0]) >>
  131. 32)) | HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  132. TAIL_POINTER_OFFSET, 0));
  133. HAL_REG_WRITE(soc,
  134. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR(
  135. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  136. 2*num_entries);
  137. /* Set RING_ID_DISABLE */
  138. val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1);
  139. /*
  140. * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence
  141. * check the presence of the bit before toggling it.
  142. */
  143. #ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK
  144. val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1);
  145. #endif
  146. HAL_REG_WRITE(soc,
  147. HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  148. val);
  149. }