From: Rasesh Mody <rmody@marvell.com>
To: <jerinj@marvell.com>, <ferruh.yigit@intel.com>
Cc: Rasesh Mody <rmody@marvell.com>, <dev@dpdk.org>,
<GR-Everest-DPDK-Dev@marvell.com>,
Igor Russkikh <irusskikh@marvell.com>
Subject: [dpdk-dev] [PATCH 5/7] net/qede: changes for DMA page chain allocation and free
Date: Fri, 19 Feb 2021 02:14:20 -0800 [thread overview]
Message-ID: <20210219101422.19121-6-rmody@marvell.com> (raw)
In-Reply-To: <20210219101422.19121-1-rmody@marvell.com>
This patch changes the DMA page chain allocation and free mechanism
used for fast path resources. It introduces addr_shadow() structure to
maintain virtual address and DMA mapping. The ecore_chain_params() is
used to maintain all the DMA page chain parameters.
Signed-off-by: Rasesh Mody <rmody@marvell.com>
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
---
drivers/net/qede/base/ecore_chain.h | 241 +++++++++++++++-----------
drivers/net/qede/base/ecore_dev.c | 119 ++++++++-----
drivers/net/qede/base/ecore_dev_api.h | 13 +-
drivers/net/qede/base/ecore_spq.c | 55 +++---
drivers/net/qede/qede_if.h | 20 +--
drivers/net/qede/qede_main.c | 1 +
drivers/net/qede/qede_rxtx.c | 67 +++----
7 files changed, 301 insertions(+), 215 deletions(-)
diff --git a/drivers/net/qede/base/ecore_chain.h b/drivers/net/qede/base/ecore_chain.h
index c69920be5..8c7971081 100644
--- a/drivers/net/qede/base/ecore_chain.h
+++ b/drivers/net/qede/base/ecore_chain.h
@@ -1,9 +1,9 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) 2016 - 2018 Cavium Inc.
+ * Copyright (c) 2018 - 2020 Marvell Semiconductor Inc.
* All rights reserved.
- * www.cavium.com
+ * www.marvell.com
*/
-
#ifndef __ECORE_CHAIN_H__
#define __ECORE_CHAIN_H__
@@ -24,8 +24,8 @@ enum ecore_chain_mode {
};
enum ecore_chain_use_mode {
- ECORE_CHAIN_USE_TO_PRODUCE, /* Chain starts empty */
- ECORE_CHAIN_USE_TO_CONSUME, /* Chain starts full */
+ ECORE_CHAIN_USE_TO_PRODUCE, /* Chain starts empty */
+ ECORE_CHAIN_USE_TO_CONSUME, /* Chain starts full */
ECORE_CHAIN_USE_TO_CONSUME_PRODUCE, /* Chain starts empty */
};
@@ -38,35 +38,40 @@ enum ecore_chain_cnt_type {
};
struct ecore_chain_next {
- struct regpair next_phys;
- void *next_virt;
+ struct regpair next_phys;
+ void *next_virt;
};
struct ecore_chain_pbl_u16 {
- u16 prod_page_idx;
- u16 cons_page_idx;
+ u16 prod_page_idx;
+ u16 cons_page_idx;
};
struct ecore_chain_pbl_u32 {
- u32 prod_page_idx;
- u32 cons_page_idx;
+ u32 prod_page_idx;
+ u32 cons_page_idx;
};
struct ecore_chain_ext_pbl {
- dma_addr_t p_pbl_phys;
- void *p_pbl_virt;
+ dma_addr_t p_pbl_phys;
+ void *p_pbl_virt;
};
struct ecore_chain_u16 {
/* Cyclic index of next element to produce/consme */
- u16 prod_idx;
- u16 cons_idx;
+ u16 prod_idx;
+ u16 cons_idx;
};
struct ecore_chain_u32 {
/* Cyclic index of next element to produce/consme */
- u32 prod_idx;
- u32 cons_idx;
+ u32 prod_idx;
+ u32 cons_idx;
+};
+
+struct addr_shadow {
+ void *virt_addr;
+ dma_addr_t dma_map;
};
struct ecore_chain {
@@ -74,16 +79,17 @@ struct ecore_chain {
* as produce / consume.
*/
/* Point to next element to produce/consume */
- void *p_prod_elem;
- void *p_cons_elem;
+ void *p_prod_elem;
+ void *p_cons_elem;
/* Fastpath portions of the PBL [if exists] */
struct {
- /* Table for keeping the virtual addresses of the chain pages,
- * respectively to the physical addresses in the pbl table.
+ /* Table for keeping the virtual and physical addresses of the
+ * chain pages, respectively to the physical addresses
+ * in the pbl table.
*/
- void **pp_virt_addr_tbl;
+ struct addr_shadow *shadow;
union {
struct ecore_chain_pbl_u16 pbl_u16;
@@ -92,8 +98,8 @@ struct ecore_chain {
} pbl;
union {
- struct ecore_chain_u16 chain16;
- struct ecore_chain_u32 chain32;
+ struct ecore_chain_u16 chain16;
+ struct ecore_chain_u32 chain32;
} u;
/* Capacity counts only usable elements */
@@ -106,12 +112,12 @@ struct ecore_chain {
enum ecore_chain_mode mode;
/* Elements information for fast calculations */
- u16 elem_per_page;
- u16 elem_per_page_mask;
- u16 elem_size;
- u16 next_page_mask;
- u16 usable_per_page;
- u8 elem_unusable;
+ u16 elem_per_page;
+ u16 elem_per_page_mask;
+ u16 elem_size;
+ u16 next_page_mask;
+ u16 usable_per_page;
+ u8 elem_unusable;
u8 cnt_type;
@@ -119,6 +125,8 @@ struct ecore_chain {
* but isn't involved in regular functionality.
*/
+ u32 page_size;
+
/* Base address of a pre-allocated buffer for pbl */
struct {
dma_addr_t p_phys_table;
@@ -140,24 +148,35 @@ struct ecore_chain {
/* TBD - do we really need this? Couldn't find usage for it */
bool b_external_pbl;
- void *dp_ctx;
+ void *dp_ctx;
+};
+
+struct ecore_chain_params {
+ enum ecore_chain_use_mode intended_use;
+ enum ecore_chain_mode mode;
+ enum ecore_chain_cnt_type cnt_type;
+ u32 num_elems;
+ osal_size_t elem_size;
+ u32 page_size;
+ struct ecore_chain_ext_pbl *ext_pbl;
};
-#define ECORE_CHAIN_PBL_ENTRY_SIZE (8)
-#define ECORE_CHAIN_PAGE_SIZE (0x1000)
-#define ELEMS_PER_PAGE(elem_size) (ECORE_CHAIN_PAGE_SIZE / (elem_size))
+#define ECORE_CHAIN_PBL_ENTRY_SIZE 8
+#define ECORE_CHAIN_PAGE_SIZE 0x1000
+#define ELEMS_PER_PAGE(page_size, elem_size) ((page_size) / (elem_size))
-#define UNUSABLE_ELEMS_PER_PAGE(elem_size, mode) \
- ((mode == ECORE_CHAIN_MODE_NEXT_PTR) ? \
- (u8)(1 + ((sizeof(struct ecore_chain_next) - 1) / \
+#define UNUSABLE_ELEMS_PER_PAGE(elem_size, mode) \
+ (((mode) == ECORE_CHAIN_MODE_NEXT_PTR) ? \
+ (u8)(1 + ((sizeof(struct ecore_chain_next) - 1) / \
(elem_size))) : 0)
-#define USABLE_ELEMS_PER_PAGE(elem_size, mode) \
- ((u32)(ELEMS_PER_PAGE(elem_size) - \
- UNUSABLE_ELEMS_PER_PAGE(elem_size, mode)))
+#define USABLE_ELEMS_PER_PAGE(elem_size, page_size, mode) \
+ ((u32)(ELEMS_PER_PAGE(page_size, elem_size) - \
+ UNUSABLE_ELEMS_PER_PAGE(elem_size, mode)))
-#define ECORE_CHAIN_PAGE_CNT(elem_cnt, elem_size, mode) \
- DIV_ROUND_UP(elem_cnt, USABLE_ELEMS_PER_PAGE(elem_size, mode))
+#define ECORE_CHAIN_PAGE_CNT(elem_cnt, elem_size, page_size, mode) \
+ DIV_ROUND_UP(elem_cnt, \
+ USABLE_ELEMS_PER_PAGE(elem_size, page_size, mode))
#define is_chain_u16(p) ((p)->cnt_type == ECORE_CHAIN_CNT_TYPE_U16)
#define is_chain_u32(p) ((p)->cnt_type == ECORE_CHAIN_CNT_TYPE_U32)
@@ -195,18 +214,41 @@ static OSAL_INLINE u32 ecore_chain_get_cons_idx_u32(struct ecore_chain *p_chain)
#define ECORE_U16_MAX ((u16)~0U)
#define ECORE_U32_MAX ((u32)~0U)
+static OSAL_INLINE u16
+ecore_chain_get_elem_used(struct ecore_chain *p_chain)
+{
+ u16 elem_per_page = p_chain->elem_per_page;
+ u32 prod = p_chain->u.chain16.prod_idx;
+ u32 cons = p_chain->u.chain16.cons_idx;
+ u16 used;
+
+ OSAL_ASSERT(is_chain_u16(p_chain));
+
+ if (prod < cons)
+ prod += (u32)ECORE_U16_MAX + 1;
+
+ used = (u16)(prod - cons);
+ if (p_chain->mode == ECORE_CHAIN_MODE_NEXT_PTR)
+ used -= prod / elem_per_page - cons / elem_per_page;
+
+ return (u16)(used);
+}
+
static OSAL_INLINE u16 ecore_chain_get_elem_left(struct ecore_chain *p_chain)
{
+ u16 elem_per_page = p_chain->elem_per_page;
+ u32 prod = p_chain->u.chain16.prod_idx;
+ u32 cons = p_chain->u.chain16.cons_idx;
u16 used;
OSAL_ASSERT(is_chain_u16(p_chain));
- used = (u16)(((u32)ECORE_U16_MAX + 1 +
- (u32)(p_chain->u.chain16.prod_idx)) -
- (u32)p_chain->u.chain16.cons_idx);
+ if (prod < cons)
+ prod += (u32)ECORE_U16_MAX + 1;
+
+ used = (u16)(prod - cons);
if (p_chain->mode == ECORE_CHAIN_MODE_NEXT_PTR)
- used -= p_chain->u.chain16.prod_idx / p_chain->elem_per_page -
- p_chain->u.chain16.cons_idx / p_chain->elem_per_page;
+ used -= prod / elem_per_page - cons / elem_per_page;
return (u16)(p_chain->capacity - used);
}
@@ -214,16 +256,19 @@ static OSAL_INLINE u16 ecore_chain_get_elem_left(struct ecore_chain *p_chain)
static OSAL_INLINE u32
ecore_chain_get_elem_left_u32(struct ecore_chain *p_chain)
{
+ u16 elem_per_page = p_chain->elem_per_page;
+ u64 prod = p_chain->u.chain32.prod_idx;
+ u64 cons = p_chain->u.chain32.cons_idx;
u32 used;
OSAL_ASSERT(is_chain_u32(p_chain));
- used = (u32)(((u64)ECORE_U32_MAX + 1 +
- (u64)(p_chain->u.chain32.prod_idx)) -
- (u64)p_chain->u.chain32.cons_idx);
+ if (prod < cons)
+ prod += (u64)ECORE_U32_MAX + 1;
+
+ used = (u32)(prod - cons);
if (p_chain->mode == ECORE_CHAIN_MODE_NEXT_PTR)
- used -= p_chain->u.chain32.prod_idx / p_chain->elem_per_page -
- p_chain->u.chain32.cons_idx / p_chain->elem_per_page;
+ used -= (u32)(prod / elem_per_page - cons / elem_per_page);
return p_chain->capacity - used;
}
@@ -319,7 +364,7 @@ ecore_chain_advance_page(struct ecore_chain *p_chain, void **p_next_elem,
*(u32 *)page_to_inc = 0;
page_index = *(u32 *)page_to_inc;
}
- *p_next_elem = p_chain->pbl.pp_virt_addr_tbl[page_index];
+ *p_next_elem = p_chain->pbl.shadow[page_index].virt_addr;
}
}
@@ -330,24 +375,20 @@ ecore_chain_advance_page(struct ecore_chain *p_chain, void **p_next_elem,
(((p)->u.chain32.idx & (p)->elem_per_page_mask) == (p)->usable_per_page)
#define is_unusable_next_idx(p, idx) \
- ((((p)->u.chain16.idx + 1) & \
- (p)->elem_per_page_mask) == (p)->usable_per_page)
+ ((((p)->u.chain16.idx + 1) & (p)->elem_per_page_mask) == (p)->usable_per_page)
#define is_unusable_next_idx_u32(p, idx) \
- ((((p)->u.chain32.idx + 1) & \
- (p)->elem_per_page_mask) == (p)->usable_per_page)
-
-#define test_and_skip(p, idx) \
- do { \
- if (is_chain_u16(p)) { \
- if (is_unusable_idx(p, idx)) \
- (p)->u.chain16.idx += \
- (p)->elem_unusable; \
- } else { \
- if (is_unusable_idx_u32(p, idx)) \
- (p)->u.chain32.idx += \
- (p)->elem_unusable; \
- } \
+ ((((p)->u.chain32.idx + 1) & (p)->elem_per_page_mask) == (p)->usable_per_page)
+
+#define test_and_skip(p, idx) \
+ do { \
+ if (is_chain_u16(p)) { \
+ if (is_unusable_idx(p, idx)) \
+ (p)->u.chain16.idx += (p)->elem_unusable; \
+ } else { \
+ if (is_unusable_idx_u32(p, idx)) \
+ (p)->u.chain32.idx += (p)->elem_unusable; \
+ } \
} while (0)
/**
@@ -395,7 +436,7 @@ static OSAL_INLINE void ecore_chain_return_produced(struct ecore_chain *p_chain)
*
* @param p_chain
*
- * @return void*, a pointer to next element
+ * @return void *, a pointer to next element
*/
static OSAL_INLINE void *ecore_chain_produce(struct ecore_chain *p_chain)
{
@@ -403,7 +444,8 @@ static OSAL_INLINE void *ecore_chain_produce(struct ecore_chain *p_chain)
if (is_chain_u16(p_chain)) {
if ((p_chain->u.chain16.prod_idx &
- p_chain->elem_per_page_mask) == p_chain->next_page_mask) {
+ p_chain->elem_per_page_mask) ==
+ p_chain->next_page_mask) {
p_prod_idx = &p_chain->u.chain16.prod_idx;
p_prod_page_idx = &p_chain->pbl.c.pbl_u16.prod_page_idx;
ecore_chain_advance_page(p_chain, &p_chain->p_prod_elem,
@@ -412,7 +454,8 @@ static OSAL_INLINE void *ecore_chain_produce(struct ecore_chain *p_chain)
p_chain->u.chain16.prod_idx++;
} else {
if ((p_chain->u.chain32.prod_idx &
- p_chain->elem_per_page_mask) == p_chain->next_page_mask) {
+ p_chain->elem_per_page_mask) ==
+ p_chain->next_page_mask) {
p_prod_idx = &p_chain->u.chain32.prod_idx;
p_prod_page_idx = &p_chain->pbl.c.pbl_u32.prod_page_idx;
ecore_chain_advance_page(p_chain, &p_chain->p_prod_elem,
@@ -423,7 +466,7 @@ static OSAL_INLINE void *ecore_chain_produce(struct ecore_chain *p_chain)
p_ret = p_chain->p_prod_elem;
p_chain->p_prod_elem = (void *)(((u8 *)p_chain->p_prod_elem) +
- p_chain->elem_size);
+ p_chain->elem_size);
return p_ret;
}
@@ -469,7 +512,7 @@ void ecore_chain_recycle_consumed(struct ecore_chain *p_chain)
*
* @param p_chain
*
- * @return void*, a pointer to the next buffer written
+ * @return void *, a pointer to the next buffer written
*/
static OSAL_INLINE void *ecore_chain_consume(struct ecore_chain *p_chain)
{
@@ -477,7 +520,8 @@ static OSAL_INLINE void *ecore_chain_consume(struct ecore_chain *p_chain)
if (is_chain_u16(p_chain)) {
if ((p_chain->u.chain16.cons_idx &
- p_chain->elem_per_page_mask) == p_chain->next_page_mask) {
+ p_chain->elem_per_page_mask) ==
+ p_chain->next_page_mask) {
p_cons_idx = &p_chain->u.chain16.cons_idx;
p_cons_page_idx = &p_chain->pbl.c.pbl_u16.cons_page_idx;
ecore_chain_advance_page(p_chain, &p_chain->p_cons_elem,
@@ -486,7 +530,8 @@ static OSAL_INLINE void *ecore_chain_consume(struct ecore_chain *p_chain)
p_chain->u.chain16.cons_idx++;
} else {
if ((p_chain->u.chain32.cons_idx &
- p_chain->elem_per_page_mask) == p_chain->next_page_mask) {
+ p_chain->elem_per_page_mask) ==
+ p_chain->next_page_mask) {
p_cons_idx = &p_chain->u.chain32.cons_idx;
p_cons_page_idx = &p_chain->pbl.c.pbl_u32.cons_page_idx;
ecore_chain_advance_page(p_chain, &p_chain->p_cons_elem,
@@ -497,7 +542,7 @@ static OSAL_INLINE void *ecore_chain_consume(struct ecore_chain *p_chain)
p_ret = p_chain->p_cons_elem;
p_chain->p_cons_elem = (void *)(((u8 *)p_chain->p_cons_elem) +
- p_chain->elem_size);
+ p_chain->elem_size);
return p_ret;
}
@@ -524,7 +569,7 @@ static OSAL_INLINE void ecore_chain_reset(struct ecore_chain *p_chain)
p_chain->p_prod_elem = p_chain->p_virt_addr;
if (p_chain->mode == ECORE_CHAIN_MODE_PBL) {
- /* Use "page_cnt-1" as a reset value for the prod/cons page's
+ /* Use "page_cnt - 1" as a reset value for the prod/cons page's
* indices, to avoid unnecessary page advancing on the first
* call to ecore_chain_produce/consume. Instead, the indices
* will be advanced to page_cnt and then will be wrapped to 0.
@@ -556,7 +601,7 @@ static OSAL_INLINE void ecore_chain_reset(struct ecore_chain *p_chain)
}
/**
- * @brief ecore_chain_init_params -
+ * @brief ecore_chain_init -
*
* Initalizes a basic chain struct
*
@@ -569,10 +614,12 @@ static OSAL_INLINE void ecore_chain_reset(struct ecore_chain *p_chain)
* @param dp_ctx
*/
static OSAL_INLINE void
-ecore_chain_init_params(struct ecore_chain *p_chain, u32 page_cnt, u8 elem_size,
- enum ecore_chain_use_mode intended_use,
- enum ecore_chain_mode mode,
- enum ecore_chain_cnt_type cnt_type, void *dp_ctx)
+ecore_chain_init(struct ecore_chain *p_chain,
+ u32 page_cnt, u8 elem_size, u32 page_size,
+ enum ecore_chain_use_mode intended_use,
+ enum ecore_chain_mode mode,
+ enum ecore_chain_cnt_type cnt_type,
+ void *dp_ctx)
{
/* chain fixed parameters */
p_chain->p_virt_addr = OSAL_NULL;
@@ -582,20 +629,22 @@ ecore_chain_init_params(struct ecore_chain *p_chain, u32 page_cnt, u8 elem_size,
p_chain->mode = mode;
p_chain->cnt_type = (u8)cnt_type;
- p_chain->elem_per_page = ELEMS_PER_PAGE(elem_size);
- p_chain->usable_per_page = USABLE_ELEMS_PER_PAGE(elem_size, mode);
+ p_chain->elem_per_page = ELEMS_PER_PAGE(page_size, elem_size);
+ p_chain->usable_per_page = USABLE_ELEMS_PER_PAGE(elem_size, page_size,
+ mode);
p_chain->elem_per_page_mask = p_chain->elem_per_page - 1;
p_chain->elem_unusable = UNUSABLE_ELEMS_PER_PAGE(elem_size, mode);
p_chain->next_page_mask = (p_chain->usable_per_page &
p_chain->elem_per_page_mask);
+ p_chain->page_size = page_size;
p_chain->page_cnt = page_cnt;
p_chain->capacity = p_chain->usable_per_page * page_cnt;
p_chain->size = p_chain->elem_per_page * page_cnt;
p_chain->b_external_pbl = false;
p_chain->pbl_sp.p_phys_table = 0;
p_chain->pbl_sp.p_virt_table = OSAL_NULL;
- p_chain->pbl.pp_virt_addr_tbl = OSAL_NULL;
+ p_chain->pbl.shadow = OSAL_NULL;
p_chain->dp_ctx = dp_ctx;
}
@@ -636,11 +685,11 @@ static OSAL_INLINE void ecore_chain_init_mem(struct ecore_chain *p_chain,
static OSAL_INLINE void ecore_chain_init_pbl_mem(struct ecore_chain *p_chain,
void *p_virt_pbl,
dma_addr_t p_phys_pbl,
- void **pp_virt_addr_tbl)
+ struct addr_shadow *shadow)
{
p_chain->pbl_sp.p_phys_table = p_phys_pbl;
p_chain->pbl_sp.p_virt_table = p_virt_pbl;
- p_chain->pbl.pp_virt_addr_tbl = pp_virt_addr_tbl;
+ p_chain->pbl.shadow = shadow;
}
/**
@@ -677,7 +726,7 @@ ecore_chain_init_next_ptr_elem(struct ecore_chain *p_chain, void *p_virt_curr,
*
* @param p_chain
*
- * @return void*
+ * @return void *
*/
static OSAL_INLINE void *ecore_chain_get_last_elem(struct ecore_chain *p_chain)
{
@@ -695,9 +744,8 @@ static OSAL_INLINE void *ecore_chain_get_last_elem(struct ecore_chain *p_chain)
p_next = (struct ecore_chain_next *)((u8 *)p_virt_addr + size);
while (p_next->next_virt != p_chain->p_virt_addr) {
p_virt_addr = p_next->next_virt;
- p_next =
- (struct ecore_chain_next *)((u8 *)p_virt_addr +
- size);
+ p_next = (struct ecore_chain_next *)((u8 *)p_virt_addr +
+ size);
}
break;
case ECORE_CHAIN_MODE_SINGLE:
@@ -705,12 +753,12 @@ static OSAL_INLINE void *ecore_chain_get_last_elem(struct ecore_chain *p_chain)
break;
case ECORE_CHAIN_MODE_PBL:
last_page_idx = p_chain->page_cnt - 1;
- p_virt_addr = p_chain->pbl.pp_virt_addr_tbl[last_page_idx];
+ p_virt_addr = p_chain->pbl.shadow[last_page_idx].virt_addr;
break;
}
/* p_virt_addr points at this stage to the last page of the chain */
size = p_chain->elem_size * (p_chain->usable_per_page - 1);
- p_virt_addr = ((u8 *)p_virt_addr + size);
+ p_virt_addr = (u8 *)p_virt_addr + size;
out:
return p_virt_addr;
}
@@ -825,8 +873,8 @@ static OSAL_INLINE void ecore_chain_pbl_zero_mem(struct ecore_chain *p_chain)
page_cnt = ecore_chain_get_page_cnt(p_chain);
for (i = 0; i < page_cnt; i++)
- OSAL_MEM_ZERO(p_chain->pbl.pp_virt_addr_tbl[i],
- ECORE_CHAIN_PAGE_SIZE);
+ OSAL_MEM_ZERO(p_chain->pbl.shadow[i].virt_addr,
+ p_chain->page_size);
}
int ecore_chain_print(struct ecore_chain *p_chain, char *buffer,
@@ -835,8 +883,7 @@ int ecore_chain_print(struct ecore_chain *p_chain, char *buffer,
int (*func_ptr_print_element)(struct ecore_chain *p_chain,
void *p_element,
char *buffer),
- int (*func_ptr_print_metadata)(struct ecore_chain
- *p_chain,
+ int (*func_ptr_print_metadata)(struct ecore_chain *p_chain,
char *buffer));
#endif /* __ECORE_CHAIN_H__ */
diff --git a/drivers/net/qede/base/ecore_dev.c b/drivers/net/qede/base/ecore_dev.c
index 63e5d6860..93af8c897 100644
--- a/drivers/net/qede/base/ecore_dev.c
+++ b/drivers/net/qede/base/ecore_dev.c
@@ -7784,43 +7784,40 @@ static void ecore_chain_free_single(struct ecore_dev *p_dev,
return;
OSAL_DMA_FREE_COHERENT(p_dev, p_chain->p_virt_addr,
- p_chain->p_phys_addr, ECORE_CHAIN_PAGE_SIZE);
+ p_chain->p_phys_addr, p_chain->page_size);
}
static void ecore_chain_free_pbl(struct ecore_dev *p_dev,
struct ecore_chain *p_chain)
{
- void **pp_virt_addr_tbl = p_chain->pbl.pp_virt_addr_tbl;
- u8 *p_pbl_virt = (u8 *)p_chain->pbl_sp.p_virt_table;
+ struct addr_shadow *shadow = p_chain->pbl.shadow;
u32 page_cnt = p_chain->page_cnt, i, pbl_size;
- if (!pp_virt_addr_tbl)
+ if (!shadow)
return;
- if (!p_pbl_virt)
- goto out;
-
for (i = 0; i < page_cnt; i++) {
- if (!pp_virt_addr_tbl[i])
+ if (!shadow[i].virt_addr || !shadow[i].dma_map)
break;
- OSAL_DMA_FREE_COHERENT(p_dev, pp_virt_addr_tbl[i],
- *(dma_addr_t *)p_pbl_virt,
- ECORE_CHAIN_PAGE_SIZE);
-
- p_pbl_virt += ECORE_CHAIN_PBL_ENTRY_SIZE;
+ OSAL_DMA_FREE_COHERENT(p_dev, shadow[i].virt_addr,
+ shadow[i].dma_map,
+ p_chain->page_size);
}
pbl_size = page_cnt * ECORE_CHAIN_PBL_ENTRY_SIZE;
- if (!p_chain->b_external_pbl)
+ if (!p_chain->b_external_pbl) {
OSAL_DMA_FREE_COHERENT(p_dev, p_chain->pbl_sp.p_virt_table,
p_chain->pbl_sp.p_phys_table, pbl_size);
-out:
- OSAL_VFREE(p_dev, p_chain->pbl.pp_virt_addr_tbl);
+ }
+
+ OSAL_VFREE(p_dev, p_chain->pbl.shadow);
+ p_chain->pbl.shadow = OSAL_NULL;
}
-void ecore_chain_free(struct ecore_dev *p_dev, struct ecore_chain *p_chain)
+void ecore_chain_free(struct ecore_dev *p_dev,
+ struct ecore_chain *p_chain)
{
switch (p_chain->mode) {
case ECORE_CHAIN_MODE_NEXT_PTR:
@@ -7833,14 +7830,18 @@ void ecore_chain_free(struct ecore_dev *p_dev, struct ecore_chain *p_chain)
ecore_chain_free_pbl(p_dev, p_chain);
break;
}
+
+ /* reset chain addresses to avoid double free */
+ ecore_chain_init_mem(p_chain, OSAL_NULL, 0);
}
static enum _ecore_status_t
ecore_chain_alloc_sanity_check(struct ecore_dev *p_dev,
enum ecore_chain_cnt_type cnt_type,
- osal_size_t elem_size, u32 page_cnt)
+ osal_size_t elem_size,
+ u32 page_size, u32 page_cnt)
{
- u64 chain_size = ELEMS_PER_PAGE(elem_size) * page_cnt;
+ u64 chain_size = ELEMS_PER_PAGE(page_size, elem_size) * page_cnt;
/* The actual chain size can be larger than the maximal possible value
* after rounding up the requested elements number to pages, and after
@@ -7853,8 +7854,8 @@ ecore_chain_alloc_sanity_check(struct ecore_dev *p_dev,
(cnt_type == ECORE_CHAIN_CNT_TYPE_U32 &&
chain_size > ECORE_U32_MAX)) {
DP_NOTICE(p_dev, true,
- "The actual chain size (0x%lx) is larger than the maximal possible value\n",
- (unsigned long)chain_size);
+ "The actual chain size (0x%" PRIx64 ") is larger than the maximal possible value\n",
+ chain_size);
return ECORE_INVAL;
}
@@ -7870,7 +7871,7 @@ ecore_chain_alloc_next_ptr(struct ecore_dev *p_dev, struct ecore_chain *p_chain)
for (i = 0; i < p_chain->page_cnt; i++) {
p_virt = OSAL_DMA_ALLOC_COHERENT(p_dev, &p_phys,
- ECORE_CHAIN_PAGE_SIZE);
+ p_chain->page_size);
if (!p_virt) {
DP_NOTICE(p_dev, false,
"Failed to allocate chain memory\n");
@@ -7903,7 +7904,7 @@ ecore_chain_alloc_single(struct ecore_dev *p_dev, struct ecore_chain *p_chain)
dma_addr_t p_phys = 0;
void *p_virt = OSAL_NULL;
- p_virt = OSAL_DMA_ALLOC_COHERENT(p_dev, &p_phys, ECORE_CHAIN_PAGE_SIZE);
+ p_virt = OSAL_DMA_ALLOC_COHERENT(p_dev, &p_phys, p_chain->page_size);
if (!p_virt) {
DP_NOTICE(p_dev, false, "Failed to allocate chain memory\n");
return ECORE_NOMEM;
@@ -7922,22 +7923,22 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
{
u32 page_cnt = p_chain->page_cnt, size, i;
dma_addr_t p_phys = 0, p_pbl_phys = 0;
- void **pp_virt_addr_tbl = OSAL_NULL;
+ struct addr_shadow *shadow = OSAL_NULL;
u8 *p_pbl_virt = OSAL_NULL;
void *p_virt = OSAL_NULL;
- size = page_cnt * sizeof(*pp_virt_addr_tbl);
- pp_virt_addr_tbl = (void **)OSAL_VZALLOC(p_dev, size);
- if (!pp_virt_addr_tbl) {
+ size = page_cnt * sizeof(struct addr_shadow);
+ shadow = (struct addr_shadow *)OSAL_VZALLOC(p_dev, size);
+ if (!shadow) {
DP_NOTICE(p_dev, false,
- "Failed to allocate memory for the chain virtual addresses table\n");
+ "Failed to allocate memory for the chain virtual/physical addresses table\n");
return ECORE_NOMEM;
}
/* The allocation of the PBL table is done with its full size, since it
* is expected to be successive.
* ecore_chain_init_pbl_mem() is called even in a case of an allocation
- * failure, since pp_virt_addr_tbl was previously allocated, and it
+ * failure, since tbl was previously allocated, and it
* should be saved to allow its freeing during the error flow.
*/
size = page_cnt * ECORE_CHAIN_PBL_ENTRY_SIZE;
@@ -7950,8 +7951,7 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
p_chain->b_external_pbl = true;
}
- ecore_chain_init_pbl_mem(p_chain, p_pbl_virt, p_pbl_phys,
- pp_virt_addr_tbl);
+ ecore_chain_init_pbl_mem(p_chain, p_pbl_virt, p_pbl_phys, shadow);
if (!p_pbl_virt) {
DP_NOTICE(p_dev, false, "Failed to allocate chain pbl memory\n");
return ECORE_NOMEM;
@@ -7959,7 +7959,7 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
for (i = 0; i < page_cnt; i++) {
p_virt = OSAL_DMA_ALLOC_COHERENT(p_dev, &p_phys,
- ECORE_CHAIN_PAGE_SIZE);
+ p_chain->page_size);
if (!p_virt) {
DP_NOTICE(p_dev, false,
"Failed to allocate chain memory\n");
@@ -7974,7 +7974,8 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
/* Fill the PBL table with the physical address of the page */
*(dma_addr_t *)p_pbl_virt = p_phys;
/* Keep the virtual address of the page */
- p_chain->pbl.pp_virt_addr_tbl[i] = p_virt;
+ p_chain->pbl.shadow[i].virt_addr = p_virt;
+ p_chain->pbl.shadow[i].dma_map = p_phys;
p_pbl_virt += ECORE_CHAIN_PBL_ENTRY_SIZE;
}
@@ -7982,36 +7983,58 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
return ECORE_SUCCESS;
}
+void ecore_chain_params_init(struct ecore_chain_params *p_params,
+ enum ecore_chain_use_mode intended_use,
+ enum ecore_chain_mode mode,
+ enum ecore_chain_cnt_type cnt_type,
+ u32 num_elems,
+ osal_size_t elem_size)
+{
+ p_params->intended_use = intended_use;
+ p_params->mode = mode;
+ p_params->cnt_type = cnt_type;
+ p_params->num_elems = num_elems;
+ p_params->elem_size = elem_size;
+
+ /* common values */
+ p_params->page_size = ECORE_CHAIN_PAGE_SIZE;
+ p_params->ext_pbl = OSAL_NULL;
+}
+
enum _ecore_status_t ecore_chain_alloc(struct ecore_dev *p_dev,
- enum ecore_chain_use_mode intended_use,
- enum ecore_chain_mode mode,
- enum ecore_chain_cnt_type cnt_type,
- u32 num_elems, osal_size_t elem_size,
struct ecore_chain *p_chain,
- struct ecore_chain_ext_pbl *ext_pbl)
+ struct ecore_chain_params *p_params)
{
u32 page_cnt;
enum _ecore_status_t rc = ECORE_SUCCESS;
- if (mode == ECORE_CHAIN_MODE_SINGLE)
+ if (p_params->mode == ECORE_CHAIN_MODE_SINGLE)
page_cnt = 1;
else
- page_cnt = ECORE_CHAIN_PAGE_CNT(num_elems, elem_size, mode);
-
- rc = ecore_chain_alloc_sanity_check(p_dev, cnt_type, elem_size,
+ page_cnt = ECORE_CHAIN_PAGE_CNT(p_params->num_elems,
+ p_params->elem_size,
+ p_params->page_size,
+ p_params->mode);
+
+ rc = ecore_chain_alloc_sanity_check(p_dev, p_params->cnt_type,
+ p_params->elem_size,
+ p_params->page_size,
page_cnt);
if (rc) {
DP_NOTICE(p_dev, false,
"Cannot allocate a chain with the given arguments:\n"
- "[use_mode %d, mode %d, cnt_type %d, num_elems %d, elem_size %zu]\n",
- intended_use, mode, cnt_type, num_elems, elem_size);
+ "[use_mode %d, mode %d, cnt_type %d, num_elems %d, elem_size %zu, page_size %u]\n",
+ p_params->intended_use, p_params->mode,
+ p_params->cnt_type, p_params->num_elems,
+ p_params->elem_size, p_params->page_size);
return rc;
}
- ecore_chain_init_params(p_chain, page_cnt, (u8)elem_size, intended_use,
- mode, cnt_type, p_dev->dp_ctx);
+ ecore_chain_init(p_chain, page_cnt, (u8)p_params->elem_size,
+ p_params->page_size, p_params->intended_use,
+ p_params->mode, p_params->cnt_type, p_dev->dp_ctx);
- switch (mode) {
+ switch (p_params->mode) {
case ECORE_CHAIN_MODE_NEXT_PTR:
rc = ecore_chain_alloc_next_ptr(p_dev, p_chain);
break;
@@ -8019,7 +8042,7 @@ enum _ecore_status_t ecore_chain_alloc(struct ecore_dev *p_dev,
rc = ecore_chain_alloc_single(p_dev, p_chain);
break;
case ECORE_CHAIN_MODE_PBL:
- rc = ecore_chain_alloc_pbl(p_dev, p_chain, ext_pbl);
+ rc = ecore_chain_alloc_pbl(p_dev, p_chain, p_params->ext_pbl);
break;
}
if (rc)
diff --git a/drivers/net/qede/base/ecore_dev_api.h b/drivers/net/qede/base/ecore_dev_api.h
index 1ffe286d7..2e06e77c9 100644
--- a/drivers/net/qede/base/ecore_dev_api.h
+++ b/drivers/net/qede/base/ecore_dev_api.h
@@ -482,6 +482,12 @@ struct ecore_eth_stats {
};
#endif
+void ecore_chain_params_init(struct ecore_chain_params *p_params,
+ enum ecore_chain_use_mode intended_use,
+ enum ecore_chain_mode mode,
+ enum ecore_chain_cnt_type cnt_type,
+ u32 num_elems,
+ osal_size_t elem_size);
/**
* @brief ecore_chain_alloc - Allocate and initialize a chain
*
@@ -496,13 +502,8 @@ struct ecore_eth_stats {
*/
enum _ecore_status_t
ecore_chain_alloc(struct ecore_dev *p_dev,
- enum ecore_chain_use_mode intended_use,
- enum ecore_chain_mode mode,
- enum ecore_chain_cnt_type cnt_type,
- u32 num_elems,
- osal_size_t elem_size,
struct ecore_chain *p_chain,
- struct ecore_chain_ext_pbl *ext_pbl);
+ struct ecore_chain_params *p_params);
/**
* @brief ecore_chain_free - Free chain DMA memory
diff --git a/drivers/net/qede/base/ecore_spq.c b/drivers/net/qede/base/ecore_spq.c
index 47c8a4e90..dda36c995 100644
--- a/drivers/net/qede/base/ecore_spq.c
+++ b/drivers/net/qede/base/ecore_spq.c
@@ -471,7 +471,8 @@ enum _ecore_status_t ecore_eq_completion(struct ecore_hwfn *p_hwfn,
enum _ecore_status_t ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem)
{
- struct ecore_eq *p_eq;
+ struct ecore_chain_params chain_params;
+ struct ecore_eq *p_eq;
/* Allocate EQ struct */
p_eq = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(*p_eq));
@@ -482,13 +483,13 @@ enum _ecore_status_t ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem)
}
/* Allocate and initialize EQ chain*/
- if (ecore_chain_alloc(p_hwfn->p_dev,
- ECORE_CHAIN_USE_TO_PRODUCE,
- ECORE_CHAIN_MODE_PBL,
- ECORE_CHAIN_CNT_TYPE_U16,
- num_elem,
- sizeof(union event_ring_element),
- &p_eq->chain, OSAL_NULL) != ECORE_SUCCESS) {
+ ecore_chain_params_init(&chain_params,
+ ECORE_CHAIN_USE_TO_PRODUCE,
+ ECORE_CHAIN_MODE_PBL,
+ ECORE_CHAIN_CNT_TYPE_U16,
+ num_elem,
+ sizeof(union event_ring_element));
+ if (ecore_chain_alloc(p_hwfn->p_dev, &p_eq->chain, &chain_params)) {
DP_NOTICE(p_hwfn, false, "Failed to allocate eq chain\n");
goto eq_allocate_fail;
}
@@ -626,6 +627,7 @@ void ecore_spq_setup(struct ecore_hwfn *p_hwfn)
enum _ecore_status_t ecore_spq_alloc(struct ecore_hwfn *p_hwfn)
{
struct ecore_spq_entry *p_virt = OSAL_NULL;
+ struct ecore_chain_params chain_params;
struct ecore_spq *p_spq = OSAL_NULL;
dma_addr_t p_phys = 0;
u32 capacity;
@@ -638,14 +640,20 @@ enum _ecore_status_t ecore_spq_alloc(struct ecore_hwfn *p_hwfn)
return ECORE_NOMEM;
}
+ /* SPQ for VF is needed only for async_comp callbacks */
+ if (IS_VF(p_hwfn->p_dev)) {
+ p_hwfn->p_spq = p_spq;
+ return ECORE_SUCCESS;
+ }
+
/* SPQ ring */
- if (ecore_chain_alloc(p_hwfn->p_dev,
- ECORE_CHAIN_USE_TO_PRODUCE,
- ECORE_CHAIN_MODE_SINGLE,
- ECORE_CHAIN_CNT_TYPE_U16,
- 0, /* N/A when the mode is SINGLE */
- sizeof(struct slow_path_element),
- &p_spq->chain, OSAL_NULL)) {
+ ecore_chain_params_init(&chain_params,
+ ECORE_CHAIN_USE_TO_PRODUCE,
+ ECORE_CHAIN_MODE_SINGLE,
+ ECORE_CHAIN_CNT_TYPE_U16,
+ 0, /* N/A when the mode is SINGLE */
+ sizeof(struct slow_path_element));
+ if (ecore_chain_alloc(p_hwfn->p_dev, &p_spq->chain, &chain_params)) {
DP_NOTICE(p_hwfn, false, "Failed to allocate spq chain\n");
goto spq_allocate_fail;
}
@@ -1120,6 +1128,7 @@ void ecore_spq_drop_next_completion(struct ecore_hwfn *p_hwfn)
enum _ecore_status_t ecore_consq_alloc(struct ecore_hwfn *p_hwfn)
{
+ struct ecore_chain_params chain_params;
struct ecore_consq *p_consq;
/* Allocate ConsQ struct */
@@ -1130,14 +1139,14 @@ enum _ecore_status_t ecore_consq_alloc(struct ecore_hwfn *p_hwfn)
return ECORE_NOMEM;
}
- /* Allocate and initialize EQ chain */
- if (ecore_chain_alloc(p_hwfn->p_dev,
- ECORE_CHAIN_USE_TO_PRODUCE,
- ECORE_CHAIN_MODE_PBL,
- ECORE_CHAIN_CNT_TYPE_U16,
- ECORE_CHAIN_PAGE_SIZE / 0x80,
- 0x80,
- &p_consq->chain, OSAL_NULL) != ECORE_SUCCESS) {
+ /* Allocate and initialize EQ chain*/
+ ecore_chain_params_init(&chain_params,
+ ECORE_CHAIN_USE_TO_PRODUCE,
+ ECORE_CHAIN_MODE_PBL,
+ ECORE_CHAIN_CNT_TYPE_U16,
+ ECORE_CHAIN_PAGE_SIZE / 0x80,
+ 0x80);
+ if (ecore_chain_alloc(p_hwfn->p_dev, &p_consq->chain, &chain_params)) {
DP_NOTICE(p_hwfn, false, "Failed to allocate consq chain");
goto consq_allocate_fail;
}
diff --git a/drivers/net/qede/qede_if.h b/drivers/net/qede/qede_if.h
index 1693a243f..daefd4b98 100644
--- a/drivers/net/qede/qede_if.h
+++ b/drivers/net/qede/qede_if.h
@@ -141,16 +141,16 @@ struct qed_common_ops {
struct rte_pci_device *pci_dev,
uint32_t dp_module, uint8_t dp_level, bool is_vf);
void (*set_name)(struct ecore_dev *edev, char name[]);
- enum _ecore_status_t
- (*chain_alloc)(struct ecore_dev *edev,
- enum ecore_chain_use_mode
- intended_use,
- enum ecore_chain_mode mode,
- enum ecore_chain_cnt_type cnt_type,
- uint32_t num_elems,
- osal_size_t elem_size,
- struct ecore_chain *p_chain,
- struct ecore_chain_ext_pbl *ext_pbl);
+
+ void (*chain_params_init)(struct ecore_chain_params *p_params,
+ enum ecore_chain_use_mode intended_use,
+ enum ecore_chain_mode mode,
+ enum ecore_chain_cnt_type cnt_type,
+ u32 num_elems, size_t elem_size);
+
+ int (*chain_alloc)(struct ecore_dev *edev,
+ struct ecore_chain *p_chain,
+ struct ecore_chain_params *p_params);
void (*chain_free)(struct ecore_dev *edev,
struct ecore_chain *p_chain);
diff --git a/drivers/net/qede/qede_main.c b/drivers/net/qede/qede_main.c
index e865d988f..4f99ab8b7 100644
--- a/drivers/net/qede/qede_main.c
+++ b/drivers/net/qede/qede_main.c
@@ -781,6 +781,7 @@ const struct qed_common_ops qed_common_ops_pass = {
INIT_STRUCT_FIELD(update_pf_params, &qed_update_pf_params),
INIT_STRUCT_FIELD(slowpath_start, &qed_slowpath_start),
INIT_STRUCT_FIELD(set_name, &qed_set_name),
+ INIT_STRUCT_FIELD(chain_params_init, &ecore_chain_params_init),
INIT_STRUCT_FIELD(chain_alloc, &ecore_chain_alloc),
INIT_STRUCT_FIELD(chain_free, &ecore_chain_free),
INIT_STRUCT_FIELD(sb_init, &qed_sb_init),
diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c
index c91fcc1fa..b6ff59457 100644
--- a/drivers/net/qede/qede_rxtx.c
+++ b/drivers/net/qede/qede_rxtx.c
@@ -135,6 +135,7 @@ qede_alloc_rx_queue_mem(struct rte_eth_dev *dev,
struct qede_dev *qdev = QEDE_INIT_QDEV(dev);
struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
struct qede_rx_queue *rxq;
+ struct ecore_chain_params chain_params;
size_t size;
int rc;
@@ -172,43 +173,45 @@ qede_alloc_rx_queue_mem(struct rte_eth_dev *dev,
}
/* Allocate FW Rx ring */
- rc = qdev->ops->common->chain_alloc(edev,
- ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
- ECORE_CHAIN_MODE_NEXT_PTR,
- ECORE_CHAIN_CNT_TYPE_U16,
- rxq->nb_rx_desc,
- sizeof(struct eth_rx_bd),
- &rxq->rx_bd_ring,
- NULL);
+ qdev->ops->common->chain_params_init(&chain_params,
+ ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
+ ECORE_CHAIN_MODE_NEXT_PTR,
+ ECORE_CHAIN_CNT_TYPE_U16,
+ rxq->nb_rx_desc,
+ sizeof(struct eth_rx_bd));
+ rc = qdev->ops->common->chain_alloc(edev, &rxq->rx_bd_ring,
+ &chain_params);
if (rc != ECORE_SUCCESS) {
DP_ERR(edev, "Memory allocation fails for RX BD ring"
" on socket %u\n", socket_id);
- rte_free(rxq->sw_rx_ring);
- rte_free(rxq);
- return NULL;
+ goto err1;
}
/* Allocate FW completion ring */
- rc = qdev->ops->common->chain_alloc(edev,
- ECORE_CHAIN_USE_TO_CONSUME,
- ECORE_CHAIN_MODE_PBL,
- ECORE_CHAIN_CNT_TYPE_U16,
- rxq->nb_rx_desc,
- sizeof(union eth_rx_cqe),
- &rxq->rx_comp_ring,
- NULL);
+ qdev->ops->common->chain_params_init(&chain_params,
+ ECORE_CHAIN_USE_TO_CONSUME,
+ ECORE_CHAIN_MODE_PBL,
+ ECORE_CHAIN_CNT_TYPE_U16,
+ rxq->nb_rx_desc,
+ sizeof(union eth_rx_cqe));
+ rc = qdev->ops->common->chain_alloc(edev, &rxq->rx_comp_ring,
+ &chain_params);
if (rc != ECORE_SUCCESS) {
DP_ERR(edev, "Memory allocation fails for RX CQE ring"
" on socket %u\n", socket_id);
- qdev->ops->common->chain_free(edev, &rxq->rx_bd_ring);
- rte_free(rxq->sw_rx_ring);
- rte_free(rxq);
- return NULL;
+ goto err2;
}
return rxq;
+
+err2:
+ qdev->ops->common->chain_free(edev, &rxq->rx_bd_ring);
+err1:
+ rte_free(rxq->sw_rx_ring);
+ rte_free(rxq);
+ return NULL;
}
int
@@ -392,6 +395,8 @@ qede_alloc_tx_queue_mem(struct rte_eth_dev *dev,
struct qede_dev *qdev = dev->data->dev_private;
struct ecore_dev *edev = &qdev->edev;
struct qede_tx_queue *txq;
+ struct ecore_chain_params chain_params;
+ union eth_tx_bd_types *p_virt;
int rc;
txq = rte_zmalloc_socket("qede_tx_queue", sizeof(struct qede_tx_queue),
@@ -408,14 +413,14 @@ qede_alloc_tx_queue_mem(struct rte_eth_dev *dev,
txq->qdev = qdev;
txq->port_id = dev->data->port_id;
- rc = qdev->ops->common->chain_alloc(edev,
- ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
- ECORE_CHAIN_MODE_PBL,
- ECORE_CHAIN_CNT_TYPE_U16,
- txq->nb_tx_desc,
- sizeof(union eth_tx_bd_types),
- &txq->tx_pbl,
- NULL);
+ qdev->ops->common->chain_params_init(&chain_params,
+ ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
+ ECORE_CHAIN_MODE_PBL,
+ ECORE_CHAIN_CNT_TYPE_U16,
+ txq->nb_tx_desc,
+ sizeof(*p_virt));
+ rc = qdev->ops->common->chain_alloc(edev, &txq->tx_pbl,
+ &chain_params);
if (rc != ECORE_SUCCESS) {
DP_ERR(edev,
"Unable to allocate memory for txbd ring on socket %u",
--
2.18.0
next prev parent reply other threads:[~2021-02-19 10:15 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-19 10:14 [dpdk-dev] [PATCH 0/7] net/qede: add support for new HW Rasesh Mody
2021-02-19 10:14 ` [dpdk-dev] [PATCH 2/7] net/qede/base: changes for HSI to support " Rasesh Mody
2021-02-19 10:14 ` [dpdk-dev] [PATCH 3/7] net/qede/base: add OS abstracted changes Rasesh Mody
2021-02-19 10:14 ` [dpdk-dev] [PATCH 4/7] net/qede/base: update base driver to 8.62.4.0 Rasesh Mody
2021-02-19 10:14 ` Rasesh Mody [this message]
2021-02-19 10:14 ` [dpdk-dev] [PATCH 6/7] net/qede: add support for new HW Rasesh Mody
2021-02-19 10:14 ` [dpdk-dev] [PATCH 7/7] net/qede/base: clean unnecessary ifdef and comments Rasesh Mody
2021-02-19 12:00 ` [dpdk-dev] [PATCH 0/7] net/qede: add support for new HW Rasesh Mody
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210219101422.19121-6-rmody@marvell.com \
--to=rmody@marvell.com \
--cc=GR-Everest-DPDK-Dev@marvell.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@intel.com \
--cc=irusskikh@marvell.com \
--cc=jerinj@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).