diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 2f58682b83..18d5e35b99 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -455,6 +455,7 @@ dp_soc_get_mon_mask_for_interrupt_mode(struct dp_soc *soc, int intr_ctx_num) } #endif +#ifdef IPA_OFFLOAD /** * dp_get_num_rx_contexts() - get number of RX contexts * @soc_hdl: cdp opaque soc handle @@ -463,17 +464,51 @@ dp_soc_get_mon_mask_for_interrupt_mode(struct dp_soc *soc, int intr_ctx_num) */ static int dp_get_num_rx_contexts(struct cdp_soc_t *soc_hdl) { - int i; - int num_rx_contexts = 0; - + int num_rx_contexts; + uint32_t reo_ring_map; struct dp_soc *soc = (struct dp_soc *)soc_hdl; - for (i = 0; i < wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx); i++) - if (wlan_cfg_get_rx_ring_mask(soc->wlan_cfg_ctx, i)) - num_rx_contexts++; + reo_ring_map = wlan_cfg_get_reo_rings_mapping(soc->wlan_cfg_ctx); + + switch (soc->arch_id) { + case CDP_ARCH_TYPE_BE: + /* 2 REO rings are used for IPA */ + reo_ring_map &= ~(BIT(3) | BIT(7)); + + break; + case CDP_ARCH_TYPE_LI: + /* 1 REO ring is used for IPA */ + reo_ring_map &= ~BIT(3); + break; + default: + dp_err("unkonwn arch_id 0x%x", soc->arch_id); + QDF_BUG(0); + } + /* + * qdf_get_hweight32 prefer over qdf_get_hweight8 in case map is scaled + * in future + */ + num_rx_contexts = qdf_get_hweight32(reo_ring_map); return num_rx_contexts; } +#else +static int dp_get_num_rx_contexts(struct cdp_soc_t *soc_hdl) +{ + int num_rx_contexts; + uint32_t reo_config; + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + + reo_config = wlan_cfg_get_reo_rings_mapping(soc->wlan_cfg_ctx); + /* + * qdf_get_hweight32 prefer over qdf_get_hweight8 in case map is scaled + * in future + */ + num_rx_contexts = qdf_get_hweight32(reo_config); + + return num_rx_contexts; +} +#endif #else @@ -4195,25 +4230,28 @@ static void dp_soc_reset_intr_mask(struct dp_soc *soc) bool dp_reo_remap_config(struct dp_soc *soc, uint32_t *remap0, uint32_t *remap1, uint32_t *remap2) { - uint32_t ring[8] = {REO_REMAP_SW1, REO_REMAP_SW2, REO_REMAP_SW3}; - int target_type; + uint32_t ring[WLAN_CFG_NUM_REO_DEST_RING_MAX] = { + REO_REMAP_SW1, REO_REMAP_SW2, REO_REMAP_SW3, + REO_REMAP_SW5, REO_REMAP_SW6, REO_REMAP_SW7}; - target_type = hal_get_target_type(soc->hal_soc); - - switch (target_type) { - case TARGET_TYPE_KIWI: + switch (soc->arch_id) { + case CDP_ARCH_TYPE_BE: hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring, soc->num_reo_dest_rings - USE_2_IPA_RX_REO_RINGS, remap1, remap2); break; - default: + case CDP_ARCH_TYPE_LI: hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring, soc->num_reo_dest_rings - USE_1_IPA_RX_REO_RING, remap1, remap2); break; + default: + dp_err("unkonwn arch_id 0x%x", soc->arch_id); + QDF_BUG(0); + } dp_debug("remap1 %x remap2 %x", *remap1, *remap2); @@ -4293,6 +4331,29 @@ static uint8_t dp_reo_ring_selection(uint32_t value, uint32_t *ring) uint8_t num = 0; switch (value) { + /* should we have all the different possible ring configs */ + case 0xFF: + num = 8; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW2; + ring[2] = REO_REMAP_SW3; + ring[3] = REO_REMAP_SW4; + ring[4] = REO_REMAP_SW5; + ring[5] = REO_REMAP_SW6; + ring[6] = REO_REMAP_SW7; + ring[7] = REO_REMAP_SW8; + break; + + case 0x3F: + num = 6; + ring[0] = REO_REMAP_SW1; + ring[1] = REO_REMAP_SW2; + ring[2] = REO_REMAP_SW3; + ring[3] = REO_REMAP_SW4; + ring[4] = REO_REMAP_SW5; + ring[5] = REO_REMAP_SW6; + break; + case 0xF: num = 4; ring[0] = REO_REMAP_SW1; @@ -4370,6 +4431,9 @@ static uint8_t dp_reo_ring_selection(uint32_t value, uint32_t *ring) num = 1; ring[0] = REO_REMAP_SW1; break; + default: + dp_err("unkonwn reo ring map 0x%x", value); + QDF_BUG(0); } return num; } @@ -4382,14 +4446,14 @@ bool dp_reo_remap_config(struct dp_soc *soc, uint8_t offload_radio = wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx); uint32_t reo_config = wlan_cfg_get_reo_rings_mapping(soc->wlan_cfg_ctx); uint8_t target_type, num; - uint32_t ring[4]; + uint32_t ring[WLAN_CFG_NUM_REO_DEST_RING_MAX]; uint32_t value; target_type = hal_get_target_type(soc->hal_soc); switch (offload_radio) { case dp_nss_cfg_default: - value = reo_config & 0xF; + value = reo_config & WLAN_CFG_NUM_REO_RINGS_MAP_MAX; num = dp_reo_ring_selection(value, ring); hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring, num, remap1, remap2); diff --git a/hal/wifi3.0/kiwi/hal_kiwi.c b/hal/wifi3.0/kiwi/hal_kiwi.c index c2d7e68260..96102d407c 100644 --- a/hal/wifi3.0/kiwi/hal_kiwi.c +++ b/hal/wifi3.0/kiwi/hal_kiwi.c @@ -1480,94 +1480,85 @@ void hal_compute_reo_remap_ix2_ix3_kiwi(uint32_t *ring_map, uint32_t num_rings, uint32_t *remap1, uint32_t *remap2) { - /* - * The 4 bits REO destination ring value is defined as: 0: TCL - * 1:SW1 2:SW2 3:SW3 4:SW4 5:Release 6:FW(WIFI) 7:SW5 - * 8:SW6 9:SW7 10:SW8 11: NOT_USED. - * - */ - uint32_t reo_dest_ring_map[] = {REO_REMAP_SW1, REO_REMAP_SW2, - REO_REMAP_SW3, REO_REMAP_SW4, - REO_REMAP_SW5, REO_REMAP_SW6, - REO_REMAP_SW7, REO_REMAP_SW8}; switch (num_rings) { + /* should we have all the different possible ring configs */ default: case 3: - *remap1 = HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 16) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 17) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[2], 18) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 19) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 20) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[2], 21) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 22) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 23); + *remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) | + HAL_REO_REMAP_IX2(ring_map[1], 17) | + HAL_REO_REMAP_IX2(ring_map[2], 18) | + HAL_REO_REMAP_IX2(ring_map[0], 19) | + HAL_REO_REMAP_IX2(ring_map[1], 20) | + HAL_REO_REMAP_IX2(ring_map[2], 21) | + HAL_REO_REMAP_IX2(ring_map[0], 22) | + HAL_REO_REMAP_IX2(ring_map[1], 23); - *remap2 = HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 24) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[0], 25) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[1], 26) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 27) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[0], 28) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[1], 29) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 30) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[0], 31); + *remap2 = HAL_REO_REMAP_IX3(ring_map[2], 24) | + HAL_REO_REMAP_IX3(ring_map[0], 25) | + HAL_REO_REMAP_IX3(ring_map[1], 26) | + HAL_REO_REMAP_IX3(ring_map[2], 27) | + HAL_REO_REMAP_IX3(ring_map[0], 28) | + HAL_REO_REMAP_IX3(ring_map[1], 29) | + HAL_REO_REMAP_IX3(ring_map[2], 30) | + HAL_REO_REMAP_IX3(ring_map[0], 31); break; case 4: - *remap1 = HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 16) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 17) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[2], 18) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[3], 19) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 20) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 21) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[2], 22) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[3], 23); + *remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) | + HAL_REO_REMAP_IX2(ring_map[1], 17) | + HAL_REO_REMAP_IX2(ring_map[2], 18) | + HAL_REO_REMAP_IX2(ring_map[3], 19) | + HAL_REO_REMAP_IX2(ring_map[0], 20) | + HAL_REO_REMAP_IX2(ring_map[1], 21) | + HAL_REO_REMAP_IX2(ring_map[2], 22) | + HAL_REO_REMAP_IX2(ring_map[3], 23); - *remap2 = HAL_REO_REMAP_IX3(reo_dest_ring_map[0], 24) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[1], 25) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 26) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[3], 27) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[0], 28) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[1], 29) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 30) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[3], 31); + *remap2 = HAL_REO_REMAP_IX3(ring_map[0], 24) | + HAL_REO_REMAP_IX3(ring_map[1], 25) | + HAL_REO_REMAP_IX3(ring_map[2], 26) | + HAL_REO_REMAP_IX3(ring_map[3], 27) | + HAL_REO_REMAP_IX3(ring_map[0], 28) | + HAL_REO_REMAP_IX3(ring_map[1], 29) | + HAL_REO_REMAP_IX3(ring_map[2], 30) | + HAL_REO_REMAP_IX3(ring_map[3], 31); break; case 6: - *remap1 = HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 16) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 17) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[2], 18) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[4], 19) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[5], 20) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[6], 21) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 22) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 23); + *remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) | + HAL_REO_REMAP_IX2(ring_map[1], 17) | + HAL_REO_REMAP_IX2(ring_map[2], 18) | + HAL_REO_REMAP_IX2(ring_map[3], 19) | + HAL_REO_REMAP_IX2(ring_map[4], 20) | + HAL_REO_REMAP_IX2(ring_map[5], 21) | + HAL_REO_REMAP_IX2(ring_map[0], 22) | + HAL_REO_REMAP_IX2(ring_map[1], 23); - *remap2 = HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 24) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[4], 25) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[5], 26) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[6], 27) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[0], 28) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[1], 29) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 30) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[4], 31); + *remap2 = HAL_REO_REMAP_IX3(ring_map[2], 24) | + HAL_REO_REMAP_IX3(ring_map[3], 25) | + HAL_REO_REMAP_IX3(ring_map[4], 26) | + HAL_REO_REMAP_IX3(ring_map[5], 27) | + HAL_REO_REMAP_IX3(ring_map[0], 28) | + HAL_REO_REMAP_IX3(ring_map[1], 29) | + HAL_REO_REMAP_IX3(ring_map[2], 30) | + HAL_REO_REMAP_IX3(ring_map[3], 31); break; case 8: - *remap1 = HAL_REO_REMAP_IX2(reo_dest_ring_map[0], 16) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[1], 17) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[2], 18) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[3], 19) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[4], 20) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[5], 21) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[6], 22) | - HAL_REO_REMAP_IX2(reo_dest_ring_map[7], 23); + *remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) | + HAL_REO_REMAP_IX2(ring_map[1], 17) | + HAL_REO_REMAP_IX2(ring_map[2], 18) | + HAL_REO_REMAP_IX2(ring_map[3], 19) | + HAL_REO_REMAP_IX2(ring_map[4], 20) | + HAL_REO_REMAP_IX2(ring_map[5], 21) | + HAL_REO_REMAP_IX2(ring_map[6], 22) | + HAL_REO_REMAP_IX2(ring_map[7], 23); - *remap2 = HAL_REO_REMAP_IX3(reo_dest_ring_map[0], 24) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[1], 25) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[2], 26) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[3], 27) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[4], 28) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[5], 29) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[6], 30) | - HAL_REO_REMAP_IX3(reo_dest_ring_map[7], 31); + *remap2 = HAL_REO_REMAP_IX3(ring_map[0], 24) | + HAL_REO_REMAP_IX3(ring_map[1], 25) | + HAL_REO_REMAP_IX3(ring_map[2], 26) | + HAL_REO_REMAP_IX3(ring_map[3], 27) | + HAL_REO_REMAP_IX3(ring_map[4], 28) | + HAL_REO_REMAP_IX3(ring_map[5], 29) | + HAL_REO_REMAP_IX3(ring_map[6], 30) | + HAL_REO_REMAP_IX3(ring_map[7], 31); break; } } diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index 4aa6e9297d..3f0f496aa0 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -422,13 +422,17 @@ #define WLAN_CFG_PKTLOG_MIN_BUFFER_SIZE 1 #define WLAN_CFG_PKTLOG_MAX_BUFFER_SIZE 10 -#ifdef QCA_WIFI_KIWI +#ifdef IPA_OFFLOAD #define WLAN_CFG_NUM_REO_RINGS_MAP 0x7 #else #define WLAN_CFG_NUM_REO_RINGS_MAP 0xF #endif #define WLAN_CFG_NUM_REO_RINGS_MAP_MIN 0x1 +#if defined(CONFIG_BERYLLIUM) +#define WLAN_CFG_NUM_REO_RINGS_MAP_MAX 0xFF +#else #define WLAN_CFG_NUM_REO_RINGS_MAP_MAX 0xF +#endif #define WLAN_CFG_RADIO_0_DEFAULT_REO 0x1 #define WLAN_CFG_RADIO_1_DEFAULT_REO 0x2