Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ixl/i40e_lan_hmc.c
Show First 20 Lines • Show All 138 Lines • ▼ Show 20 Lines | enum i40e_status_code i40e_init_lan_hmc(struct i40e_hw *hw, u32 txq_num, | ||||
size_exp = rd32(hw, I40E_GLHMC_LANTXOBJSZ); | size_exp = rd32(hw, I40E_GLHMC_LANTXOBJSZ); | ||||
obj->size = BIT_ULL(size_exp); | obj->size = BIT_ULL(size_exp); | ||||
/* validate values requested by driver don't exceed HMC capacity */ | /* validate values requested by driver don't exceed HMC capacity */ | ||||
if (txq_num > obj->max_cnt) { | if (txq_num > obj->max_cnt) { | ||||
ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ||||
DEBUGOUT3("i40e_init_lan_hmc: Tx context: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | DEBUGOUT3("i40e_init_lan_hmc: Tx context: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | ||||
txq_num, obj->max_cnt, ret_code); | txq_num, obj->max_cnt, ret_code); | ||||
goto init_lan_hmc_out; | goto free_hmc_out; | ||||
} | } | ||||
/* aggregate values into the full LAN object for later */ | /* aggregate values into the full LAN object for later */ | ||||
full_obj->max_cnt += obj->max_cnt; | full_obj->max_cnt += obj->max_cnt; | ||||
full_obj->cnt += obj->cnt; | full_obj->cnt += obj->cnt; | ||||
/* Rx queue context information */ | /* Rx queue context information */ | ||||
obj = &hw->hmc.hmc_obj[I40E_HMC_LAN_RX]; | obj = &hw->hmc.hmc_obj[I40E_HMC_LAN_RX]; | ||||
obj->max_cnt = rd32(hw, I40E_GLHMC_LANQMAX); | obj->max_cnt = rd32(hw, I40E_GLHMC_LANQMAX); | ||||
obj->cnt = rxq_num; | obj->cnt = rxq_num; | ||||
obj->base = hw->hmc.hmc_obj[I40E_HMC_LAN_TX].base + | obj->base = hw->hmc.hmc_obj[I40E_HMC_LAN_TX].base + | ||||
(hw->hmc.hmc_obj[I40E_HMC_LAN_TX].cnt * | (hw->hmc.hmc_obj[I40E_HMC_LAN_TX].cnt * | ||||
hw->hmc.hmc_obj[I40E_HMC_LAN_TX].size); | hw->hmc.hmc_obj[I40E_HMC_LAN_TX].size); | ||||
obj->base = i40e_align_l2obj_base(obj->base); | obj->base = i40e_align_l2obj_base(obj->base); | ||||
size_exp = rd32(hw, I40E_GLHMC_LANRXOBJSZ); | size_exp = rd32(hw, I40E_GLHMC_LANRXOBJSZ); | ||||
obj->size = BIT_ULL(size_exp); | obj->size = BIT_ULL(size_exp); | ||||
/* validate values requested by driver don't exceed HMC capacity */ | /* validate values requested by driver don't exceed HMC capacity */ | ||||
if (rxq_num > obj->max_cnt) { | if (rxq_num > obj->max_cnt) { | ||||
ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ||||
DEBUGOUT3("i40e_init_lan_hmc: Rx context: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | DEBUGOUT3("i40e_init_lan_hmc: Rx context: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | ||||
rxq_num, obj->max_cnt, ret_code); | rxq_num, obj->max_cnt, ret_code); | ||||
goto init_lan_hmc_out; | goto free_hmc_out; | ||||
} | } | ||||
/* aggregate values into the full LAN object for later */ | /* aggregate values into the full LAN object for later */ | ||||
full_obj->max_cnt += obj->max_cnt; | full_obj->max_cnt += obj->max_cnt; | ||||
full_obj->cnt += obj->cnt; | full_obj->cnt += obj->cnt; | ||||
/* FCoE context information */ | /* FCoE context information */ | ||||
obj = &hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX]; | obj = &hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX]; | ||||
obj->max_cnt = rd32(hw, I40E_GLHMC_FCOEMAX); | obj->max_cnt = rd32(hw, I40E_GLHMC_FCOEMAX); | ||||
obj->cnt = fcoe_cntx_num; | obj->cnt = fcoe_cntx_num; | ||||
obj->base = hw->hmc.hmc_obj[I40E_HMC_LAN_RX].base + | obj->base = hw->hmc.hmc_obj[I40E_HMC_LAN_RX].base + | ||||
(hw->hmc.hmc_obj[I40E_HMC_LAN_RX].cnt * | (hw->hmc.hmc_obj[I40E_HMC_LAN_RX].cnt * | ||||
hw->hmc.hmc_obj[I40E_HMC_LAN_RX].size); | hw->hmc.hmc_obj[I40E_HMC_LAN_RX].size); | ||||
obj->base = i40e_align_l2obj_base(obj->base); | obj->base = i40e_align_l2obj_base(obj->base); | ||||
size_exp = rd32(hw, I40E_GLHMC_FCOEDDPOBJSZ); | size_exp = rd32(hw, I40E_GLHMC_FCOEDDPOBJSZ); | ||||
obj->size = BIT_ULL(size_exp); | obj->size = BIT_ULL(size_exp); | ||||
/* validate values requested by driver don't exceed HMC capacity */ | /* validate values requested by driver don't exceed HMC capacity */ | ||||
if (fcoe_cntx_num > obj->max_cnt) { | if (fcoe_cntx_num > obj->max_cnt) { | ||||
ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ||||
DEBUGOUT3("i40e_init_lan_hmc: FCoE context: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | DEBUGOUT3("i40e_init_lan_hmc: FCoE context: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | ||||
fcoe_cntx_num, obj->max_cnt, ret_code); | fcoe_cntx_num, obj->max_cnt, ret_code); | ||||
goto init_lan_hmc_out; | goto free_hmc_out; | ||||
} | } | ||||
/* aggregate values into the full LAN object for later */ | /* aggregate values into the full LAN object for later */ | ||||
full_obj->max_cnt += obj->max_cnt; | full_obj->max_cnt += obj->max_cnt; | ||||
full_obj->cnt += obj->cnt; | full_obj->cnt += obj->cnt; | ||||
/* FCoE filter information */ | /* FCoE filter information */ | ||||
obj = &hw->hmc.hmc_obj[I40E_HMC_FCOE_FILT]; | obj = &hw->hmc.hmc_obj[I40E_HMC_FCOE_FILT]; | ||||
obj->max_cnt = rd32(hw, I40E_GLHMC_FCOEFMAX); | obj->max_cnt = rd32(hw, I40E_GLHMC_FCOEFMAX); | ||||
obj->cnt = fcoe_filt_num; | obj->cnt = fcoe_filt_num; | ||||
obj->base = hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].base + | obj->base = hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].base + | ||||
(hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].cnt * | (hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].cnt * | ||||
hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].size); | hw->hmc.hmc_obj[I40E_HMC_FCOE_CTX].size); | ||||
obj->base = i40e_align_l2obj_base(obj->base); | obj->base = i40e_align_l2obj_base(obj->base); | ||||
size_exp = rd32(hw, I40E_GLHMC_FCOEFOBJSZ); | size_exp = rd32(hw, I40E_GLHMC_FCOEFOBJSZ); | ||||
obj->size = BIT_ULL(size_exp); | obj->size = BIT_ULL(size_exp); | ||||
/* validate values requested by driver don't exceed HMC capacity */ | /* validate values requested by driver don't exceed HMC capacity */ | ||||
if (fcoe_filt_num > obj->max_cnt) { | if (fcoe_filt_num > obj->max_cnt) { | ||||
ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ret_code = I40E_ERR_INVALID_HMC_OBJ_COUNT; | ||||
DEBUGOUT3("i40e_init_lan_hmc: FCoE filter: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | DEBUGOUT3("i40e_init_lan_hmc: FCoE filter: asks for 0x%x but max allowed is 0x%x, returns error %d\n", | ||||
fcoe_filt_num, obj->max_cnt, ret_code); | fcoe_filt_num, obj->max_cnt, ret_code); | ||||
goto init_lan_hmc_out; | goto free_hmc_out; | ||||
} | } | ||||
/* aggregate values into the full LAN object for later */ | /* aggregate values into the full LAN object for later */ | ||||
full_obj->max_cnt += obj->max_cnt; | full_obj->max_cnt += obj->max_cnt; | ||||
full_obj->cnt += obj->cnt; | full_obj->cnt += obj->cnt; | ||||
hw->hmc.first_sd_index = 0; | hw->hmc.first_sd_index = 0; | ||||
hw->hmc.sd_table.ref_cnt = 0; | hw->hmc.sd_table.ref_cnt = 0; | ||||
l2fpm_size = i40e_calculate_l2fpm_size(txq_num, rxq_num, fcoe_cntx_num, | l2fpm_size = i40e_calculate_l2fpm_size(txq_num, rxq_num, fcoe_cntx_num, | ||||
fcoe_filt_num); | fcoe_filt_num); | ||||
if (NULL == hw->hmc.sd_table.sd_entry) { | if (NULL == hw->hmc.sd_table.sd_entry) { | ||||
hw->hmc.sd_table.sd_cnt = (u32) | hw->hmc.sd_table.sd_cnt = (u32) | ||||
(l2fpm_size + I40E_HMC_DIRECT_BP_SIZE - 1) / | (l2fpm_size + I40E_HMC_DIRECT_BP_SIZE - 1) / | ||||
I40E_HMC_DIRECT_BP_SIZE; | I40E_HMC_DIRECT_BP_SIZE; | ||||
/* allocate the sd_entry members in the sd_table */ | /* allocate the sd_entry members in the sd_table */ | ||||
ret_code = i40e_allocate_virt_mem(hw, &hw->hmc.sd_table.addr, | ret_code = i40e_allocate_virt_mem(hw, &hw->hmc.sd_table.addr, | ||||
(sizeof(struct i40e_hmc_sd_entry) * | (sizeof(struct i40e_hmc_sd_entry) * | ||||
hw->hmc.sd_table.sd_cnt)); | hw->hmc.sd_table.sd_cnt)); | ||||
if (ret_code) | if (ret_code) | ||||
goto init_lan_hmc_out; | goto free_hmc_out; | ||||
hw->hmc.sd_table.sd_entry = | hw->hmc.sd_table.sd_entry = | ||||
(struct i40e_hmc_sd_entry *)hw->hmc.sd_table.addr.va; | (struct i40e_hmc_sd_entry *)hw->hmc.sd_table.addr.va; | ||||
} | } | ||||
/* store in the LAN full object for later */ | /* store in the LAN full object for later */ | ||||
full_obj->size = l2fpm_size; | full_obj->size = l2fpm_size; | ||||
init_lan_hmc_out: | init_lan_hmc_out: | ||||
return ret_code; | |||||
free_hmc_out: | |||||
if (hw->hmc.hmc_obj_virt_mem.va) | |||||
i40e_free_virt_mem(hw, &hw->hmc.hmc_obj_virt_mem); | |||||
return ret_code; | return ret_code; | ||||
} | } | ||||
/** | /** | ||||
* i40e_remove_pd_page - Remove a page from the page descriptor table | * i40e_remove_pd_page - Remove a page from the page descriptor table | ||||
* @hw: pointer to the HW structure | * @hw: pointer to the HW structure | ||||
* @hmc_info: pointer to the HMC configuration information structure | * @hmc_info: pointer to the HMC configuration information structure | ||||
* @idx: segment descriptor index to find the relevant page descriptor | * @idx: segment descriptor index to find the relevant page descriptor | ||||
▲ Show 20 Lines • Show All 1,155 Lines • Show Last 20 Lines |