From 3a6373a550ee9d6be0929120b9b962e523928d59 Mon Sep 17 00:00:00 2001 From: mbao Date: Tue, 25 May 2021 14:49:27 -0700 Subject: [PATCH] msm_mmrm: Added debug support for multiple register calls of same client Added support to allow multiple register of same client so that mmrm test app can be used after device is booted up. This will also allow to test multiple concurrencies as well as throttling feature. Depends-on: 3630372 Change-Id: I19a2838f536d36db0629d9d64c962aba57c92d28 --- driver/src/mmrm_clk_rsrc_mgr.h | 1 + driver/src/mmrm_clk_rsrc_mgr_sw.c | 34 +++++++++++++++++++++++-------- driver/src/mmrm_debug.c | 2 ++ driver/src/mmrm_debug.h | 1 + 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/driver/src/mmrm_clk_rsrc_mgr.h b/driver/src/mmrm_clk_rsrc_mgr.h index 68c19f1a68..556c2bffb8 100644 --- a/driver/src/mmrm_clk_rsrc_mgr.h +++ b/driver/src/mmrm_clk_rsrc_mgr.h @@ -58,6 +58,7 @@ struct mmrm_sw_clk_client_tbl_entry { u64 clk_rate; u32 vdd_level; bool reserve; + u32 ref_count; }; struct mmrm_sw_peak_current_data { diff --git a/driver/src/mmrm_clk_rsrc_mgr_sw.c b/driver/src/mmrm_clk_rsrc_mgr_sw.c index 03fcb83fbd..fc3628c9bf 100644 --- a/driver/src/mmrm_clk_rsrc_mgr_sw.c +++ b/driver/src/mmrm_clk_rsrc_mgr_sw.c @@ -188,6 +188,14 @@ static struct mmrm_client *mmrm_sw_clk_client_register( /* entry already registered */ if (tbl_entry->client) { + if (msm_mmrm_allow_multiple_register) { + tbl_entry->ref_count++; + d_mpr_h("%s: client csid(%d) already registered ref:%d\n", + __func__, tbl_entry->clk_src_id, tbl_entry->ref_count); + clk_client = tbl_entry->client; + goto exit_found; + } + d_mpr_e("%s: client csid(%d) already registered\n", __func__, tbl_entry->clk_src_id); rc = -EINVAL; @@ -205,6 +213,7 @@ static struct mmrm_client *mmrm_sw_clk_client_register( clk_client->client_uid = c; clk_client->client_type = MMRM_CLIENT_CLOCK; + tbl_entry->ref_count = 1; /* copy the entries provided by client */ tbl_entry->client = clk_client; @@ -239,15 +248,20 @@ static struct mmrm_client *mmrm_sw_clk_client_register( goto err_fail_update_entry; } +exit_found: mutex_unlock(&sw_clk_mgr->lock); d_mpr_h("%s: exiting with success\n", __func__); return clk_client; err_fail_update_entry: + kfree(clk_client); + err_fail_alloc_clk_client: -err_already_registered: + memset(tbl_entry, 0x0, sizeof(struct mmrm_sw_clk_client_tbl_entry)); + err_nofree_entry: +err_already_registered: mutex_unlock(&sw_clk_mgr->lock); d_mpr_h("%s: error exit\n", __func__); @@ -280,12 +294,16 @@ static int mmrm_sw_clk_client_deregister(struct mmrm_clk_mgr *sw_clk_mgr, mutex_lock(&sw_clk_mgr->lock); tbl_entry = &sinfo->clk_client_tbl[client->client_uid]; - kfree(tbl_entry->client); - tbl_entry->client = NULL; - tbl_entry->clk = NULL; - tbl_entry->pri = 0x0; - tbl_entry->pvt_data = NULL; - tbl_entry->notifier_cb_fn = NULL; + if (tbl_entry->ref_count > 0) { + tbl_entry->ref_count--; + } + + if (tbl_entry->ref_count == 0) { + + kfree(tbl_entry->client); + + memset(tbl_entry, 0x0, sizeof(struct mmrm_sw_clk_client_tbl_entry)); + } mutex_unlock(&sw_clk_mgr->lock); @@ -319,7 +337,7 @@ static int mmrm_sw_get_req_level( /* voltage corner is below svsl1 */ if (voltage_corner < mmrm_sw_vdd_corner[MMRM_VDD_LEVEL_SVS_L1]) { - d_mpr_w("%s: csid(%d): lower voltage corner(%d)\n", + d_mpr_h("%s: csid(%d): lower voltage corner(%d)\n", __func__, tbl_entry->clk_src_id, voltage_corner); diff --git a/driver/src/mmrm_debug.c b/driver/src/mmrm_debug.c index e9549df0bf..d34c64d8a4 100644 --- a/driver/src/mmrm_debug.c +++ b/driver/src/mmrm_debug.c @@ -8,6 +8,7 @@ #include "mmrm_debug.h" int msm_mmrm_debug = MMRM_ERR | MMRM_WARN | MMRM_PRINTK; +u8 msm_mmrm_allow_multiple_register = 0; #define MAX_DBG_BUF_SIZE 4096 @@ -59,6 +60,7 @@ struct dentry *msm_mmrm_debugfs_init(void) /* add other params here */ debugfs_create_u32("debug_level", 0644, dir, &msm_mmrm_debug); + debugfs_create_u8("allow_multiple_register", 0644, dir, &msm_mmrm_allow_multiple_register); d_mpr_h("%s: exiting\n", __func__); return dir; diff --git a/driver/src/mmrm_debug.h b/driver/src/mmrm_debug.h index a08368d213..64852252b4 100644 --- a/driver/src/mmrm_debug.h +++ b/driver/src/mmrm_debug.h @@ -28,6 +28,7 @@ enum mmrm_msg_prio { }; extern int msm_mmrm_debug; +extern u8 msm_mmrm_allow_multiple_register; #define dprintk(__level, __fmt, ...) \ do { \