summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqctecmdr <qctecmdr@localhost>2021-09-27 12:23:19 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2021-09-27 12:23:19 -0700
commit7ccb18bbe3656e7b57cd2993ace82353fff8caf4 (patch)
treefdb376997ec64a1ee667056d0da39ce20fdf9c79
parent6861e939bd69e9c57db3d453f34ec570d820de6e (diff)
parent6b28146cf0bd637e88e52a8e8cecf355226d2aaa (diff)
downloadmmrm-7ccb18bbe3656e7b57cd2993ace82353fff8caf4.tar.gz
Merge "mmrm: Print enabled mmrm client info"
-rw-r--r--driver/src/mmrm_clk_rsrc_mgr.c14
-rw-r--r--driver/src/mmrm_clk_rsrc_mgr.h5
-rw-r--r--driver/src/mmrm_clk_rsrc_mgr_sw.c39
-rw-r--r--driver/src/msm_mmrm.c21
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,
};