aboutsummaryrefslogtreecommitdiff
path: root/drivers/platform
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa.c9
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_i.h2
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_pm.c17
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_utils.c29
4 files changed, 42 insertions, 15 deletions
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c
index 2c684f647c8d..7ee304336e91 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c
@@ -7262,6 +7262,13 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
result = -ENOMEM;
goto fail_hdr_offset_cache;
}
+ ipa3_ctx->fnr_stats_cache = kmem_cache_create("IPA_FNR_STATS",
+ sizeof(struct ipa_ioc_flt_rt_counter_alloc), 0, 0, NULL);
+ if (!ipa3_ctx->fnr_stats_cache) {
+ IPAERR(":ipa fnr stats cache create failed\n");
+ result = -ENOMEM;
+ goto fail_fnr_stats_cache;
+ }
ipa3_ctx->hdr_proc_ctx_cache = kmem_cache_create("IPA_HDR_PROC_CTX",
sizeof(struct ipa3_hdr_proc_ctx_entry), 0, 0, NULL);
if (!ipa3_ctx->hdr_proc_ctx_cache) {
@@ -7519,6 +7526,8 @@ fail_rt_tbl_cache:
fail_hdr_proc_ctx_offset_cache:
kmem_cache_destroy(ipa3_ctx->hdr_proc_ctx_cache);
fail_hdr_proc_ctx_cache:
+ kmem_cache_destroy(ipa3_ctx->fnr_stats_cache);
+fail_fnr_stats_cache:
kmem_cache_destroy(ipa3_ctx->hdr_offset_cache);
fail_hdr_offset_cache:
kmem_cache_destroy(ipa3_ctx->hdr_cache);
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
index 7d3a95120462..bff5a7ffc3fe 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
@@ -1775,6 +1775,7 @@ struct ipa3_app_clock_vote {
* @rt_rule_cache: routing rule cache
* @hdr_cache: header cache
* @hdr_offset_cache: header offset cache
+ * @fnr_stats_cache: FnR stats cache
* @hdr_proc_ctx_cache: processing context cache
* @hdr_proc_ctx_offset_cache: processing context offset cache
* @rt_tbl_cache: routing table cache
@@ -1870,6 +1871,7 @@ struct ipa3_context {
struct kmem_cache *rt_rule_cache;
struct kmem_cache *hdr_cache;
struct kmem_cache *hdr_offset_cache;
+ struct kmem_cache *fnr_stats_cache;
struct kmem_cache *hdr_proc_ctx_cache;
struct kmem_cache *hdr_proc_ctx_offset_cache;
struct kmem_cache *rt_tbl_cache;
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c
index 350199cc60b1..f5c7e0662bb3 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1254,14 +1254,15 @@ int ipa_pm_set_throughput(u32 hdl, int throughput)
return -EINVAL;
}
+ mutex_lock(&ipa_pm_ctx->client_mutex);
if (hdl >= IPA_PM_MAX_CLIENTS || ipa_pm_ctx->clients[hdl] == NULL
|| throughput < 0) {
IPA_PM_ERR("Invalid Params\n");
+ mutex_unlock(&ipa_pm_ctx->client_mutex);
return -EINVAL;
}
client = ipa_pm_ctx->clients[hdl];
- mutex_lock(&ipa_pm_ctx->client_mutex);
if (client->group == IPA_PM_GROUP_DEFAULT)
IPA_PM_DBG_LOW("Old throughput: %d\n", client->throughput);
else
@@ -1280,14 +1281,16 @@ int ipa_pm_set_throughput(u32 hdl, int throughput)
client->group, ipa_pm_ctx->group_tput[client->group]);
mutex_unlock(&ipa_pm_ctx->client_mutex);
- spin_lock_irqsave(&client->state_lock, flags);
- if (IPA_PM_STATE_ACTIVE(client->state) || (client->group !=
+ if (ipa_pm_ctx->clients[hdl]) {
+ spin_lock_irqsave(&client->state_lock, flags);
+ if (IPA_PM_STATE_ACTIVE(client->state) || (client->group !=
IPA_PM_GROUP_DEFAULT)) {
+ spin_unlock_irqrestore(&client->state_lock, flags);
+ do_clk_scaling();
+ return 0;
+ }
spin_unlock_irqrestore(&client->state_lock, flags);
- do_clk_scaling();
- return 0;
}
- spin_unlock_irqrestore(&client->state_lock, flags);
return 0;
}
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
index 653e1e694107..f404218fee76 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
@@ -6363,13 +6363,21 @@ static int __ipa3_alloc_counter_hdl
return id;
}
-int ipa3_alloc_counter_id(struct ipa_ioc_flt_rt_counter_alloc *counter)
+int ipa3_alloc_counter_id(struct ipa_ioc_flt_rt_counter_alloc *header)
{
int i, unused_cnt, unused_max, unused_start_id;
+ struct ipa_ioc_flt_rt_counter_alloc *counter;
idr_preload(GFP_KERNEL);
spin_lock(&ipa3_ctx->flt_rt_counters.hdl_lock);
+ counter = kmem_cache_zalloc(ipa3_ctx->fnr_stats_cache, GFP_KERNEL);
+ if (!counter) {
+ IPAERR_RL("failed to alloc fnr stats counter object\n");
+ spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
+ return -ENOMEM;
+ }
+ memcpy(counter, header, sizeof(struct ipa_ioc_flt_rt_counter_alloc));
/* allocate hw counters */
counter->hw_counter.start_id = 0;
counter->hw_counter.end_id = 0;
@@ -6469,7 +6477,7 @@ mark_hw_cnt:
unused_start_id = counter->hw_counter.start_id;
if (unused_start_id < 1 ||
unused_start_id > IPA_FLT_RT_HW_COUNTER) {
- IPAERR("unexpected hw_counter start id %d\n",
+ IPAERR_RL("unexpected hw_counter start id %d\n",
unused_start_id);
goto err;
}
@@ -6484,7 +6492,7 @@ mark_sw_cnt:
- IPA_FLT_RT_HW_COUNTER;
if (unused_start_id < 1 ||
unused_start_id > IPA_FLT_RT_SW_COUNTER) {
- IPAERR("unexpected sw_counter start id %d\n",
+ IPAERR_RL("unexpected sw_counter start id %d\n",
unused_start_id);
goto err;
}
@@ -6494,12 +6502,14 @@ mark_sw_cnt:
done:
/* get a handle from idr for dealloc */
counter->hdl = __ipa3_alloc_counter_hdl(counter);
+ memcpy(header, counter, sizeof(struct ipa_ioc_flt_rt_counter_alloc));
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
idr_preload_end();
return 0;
err:
counter->hdl = -1;
+ kmem_cache_free(ipa3_ctx->fnr_stats_cache, counter);
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
idr_preload_end();
return -ENOMEM;
@@ -6513,7 +6523,7 @@ void ipa3_counter_remove_hdl(int hdl)
spin_lock(&ipa3_ctx->flt_rt_counters.hdl_lock);
counter = idr_find(&ipa3_ctx->flt_rt_counters.hdl, hdl);
if (counter == NULL) {
- IPAERR("unexpected hdl %d\n", hdl);
+ IPAERR_RL("unexpected hdl %d\n", hdl);
goto err;
}
/* remove counters belong to this hdl, set used back to 0 */
@@ -6523,7 +6533,7 @@ void ipa3_counter_remove_hdl(int hdl)
memset(&ipa3_ctx->flt_rt_counters.used_hw + offset,
0, counter->hw_counter.num_counters * sizeof(bool));
} else {
- IPAERR("unexpected hdl %d\n", hdl);
+ IPAERR_RL("unexpected hdl %d\n", hdl);
goto err;
}
offset = counter->sw_counter.start_id - 1 - IPA_FLT_RT_HW_COUNTER;
@@ -6532,11 +6542,12 @@ void ipa3_counter_remove_hdl(int hdl)
memset(&ipa3_ctx->flt_rt_counters.used_sw + offset,
0, counter->sw_counter.num_counters * sizeof(bool));
} else {
- IPAERR("unexpected hdl %d\n", hdl);
+ IPAERR_RL("unexpected hdl %d\n", hdl);
goto err;
}
/* remove the handle */
idr_remove(&ipa3_ctx->flt_rt_counters.hdl, hdl);
+ kmem_cache_free(ipa3_ctx->fnr_stats_cache, counter);
err:
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
}
@@ -6553,8 +6564,10 @@ void ipa3_counter_id_remove_all(void)
memset(&ipa3_ctx->flt_rt_counters.used_sw, 0,
sizeof(ipa3_ctx->flt_rt_counters.used_sw));
/* remove all handles */
- idr_for_each_entry(&ipa3_ctx->flt_rt_counters.hdl, counter, hdl)
+ idr_for_each_entry(&ipa3_ctx->flt_rt_counters.hdl, counter, hdl) {
idr_remove(&ipa3_ctx->flt_rt_counters.hdl, hdl);
+ kmem_cache_free(ipa3_ctx->fnr_stats_cache, counter);
+ }
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
}
@@ -7079,7 +7092,7 @@ u32 ipa3_get_num_pipes(void)
/**
* ipa3_disable_apps_wan_cons_deaggr()-
- * set ipa_ctx->ipa_client_apps_wan_cons_agg_gro
+ * set ipa3_ctx->ipa_client_apps_wan_cons_agg_gro
*
* Return value: 0 or negative in case of failure
*/