Lines Matching refs:srng

250 				    struct hal_srng *srng, int ring_num)
263 srng->u.dst_ring.max_buffer_length);
268 struct hal_srng *srng)
275 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
277 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
280 srng->msi_addr);
283 ((u64)srng->msi_addr >>
291 srng->msi_data);
294 ath11k_hif_write32(ab, reg_base, srng->ring_base_paddr);
297 ((u64)srng->ring_base_paddr >>
300 (srng->entry_size * srng->num_entries));
303 val = FIELD_PREP(HAL_REO1_RING_ID_RING_ID, srng->ring_id) |
304 FIELD_PREP(HAL_REO1_RING_ID_ENTRY_SIZE, srng->entry_size);
309 (srng->intr_timer_thres_us >> 3));
312 (srng->intr_batch_cntr_thres_entries *
313 srng->entry_size));
320 ((unsigned long)srng->u.dst_ring.hp_addr -
328 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
331 *srng->u.dst_ring.hp_addr = 0;
333 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
335 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
337 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
339 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
347 struct hal_srng *srng)
354 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
356 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
359 srng->msi_addr);
362 ((u64)srng->msi_addr >>
371 srng->msi_data);
374 ath11k_hif_write32(ab, reg_base, srng->ring_base_paddr);
377 ((u64)srng->ring_base_paddr >>
380 (srng->entry_size * srng->num_entries));
383 val = FIELD_PREP(HAL_REO1_RING_ID_ENTRY_SIZE, srng->entry_size);
386 if (srng->ring_id == HAL_SRNG_RING_ID_WBM_IDLE_LINK) {
387 ath11k_hif_write32(ab, reg_base, (u32)srng->ring_base_paddr);
389 ((u64)srng->ring_base_paddr >>
392 (srng->entry_size * srng->num_entries));
401 srng->intr_timer_thres_us);
404 (srng->intr_batch_cntr_thres_entries *
405 srng->entry_size));
412 if (srng->flags & HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN) {
414 srng->u.src_ring.low_threshold);
420 if (srng->ring_id != HAL_SRNG_RING_ID_WBM_IDLE_LINK) {
422 ((unsigned long)srng->u.src_ring.tp_addr -
433 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
436 *srng->u.src_ring.tp_addr = 0;
438 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
440 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
442 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
444 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
456 struct hal_srng *srng)
458 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
459 ath11k_hal_srng_src_hw_init(ab, srng);
461 ath11k_hal_srng_dst_hw_init(ab, srng);
510 void ath11k_hal_srng_get_params(struct ath11k_base *ab, struct hal_srng *srng,
513 params->ring_base_paddr = srng->ring_base_paddr;
514 params->ring_base_vaddr = srng->ring_base_vaddr;
515 params->num_entries = srng->num_entries;
516 params->intr_timer_thres_us = srng->intr_timer_thres_us;
518 srng->intr_batch_cntr_thres_entries;
519 params->low_threshold = srng->u.src_ring.low_threshold;
520 params->msi_addr = srng->msi_addr;
521 params->msi_data = srng->msi_data;
522 params->flags = srng->flags;
526 struct hal_srng *srng)
528 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
531 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
533 ((unsigned long)srng->u.src_ring.hp_addr -
537 ((unsigned long)srng->u.dst_ring.hp_addr -
542 struct hal_srng *srng)
544 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
547 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
549 ((unsigned long)srng->u.src_ring.tp_addr -
553 ((unsigned long)srng->u.dst_ring.tp_addr -
621 u32 *ath11k_hal_srng_dst_peek(struct ath11k_base *ab, struct hal_srng *srng)
623 lockdep_assert_held(&srng->lock);
625 if (srng->u.dst_ring.tp != srng->u.dst_ring.cached_hp)
626 return (srng->ring_base_vaddr + srng->u.dst_ring.tp);
632 struct hal_srng *srng)
637 desc = ath11k_hal_srng_dst_peek(ab, srng);
640 (srng->entry_size * sizeof(u32)),
647 struct hal_srng *srng)
651 lockdep_assert_held(&srng->lock);
653 if (srng->u.dst_ring.tp == srng->u.dst_ring.cached_hp)
656 desc = srng->ring_base_vaddr + srng->u.dst_ring.tp;
658 srng->u.dst_ring.tp += srng->entry_size;
661 if (srng->u.dst_ring.tp == srng->ring_size)
662 srng->u.dst_ring.tp = 0;
665 if (srng->flags & HAL_SRNG_FLAGS_CACHED)
666 ath11k_hal_srng_prefetch_desc(ab, srng);
671 int ath11k_hal_srng_dst_num_free(struct ath11k_base *ab, struct hal_srng *srng,
676 lockdep_assert_held(&srng->lock);
678 tp = srng->u.dst_ring.tp;
681 hp = *srng->u.dst_ring.hp_addr;
682 srng->u.dst_ring.cached_hp = hp;
684 hp = srng->u.dst_ring.cached_hp;
688 return (hp - tp) / srng->entry_size;
690 return (srng->ring_size - tp + hp) / srng->entry_size;
694 int ath11k_hal_srng_src_num_free(struct ath11k_base *ab, struct hal_srng *srng,
699 lockdep_assert_held(&srng->lock);
701 hp = srng->u.src_ring.hp;
704 tp = *srng->u.src_ring.tp_addr;
705 srng->u.src_ring.cached_tp = tp;
707 tp = srng->u.src_ring.cached_tp;
711 return ((tp - hp) / srng->entry_size) - 1;
713 return ((srng->ring_size - hp + tp) / srng->entry_size) - 1;
717 struct hal_srng *srng)
722 lockdep_assert_held(&srng->lock);
730 next_hp = (srng->u.src_ring.hp + srng->entry_size) % srng->ring_size;
732 if (next_hp == srng->u.src_ring.cached_tp)
735 desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
736 srng->u.src_ring.hp = next_hp;
744 srng->u.src_ring.reap_hp = next_hp;
750 struct hal_srng *srng)
755 lockdep_assert_held(&srng->lock);
757 next_reap_hp = (srng->u.src_ring.reap_hp + srng->entry_size) %
758 srng->ring_size;
760 if (next_reap_hp == srng->u.src_ring.cached_tp)
763 desc = srng->ring_base_vaddr + next_reap_hp;
764 srng->u.src_ring.reap_hp = next_reap_hp;
770 struct hal_srng *srng)
774 lockdep_assert_held(&srng->lock);
776 if (srng->u.src_ring.hp == srng->u.src_ring.reap_hp)
779 desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
780 srng->u.src_ring.hp = (srng->u.src_ring.hp + srng->entry_size) %
781 srng->ring_size;
786 u32 *ath11k_hal_srng_src_peek(struct ath11k_base *ab, struct hal_srng *srng)
788 lockdep_assert_held(&srng->lock);
790 if (((srng->u.src_ring.hp + srng->entry_size) % srng->ring_size) ==
791 srng->u.src_ring.cached_tp)
794 return srng->ring_base_vaddr + srng->u.src_ring.hp;
797 void ath11k_hal_srng_access_begin(struct ath11k_base *ab, struct hal_srng *srng)
799 lockdep_assert_held(&srng->lock);
801 if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
802 srng->u.src_ring.cached_tp =
803 *(volatile u32 *)srng->u.src_ring.tp_addr;
805 srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr;
808 if (srng->flags & HAL_SRNG_FLAGS_CACHED)
809 ath11k_hal_srng_prefetch_desc(ab, srng);
816 void ath11k_hal_srng_access_end(struct ath11k_base *ab, struct hal_srng *srng)
818 lockdep_assert_held(&srng->lock);
821 if (srng->flags & HAL_SRNG_FLAGS_LMAC_RING) {
825 if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
826 srng->u.src_ring.last_tp =
827 *(volatile u32 *)srng->u.src_ring.tp_addr;
828 *srng->u.src_ring.hp_addr = srng->u.src_ring.hp;
830 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
831 *srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
834 if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
835 srng->u.src_ring.last_tp =
836 *(volatile u32 *)srng->u.src_ring.tp_addr;
838 (unsigned long)srng->u.src_ring.hp_addr -
840 srng->u.src_ring.hp);
842 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
844 (unsigned long)srng->u.dst_ring.tp_addr -
846 srng->u.dst_ring.tp);
850 srng->timestamp = jiffies;
951 struct hal_srng *srng;
961 srng = &hal->srng_list[ring_id];
963 srng->ring_id = ring_id;
964 srng->ring_dir = srng_config->ring_dir;
965 srng->ring_base_paddr = params->ring_base_paddr;
966 srng->ring_base_vaddr = params->ring_base_vaddr;
967 srng->entry_size = srng_config->entry_size;
968 srng->num_entries = params->num_entries;
969 srng->ring_size = srng->entry_size * srng->num_entries;
970 srng->intr_batch_cntr_thres_entries =
972 srng->intr_timer_thres_us = params->intr_timer_thres_us;
973 srng->flags = params->flags;
974 srng->msi_addr = params->msi_addr;
975 srng->msi_data = params->msi_data;
976 srng->initialized = 1;
977 spin_lock_init(&srng->lock);
978 lockdep_set_class(&srng->lock, hal->srng_key + ring_id);
981 srng->hwreg_base[i] = srng_config->reg_start[i] +
985 memset(srng->ring_base_vaddr, 0,
986 (srng->entry_size * srng->num_entries) << 2);
990 srng->flags |= HAL_SRNG_FLAGS_MSI_SWAP | HAL_SRNG_FLAGS_DATA_TLV_SWAP |
993 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
995 if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
996 srng->u.src_ring.hp = 0;
997 srng->u.src_ring.cached_tp = 0;
998 srng->u.src_ring.reap_hp = srng->ring_size - srng->entry_size;
999 srng->u.src_ring.tp_addr = (void *)(hal->rdp.vaddr + ring_id);
1000 srng->u.src_ring.low_threshold = params->low_threshold *
1001 srng->entry_size;
1004 srng->u.src_ring.hp_addr = (void *)(hal->wrp.vaddr +
1006 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
1009 srng->u.src_ring.hp_addr =
1016 (unsigned long)srng->u.src_ring.hp_addr -
1028 srng->u.dst_ring.loop_cnt = 1;
1029 srng->u.dst_ring.tp = 0;
1030 srng->u.dst_ring.cached_hp = 0;
1031 srng->u.dst_ring.hp_addr = (void *)(hal->rdp.vaddr + ring_id);
1037 srng->u.dst_ring.tp_addr = (void *)(hal->wrp.vaddr +
1039 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
1042 srng->u.dst_ring.tp_addr =
1051 (unsigned long)srng->u.dst_ring.tp_addr -
1059 ath11k_hal_srng_hw_init(ab, srng);
1062 srng->u.dst_ring.max_buffer_length = params->max_buffer_len;
1063 ath11k_hal_ce_dst_setup(ab, srng, ring_num);
1074 struct hal_srng *srng;
1083 srng = &hal->srng_list[ring_id];
1086 srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(ab, shadow_cfg_idx) +
1089 srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(ab, shadow_cfg_idx) +
1163 struct hal_srng *srng)
1165 lockdep_assert_held(&srng->lock);
1170 if (srng->ring_dir == HAL_SRNG_DIR_SRC &&
1171 *srng->u.src_ring.tp_addr != srng->u.src_ring.hp)
1172 ath11k_hal_srng_access_end(ab, srng);
1332 struct hal_srng *srng;
1358 srng = &ab->hal.srng_list[i];
1360 if (!srng->initialized)
1363 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1365 "src srng id %u hp %u, reap_hp %u, cur tp %u, cached tp %u last tp %u napi processed before %ums\n",
1366 srng->ring_id, srng->u.src_ring.hp,
1367 srng->u.src_ring.reap_hp,
1368 *srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp,
1369 srng->u.src_ring.last_tp,
1370 jiffies_to_msecs(jiffies - srng->timestamp));
1371 else if (srng->ring_dir == HAL_SRNG_DIR_DST)
1373 "dst srng id %u tp %u, cur hp %u, cached hp %u last hp %u napi processed before %ums\n",
1374 srng->ring_id, srng->u.dst_ring.tp,
1375 *srng->u.dst_ring.hp_addr,
1376 srng->u.dst_ring.cached_hp,
1377 srng->u.dst_ring.last_hp,
1378 jiffies_to_msecs(jiffies - srng->timestamp));