Merge ab1e3c58366864a0795dd1fff31d74a20c61a70d on remote branch

Change-Id: Ib8df6e35ae3d6be4c85ee5d83312f3a99e4c8dcc
diff --git a/android.hardware.thermal@2.0-service.qti-v2.rc b/android.hardware.thermal@2.0-service.qti-v2.rc
index a1100b6..29d9cbc 100644
--- a/android.hardware.thermal@2.0-service.qti-v2.rc
+++ b/android.hardware.thermal@2.0-service.qti-v2.rc
@@ -1,4 +1,5 @@
 # Copyright (c) 2021, The Linux Foundation. All rights reserved.
+# Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -32,7 +33,3 @@
 	class hal
 	user root
 	group root
-
-on boot
-    wait /sys/kernel/boot_adsp/boot
-    restart android.thermal-hal
diff --git a/thermalMonitorNetlink.cpp b/thermalMonitorNetlink.cpp
index b8e7128..f081363 100644
--- a/thermalMonitorNetlink.cpp
+++ b/thermalMonitorNetlink.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -73,11 +74,13 @@
 }
 
 ThermalMonitor::ThermalMonitor(const eventMonitorCB &inp_event_cb,
-				const eventMonitorCB &inp_sample_cb):
+				const eventMonitorCB &inp_sample_cb,
+				const eventCreateMonitorCB &inp_event_create_cb):
 	event_group(-1),
 	sample_group(-1),
 	event_cb(inp_event_cb),
-	sample_cb(inp_sample_cb)
+	sample_cb(inp_sample_cb),
+	event_create_cb(inp_event_create_cb)
 {
 	monitor_shutdown = false;
 }
@@ -99,6 +102,7 @@
 	struct genlmsghdr *hdr = genlmsg_hdr(nl_hdr);
 	struct nlattr *attrs[THERMAL_GENL_ATTR_MAX + 1];
 	int tzn = -1, trip = -1;
+	const char *tz_name = "";
 
 	genlmsg_parse(nl_hdr, 0, attrs, THERMAL_GENL_ATTR_MAX, NULL);
 
@@ -111,10 +115,19 @@
 		if (attrs[THERMAL_GENL_ATTR_TZ_TRIP_ID])
 			trip = nla_get_u32(
 					attrs[THERMAL_GENL_ATTR_TZ_TRIP_ID]);
-		LOG(INFO) << "thermal_nl_event: TZ:" << tzn << " Trip:"
-		       << trip << "event:" << hdr->cmd << std::endl;
+		LOG(DEBUG) << "thermal_nl_event: TZ:" << tzn << " Trip:"
+		       << trip << "event:" << (int)hdr->cmd << std::endl;
 		event_cb(tzn, trip);
 		break;
+	case THERMAL_GENL_EVENT_TZ_CREATE:
+		if (attrs[THERMAL_GENL_ATTR_TZ_ID])
+			tzn = nla_get_u32(attrs[THERMAL_GENL_ATTR_TZ_ID]);
+		if (attrs[THERMAL_GENL_ATTR_TZ_NAME])
+			tz_name = nla_get_string(attrs[THERMAL_GENL_ATTR_TZ_NAME]);
+		LOG(DEBUG) << "thermal_nl_event: TZ_CREATE: TZ:" << tzn << " TZ_NAME:"
+		       << tz_name << "event:" << (int)hdr->cmd << std::endl;
+		event_create_cb(tzn, tz_name);
+		break;
 	}
 
 	return 0;
diff --git a/thermalMonitorNetlink.h b/thermalMonitorNetlink.h
index 7ad87dd..7e42690 100644
--- a/thermalMonitorNetlink.h
+++ b/thermalMonitorNetlink.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -46,11 +47,13 @@
 namespace implementation {
 
 using eventMonitorCB = std::function<void(int, int)>;
+using eventCreateMonitorCB = std::function<void(int, const char *)>;
 
 class ThermalMonitor {
 	public:
 		ThermalMonitor(const eventMonitorCB &inp_event_cb,
-				const eventMonitorCB &inp_sample_cb);
+			const eventMonitorCB &inp_sample_cb,
+			const eventCreateMonitorCB &inp_event_create_cb);
 		~ThermalMonitor();
 
 		void parse_and_notify(char *inp_buf, ssize_t len);
@@ -68,6 +71,7 @@
 		int event_group, sample_group;
 		bool monitor_shutdown;
 		eventMonitorCB event_cb, sample_cb;
+		eventCreateMonitorCB event_create_cb;
 
 		int fetch_group_id();
 		int send_nl_msg(struct nl_msg *msg);
diff --git a/thermalUtilsNetlink.cpp b/thermalUtilsNetlink.cpp
index b709404..2b340f8 100644
--- a/thermalUtilsNetlink.cpp
+++ b/thermalUtilsNetlink.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -52,6 +53,9 @@
 				std::placeholders::_2),
 		std::bind(&ThermalUtils::sampleParse, this,
 				std::placeholders::_1,
+				std::placeholders::_2),
+		std::bind(&ThermalUtils::eventCreateParse, this,
+				std::placeholders::_1,
 				std::placeholders::_2)),
 	cb(inp_cb)
 {
@@ -72,8 +76,8 @@
 			cmnInst.estimateSeverity(sens);
 			cmnInst.initThreshold(sens);
 		}
-		monitor.start();
 	}
+	monitor.start();
 	ret = cmnInst.initCdev();
 	if (ret > 0) {
 		is_cdev_init = true;
@@ -121,6 +125,45 @@
 	return Notify(sens);
 }
 
+void ThermalUtils::eventCreateParse(int tzn, const char *name)
+{
+	int ret = 0;
+	std::vector<struct therm_sensor> sensorList;
+	std::vector<struct target_therm_cfg> therm_cfg = cfg.fetchConfig();
+	std::vector<struct target_therm_cfg>::iterator it_vec;
+	std::vector<std::string>::iterator it;
+
+	if (isSensorInitialized())
+		return;
+	for (it_vec = therm_cfg.begin();
+		it_vec != therm_cfg.end(); it_vec++) {
+		for (it = it_vec->sensor_list.begin();
+			       it != it_vec->sensor_list.end(); it++) {
+			if (!it->compare(name))
+				break;
+		}
+		if (it != it_vec->sensor_list.end())
+			break;
+	}
+	if (it_vec == therm_cfg.end()) {
+		LOG(DEBUG) << "sensor is not monitored:" << tzn
+			<< std::endl;
+		return;
+	}
+	ret = cmnInst.initThermalZones(therm_cfg);
+	if (ret > 0) {
+		is_sensor_init = true;
+		sensorList = cmnInst.fetch_sensor_list();
+		std::lock_guard<std::mutex> _lock(sens_cb_mutex);
+		for (struct therm_sensor sens: sensorList) {
+			thermalConfig[sens.tzn] = sens;
+			cmnInst.read_temperature(sens);
+			cmnInst.estimateSeverity(sens);
+			cmnInst.initThreshold(sens);
+		}
+	}
+}
+
 int ThermalUtils::readTemperatures(hidl_vec<Temperature_1_0>& temp)
 {
 	std::unordered_map<int, struct therm_sensor>::iterator it;
diff --git a/thermalUtilsNetlink.h b/thermalUtilsNetlink.h
index 7d9abff..dc72f5c 100644
--- a/thermalUtilsNetlink.h
+++ b/thermalUtilsNetlink.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -81,6 +82,7 @@
 
 		void eventParse(int tzn, int trip);
 		void sampleParse(int tzn, int temp);
+		void eventCreateParse(int tzn, const char *name);
 		void Notify(struct therm_sensor& sens);
 };