فهرست منبع

mmrm: Print enabled mmrm client info

Print enabled mmrm client info during runtime.
This will be a helpful debugging feature to identy the
enabled clients, corresponding power info & aggregated numbers.

Change-Id: I01734843d28e7a21c622dcb1ff6263aa1c2c156c
Signed-off-by: mbao <[email protected]>
mbao 3 سال پیش
والد
کامیت
3ddc864248
4فایلهای تغییر یافته به همراه77 افزوده شده و 2 حذف شده
  1. 14 0
      driver/src/mmrm_clk_rsrc_mgr.c
  2. 5 0
      driver/src/mmrm_clk_rsrc_mgr.h
  3. 39 0
      driver/src/mmrm_clk_rsrc_mgr_sw.c
  4. 19 2
      driver/src/msm_mmrm.c

+ 14 - 0
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);
+}
+

+ 5 - 0
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);

+ 39 - 0
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,

+ 19 - 2
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,
 };