Browse Source

qcacmn: Add ini config to remap reo destination rings used by host

Adding support for enabling ini config to remap reo destination rings
for HK v1, HK v2, maple and pine platforms.

Change-Id: Id9d304521f32497e3acd845ddd2973b96b641516
Neha Bisht 5 năm trước cách đây
mục cha
commit
e3876720a2

+ 99 - 14
dp/wifi3.0/dp_main.c

@@ -2971,39 +2971,124 @@ static void dp_ipa_get_tx_comp_ring_size(int tx_comp_ring_num,
 		*tx_comp_ipa_ring_sz = WLAN_CFG_IPA_TX_COMP_RING_SIZE;
 }
 #else
+static uint8_t dp_reo_ring_selection(uint32_t value, uint32_t *ring)
+{
+	uint8_t num = 0;
+
+	switch (value) {
+	case 0xF:
+		num = 4;
+		ring[0] = REO_REMAP_SW1;
+		ring[1] = REO_REMAP_SW2;
+		ring[2] = REO_REMAP_SW3;
+		ring[3] = REO_REMAP_SW4;
+		break;
+	case 0xE:
+		num = 3;
+		ring[0] = REO_REMAP_SW2;
+		ring[1] = REO_REMAP_SW3;
+		ring[2] = REO_REMAP_SW4;
+		break;
+	case 0xD:
+		num = 3;
+		ring[0] = REO_REMAP_SW1;
+		ring[1] = REO_REMAP_SW3;
+		ring[2] = REO_REMAP_SW4;
+		break;
+	case 0xC:
+		num = 2;
+		ring[0] = REO_REMAP_SW3;
+		ring[1] = REO_REMAP_SW4;
+		break;
+	case 0xB:
+		num = 3;
+		ring[0] = REO_REMAP_SW1;
+		ring[1] = REO_REMAP_SW2;
+		ring[2] = REO_REMAP_SW4;
+		break;
+	case 0xA:
+		num = 2;
+		ring[0] = REO_REMAP_SW2;
+		ring[1] = REO_REMAP_SW4;
+		break;
+	case 0x9:
+		num = 2;
+		ring[0] = REO_REMAP_SW1;
+		ring[1] = REO_REMAP_SW4;
+		break;
+	case 0x8:
+		num = 1;
+		ring[0] = REO_REMAP_SW4;
+		break;
+	case 0x7:
+		num = 3;
+		ring[0] = REO_REMAP_SW1;
+		ring[1] = REO_REMAP_SW2;
+		ring[2] = REO_REMAP_SW3;
+		break;
+	case 0x6:
+		num = 2;
+		ring[0] = REO_REMAP_SW2;
+		ring[1] = REO_REMAP_SW3;
+		break;
+	case 0x5:
+		num = 2;
+		ring[0] = REO_REMAP_SW1;
+		ring[1] = REO_REMAP_SW3;
+		break;
+	case 0x4:
+		num = 1;
+		ring[0] = REO_REMAP_SW3;
+		break;
+	case 0x3:
+		num = 2;
+		ring[0] = REO_REMAP_SW1;
+		ring[1] = REO_REMAP_SW2;
+		break;
+	case 0x2:
+		num = 1;
+		ring[0] = REO_REMAP_SW2;
+		break;
+	case 0x1:
+		num = 1;
+		ring[0] = REO_REMAP_SW1;
+		break;
+	}
+	return num;
+}
+
 static bool dp_reo_remap_config(struct dp_soc *soc,
 				uint32_t *remap1,
 				uint32_t *remap2)
 {
 	uint8_t offload_radio = wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx);
-	uint8_t target_type;
+	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 value;
 
 	target_type = hal_get_target_type(soc->hal_soc);
 
 	switch (offload_radio) {
 	case dp_nss_cfg_default:
-		ring[0] = REO_REMAP_SW1;
-		ring[1] = REO_REMAP_SW2;
-		ring[2] = REO_REMAP_SW3;
-		ring[3] = REO_REMAP_SW4;
+		value = reo_config & 0xF;
+		num = dp_reo_ring_selection(value, ring);
 		hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring,
-					      4, remap1, remap2);
+					      num, remap1, remap2);
 
 		break;
 	case dp_nss_cfg_first_radio:
-		ring[0] = REO_REMAP_SW2;
-		ring[1] = REO_REMAP_SW3;
-		ring[2] = REO_REMAP_SW4;
+		value = reo_config & 0xE;
+		num = dp_reo_ring_selection(value, ring);
 		hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring,
-					      3, remap1, remap2);
+					      num, remap1, remap2);
+
 		break;
 	case dp_nss_cfg_second_radio:
-		ring[0] = REO_REMAP_SW1;
-		ring[1] = REO_REMAP_SW3;
-		ring[2] = REO_REMAP_SW4;
+		value = reo_config & 0xD;
+		num = dp_reo_ring_selection(value, ring);
 		hal_compute_reo_remap_ix2_ix3(soc->hal_soc, ring,
-					      3, remap1, remap2);
+					      num, remap1, remap2);
 
 		break;
 	case dp_nss_cfg_dbdc:

+ 38 - 0
hal/wifi3.0/qca5018/hal_5018.c

@@ -222,6 +222,44 @@ void hal_compute_reo_remap_ix2_ix3_5018(uint32_t *ring, uint32_t num_rings,
 					uint32_t *remap1, uint32_t *remap2)
 {
 	switch (num_rings) {
+	case 1:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[0], 18) |
+				HAL_REO_REMAP_IX2(ring[0], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[0], 22) |
+				HAL_REO_REMAP_IX2(ring[0], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[0], 26) |
+				HAL_REO_REMAP_IX3(ring[0], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[0], 30) |
+				HAL_REO_REMAP_IX3(ring[0], 31);
+		break;
+	case 2:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[1], 18) |
+				HAL_REO_REMAP_IX2(ring[1], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[1], 22) |
+				HAL_REO_REMAP_IX2(ring[1], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[1], 26) |
+				HAL_REO_REMAP_IX3(ring[1], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[1], 30) |
+				HAL_REO_REMAP_IX3(ring[1], 31);
+		break;
 	case 3:
 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
 				HAL_REO_REMAP_IX2(ring[1], 17) |

+ 38 - 0
hal/wifi3.0/qca8074v1/hal_8074v1.c

@@ -1133,6 +1133,44 @@ void hal_compute_reo_remap_ix2_ix3_8074v1(uint32_t *ring, uint32_t num_rings,
 					  uint32_t *remap1, uint32_t *remap2)
 {
 	switch (num_rings) {
+	case 1:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[0], 18) |
+				HAL_REO_REMAP_IX2(ring[0], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[0], 22) |
+				HAL_REO_REMAP_IX2(ring[0], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[0], 26) |
+				HAL_REO_REMAP_IX3(ring[0], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[0], 30) |
+				HAL_REO_REMAP_IX3(ring[0], 31);
+		break;
+	case 2:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[1], 18) |
+				HAL_REO_REMAP_IX2(ring[1], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[1], 22) |
+				HAL_REO_REMAP_IX2(ring[1], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[1], 26) |
+				HAL_REO_REMAP_IX3(ring[1], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[1], 30) |
+				HAL_REO_REMAP_IX3(ring[1], 31);
+		break;
 	case 3:
 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
 				HAL_REO_REMAP_IX2(ring[1], 17) |

+ 38 - 0
hal/wifi3.0/qca8074v2/hal_8074v2.c

@@ -1130,6 +1130,44 @@ void hal_compute_reo_remap_ix2_ix3_8074v2(uint32_t *ring, uint32_t num_rings,
 					  uint32_t *remap1, uint32_t *remap2)
 {
 	switch (num_rings) {
+	case 1:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[0], 18) |
+				HAL_REO_REMAP_IX2(ring[0], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[0], 22) |
+				HAL_REO_REMAP_IX2(ring[0], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[0], 26) |
+				HAL_REO_REMAP_IX3(ring[0], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[0], 30) |
+				HAL_REO_REMAP_IX3(ring[0], 31);
+		break;
+	case 2:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[1], 18) |
+				HAL_REO_REMAP_IX2(ring[1], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[1], 22) |
+				HAL_REO_REMAP_IX2(ring[1], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[1], 26) |
+				HAL_REO_REMAP_IX3(ring[1], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[1], 30) |
+				HAL_REO_REMAP_IX3(ring[1], 31);
+		break;
 	case 3:
 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
 				HAL_REO_REMAP_IX2(ring[1], 17) |

+ 38 - 0
hal/wifi3.0/qcn9000/hal_9000.c

@@ -1584,6 +1584,44 @@ void hal_compute_reo_remap_ix2_ix3_9000(uint32_t *ring, uint32_t num_rings,
 					uint32_t *remap1, uint32_t *remap2)
 {
 	switch (num_rings) {
+	case 1:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[0], 18) |
+				HAL_REO_REMAP_IX2(ring[0], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[0], 22) |
+				HAL_REO_REMAP_IX2(ring[0], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[0], 26) |
+				HAL_REO_REMAP_IX3(ring[0], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[0], 30) |
+				HAL_REO_REMAP_IX3(ring[0], 31);
+		break;
+	case 2:
+		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
+				HAL_REO_REMAP_IX2(ring[0], 17) |
+				HAL_REO_REMAP_IX2(ring[1], 18) |
+				HAL_REO_REMAP_IX2(ring[1], 19) |
+				HAL_REO_REMAP_IX2(ring[0], 20) |
+				HAL_REO_REMAP_IX2(ring[0], 21) |
+				HAL_REO_REMAP_IX2(ring[1], 22) |
+				HAL_REO_REMAP_IX2(ring[1], 23);
+
+		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
+				HAL_REO_REMAP_IX3(ring[0], 25) |
+				HAL_REO_REMAP_IX3(ring[1], 26) |
+				HAL_REO_REMAP_IX3(ring[1], 27) |
+				HAL_REO_REMAP_IX3(ring[0], 28) |
+				HAL_REO_REMAP_IX3(ring[0], 29) |
+				HAL_REO_REMAP_IX3(ring[1], 30) |
+				HAL_REO_REMAP_IX3(ring[1], 31);
+		break;
 	case 3:
 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
 				HAL_REO_REMAP_IX2(ring[1], 17) |

+ 13 - 1
wlan_cfg/cfg_dp.h

@@ -337,6 +337,10 @@
 #define WLAN_CFG_PKTLOG_MIN_BUFFER_SIZE 1
 #define WLAN_CFG_PKTLOG_MAX_BUFFER_SIZE 10
 
+#define WLAN_CFG_NUM_REO_RINGS_MAP 0xF
+#define WLAN_CFG_NUM_REO_RINGS_MAP_MIN 0x1
+#define WLAN_CFG_NUM_REO_RINGS_MAP_MAX 0xF
+
 /* DP INI Declerations */
 #define CFG_DP_HTT_PACKET_TYPE \
 		CFG_INI_UINT("dp_htt_packet_type", \
@@ -835,6 +839,13 @@
 		CFG_INI_BOOL("full_mon_mode", \
 		false, "Full Monitor mode support")
 
+#define CFG_DP_REO_RINGS_MAP \
+		CFG_INI_UINT("dp_reo_rings_map", \
+		WLAN_CFG_NUM_REO_RINGS_MAP_MIN, \
+		WLAN_CFG_NUM_REO_RINGS_MAP_MAX, \
+		WLAN_CFG_NUM_REO_RINGS_MAP, \
+		CFG_VALUE_OR_DEFAULT, "REO Destination Rings Mapping")
+
 #define CFG_DP \
 		CFG(CFG_DP_HTT_PACKET_TYPE) \
 		CFG(CFG_DP_INT_BATCH_THRESHOLD_OTHER) \
@@ -909,6 +920,7 @@
 		CFG(CFG_DP_RXDMA_MONITOR_RX_DROP_THRESHOLD) \
 		CFG(CFG_DP_PKTLOG_BUFFER_SIZE) \
 		CFG(CFG_DP_RX_FISA_ENABLE) \
-		CFG(CFG_DP_FULL_MON_MODE)
+		CFG(CFG_DP_FULL_MON_MODE) \
+		CFG(CFG_DP_REO_RINGS_MAP)
 
 #endif /* _CFG_DP_H_ */

+ 7 - 0
wlan_cfg/wlan_cfg.c

@@ -604,6 +604,7 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
 	wlan_cfg_ctx->mon_drop_thresh =
 		cfg_get(psoc, CFG_DP_RXDMA_MONITOR_RX_DROP_THRESHOLD);
 	wlan_cfg_ctx->is_rx_fisa_enabled = cfg_get(psoc, CFG_DP_RX_FISA_ENABLE);
+	wlan_cfg_ctx->reo_rings_mapping = cfg_get(psoc, CFG_DP_REO_RINGS_MAP);
 	return wlan_cfg_ctx;
 }
 
@@ -1218,6 +1219,12 @@ wlan_cfg_get_dp_soc_rx_sw_desc_weight(struct wlan_cfg_dp_soc_ctxt *cfg)
 	return cfg->rx_sw_desc_weight;
 }
 
+uint32_t
+wlan_cfg_get_reo_rings_mapping(struct wlan_cfg_dp_soc_ctxt *cfg)
+{
+	return cfg->reo_rings_mapping;
+}
+
 bool
 wlan_cfg_get_dp_caps(struct wlan_cfg_dp_soc_ctxt *cfg,
 		     enum cdp_capabilities dp_caps)

+ 11 - 0
wlan_cfg/wlan_cfg.h

@@ -183,6 +183,7 @@ struct wlan_srng_cfg {
  *                        5 tuple flow entry
  * @pktlog_buffer_size: packet log buffer size
  * @is_rx_fisa_enabled: flag to enable/disable FISA Rx
+ * @reo_rings_mapping: reo destination ring bitmap
  */
 struct wlan_cfg_dp_soc_ctxt {
 	int num_int_ctxts;
@@ -283,6 +284,7 @@ struct wlan_cfg_dp_soc_ctxt {
 	uint8_t is_rx_fisa_enabled;
 	bool is_tso_desc_attach_defer;
 	uint32_t delayed_replenish_entries;
+	uint32_t reo_rings_mapping;
 };
 
 /**
@@ -1329,3 +1331,12 @@ void wlan_cfg_set_tso_desc_attach_defer(struct wlan_cfg_dp_soc_ctxt *cfg,
 
 bool wlan_cfg_is_tso_desc_attach_defer(struct wlan_cfg_dp_soc_ctxt *cfg);
 
+/**
+ * wlan_cfg_get_reo_rings_mapping() - Get Reo destination ring bitmap
+ *
+ *
+ * @cfg: soc configuration context
+ *
+ * Return: reo ring bitmap.
+ */
+uint32_t wlan_cfg_get_reo_rings_mapping(struct wlan_cfg_dp_soc_ctxt *cfg);