hal_generic_api.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. #ifndef _HAL_GENERIC_API_H_
  20. #define _HAL_GENERIC_API_H_
  21. #include <hal_rx.h>
  22. #include "hal_api_mon.h"
  23. /**
  24. * hal_get_radiotap_he_gi_ltf() - Convert HE ltf and GI value
  25. * from stats enum to radiotap enum
  26. * @he_gi: HE GI value used in stats
  27. * @he_ltf: HE LTF value used in stats
  28. *
  29. * Return: void
  30. */
  31. static inline void hal_get_radiotap_he_gi_ltf(uint16_t *he_gi, uint16_t *he_ltf)
  32. {
  33. switch (*he_gi) {
  34. case HE_GI_0_8:
  35. *he_gi = HE_GI_RADIOTAP_0_8;
  36. break;
  37. case HE_GI_1_6:
  38. *he_gi = HE_GI_RADIOTAP_1_6;
  39. break;
  40. case HE_GI_3_2:
  41. *he_gi = HE_GI_RADIOTAP_3_2;
  42. break;
  43. default:
  44. *he_gi = HE_GI_RADIOTAP_RESERVED;
  45. }
  46. switch (*he_ltf) {
  47. case HE_LTF_1_X:
  48. *he_ltf = HE_LTF_RADIOTAP_1_X;
  49. break;
  50. case HE_LTF_2_X:
  51. *he_ltf = HE_LTF_RADIOTAP_2_X;
  52. break;
  53. case HE_LTF_4_X:
  54. *he_ltf = HE_LTF_RADIOTAP_4_X;
  55. break;
  56. default:
  57. *he_ltf = HE_LTF_RADIOTAP_UNKNOWN;
  58. }
  59. }
  60. /* channel number to freq conversion */
  61. #define CHANNEL_NUM_14 14
  62. #define CHANNEL_NUM_15 15
  63. #define CHANNEL_NUM_27 27
  64. #define CHANNEL_NUM_35 35
  65. #define CHANNEL_NUM_182 182
  66. #define CHANNEL_NUM_197 197
  67. #define CHANNEL_FREQ_2484 2484
  68. #define CHANNEL_FREQ_2407 2407
  69. #define CHANNEL_FREQ_2512 2512
  70. #define CHANNEL_FREQ_5000 5000
  71. #define CHANNEL_FREQ_5950 5950
  72. #define CHANNEL_FREQ_4000 4000
  73. #define CHANNEL_FREQ_5150 5150
  74. #define CHANNEL_FREQ_5920 5920
  75. #define CHANNEL_FREQ_5935 5935
  76. #define FREQ_MULTIPLIER_CONST_5MHZ 5
  77. #define FREQ_MULTIPLIER_CONST_20MHZ 20
  78. /**
  79. * hal_rx_radiotap_num_to_freq() - Get frequency from chan number
  80. * @chan_num - Input channel number
  81. * @center_freq - Input Channel Center frequency
  82. *
  83. * Return - Channel frequency in Mhz
  84. */
  85. static inline uint16_t
  86. hal_rx_radiotap_num_to_freq(uint16_t chan_num, qdf_freq_t center_freq)
  87. {
  88. if (center_freq > CHANNEL_FREQ_5920 && center_freq < CHANNEL_FREQ_5950)
  89. return CHANNEL_FREQ_5935;
  90. if (center_freq < CHANNEL_FREQ_5950) {
  91. if (chan_num == CHANNEL_NUM_14)
  92. return CHANNEL_FREQ_2484;
  93. if (chan_num < CHANNEL_NUM_14)
  94. return CHANNEL_FREQ_2407 +
  95. (chan_num * FREQ_MULTIPLIER_CONST_5MHZ);
  96. if (chan_num < CHANNEL_NUM_27)
  97. return CHANNEL_FREQ_2512 +
  98. ((chan_num - CHANNEL_NUM_15) *
  99. FREQ_MULTIPLIER_CONST_20MHZ);
  100. if (chan_num > CHANNEL_NUM_182 &&
  101. chan_num < CHANNEL_NUM_197)
  102. return ((chan_num * FREQ_MULTIPLIER_CONST_5MHZ) +
  103. CHANNEL_FREQ_4000);
  104. return CHANNEL_FREQ_5000 +
  105. (chan_num * FREQ_MULTIPLIER_CONST_5MHZ);
  106. } else {
  107. return CHANNEL_FREQ_5950 +
  108. (chan_num * FREQ_MULTIPLIER_CONST_5MHZ);
  109. }
  110. }
  111. /**
  112. * hal_get_hw_hptp_generic() - Get HW head and tail pointer value for any ring
  113. * @hal_soc: Opaque HAL SOC handle
  114. * @hal_ring: Source ring pointer
  115. * @headp: Head Pointer
  116. * @tailp: Tail Pointer
  117. * @ring: Ring type
  118. *
  119. * Return: Update tail pointer and head pointer in arguments.
  120. */
  121. static inline
  122. void hal_get_hw_hptp_generic(struct hal_soc *hal_soc,
  123. hal_ring_handle_t hal_ring_hdl,
  124. uint32_t *headp, uint32_t *tailp,
  125. uint8_t ring)
  126. {
  127. struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
  128. struct hal_hw_srng_config *ring_config;
  129. enum hal_ring_type ring_type = (enum hal_ring_type)ring;
  130. if (!hal_soc || !srng) {
  131. QDF_TRACE(QDF_MODULE_ID_HAL, QDF_TRACE_LEVEL_ERROR,
  132. "%s: Context is Null", __func__);
  133. return;
  134. }
  135. ring_config = HAL_SRNG_CONFIG(hal_soc, ring_type);
  136. if (!ring_config->lmac_ring) {
  137. if (srng->ring_dir == HAL_SRNG_SRC_RING) {
  138. *headp = SRNG_SRC_REG_READ(srng, HP);
  139. *tailp = SRNG_SRC_REG_READ(srng, TP);
  140. } else {
  141. *headp = SRNG_DST_REG_READ(srng, HP);
  142. *tailp = SRNG_DST_REG_READ(srng, TP);
  143. }
  144. }
  145. }
  146. #if defined(WBM_IDLE_LSB_WRITE_CONFIRM_WAR)
  147. /**
  148. * hal_wbm_idle_lsb_write_confirm() - Check and update WBM_IDLE_LINK ring LSB
  149. * @srng: srng handle
  150. *
  151. * Return: None
  152. */
  153. static void hal_wbm_idle_lsb_write_confirm(struct hal_srng *srng)
  154. {
  155. if (srng->ring_id == HAL_SRNG_WBM_IDLE_LINK) {
  156. while (SRNG_SRC_REG_READ(srng, BASE_LSB) !=
  157. ((unsigned int)srng->ring_base_paddr & 0xffffffff))
  158. SRNG_SRC_REG_WRITE(srng, BASE_LSB,
  159. srng->ring_base_paddr &
  160. 0xffffffff);
  161. }
  162. }
  163. #else
  164. static void hal_wbm_idle_lsb_write_confirm(struct hal_srng *srng)
  165. {
  166. }
  167. #endif
  168. /**
  169. * hal_srng_src_hw_init - Private function to initialize SRNG
  170. * source ring HW
  171. * @hal_soc: HAL SOC handle
  172. * @srng: SRNG ring pointer
  173. */
  174. static inline
  175. void hal_srng_src_hw_init_generic(struct hal_soc *hal,
  176. struct hal_srng *srng)
  177. {
  178. uint32_t reg_val = 0;
  179. uint64_t tp_addr = 0;
  180. hal_debug("hw_init srng %d", srng->ring_id);
  181. if (srng->flags & HAL_SRNG_MSI_INTR) {
  182. SRNG_SRC_REG_WRITE(srng, MSI1_BASE_LSB,
  183. srng->msi_addr & 0xffffffff);
  184. reg_val = SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB, ADDR),
  185. (uint64_t)(srng->msi_addr) >> 32) |
  186. SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB,
  187. MSI1_ENABLE), 1);
  188. SRNG_SRC_REG_WRITE(srng, MSI1_BASE_MSB, reg_val);
  189. SRNG_SRC_REG_WRITE(srng, MSI1_DATA,
  190. qdf_cpu_to_le32(srng->msi_data));
  191. }
  192. SRNG_SRC_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff);
  193. hal_wbm_idle_lsb_write_confirm(srng);
  194. reg_val = SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_BASE_ADDR_MSB),
  195. ((uint64_t)(srng->ring_base_paddr) >> 32)) |
  196. SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_SIZE),
  197. srng->entry_size * srng->num_entries);
  198. SRNG_SRC_REG_WRITE(srng, BASE_MSB, reg_val);
  199. reg_val = SRNG_SM(SRNG_SRC_FLD(ID, ENTRY_SIZE), srng->entry_size);
  200. SRNG_SRC_REG_WRITE(srng, ID, reg_val);
  201. /**
  202. * Interrupt setup:
  203. * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE
  204. * if level mode is required
  205. */
  206. reg_val = 0;
  207. /*
  208. * WAR - Hawkeye v1 has a hardware bug which requires timer value to be
  209. * programmed in terms of 1us resolution instead of 8us resolution as
  210. * given in MLD.
  211. */
  212. if (srng->intr_timer_thres_us) {
  213. reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0,
  214. INTERRUPT_TIMER_THRESHOLD),
  215. srng->intr_timer_thres_us);
  216. /* For HK v2 this should be (srng->intr_timer_thres_us >> 3) */
  217. }
  218. if (srng->intr_batch_cntr_thres_entries) {
  219. reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0,
  220. BATCH_COUNTER_THRESHOLD),
  221. srng->intr_batch_cntr_thres_entries *
  222. srng->entry_size);
  223. }
  224. SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX0, reg_val);
  225. reg_val = 0;
  226. if (srng->flags & HAL_SRNG_LOW_THRES_INTR_ENABLE) {
  227. reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX1,
  228. LOW_THRESHOLD), srng->u.src_ring.low_threshold);
  229. }
  230. SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX1, reg_val);
  231. /* As per HW team, TP_ADDR and HP_ADDR for Idle link ring should
  232. * remain 0 to avoid some WBM stability issues. Remote head/tail
  233. * pointers are not required since this ring is completely managed
  234. * by WBM HW
  235. */
  236. reg_val = 0;
  237. if (srng->ring_id != HAL_SRNG_WBM_IDLE_LINK) {
  238. tp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr +
  239. ((unsigned long)(srng->u.src_ring.tp_addr) -
  240. (unsigned long)(hal->shadow_rdptr_mem_vaddr)));
  241. SRNG_SRC_REG_WRITE(srng, TP_ADDR_LSB, tp_addr & 0xffffffff);
  242. SRNG_SRC_REG_WRITE(srng, TP_ADDR_MSB, tp_addr >> 32);
  243. } else {
  244. reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, RING_ID_DISABLE), 1);
  245. }
  246. /* Initilaize head and tail pointers to indicate ring is empty */
  247. SRNG_SRC_REG_WRITE(srng, HP, 0);
  248. SRNG_SRC_REG_WRITE(srng, TP, 0);
  249. *(srng->u.src_ring.tp_addr) = 0;
  250. reg_val |= ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ?
  251. SRNG_SM(SRNG_SRC_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) |
  252. ((srng->flags & HAL_SRNG_RING_PTR_SWAP) ?
  253. SRNG_SM(SRNG_SRC_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) |
  254. ((srng->flags & HAL_SRNG_MSI_SWAP) ?
  255. SRNG_SM(SRNG_SRC_FLD(MISC, MSI_SWAP_BIT), 1) : 0);
  256. /* Loop count is not used for SRC rings */
  257. reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, LOOPCNT_DISABLE), 1);
  258. /*
  259. * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1);
  260. * todo: update fw_api and replace with above line
  261. * (when SRNG_ENABLE field for the MISC register is available in fw_api)
  262. * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC)
  263. */
  264. reg_val |= 0x40;
  265. SRNG_SRC_REG_WRITE(srng, MISC, reg_val);
  266. }
  267. #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
  268. /**
  269. * hal_srng_dst_msi2_setup() - Configure MSI2 register for a SRNG
  270. * @srng: SRNG handle
  271. *
  272. * Return: None
  273. */
  274. static inline void hal_srng_dst_msi2_setup(struct hal_srng *srng)
  275. {
  276. uint32_t reg_val = 0;
  277. if (srng->u.dst_ring.nf_irq_support) {
  278. SRNG_DST_REG_WRITE(srng, MSI2_BASE_LSB,
  279. srng->msi2_addr & 0xffffffff);
  280. reg_val = SRNG_SM(SRNG_DST_FLD(MSI2_BASE_MSB, ADDR),
  281. (uint64_t)(srng->msi2_addr) >> 32) |
  282. SRNG_SM(SRNG_DST_FLD(MSI2_BASE_MSB,
  283. MSI2_ENABLE), 1);
  284. SRNG_DST_REG_WRITE(srng, MSI2_BASE_MSB, reg_val);
  285. SRNG_DST_REG_WRITE(srng, MSI2_DATA,
  286. qdf_cpu_to_le32(srng->msi2_data));
  287. }
  288. }
  289. /**
  290. * hal_srng_dst_near_full_int_setup() - Configure near-full params for SRNG
  291. * @srng: SRNG handle
  292. *
  293. * Return: None
  294. */
  295. static inline void hal_srng_dst_near_full_int_setup(struct hal_srng *srng)
  296. {
  297. uint32_t reg_val = 0;
  298. if (srng->u.dst_ring.nf_irq_support) {
  299. if (srng->intr_timer_thres_us) {
  300. reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT2_SETUP,
  301. INTERRUPT2_TIMER_THRESHOLD),
  302. srng->intr_timer_thres_us >> 3);
  303. }
  304. reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT2_SETUP,
  305. HIGH_THRESHOLD),
  306. srng->u.dst_ring.high_thresh *
  307. srng->entry_size);
  308. }
  309. SRNG_DST_REG_WRITE(srng, PRODUCER_INT2_SETUP, reg_val);
  310. }
  311. #else
  312. static inline void hal_srng_dst_msi2_setup(struct hal_srng *srng)
  313. {
  314. }
  315. static inline void hal_srng_dst_near_full_int_setup(struct hal_srng *srng)
  316. {
  317. }
  318. #endif
  319. /**
  320. * hal_srng_dst_hw_init - Private function to initialize SRNG
  321. * destination ring HW
  322. * @hal_soc: HAL SOC handle
  323. * @srng: SRNG ring pointer
  324. */
  325. static inline
  326. void hal_srng_dst_hw_init_generic(struct hal_soc *hal,
  327. struct hal_srng *srng)
  328. {
  329. uint32_t reg_val = 0;
  330. uint64_t hp_addr = 0;
  331. hal_debug("hw_init srng %d", srng->ring_id);
  332. if (srng->flags & HAL_SRNG_MSI_INTR) {
  333. SRNG_DST_REG_WRITE(srng, MSI1_BASE_LSB,
  334. srng->msi_addr & 0xffffffff);
  335. reg_val = SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB, ADDR),
  336. (uint64_t)(srng->msi_addr) >> 32) |
  337. SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB,
  338. MSI1_ENABLE), 1);
  339. SRNG_DST_REG_WRITE(srng, MSI1_BASE_MSB, reg_val);
  340. SRNG_DST_REG_WRITE(srng, MSI1_DATA,
  341. qdf_cpu_to_le32(srng->msi_data));
  342. hal_srng_dst_msi2_setup(srng);
  343. }
  344. SRNG_DST_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff);
  345. reg_val = SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_BASE_ADDR_MSB),
  346. ((uint64_t)(srng->ring_base_paddr) >> 32)) |
  347. SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_SIZE),
  348. srng->entry_size * srng->num_entries);
  349. SRNG_DST_REG_WRITE(srng, BASE_MSB, reg_val);
  350. reg_val = SRNG_SM(SRNG_DST_FLD(ID, RING_ID), srng->ring_id) |
  351. SRNG_SM(SRNG_DST_FLD(ID, ENTRY_SIZE), srng->entry_size);
  352. SRNG_DST_REG_WRITE(srng, ID, reg_val);
  353. /**
  354. * Interrupt setup:
  355. * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE
  356. * if level mode is required
  357. */
  358. reg_val = 0;
  359. if (srng->intr_timer_thres_us) {
  360. reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP,
  361. INTERRUPT_TIMER_THRESHOLD),
  362. srng->intr_timer_thres_us >> 3);
  363. }
  364. if (srng->intr_batch_cntr_thres_entries) {
  365. reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP,
  366. BATCH_COUNTER_THRESHOLD),
  367. srng->intr_batch_cntr_thres_entries *
  368. srng->entry_size);
  369. }
  370. SRNG_DST_REG_WRITE(srng, PRODUCER_INT_SETUP, reg_val);
  371. /**
  372. * Near-Full Interrupt setup:
  373. * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE
  374. * if level mode is required
  375. */
  376. hal_srng_dst_near_full_int_setup(srng);
  377. hp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr +
  378. ((unsigned long)(srng->u.dst_ring.hp_addr) -
  379. (unsigned long)(hal->shadow_rdptr_mem_vaddr)));
  380. SRNG_DST_REG_WRITE(srng, HP_ADDR_LSB, hp_addr & 0xffffffff);
  381. SRNG_DST_REG_WRITE(srng, HP_ADDR_MSB, hp_addr >> 32);
  382. /* Initilaize head and tail pointers to indicate ring is empty */
  383. SRNG_DST_REG_WRITE(srng, HP, 0);
  384. SRNG_DST_REG_WRITE(srng, TP, 0);
  385. *(srng->u.dst_ring.hp_addr) = 0;
  386. reg_val = ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ?
  387. SRNG_SM(SRNG_DST_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) |
  388. ((srng->flags & HAL_SRNG_RING_PTR_SWAP) ?
  389. SRNG_SM(SRNG_DST_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) |
  390. ((srng->flags & HAL_SRNG_MSI_SWAP) ?
  391. SRNG_SM(SRNG_DST_FLD(MISC, MSI_SWAP_BIT), 1) : 0);
  392. /*
  393. * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1);
  394. * todo: update fw_api and replace with above line
  395. * (when SRNG_ENABLE field for the MISC register is available in fw_api)
  396. * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC)
  397. */
  398. reg_val |= 0x40;
  399. SRNG_DST_REG_WRITE(srng, MISC, reg_val);
  400. }
  401. /**
  402. * hal_srng_hw_reg_offset_init_generic() - Initialize the HW srng reg offset
  403. * @hal_soc: HAL Soc handle
  404. *
  405. * Return: None
  406. */
  407. static inline void hal_srng_hw_reg_offset_init_generic(struct hal_soc *hal_soc)
  408. {
  409. int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
  410. /* dst */
  411. hw_reg_offset[DST_HP] = REG_OFFSET(DST, HP);
  412. hw_reg_offset[DST_TP] = REG_OFFSET(DST, TP);
  413. hw_reg_offset[DST_ID] = REG_OFFSET(DST, ID);
  414. hw_reg_offset[DST_MISC] = REG_OFFSET(DST, MISC);
  415. hw_reg_offset[DST_HP_ADDR_LSB] = REG_OFFSET(DST, HP_ADDR_LSB);
  416. hw_reg_offset[DST_HP_ADDR_MSB] = REG_OFFSET(DST, HP_ADDR_MSB);
  417. hw_reg_offset[DST_MSI1_BASE_LSB] = REG_OFFSET(DST, MSI1_BASE_LSB);
  418. hw_reg_offset[DST_MSI1_BASE_MSB] = REG_OFFSET(DST, MSI1_BASE_MSB);
  419. hw_reg_offset[DST_MSI1_DATA] = REG_OFFSET(DST, MSI1_DATA);
  420. hw_reg_offset[DST_BASE_LSB] = REG_OFFSET(DST, BASE_LSB);
  421. hw_reg_offset[DST_BASE_MSB] = REG_OFFSET(DST, BASE_MSB);
  422. hw_reg_offset[DST_PRODUCER_INT_SETUP] =
  423. REG_OFFSET(DST, PRODUCER_INT_SETUP);
  424. /* src */
  425. hw_reg_offset[SRC_HP] = REG_OFFSET(SRC, HP);
  426. hw_reg_offset[SRC_TP] = REG_OFFSET(SRC, TP);
  427. hw_reg_offset[SRC_ID] = REG_OFFSET(SRC, ID);
  428. hw_reg_offset[SRC_MISC] = REG_OFFSET(SRC, MISC);
  429. hw_reg_offset[SRC_TP_ADDR_LSB] = REG_OFFSET(SRC, TP_ADDR_LSB);
  430. hw_reg_offset[SRC_TP_ADDR_MSB] = REG_OFFSET(SRC, TP_ADDR_MSB);
  431. hw_reg_offset[SRC_MSI1_BASE_LSB] = REG_OFFSET(SRC, MSI1_BASE_LSB);
  432. hw_reg_offset[SRC_MSI1_BASE_MSB] = REG_OFFSET(SRC, MSI1_BASE_MSB);
  433. hw_reg_offset[SRC_MSI1_DATA] = REG_OFFSET(SRC, MSI1_DATA);
  434. hw_reg_offset[SRC_BASE_LSB] = REG_OFFSET(SRC, BASE_LSB);
  435. hw_reg_offset[SRC_BASE_MSB] = REG_OFFSET(SRC, BASE_MSB);
  436. hw_reg_offset[SRC_CONSUMER_INT_SETUP_IX0] =
  437. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX0);
  438. hw_reg_offset[SRC_CONSUMER_INT_SETUP_IX1] =
  439. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX1);
  440. }
  441. #endif /* HAL_GENERIC_API_H_ */