diff options
author | qctecmdr <qctecmdr@localhost> | 2021-09-27 12:23:19 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2021-09-27 12:23:19 -0700 |
commit | 7ccb18bbe3656e7b57cd2993ace82353fff8caf4 (patch) | |
tree | fdb376997ec64a1ee667056d0da39ce20fdf9c79 | |
parent | 6861e939bd69e9c57db3d453f34ec570d820de6e (diff) | |
parent | 6b28146cf0bd637e88e52a8e8cecf355226d2aaa (diff) | |
download | mmrm-7ccb18bbe3656e7b57cd2993ace82353fff8caf4.tar.gz |
Merge "mmrm: Print enabled mmrm client info"
-rw-r--r-- | driver/src/mmrm_clk_rsrc_mgr.c | 14 | ||||
-rw-r--r-- | driver/src/mmrm_clk_rsrc_mgr.h | 5 | ||||
-rw-r--r-- | driver/src/mmrm_clk_rsrc_mgr_sw.c | 39 | ||||
-rw-r--r-- | driver/src/msm_mmrm.c | 21 |
4 files changed, 77 insertions, 2 deletions
diff --git a/driver/src/mmrm_clk_rsrc_mgr.c b/driver/src/mmrm_clk_rsrc_mgr.c index 4fd2684..d4d08da 100644 --- a/driver/src/mmrm_clk_rsrc_mgr.c +++ b/driver/src/mmrm_clk_rsrc_mgr.c @@ -107,3 +107,17 @@ int mmrm_clk_client_getval(struct mmrm_clk_mgr *clk_mgr, return clk_mgr->clk_client_ops->clk_client_getval( clk_mgr, client, val); } + +int mmrm_clk_print_enabled_client_info(struct mmrm_clk_mgr *clk_mgr, + char *buf, int sz) +{ + if (!clk_mgr || !clk_mgr->clk_client_ops || + !clk_mgr->clk_client_ops->clk_print_enabled_client_info) { + d_mpr_e("%s: invalid clk mgr\n", __func__); + return -EINVAL; + } + + return clk_mgr->clk_client_ops->clk_print_enabled_client_info( + clk_mgr, buf, sz); +} + diff --git a/driver/src/mmrm_clk_rsrc_mgr.h b/driver/src/mmrm_clk_rsrc_mgr.h index 170b346..4bf09f3 100644 --- a/driver/src/mmrm_clk_rsrc_mgr.h +++ b/driver/src/mmrm_clk_rsrc_mgr.h @@ -134,6 +134,8 @@ struct mmrm_clk_mgr_client_ops { struct mmrm_client_res_value *val); int (*clk_client_getval)(struct mmrm_clk_mgr *clk_mgr, struct mmrm_client *client, struct mmrm_client_res_value *val); + int (*clk_print_enabled_client_info)(struct mmrm_clk_mgr *clk_mgr, + char *buf, int sz); }; /* clk mgr operations */ @@ -159,6 +161,9 @@ int mmrm_clk_client_setval_inrange(struct mmrm_clk_mgr *clk_mgr, int mmrm_clk_client_getval(struct mmrm_clk_mgr *clk_mgr, struct mmrm_client *client, struct mmrm_client_res_value *val); +int mmrm_clk_print_enabled_client_info(struct mmrm_clk_mgr *clk_mgr, + char *buf, + int sz); /* sw clk mgr specific */ int mmrm_init_sw_clk_mgr(void *driver_data); diff --git a/driver/src/mmrm_clk_rsrc_mgr_sw.c b/driver/src/mmrm_clk_rsrc_mgr_sw.c index 71248a8..63224df 100644 --- a/driver/src/mmrm_clk_rsrc_mgr_sw.c +++ b/driver/src/mmrm_clk_rsrc_mgr_sw.c @@ -995,12 +995,51 @@ err_invalid_client: return rc; } +static int mmrm_sw_clk_print_enabled_client_info(struct mmrm_clk_mgr *sw_clk_mgr, + char *buf, + int sz) +{ + u32 c, len; + u32 left_spaces = (u32)sz; + struct mmrm_sw_clk_mgr_info *sinfo = &(sw_clk_mgr->data.sw_info); + struct mmrm_sw_peak_current_data *peak_data = &sinfo->peak_cur_data; + struct mmrm_sw_clk_client_tbl_entry *tbl_entry = NULL; + + len = scnprintf(buf, left_spaces, " csid clk_rate vdd_level cur_ma num_hw_blocks\n"); + left_spaces -= len; + buf += len; + + if (sinfo != NULL && peak_data != NULL) { + for (c = 0; (c < sinfo->tot_clk_clients) && (left_spaces > 1); c++) { + tbl_entry = &sinfo->clk_client_tbl[c]; + if ((tbl_entry != NULL) && (tbl_entry->clk_rate)) { + len = scnprintf(buf, left_spaces, "0x%x %zu %zu %zu %zu\n", + tbl_entry->clk_src_id, + tbl_entry->clk_rate, + tbl_entry->vdd_level, + tbl_entry->current_ma[tbl_entry->vdd_level] + [peak_data->aggreg_level] * tbl_entry->num_hw_blocks, + tbl_entry->num_hw_blocks); + left_spaces -= len; + buf += len; + } + } + if (left_spaces > 1) { + len = scnprintf(buf, left_spaces, "aggreg_val(%zu) aggreg_level(%zu)\n", + peak_data->aggreg_val, peak_data->aggreg_level); + left_spaces -= len; + } + } + return (sz - left_spaces); +} + static struct mmrm_clk_mgr_client_ops clk_client_swops = { .clk_client_reg = mmrm_sw_clk_client_register, .clk_client_dereg = mmrm_sw_clk_client_deregister, .clk_client_setval = mmrm_sw_clk_client_setval, .clk_client_setval_inrange = mmrm_sw_clk_client_setval_inrange, .clk_client_getval = mmrm_sw_clk_client_getval, + .clk_print_enabled_client_info = mmrm_sw_clk_print_enabled_client_info, }; static int mmrm_sw_prepare_table(struct mmrm_clk_platform_resources *cres, diff --git a/driver/src/msm_mmrm.c b/driver/src/msm_mmrm.c index a70a63e..b570d9b 100644 --- a/driver/src/msm_mmrm.c +++ b/driver/src/msm_mmrm.c @@ -29,6 +29,8 @@ drv_data = (void *) -EPROBE_DEFER; \ } +#define MMRM_SYSFS_ENTRY_MAX_LEN PAGE_SIZE + extern int msm_mmrm_debug; extern u8 msm_mmrm_enable_throttle_feature; extern u8 msm_mmrm_allow_multiple_register; @@ -230,8 +232,6 @@ err_exit: } EXPORT_SYMBOL(mmrm_client_get_value); -#define MMRM_SYSFS_ENTRY_MAX_LEN 64 - static int sysfs_get_param(const char *buf, u32 *param) { int base; @@ -320,6 +320,19 @@ static ssize_t mmrm_sysfs_allow_multiple_set(struct device *dev, return count; } + +static ssize_t dump_enabled_client_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int rc; + + rc = mmrm_clk_print_enabled_client_info(drv_data->clk_mgr, buf, MMRM_SYSFS_ENTRY_MAX_LEN); + if (rc == 0) + d_mpr_e("%s: failed to dump client info\n", __func__); + + return rc; +} + static DEVICE_ATTR(debug, 0644, mmrm_sysfs_debug_get, mmrm_sysfs_debug_set); @@ -332,10 +345,14 @@ static DEVICE_ATTR(allow_multiple_register, 0644, mmrm_sysfs_allow_multiple_get, mmrm_sysfs_allow_multiple_set); +static DEVICE_ATTR_RO(dump_enabled_client_info); + + static struct attribute *mmrm_fs_attrs[] = { &dev_attr_debug.attr, &dev_attr_enable_throttle_feature.attr, &dev_attr_allow_multiple_register.attr, + &dev_attr_dump_enabled_client_info.attr, NULL, }; |