mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-12 15:49:17 -04:00
Merge "cnss2: Add runtime PM stats support"
This commit is contained in:
commit
d7739ad6c4
3 changed files with 111 additions and 22 deletions
|
|
@ -509,13 +509,14 @@ static ssize_t cnss_runtime_pm_debug_write(struct file *fp,
|
|||
} else if (sysfs_streq(cmd, "resume")) {
|
||||
ret = cnss_pci_pm_runtime_resume(pci_priv);
|
||||
} else if (sysfs_streq(cmd, "get")) {
|
||||
ret = cnss_pci_pm_runtime_get(pci_priv);
|
||||
ret = cnss_pci_pm_runtime_get(pci_priv, RTPM_ID_CNSS);
|
||||
} else if (sysfs_streq(cmd, "get_noresume")) {
|
||||
cnss_pci_pm_runtime_get_noresume(pci_priv);
|
||||
cnss_pci_pm_runtime_get_noresume(pci_priv, RTPM_ID_CNSS);
|
||||
} else if (sysfs_streq(cmd, "put_autosuspend")) {
|
||||
ret = cnss_pci_pm_runtime_put_autosuspend(pci_priv);
|
||||
ret = cnss_pci_pm_runtime_put_autosuspend(pci_priv,
|
||||
RTPM_ID_CNSS);
|
||||
} else if (sysfs_streq(cmd, "put_noidle")) {
|
||||
cnss_pci_pm_runtime_put_noidle(pci_priv);
|
||||
cnss_pci_pm_runtime_put_noidle(pci_priv, RTPM_ID_CNSS);
|
||||
} else if (sysfs_streq(cmd, "mark_last_busy")) {
|
||||
cnss_pci_pm_runtime_mark_last_busy(pci_priv);
|
||||
} else if (sysfs_streq(cmd, "resume_bus")) {
|
||||
|
|
@ -535,6 +536,17 @@ static ssize_t cnss_runtime_pm_debug_write(struct file *fp,
|
|||
|
||||
static int cnss_runtime_pm_debug_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct cnss_plat_data *plat_priv = s->private;
|
||||
struct cnss_pci_data *pci_priv;
|
||||
int i;
|
||||
|
||||
if (!plat_priv)
|
||||
return -ENODEV;
|
||||
|
||||
pci_priv = plat_priv->bus_priv;
|
||||
if (!pci_priv)
|
||||
return -ENODEV;
|
||||
|
||||
seq_puts(s, "\nUsage: echo <action> > <debugfs_path>/cnss/runtime_pm\n");
|
||||
seq_puts(s, "<action> can be one of below:\n");
|
||||
seq_puts(s, "usage_count: get runtime PM usage count\n");
|
||||
|
|
@ -548,6 +560,25 @@ static int cnss_runtime_pm_debug_show(struct seq_file *s, void *data)
|
|||
seq_puts(s, "resume_bus: do bus resume only\n");
|
||||
seq_puts(s, "suspend_bus: do bus suspend only\n");
|
||||
|
||||
seq_puts(s, "\nStats:\n");
|
||||
seq_printf(s, "%s: %u\n", "get count",
|
||||
atomic_read(&pci_priv->pm_stats.runtime_get));
|
||||
seq_printf(s, "%s: %u\n", "put count",
|
||||
atomic_read(&pci_priv->pm_stats.runtime_put));
|
||||
seq_printf(s, "%-10s%-10s%-10s%-15s%-15s\n",
|
||||
"id:", "get", "put", "get time(us)", "put time(us)");
|
||||
for (i = 0; i < RTPM_ID_MAX; i++) {
|
||||
seq_printf(s, "%d%-9s", i, ":");
|
||||
seq_printf(s, "%-10d",
|
||||
atomic_read(&pci_priv->pm_stats.runtime_get_id[i]));
|
||||
seq_printf(s, "%-10d",
|
||||
atomic_read(&pci_priv->pm_stats.runtime_put_id[i]));
|
||||
seq_printf(s, "%-15llu",
|
||||
pci_priv->pm_stats.runtime_get_timestamp_id[i]);
|
||||
seq_printf(s, "%-15llu\n",
|
||||
pci_priv->pm_stats.runtime_put_timestamp_id[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -575,7 +575,7 @@ int cnss_pci_debug_reg_read(struct cnss_pci_data *pci_priv, u32 offset,
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = cnss_pci_pm_runtime_get_sync(pci_priv);
|
||||
ret = cnss_pci_pm_runtime_get_sync(pci_priv, RTPM_ID_CNSS);
|
||||
if (ret < 0)
|
||||
goto runtime_pm_put;
|
||||
|
||||
|
|
@ -595,7 +595,7 @@ force_wake_put:
|
|||
cnss_pci_force_wake_put(pci_priv);
|
||||
runtime_pm_put:
|
||||
cnss_pci_pm_runtime_mark_last_busy(pci_priv);
|
||||
cnss_pci_pm_runtime_put_autosuspend(pci_priv);
|
||||
cnss_pci_pm_runtime_put_autosuspend(pci_priv, RTPM_ID_CNSS);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -610,7 +610,7 @@ int cnss_pci_debug_reg_write(struct cnss_pci_data *pci_priv, u32 offset,
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = cnss_pci_pm_runtime_get_sync(pci_priv);
|
||||
ret = cnss_pci_pm_runtime_get_sync(pci_priv, RTPM_ID_CNSS);
|
||||
if (ret < 0)
|
||||
goto runtime_pm_put;
|
||||
|
||||
|
|
@ -630,7 +630,7 @@ force_wake_put:
|
|||
cnss_pci_force_wake_put(pci_priv);
|
||||
runtime_pm_put:
|
||||
cnss_pci_pm_runtime_mark_last_busy(pci_priv);
|
||||
cnss_pci_pm_runtime_put_autosuspend(pci_priv);
|
||||
cnss_pci_pm_runtime_put_autosuspend(pci_priv, RTPM_ID_CNSS);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1553,7 +1553,7 @@ static void cnss_pci_time_sync_work_hdlr(struct work_struct *work)
|
|||
if (cnss_pci_is_device_down(&pci_priv->pci_dev->dev))
|
||||
return;
|
||||
|
||||
if (cnss_pci_pm_runtime_get_sync(pci_priv) < 0)
|
||||
if (cnss_pci_pm_runtime_get_sync(pci_priv, RTPM_ID_CNSS) < 0)
|
||||
goto runtime_pm_put;
|
||||
|
||||
cnss_pci_update_timestamp(pci_priv);
|
||||
|
|
@ -1562,7 +1562,7 @@ static void cnss_pci_time_sync_work_hdlr(struct work_struct *work)
|
|||
|
||||
runtime_pm_put:
|
||||
cnss_pci_pm_runtime_mark_last_busy(pci_priv);
|
||||
cnss_pci_pm_runtime_put_autosuspend(pci_priv);
|
||||
cnss_pci_pm_runtime_put_autosuspend(pci_priv, RTPM_ID_CNSS);
|
||||
}
|
||||
|
||||
static int cnss_pci_start_time_sync_update(struct cnss_pci_data *pci_priv)
|
||||
|
|
@ -2877,6 +2877,30 @@ int cnss_wlan_pm_control(struct device *dev, bool vote)
|
|||
}
|
||||
EXPORT_SYMBOL(cnss_wlan_pm_control);
|
||||
|
||||
static void cnss_pci_pm_runtime_get_record(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id)
|
||||
{
|
||||
if (id >= RTPM_ID_MAX)
|
||||
return;
|
||||
|
||||
atomic_inc(&pci_priv->pm_stats.runtime_get);
|
||||
atomic_inc(&pci_priv->pm_stats.runtime_get_id[id]);
|
||||
pci_priv->pm_stats.runtime_get_timestamp_id[id] =
|
||||
cnss_get_host_timestamp(pci_priv->plat_priv);
|
||||
}
|
||||
|
||||
static void cnss_pci_pm_runtime_put_record(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id)
|
||||
{
|
||||
if (id >= RTPM_ID_MAX)
|
||||
return;
|
||||
|
||||
atomic_inc(&pci_priv->pm_stats.runtime_put);
|
||||
atomic_inc(&pci_priv->pm_stats.runtime_put_id[id]);
|
||||
pci_priv->pm_stats.runtime_put_timestamp_id[id] =
|
||||
cnss_get_host_timestamp(pci_priv->plat_priv);
|
||||
}
|
||||
|
||||
void cnss_pci_pm_runtime_show_usage_count(struct cnss_pci_data *pci_priv)
|
||||
{
|
||||
struct device *dev;
|
||||
|
|
@ -2926,7 +2950,8 @@ int cnss_pci_pm_runtime_resume(struct cnss_pci_data *pci_priv)
|
|||
return pm_runtime_resume(dev);
|
||||
}
|
||||
|
||||
int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv)
|
||||
int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id)
|
||||
{
|
||||
struct device *dev;
|
||||
enum rpm_status status;
|
||||
|
|
@ -2941,10 +2966,13 @@ int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv)
|
|||
cnss_pr_vdbg("Runtime PM resume is requested by %ps\n",
|
||||
(void *)_RET_IP_);
|
||||
|
||||
cnss_pci_pm_runtime_get_record(pci_priv, id);
|
||||
|
||||
return pm_runtime_get(dev);
|
||||
}
|
||||
|
||||
int cnss_pci_pm_runtime_get_sync(struct cnss_pci_data *pci_priv)
|
||||
int cnss_pci_pm_runtime_get_sync(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id)
|
||||
{
|
||||
struct device *dev;
|
||||
enum rpm_status status;
|
||||
|
|
@ -2959,18 +2987,23 @@ int cnss_pci_pm_runtime_get_sync(struct cnss_pci_data *pci_priv)
|
|||
cnss_pr_vdbg("Runtime PM resume is requested by %ps\n",
|
||||
(void *)_RET_IP_);
|
||||
|
||||
cnss_pci_pm_runtime_get_record(pci_priv, id);
|
||||
|
||||
return pm_runtime_get_sync(dev);
|
||||
}
|
||||
|
||||
void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv)
|
||||
void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id)
|
||||
{
|
||||
if (!pci_priv)
|
||||
return;
|
||||
|
||||
cnss_pci_pm_runtime_get_record(pci_priv, id);
|
||||
pm_runtime_get_noresume(&pci_priv->pci_dev->dev);
|
||||
}
|
||||
|
||||
int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv)
|
||||
int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
|
|
@ -2984,10 +3017,13 @@ int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
cnss_pci_pm_runtime_put_record(pci_priv, id);
|
||||
|
||||
return pm_runtime_put_autosuspend(&pci_priv->pci_dev->dev);
|
||||
}
|
||||
|
||||
void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv)
|
||||
void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
|
|
@ -3001,6 +3037,7 @@ void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv)
|
|||
return;
|
||||
}
|
||||
|
||||
cnss_pci_pm_runtime_put_record(pci_priv, id);
|
||||
pm_runtime_put_noidle(&pci_priv->pci_dev->dev);
|
||||
}
|
||||
|
||||
|
|
@ -4342,7 +4379,7 @@ static int cnss_mhi_pm_runtime_get(struct mhi_controller *mhi_ctrl, void *priv)
|
|||
{
|
||||
struct cnss_pci_data *pci_priv = priv;
|
||||
|
||||
return cnss_pci_pm_runtime_get(pci_priv);
|
||||
return cnss_pci_pm_runtime_get(pci_priv, RTPM_ID_MHI);
|
||||
}
|
||||
|
||||
static void cnss_mhi_pm_runtime_put_noidle(struct mhi_controller *mhi_ctrl,
|
||||
|
|
@ -4350,7 +4387,7 @@ static void cnss_mhi_pm_runtime_put_noidle(struct mhi_controller *mhi_ctrl,
|
|||
{
|
||||
struct cnss_pci_data *pci_priv = priv;
|
||||
|
||||
cnss_pci_pm_runtime_put_noidle(pci_priv);
|
||||
cnss_pci_pm_runtime_put_noidle(pci_priv, RTPM_ID_MHI);
|
||||
}
|
||||
|
||||
void cnss_pci_add_fw_prefix_name(struct cnss_pci_data *pci_priv,
|
||||
|
|
|
|||
|
|
@ -31,6 +31,12 @@ enum pci_link_status {
|
|||
PCI_DEF,
|
||||
};
|
||||
|
||||
enum cnss_rtpm_id {
|
||||
RTPM_ID_CNSS,
|
||||
RTPM_ID_MHI,
|
||||
RTPM_ID_MAX,
|
||||
};
|
||||
|
||||
struct cnss_msi_user {
|
||||
char *name;
|
||||
int num_vectors;
|
||||
|
|
@ -59,6 +65,15 @@ struct cnss_misc_reg {
|
|||
u32 val;
|
||||
};
|
||||
|
||||
struct cnss_pm_stats {
|
||||
atomic_t runtime_get;
|
||||
atomic_t runtime_put;
|
||||
atomic_t runtime_get_id[RTPM_ID_MAX];
|
||||
atomic_t runtime_put_id[RTPM_ID_MAX];
|
||||
u64 runtime_get_timestamp_id[RTPM_ID_MAX];
|
||||
u64 runtime_put_timestamp_id[RTPM_ID_MAX];
|
||||
};
|
||||
|
||||
struct cnss_pci_data {
|
||||
struct pci_dev *pci_dev;
|
||||
struct cnss_plat_data *plat_priv;
|
||||
|
|
@ -71,6 +86,7 @@ struct cnss_pci_data {
|
|||
struct pci_saved_state *saved_state;
|
||||
struct pci_saved_state *default_state;
|
||||
struct msm_pcie_register_event msm_pci_event;
|
||||
struct cnss_pm_stats pm_stats;
|
||||
atomic_t auto_suspended;
|
||||
atomic_t drv_connected;
|
||||
u8 drv_connected_last;
|
||||
|
|
@ -198,11 +214,16 @@ int cnss_pci_call_driver_modem_status(struct cnss_pci_data *pci_priv,
|
|||
void cnss_pci_pm_runtime_show_usage_count(struct cnss_pci_data *pci_priv);
|
||||
int cnss_pci_pm_request_resume(struct cnss_pci_data *pci_priv);
|
||||
int cnss_pci_pm_runtime_resume(struct cnss_pci_data *pci_priv);
|
||||
int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv);
|
||||
int cnss_pci_pm_runtime_get_sync(struct cnss_pci_data *pci_priv);
|
||||
void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv);
|
||||
int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv);
|
||||
void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv);
|
||||
int cnss_pci_pm_runtime_get(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id);
|
||||
int cnss_pci_pm_runtime_get_sync(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id);
|
||||
void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id);
|
||||
int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id);
|
||||
void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_rtpm_id id);
|
||||
void cnss_pci_pm_runtime_mark_last_busy(struct cnss_pci_data *pci_priv);
|
||||
int cnss_pci_update_status(struct cnss_pci_data *pci_priv,
|
||||
enum cnss_driver_status status);
|
||||
|
|
|
|||
Loading…
Reference in a new issue