Commit 3444682a authored by Chaya Rachel Ivgi's avatar Chaya Rachel Ivgi Committed by Emmanuel Grumbach

iwlwifi: mvm: make thermal throttling values configurable per NIC family

The thermal throttling parameters were constant and hardcoded, not allowing
changes for different NIC families.
Change this so that the values are part of the NIC family configuration and
are not constant (so they can be changed dynamically in the future).
Signed-off-by: default avatarChaya Rachel Ivgi <chaya.rachel.ivgi@intel.com>
Reviewed-by: default avatarLuciano Coelho <luciano.coelho@intel.com>
Reviewed-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent b546dcd6
...@@ -128,6 +128,28 @@ static const struct iwl_base_params iwl7000_base_params = { ...@@ -128,6 +128,28 @@ static const struct iwl_base_params iwl7000_base_params = {
.apmg_wake_up_wa = true, .apmg_wake_up_wa = true,
}; };
static const struct iwl_tt_params iwl7000_high_temp_tt_params = {
.ct_kill_entry = 118,
.ct_kill_exit = 96,
.ct_kill_duration = 5,
.dynamic_smps_entry = 114,
.dynamic_smps_exit = 110,
.tx_protection_entry = 114,
.tx_protection_exit = 108,
.tx_backoff = {
{.temperature = 112, .backoff = 300},
{.temperature = 113, .backoff = 800},
{.temperature = 114, .backoff = 1500},
{.temperature = 115, .backoff = 3000},
{.temperature = 116, .backoff = 5000},
{.temperature = 117, .backoff = 10000},
},
.support_ct_kill = true,
.support_dynamic_smps = true,
.support_tx_protection = true,
.support_tx_backoff = true,
};
static const struct iwl_ht_params iwl7000_ht_params = { static const struct iwl_ht_params iwl7000_ht_params = {
.stbc = true, .stbc = true,
.ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ), .ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ),
...@@ -170,6 +192,7 @@ const struct iwl_cfg iwl7260_2ac_cfg_high_temp = { ...@@ -170,6 +192,7 @@ const struct iwl_cfg iwl7260_2ac_cfg_high_temp = {
.host_interrupt_operation_mode = true, .host_interrupt_operation_mode = true,
.lp_xtal_workaround = true, .lp_xtal_workaround = true,
.dccm_len = IWL7260_DCCM_LEN, .dccm_len = IWL7260_DCCM_LEN,
.thermal_params = &iwl7000_high_temp_tt_params,
}; };
const struct iwl_cfg iwl7260_2n_cfg = { const struct iwl_cfg iwl7260_2n_cfg = {
......
...@@ -194,6 +194,49 @@ struct iwl_ht_params { ...@@ -194,6 +194,49 @@ struct iwl_ht_params {
u8 ht40_bands; u8 ht40_bands;
}; };
/*
* Tx-backoff threshold
* @temperature: The threshold in Celsius
* @backoff: The tx-backoff in uSec
*/
struct iwl_tt_tx_backoff {
s32 temperature;
u32 backoff;
};
#define TT_TX_BACKOFF_SIZE 6
/**
* struct iwl_tt_params - thermal throttling parameters
* @ct_kill_entry: CT Kill entry threshold
* @ct_kill_exit: CT Kill exit threshold
* @ct_kill_duration: The time intervals (in uSec) in which the driver needs
* to checks whether to exit CT Kill.
* @dynamic_smps_entry: Dynamic SMPS entry threshold
* @dynamic_smps_exit: Dynamic SMPS exit threshold
* @tx_protection_entry: TX protection entry threshold
* @tx_protection_exit: TX protection exit threshold
* @tx_backoff: Array of thresholds for tx-backoff , in ascending order.
* @support_ct_kill: Support CT Kill?
* @support_dynamic_smps: Support dynamic SMPS?
* @support_tx_protection: Support tx protection?
* @support_tx_backoff: Support tx-backoff?
*/
struct iwl_tt_params {
s32 ct_kill_entry;
s32 ct_kill_exit;
u32 ct_kill_duration;
s32 dynamic_smps_entry;
s32 dynamic_smps_exit;
s32 tx_protection_entry;
s32 tx_protection_exit;
struct iwl_tt_tx_backoff tx_backoff[TT_TX_BACKOFF_SIZE];
bool support_ct_kill;
bool support_dynamic_smps;
bool support_tx_protection;
bool support_tx_backoff;
};
/* /*
* information on how to parse the EEPROM * information on how to parse the EEPROM
*/ */
...@@ -316,6 +359,7 @@ struct iwl_cfg { ...@@ -316,6 +359,7 @@ struct iwl_cfg {
const u32 dccm2_len; const u32 dccm2_len;
const u32 smem_offset; const u32 smem_offset;
const u32 smem_len; const u32 smem_len;
const struct iwl_tt_params *thermal_params;
}; };
/* /*
......
...@@ -76,6 +76,7 @@ ...@@ -76,6 +76,7 @@
#include "iwl-notif-wait.h" #include "iwl-notif-wait.h"
#include "iwl-eeprom-parse.h" #include "iwl-eeprom-parse.h"
#include "iwl-fw-file.h" #include "iwl-fw-file.h"
#include "iwl-config.h"
#include "sta.h" #include "sta.h"
#include "fw-api.h" #include "fw-api.h"
#include "constants.h" #include "constants.h"
...@@ -477,49 +478,6 @@ struct iwl_nvm_section { ...@@ -477,49 +478,6 @@ struct iwl_nvm_section {
const u8 *data; const u8 *data;
}; };
/*
* Tx-backoff threshold
* @temperature: The threshold in Celsius
* @backoff: The tx-backoff in uSec
*/
struct iwl_tt_tx_backoff {
s32 temperature;
u32 backoff;
};
#define TT_TX_BACKOFF_SIZE 6
/**
* struct iwl_tt_params - thermal throttling parameters
* @ct_kill_entry: CT Kill entry threshold
* @ct_kill_exit: CT Kill exit threshold
* @ct_kill_duration: The time intervals (in uSec) in which the driver needs
* to checks whether to exit CT Kill.
* @dynamic_smps_entry: Dynamic SMPS entry threshold
* @dynamic_smps_exit: Dynamic SMPS exit threshold
* @tx_protection_entry: TX protection entry threshold
* @tx_protection_exit: TX protection exit threshold
* @tx_backoff: Array of thresholds for tx-backoff , in ascending order.
* @support_ct_kill: Support CT Kill?
* @support_dynamic_smps: Support dynamic SMPS?
* @support_tx_protection: Support tx protection?
* @support_tx_backoff: Support tx-backoff?
*/
struct iwl_tt_params {
s32 ct_kill_entry;
s32 ct_kill_exit;
u32 ct_kill_duration;
s32 dynamic_smps_entry;
s32 dynamic_smps_exit;
s32 tx_protection_entry;
s32 tx_protection_exit;
struct iwl_tt_tx_backoff tx_backoff[TT_TX_BACKOFF_SIZE];
bool support_ct_kill;
bool support_dynamic_smps;
bool support_tx_protection;
bool support_tx_backoff;
};
/** /**
* struct iwl_mvm_tt_mgnt - Thermal Throttling Management structure * struct iwl_mvm_tt_mgnt - Thermal Throttling Management structure
* @ct_kill_exit: worker to exit thermal kill * @ct_kill_exit: worker to exit thermal kill
...@@ -534,7 +492,7 @@ struct iwl_mvm_tt_mgmt { ...@@ -534,7 +492,7 @@ struct iwl_mvm_tt_mgmt {
bool dynamic_smps; bool dynamic_smps;
u32 tx_backoff; u32 tx_backoff;
u32 min_backoff; u32 min_backoff;
const struct iwl_tt_params *params; struct iwl_tt_params params;
bool throttle; bool throttle;
}; };
......
...@@ -70,7 +70,7 @@ ...@@ -70,7 +70,7 @@
static void iwl_mvm_enter_ctkill(struct iwl_mvm *mvm) static void iwl_mvm_enter_ctkill(struct iwl_mvm *mvm)
{ {
struct iwl_mvm_tt_mgmt *tt = &mvm->thermal_throttle; struct iwl_mvm_tt_mgmt *tt = &mvm->thermal_throttle;
u32 duration = mvm->thermal_throttle.params->ct_kill_duration; u32 duration = tt->params.ct_kill_duration;
if (test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status)) if (test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status))
return; return;
...@@ -223,7 +223,7 @@ static void check_exit_ctkill(struct work_struct *work) ...@@ -223,7 +223,7 @@ static void check_exit_ctkill(struct work_struct *work)
tt = container_of(work, struct iwl_mvm_tt_mgmt, ct_kill_exit.work); tt = container_of(work, struct iwl_mvm_tt_mgmt, ct_kill_exit.work);
mvm = container_of(tt, struct iwl_mvm, thermal_throttle); mvm = container_of(tt, struct iwl_mvm, thermal_throttle);
duration = tt->params->ct_kill_duration; duration = tt->params.ct_kill_duration;
mutex_lock(&mvm->mutex); mutex_lock(&mvm->mutex);
...@@ -247,7 +247,7 @@ static void check_exit_ctkill(struct work_struct *work) ...@@ -247,7 +247,7 @@ static void check_exit_ctkill(struct work_struct *work)
IWL_DEBUG_TEMP(mvm, "NIC temperature: %d\n", temp); IWL_DEBUG_TEMP(mvm, "NIC temperature: %d\n", temp);
if (temp <= tt->params->ct_kill_exit) { if (temp <= tt->params.ct_kill_exit) {
mutex_unlock(&mvm->mutex); mutex_unlock(&mvm->mutex);
iwl_mvm_exit_ctkill(mvm); iwl_mvm_exit_ctkill(mvm);
return; return;
...@@ -325,7 +325,7 @@ void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff) ...@@ -325,7 +325,7 @@ void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff)
void iwl_mvm_tt_handler(struct iwl_mvm *mvm) void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
{ {
const struct iwl_tt_params *params = mvm->thermal_throttle.params; struct iwl_tt_params *params = &mvm->thermal_throttle.params;
struct iwl_mvm_tt_mgmt *tt = &mvm->thermal_throttle; struct iwl_mvm_tt_mgmt *tt = &mvm->thermal_throttle;
s32 temperature = mvm->temperature; s32 temperature = mvm->temperature;
bool throttle_enable = false; bool throttle_enable = false;
...@@ -340,7 +340,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm) ...@@ -340,7 +340,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
} }
if (params->support_ct_kill && if (params->support_ct_kill &&
temperature <= tt->params->ct_kill_exit) { temperature <= params->ct_kill_exit) {
iwl_mvm_exit_ctkill(mvm); iwl_mvm_exit_ctkill(mvm);
return; return;
} }
...@@ -400,7 +400,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm) ...@@ -400,7 +400,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
} }
} }
static const struct iwl_tt_params iwl7000_tt_params = { static const struct iwl_tt_params iwl_mvm_default_tt_params = {
.ct_kill_entry = 118, .ct_kill_entry = 118,
.ct_kill_exit = 96, .ct_kill_exit = 96,
.ct_kill_duration = 5, .ct_kill_duration = 5,
...@@ -422,38 +422,16 @@ static const struct iwl_tt_params iwl7000_tt_params = { ...@@ -422,38 +422,16 @@ static const struct iwl_tt_params iwl7000_tt_params = {
.support_tx_backoff = true, .support_tx_backoff = true,
}; };
static const struct iwl_tt_params iwl7000_high_temp_tt_params = {
.ct_kill_entry = 118,
.ct_kill_exit = 96,
.ct_kill_duration = 5,
.dynamic_smps_entry = 114,
.dynamic_smps_exit = 110,
.tx_protection_entry = 114,
.tx_protection_exit = 108,
.tx_backoff = {
{.temperature = 112, .backoff = 300},
{.temperature = 113, .backoff = 800},
{.temperature = 114, .backoff = 1500},
{.temperature = 115, .backoff = 3000},
{.temperature = 116, .backoff = 5000},
{.temperature = 117, .backoff = 10000},
},
.support_ct_kill = true,
.support_dynamic_smps = true,
.support_tx_protection = true,
.support_tx_backoff = true,
};
void iwl_mvm_tt_initialize(struct iwl_mvm *mvm, u32 min_backoff) void iwl_mvm_tt_initialize(struct iwl_mvm *mvm, u32 min_backoff)
{ {
struct iwl_mvm_tt_mgmt *tt = &mvm->thermal_throttle; struct iwl_mvm_tt_mgmt *tt = &mvm->thermal_throttle;
IWL_DEBUG_TEMP(mvm, "Initialize Thermal Throttling\n"); IWL_DEBUG_TEMP(mvm, "Initialize Thermal Throttling\n");
if (mvm->cfg->high_temp) if (mvm->cfg->thermal_params)
tt->params = &iwl7000_high_temp_tt_params; tt->params = *mvm->cfg->thermal_params;
else else
tt->params = &iwl7000_tt_params; tt->params = iwl_mvm_default_tt_params;
tt->throttle = false; tt->throttle = false;
tt->dynamic_smps = false; tt->dynamic_smps = false;
......
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