Skip to content

Commit ef8e599

Browse files
committed
Inline RX-Only Support
To enhance throughput on Linux systems, support for inline RX-only has been introduced. In this mode, RX memory is mapped directly to a reserved region in host memory—specifically, the memory hole located above the 4GB boundary. Signed-off-by: Ajay Parida <ajay.parida@nordicsemi.no>
1 parent 00c047e commit ef8e599

File tree

9 files changed

+198
-33
lines changed

9 files changed

+198
-33
lines changed

bus_if/bal/inc/bal_api.h

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void nrf_wifi_bal_deinit(struct nrf_wifi_bal_priv *bpriv);
5353
* @return Pointer to the added device context.
5454
*/
5555
struct nrf_wifi_bal_dev_ctx *nrf_wifi_bal_dev_add(struct nrf_wifi_bal_priv *bpriv,
56-
void *hal_dev_ctx);
56+
void *hal_dev_ctx);
5757

5858
/**
5959
* @brief Remove a device context from the BAL layer.
@@ -99,8 +99,8 @@ unsigned int nrf_wifi_bal_read_word(void *ctx, unsigned long addr_offset);
9999
* @param val Value to write.
100100
*/
101101
void nrf_wifi_bal_write_word(void *ctx,
102-
unsigned long addr_offset,
103-
unsigned int val);
102+
unsigned long addr_offset,
103+
unsigned int val);
104104

105105
/**
106106
* @brief Read a block of data from a specific address offset.
@@ -111,9 +111,9 @@ void nrf_wifi_bal_write_word(void *ctx,
111111
* @param len Length of the data to read.
112112
*/
113113
void nrf_wifi_bal_read_block(void *ctx,
114-
void *dest_addr,
115-
unsigned long src_addr_offset,
116-
size_t len);
114+
void *dest_addr,
115+
unsigned long src_addr_offset,
116+
size_t len);
117117

118118
/**
119119
* @brief Write a block of data to a specific address offset.
@@ -124,9 +124,23 @@ void nrf_wifi_bal_read_block(void *ctx,
124124
* @param len Length of the data to write.
125125
*/
126126
void nrf_wifi_bal_write_block(void *ctx,
127-
unsigned long dest_addr_offset,
128-
const void *src_addr,
129-
size_t len);
127+
unsigned long dest_addr_offset,
128+
const void *src_addr,
129+
size_t len);
130+
#ifdef WIFI_NRF71
131+
#ifdef INLINE_RX
132+
unsigned long nrf_wifi_bal_dma_map_inline_rx(void *ctx,
133+
unsigned long virt_addr,
134+
size_t len,
135+
enum nrf_wifi_osal_dma_dir dma_dir);
136+
137+
unsigned long nrf_wifi_bal_dma_unmap_inline_rx(void *ctx,
138+
unsigned long phy_addr,
139+
size_t len,
140+
enum nrf_wifi_osal_dma_dir dma_dir);
141+
#endif /* INLINE_RX */
142+
#endif /* WIFI_NRF71 */
143+
130144
/**
131145
* @brief Map a virtual address to a physical address for DMA transfer.
132146
*
@@ -138,9 +152,9 @@ void nrf_wifi_bal_write_block(void *ctx,
138152
* @return The mapped physical address.
139153
*/
140154
unsigned long nrf_wifi_bal_dma_map(void *ctx,
141-
unsigned long virt_addr,
142-
size_t len,
143-
enum nrf_wifi_osal_dma_dir dma_dir);
155+
unsigned long virt_addr,
156+
size_t len,
157+
enum nrf_wifi_osal_dma_dir dma_dir);
144158

145159
/**
146160
* @brief Unmap a physical address for DMA transfer.
@@ -151,9 +165,9 @@ unsigned long nrf_wifi_bal_dma_map(void *ctx,
151165
* @param dma_dir DMA direction.
152166
*/
153167
unsigned long nrf_wifi_bal_dma_unmap(void *ctx,
154-
unsigned long phy_addr,
155-
size_t len,
156-
enum nrf_wifi_osal_dma_dir dma_dir);
168+
unsigned long phy_addr,
169+
size_t len,
170+
enum nrf_wifi_osal_dma_dir dma_dir);
157171

158172
/**
159173
* @brief Enable bus access recording.

bus_if/bal/inc/bal_ops.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,20 @@ struct nrf_wifi_bal_ops {
142142
unsigned long phy_addr,
143143
size_t len,
144144
enum nrf_wifi_osal_dma_dir dma_dir);
145+
#ifdef WIFI_NRF71
146+
#ifdef INLINE_RX
147+
unsigned long (*dma_map_inline_rx)(void *bus_dev_ctx,
148+
unsigned long virt_addr,
149+
size_t len,
150+
enum nrf_wifi_osal_dma_dir dma_dir);
151+
152+
unsigned long (*dma_unmap_inline_rx)(void *bus_dev_ctx,
153+
unsigned long phy_addr,
154+
size_t len,
155+
enum nrf_wifi_osal_dma_dir dma_dir);
156+
#endif /* INLINE_RX */
157+
#endif /* WIFI_NRF71 */
158+
145159
#if defined(NRF_WIFI_LOW_POWER) || defined(__DOXYGEN__)
146160
/**
147161
* @brief Put the device into power-saving sleep mode.

bus_if/bal/src/bal.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,45 @@ void nrf_wifi_bal_write_block(void *ctx,
263263
len);
264264
}
265265

266+
#ifdef WIFI_NRF71
267+
#ifdef INLINE_RX
268+
unsigned long nrf_wifi_bal_dma_map_inline_rx(void *ctx,
269+
unsigned long virt_addr,
270+
size_t len,
271+
enum nrf_wifi_osal_dma_dir dma_dir)
272+
{
273+
struct nrf_wifi_bal_dev_ctx *bal_dev_ctx = NULL;
274+
unsigned long phy_addr = 0;
275+
276+
bal_dev_ctx = (struct nrf_wifi_bal_dev_ctx *)ctx;
277+
278+
phy_addr = bal_dev_ctx->bpriv->ops->dma_map_inline_rx(
279+
bal_dev_ctx->bus_dev_ctx,
280+
virt_addr,
281+
len,
282+
dma_dir);
283+
return phy_addr;
284+
}
285+
286+
unsigned long nrf_wifi_bal_dma_unmap_inline_rx(void *ctx,
287+
unsigned long phy_addr,
288+
size_t len,
289+
enum nrf_wifi_osal_dma_dir dma_dir)
290+
{
291+
struct nrf_wifi_bal_dev_ctx *bal_dev_ctx = NULL;
292+
unsigned long virt_addr = 0;
293+
294+
bal_dev_ctx = (struct nrf_wifi_bal_dev_ctx *)ctx;
295+
296+
virt_addr = bal_dev_ctx->bpriv->ops->dma_unmap_inline_rx(
297+
bal_dev_ctx->bus_dev_ctx,
298+
phy_addr,
299+
len,
300+
dma_dir);
301+
return virt_addr;
302+
}
303+
#endif /* INLINE_RX */
304+
#endif /* WIFI_NRF71 */
266305

267306
unsigned long nrf_wifi_bal_dma_map(void *ctx,
268307
unsigned long virt_addr,

bus_if/bus/pcie/src/pcie.c

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,40 @@ void nrf_wifi_bus_pcie_write_block(void *dev_ctx,
279279
nrf_wifi_osal_iomem_cpy_to(mmap_addr, src_addr, len);
280280
}
281281

282+
#ifdef WIFI_NRF71
283+
#ifdef INLINE_RX
284+
unsigned long nrf_wifi_bus_pcie_dma_map_inline_rx(void *dev_ctx,
285+
unsigned long virt_addr,
286+
size_t len,
287+
enum nrf_wifi_osal_dma_dir dma_dir)
288+
{
289+
struct nrf_wifi_bus_pcie_dev_ctx *pcie_dev_ctx = NULL;
290+
unsigned long phy_addr = 0;
291+
292+
pcie_dev_ctx = (struct nrf_wifi_bus_pcie_dev_ctx *)dev_ctx;
293+
294+
phy_addr = SOC_HOST_DATA_RAM_BASE +
295+
(virt_addr - pcie_dev_ctx->addr_hostram_base_inline_rx);
296+
return phy_addr;
297+
}
298+
299+
unsigned long nrf_wifi_bus_pcie_dma_unmap_inline_rx(void *dev_ctx,
300+
unsigned long phy_addr,
301+
size_t len,
302+
enum nrf_wifi_osal_dma_dir dma_dir)
303+
{
304+
struct nrf_wifi_bus_pcie_dev_ctx *pcie_dev_ctx = NULL;
305+
unsigned long virt_addr = 0;
306+
307+
pcie_dev_ctx = (struct nrf_wifi_bus_pcie_dev_ctx *)dev_ctx;
308+
309+
virt_addr = pcie_dev_ctx->addr_hostram_base_inline_rx +
310+
(phy_addr - SOC_HOST_DATA_RAM_BASE);
311+
312+
return virt_addr;
313+
}
314+
#endif /* INLINE_RX */
315+
#endif /* WIFI_NRF71 */
282316

283317
unsigned long nrf_wifi_bus_pcie_dma_map(void *dev_ctx,
284318
unsigned long virt_addr,
@@ -292,10 +326,10 @@ unsigned long nrf_wifi_bus_pcie_dma_map(void *dev_ctx,
292326

293327
#ifdef INLINE_MODE
294328
phy_addr = (unsigned long)nrf_wifi_osal_bus_pcie_dev_dma_map(
295-
pcie_dev_ctx->os_pcie_dev_ctx,
296-
(void *)virt_addr,
297-
len,
298-
dma_dir);
329+
pcie_dev_ctx->os_pcie_dev_ctx,
330+
(void *)virt_addr,
331+
len,
332+
dma_dir);
299333
#endif /* INLINE_MODE */
300334
#ifdef INLINE_BB_MODE
301335
phy_addr = SOC_HOST_PKTRAM_BASE + (virt_addr - pcie_dev_ctx->addr_pktram_base);
@@ -322,11 +356,10 @@ unsigned long nrf_wifi_bus_pcie_dma_unmap(void *dev_ctx,
322356
pcie_dev_ctx = (struct nrf_wifi_bus_pcie_dev_ctx *)dev_ctx;
323357

324358
#ifdef INLINE_MODE
325-
nrf_wifi_osal_bus_pcie_dev_dma_unmap(
326-
pcie_dev_ctx->os_pcie_dev_ctx,
327-
(void *)phy_addr,
328-
len,
329-
dma_dir);
359+
nrf_wifi_osal_bus_pcie_dev_dma_unmap(pcie_dev_ctx->os_pcie_dev_ctx,
360+
(void *)phy_addr,
361+
len,
362+
dma_dir);
330363
#endif /* INLINE_MODE */
331364
#ifdef INLINE_BB_MODE
332365
virt_addr = pcie_dev_ctx->addr_pktram_base + (phy_addr - SOC_HOST_PKTRAM_BASE);

hw_if/hal/inc/common/hal_structs_common.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@ struct nrf_wifi_hal_priv {
195195
struct nrf_wifi_hal_cfg_params cfg_params;
196196
/** PKTRAM base address */
197197
unsigned long addr_pktram_base;
198+
#ifdef WIFI_NRF71
199+
#ifdef INLINE_RX
200+
unsigned long hostram_addr_base_inline_rx;
201+
#endif /* INLINE_RX */
202+
#endif /* WIFI_NRF71 */
198203
};
199204

200205
/**
@@ -293,6 +298,11 @@ struct nrf_wifi_hal_dev_ctx {
293298
void *recovery_tasklet;
294299
/** Recovery lock */
295300
void *lock_recovery;
301+
#ifdef WIFI_NRF71
302+
#ifdef INLINE_RX
303+
unsigned long addr_rpu_host_ram_base;
304+
#endif /* INLINE_RX */
305+
#endif /* WIFI_NRF71 */
296306
};
297307

298308
/**

hw_if/hal/inc/common/pal.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,7 @@
2727
#define PCIE_BAR_OFFSET_WLAN_RPU 0x0
2828
#define PCIE_DMA_MASK 0xFFFFFFFF
2929

30-
#ifdef WIFI_NRF71
31-
#ifdef RPU_HARD_RESET_SUPPORT
32-
#define SOC_MMAP_ADDR_OFFSET_HARDRESET 0x3FFFFC
33-
#endif /* RPU_HARD_RESET_SUPPORT */
34-
#else /* WIFI_NRF71 */
35-
30+
#ifndef WIFI_NRF71
3631
#define SOC_MMAP_ADDR_OFFSET_PKTRAM_HOST_VIEW 0x0C0000
3732
#define SOC_MMAP_ADDR_OFFSET_PKTRAM_RPU_VIEW 0x380000
3833
#endif /* !WIFI_NRF71 */
@@ -97,7 +92,6 @@ enum nrf_wifi_fw_subtype {
9792
};
9893

9994
#ifdef WIFI_NRF71
100-
unsigned long pal_rpu_hard_rst_reg_offset_get(void);
10195
unsigned long pal_rpu_rom_access_reg_addr_get(void);
10296
unsigned long pal_rpu_wicr_reg_offset_get(void);
10397
#else /* WIFI_NRF71 */

hw_if/hal/src/common/hal_api_common.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,16 @@ nrf_wifi_hal_init(struct nrf_wifi_hal_cfg_params *cfg_params,
11821182
}
11831183

11841184
bal_cfg_params.addr_pktram_base = hpriv->addr_pktram_base;
1185-
1185+
#ifdef WIFI_NRF71
1186+
#ifdef INLINE_RX
1187+
hpriv->hostram_addr_base_inline_rx =
1188+
(unsigned long)nrf_wifi_osal_iomem_mmap_inline_rx(
1189+
SOC_HOST_DATA_RAM_BASE,
1190+
SOC_HOST_DATA_RAM_LEN);
1191+
bal_cfg_params.addr_hostram_base_inline_rx =
1192+
hpriv->hostram_addr_base_inline_rx;
1193+
#endif /* INLINE_RX */
1194+
#endif /* WIFI_NRF71 */
11861195
hpriv->bpriv = nrf_wifi_bal_init(&bal_cfg_params,
11871196
&nrf_wifi_hal_irq_handler);
11881197

@@ -1206,6 +1215,11 @@ nrf_wifi_hal_init(struct nrf_wifi_hal_cfg_params *cfg_params,
12061215
void nrf_wifi_hal_deinit(struct nrf_wifi_hal_priv *hpriv)
12071216
{
12081217
nrf_wifi_bal_deinit(hpriv->bpriv);
1218+
#ifdef WIFI_NRF71
1219+
#ifdef INLINE_RX
1220+
nrf_wifi_osal_iomem_unmap_inline_rx(hpriv->hostram_addr_base_inline_rx);
1221+
#endif /* INLINE_RX */
1222+
#endif /* WIFI_NRF71 */
12091223
nrf_wifi_osal_mem_free(hpriv);
12101224
}
12111225

hw_if/hal/src/system/hal_api.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,21 @@ unsigned long nrf_wifi_sys_hal_buf_map_rx(struct nrf_wifi_hal_dev_ctx *hal_dev_c
148148
#ifdef WIFI_NRF71
149149
rpu_addr = RPU_MEM_DATA_RAM_BASE +
150150
(bounce_buf_addr - hal_dev_ctx->addr_rpu_pktram_base);
151+
#ifdef INLINE_RX
152+
nrf_wifi_osal_mem_cpy((void *)bounce_buf_addr,
153+
(void *)buf,
154+
hal_dev_ctx->hpriv->cfg_params.rx_buf_headroom_sz);
155+
#else /* INLINE_RX */
156+
rpu_addr = RPU_MEM_DATA_RAM_BASE +
157+
(bounce_buf_addr - hal_dev_ctx->addr_rpu_pktram_base);
151158
hal_rpu_mem_write(hal_dev_ctx,
152159
(unsigned int)rpu_addr,
153160
(void *)buf,
154161
hal_dev_ctx->hpriv->cfg_params.rx_buf_headroom_sz);
162+
#endif /* !INLINE_RX */
155163
#else /* WIFI_NRF71 */
156-
rpu_addr = RPU_MEM_PKT_BASE + (bounce_buf_addr - hal_dev_ctx->addr_rpu_pktram_base);
164+
rpu_addr = RPU_MEM_PKT_BASE +
165+
(bounce_buf_addr - hal_dev_ctx->addr_rpu_pktram_base);
157166

158167
hal_rpu_mem_write(hal_dev_ctx,
159168
(unsigned int)rpu_addr,
@@ -163,10 +172,18 @@ unsigned long nrf_wifi_sys_hal_buf_map_rx(struct nrf_wifi_hal_dev_ctx *hal_dev_c
163172
addr_to_map = bounce_buf_addr + hal_dev_ctx->hpriv->cfg_params.rx_buf_headroom_sz;
164173

165174
#ifdef WIFI_NRF71
175+
#ifdef INLINE_RX
176+
rx_buf_info->phy_addr = nrf_wifi_bal_dma_map_inline_rx(
177+
hal_dev_ctx->bal_dev_ctx,
178+
addr_to_map,
179+
buf_len,
180+
NRF_WIFI_OSAL_DMA_DIR_FROM_DEV);
181+
#else /* INLINE_RX */
166182
rx_buf_info->phy_addr = nrf_wifi_bal_dma_map(hal_dev_ctx->bal_dev_ctx,
167183
addr_to_map,
168184
buf_len,
169185
NRF_WIFI_OSAL_DMA_DIR_FROM_DEV);
186+
#endif /* !INLINE_RX */
170187
#else /* WIFI_NRF71 */
171188
rx_buf_info->phy_addr = nrf_wifi_bal_dma_map(hal_dev_ctx->bal_dev_ctx,
172189
addr_to_map,
@@ -208,13 +225,21 @@ unsigned long nrf_wifi_sys_hal_buf_unmap_rx(struct nrf_wifi_hal_dev_ctx *hal_dev
208225
}
209226

210227
#ifdef WIFI_NRF71
228+
#ifdef INLINE_RX
229+
unmapped_addr = nrf_wifi_bal_dma_unmap_inline_rx(
230+
hal_dev_ctx->bal_dev_ctx,
231+
rx_buf_info->phy_addr,
232+
rx_buf_info->buf_len,
233+
NRF_WIFI_OSAL_DMA_DIR_FROM_DEV);
234+
#else /* INLINE_RX */
211235
unmapped_addr = nrf_wifi_bal_dma_unmap(hal_dev_ctx->bal_dev_ctx,
212236
rx_buf_info->phy_addr,
213237
rx_buf_info->buf_len,
214238
NRF_WIFI_OSAL_DMA_DIR_FROM_DEV);
215239

216240
rpu_addr = RPU_MEM_DATA_RAM_BASE +
217241
(unmapped_addr - hal_dev_ctx->addr_rpu_pktram_base);
242+
#endif /* !INLINE_RX */
218243
#else /* WIFI_NRF71 */
219244
rpu_addr = RPU_MEM_PKT_BASE +
220245
(unmapped_addr - hal_dev_ctx->addr_rpu_pktram_base);
@@ -226,11 +251,18 @@ unsigned long nrf_wifi_sys_hal_buf_unmap_rx(struct nrf_wifi_hal_dev_ctx *hal_dev
226251
goto out;
227252
}
228253
#ifdef WIFI_NRF71
254+
#ifdef INLINE_RX
255+
nrf_wifi_osal_mem_cpy((void *)(rx_buf_info->virt_addr +
256+
hal_dev_ctx->hpriv->cfg_params.rx_buf_headroom_sz),
257+
(void *)unmapped_addr,
258+
data_len);
259+
#else /* INLINE_RX */
229260
hal_rpu_mem_read(hal_dev_ctx,
230261
(void *)(rx_buf_info->virt_addr +
231262
hal_dev_ctx->hpriv->cfg_params.rx_buf_headroom_sz),
232263
(unsigned int)rpu_addr,
233264
data_len);
265+
#endif /* !INLINE_RX */
234266
#else /* WIFI_NRF71 */
235267
hal_rpu_mem_read(hal_dev_ctx,
236268
(void *)(rx_buf_info->virt_addr +

0 commit comments

Comments
 (0)