qcacmn: Make num REOs and rx_threads depend on dp_reo_rings_map

Make 1:1 dependency on num REOs and rx_thread. Keep num rx_thread
dependent on rx REO rings, 1 rx_thread for each rx REO ring.
Controlled via INI dp_reo_rings_map.

Change-Id: I7c199226cfa3f173ea328d71075816b8eb9ba91f
CRs-Fixed: 3048260
This commit is contained in:
Prakash Manjunathappa
2021-09-08 19:56:24 -07:00
committed by Madan Koyyalamudi
parent d4faaf9d6b
commit 61178a761e
3 changed files with 149 additions and 90 deletions

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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