提交 3bbf0faa 编写于 作者: F Faisal Latif 提交者: Jeff Kirsher

i40e/i40evf: Add support for pre-allocated pages for PD

The i40e_add_pd_table_entry() routine is being modified to handle both
cases where a backing page is passed and where backing page is allocated
in i40e_add_pd_table_entry().

For PBLE resource management, it is more efficient for it to manage its
backing pages. For VF, PBLE backing page addresses will be send to PF
driver for PBLE resource.

The i40e_remove_pd_bp() is also modified to not free pre-allocated pages and
free only ones which were allocated in i40e_add_pd_table_entry().

Change-ID: Ie673f0403f22979e9406f5a94048dceb91bcf9a8
Signed-off-by: NFaisal Latif <faisal.latif@intel.com>
Tested-by: NJim Young <james.m.young@intel.com>
Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
上级 44151cd3
...@@ -116,6 +116,7 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw, ...@@ -116,6 +116,7 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw,
* @hw: pointer to our HW structure * @hw: pointer to our HW structure
* @hmc_info: pointer to the HMC configuration information structure * @hmc_info: pointer to the HMC configuration information structure
* @pd_index: which page descriptor index to manipulate * @pd_index: which page descriptor index to manipulate
* @rsrc_pg: if not NULL, use preallocated page instead of allocating new one.
* *
* This function: * This function:
* 1. Initializes the pd entry * 1. Initializes the pd entry
...@@ -129,12 +130,14 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw, ...@@ -129,12 +130,14 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw,
**/ **/
i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw, i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw,
struct i40e_hmc_info *hmc_info, struct i40e_hmc_info *hmc_info,
u32 pd_index) u32 pd_index,
struct i40e_dma_mem *rsrc_pg)
{ {
i40e_status ret_code = 0; i40e_status ret_code = 0;
struct i40e_hmc_pd_table *pd_table; struct i40e_hmc_pd_table *pd_table;
struct i40e_hmc_pd_entry *pd_entry; struct i40e_hmc_pd_entry *pd_entry;
struct i40e_dma_mem mem; struct i40e_dma_mem mem;
struct i40e_dma_mem *page = &mem;
u32 sd_idx, rel_pd_idx; u32 sd_idx, rel_pd_idx;
u64 *pd_addr; u64 *pd_addr;
u64 page_desc; u64 page_desc;
...@@ -155,18 +158,24 @@ i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw, ...@@ -155,18 +158,24 @@ i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw,
pd_table = &hmc_info->sd_table.sd_entry[sd_idx].u.pd_table; pd_table = &hmc_info->sd_table.sd_entry[sd_idx].u.pd_table;
pd_entry = &pd_table->pd_entry[rel_pd_idx]; pd_entry = &pd_table->pd_entry[rel_pd_idx];
if (!pd_entry->valid) { if (!pd_entry->valid) {
/* allocate a 4K backing page */ if (rsrc_pg) {
ret_code = i40e_allocate_dma_mem(hw, &mem, i40e_mem_bp, pd_entry->rsrc_pg = true;
I40E_HMC_PAGED_BP_SIZE, page = rsrc_pg;
I40E_HMC_PD_BP_BUF_ALIGNMENT); } else {
if (ret_code) /* allocate a 4K backing page */
goto exit; ret_code = i40e_allocate_dma_mem(hw, page, i40e_mem_bp,
I40E_HMC_PAGED_BP_SIZE,
I40E_HMC_PD_BP_BUF_ALIGNMENT);
if (ret_code)
goto exit;
pd_entry->rsrc_pg = false;
}
pd_entry->bp.addr = mem; pd_entry->bp.addr = *page;
pd_entry->bp.sd_pd_index = pd_index; pd_entry->bp.sd_pd_index = pd_index;
pd_entry->bp.entry_type = I40E_SD_TYPE_PAGED; pd_entry->bp.entry_type = I40E_SD_TYPE_PAGED;
/* Set page address and valid bit */ /* Set page address and valid bit */
page_desc = mem.pa | 0x1; page_desc = page->pa | 0x1;
pd_addr = (u64 *)pd_table->pd_page_addr.va; pd_addr = (u64 *)pd_table->pd_page_addr.va;
pd_addr += rel_pd_idx; pd_addr += rel_pd_idx;
...@@ -240,7 +249,8 @@ i40e_status i40e_remove_pd_bp(struct i40e_hw *hw, ...@@ -240,7 +249,8 @@ i40e_status i40e_remove_pd_bp(struct i40e_hw *hw,
I40E_INVALIDATE_PF_HMC_PD(hw, sd_idx, idx); I40E_INVALIDATE_PF_HMC_PD(hw, sd_idx, idx);
/* free memory here */ /* free memory here */
ret_code = i40e_free_dma_mem(hw, &(pd_entry->bp.addr)); if (!pd_entry->rsrc_pg)
ret_code = i40e_free_dma_mem(hw, &pd_entry->bp.addr);
if (ret_code) if (ret_code)
goto exit; goto exit;
if (!pd_table->ref_cnt) if (!pd_table->ref_cnt)
......
...@@ -62,6 +62,7 @@ struct i40e_hmc_bp { ...@@ -62,6 +62,7 @@ struct i40e_hmc_bp {
struct i40e_hmc_pd_entry { struct i40e_hmc_pd_entry {
struct i40e_hmc_bp bp; struct i40e_hmc_bp bp;
u32 sd_index; u32 sd_index;
bool rsrc_pg;
bool valid; bool valid;
}; };
...@@ -218,7 +219,8 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw, ...@@ -218,7 +219,8 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw,
i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw, i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw,
struct i40e_hmc_info *hmc_info, struct i40e_hmc_info *hmc_info,
u32 pd_index); u32 pd_index,
struct i40e_dma_mem *rsrc_pg);
i40e_status i40e_remove_pd_bp(struct i40e_hw *hw, i40e_status i40e_remove_pd_bp(struct i40e_hw *hw,
struct i40e_hmc_info *hmc_info, struct i40e_hmc_info *hmc_info,
u32 idx); u32 idx);
......
...@@ -387,7 +387,7 @@ static i40e_status i40e_create_lan_hmc_object(struct i40e_hw *hw, ...@@ -387,7 +387,7 @@ static i40e_status i40e_create_lan_hmc_object(struct i40e_hw *hw,
/* update the pd table entry */ /* update the pd table entry */
ret_code = i40e_add_pd_table_entry(hw, ret_code = i40e_add_pd_table_entry(hw,
info->hmc_info, info->hmc_info,
i); i, NULL);
if (ret_code) { if (ret_code) {
pd_error = true; pd_error = true;
break; break;
......
...@@ -62,6 +62,7 @@ struct i40e_hmc_bp { ...@@ -62,6 +62,7 @@ struct i40e_hmc_bp {
struct i40e_hmc_pd_entry { struct i40e_hmc_pd_entry {
struct i40e_hmc_bp bp; struct i40e_hmc_bp bp;
u32 sd_index; u32 sd_index;
bool rsrc_pg;
bool valid; bool valid;
}; };
...@@ -218,7 +219,8 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw, ...@@ -218,7 +219,8 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw,
i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw, i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw,
struct i40e_hmc_info *hmc_info, struct i40e_hmc_info *hmc_info,
u32 pd_index); u32 pd_index,
struct i40e_dma_mem *rsrc_pg);
i40e_status i40e_remove_pd_bp(struct i40e_hw *hw, i40e_status i40e_remove_pd_bp(struct i40e_hw *hw,
struct i40e_hmc_info *hmc_info, struct i40e_hmc_info *hmc_info,
u32 idx); u32 idx);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册