Lines Matching refs:srng
303 struct hal_srng *srng, int ring_num) in ath11k_hal_ce_dst_setup() argument
316 srng->u.dst_ring.max_buffer_length); in ath11k_hal_ce_dst_setup()
321 struct hal_srng *srng) in ath11k_hal_srng_dst_hw_init() argument
328 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_dst_hw_init()
330 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) { in ath11k_hal_srng_dst_hw_init()
333 srng->msi_addr); in ath11k_hal_srng_dst_hw_init()
336 ((u64)srng->msi_addr >> in ath11k_hal_srng_dst_hw_init()
344 srng->msi_data); in ath11k_hal_srng_dst_hw_init()
347 ath11k_hif_write32(ab, reg_base, srng->ring_base_paddr); in ath11k_hal_srng_dst_hw_init()
350 ((u64)srng->ring_base_paddr >> in ath11k_hal_srng_dst_hw_init()
353 (srng->entry_size * srng->num_entries)); in ath11k_hal_srng_dst_hw_init()
356 val = FIELD_PREP(HAL_REO1_RING_ID_RING_ID, srng->ring_id) | in ath11k_hal_srng_dst_hw_init()
357 FIELD_PREP(HAL_REO1_RING_ID_ENTRY_SIZE, srng->entry_size); in ath11k_hal_srng_dst_hw_init()
362 (srng->intr_timer_thres_us >> 3)); in ath11k_hal_srng_dst_hw_init()
365 (srng->intr_batch_cntr_thres_entries * in ath11k_hal_srng_dst_hw_init()
366 srng->entry_size)); in ath11k_hal_srng_dst_hw_init()
373 ((unsigned long)srng->u.dst_ring.hp_addr - in ath11k_hal_srng_dst_hw_init()
381 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2]; in ath11k_hal_srng_dst_hw_init()
384 *srng->u.dst_ring.hp_addr = 0; in ath11k_hal_srng_dst_hw_init()
386 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_dst_hw_init()
388 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP) in ath11k_hal_srng_dst_hw_init()
390 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP) in ath11k_hal_srng_dst_hw_init()
392 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP) in ath11k_hal_srng_dst_hw_init()
400 struct hal_srng *srng) in ath11k_hal_srng_src_hw_init() argument
407 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_src_hw_init()
409 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) { in ath11k_hal_srng_src_hw_init()
412 srng->msi_addr); in ath11k_hal_srng_src_hw_init()
415 ((u64)srng->msi_addr >> in ath11k_hal_srng_src_hw_init()
424 srng->msi_data); in ath11k_hal_srng_src_hw_init()
427 ath11k_hif_write32(ab, reg_base, srng->ring_base_paddr); in ath11k_hal_srng_src_hw_init()
430 ((u64)srng->ring_base_paddr >> in ath11k_hal_srng_src_hw_init()
433 (srng->entry_size * srng->num_entries)); in ath11k_hal_srng_src_hw_init()
436 val = FIELD_PREP(HAL_REO1_RING_ID_ENTRY_SIZE, srng->entry_size); in ath11k_hal_srng_src_hw_init()
444 srng->intr_timer_thres_us); in ath11k_hal_srng_src_hw_init()
447 (srng->intr_batch_cntr_thres_entries * in ath11k_hal_srng_src_hw_init()
448 srng->entry_size)); in ath11k_hal_srng_src_hw_init()
455 if (srng->flags & HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN) { in ath11k_hal_srng_src_hw_init()
457 srng->u.src_ring.low_threshold); in ath11k_hal_srng_src_hw_init()
463 if (srng->ring_id != HAL_SRNG_RING_ID_WBM_IDLE_LINK) { in ath11k_hal_srng_src_hw_init()
465 ((unsigned long)srng->u.src_ring.tp_addr - in ath11k_hal_srng_src_hw_init()
476 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2]; in ath11k_hal_srng_src_hw_init()
479 *srng->u.src_ring.tp_addr = 0; in ath11k_hal_srng_src_hw_init()
481 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0]; in ath11k_hal_srng_src_hw_init()
483 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP) in ath11k_hal_srng_src_hw_init()
485 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP) in ath11k_hal_srng_src_hw_init()
487 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP) in ath11k_hal_srng_src_hw_init()
499 struct hal_srng *srng) in ath11k_hal_srng_hw_init() argument
501 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_hw_init()
502 ath11k_hal_srng_src_hw_init(ab, srng); in ath11k_hal_srng_hw_init()
504 ath11k_hal_srng_dst_hw_init(ab, srng); in ath11k_hal_srng_hw_init()
553 void ath11k_hal_srng_get_params(struct ath11k_base *ab, struct hal_srng *srng, in ath11k_hal_srng_get_params() argument
556 params->ring_base_paddr = srng->ring_base_paddr; in ath11k_hal_srng_get_params()
557 params->ring_base_vaddr = srng->ring_base_vaddr; in ath11k_hal_srng_get_params()
558 params->num_entries = srng->num_entries; in ath11k_hal_srng_get_params()
559 params->intr_timer_thres_us = srng->intr_timer_thres_us; in ath11k_hal_srng_get_params()
561 srng->intr_batch_cntr_thres_entries; in ath11k_hal_srng_get_params()
562 params->low_threshold = srng->u.src_ring.low_threshold; in ath11k_hal_srng_get_params()
563 params->msi_addr = srng->msi_addr; in ath11k_hal_srng_get_params()
564 params->msi_data = srng->msi_data; in ath11k_hal_srng_get_params()
565 params->flags = srng->flags; in ath11k_hal_srng_get_params()
569 struct hal_srng *srng) in ath11k_hal_srng_get_hp_addr() argument
571 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING)) in ath11k_hal_srng_get_hp_addr()
574 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_get_hp_addr()
576 ((unsigned long)srng->u.src_ring.hp_addr - in ath11k_hal_srng_get_hp_addr()
580 ((unsigned long)srng->u.dst_ring.hp_addr - in ath11k_hal_srng_get_hp_addr()
585 struct hal_srng *srng) in ath11k_hal_srng_get_tp_addr() argument
587 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING)) in ath11k_hal_srng_get_tp_addr()
590 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_get_tp_addr()
592 ((unsigned long)srng->u.src_ring.tp_addr - in ath11k_hal_srng_get_tp_addr()
596 ((unsigned long)srng->u.dst_ring.tp_addr - in ath11k_hal_srng_get_tp_addr()
664 u32 *ath11k_hal_srng_dst_peek(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_dst_peek() argument
666 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_dst_peek()
668 if (srng->u.dst_ring.tp != srng->u.dst_ring.cached_hp) in ath11k_hal_srng_dst_peek()
669 return (srng->ring_base_vaddr + srng->u.dst_ring.tp); in ath11k_hal_srng_dst_peek()
675 struct hal_srng *srng) in ath11k_hal_srng_dst_get_next_entry() argument
679 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_dst_get_next_entry()
681 if (srng->u.dst_ring.tp == srng->u.dst_ring.cached_hp) in ath11k_hal_srng_dst_get_next_entry()
684 desc = srng->ring_base_vaddr + srng->u.dst_ring.tp; in ath11k_hal_srng_dst_get_next_entry()
686 srng->u.dst_ring.tp = (srng->u.dst_ring.tp + srng->entry_size) % in ath11k_hal_srng_dst_get_next_entry()
687 srng->ring_size; in ath11k_hal_srng_dst_get_next_entry()
692 int ath11k_hal_srng_dst_num_free(struct ath11k_base *ab, struct hal_srng *srng, in ath11k_hal_srng_dst_num_free() argument
697 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_dst_num_free()
699 tp = srng->u.dst_ring.tp; in ath11k_hal_srng_dst_num_free()
702 hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_dst_num_free()
703 srng->u.dst_ring.cached_hp = hp; in ath11k_hal_srng_dst_num_free()
705 hp = srng->u.dst_ring.cached_hp; in ath11k_hal_srng_dst_num_free()
709 return (hp - tp) / srng->entry_size; in ath11k_hal_srng_dst_num_free()
711 return (srng->ring_size - tp + hp) / srng->entry_size; in ath11k_hal_srng_dst_num_free()
715 int ath11k_hal_srng_src_num_free(struct ath11k_base *ab, struct hal_srng *srng, in ath11k_hal_srng_src_num_free() argument
720 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_num_free()
722 hp = srng->u.src_ring.hp; in ath11k_hal_srng_src_num_free()
725 tp = *srng->u.src_ring.tp_addr; in ath11k_hal_srng_src_num_free()
726 srng->u.src_ring.cached_tp = tp; in ath11k_hal_srng_src_num_free()
728 tp = srng->u.src_ring.cached_tp; in ath11k_hal_srng_src_num_free()
732 return ((tp - hp) / srng->entry_size) - 1; in ath11k_hal_srng_src_num_free()
734 return ((srng->ring_size - hp + tp) / srng->entry_size) - 1; in ath11k_hal_srng_src_num_free()
738 struct hal_srng *srng) in ath11k_hal_srng_src_get_next_entry() argument
743 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_get_next_entry()
751 next_hp = (srng->u.src_ring.hp + srng->entry_size) % srng->ring_size; in ath11k_hal_srng_src_get_next_entry()
753 if (next_hp == srng->u.src_ring.cached_tp) in ath11k_hal_srng_src_get_next_entry()
756 desc = srng->ring_base_vaddr + srng->u.src_ring.hp; in ath11k_hal_srng_src_get_next_entry()
757 srng->u.src_ring.hp = next_hp; in ath11k_hal_srng_src_get_next_entry()
765 srng->u.src_ring.reap_hp = next_hp; in ath11k_hal_srng_src_get_next_entry()
771 struct hal_srng *srng) in ath11k_hal_srng_src_reap_next() argument
776 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_reap_next()
778 next_reap_hp = (srng->u.src_ring.reap_hp + srng->entry_size) % in ath11k_hal_srng_src_reap_next()
779 srng->ring_size; in ath11k_hal_srng_src_reap_next()
781 if (next_reap_hp == srng->u.src_ring.cached_tp) in ath11k_hal_srng_src_reap_next()
784 desc = srng->ring_base_vaddr + next_reap_hp; in ath11k_hal_srng_src_reap_next()
785 srng->u.src_ring.reap_hp = next_reap_hp; in ath11k_hal_srng_src_reap_next()
791 struct hal_srng *srng) in ath11k_hal_srng_src_get_next_reaped() argument
795 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_get_next_reaped()
797 if (srng->u.src_ring.hp == srng->u.src_ring.reap_hp) in ath11k_hal_srng_src_get_next_reaped()
800 desc = srng->ring_base_vaddr + srng->u.src_ring.hp; in ath11k_hal_srng_src_get_next_reaped()
801 srng->u.src_ring.hp = (srng->u.src_ring.hp + srng->entry_size) % in ath11k_hal_srng_src_get_next_reaped()
802 srng->ring_size; in ath11k_hal_srng_src_get_next_reaped()
807 u32 *ath11k_hal_srng_src_peek(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_src_peek() argument
809 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_src_peek()
811 if (((srng->u.src_ring.hp + srng->entry_size) % srng->ring_size) == in ath11k_hal_srng_src_peek()
812 srng->u.src_ring.cached_tp) in ath11k_hal_srng_src_peek()
815 return srng->ring_base_vaddr + srng->u.src_ring.hp; in ath11k_hal_srng_src_peek()
818 void ath11k_hal_srng_access_begin(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_access_begin() argument
820 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_access_begin()
822 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_srng_access_begin()
823 srng->u.src_ring.cached_tp = in ath11k_hal_srng_access_begin()
824 *(volatile u32 *)srng->u.src_ring.tp_addr; in ath11k_hal_srng_access_begin()
826 srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_access_begin()
832 void ath11k_hal_srng_access_end(struct ath11k_base *ab, struct hal_srng *srng) in ath11k_hal_srng_access_end() argument
834 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_access_end()
837 if (srng->flags & HAL_SRNG_FLAGS_LMAC_RING) { in ath11k_hal_srng_access_end()
841 if (srng->ring_dir == HAL_SRNG_DIR_SRC) { in ath11k_hal_srng_access_end()
842 srng->u.src_ring.last_tp = in ath11k_hal_srng_access_end()
843 *(volatile u32 *)srng->u.src_ring.tp_addr; in ath11k_hal_srng_access_end()
844 *srng->u.src_ring.hp_addr = srng->u.src_ring.hp; in ath11k_hal_srng_access_end()
846 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_access_end()
847 *srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp; in ath11k_hal_srng_access_end()
850 if (srng->ring_dir == HAL_SRNG_DIR_SRC) { in ath11k_hal_srng_access_end()
851 srng->u.src_ring.last_tp = in ath11k_hal_srng_access_end()
852 *(volatile u32 *)srng->u.src_ring.tp_addr; in ath11k_hal_srng_access_end()
854 (unsigned long)srng->u.src_ring.hp_addr - in ath11k_hal_srng_access_end()
856 srng->u.src_ring.hp); in ath11k_hal_srng_access_end()
858 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr; in ath11k_hal_srng_access_end()
860 (unsigned long)srng->u.dst_ring.tp_addr - in ath11k_hal_srng_access_end()
862 srng->u.dst_ring.tp); in ath11k_hal_srng_access_end()
866 srng->timestamp = jiffies; in ath11k_hal_srng_access_end()
967 struct hal_srng *srng; in ath11k_hal_srng_setup() local
977 srng = &hal->srng_list[ring_id]; in ath11k_hal_srng_setup()
979 srng->ring_id = ring_id; in ath11k_hal_srng_setup()
980 srng->ring_dir = srng_config->ring_dir; in ath11k_hal_srng_setup()
981 srng->ring_base_paddr = params->ring_base_paddr; in ath11k_hal_srng_setup()
982 srng->ring_base_vaddr = params->ring_base_vaddr; in ath11k_hal_srng_setup()
983 srng->entry_size = srng_config->entry_size; in ath11k_hal_srng_setup()
984 srng->num_entries = params->num_entries; in ath11k_hal_srng_setup()
985 srng->ring_size = srng->entry_size * srng->num_entries; in ath11k_hal_srng_setup()
986 srng->intr_batch_cntr_thres_entries = in ath11k_hal_srng_setup()
988 srng->intr_timer_thres_us = params->intr_timer_thres_us; in ath11k_hal_srng_setup()
989 srng->flags = params->flags; in ath11k_hal_srng_setup()
990 srng->msi_addr = params->msi_addr; in ath11k_hal_srng_setup()
991 srng->msi_data = params->msi_data; in ath11k_hal_srng_setup()
992 srng->initialized = 1; in ath11k_hal_srng_setup()
993 spin_lock_init(&srng->lock); in ath11k_hal_srng_setup()
994 lockdep_set_class(&srng->lock, hal->srng_key + ring_id); in ath11k_hal_srng_setup()
997 srng->hwreg_base[i] = srng_config->reg_start[i] + in ath11k_hal_srng_setup()
1001 memset(srng->ring_base_vaddr, 0, in ath11k_hal_srng_setup()
1002 (srng->entry_size * srng->num_entries) << 2); in ath11k_hal_srng_setup()
1006 srng->flags |= HAL_SRNG_FLAGS_MSI_SWAP | HAL_SRNG_FLAGS_DATA_TLV_SWAP | in ath11k_hal_srng_setup()
1009 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2]; in ath11k_hal_srng_setup()
1011 if (srng->ring_dir == HAL_SRNG_DIR_SRC) { in ath11k_hal_srng_setup()
1012 srng->u.src_ring.hp = 0; in ath11k_hal_srng_setup()
1013 srng->u.src_ring.cached_tp = 0; in ath11k_hal_srng_setup()
1014 srng->u.src_ring.reap_hp = srng->ring_size - srng->entry_size; in ath11k_hal_srng_setup()
1015 srng->u.src_ring.tp_addr = (void *)(hal->rdp.vaddr + ring_id); in ath11k_hal_srng_setup()
1016 srng->u.src_ring.low_threshold = params->low_threshold * in ath11k_hal_srng_setup()
1017 srng->entry_size; in ath11k_hal_srng_setup()
1020 srng->u.src_ring.hp_addr = (void *)(hal->wrp.vaddr + in ath11k_hal_srng_setup()
1022 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING; in ath11k_hal_srng_setup()
1025 srng->u.src_ring.hp_addr = in ath11k_hal_srng_setup()
1032 (unsigned long)srng->u.src_ring.hp_addr - in ath11k_hal_srng_setup()
1044 srng->u.dst_ring.loop_cnt = 1; in ath11k_hal_srng_setup()
1045 srng->u.dst_ring.tp = 0; in ath11k_hal_srng_setup()
1046 srng->u.dst_ring.cached_hp = 0; in ath11k_hal_srng_setup()
1047 srng->u.dst_ring.hp_addr = (void *)(hal->rdp.vaddr + ring_id); in ath11k_hal_srng_setup()
1053 srng->u.dst_ring.tp_addr = (void *)(hal->wrp.vaddr + in ath11k_hal_srng_setup()
1055 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING; in ath11k_hal_srng_setup()
1058 srng->u.dst_ring.tp_addr = in ath11k_hal_srng_setup()
1067 (unsigned long)srng->u.dst_ring.tp_addr - in ath11k_hal_srng_setup()
1075 ath11k_hal_srng_hw_init(ab, srng); in ath11k_hal_srng_setup()
1078 srng->u.dst_ring.max_buffer_length = params->max_buffer_len; in ath11k_hal_srng_setup()
1079 ath11k_hal_ce_dst_setup(ab, srng, ring_num); in ath11k_hal_srng_setup()
1090 struct hal_srng *srng; in ath11k_hal_srng_update_hp_tp_addr() local
1099 srng = &hal->srng_list[ring_id]; in ath11k_hal_srng_update_hp_tp_addr()
1102 srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) + in ath11k_hal_srng_update_hp_tp_addr()
1105 srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) + in ath11k_hal_srng_update_hp_tp_addr()
1179 struct hal_srng *srng) in ath11k_hal_srng_shadow_update_hp_tp() argument
1181 lockdep_assert_held(&srng->lock); in ath11k_hal_srng_shadow_update_hp_tp()
1186 if (srng->ring_dir == HAL_SRNG_DIR_SRC && in ath11k_hal_srng_shadow_update_hp_tp()
1187 *srng->u.src_ring.tp_addr != srng->u.src_ring.hp) in ath11k_hal_srng_shadow_update_hp_tp()
1188 ath11k_hal_srng_access_end(ab, srng); in ath11k_hal_srng_shadow_update_hp_tp()
1303 struct hal_srng *srng; in ath11k_hal_dump_srng_stats() local
1329 srng = &ab->hal.srng_list[i]; in ath11k_hal_dump_srng_stats()
1331 if (!srng->initialized) in ath11k_hal_dump_srng_stats()
1334 if (srng->ring_dir == HAL_SRNG_DIR_SRC) in ath11k_hal_dump_srng_stats()
1337 srng->ring_id, srng->u.src_ring.hp, in ath11k_hal_dump_srng_stats()
1338 srng->u.src_ring.reap_hp, in ath11k_hal_dump_srng_stats()
1339 *srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp, in ath11k_hal_dump_srng_stats()
1340 srng->u.src_ring.last_tp, in ath11k_hal_dump_srng_stats()
1341 jiffies_to_msecs(jiffies - srng->timestamp)); in ath11k_hal_dump_srng_stats()
1342 else if (srng->ring_dir == HAL_SRNG_DIR_DST) in ath11k_hal_dump_srng_stats()
1345 srng->ring_id, srng->u.dst_ring.tp, in ath11k_hal_dump_srng_stats()
1346 *srng->u.dst_ring.hp_addr, in ath11k_hal_dump_srng_stats()
1347 srng->u.dst_ring.cached_hp, in ath11k_hal_dump_srng_stats()
1348 srng->u.dst_ring.last_hp, in ath11k_hal_dump_srng_stats()
1349 jiffies_to_msecs(jiffies - srng->timestamp)); in ath11k_hal_dump_srng_stats()