diff options
author | Sebastian Dang <sebastiandang@codeaurora.org> | 2020-11-04 14:32:30 -0800 |
---|---|---|
committer | Sebastian Dang <sebastiandang@codeaurora.org> | 2020-11-13 13:13:19 -0800 |
commit | b0855d507d7fd390b7b625271a8c5433409734f7 (patch) | |
tree | 7d363374c6b09d274990f579fb5b240567a05c18 | |
parent | d46ec8fb1a2e4634bdb8fd90f3c3d74bd6d13abd (diff) | |
download | mmrm-b0855d507d7fd390b7b625271a8c5433409734f7.tar.gz |
mmrm: Implement debugfs and logging levels
Use debug_level file in debugfs to set
logging level.
Change-Id: I1e378437039ceb59c44ff51f4eb6240804aa5f53
-rw-r--r-- | driver/src/mmrm_clk_rsrc_mgr_sw.c | 64 | ||||
-rw-r--r-- | driver/src/mmrm_debug.c | 87 | ||||
-rw-r--r-- | driver/src/mmrm_debug.h | 53 | ||||
-rw-r--r-- | driver/src/mmrm_internal.h | 3 | ||||
-rw-r--r-- | driver/src/msm_mmrm.c | 17 |
5 files changed, 187 insertions, 37 deletions
diff --git a/driver/src/mmrm_clk_rsrc_mgr_sw.c b/driver/src/mmrm_clk_rsrc_mgr_sw.c index 3519f37..a453c5f 100644 --- a/driver/src/mmrm_clk_rsrc_mgr_sw.c +++ b/driver/src/mmrm_clk_rsrc_mgr_sw.c @@ -29,6 +29,8 @@ static struct mmrm_client *mmrm_sw_clk_client_register( u32 c = 0; u32 clk_client_src_id = 0; + d_mpr_h("%s: entering\n", __func__); + mutex_lock(&sw_clk_mgr->lock); /* check if entry is free in table */ @@ -85,7 +87,7 @@ static struct mmrm_client *mmrm_sw_clk_client_register( tbl_entry->notifier_cb_fn = not_fn_cb; /* print table entry */ - d_mpr_e("%s: csid(%d) name(%s) pri(%d) pvt(%p) notifier(%p)\n", + d_mpr_h("%s: csid(%d) name(%s) pri(%d) pvt(%p) notifier(%p)\n", __func__, tbl_entry->clk_src_id, tbl_entry->name, @@ -94,7 +96,7 @@ static struct mmrm_client *mmrm_sw_clk_client_register( tbl_entry->notifier_cb_fn); /* print power entries for the clk src */ - d_mpr_e("%s: csid(%d) l0_cur(%d) l0_cur(%d) l0_cur(%d)\n", + d_mpr_h("%s: csid(%d) l1_cur_ma(%d) l2_cur_ma(%d) l3_cur_ma(%d)\n", __func__, tbl_entry->clk_src_id, tbl_entry->current_ma[MMRM_VDD_LEVEL_SVS_L1], @@ -103,12 +105,15 @@ static struct mmrm_client *mmrm_sw_clk_client_register( mutex_unlock(&sw_clk_mgr->lock); + d_mpr_h("%s: exiting with success\n", __func__); return clk_client; err_fail_alloc_clk_client: err_already_registered: err_nofree_entry: mutex_unlock(&sw_clk_mgr->lock); + + d_mpr_h("%s: error exit\n", __func__); return NULL; } @@ -119,7 +124,7 @@ static int mmrm_sw_clk_client_deregister(struct mmrm_clk_mgr *sw_clk_mgr, struct mmrm_sw_clk_client_tbl_entry *tbl_entry; struct mmrm_sw_clk_mgr_info *sinfo = &(sw_clk_mgr->data.sw_info); - d_mpr_e("%s: entering\n", __func__); + d_mpr_h("%s: entering\n", __func__); /* validate the client ptr */ if (!client || client->client_uid >= sinfo->tot_clk_clients) { @@ -141,9 +146,11 @@ static int mmrm_sw_clk_client_deregister(struct mmrm_clk_mgr *sw_clk_mgr, mutex_unlock(&sw_clk_mgr->lock); + d_mpr_h("%s: exiting with success\n", __func__); return rc; err_not_valid_client: + d_mpr_h("%s: error exit\n", __func__); return rc; } @@ -187,8 +194,6 @@ static int mmrm_sw_check_peak_current( struct mmrm_sw_peak_current_data *peak_data = &sinfo->peak_cur_data; /* check for peak overshoot */ - d_mpr_h("%s: entering\n", __func__); - if ((peak_data->aggreg_val + req_cur) >= peak_data->threshold) { rc = -EINVAL; /* TBD: return from here */ @@ -210,7 +215,7 @@ static int mmrm_sw_clk_client_setval(struct mmrm_clk_mgr *sw_clk_mgr, struct mmrm_sw_clk_mgr_info *sinfo = &(sw_clk_mgr->data.sw_info); u32 req_cur; - d_mpr_e("%s: entering\n", __func__); + d_mpr_h("%s: entering\n", __func__); /* validate input params */ if (!client || client->client_uid >= sinfo->tot_clk_clients) { @@ -220,6 +225,7 @@ static int mmrm_sw_clk_client_setval(struct mmrm_clk_mgr *sw_clk_mgr, goto err_invalid_client; } + /* get table entry */ tbl_entry = &sinfo->clk_client_tbl[client->client_uid]; if (!tbl_entry->clk) { d_mpr_e("%s: clk src not registered\n"); @@ -271,11 +277,13 @@ static int mmrm_sw_clk_client_setval(struct mmrm_clk_mgr *sw_clk_mgr, } exit_no_err: + d_mpr_h("%s: exiting with success\n", __func__); return rc; err_invalid_clk_val: err_invalid_client: err_clk_set_fail: + d_mpr_h("%s: error exit\n", __func__); return rc; } @@ -284,7 +292,7 @@ static int mmrm_sw_clk_client_setval_inrange(struct mmrm_clk_mgr *sw_clk_mgr, struct mmrm_client_data *client_data, struct mmrm_client_res_value *val) { - d_mpr_e("%s: entering\n", __func__); + d_mpr_h("%s: entering\n", __func__); /* TBD: add support for set val in range */ return mmrm_sw_clk_client_setval(sw_clk_mgr, client, client_data, @@ -299,7 +307,7 @@ static int mmrm_sw_clk_client_getval(struct mmrm_clk_mgr *sw_clk_mgr, struct mmrm_sw_clk_client_tbl_entry *tbl_entry; struct mmrm_sw_clk_mgr_info *sinfo = &(sw_clk_mgr->data.sw_info); - d_mpr_e("%s: entering\n", __func__); + d_mpr_h("%s: entering\n", __func__); /* validate input params */ if (!client || client->client_uid >= sinfo->tot_clk_clients) { @@ -322,9 +330,11 @@ static int mmrm_sw_clk_client_getval(struct mmrm_clk_mgr *sw_clk_mgr, val->cur = tbl_entry->clk_rate; val->max = tbl_entry->clk_rate; + d_mpr_h("%s: exiting with success\n", __func__); return rc; err_invalid_client: + d_mpr_h("%s: error exit\n", __func__); return rc; } @@ -352,7 +362,7 @@ static int mmrm_sw_update_entries(struct mmrm_clk_platform_resources *cres, /* freq scaling only for svsl1, TBD: enhance with actual numbers */ freq_sc = FP(0, 86, 100); - /* update power & curernt entries for all levels */ + /* update power & current entries for all levels */ for (i = 0; i < MMRM_VDD_LEVEL_MAX; i++) { scaling_factor = cset->corner_tbl[i].scaling_factor_dyn; dyn_sc = FP( @@ -378,8 +388,8 @@ static int mmrm_sw_update_entries(struct mmrm_clk_platform_resources *cres, tbl_entry->leak_pwr[i] = fp_round(leak_pwr); tbl_entry->current_ma[i] = fp_round(fp_div((dyn_pwr+leak_pwr), volt)); - /* - d_mpr_e("%s: csid(%d) corner(%s) dyn_pwr(%zu) leak_pwr(%zu) tot_pwr(%d) cur_ma(%d)\n", + + d_mpr_h("%s: csid(%d) corner(%s) dyn_pwr(%zu) leak_pwr(%zu) tot_pwr(%d) cur_ma(%d)\n", __func__, tbl_entry->clk_src_id, cset->corner_tbl[i].name, @@ -387,7 +397,6 @@ static int mmrm_sw_update_entries(struct mmrm_clk_platform_resources *cres, tbl_entry->leak_pwr[i], fp_round(dyn_pwr+leak_pwr), tbl_entry->current_ma[i]); - */ } return 0; @@ -401,7 +410,7 @@ static int mmrm_sw_prepare_table(struct mmrm_clk_platform_resources *cres, struct mmrm_sw_clk_client_tbl_entry *tbl_entry; struct nom_clk_src_info *nom_tbl_entry; - d_mpr_e("%s: entering\n", __func__); + d_mpr_h("%s: entering\n", __func__); /* read all resource entries */ for (c = 0; c < sinfo->tot_clk_clients; c++) { @@ -415,10 +424,11 @@ static int mmrm_sw_prepare_table(struct mmrm_clk_platform_resources *cres, tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM] = nom_tbl_entry->nom_leak_pwr; - //d_mpr_e("%s: updating csid(%d) dyn_pwr(%d) leak_pwr(%d)\n", - // __func__, tbl_entry->clk_src_id, - // tbl_entry->dyn_pwr[MMRM_VDD_LEVEL_NOM], - // tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM]); + d_mpr_h("%s: updating csid(%d) dyn_pwr(%d) leak_pwr(%d)\n", + __func__, + tbl_entry->clk_src_id, + tbl_entry->dyn_pwr[MMRM_VDD_LEVEL_NOM], + tbl_entry->leak_pwr[MMRM_VDD_LEVEL_NOM]); /* calculate current & scale power for other levels */ rc = mmrm_sw_update_entries(cres, tbl_entry); @@ -431,13 +441,15 @@ static int mmrm_sw_prepare_table(struct mmrm_clk_platform_resources *cres, /* print the tables */ for (c = 0; c < sinfo->tot_clk_clients; c++) { tbl_entry = &sinfo->clk_client_tbl[c]; - d_mpr_e("%s: csid(%d) l1_cur_ma(%d) l2_cur_ma(%d) l3_cur_ma(%d)\n", - __func__, tbl_entry->clk_src_id, + d_mpr_h("%s: csid(%d) l1_cur_ma(%d) l2_cur_ma(%d) l3_cur_ma(%d)\n", + __func__, + tbl_entry->clk_src_id, tbl_entry->current_ma[MMRM_VDD_LEVEL_SVS_L1], tbl_entry->current_ma[MMRM_VDD_LEVEL_NOM], tbl_entry->current_ma[MMRM_VDD_LEVEL_TURBO]); } + d_mpr_h("%s: exiting\n", __func__); return rc; } @@ -451,7 +463,7 @@ int mmrm_init_sw_clk_mgr(void *driver_data) struct mmrm_clk_mgr *sw_clk_mgr = NULL; u32 tbl_size = 0; - d_mpr_e("%s: entering\n", __func__); + d_mpr_h("%s: entering\n", __func__); /* mmrm_sw_clk_mgr */ sw_clk_mgr = kzalloc(sizeof(*sw_clk_mgr), GFP_KERNEL); @@ -481,16 +493,13 @@ int mmrm_init_sw_clk_mgr(void *driver_data) /* prepare table entries */ rc = mmrm_sw_prepare_table(cres, sinfo); if (rc) { - d_mpr_e( - "%s: failed to prepare clk table\n", - __func__); + d_mpr_e("%s: failed to prepare clk table\n", __func__); rc = -ENOMEM; goto err_fail_prep_tbl; } /* update the peak current threshold */ - sinfo->peak_cur_data.threshold = - cres->threshold; + sinfo->peak_cur_data.threshold = cres->threshold; sinfo->peak_cur_data.aggreg_val = 0; /* initialize mutex for sw clk mgr */ @@ -501,8 +510,7 @@ int mmrm_init_sw_clk_mgr(void *driver_data) sw_clk_mgr->clk_client_ops = &clk_client_swops; drv_data->clk_mgr = sw_clk_mgr; - d_mpr_e("%s: exiting\n", __func__); - + d_mpr_h("%s: exiting with success\n", __func__); return rc; err_fail_prep_tbl: @@ -511,7 +519,7 @@ err_fail_clk_tbl: kfree(sw_clk_mgr); drv_data->clk_mgr = NULL; err_fail_sw_clk_mgr: - d_mpr_e("%s: exiting with error %d\n", __func__, rc); + d_mpr_h("%s: error exit\n", __func__); return rc; } diff --git a/driver/src/mmrm_debug.c b/driver/src/mmrm_debug.c index ca5e3d5..803bfc7 100644 --- a/driver/src/mmrm_debug.c +++ b/driver/src/mmrm_debug.c @@ -2,14 +2,97 @@ /* * Copyright (c) 2020, The Linux Foundation. All rights reserved. */ + +#include <linux/slab.h> + #include "mmrm_debug.h" +int msm_mmrm_debug = MMRM_ERR | MMRM_PRINTK; + +#define MAX_DBG_BUF_SIZE 4096 + +static ssize_t msm_mmrm_debugfs_info_read(struct file *file, + char __user *buf, + size_t count, + loff_t *ppos) +{ + char *dbuf, *cur, *end; + ssize_t len = 0; + + dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL); + if (!dbuf) + { + d_mpr_e("%s: Allocation failed!\n", __func__); + return -ENOMEM; + } + cur = dbuf; + end = cur + MAX_DBG_BUF_SIZE; + + // TODO: Fill cur here + + len = simple_read_from_buffer(buf, count, ppos, dbuf, cur - dbuf); + kfree(dbuf); + return len; +} + +const struct file_operations msm_mmrm_debugfs_info_fops = { + .open = simple_open, + .read = msm_mmrm_debugfs_info_read, +}; + struct dentry *msm_mmrm_debugfs_init(void) { + struct dentry *dir; + int file_val; + bool ok = false; + + d_mpr_h("%s: entering\n", __func__); + + /* create a directory in debugfs root (/sys/kernel/debug) */ + dir = debugfs_create_dir("msm_mmrm", NULL); + if (IS_ERR_OR_NULL(dir)) + { + d_mpr_e("%s: Call to debugfs_create_dir(%s) failed!\n", __func__, "mmrm"); + goto failed_create_dir; + } + + /* basic info */ + if (!debugfs_create_file("info", 0444, dir, &file_val, &msm_mmrm_debugfs_info_fops)) + { + d_mpr_e("%s: Call to debugfs_create_file(%s) failed!\n", __func__, "info"); + goto failed_create_dir; + } + +#define __debugfs_create(__type, __name, __value) ({ \ + struct dentry *f = debugfs_create_##__type(__name, 0644, dir, __value); \ + if (IS_ERR_OR_NULL(f)) { \ + d_mpr_e("%s: Failed creating debugfs file '%pd/%s'\n", \ + __func__, dir, __name); \ + f = NULL; \ + } \ + f; \ +}) + + /* add other params here */ + ok = + __debugfs_create(u32, "debug_level", &msm_mmrm_debug); + +#undef __debugfs_create + + if (!ok) + goto failed_create_dir; + + d_mpr_h("%s: exiting\n", __func__); + return dir; + +failed_create_dir: + d_mpr_h("%s: error exit\n", __func__); return NULL; } -void msm_mmrm_debugfs_deinit(void) +void msm_mmrm_debugfs_deinit(struct dentry *dir) { + d_mpr_h("%s: entering\n", __func__); + debugfs_remove_recursive(dir); + d_mpr_h("%s: exiting\n", __func__); } - diff --git a/driver/src/mmrm_debug.h b/driver/src/mmrm_debug.h index 5aa0c57..eea4ceb 100644 --- a/driver/src/mmrm_debug.h +++ b/driver/src/mmrm_debug.h @@ -13,8 +13,55 @@ #define MMRM_DBG_LABEL "msm_mmrm: " #endif -//#define d_mpr_h(__fmt, ...) pr_info(MMRM_DBG_LABEL __fmt, ##__VA_ARGS__) -#define d_mpr_h(__fmt, ...) pr_err(MMRM_DBG_LABEL __fmt, ##__VA_ARGS__) -#define d_mpr_e(__fmt, ...) pr_err(MMRM_DBG_LABEL __fmt, ##__VA_ARGS__) +#define MMRM_DBG_TAG MMRM_DBG_LABEL ": %4s: " + +/* To enable messages OR these values and + * echo the result to debugfs file. + */ +enum mmrm_msg_prio +{ + MMRM_ERR = 0x000001, + MMRM_HIGH = 0x000002, + MMRM_LOW = 0x000004, + MMRM_PRINTK = 0x010000, + MMRM_FTRACE = 0x020000, +}; + +extern int msm_mmrm_debug; + +#define dprintk(__level, __fmt, ...) \ + do \ + { \ + if (msm_mmrm_debug & __level) \ + { \ + if (msm_mmrm_debug & MMRM_PRINTK) \ + { \ + pr_info(MMRM_DBG_TAG __fmt, \ + get_debug_level_str(__level), ##__VA_ARGS__); \ + } \ + } \ + } while (0) + +#define d_mpr_e(__fmt, ...) dprintk(MMRM_ERR, __fmt, ##__VA_ARGS__) +#define d_mpr_h(__fmt, ...) dprintk(MMRM_HIGH, __fmt, ##__VA_ARGS__) +#define d_mpr_l(__fmt, ...) dprintk(MMRM_LOW, __fmt, ##__VA_ARGS__) + +static inline char *get_debug_level_str(int level) +{ + switch (level) + { + case MMRM_ERR: + return "err "; + case MMRM_HIGH: + return "high"; + case MMRM_LOW: + return "low "; + default: + return "????"; + } +} + +struct dentry *msm_mmrm_debugfs_init(void); +void msm_mmrm_debugfs_deinit(struct dentry *dir); #endif diff --git a/driver/src/mmrm_internal.h b/driver/src/mmrm_internal.h index ce587ef..2bc20b2 100644 --- a/driver/src/mmrm_internal.h +++ b/driver/src/mmrm_internal.h @@ -31,6 +31,9 @@ struct mmrm_driver_data { struct mmrm_clk_platform_resources clk_res; struct mmrm_clk_mgr *clk_mgr; struct mmrm_clk_mgr_ops *clk_mgr_ops; + + /* debugfs */ + struct dentry *debugfs_root; }; struct mmrm_platform_data *mmrm_get_platform_data(struct device *dev); diff --git a/driver/src/msm_mmrm.c b/driver/src/msm_mmrm.c index 0a83fba..1d2a86b 100644 --- a/driver/src/msm_mmrm.c +++ b/driver/src/msm_mmrm.c @@ -218,6 +218,7 @@ static int msm_mmrm_probe_init(struct platform_device *pdev) int rc = 0; d_mpr_h("%s: entering\n", __func__); + drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL); if (!drv_data) { d_mpr_e("%s: unable to allocate memory for mmrm driver\n", @@ -234,6 +235,10 @@ static int msm_mmrm_probe_init(struct platform_device *pdev) goto err_get_drv_data; } + drv_data->debugfs_root = msm_mmrm_debugfs_init(); + if (!drv_data->debugfs_root) + d_mpr_e("%s: failed to create debugfs for mmrm\n", __func__); + dev_set_drvdata(&pdev->dev, drv_data); rc = mmrm_read_platform_resources(pdev, drv_data); @@ -251,15 +256,16 @@ static int msm_mmrm_probe_init(struct platform_device *pdev) } d_mpr_h("%s: exiting with success\n", __func__); - return rc; err_mmrm_init: + msm_mmrm_debugfs_deinit(drv_data->debugfs_root); err_read_pltfrm_rsc: mmrm_free_platform_resources(drv_data); err_get_drv_data: RESET_DRV_DATA(drv_data); err_no_mem: + d_mpr_h("%s: error exit\n", __func__); return rc; } @@ -275,10 +281,10 @@ static int msm_mmrm_probe(struct platform_device *pdev) return msm_mmrm_probe_init(pdev); d_mpr_h("%s: exiting: no compatible device node\n", __func__); - return rc; err_exit: + d_mpr_h("%s: error exit\n", __func__); return rc; } @@ -294,14 +300,17 @@ static int msm_mmrm_remove(struct platform_device *pdev) return -EINVAL; } + msm_mmrm_debugfs_deinit(drv_data->debugfs_root); mmrm_deinit(drv_data); mmrm_free_platform_resources(drv_data); dev_set_drvdata(&pdev->dev, NULL); RESET_DRV_DATA(drv_data); + d_mpr_h("%s: exiting with success\n", __func__); return rc; err_exit: + d_mpr_h("%s: error exit\n", __func__); return rc; } @@ -310,7 +319,7 @@ static const struct of_device_id msm_mmrm_dt_match[] = { {} }; -MODULE_DEVICE_TABLE(of, msm_mmrm_of_match); +MODULE_DEVICE_TABLE(of, msm_mmrm_dt_match); static struct platform_driver msm_mmrm_driver = { .probe = msm_mmrm_probe, @@ -335,10 +344,10 @@ static int __init msm_mmrm_init(void) } d_mpr_h("%s: exiting\n", __func__); - return rc; err_platform_drv_reg: + d_mpr_h("%s: error exit\n", __func__); return rc; } |