Lines Matching refs:srng

249 				    struct hal_srng *srng, int ring_num)  in ath11k_hal_ce_dst_setup()  argument
262 srng->u.dst_ring.max_buffer_length); in ath11k_hal_ce_dst_setup()
267 struct hal_srng *srng) in ath11k_hal_srng_dst_hw_init() argument
274 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_dst_hw_init()
276 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) { in ath11k_hal_srng_dst_hw_init()
279 srng->msi_addr); in ath11k_hal_srng_dst_hw_init()
282 ((u64)srng->msi_addr >> in ath11k_hal_srng_dst_hw_init()
290 srng->msi_data); in ath11k_hal_srng_dst_hw_init()
293 ath11k_hif_write32(ab, reg_base, srng->ring_base_paddr); in ath11k_hal_srng_dst_hw_init()
296 ((u64)srng->ring_base_paddr >> in ath11k_hal_srng_dst_hw_init()
299 (srng->entry_size * srng->num_entries)); in ath11k_hal_srng_dst_hw_init()
302 val = FIELD_PREP(HAL_REO1_RING_ID_RING_ID, srng->ring_id) | in ath11k_hal_srng_dst_hw_init()
303 FIELD_PREP(HAL_REO1_RING_ID_ENTRY_SIZE, srng->entry_size); in ath11k_hal_srng_dst_hw_init()
308 (srng->intr_timer_thres_us >> 3)); in ath11k_hal_srng_dst_hw_init()
311 (srng->intr_batch_cntr_thres_entries * in ath11k_hal_srng_dst_hw_init()
312 srng->entry_size)); in ath11k_hal_srng_dst_hw_init()
319 ((unsigned long)srng->u.dst_ring.hp_addr - in ath11k_hal_srng_dst_hw_init()
327 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2]; in ath11k_hal_srng_dst_hw_init()
330 *srng->u.dst_ring.hp_addr = 0; in ath11k_hal_srng_dst_hw_init()
332 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_dst_hw_init()
334 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP) in ath11k_hal_srng_dst_hw_init()
336 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP) in ath11k_hal_srng_dst_hw_init()
338 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP) in ath11k_hal_srng_dst_hw_init()
346 struct hal_srng *srng) in ath11k_hal_srng_src_hw_init() argument
353 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_src_hw_init()
355 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) { in ath11k_hal_srng_src_hw_init()
358 srng->msi_addr); in ath11k_hal_srng_src_hw_init()
361 ((u64)srng->msi_addr >> in ath11k_hal_srng_src_hw_init()
370 srng->msi_data); in ath11k_hal_srng_src_hw_init()
373 ath11k_hif_write32(ab, reg_base, srng->ring_base_paddr); in ath11k_hal_srng_src_hw_init()
376 ((u64)srng->ring_base_paddr >> in ath11k_hal_srng_src_hw_init()
379 (srng->entry_size * srng->num_entries)); in ath11k_hal_srng_src_hw_init()
382 val = FIELD_PREP(HAL_REO1_RING_ID_ENTRY_SIZE, srng->entry_size); in ath11k_hal_srng_src_hw_init()
385 if (srng->ring_id == HAL_SRNG_RING_ID_WBM_IDLE_LINK) { in ath11k_hal_srng_src_hw_init()
386 ath11k_hif_write32(ab, reg_base, (u32)srng->ring_base_paddr); in ath11k_hal_srng_src_hw_init()
388 ((u64)srng->ring_base_paddr >> in ath11k_hal_srng_src_hw_init()
391 (srng->entry_size * srng->num_entries)); in ath11k_hal_srng_src_hw_init()
400 srng->intr_timer_thres_us); in ath11k_hal_srng_src_hw_init()
403 (srng->intr_batch_cntr_thres_entries * in ath11k_hal_srng_src_hw_init()
404 srng->entry_size)); in ath11k_hal_srng_src_hw_init()
411 if (srng->flags & HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN) { in ath11k_hal_srng_src_hw_init()
413 srng->u.src_ring.low_threshold); in ath11k_hal_srng_src_hw_init()
419 if (srng->ring_id != HAL_SRNG_RING_ID_WBM_IDLE_LINK) { in ath11k_hal_srng_src_hw_init()
421 ((unsigned long)srng->u.src_ring.tp_addr - in ath11k_hal_srng_src_hw_init()
432 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2]; in ath11k_hal_srng_src_hw_init()
435 *srng->u.src_ring.tp_addr = 0; in ath11k_hal_srng_src_hw_init()
437 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_src_hw_init()
439 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP) in ath11k_hal_srng_src_hw_init()
441 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP) in ath11k_hal_srng_src_hw_init()
443 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP) in ath11k_hal_srng_src_hw_init()
455 struct hal_srng *srng) in ath11k_hal_srng_hw_init() argument
457 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_hw_init()
458 ath11k_hal_srng_src_hw_init(ab, srng); in ath11k_hal_srng_hw_init()
460 ath11k_hal_srng_dst_hw_init(ab, srng); in ath11k_hal_srng_hw_init()
509 void ath11k_hal_srng_get_params(struct ath11k_base *ab, struct hal_srng *srng, in ath11k_hal_srng_get_params() argument
512 params->ring_base_paddr = srng->ring_base_paddr; in ath11k_hal_srng_get_params()
513 params->ring_base_vaddr = srng->ring_base_vaddr; in ath11k_hal_srng_get_params()
514 params->num_entries = srng->num_entries; in ath11k_hal_srng_get_params()
515 params->intr_timer_thres_us = srng->intr_timer_thres_us; in ath11k_hal_srng_get_params()
517 srng->intr_batch_cntr_thres_entries; in ath11k_hal_srng_get_params()
518 params->low_threshold = srng->u.src_ring.low_threshold; in ath11k_hal_srng_get_params()
519 params->msi_addr = srng->msi_addr; in ath11k_hal_srng_get_params()
520 params->msi_data = srng->msi_data; in ath11k_hal_srng_get_params()
521 params->flags = srng->flags; in ath11k_hal_srng_get_params()
525 struct hal_srng *srng) in ath11k_hal_srng_get_hp_addr() argument
527 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING)) in ath11k_hal_srng_get_hp_addr()
530 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_get_hp_addr()
532 ((unsigned long)srng->u.src_ring.hp_addr - in ath11k_hal_srng_get_hp_addr()
536 ((unsigned long)srng->u.dst_ring.hp_addr - in ath11k_hal_srng_get_hp_addr()
541 struct hal_srng *srng) in ath11k_hal_srng_get_tp_addr() argument
543 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING)) in ath11k_hal_srng_get_tp_addr()
546 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_get_tp_addr()
548 ((unsigned long)srng->u.src_ring.tp_addr - in ath11k_hal_srng_get_tp_addr()
552 ((unsigned long)srng->u.dst_ring.tp_addr - in ath11k_hal_srng_get_tp_addr()
620 u32 *ath11k_hal_srng_dst_peek(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_dst_peek() argument
622 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_dst_peek()
624 if (srng->u.dst_ring.tp != srng->u.dst_ring.cached_hp) in ath11k_hal_srng_dst_peek()
625 return (srng->ring_base_vaddr + srng->u.dst_ring.tp); in ath11k_hal_srng_dst_peek()
631 struct hal_srng *srng) in ath11k_hal_srng_dst_get_next_entry() argument
635 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_dst_get_next_entry()
637 if (srng->u.dst_ring.tp == srng->u.dst_ring.cached_hp) in ath11k_hal_srng_dst_get_next_entry()
640 desc = srng->ring_base_vaddr + srng->u.dst_ring.tp; in ath11k_hal_srng_dst_get_next_entry()
642 srng->u.dst_ring.tp = (srng->u.dst_ring.tp + srng->entry_size) % in ath11k_hal_srng_dst_get_next_entry()
643 srng->ring_size; in ath11k_hal_srng_dst_get_next_entry()
648 int ath11k_hal_srng_dst_num_free(struct ath11k_base *ab, struct hal_srng *srng, in ath11k_hal_srng_dst_num_free() argument
653 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_dst_num_free()
655 tp = srng->u.dst_ring.tp; in ath11k_hal_srng_dst_num_free()
658 hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_dst_num_free()
659 srng->u.dst_ring.cached_hp = hp; in ath11k_hal_srng_dst_num_free()
661 hp = srng->u.dst_ring.cached_hp; in ath11k_hal_srng_dst_num_free()
665 return (hp - tp) / srng->entry_size; in ath11k_hal_srng_dst_num_free()
667 return (srng->ring_size - tp + hp) / srng->entry_size; in ath11k_hal_srng_dst_num_free()
671 int ath11k_hal_srng_src_num_free(struct ath11k_base *ab, struct hal_srng *srng, in ath11k_hal_srng_src_num_free() argument
676 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_num_free()
678 hp = srng->u.src_ring.hp; in ath11k_hal_srng_src_num_free()
681 tp = *srng->u.src_ring.tp_addr; in ath11k_hal_srng_src_num_free()
682 srng->u.src_ring.cached_tp = tp; in ath11k_hal_srng_src_num_free()
684 tp = srng->u.src_ring.cached_tp; in ath11k_hal_srng_src_num_free()
688 return ((tp - hp) / srng->entry_size) - 1; in ath11k_hal_srng_src_num_free()
690 return ((srng->ring_size - hp + tp) / srng->entry_size) - 1; in ath11k_hal_srng_src_num_free()
694 struct hal_srng *srng) in ath11k_hal_srng_src_get_next_entry() argument
699 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_get_next_entry()
707 next_hp = (srng->u.src_ring.hp + srng->entry_size) % srng->ring_size; in ath11k_hal_srng_src_get_next_entry()
709 if (next_hp == srng->u.src_ring.cached_tp) in ath11k_hal_srng_src_get_next_entry()
712 desc = srng->ring_base_vaddr + srng->u.src_ring.hp; in ath11k_hal_srng_src_get_next_entry()
713 srng->u.src_ring.hp = next_hp; in ath11k_hal_srng_src_get_next_entry()
721 srng->u.src_ring.reap_hp = next_hp; in ath11k_hal_srng_src_get_next_entry()
727 struct hal_srng *srng) in ath11k_hal_srng_src_reap_next() argument
732 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_reap_next()
734 next_reap_hp = (srng->u.src_ring.reap_hp + srng->entry_size) % in ath11k_hal_srng_src_reap_next()
735 srng->ring_size; in ath11k_hal_srng_src_reap_next()
737 if (next_reap_hp == srng->u.src_ring.cached_tp) in ath11k_hal_srng_src_reap_next()
740 desc = srng->ring_base_vaddr + next_reap_hp; in ath11k_hal_srng_src_reap_next()
741 srng->u.src_ring.reap_hp = next_reap_hp; in ath11k_hal_srng_src_reap_next()
747 struct hal_srng *srng) in ath11k_hal_srng_src_get_next_reaped() argument
751 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_get_next_reaped()
753 if (srng->u.src_ring.hp == srng->u.src_ring.reap_hp) in ath11k_hal_srng_src_get_next_reaped()
756 desc = srng->ring_base_vaddr + srng->u.src_ring.hp; in ath11k_hal_srng_src_get_next_reaped()
757 srng->u.src_ring.hp = (srng->u.src_ring.hp + srng->entry_size) % in ath11k_hal_srng_src_get_next_reaped()
758 srng->ring_size; in ath11k_hal_srng_src_get_next_reaped()
763 u32 *ath11k_hal_srng_src_peek(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_src_peek() argument
765 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_peek()
767 if (((srng->u.src_ring.hp + srng->entry_size) % srng->ring_size) == in ath11k_hal_srng_src_peek()
768 srng->u.src_ring.cached_tp) in ath11k_hal_srng_src_peek()
771 return srng->ring_base_vaddr + srng->u.src_ring.hp; in ath11k_hal_srng_src_peek()
774 void ath11k_hal_srng_access_begin(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_access_begin() argument
776 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_access_begin()
778 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_access_begin()
779 srng->u.src_ring.cached_tp = in ath11k_hal_srng_access_begin()
780 *(volatile u32 *)srng->u.src_ring.tp_addr; in ath11k_hal_srng_access_begin()
782 srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_access_begin()
788 void ath11k_hal_srng_access_end(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_access_end() argument
790 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_access_end()
793 if (srng->flags & HAL_SRNG_FLAGS_LMAC_RING) { in ath11k_hal_srng_access_end()
797 if (srng->ring_dir == HAL_SRNG_DIR_SRC) { in ath11k_hal_srng_access_end()
798 srng->u.src_ring.last_tp = in ath11k_hal_srng_access_end()
799 *(volatile u32 *)srng->u.src_ring.tp_addr; in ath11k_hal_srng_access_end()
800 *srng->u.src_ring.hp_addr = srng->u.src_ring.hp; in ath11k_hal_srng_access_end()
802 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_access_end()
803 *srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp; in ath11k_hal_srng_access_end()
806 if (srng->ring_dir == HAL_SRNG_DIR_SRC) { in ath11k_hal_srng_access_end()
807 srng->u.src_ring.last_tp = in ath11k_hal_srng_access_end()
808 *(volatile u32 *)srng->u.src_ring.tp_addr; in ath11k_hal_srng_access_end()
810 (unsigned long)srng->u.src_ring.hp_addr - in ath11k_hal_srng_access_end()
812 srng->u.src_ring.hp); in ath11k_hal_srng_access_end()
814 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_access_end()
816 (unsigned long)srng->u.dst_ring.tp_addr - in ath11k_hal_srng_access_end()
818 srng->u.dst_ring.tp); in ath11k_hal_srng_access_end()
822 srng->timestamp = jiffies; in ath11k_hal_srng_access_end()
923 struct hal_srng *srng; in ath11k_hal_srng_setup() local
933 srng = &hal->srng_list[ring_id]; in ath11k_hal_srng_setup()
935 srng->ring_id = ring_id; in ath11k_hal_srng_setup()
936 srng->ring_dir = srng_config->ring_dir; in ath11k_hal_srng_setup()
937 srng->ring_base_paddr = params->ring_base_paddr; in ath11k_hal_srng_setup()
938 srng->ring_base_vaddr = params->ring_base_vaddr; in ath11k_hal_srng_setup()
939 srng->entry_size = srng_config->entry_size; in ath11k_hal_srng_setup()
940 srng->num_entries = params->num_entries; in ath11k_hal_srng_setup()
941 srng->ring_size = srng->entry_size * srng->num_entries; in ath11k_hal_srng_setup()
942 srng->intr_batch_cntr_thres_entries = in ath11k_hal_srng_setup()
944 srng->intr_timer_thres_us = params->intr_timer_thres_us; in ath11k_hal_srng_setup()
945 srng->flags = params->flags; in ath11k_hal_srng_setup()
946 srng->msi_addr = params->msi_addr; in ath11k_hal_srng_setup()
947 srng->msi_data = params->msi_data; in ath11k_hal_srng_setup()
948 srng->initialized = 1; in ath11k_hal_srng_setup()
949 spin_lock_init(&srng->lock); in ath11k_hal_srng_setup()
952 srng->hwreg_base[i] = srng_config->reg_start[i] + in ath11k_hal_srng_setup()
956 memset(srng->ring_base_vaddr, 0, in ath11k_hal_srng_setup()
957 (srng->entry_size * srng->num_entries) << 2); in ath11k_hal_srng_setup()
961 srng->flags |= HAL_SRNG_FLAGS_MSI_SWAP | HAL_SRNG_FLAGS_DATA_TLV_SWAP | in ath11k_hal_srng_setup()
964 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2]; in ath11k_hal_srng_setup()
966 if (srng->ring_dir == HAL_SRNG_DIR_SRC) { in ath11k_hal_srng_setup()
967 srng->u.src_ring.hp = 0; in ath11k_hal_srng_setup()
968 srng->u.src_ring.cached_tp = 0; in ath11k_hal_srng_setup()
969 srng->u.src_ring.reap_hp = srng->ring_size - srng->entry_size; in ath11k_hal_srng_setup()
970 srng->u.src_ring.tp_addr = (void *)(hal->rdp.vaddr + ring_id); in ath11k_hal_srng_setup()
971 srng->u.src_ring.low_threshold = params->low_threshold * in ath11k_hal_srng_setup()
972 srng->entry_size; in ath11k_hal_srng_setup()
975 srng->u.src_ring.hp_addr = (void *)(hal->wrp.vaddr + in ath11k_hal_srng_setup()
977 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING; in ath11k_hal_srng_setup()
980 srng->u.src_ring.hp_addr = in ath11k_hal_srng_setup()
987 (unsigned long)srng->u.src_ring.hp_addr - in ath11k_hal_srng_setup()
999 srng->u.dst_ring.loop_cnt = 1; in ath11k_hal_srng_setup()
1000 srng->u.dst_ring.tp = 0; in ath11k_hal_srng_setup()
1001 srng->u.dst_ring.cached_hp = 0; in ath11k_hal_srng_setup()
1002 srng->u.dst_ring.hp_addr = (void *)(hal->rdp.vaddr + ring_id); in ath11k_hal_srng_setup()
1008 srng->u.dst_ring.tp_addr = (void *)(hal->wrp.vaddr + in ath11k_hal_srng_setup()
1010 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING; in ath11k_hal_srng_setup()
1013 srng->u.dst_ring.tp_addr = in ath11k_hal_srng_setup()
1022 (unsigned long)srng->u.dst_ring.tp_addr - in ath11k_hal_srng_setup()
1030 ath11k_hal_srng_hw_init(ab, srng); in ath11k_hal_srng_setup()
1033 srng->u.dst_ring.max_buffer_length = params->max_buffer_len; in ath11k_hal_srng_setup()
1034 ath11k_hal_ce_dst_setup(ab, srng, ring_num); in ath11k_hal_srng_setup()
1045 struct hal_srng *srng; in ath11k_hal_srng_update_hp_tp_addr() local
1054 srng = &hal->srng_list[ring_id]; in ath11k_hal_srng_update_hp_tp_addr()
1057 srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) + in ath11k_hal_srng_update_hp_tp_addr()
1060 srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) + in ath11k_hal_srng_update_hp_tp_addr()
1134 struct hal_srng *srng) in ath11k_hal_srng_shadow_update_hp_tp() argument
1136 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_shadow_update_hp_tp()
1141 if (srng->ring_dir == HAL_SRNG_DIR_SRC && in ath11k_hal_srng_shadow_update_hp_tp()
1142 *srng->u.src_ring.tp_addr != srng->u.src_ring.hp) in ath11k_hal_srng_shadow_update_hp_tp()
1143 ath11k_hal_srng_access_end(ab, srng); in ath11k_hal_srng_shadow_update_hp_tp()
1277 struct hal_srng *srng; in ath11k_hal_dump_srng_stats() local
1303 srng = &ab->hal.srng_list[i]; in ath11k_hal_dump_srng_stats()
1305 if (!srng->initialized) in ath11k_hal_dump_srng_stats()
1308 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_dump_srng_stats()
1311 srng->ring_id, srng->u.src_ring.hp, in ath11k_hal_dump_srng_stats()
1312 srng->u.src_ring.reap_hp, in ath11k_hal_dump_srng_stats()
1313 *srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp, in ath11k_hal_dump_srng_stats()
1314 srng->u.src_ring.last_tp, in ath11k_hal_dump_srng_stats()
1315 jiffies_to_msecs(jiffies - srng->timestamp)); in ath11k_hal_dump_srng_stats()
1316 else if (srng->ring_dir == HAL_SRNG_DIR_DST) in ath11k_hal_dump_srng_stats()
1319 srng->ring_id, srng->u.dst_ring.tp, in ath11k_hal_dump_srng_stats()
1320 *srng->u.dst_ring.hp_addr, in ath11k_hal_dump_srng_stats()
1321 srng->u.dst_ring.cached_hp, in ath11k_hal_dump_srng_stats()
1322 srng->u.dst_ring.last_hp, in ath11k_hal_dump_srng_stats()
1323 jiffies_to_msecs(jiffies - srng->timestamp)); in ath11k_hal_dump_srng_stats()