Commit 4fc8c676 authored by Shannon Nelson's avatar Shannon Nelson Committed by Jeff Kirsher

i40e: genericize the partition bandwidth control

Partition bandwidth control is not in just one form of MFP (multi-function
partitioning), so make the code more generic and be sure to nudge the Tx
scheduler for all MFP.

Copyright updated to 2017.
Signed-off-by: default avatarShannon Nelson <shannon.nelson@intel.com>
Signed-off-by: default avatarMitch Williams <mitch.a.williams@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 83d14c59
/******************************************************************************* /*******************************************************************************
* *
* Intel Ethernet Controller XL710 Family Linux Driver * Intel Ethernet Controller XL710 Family Linux Driver
* Copyright(c) 2013 - 2016 Intel Corporation. * Copyright(c) 2013 - 2017 Intel Corporation.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -516,9 +516,8 @@ struct i40e_pf { ...@@ -516,9 +516,8 @@ struct i40e_pf {
bool ptp_tx; bool ptp_tx;
bool ptp_rx; bool ptp_rx;
u16 rss_table_size; /* HW RSS table size */ u16 rss_table_size; /* HW RSS table size */
/* These are only valid in NPAR modes */ u32 max_bw;
u32 npar_max_bw; u32 min_bw;
u32 npar_min_bw;
u32 ioremap_len; u32 ioremap_len;
u32 fd_inv; u32 fd_inv;
...@@ -971,9 +970,9 @@ int i40e_ptp_get_ts_config(struct i40e_pf *pf, struct ifreq *ifr); ...@@ -971,9 +970,9 @@ int i40e_ptp_get_ts_config(struct i40e_pf *pf, struct ifreq *ifr);
void i40e_ptp_init(struct i40e_pf *pf); void i40e_ptp_init(struct i40e_pf *pf);
void i40e_ptp_stop(struct i40e_pf *pf); void i40e_ptp_stop(struct i40e_pf *pf);
int i40e_is_vsi_uplink_mode_veb(struct i40e_vsi *vsi); int i40e_is_vsi_uplink_mode_veb(struct i40e_vsi *vsi);
i40e_status i40e_get_npar_bw_setting(struct i40e_pf *pf); i40e_status i40e_get_partition_bw_setting(struct i40e_pf *pf);
i40e_status i40e_set_npar_bw_setting(struct i40e_pf *pf); i40e_status i40e_set_partition_bw_setting(struct i40e_pf *pf);
i40e_status i40e_commit_npar_bw_setting(struct i40e_pf *pf); i40e_status i40e_commit_partition_bw_setting(struct i40e_pf *pf);
void i40e_print_link_message(struct i40e_vsi *vsi, bool isup); void i40e_print_link_message(struct i40e_vsi *vsi, bool isup);
static inline bool i40e_enabled_xdp_vsi(struct i40e_vsi *vsi) static inline bool i40e_enabled_xdp_vsi(struct i40e_vsi *vsi)
......
/******************************************************************************* /*******************************************************************************
* *
* Intel Ethernet Controller XL710 Family Linux Driver * Intel Ethernet Controller XL710 Family Linux Driver
* Copyright(c) 2013 - 2016 Intel Corporation. * Copyright(c) 2013 - 2017 Intel Corporation.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
...@@ -8740,10 +8740,10 @@ int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count) ...@@ -8740,10 +8740,10 @@ int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count)
} }
/** /**
* i40e_get_npar_bw_setting - Retrieve BW settings for this PF partition * i40e_get_partition_bw_setting - Retrieve BW settings for this PF partition
* @pf: board private structure * @pf: board private structure
**/ **/
i40e_status i40e_get_npar_bw_setting(struct i40e_pf *pf) i40e_status i40e_get_partition_bw_setting(struct i40e_pf *pf)
{ {
i40e_status status; i40e_status status;
bool min_valid, max_valid; bool min_valid, max_valid;
...@@ -8754,27 +8754,27 @@ i40e_status i40e_get_npar_bw_setting(struct i40e_pf *pf) ...@@ -8754,27 +8754,27 @@ i40e_status i40e_get_npar_bw_setting(struct i40e_pf *pf)
if (!status) { if (!status) {
if (min_valid) if (min_valid)
pf->npar_min_bw = min_bw; pf->min_bw = min_bw;
if (max_valid) if (max_valid)
pf->npar_max_bw = max_bw; pf->max_bw = max_bw;
} }
return status; return status;
} }
/** /**
* i40e_set_npar_bw_setting - Set BW settings for this PF partition * i40e_set_partition_bw_setting - Set BW settings for this PF partition
* @pf: board private structure * @pf: board private structure
**/ **/
i40e_status i40e_set_npar_bw_setting(struct i40e_pf *pf) i40e_status i40e_set_partition_bw_setting(struct i40e_pf *pf)
{ {
struct i40e_aqc_configure_partition_bw_data bw_data; struct i40e_aqc_configure_partition_bw_data bw_data;
i40e_status status; i40e_status status;
/* Set the valid bit for this PF */ /* Set the valid bit for this PF */
bw_data.pf_valid_bits = cpu_to_le16(BIT(pf->hw.pf_id)); bw_data.pf_valid_bits = cpu_to_le16(BIT(pf->hw.pf_id));
bw_data.max_bw[pf->hw.pf_id] = pf->npar_max_bw & I40E_ALT_BW_VALUE_MASK; bw_data.max_bw[pf->hw.pf_id] = pf->max_bw & I40E_ALT_BW_VALUE_MASK;
bw_data.min_bw[pf->hw.pf_id] = pf->npar_min_bw & I40E_ALT_BW_VALUE_MASK; bw_data.min_bw[pf->hw.pf_id] = pf->min_bw & I40E_ALT_BW_VALUE_MASK;
/* Set the new bandwidths */ /* Set the new bandwidths */
status = i40e_aq_configure_partition_bw(&pf->hw, &bw_data, NULL); status = i40e_aq_configure_partition_bw(&pf->hw, &bw_data, NULL);
...@@ -8783,10 +8783,10 @@ i40e_status i40e_set_npar_bw_setting(struct i40e_pf *pf) ...@@ -8783,10 +8783,10 @@ i40e_status i40e_set_npar_bw_setting(struct i40e_pf *pf)
} }
/** /**
* i40e_commit_npar_bw_setting - Commit BW settings for this PF partition * i40e_commit_partition_bw_setting - Commit BW settings for this PF partition
* @pf: board private structure * @pf: board private structure
**/ **/
i40e_status i40e_commit_npar_bw_setting(struct i40e_pf *pf) i40e_status i40e_commit_partition_bw_setting(struct i40e_pf *pf)
{ {
/* Commit temporary BW setting to permanent NVM image */ /* Commit temporary BW setting to permanent NVM image */
enum i40e_admin_queue_err last_aq_status; enum i40e_admin_queue_err last_aq_status;
...@@ -8905,16 +8905,19 @@ static int i40e_sw_init(struct i40e_pf *pf) ...@@ -8905,16 +8905,19 @@ static int i40e_sw_init(struct i40e_pf *pf)
if (pf->hw.func_caps.npar_enable || pf->hw.func_caps.flex10_enable) { if (pf->hw.func_caps.npar_enable || pf->hw.func_caps.flex10_enable) {
pf->flags |= I40E_FLAG_MFP_ENABLED; pf->flags |= I40E_FLAG_MFP_ENABLED;
dev_info(&pf->pdev->dev, "MFP mode Enabled\n"); dev_info(&pf->pdev->dev, "MFP mode Enabled\n");
if (i40e_get_npar_bw_setting(pf)) if (i40e_get_partition_bw_setting(pf)) {
dev_warn(&pf->pdev->dev, dev_warn(&pf->pdev->dev,
"Could not get NPAR bw settings\n"); "Could not get partition bw settings\n");
else } else {
dev_info(&pf->pdev->dev, dev_info(&pf->pdev->dev,
"Min BW = %8.8x, Max BW = %8.8x\n", "Partition BW Min = %8.8x, Max = %8.8x\n",
pf->npar_min_bw, pf->npar_max_bw); pf->min_bw, pf->max_bw);
/* nudge the Tx scheduler */
i40e_set_partition_bw_setting(pf);
}
} }
/* FW/NVM is not yet fixed in this regard */
if ((pf->hw.func_caps.fd_filters_guaranteed > 0) || if ((pf->hw.func_caps.fd_filters_guaranteed > 0) ||
(pf->hw.func_caps.fd_filters_best_effort > 0)) { (pf->hw.func_caps.fd_filters_best_effort > 0)) {
pf->flags |= I40E_FLAG_FD_ATR_ENABLED; pf->flags |= I40E_FLAG_FD_ATR_ENABLED;
...@@ -9017,10 +9020,6 @@ static int i40e_sw_init(struct i40e_pf *pf) ...@@ -9017,10 +9020,6 @@ static int i40e_sw_init(struct i40e_pf *pf)
mutex_init(&pf->switch_mutex); mutex_init(&pf->switch_mutex);
/* If NPAR is enabled nudge the Tx scheduler */
if (pf->hw.func_caps.npar_enable && (!i40e_get_npar_bw_setting(pf)))
i40e_set_npar_bw_setting(pf);
sw_init_done: sw_init_done:
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment