qcacmn: Config edits for multiple TX rings in HMT

The following configurations are changed
- Change numer of WBM2SWRELEASE rings from 7 to 8
- Use configurable RBM value when enqueuing packets for TX. This is needed
since WBM release ring numbers do not have an easy mapping to RBM values
for HMT1.0.

Change-Id: Idcf9e48e00b7039331fc1837bb1e900b12f19eb3
CRs-Fixed: 2984362
This commit is contained in:
Mohit Khanna
2021-07-16 03:45:46 -07:00
committed by Madan Koyyalamudi
parent 3e89b4435a
commit 47a165fe8e
9 changed files with 113 additions and 73 deletions

View File

@@ -23,6 +23,31 @@
#include "dp_be_rx.h" #include "dp_be_rx.h"
#include <hal_be_api.h> #include <hal_be_api.h>
#if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{.tcl_ring_num = 0, .wbm_ring_num = 0, .wbm_rbm_id = HAL_BE_WBM_SW0_BM_ID, .for_ipa = 0},
{1, 4, HAL_BE_WBM_SW4_BM_ID, 0},
{2, 2, HAL_BE_WBM_SW2_BM_ID, 0},
{3, 6, HAL_BE_WBM_SW5_BM_ID, 0},
{4, 7, HAL_BE_WBM_SW6_BM_ID, 0}
};
#else
static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{.tcl_ring_num = 0, .wbm_ring_num = 0, .wbm_rbm_id = HAL_BE_WBM_SW0_BM_ID, .for_ipa = 0},
{1, 1, HAL_BE_WBM_SW1_BM_ID, 0},
{2, 2, HAL_BE_WBM_SW2_BM_ID, 0},
{3, 3, HAL_BE_WBM_SW3_BM_ID, 0},
{4, 4, HAL_BE_WBM_SW4_BM_ID, 0}
};
#endif
static void dp_soc_cfg_attach_be(struct dp_soc *soc)
{
soc->wlan_cfg_ctx->tcl_wbm_map_array = g_tcl_wbm_map_array;
}
qdf_size_t dp_get_context_size_be(enum dp_context_type context_type) qdf_size_t dp_get_context_size_be(enum dp_context_type context_type)
{ {
switch (context_type) { switch (context_type) {
@@ -714,6 +739,7 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
arch_ops->txrx_vdev_attach = dp_vdev_attach_be; arch_ops->txrx_vdev_attach = dp_vdev_attach_be;
arch_ops->txrx_vdev_detach = dp_vdev_detach_be; arch_ops->txrx_vdev_detach = dp_vdev_detach_be;
arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_be; arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_be;
arch_ops->soc_cfg_attach = dp_soc_cfg_attach_be;
dp_init_near_full_arch_ops_be(arch_ops); dp_init_near_full_arch_ops_be(arch_ops);
} }

View File

@@ -85,14 +85,12 @@ static inline uint8_t dp_tx_get_rbm_id_be(struct dp_soc *soc,
#else #else
static inline uint8_t dp_tx_get_rbm_id_be(struct dp_soc *soc, static inline uint8_t dp_tx_get_rbm_id_be(struct dp_soc *soc,
uint8_t ring_id) uint8_t tcl_index)
{ {
uint8_t wbm_ring_id, rbm; uint8_t rbm;
wbm_ring_id = wlan_cfg_get_wbm_ring_num_for_index(ring_id); rbm = wlan_cfg_get_rbm_id_for_index(soc->wlan_cfg_ctx, tcl_index);
rbm = wbm_ring_id + soc->wbm_sw0_bm_id; dp_verbose_debug("tcl_id %u rbm %u", tcl_index, rbm);
dp_debug("ring_id %u wbm ring num %u rbm %u",
ring_id, wbm_ring_id, rbm);
return rbm; return rbm;
} }
#endif #endif

View File

@@ -2340,8 +2340,7 @@ static uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget)
/* Process Tx completion interrupts first to return back buffers */ /* Process Tx completion interrupts first to return back buffers */
for (index = 0; index < soc->num_tcl_data_rings; index++) { for (index = 0; index < soc->num_tcl_data_rings; index++) {
if (!((1 << wlan_cfg_get_wbm_ring_num_for_index(index)) & if (!(1 << wlan_cfg_get_wbm_ring_num_for_index(soc->wlan_cfg_ctx, index) & tx_mask))
tx_mask))
continue; continue;
work_done = dp_tx_comp_handler(int_ctx, work_done = dp_tx_comp_handler(int_ctx,
soc, soc,
@@ -4200,7 +4199,8 @@ static void dp_deinit_tx_pair_by_index(struct dp_soc *soc, int index)
{ {
int tcl_ring_num, wbm_ring_num; int tcl_ring_num, wbm_ring_num;
wlan_cfg_get_tcl_wbm_ring_num_for_index(index, wlan_cfg_get_tcl_wbm_ring_num_for_index(soc->wlan_cfg_ctx,
index,
&tcl_ring_num, &tcl_ring_num,
&wbm_ring_num); &wbm_ring_num);
@@ -4246,7 +4246,8 @@ static QDF_STATUS dp_init_tx_ring_pair_by_index(struct dp_soc *soc,
goto fail1; goto fail1;
} }
wlan_cfg_get_tcl_wbm_ring_num_for_index(index, wlan_cfg_get_tcl_wbm_ring_num_for_index(soc->wlan_cfg_ctx,
index,
&tcl_ring_num, &tcl_ring_num,
&wbm_ring_num); &wbm_ring_num);
@@ -13047,6 +13048,8 @@ static void dp_soc_cfg_attach(struct dp_soc *soc)
soc->num_reo_dest_rings = soc->num_reo_dest_rings =
wlan_cfg_num_reo_dest_rings(soc->wlan_cfg_ctx); wlan_cfg_num_reo_dest_rings(soc->wlan_cfg_ctx);
} }
soc->arch_ops.soc_cfg_attach(soc);
} }
static inline void dp_pdev_set_default_reo(struct dp_pdev *pdev) static inline void dp_pdev_set_default_reo(struct dp_pdev *pdev)

View File

@@ -1569,6 +1569,7 @@ struct dp_arch_ops {
QDF_STATUS (*txrx_vdev_detach)(struct dp_soc *soc, QDF_STATUS (*txrx_vdev_detach)(struct dp_soc *soc,
struct dp_vdev *vdev); struct dp_vdev *vdev);
QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc); QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc);
void (*soc_cfg_attach)(struct dp_soc *soc);
/* TX RX Arch Ops */ /* TX RX Arch Ops */
QDF_STATUS (*tx_hw_enqueue)(struct dp_soc *soc, struct dp_vdev *vdev, QDF_STATUS (*tx_hw_enqueue)(struct dp_soc *soc, struct dp_vdev *vdev,

View File

@@ -23,6 +23,24 @@
#include "dp_li_tx.h" #include "dp_li_tx.h"
#include "dp_li_rx.h" #include "dp_li_rx.h"
#if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{.tcl_ring_num = 0, .wbm_ring_num = 0, .wbm_rbm_id = HAL_LI_WBM_SW0_BM_ID, .for_ipa = 0},
{1, 4, HAL_LI_WBM_SW4_BM_ID, 1}, /* For IPA */
{2, 2, HAL_LI_WBM_SW2_BM_ID, 1} /* For IPA */};
#else
static struct wlan_cfg_tcl_wbm_ring_num_map g_tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{.tcl_ring_num = 0, .wbm_ring_num = 0, .wbm_rbm_id = HAL_LI_WBM_SW0_BM_ID, .for_ipa = 0},
{1, 1, HAL_LI_WBM_SW1_BM_ID, 0},
{2, 2, HAL_LI_WBM_SW2_BM_ID, 0}
};
#endif
static void dp_soc_cfg_attach_li(struct dp_soc *soc)
{
soc->wlan_cfg_ctx->tcl_wbm_map_array = g_tcl_wbm_map_array;
}
qdf_size_t dp_get_context_size_li(enum dp_context_type context_type) qdf_size_t dp_get_context_size_li(enum dp_context_type context_type)
{ {
switch (context_type) { switch (context_type) {
@@ -285,5 +303,6 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
dp_rx_desc_cookie_2_va_li; dp_rx_desc_cookie_2_va_li;
arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li; arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li;
arch_ops->soc_cfg_attach = dp_soc_cfg_attach_li;
} }

View File

@@ -24,9 +24,7 @@ enum hal_li_tx_ret_buf_manager {
HAL_LI_WBM_SW1_BM_ID = 4, HAL_LI_WBM_SW1_BM_ID = 4,
HAL_LI_WBM_SW2_BM_ID = 5, HAL_LI_WBM_SW2_BM_ID = 5,
HAL_LI_WBM_SW3_BM_ID = 6, HAL_LI_WBM_SW3_BM_ID = 6,
#ifdef IPA_WDI3_TX_TWO_PIPES
HAL_LI_WBM_SW4_BM_ID = 7, HAL_LI_WBM_SW4_BM_ID = 7,
#endif
}; };
/*--------------------------------------------------------------------------- /*---------------------------------------------------------------------------

View File

@@ -1782,7 +1782,7 @@ struct hal_hw_srng_config hw_srng_table_7850[] = {
}, },
{ /* WBM2SW_RELEASE */ { /* WBM2SW_RELEASE */
.start_ring_id = HAL_SRNG_WBM2SW0_RELEASE, .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
.max_rings = 7, .max_rings = 8,
.entry_size = sizeof(struct wbm_release_ring) >> 2, .entry_size = sizeof(struct wbm_release_ring) >> 2,
.lmac_ring = FALSE, .lmac_ring = FALSE,
.ring_dir = HAL_SRNG_DST_RING, .ring_dir = HAL_SRNG_DST_RING,

View File

@@ -45,6 +45,8 @@
#define WLAN_CFG_TX_RING_MASK_4 BIT(4) #define WLAN_CFG_TX_RING_MASK_4 BIT(4)
#define WLAN_CFG_TX_RING_MASK_5 BIT(5) #define WLAN_CFG_TX_RING_MASK_5 BIT(5)
#define WLAN_CFG_TX_RING_MASK_6 BIT(6) #define WLAN_CFG_TX_RING_MASK_6 BIT(6)
#define WLAN_CFG_TX_RING_MASK_7 BIT(7)
#define WLAN_CFG_RX_MON_RING_MASK_0 0x1 #define WLAN_CFG_RX_MON_RING_MASK_0 0x1
#define WLAN_CFG_RX_MON_RING_MASK_1 0x2 #define WLAN_CFG_RX_MON_RING_MASK_1 0x2
@@ -112,13 +114,13 @@ struct dp_int_mask_assignment {
#ifdef CONFIG_BERYLLIUM #ifdef CONFIG_BERYLLIUM
#ifdef IPA_OFFLOAD #ifdef IPA_OFFLOAD
static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
[0] = WLAN_CFG_TX_RING_MASK_0, [1] = WLAN_CFG_TX_RING_MASK_5, [0] = WLAN_CFG_TX_RING_MASK_0, [1] = WLAN_CFG_TX_RING_MASK_6,
[2] = WLAN_CFG_TX_RING_MASK_6}; [2] = WLAN_CFG_TX_RING_MASK_7};
#else #else
static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
[0] = WLAN_CFG_TX_RING_MASK_0, [1] = WLAN_CFG_TX_RING_MASK_4, [0] = WLAN_CFG_TX_RING_MASK_0, [1] = WLAN_CFG_TX_RING_MASK_4,
[2] = WLAN_CFG_TX_RING_MASK_2, [3] = WLAN_CFG_TX_RING_MASK_5, [2] = WLAN_CFG_TX_RING_MASK_2, [3] = WLAN_CFG_TX_RING_MASK_6,
[4] = WLAN_CFG_TX_RING_MASK_6}; [4] = WLAN_CFG_TX_RING_MASK_7};
#endif #endif
#else #else
static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = { static const uint8_t tx_ring_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] = {
@@ -213,32 +215,6 @@ static const uint8_t tx_ring_near_full_irq_mask_msi[WLAN_CFG_INT_NUM_CONTEXTS] =
0 }; 0 };
#endif #endif
#ifdef CONFIG_BERYLLIUM
#ifdef IPA_OFFLOAD
struct wlan_cfg_tcl_wbm_ring_num_map tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{.tcl_ring_num = 0, .wbm_ring_num = 0, .for_ipa = 0},
{1, 4, 1}, /* For IPA */
{2, 2, 1}, /* For IPA */
{3, 5, 0},
{4, 6, 0},
};
#else
struct wlan_cfg_tcl_wbm_ring_num_map tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{.tcl_ring_num = 0, .wbm_ring_num = 0, .for_ipa = 0},
{1, 4, 0},
{2, 2, 0},
{3, 5, 0},
{4, 6, 0},
};
#endif /* IPA_OFFLOAD */
#else
struct wlan_cfg_tcl_wbm_ring_num_map tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{.tcl_ring_num = 0, .wbm_ring_num = 0, .for_ipa = 0},
{1, 4, 1}, /* For IPA */
{2, 2, 1}, /* For IPA */
};
#endif
#else #else
/* Integrated configuration + 8 possible MSI configurations */ /* Integrated configuration + 8 possible MSI configurations */
#define NUM_INTERRUPT_COMBINATIONS 9 #define NUM_INTERRUPT_COMBINATIONS 9
@@ -826,14 +802,6 @@ static struct dp_int_mask_assignment dp_mask_assignment[NUM_INTERRUPT_COMBINATIO
0, 0, 0, 0}, 0, 0, 0, 0},
}, },
}; };
struct wlan_cfg_tcl_wbm_ring_num_map tcl_wbm_map_array[MAX_TCL_DATA_RINGS] = {
{0, 0, 0},
{1, 1, 0},
{2, 2, 0},
{3, 3, 0},
{4, 4, 0},
};
#endif #endif
/** /**
@@ -1486,12 +1454,6 @@ int wlan_cfg_get_tx_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, int context)
return cfg->int_tx_ring_mask[context]; return cfg->int_tx_ring_mask[context];
} }
void wlan_cfg_get_tcl_wbm_ring_num_for_index(int index, int *tcl, int *wbm)
{
*tcl = tcl_wbm_map_array[index].tcl_ring_num;
*wbm = tcl_wbm_map_array[index].wbm_ring_num;
}
int wlan_cfg_get_rx_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, int context) int wlan_cfg_get_rx_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, int context)
{ {
return cfg->int_rx_ring_mask[context]; return cfg->int_rx_ring_mask[context];

View File

@@ -88,6 +88,20 @@
struct wlan_cfg_dp_pdev_ctxt; struct wlan_cfg_dp_pdev_ctxt;
/**
* struct wlan_cfg_tcl_wbm_ring_num_map - TCL WBM Ring number mapping
* @tcl_ring_num - TCL Ring number
* @wbm_ring_num - WBM Ring number
* @wbm_ring_num - WBM RBM ID to be used when enqueuing to TCL
* @for_ipa - whether this TCL/WBM for IPA use or not
*/
struct wlan_cfg_tcl_wbm_ring_num_map {
uint8_t tcl_ring_num;
uint8_t wbm_ring_num;
uint8_t wbm_rbm_id;
uint8_t for_ipa;
};
/** /**
* struct wlan_srng_cfg - Per ring configuration parameters * struct wlan_srng_cfg - Per ring configuration parameters
* @timer_threshold: Config to control interrupts based on timer duration * @timer_threshold: Config to control interrupts based on timer duration
@@ -208,6 +222,8 @@ struct wlan_srng_cfg {
* @wow_check_rx_pending_enable: Enable RX frame pending check in WoW * @wow_check_rx_pending_enable: Enable RX frame pending check in WoW
* @ipa_tx_ring_size: IPA tx ring size * @ipa_tx_ring_size: IPA tx ring size
* @ipa_tx_comp_ring_size: IPA tx completion ring size * @ipa_tx_comp_ring_size: IPA tx completion ring size
* @hw_cc_conv_enabled: cookie conversion enabled
* @tcl_wbm_map_array: TCL-WBM map array
*/ */
struct wlan_cfg_dp_soc_ctxt { struct wlan_cfg_dp_soc_ctxt {
int num_int_ctxts; int num_int_ctxts;
@@ -337,6 +353,7 @@ struct wlan_cfg_dp_soc_ctxt {
uint32_t ipa_tx_comp_ring_size; uint32_t ipa_tx_comp_ring_size;
#endif #endif
bool hw_cc_enabled; bool hw_cc_enabled;
struct wlan_cfg_tcl_wbm_ring_num_map *tcl_wbm_map_array;
}; };
/** /**
@@ -357,18 +374,6 @@ struct wlan_cfg_dp_pdev_ctxt {
int nss_enabled; int nss_enabled;
}; };
/**
* struct wlan_cfg_tcl_wbm_ring_num_map - TCL WBM Ring number mapping
* @tcl_ring_num - TCL Ring number
* @wbm_ring_num - WBM Ring number
* @for_ipa - whether this TCL/WBM for IPA use or not
*/
struct wlan_cfg_tcl_wbm_ring_num_map {
uint8_t tcl_ring_num;
uint8_t wbm_ring_num;
uint8_t for_ipa;
};
/** /**
* wlan_cfg_soc_attach() - Attach configuration interface for SoC * wlan_cfg_soc_attach() - Attach configuration interface for SoC
* @ctrl_obj - PSOC object * @ctrl_obj - PSOC object
@@ -479,8 +484,10 @@ int wlan_cfg_get_num_contexts(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx);
*/ */
int wlan_cfg_get_tx_ring_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx, int wlan_cfg_get_tx_ring_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
int context); int context);
/** /**
* wlan_cfg_get_tcl_wbm_ring_num_for_index() - Get TCL/WBM ring number for index * wlan_cfg_get_tcl_wbm_ring_num_for_index() - Get TCL/WBM ring number for index
* @wlan_cfg_ctx - Configuration Handle
* @index: index for which TCL/WBM ring numbers are needed * @index: index for which TCL/WBM ring numbers are needed
* @tcl: pointer to TCL ring number, to be filled * @tcl: pointer to TCL ring number, to be filled
* @wbm: pointer to WBM ring number to be filled * @wbm: pointer to WBM ring number to be filled
@@ -493,19 +500,45 @@ int wlan_cfg_get_tx_ring_mask(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
* *
* Return: None * Return: None
*/ */
void wlan_cfg_get_tcl_wbm_ring_num_for_index(int index, int *tcl, int *wbm); static inline
void wlan_cfg_get_tcl_wbm_ring_num_for_index(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
int index, int *tcl, int *wbm)
{
*tcl = wlan_cfg_ctx->tcl_wbm_map_array[index].tcl_ring_num;
*wbm = wlan_cfg_ctx->tcl_wbm_map_array[index].wbm_ring_num;
}
/** /**
* wlan_cfg_get_wbm_ring_num_for_index() - Get WBM ring number for index * wlan_cfg_get_wbm_ring_num_for_index() - Get WBM ring number for index
* @wlan_cfg_ctx - Configuration Handle
* @index: index for which WBM ring numbers is needed * @index: index for which WBM ring numbers is needed
* *
* Return: WBM Ring number for the index * Return: WBM Ring number for the index
*/ */
static inline static inline
int wlan_cfg_get_wbm_ring_num_for_index(int index) int wlan_cfg_get_wbm_ring_num_for_index(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
int index)
{ {
extern struct wlan_cfg_tcl_wbm_ring_num_map tcl_wbm_map_array[MAX_TCL_DATA_RINGS]; return wlan_cfg_ctx->tcl_wbm_map_array[index].wbm_ring_num;
return tcl_wbm_map_array[index].wbm_ring_num; }
/**
* wlan_cfg_get_rbm_id_for_index() - Get WBM RBM ID for TX ring index
* @wlan_cfg_ctx - Configuration Handle
* @index: TCL index for which WBM rbm value is needed
*
* The function fills in wbm rbm value corresponding to a TX ring index in
* soc->tcl_data_ring. This is needed since WBM ring numbers donot map
* sequentially to wbm rbm values.
* The function returns rbm id values as stored in tcl_wbm_map_array global
* array.
*
* Return: WBM rbm value corresnponding to TX ring index
*/
static inline
int wlan_cfg_get_rbm_id_for_index(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx, int index)
{
return wlan_cfg_ctx->tcl_wbm_map_array[index].wbm_rbm_id;
} }
/** /**