qcacmn: Support REO2SW ring pointer update threshold configuration

Support REO2SW ring pointer update threshold configuration,
it is helpful for PCIe utilization improvement.
timer based threshold - M: issue pointer updates when M micro
seconds has elapsed.
number based threshold - N: issue pointer updates when N entries
updates occur.

Change-Id: I49ed388520fd52e97e303d6ea9c04ced6cb5cf5f
CRs-Fixed: 3420101
Este commit está contenido en:
Jinwei Chen
2023-02-28 05:13:24 -08:00
cometido por Madan Koyyalamudi
padre c66b8677cf
commit c2c0f7f7f9
Se han modificado 9 ficheros con 186 adiciones y 2 borrados

Ver fichero

@@ -1891,6 +1891,37 @@ static void dp_print_peer_table(struct dp_vdev *vdev)
DP_MOD_ID_GENERIC_STATS); DP_MOD_ID_GENERIC_STATS);
} }
/**
* dp_srng_configure_pointer_update_thresholds() - Retrieve pointer
* update threshold value from wlan_cfg_ctx
* @soc: device handle
* @ring_params: per ring specific parameters
* @ring_type: Ring type
* @ring_num: Ring number for a given ring type
* @num_entries: number of entries to fill
*
* Fill the ring params with the pointer update threshold
* configuration parameters available in wlan_cfg_ctx
*
* Return: None
*/
static void
dp_srng_configure_pointer_update_thresholds(
struct dp_soc *soc,
struct hal_srng_params *ring_params,
int ring_type, int ring_num,
int num_entries)
{
if (ring_type == REO_DST) {
ring_params->pointer_timer_threshold =
wlan_cfg_get_pointer_timer_threshold_rx(
soc->wlan_cfg_ctx);
ring_params->pointer_num_threshold =
wlan_cfg_get_pointer_num_threshold_rx(
soc->wlan_cfg_ctx);
}
}
#ifdef WLAN_DP_PER_RING_TYPE_CONFIG #ifdef WLAN_DP_PER_RING_TYPE_CONFIG
/** /**
* dp_srng_configure_interrupt_thresholds() - Retrieve interrupt * dp_srng_configure_interrupt_thresholds() - Retrieve interrupt
@@ -2407,6 +2438,9 @@ QDF_STATUS dp_srng_init_idx(struct dp_soc *soc, struct dp_srng *srng,
srng->num_entries); srng->num_entries);
dp_srng_set_nf_thresholds(soc, srng, &ring_params); dp_srng_set_nf_thresholds(soc, srng, &ring_params);
dp_srng_configure_pointer_update_thresholds(soc, &ring_params,
ring_type, ring_num,
srng->num_entries);
if (srng->cached) if (srng->cached)
ring_params.flags |= HAL_SRNG_CACHED_DESC; ring_params.flags |= HAL_SRNG_CACHED_DESC;

Ver fichero

@@ -1021,6 +1021,10 @@ struct hal_srng_params {
/* Safe threshold */ /* Safe threshold */
uint16_t safe_thresh; uint16_t safe_thresh;
#endif #endif
/* Timer threshold to issue ring pointer update - in micro seconds */
uint16_t pointer_timer_threshold;
/* Number threshold of ring entries to issue pointer update */
uint8_t pointer_num_threshold;
}; };
/** /**

Ver fichero

@@ -193,6 +193,7 @@
#define ID_GROUP R0 #define ID_GROUP R0
#define STATUS_GROUP R0 #define STATUS_GROUP R0
#define MISC_GROUP R0 #define MISC_GROUP R0
#define MISC_1_GROUP R0
#define HP_ADDR_LSB_GROUP R0 #define HP_ADDR_LSB_GROUP R0
#define HP_ADDR_MSB_GROUP R0 #define HP_ADDR_MSB_GROUP R0
#define PRODUCER_INT_SETUP_GROUP R0 #define PRODUCER_INT_SETUP_GROUP R0
@@ -244,13 +245,19 @@
#define _SRNG_DST_FLD(_reg_group, _reg_fld) \ #define _SRNG_DST_FLD(_reg_group, _reg_fld) \
HAL_REO_ ## _reg_group ## _REO2SW1_RING_ ## _reg_fld HAL_REO_ ## _reg_group ## _REO2SW1_RING_ ## _reg_fld
#define _SRNG_DST_HW_FLD(_reg_group, _reg_fld) \
HWIO_REO_ ## _reg_group ## _REO2SW1_RING_ ## _reg_fld
#define _SRNG_SRC_FLD(_reg_group, _reg_fld) \ #define _SRNG_SRC_FLD(_reg_group, _reg_fld) \
HWIO_TCL_ ## _reg_group ## _SW2TCL1_RING_ ## _reg_fld HWIO_TCL_ ## _reg_group ## _SW2TCL1_RING_ ## _reg_fld
#define _SRNG_FLD(_reg_group, _reg_fld, _dir) \ #define _SRNG_FLD(_reg_group, _reg_fld, _dir) \
_SRNG_ ## _dir ## _FLD(_reg_group, _reg_fld) _SRNG_ ## _dir ## _FLD(_reg_group, _reg_fld)
#define _SRNG_HW_FLD(_reg_group, _reg_fld, _dir) \
_SRNG_ ## _dir ## _HW_FLD(_reg_group, _reg_fld)
#define SRNG_DST_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, DST) #define SRNG_DST_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, DST)
#define SRNG_DST_HW_FLD(_reg, _f) \
_SRNG_HW_FLD(_reg ## _GROUP, _reg ## _ ## _f, DST)
#define SRNG_SRC_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, SRC) #define SRNG_SRC_FLD(_reg, _f) _SRNG_FLD(_reg ## _GROUP, _reg ## _ ## _f, SRC)
#define SRNG_SRC_R0_START_OFFSET SRNG_SRC_REG_OFFSET(BASE_LSB, R0) #define SRNG_SRC_R0_START_OFFSET SRNG_SRC_REG_OFFSET(BASE_LSB, R0)

Ver fichero

@@ -368,6 +368,7 @@ enum SRNG_REGISTERS {
DST_MSI1_BASE_LSB, DST_MSI1_BASE_LSB,
DST_MSI1_BASE_MSB, DST_MSI1_BASE_MSB,
DST_MSI1_DATA, DST_MSI1_DATA,
DST_MISC_1,
#ifdef CONFIG_BERYLLIUM #ifdef CONFIG_BERYLLIUM
DST_MSI2_BASE_LSB, DST_MSI2_BASE_LSB,
DST_MSI2_BASE_MSB, DST_MSI2_BASE_MSB,
@@ -800,6 +801,10 @@ struct hal_srng {
#ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
struct hal_srng_high_wm_info high_wm; struct hal_srng_high_wm_info high_wm;
#endif #endif
/* Timer threshold to issue ring pointer update - in micro seconds */
uint16_t pointer_timer_threshold;
/* Number threshold of ring entries to issue pointer update */
uint8_t pointer_num_threshold;
}; };
/* HW SRNG configuration table */ /* HW SRNG configuration table */

Ver fichero

@@ -1559,6 +1559,11 @@ void *hal_srng_setup_idx(void *hal_soc, int ring_type, int ring_num, int mac_id,
srng->intr_timer_thres_us = ring_params->intr_timer_thres_us; srng->intr_timer_thres_us = ring_params->intr_timer_thres_us;
srng->intr_batch_cntr_thres_entries = srng->intr_batch_cntr_thres_entries =
ring_params->intr_batch_cntr_thres_entries; ring_params->intr_batch_cntr_thres_entries;
srng->pointer_timer_threshold =
ring_params->pointer_timer_threshold;
srng->pointer_num_threshold =
ring_params->pointer_num_threshold;
if (!idle_check) if (!idle_check)
srng->prefetch_timer = ring_params->prefetch_timer; srng->prefetch_timer = ring_params->prefetch_timer;
srng->hal_soc = hal_soc; srng->hal_soc = hal_soc;

Ver fichero

@@ -2009,10 +2009,85 @@ static QDF_STATUS hal_rx_reo_ent_get_src_link_id_kiwi(hal_rxdma_desc_t rx_desc,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
#ifdef QCA_WIFI_KIWI_V2
/**
* hal_srng_dst_hw_init_misc_1_kiwi() - Function to initialize MISC_1 register
* of destination ring HW
* @srng: SRNG ring pointer
*
* Return: None
*/
static inline
void hal_srng_dst_hw_init_misc_1_kiwi(struct hal_srng *srng)
{
uint32_t reg_val = 0;
/* number threshold for pointer update */
if (srng->pointer_num_threshold)
reg_val |= SRNG_SM(SRNG_DST_HW_FLD(MISC_1,
NUM_THRESHOLD_TO_UPDATE),
srng->pointer_num_threshold);
/* timer threshold for pointer update */
if (srng->pointer_timer_threshold)
reg_val |= SRNG_SM(SRNG_DST_HW_FLD(MISC_1,
TIME_THRESHOLD_TO_UPDATE),
srng->pointer_timer_threshold);
if (reg_val)
SRNG_DST_REG_WRITE(srng, MISC_1, reg_val);
}
/**
* hal_srng_hw_reg_offset_init_misc_1_kiwi() - Initialize the HW srng register
* offset of MISC_1
* @hal_soc: HAL Soc handle
*
* Return: None
*/
static inline
void hal_srng_hw_reg_offset_init_misc_1_kiwi(struct hal_soc *hal_soc)
{
int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
hw_reg_offset[DST_MISC_1] = REG_OFFSET(DST, MISC_1);
}
#else
static inline
void hal_srng_dst_hw_init_misc_1_kiwi(struct hal_srng *srng)
{
}
static inline
void hal_srng_hw_reg_offset_init_misc_1_kiwi(struct hal_soc *hal_soc)
{
}
#endif
/**
* hal_srng_dst_hw_init_kiwi() - Function to initialize SRNG
* destination ring HW
* @hal_soc: HAL SOC handle
* @srng: SRNG ring pointer
* @idle_check: Check if ring is idle
* @idx: Ring index
*
* Return: None
*/
static inline
void hal_srng_dst_hw_init_kiwi(struct hal_soc *hal_soc,
struct hal_srng *srng,
bool idle_check,
uint32_t idx)
{
hal_srng_dst_hw_init_misc_1_kiwi(srng);
hal_srng_dst_hw_init_generic(hal_soc, srng, idle_check, idx);
}
static void hal_hw_txrx_ops_attach_kiwi(struct hal_soc *hal_soc) static void hal_hw_txrx_ops_attach_kiwi(struct hal_soc *hal_soc)
{ {
/* init and setup */ /* init and setup */
hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic; hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_kiwi;
hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic; hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic; hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
hal_soc->ops->hal_get_window_address = hal_get_window_address_kiwi; hal_soc->ops->hal_get_window_address = hal_get_window_address_kiwi;
@@ -2706,6 +2781,7 @@ static inline void hal_srng_hw_reg_offset_init_kiwi(struct hal_soc *hal_soc)
hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA), hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA),
hw_reg_offset[DST_PRODUCER_INT2_SETUP] = hw_reg_offset[DST_PRODUCER_INT2_SETUP] =
REG_OFFSET(DST, PRODUCER_INT2_SETUP); REG_OFFSET(DST, PRODUCER_INT2_SETUP);
hal_srng_hw_reg_offset_init_misc_1_kiwi(hal_soc);
} }
void hal_kiwi_attach(struct hal_soc *hal_soc) void hal_kiwi_attach(struct hal_soc *hal_soc)

Ver fichero

@@ -1354,6 +1354,16 @@
CFG_INI_BOOL("tx_litemon_sw_peer_filtering", false, \ CFG_INI_BOOL("tx_litemon_sw_peer_filtering", false, \
"Enable SW based tx monitor peer fitlering") "Enable SW based tx monitor peer fitlering")
#define CFG_DP_POINTER_TIMER_THRESHOLD_RX \
CFG_INI_UINT("dp_rx_ptr_timer_threshold", \
0, 0xFFFF, 0, \
CFG_VALUE_OR_DEFAULT, "RX pointer update timer threshold")
#define CFG_DP_POINTER_NUM_THRESHOLD_RX \
CFG_INI_UINT("dp_rx_ptr_num_threshold", \
0, 63, 0, \
CFG_VALUE_OR_DEFAULT, "RX pointer update entries number threshold")
/* /*
* <ini> * <ini>
* dp_rx_fisa_enable - Control Rx datapath FISA * dp_rx_fisa_enable - Control Rx datapath FISA
@@ -2015,5 +2025,7 @@
CFG_DP_SAWF_STATS_CONFIG \ CFG_DP_SAWF_STATS_CONFIG \
CFG(CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE) \ CFG(CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE) \
CFG(CFG_DP_TXMON_SW_PEER_FILTERING) \ CFG(CFG_DP_TXMON_SW_PEER_FILTERING) \
CFG_TX_PKT_INSPECT_FOR_ILP_CFG CFG_TX_PKT_INSPECT_FOR_ILP_CFG \
CFG(CFG_DP_POINTER_TIMER_THRESHOLD_RX) \
CFG(CFG_DP_POINTER_NUM_THRESHOLD_RX)
#endif /* _CFG_DP_H_ */ #endif /* _CFG_DP_H_ */

Ver fichero

@@ -3119,6 +3119,10 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc)
cfg_get(psoc, CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE); cfg_get(psoc, CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE);
wlan_cfg_ctx->txmon_sw_peer_filtering = wlan_cfg_ctx->txmon_sw_peer_filtering =
cfg_get(psoc, CFG_DP_TXMON_SW_PEER_FILTERING); cfg_get(psoc, CFG_DP_TXMON_SW_PEER_FILTERING);
wlan_cfg_ctx->pointer_timer_threshold_rx =
cfg_get(psoc, CFG_DP_POINTER_TIMER_THRESHOLD_RX);
wlan_cfg_ctx->pointer_num_threshold_rx =
cfg_get(psoc, CFG_DP_POINTER_NUM_THRESHOLD_RX);
wlan_soc_tx_packet_inspect_attach(psoc, wlan_cfg_ctx); wlan_soc_tx_packet_inspect_attach(psoc, wlan_cfg_ctx);
return wlan_cfg_ctx; return wlan_cfg_ctx;
@@ -4465,3 +4469,15 @@ bool wlan_cfg_get_txmon_sw_peer_filtering(struct wlan_cfg_dp_soc_ctxt *cfg)
} }
qdf_export_symbol(wlan_cfg_get_txmon_sw_peer_filtering); qdf_export_symbol(wlan_cfg_get_txmon_sw_peer_filtering);
uint16_t
wlan_cfg_get_pointer_timer_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg)
{
return cfg->pointer_timer_threshold_rx;
}
uint8_t
wlan_cfg_get_pointer_num_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg)
{
return cfg->pointer_num_threshold_rx;
}

Ver fichero

@@ -335,6 +335,8 @@ struct wlan_srng_cfg {
* type handling is disabled * type handling is disabled
* @tx_pkt_inspect_for_ilp: flag to indicate if TX packet inspection for HW * @tx_pkt_inspect_for_ilp: flag to indicate if TX packet inspection for HW
* based ILP feature is enabled * based ILP feature is enabled
* @pointer_timer_threshold_rx: RX REO2SW ring pointer update timer threshold
* @pointer_num_threshold_rx: RX REO2SW ring pointer update entries threshold
*/ */
struct wlan_cfg_dp_soc_ctxt { struct wlan_cfg_dp_soc_ctxt {
int num_int_ctxts; int num_int_ctxts;
@@ -531,6 +533,8 @@ struct wlan_cfg_dp_soc_ctxt {
#ifdef DP_TX_PACKET_INSPECT_FOR_ILP #ifdef DP_TX_PACKET_INSPECT_FOR_ILP
bool tx_pkt_inspect_for_ilp; bool tx_pkt_inspect_for_ilp;
#endif #endif
uint16_t pointer_timer_threshold_rx;
uint8_t pointer_num_threshold_rx;
}; };
/** /**
@@ -2451,4 +2455,25 @@ uint8_t wlan_cfg_get_napi_scale_factor(struct wlan_cfg_dp_soc_ctxt *cfg);
void void
wlan_cfg_soc_update_tgt_params(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx, wlan_cfg_soc_update_tgt_params(struct wlan_cfg_dp_soc_ctxt *wlan_cfg_ctx,
struct cdp_ctrl_objmgr_psoc *ctrl_obj); struct cdp_ctrl_objmgr_psoc *ctrl_obj);
/**
* wlan_cfg_get_pointer_timer_threshold_rx() - Get timer threshold for RX
* pointer update
* @cfg: soc configuration context
*
* Return: timer threshold for RX REO Dest ring pointer update
*/
uint16_t
wlan_cfg_get_pointer_timer_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg);
/**
* wlan_cfg_get_pointer_num_threshold_rx() - Get number threshold for RX
* pointer update
* @cfg: soc configuration context
*
* Return: entries number threshold for RX REO Dest ring pointer update
*/
uint8_t
wlan_cfg_get_pointer_num_threshold_rx(struct wlan_cfg_dp_soc_ctxt *cfg);
#endif /*__WLAN_CFG_H*/ #endif /*__WLAN_CFG_H*/