Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b919b7ce authored by Ram Chandrasekar's avatar Ram Chandrasekar
Browse files

msm: lmh_lite: Add ftraces for LMH Lite events



Add LMH Lite ftraces for the LMH Lite event.
Ftraces are added to events like,
1. SCM call entry and exit
2. Trim error event
3. LMH interrupt trigger and clear event
4. LMH sensor interrupt event with intensity value
5. LMH sensor intensity reading

Change-Id: I2bc0c31fab751f0ee23b52e7d978a90d20a0eea1
Signed-off-by: default avatarRam Chandrasekar <rkumbako@codeaurora.org>
parent b6d89b7b
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@
#include <soc/qcom/scm.h>
#include <linux/dma-mapping.h>

#define CREATE_TRACE_POINTS
#define TRACE_MSM_LMH
#include <trace/trace_thermal.h>

#define LMH_DRIVER_NAME			"lmh-lite-driver"
#define LMH_INTERRUPT			"lmh-interrupt"
#define LMH_DEVICE			"lmh-profile"
@@ -123,12 +127,14 @@ static int lmh_ctrl_qpmda(uint32_t enable)
	desc_arg.args[0] = cmd_buf.enable = enable;
	desc_arg.args[1] = cmd_buf.rate = lmh_data->log_delay;
	desc_arg.arginfo = SCM_ARGS(2, SCM_VAL, SCM_VAL);
	trace_lmh_event_call("CTRL_QPMDA enter");
	if (!is_scm_armv8())
		ret = scm_call(SCM_SVC_LMH, LMH_CTRL_QPMDA,
			(void *) &cmd_buf, SCM_BUFFER_SIZE(cmd_buf), NULL, 0);
	else
		ret = scm_call2(SCM_SIP_FNID(SCM_SVC_LMH,
			LMH_CTRL_QPMDA), &desc_arg);
	trace_lmh_event_call("CTRL_QPMDA exit");
	if (ret) {
		pr_err("Error in SCM v%d %s QPMDA call. err:%d\n",
			(is_scm_armv8()) ? 8 : 7, (enable) ? "enable" :
@@ -186,6 +192,8 @@ static int lmh_reset(struct lmh_sensor_ops *ops)
		lmh_sensor->state = LMH_ISR_MONITOR;
		pr_debug("Sensor:[%s] not throttling. Switch to monitor mode\n",
			       lmh_sensor->sensor_name);
		trace_lmh_sensor_interrupt(lmh_sensor->sensor_name,
			lmh_sensor->last_read_value);
	} else {
		goto reset_exit;
	}
@@ -200,6 +208,7 @@ reset_exit:
		** deadlock situation */
		pr_debug("Zero throttling. Re-enabling interrupt\n");
		cancel_delayed_work_sync(&lmh_data->poll_work);
		trace_lmh_event_call("Lmh Interrupt Clear");
		enable_irq(lmh_data->irq_num);
	}
	return ret;
@@ -224,6 +233,7 @@ static void lmh_read_and_update(struct lmh_driver_data *lmh_dat)
	desc_arg.args[1] = cmd_buf.size
			= SCM_BUFFER_SIZE(struct lmh_sensor_packet);
	desc_arg.arginfo = SCM_ARGS(2, SCM_RW, SCM_VAL);
	trace_lmh_event_call("GET_INTENSITY enter");
	dmac_flush_range(&payload, &payload + sizeof(struct lmh_sensor_packet));
	if (!is_scm_armv8())
		ret = scm_call(SCM_SVC_LMH, LMH_GET_INTENSITY,
@@ -233,6 +243,7 @@ static void lmh_read_and_update(struct lmh_driver_data *lmh_dat)
			LMH_GET_INTENSITY), &desc_arg);
	/* Have memory barrier before we access the TZ data */
	mb();
	trace_lmh_event_call("GET_INTENSITY exit");
	if (ret) {
		pr_err("Error in SCM v%d read call. err:%d\n",
				(is_scm_armv8()) ? 8 : 7, ret);
@@ -251,6 +262,9 @@ static void lmh_read_and_update(struct lmh_driver_data *lmh_dat)

				lmh_sensor->last_read_value =
					payload.sensor[idx].intensity;
				trace_lmh_sensor_reading(
					lmh_sensor->sensor_name,
					lmh_sensor->last_read_value);
				break;
			}
		}
@@ -273,6 +287,8 @@ static void lmh_read_and_notify(struct lmh_driver_data *lmh_dat)
			& BIT(lmh_sensor->sensor_sw_id))) {
			pr_debug("Sensor:[%s] interrupt triggered\n",
				lmh_sensor->sensor_name);
			trace_lmh_sensor_interrupt(lmh_sensor->sensor_name,
							val);
			lmh_dat->intr_status_val
			       |= BIT(lmh_sensor->sensor_sw_id);
			lmh_sensor->state = LMH_ISR_POLLING;
@@ -307,11 +323,13 @@ static void lmh_trim_error(void)
	WARN_ON(1);
	pr_err("LMH hardware trim error\n");
	desc_arg.arginfo = SCM_ARGS(0);
	trace_lmh_event_call("TRIM_ERROR enter");
	if (!is_scm_armv8())
		ret = scm_call(SCM_SVC_LMH, LMH_TRIM_ERROR, NULL, 0, NULL, 0);
	else
		ret = scm_call2(SCM_SIP_FNID(SCM_SVC_LMH,
			LMH_TRIM_ERROR), &desc_arg);
	trace_lmh_event_call("TRIM_ERROR exit");
	if (ret)
		pr_err("Error in SCM v%d trim error call. err:%d\n",
					(is_scm_armv8()) ? 8 : 7, ret);
@@ -328,6 +346,7 @@ static void lmh_notify(struct work_struct *work)
	lmh_dat->intr_reg_val = readl_relaxed(lmh_dat->intr_addr);
	pr_debug("Lmh hw interrupt:%d\n", lmh_dat->intr_reg_val);
	if (lmh_dat->intr_reg_val & BIT(lmh_dat->trim_err_offset)) {
		trace_lmh_event_call("Lmh trim error");
		lmh_trim_error();
		lmh_dat->intr_state = LMH_ISR_MONITOR;
		goto notify_exit;
@@ -336,6 +355,7 @@ static void lmh_notify(struct work_struct *work)
	if (!lmh_dat->intr_status_val) {
		pr_debug("LMH not throttling. Enabling interrupt\n");
		lmh_dat->intr_state = LMH_ISR_MONITOR;
		trace_lmh_event_call("Lmh Zero throttle Interrupt Clear");
		goto notify_exit;
	}

@@ -354,6 +374,7 @@ static irqreturn_t lmh_handle_isr(int irq, void *data)
	struct lmh_driver_data *lmh_dat = (struct lmh_driver_data *)data;

	pr_debug("LMH Interrupt triggered\n");
	trace_lmh_event_call("Lmh Interrupt");
	if (lmh_dat->intr_state == LMH_ISR_MONITOR) {
		disable_irq_nosync(lmh_dat->irq_num);
		lmh_dat->intr_state = LMH_ISR_POLLING;
@@ -524,6 +545,7 @@ static int lmh_get_sensor_list(void)
		desc_arg.args[1] = cmd_buf.size = SCM_BUFFER_SIZE(struct
				lmh_sensor_packet);
		desc_arg.arginfo = SCM_ARGS(2, SCM_RW, SCM_VAL);
		trace_lmh_event_call("GET_SENSORS enter");
		if (!is_scm_armv8())
			ret = scm_call(SCM_SVC_LMH, LMH_GET_SENSORS,
				(void *) &cmd_buf,
@@ -534,6 +556,7 @@ static int lmh_get_sensor_list(void)
				LMH_GET_SENSORS), &desc_arg);
		/* Have memory barrier before we access the TZ data */
		mb();
		trace_lmh_event_call("GET_SENSORS exit");
		if (ret < 0) {
			pr_err("Error in SCM v%d call. err:%d\n",
					(is_scm_armv8()) ? 8 : 7, ret);
@@ -658,6 +681,7 @@ static int lmh_get_dev_info(void)
			SCM_BUFFER_SIZE(uint32_t) * LMH_GET_PROFILE_SIZE;
		desc_arg.args[2] = cmd_buf.list_start = next;
		desc_arg.arginfo = SCM_ARGS(3, SCM_RW, SCM_VAL, SCM_VAL);
		trace_lmh_event_call("GET_PROFILE enter");
		dmac_flush_range(payload, payload + sizeof(uint32_t) *
			LMH_GET_PROFILE_SIZE);
		if (!is_scm_armv8()) {
@@ -671,6 +695,7 @@ static int lmh_get_dev_info(void)
		}
		/* Have memory barrier before we access the TZ data */
		mb();
		trace_lmh_event_call("GET_PROFILE exit");
		if (ret) {
			pr_err("Error in SCM v%d get Profile call. err:%d\n",
					(is_scm_armv8()) ? 8 : 7, ret);
+70 −1
Original line number Diff line number Diff line
@@ -18,7 +18,76 @@
#define _TRACE_THERMAL_H

#include <linux/tracepoint.h>
#ifdef TRACE_MSM_THERMAL

#ifdef TRACE_MSM_LMH
DECLARE_EVENT_CLASS(msm_lmh_print_sensor_reading,

	TP_PROTO(const char *sensor_name, unsigned int intensity),

	TP_ARGS(
		sensor_name, intensity
	),

	TP_STRUCT__entry(
		__string(_name, sensor_name)
		__field(unsigned int, reading)
	),

	TP_fast_assign(
		__assign_str(_name, sensor_name);
		__entry->reading = intensity;
	),

	TP_printk(
		"Sensor:[%s] throttling intensity:%u", __get_str(_name),
		__entry->reading
	)
);

DECLARE_EVENT_CLASS(msm_lmh_print_event,

	TP_PROTO(const char *event_name),

	TP_ARGS(
		event_name
	),

	TP_STRUCT__entry(
		__string(_name,	event_name)
	),

	TP_fast_assign(
		__assign_str(_name, event_name);
	),

	TP_printk(
		"Event:[%s]", __get_str(_name)
	)
);

DEFINE_EVENT(msm_lmh_print_sensor_reading, lmh_sensor_interrupt,

	TP_PROTO(const char *sensor_name, unsigned int intensity),

	TP_ARGS(sensor_name, intensity)
);

DEFINE_EVENT(msm_lmh_print_sensor_reading, lmh_sensor_reading,

	TP_PROTO(const char *sensor_name, unsigned int intensity),

	TP_ARGS(sensor_name, intensity)
);

DEFINE_EVENT(msm_lmh_print_event, lmh_event_call,

	TP_PROTO(const char *event_name),

	TP_ARGS(event_name)
);

#elif defined(TRACE_MSM_THERMAL)

DECLARE_EVENT_CLASS(msm_thermal_post_core_ctl,

	TP_PROTO(unsigned int cpu, unsigned int online),