hal_be_api_mon.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #ifndef _HAL_BE_API_MON_H_
  17. #define _HAL_BE_API_MON_H_
  18. #include <mon_ingress_ring.h>
  19. #include <mon_destination_ring.h>
  20. #define HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET 0x00000000
  21. #define HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB 0
  22. #define HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK 0xffffffff
  23. #define HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET 0x00000004
  24. #define HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB 0
  25. #define HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK 0x000000ff
  26. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_OFFSET 0x00000008
  27. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_LSB 0
  28. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_MSB 31
  29. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_MASK 0xffffffff
  30. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_OFFSET 0x0000000c
  31. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_LSB 0
  32. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_MSB 31
  33. #define HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_MASK 0xffffffff
  34. #define HAL_MON_PADDR_LO_SET(buff_addr_info, paddr_lo) \
  35. ((*(((unsigned int *) buff_addr_info) + \
  36. (HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET >> 2))) = \
  37. (paddr_lo << HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB) & \
  38. HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK)
  39. #define HAL_MON_PADDR_HI_SET(buff_addr_info, paddr_hi) \
  40. ((*(((unsigned int *) buff_addr_info) + \
  41. (HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET >> 2))) = \
  42. (paddr_hi << HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB) & \
  43. HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK)
  44. #define HAL_MON_VADDR_LO_SET(buff_addr_info, paddr_lo) \
  45. ((*(((unsigned int *) buff_addr_info) + \
  46. (HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_OFFSET >> 2))) = \
  47. (paddr_lo << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_LSB) & \
  48. HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_MASK)
  49. #define HAL_MON_VADDR_HI_SET(buff_addr_info, paddr_hi) \
  50. ((*(((unsigned int *) buff_addr_info) + \
  51. (HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_OFFSET >> 2))) = \
  52. (paddr_hi << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_LSB) & \
  53. HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_MASK)
  54. /**
  55. * struct hal_mon_desc () - HAL Monitor descriptor
  56. *
  57. * @buf_addr: virtual buffer address
  58. * @ppdu_id: ppdu id
  59. * - TxMon fills scheduler id
  60. * - RxMON fills phy_ppdu_id
  61. * @end_offset: offset (units in 4 bytes) where status buffer ended
  62. * i.e offset of TLV + last TLV size
  63. * @end_reason: 0 - status buffer is full
  64. * 1 - flush detected
  65. * 2 - TX_FES_STATUS_END or RX_PPDU_END
  66. * 3 - PPDU truncated due to system error
  67. * @initiator: 1 - descriptor belongs to TX FES
  68. * 0 - descriptor belongs to TX RESPONSE
  69. * @empty_descriptor: 0 - this descriptor is written on a flush
  70. * or end of ppdu or end of status buffer
  71. * 1 - descriptor provided to indicate drop
  72. * @ring_id: ring id for debugging
  73. * @looping_count: count to indicate number of times producer
  74. * of entries has looped around the ring
  75. */
  76. struct hal_mon_desc {
  77. uint64_t buf_addr;
  78. uint32_t ppdu_id;
  79. uint32_t end_offset:12,
  80. reserved_3a:4,
  81. end_reason:2,
  82. initiator:1,
  83. empty_descriptor:1,
  84. ring_id:8,
  85. looping_count:4;
  86. };
  87. /**
  88. * hal_mon_buff_addr_info_set() - set desc address in cookie
  89. * @hal_soc_hdl: HAL Soc handle
  90. * @mon_entry: monitor srng
  91. * @desc: HAL monitor descriptor
  92. *
  93. * Return: none
  94. */
  95. static inline
  96. void hal_mon_buff_addr_info_set(hal_soc_handle_t hal_soc_hdl,
  97. void *mon_entry,
  98. void *mon_desc_addr,
  99. qdf_dma_addr_t phy_addr)
  100. {
  101. uint32_t paddr_lo = ((u64)phy_addr & 0x00000000ffffffff);
  102. uint32_t paddr_hi = ((u64)phy_addr & 0xffffffff00000000) >> 32;
  103. uint32_t vaddr_lo = ((u64)(uintptr_t)mon_desc_addr & 0x00000000ffffffff);
  104. uint32_t vaddr_hi = ((u64)(uintptr_t)mon_desc_addr & 0xffffffff00000000) >> 32;
  105. HAL_MON_PADDR_LO_SET(mon_entry, paddr_lo);
  106. HAL_MON_PADDR_HI_SET(mon_entry, paddr_hi);
  107. HAL_MON_VADDR_LO_SET(mon_entry, vaddr_lo);
  108. HAL_MON_VADDR_HI_SET(mon_entry, vaddr_hi);
  109. }
  110. /**
  111. * hal_mon_buf_get() - Get monitor descriptor
  112. * @hal_soc_hdl: HAL Soc handle
  113. * @desc: HAL monitor descriptor
  114. *
  115. * Return: none
  116. */
  117. static inline
  118. void hal_mon_buf_get(hal_soc_handle_t hal_soc_hdl,
  119. void *dst_ring_desc,
  120. struct hal_mon_desc *mon_desc)
  121. {
  122. struct mon_destination_ring *hal_dst_ring =
  123. (struct mon_destination_ring *)dst_ring_desc;
  124. mon_desc->buf_addr =
  125. ((u64)hal_dst_ring->stat_buf_virt_addr_31_0 |
  126. ((u64)hal_dst_ring->stat_buf_virt_addr_63_32 << 32));
  127. mon_desc->ppdu_id = hal_dst_ring->ppdu_id;
  128. mon_desc->end_offset = hal_dst_ring->end_offset;
  129. mon_desc->end_reason = hal_dst_ring->end_reason;
  130. mon_desc->initiator = hal_dst_ring->initiator;
  131. mon_desc->ring_id = hal_dst_ring->ring_id;
  132. mon_desc->empty_descriptor = hal_dst_ring->empty_descriptor;
  133. mon_desc->looping_count = hal_dst_ring->looping_count;
  134. }
  135. #endif /* _HAL_BE_API_MON_H_ */