mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
qcacmn: Enable WLAN host data path support for IPA WDI3.0
Change to support WLAN Napier host autonomy data path architecture. Change-Id: I07f7592d547bb796a3c12bbc4745cee22e2c0022 CRs-Fixed: 2064810
This commit is contained in:
parent
25ff719058
commit
fde6b9e551
17 changed files with 1632 additions and 155 deletions
|
|
@ -308,6 +308,42 @@ extern void hal_get_shadow_config(void *hal_soc,
|
|||
extern void *hal_srng_setup(void *hal_soc, int ring_type, int ring_num,
|
||||
int mac_id, struct hal_srng_params *ring_params);
|
||||
|
||||
/* Remapping ids of REO rings */
|
||||
#define REO_REMAP_TCL 0
|
||||
#define REO_REMAP_SW1 1
|
||||
#define REO_REMAP_SW2 2
|
||||
#define REO_REMAP_SW3 3
|
||||
#define REO_REMAP_SW4 4
|
||||
#define REO_REMAP_RELEASE 5
|
||||
#define REO_REMAP_FW 6
|
||||
#define REO_REMAP_UNUSED 7
|
||||
|
||||
/*
|
||||
* currently this macro only works for IX0 since all the rings we are remapping
|
||||
* can be remapped from HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0
|
||||
*/
|
||||
#define HAL_REO_REMAP_VAL(_ORIGINAL_DEST, _NEW_DEST) \
|
||||
HAL_REO_REMAP_VAL_(_ORIGINAL_DEST, _NEW_DEST)
|
||||
/* allow the destination macros to be expanded */
|
||||
#define HAL_REO_REMAP_VAL_(_ORIGINAL_DEST, _NEW_DEST) \
|
||||
(_NEW_DEST << \
|
||||
(HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_DEST_RING_MAPPING_ ## \
|
||||
_ORIGINAL_DEST ## _SHFT))
|
||||
|
||||
/**
|
||||
* hal_reo_remap_IX0 - Remap REO ring destination
|
||||
* @hal: HAL SOC handle
|
||||
* @remap_val: Remap value
|
||||
*/
|
||||
extern void hal_reo_remap_IX0(struct hal_soc *hal, uint32_t remap_val);
|
||||
|
||||
/**
|
||||
* hal_srng_set_hp_paddr() - Set physical address to SRNG head pointer
|
||||
* @sring: sring pointer
|
||||
* @paddr: physical address
|
||||
*/
|
||||
extern void hal_srng_set_hp_paddr(struct hal_srng *sring, uint64_t paddr);
|
||||
|
||||
/**
|
||||
* hal_srng_cleanup - Deinitialize HW SRNG ring.
|
||||
* @hal_soc: Opaque HAL SOC handle
|
||||
|
|
@ -939,11 +975,6 @@ static inline qdf_dma_addr_t hal_srng_get_hp_addr(void *hal_soc, void *hal_ring)
|
|||
struct hal_srng *srng = (struct hal_srng *)hal_ring;
|
||||
struct hal_soc *hal = (struct hal_soc *)hal_soc;
|
||||
|
||||
if (!(srng->flags & HAL_SRNG_LMAC_RING)) {
|
||||
/* Currently this interface is required only for LMAC rings */
|
||||
return (qdf_dma_addr_t)NULL;
|
||||
}
|
||||
|
||||
if (srng->ring_dir == HAL_SRNG_SRC_RING) {
|
||||
return hal->shadow_wrptr_mem_paddr +
|
||||
((unsigned long)(srng->u.src_ring.hp_addr) -
|
||||
|
|
@ -967,11 +998,6 @@ static inline qdf_dma_addr_t hal_srng_get_tp_addr(void *hal_soc, void *hal_ring)
|
|||
struct hal_srng *srng = (struct hal_srng *)hal_ring;
|
||||
struct hal_soc *hal = (struct hal_soc *)hal_soc;
|
||||
|
||||
if (!(srng->flags & HAL_SRNG_LMAC_RING)) {
|
||||
/* Currently this interface is required only for LMAC rings */
|
||||
return (qdf_dma_addr_t)NULL;
|
||||
}
|
||||
|
||||
if (srng->ring_dir == HAL_SRNG_SRC_RING) {
|
||||
return hal->shadow_rdptr_mem_paddr +
|
||||
((unsigned long)(srng->u.src_ring.tp_addr) -
|
||||
|
|
|
|||
|
|
@ -150,18 +150,25 @@ enum hal_srng_ring_id {
|
|||
HAL_SRNG_UMAC_ID_END = 127,
|
||||
/* LMAC rings - The following set will be replicated for each LMAC */
|
||||
HAL_SRNG_LMAC1_ID_START = 128,
|
||||
HAL_SRNG_WMAC1_SW2RXDMA0_BUF = HAL_SRNG_LMAC1_ID_START,
|
||||
HAL_SRNG_WMAC1_SW2RXDMA1_BUF = 129,
|
||||
HAL_SRNG_WMAC1_SW2RXDMA2_BUF = 130,
|
||||
HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = 131,
|
||||
HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF = 132,
|
||||
HAL_SRNG_WMAC1_RXDMA2SW0 = 133,
|
||||
HAL_SRNG_WMAC1_RXDMA2SW1 = 134,
|
||||
HAL_SRNG_WMAC1_SW2RXDMA1_DESC = 135,
|
||||
#ifdef WLAN_FEATURE_CIF_CFR
|
||||
HAL_SRNG_WIFI_POS_SRC_DMA_RING = 136,
|
||||
HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 = HAL_SRNG_LMAC1_ID_START,
|
||||
#ifdef IPA_OFFLOAD
|
||||
HAL_SRNG_WMAC1_SW2RXDMA0_BUF1 = (HAL_SRNG_LMAC1_ID_START + 1),
|
||||
HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 = (HAL_SRNG_LMAC1_ID_START + 2),
|
||||
HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 + 1),
|
||||
#else
|
||||
HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 + 1),
|
||||
#endif
|
||||
/* 137-142 unused */
|
||||
HAL_SRNG_WMAC1_SW2RXDMA2_BUF = (HAL_SRNG_WMAC1_SW2RXDMA1_BUF + 1),
|
||||
HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = (HAL_SRNG_WMAC1_SW2RXDMA2_BUF + 1),
|
||||
HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF =
|
||||
(HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF + 1),
|
||||
HAL_SRNG_WMAC1_RXDMA2SW0 = (HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF + 1),
|
||||
HAL_SRNG_WMAC1_RXDMA2SW1 = (HAL_SRNG_WMAC1_RXDMA2SW0 + 1),
|
||||
HAL_SRNG_WMAC1_SW2RXDMA1_DESC = (HAL_SRNG_WMAC1_RXDMA2SW1 + 1),
|
||||
#ifdef WLAN_FEATURE_CIF_CFR
|
||||
HAL_SRNG_WIFI_POS_SRC_DMA_RING = (HAL_SRNG_WMAC1_SW2RXDMA1_DESC + 1),
|
||||
#endif
|
||||
/* -142 unused */
|
||||
HAL_SRNG_LMAC1_ID_END = 143
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -422,12 +422,12 @@ static struct hal_hw_srng_config hw_srng_table[] = {
|
|||
},
|
||||
},
|
||||
{ /* RXDMA_BUF */
|
||||
.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF,
|
||||
.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
|
||||
#ifdef IPA_OFFLOAD
|
||||
.max_rings = 3,
|
||||
#else
|
||||
.max_rings = 2,
|
||||
/* TODO: Check if the additional IPA buffer ring needs to be
|
||||
* setup here (in which case max_rings should be set to 2),
|
||||
* or it will be setup by IPA host driver
|
||||
*/
|
||||
#endif
|
||||
.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
|
||||
.lmac_ring = TRUE,
|
||||
.ring_dir = HAL_SRNG_SRC_RING,
|
||||
|
|
@ -578,8 +578,8 @@ static void hal_update_srng_hp_tp_address(void *hal_soc,
|
|||
}
|
||||
|
||||
QDF_STATUS hal_set_one_shadow_config(void *hal_soc,
|
||||
int ring_type,
|
||||
int ring_num)
|
||||
int ring_type,
|
||||
int ring_num)
|
||||
{
|
||||
uint32_t target_register;
|
||||
struct hal_soc *hal = (struct hal_soc *)hal_soc;
|
||||
|
|
@ -608,9 +608,9 @@ QDF_STATUS hal_set_one_shadow_config(void *hal_soc,
|
|||
ring_num);
|
||||
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO,
|
||||
"%s: target_reg %x, shadow_index %x, ring_type %d, ring num %d\n",
|
||||
__func__, target_register, shadow_config_index,
|
||||
ring_type, ring_num);
|
||||
"%s: target_reg %x, shadow_index %x, ring_type %d, ring num %d\n",
|
||||
__func__, target_register, shadow_config_index,
|
||||
ring_type, ring_num);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
@ -813,8 +813,6 @@ extern void hal_detach(void *hal_soc)
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* hal_srng_src_hw_init - Private function to initialize SRNG
|
||||
* source ring HW
|
||||
|
|
@ -955,6 +953,31 @@ static inline void hal_ce_dst_setup(struct hal_soc *hal, struct hal_srng *srng,
|
|||
HAL_REG_WRITE(hal, reg_addr, reg_val);
|
||||
}
|
||||
|
||||
/**
|
||||
* hal_reo_remap_IX0 - Remap REO ring destination
|
||||
* @hal: HAL SOC handle
|
||||
* @remap_val: Remap value
|
||||
*/
|
||||
void hal_reo_remap_IX0(struct hal_soc *hal, uint32_t remap_val)
|
||||
{
|
||||
uint32_t reg_offset = HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR(
|
||||
SEQ_WCSS_UMAC_REO_REG_OFFSET);
|
||||
HAL_REG_WRITE(hal, reg_offset, remap_val);
|
||||
}
|
||||
|
||||
/**
|
||||
* hal_srng_set_hp_paddr() - Set physical address to SRNG head pointer
|
||||
* @sring: sring pointer
|
||||
* @paddr: physical address
|
||||
*/
|
||||
void hal_srng_set_hp_paddr(struct hal_srng *sring,
|
||||
uint64_t paddr)
|
||||
{
|
||||
SRNG_DST_REG_WRITE(sring, HP_ADDR_LSB,
|
||||
paddr & 0xffffffff);
|
||||
SRNG_DST_REG_WRITE(sring, HP_ADDR_MSB,
|
||||
paddr >> 32);
|
||||
}
|
||||
/**
|
||||
* hal_srng_dst_hw_init - Private function to initialize SRNG
|
||||
* destination ring HW
|
||||
|
|
@ -1165,9 +1188,9 @@ void *hal_srng_setup(void *hal_soc, int ring_type, int ring_num,
|
|||
|
||||
if (CHECK_SHADOW_REGISTERS) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
||||
QDF_TRACE_LEVEL_ERROR,
|
||||
"%s: Ring (%d, %d) missing shadow config\n",
|
||||
__func__, ring_type, ring_num);
|
||||
QDF_TRACE_LEVEL_ERROR,
|
||||
"%s: Ring (%d, %d) missing shadow config\n",
|
||||
__func__, ring_type, ring_num);
|
||||
}
|
||||
} else {
|
||||
hal_validate_shadow_register(hal,
|
||||
|
|
@ -1200,9 +1223,9 @@ void *hal_srng_setup(void *hal_soc, int ring_type, int ring_num,
|
|||
|
||||
if (CHECK_SHADOW_REGISTERS) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
||||
QDF_TRACE_LEVEL_ERROR,
|
||||
"%s: Ring (%d, %d) missing shadow config\n",
|
||||
__func__, ring_type, ring_num);
|
||||
QDF_TRACE_LEVEL_ERROR,
|
||||
"%s: Ring (%d, %d) missing shadow config\n",
|
||||
__func__, ring_type, ring_num);
|
||||
}
|
||||
} else {
|
||||
hal_validate_shadow_register(hal,
|
||||
|
|
|
|||
Loading…
Reference in a new issue