Lines Matching refs:srng
1236 struct hal_srng *srng, int ring_num)
1248 val |= u32_encode_bits(srng->u.dst_ring.max_buffer_length,
1254 struct hal_srng *srng)
1261 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1263 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
1266 srng->msi_addr);
1268 val = u32_encode_bits(((u64)srng->msi_addr >> HAL_ADDR_MSB_REG_SHIFT),
1276 srng->msi_data);
1279 ath12k_hif_write32(ab, reg_base, srng->ring_base_paddr);
1281 val = u32_encode_bits(((u64)srng->ring_base_paddr >> HAL_ADDR_MSB_REG_SHIFT),
1283 u32_encode_bits((srng->entry_size * srng->num_entries),
1287 val = u32_encode_bits(srng->ring_id, HAL_REO1_RING_ID_RING_ID) |
1288 u32_encode_bits(srng->entry_size, HAL_REO1_RING_ID_ENTRY_SIZE);
1292 val = u32_encode_bits((srng->intr_timer_thres_us >> 3),
1295 val |= u32_encode_bits((srng->intr_batch_cntr_thres_entries * srng->entry_size),
1303 ((unsigned long)srng->u.dst_ring.hp_addr -
1311 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1314 *srng->u.dst_ring.hp_addr = 0;
1316 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1318 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
1320 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
1322 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
1330 struct hal_srng *srng)
1337 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1339 if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
1342 srng->msi_addr);
1344 val = u32_encode_bits(((u64)srng->msi_addr >> HAL_ADDR_MSB_REG_SHIFT),
1353 srng->msi_data);
1356 ath12k_hif_write32(ab, reg_base, srng->ring_base_paddr);
1358 val = u32_encode_bits(((u64)srng->ring_base_paddr >> HAL_ADDR_MSB_REG_SHIFT),
1360 u32_encode_bits((srng->entry_size * srng->num_entries),
1364 val = u32_encode_bits(srng->entry_size, HAL_REO1_RING_ID_ENTRY_SIZE);
1367 val = u32_encode_bits(srng->intr_timer_thres_us,
1370 val |= u32_encode_bits((srng->intr_batch_cntr_thres_entries * srng->entry_size),
1378 if (srng->flags & HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN) {
1379 val |= u32_encode_bits(srng->u.src_ring.low_threshold,
1386 if (srng->ring_id != HAL_SRNG_RING_ID_WBM_IDLE_LINK) {
1388 ((unsigned long)srng->u.src_ring.tp_addr -
1399 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1402 *srng->u.src_ring.tp_addr = 0;
1404 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1406 if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
1408 if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
1410 if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
1418 if (srng->ring_id == HAL_SRNG_RING_ID_WBM_IDLE_LINK)
1425 struct hal_srng *srng)
1427 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1428 ath12k_hal_srng_src_hw_init(ab, srng);
1430 ath12k_hal_srng_dst_hw_init(ab, srng);
1479 void ath12k_hal_srng_get_params(struct ath12k_base *ab, struct hal_srng *srng,
1482 params->ring_base_paddr = srng->ring_base_paddr;
1483 params->ring_base_vaddr = srng->ring_base_vaddr;
1484 params->num_entries = srng->num_entries;
1485 params->intr_timer_thres_us = srng->intr_timer_thres_us;
1487 srng->intr_batch_cntr_thres_entries;
1488 params->low_threshold = srng->u.src_ring.low_threshold;
1489 params->msi_addr = srng->msi_addr;
1490 params->msi2_addr = srng->msi2_addr;
1491 params->msi_data = srng->msi_data;
1492 params->msi2_data = srng->msi2_data;
1493 params->flags = srng->flags;
1497 struct hal_srng *srng)
1499 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
1502 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1504 ((unsigned long)srng->u.src_ring.hp_addr -
1508 ((unsigned long)srng->u.dst_ring.hp_addr -
1513 struct hal_srng *srng)
1515 if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
1518 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1520 ((unsigned long)srng->u.src_ring.tp_addr -
1524 ((unsigned long)srng->u.dst_ring.tp_addr -
1586 void *ath12k_hal_srng_dst_peek(struct ath12k_base *ab, struct hal_srng *srng)
1588 lockdep_assert_held(&srng->lock);
1590 if (srng->u.dst_ring.tp != srng->u.dst_ring.cached_hp)
1591 return (srng->ring_base_vaddr + srng->u.dst_ring.tp);
1597 struct hal_srng *srng)
1601 lockdep_assert_held(&srng->lock);
1603 if (srng->u.dst_ring.tp == srng->u.dst_ring.cached_hp)
1606 desc = srng->ring_base_vaddr + srng->u.dst_ring.tp;
1608 srng->u.dst_ring.tp = (srng->u.dst_ring.tp + srng->entry_size) %
1609 srng->ring_size;
1614 int ath12k_hal_srng_dst_num_free(struct ath12k_base *ab, struct hal_srng *srng,
1619 lockdep_assert_held(&srng->lock);
1621 tp = srng->u.dst_ring.tp;
1624 hp = *srng->u.dst_ring.hp_addr;
1625 srng->u.dst_ring.cached_hp = hp;
1627 hp = srng->u.dst_ring.cached_hp;
1631 return (hp - tp) / srng->entry_size;
1633 return (srng->ring_size - tp + hp) / srng->entry_size;
1637 int ath12k_hal_srng_src_num_free(struct ath12k_base *ab, struct hal_srng *srng,
1642 lockdep_assert_held(&srng->lock);
1644 hp = srng->u.src_ring.hp;
1647 tp = *srng->u.src_ring.tp_addr;
1648 srng->u.src_ring.cached_tp = tp;
1650 tp = srng->u.src_ring.cached_tp;
1654 return ((tp - hp) / srng->entry_size) - 1;
1656 return ((srng->ring_size - hp + tp) / srng->entry_size) - 1;
1660 struct hal_srng *srng)
1665 lockdep_assert_held(&srng->lock);
1673 next_hp = (srng->u.src_ring.hp + srng->entry_size) % srng->ring_size;
1675 if (next_hp == srng->u.src_ring.cached_tp)
1678 desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
1679 srng->u.src_ring.hp = next_hp;
1687 srng->u.src_ring.reap_hp = next_hp;
1693 struct hal_srng *srng)
1698 lockdep_assert_held(&srng->lock);
1700 next_reap_hp = (srng->u.src_ring.reap_hp + srng->entry_size) %
1701 srng->ring_size;
1703 if (next_reap_hp == srng->u.src_ring.cached_tp)
1706 desc = srng->ring_base_vaddr + next_reap_hp;
1707 srng->u.src_ring.reap_hp = next_reap_hp;
1713 struct hal_srng *srng)
1717 lockdep_assert_held(&srng->lock);
1719 if (srng->u.src_ring.hp == srng->u.src_ring.reap_hp)
1722 desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
1723 srng->u.src_ring.hp = (srng->u.src_ring.hp + srng->entry_size) %
1724 srng->ring_size;
1729 void ath12k_hal_srng_access_begin(struct ath12k_base *ab, struct hal_srng *srng)
1731 lockdep_assert_held(&srng->lock);
1733 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1734 srng->u.src_ring.cached_tp =
1735 *(volatile u32 *)srng->u.src_ring.tp_addr;
1737 srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr;
1743 void ath12k_hal_srng_access_end(struct ath12k_base *ab, struct hal_srng *srng)
1745 lockdep_assert_held(&srng->lock);
1748 if (srng->flags & HAL_SRNG_FLAGS_LMAC_RING) {
1752 if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
1753 srng->u.src_ring.last_tp =
1754 *(volatile u32 *)srng->u.src_ring.tp_addr;
1755 *srng->u.src_ring.hp_addr = srng->u.src_ring.hp;
1757 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
1758 *srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
1761 if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
1762 srng->u.src_ring.last_tp =
1763 *(volatile u32 *)srng->u.src_ring.tp_addr;
1765 (unsigned long)srng->u.src_ring.hp_addr -
1767 srng->u.src_ring.hp);
1769 srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
1771 (unsigned long)srng->u.dst_ring.tp_addr -
1773 srng->u.dst_ring.tp);
1777 srng->timestamp = jiffies;
1892 struct hal_srng *srng;
1902 srng = &hal->srng_list[ring_id];
1904 srng->ring_id = ring_id;
1905 srng->ring_dir = srng_config->ring_dir;
1906 srng->ring_base_paddr = params->ring_base_paddr;
1907 srng->ring_base_vaddr = params->ring_base_vaddr;
1908 srng->entry_size = srng_config->entry_size;
1909 srng->num_entries = params->num_entries;
1910 srng->ring_size = srng->entry_size * srng->num_entries;
1911 srng->intr_batch_cntr_thres_entries =
1913 srng->intr_timer_thres_us = params->intr_timer_thres_us;
1914 srng->flags = params->flags;
1915 srng->msi_addr = params->msi_addr;
1916 srng->msi2_addr = params->msi2_addr;
1917 srng->msi_data = params->msi_data;
1918 srng->msi2_data = params->msi2_data;
1919 srng->initialized = 1;
1920 spin_lock_init(&srng->lock);
1921 lockdep_set_class(&srng->lock, &srng->lock_key);
1924 srng->hwreg_base[i] = srng_config->reg_start[i] +
1928 memset(srng->ring_base_vaddr, 0,
1929 (srng->entry_size * srng->num_entries) << 2);
1931 reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1933 if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
1934 srng->u.src_ring.hp = 0;
1935 srng->u.src_ring.cached_tp = 0;
1936 srng->u.src_ring.reap_hp = srng->ring_size - srng->entry_size;
1937 srng->u.src_ring.tp_addr = (void *)(hal->rdp.vaddr + ring_id);
1938 srng->u.src_ring.low_threshold = params->low_threshold *
1939 srng->entry_size;
1942 srng->u.src_ring.hp_addr =
1949 (unsigned long)srng->u.src_ring.hp_addr -
1953 srng->u.src_ring.hp_addr = (void *)(hal->wrp.vaddr +
1955 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
1966 srng->u.dst_ring.loop_cnt = 1;
1967 srng->u.dst_ring.tp = 0;
1968 srng->u.dst_ring.cached_hp = 0;
1969 srng->u.dst_ring.hp_addr = (void *)(hal->rdp.vaddr + ring_id);
1972 srng->u.dst_ring.tp_addr =
1980 (unsigned long)srng->u.dst_ring.tp_addr -
1987 srng->u.dst_ring.tp_addr = (void *)(hal->wrp.vaddr +
1989 srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
1996 ath12k_hal_srng_hw_init(ab, srng);
1999 srng->u.dst_ring.max_buffer_length = params->max_buffer_len;
2000 ath12k_hal_ce_dst_setup(ab, srng, ring_num);
2011 struct hal_srng *srng;
2020 srng = &hal->srng_list[ring_id];
2023 srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
2026 srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
2101 struct hal_srng *srng)
2103 lockdep_assert_held(&srng->lock);
2108 if (srng->ring_dir == HAL_SRNG_DIR_SRC &&
2109 *srng->u.src_ring.tp_addr != srng->u.src_ring.hp)
2110 ath12k_hal_srng_access_end(ab, srng);
2174 struct hal_srng *srng;
2200 srng = &ab->hal.srng_list[i];
2202 if (!srng->initialized)
2205 if (srng->ring_dir == HAL_SRNG_DIR_SRC)
2207 "src srng id %u hp %u, reap_hp %u, cur tp %u, cached tp %u last tp %u napi processed before %ums\n",
2208 srng->ring_id, srng->u.src_ring.hp,
2209 srng->u.src_ring.reap_hp,
2210 *srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp,
2211 srng->u.src_ring.last_tp,
2212 jiffies_to_msecs(jiffies - srng->timestamp));
2213 else if (srng->ring_dir == HAL_SRNG_DIR_DST)
2215 "dst srng id %u tp %u, cur hp %u, cached hp %u last hp %u napi processed before %ums\n",
2216 srng->ring_id, srng->u.dst_ring.tp,
2217 *srng->u.dst_ring.hp_addr,
2218 srng->u.dst_ring.cached_hp,
2219 srng->u.dst_ring.last_hp,
2220 jiffies_to_msecs(jiffies - srng->timestamp));