[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/devtools/met-driver/4.9/mt8518/met_thermal.c b/src/devtools/met-driver/4.9/mt8518/met_thermal.c
new file mode 100644
index 0000000..23c32b9
--- /dev/null
+++ b/src/devtools/met-driver/4.9/mt8518/met_thermal.c
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+#include <asm/page.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/kernel.h>
+#include <linux/syscalls.h>
+#include <linux/mm.h>
+/* #include <asm/uaccess.h> */
+#include <linux/uaccess.h>
+#include <linux/hrtimer.h>
+
+#include "met_drv.h"
+#include "trace.h"
+#include "core_plf_trace.h"
+#include "core_plf_init.h"
+
+/*define if the thermal sensor driver use its own timer to sampling the code , otherwise undefine it */
+/*define it is better for sampling jitter if thermal sensor driver supports */
+/* this define is phase out */
+/* #define MET_USE_THERMALDRIVER_TIMER */
+
+noinline void ms_th(const unsigned char cnt, unsigned int *value)
+{
+	char *SOB, *EOB;
+
+	MET_TRACE_GETBUF(&SOB, &EOB);
+	EOB = ms_formatD_EOL(EOB, cnt, value);
+	MET_TRACE_PUTBUF(SOB, EOB);
+}
+
+static unsigned int CheckAvailableThermalSensor(unsigned int a_u4DoCheck)
+{
+	static unsigned int u4AvailableSensor;
+
+	unsigned int u4Index;
+
+	if (!a_u4DoCheck)
+		return u4AvailableSensor;
+
+	/*Do check */
+	if (MTK_THERMAL_SENSOR_COUNT > 32)
+		return 0;
+
+	if (mtk_thermal_get_temp_symbol == NULL)
+		return 0;
+
+	u4AvailableSensor = 0;
+
+	for (u4Index = 0; u4Index < MTK_THERMAL_SENSOR_COUNT; u4Index++) {
+		if (mtk_thermal_get_temp_symbol(u4Index) == (-127000) || mtk_thermal_get_temp_symbol(u4Index) < 0)
+			u4AvailableSensor &= (~(1 << u4Index));
+		else
+			u4AvailableSensor |= (1 << u4Index);
+	}
+
+	return u4AvailableSensor;
+}
+
+static int do_thermal(void)
+{
+	static int do_thermal = -1;
+
+	if (do_thermal != -1)
+		return do_thermal;
+
+	if (met_thermal.mode == 0)
+		do_thermal = 0;
+	else
+		do_thermal = met_thermal.mode;
+	return do_thermal;
+}
+
+static unsigned int get_thermal(unsigned int *value)
+{
+	int j = -1;
+	int i;
+	unsigned int u4ValidSensors = 0;
+
+	/*Do check */
+	if (mtk_thermal_get_temp_symbol == NULL)
+		return 0;
+
+	u4ValidSensors = CheckAvailableThermalSensor(0);
+
+	for (i = 0; i < MTK_THERMAL_SENSOR_COUNT; i++) {
+		if (u4ValidSensors & (1 << i))
+			value[++j] = mtk_thermal_get_temp_symbol(i);
+	}
+
+	return j + 1;
+}
+
+static void wq_get_thermal(struct work_struct *work)
+{
+	unsigned char count = 0;
+	unsigned int thermal_value[MTK_THERMAL_SENSOR_COUNT];	/*Note here */
+
+	int cpu;
+
+	cpu = smp_processor_id();
+	if (do_thermal()) {
+		count = get_thermal(thermal_value);
+		if (count)
+			ms_th(count, thermal_value);
+	}
+}
+
+#ifdef MET_USE_THERMALDRIVER_TIMER
+
+static void thermal_start(void)
+{
+	CheckAvailableThermalSensor(1);
+	/* get extern symbol by symbol_get */
+	if (mt_thermalsampler_registerCB_symbol)
+		mt_thermalsampler_registerCB_symbol(wq_get_thermal);
+}
+
+static void thermal_stop(void)
+{
+	if (mt_thermalsampler_registerCB_symbol)
+		mt_thermalsampler_registerCB_symbol(NULL);
+}
+
+#else
+
+struct delayed_work dwork;
+static void thermal_start(void)
+{
+	CheckAvailableThermalSensor(1);
+	/*pr_debug("Thermal Sample:0x%x\n",CheckAvailableThermalSensor(0)); */
+	INIT_DELAYED_WORK(&dwork, wq_get_thermal);
+}
+
+static void thermal_stop(void)
+{
+	cancel_delayed_work_sync(&dwork);
+}
+
+static void thermal_polling(unsigned long long stamp, int cpu)
+{
+	schedule_delayed_work(&dwork, 0);
+}
+
+#endif
+
+static const char help[] = "  --thermal                             monitor thermal\n";
+static int thermal_print_help(char *buf, int len)
+{
+	return snprintf(buf, PAGE_SIZE, help);
+}
+
+static const char g_pThermalHeader[] = "met-info [000] 0.0: thermal_header: ms_th";
+
+static int thermal_print_header(char *buf, int len)
+{
+	char buffer[256];
+	char ts_buf[8] = {0};
+	unsigned long u4Cnt = 0;
+	unsigned int u4ValidSensor = 0;
+	int i = 0, ts_sz = 0;
+
+	u4ValidSensor = CheckAvailableThermalSensor(0);
+
+	strncpy(buffer, g_pThermalHeader, 256 - 1);
+
+	ts_sz = sizeof(ts_buf);
+
+	for ( i = 0 ; i < MTK_THERMAL_SENSOR_COUNT ; i++) {
+		if ((1 << i) & u4ValidSensor) {
+			snprintf(ts_buf, ts_sz, ",tab_%d", (i + 1));
+			strncat(buffer, ts_buf, 256 - 1);
+			u4Cnt += 1;
+		}
+		memset(ts_buf, '\0', ts_sz);
+	}
+
+	strncat(buffer, "\n", 256 - 1);
+
+	return snprintf(buf, PAGE_SIZE, "%s", buffer);
+}
+
+struct metdevice met_thermal = {
+	.name = "thermal",
+	.owner = THIS_MODULE,
+	.type = MET_TYPE_BUS,
+	.cpu_related = 0,
+	.ondiemet_mode = 0,
+	.start = thermal_start,
+	.stop = thermal_stop,
+#ifdef MET_USE_THERMALDRIVER_TIMER
+#else
+	.polling_interval = 50,	/* ms */
+	.timed_polling = thermal_polling,
+	.tagged_polling = thermal_polling,
+#endif
+	.print_help = thermal_print_help,
+	.print_header = thermal_print_header,
+};
+
+
+
+/*CPU sensors */
+static unsigned int CheckAvailableCPUThermalSensor(unsigned int a_u4DoCheck)
+{
+	static unsigned int u4AvailableSensor;
+
+	unsigned int u4Index;
+
+	if (tscpu_get_cpu_temp_met_symbol == NULL)
+		return 0;
+
+	if (!a_u4DoCheck)
+		return u4AvailableSensor;
+
+	u4AvailableSensor = 0;
+
+	for (u4Index = 0; u4Index < MTK_THERMAL_SENSOR_CPU_COUNT; u4Index++) {
+		if (u4Index == ATM_GPU_LIMIT)
+			continue;
+
+		if (tscpu_get_cpu_temp_met_symbol(u4Index) == (-127000) || tscpu_get_cpu_temp_met_symbol(u4Index) < 0)
+			u4AvailableSensor &= (~(1 << u4Index));
+		else
+			u4AvailableSensor |= (1 << u4Index);
+	}
+
+	return u4AvailableSensor;
+}
+
+noinline void CPUTS(void)
+{
+	unsigned int u4Index1 = 0, u4Index2 = 0;
+	unsigned int u4ValidSensors = 0;
+	int i4TSValue[MTK_THERMAL_SENSOR_CPU_COUNT];
+	int i = 0, len = 0, total_len = 0, sz;
+	char str_buff[128] = {0};
+
+	sz = sizeof(str_buff);
+
+	if (tscpu_get_cpu_temp_met_symbol == NULL)
+		return;
+
+	memset(i4TSValue, 0, sizeof(int) * MTK_THERMAL_SENSOR_CPU_COUNT);
+
+	u4ValidSensors = CheckAvailableCPUThermalSensor(0);
+
+	for (; u4Index1 < MTK_THERMAL_SENSOR_CPU_COUNT; u4Index1++) {
+		if (u4ValidSensors & (1 << u4Index1)) {
+			i4TSValue[u4Index2] = tscpu_get_cpu_temp_met_symbol(u4Index1);
+			u4Index2 += 1;
+		}
+	}
+
+	len = snprintf(str_buff + total_len, 8, "%d", i4TSValue[0]);
+	if (len >= 0 && len < sz)
+		total_len += len;
+
+	for (i = 1 ; i < u4Index2 ; i++) {
+		len = snprintf(str_buff + total_len, 8, ",%d", i4TSValue[i]);
+		if (len >= 0 && len < sz)
+			total_len += len;
+	}
+
+	MET_TRACE("%s\n", str_buff);
+}
+
+static void thermal_CPU_start(void)
+{
+	CheckAvailableCPUThermalSensor(1);
+
+	/* get extern symbol by symbol_get */
+	if (mt_thermalsampler_registerCB_symbol)
+		mt_thermalsampler_registerCB_symbol(CPUTS);
+}
+
+static void thermal_CPU_stop(void)
+{
+	/* release extern symbol by symbol_put */
+	if (mt_thermalsampler_registerCB_symbol)
+		mt_thermalsampler_registerCB_symbol(NULL);
+}
+
+static const char help_cpu[] = "  --thermal-cpu                         monitor cpu temperature\n";
+static int thermal_CPU_print_help(char *buf, int len)
+{
+	return snprintf(buf, PAGE_SIZE, help_cpu);
+}
+
+static const char g_pCPUThermalHeader[] = "met-info [000] 0.0: thermal_cpu_header: CPUTS";
+
+static int thermal_CPU_print_header(char *buf, int len)
+{
+	char buffer[256];
+	char ts_buf[8] = {0} ;
+	unsigned long u4Cnt = 0;
+	unsigned int u4ValidSensor = 0;
+	int i = 0, ts_sz = 0;
+
+	u4ValidSensor = CheckAvailableCPUThermalSensor(0);
+
+	strncpy(buffer, g_pCPUThermalHeader, 256 - 1);
+
+	ts_sz = sizeof(ts_buf);
+
+	for ( i = 0 ; i < MTK_THERMAL_SENSOR_CPU_COUNT ; i++) {
+		if ((1 << i) & u4ValidSensor) {
+			snprintf(ts_buf, ts_sz, ",tab_%d", (i + 1));
+			strncat(buffer, ts_buf, 256 - 1);
+			u4Cnt += 1;
+		}
+		memset(ts_buf, '\0', ts_sz);
+	}
+
+	strncat(buffer, "\n", 256 - 1);
+
+	return snprintf(buf, PAGE_SIZE, "%s", buffer);
+}
+
+struct metdevice met_thermal_cpu = {
+	.name = "thermal-cpu",
+	.owner = THIS_MODULE,
+	.type = MET_TYPE_BUS,
+	.cpu_related = 0,
+	.start = thermal_CPU_start,
+	.stop = thermal_CPU_stop,
+	.print_help = thermal_CPU_print_help,
+	.print_header = thermal_CPU_print_header,
+	.ondiemet_mode = 0,
+};