Lines Matching refs:srng

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