Patch[2/2] Adding_Notification_Support_to_Coretemp

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

This is the second patch in the series.
This patch adds support for coretemp to notify the
threshold violations using netlink events.

This patch has a dependency on the patch 
"Adding Notification support to the thermal framework"
which can be downloaded from here:
https://patchwork.kernel.org/patch/282042/

Kindly review and merge.
------------------------------------------------------
From: Durgadoss R <durgadoss.r@xxxxxxxxx>

Date: Sat, 18 Dec 2010 07:23:21 +0530
Subject: [PATCH 2/2] Adding_Notification_Support_to_Coretemp

Thos patch adds event notification support to coretemp.
Whenever a threshold interrupt occurs, it is notified to
the user space by a netlink event.

Signed-off-by: Durgadoss R <durgadoss.r@xxxxxxxxx>

---
 drivers/hwmon/coretemp.c |   45 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
index 025902f..c28a61f 100644
--- a/drivers/hwmon/coretemp.c
+++ b/drivers/hwmon/coretemp.c
@@ -37,9 +37,16 @@
 #include <asm/processor.h>
 #include <asm/smp.h>
 #include <asm/mce.h>
+#include <linux/thermal.h>
 
 #define DRVNAME	"coretemp"
 
+/* An identification number to the DTS sensor.
+ * This will help the user space to figure out which
+ * sensor caused the event
+ */
+#define DTS_ID 0
+
 enum attributes { SHOW_TEMP, SHOW_TJMAX, CORE_TTARGET, CORE_TMIN, SHOW_LABEL,
 		SHOW_NAME, SHOW_CRIT_ALARM, SHOW_MAX_ALARM } attrs;
 
@@ -68,6 +75,22 @@ struct coretemp_data {
 static void update_alarm(struct coretemp_data *data);
 static int set_core_threshold(struct coretemp_data *data, int temp, int thres);
 
+/* Interrupt Handlers for core/package thresholds */
+struct work_struct *t0_netlink_handlr;
+struct work_struct *t1_netlink_handlr;
+
+/* Send netlink event for DTS sensor reaching threshold0 */
+static void gen_netlink_t0(struct work_struct *work)
+{
+	generate_netlink_event(DTS_ID, THERMAL_AUX0);
+}
+
+/* Send netlink event for DTS sensor reaching threshold1 */
+static void gen_netlink_t1(struct work_struct *work)
+{
+	generate_netlink_event(DTS_ID, THERMAL_AUX1);
+}
+
 /*
  * Sysfs stuff
  */
@@ -368,15 +391,19 @@ static int coretemp_interrupt(__u64 msr_val)
 {
 
 	if (msr_val & THERM_LOG_THRESHOLD0) {
-		if (!(msr_val & THERM_STATUS_THRESHOLD0))
+		if (!(msr_val & THERM_STATUS_THRESHOLD0)) {
 			pr_info("%s:Lower Threshold Reached\n", __func__);
+			schedule_work(t0_netlink_handlr);
+		}
 		/* Reset the Threshold0 interrupt */
 		wrmsrl(MSR_IA32_THERM_STATUS, msr_val & ~THERM_LOG_THRESHOLD0);
 	}
 
 	if (msr_val & THERM_LOG_THRESHOLD1) {
-		if (msr_val & THERM_STATUS_THRESHOLD1)
+		if (msr_val & THERM_STATUS_THRESHOLD1) {
 			pr_info("%s:Upper Threshold Reached\n", __func__);
+			schedule_work(t1_netlink_handlr);
+		}
 		/* Reset the Threshold1 interrupt */
 		wrmsrl(MSR_IA32_THERM_STATUS, msr_val & ~THERM_LOG_THRESHOLD1);
 	}
@@ -743,6 +770,20 @@ static int __init coretemp_init(void)
 #endif
 
 	register_hotcpu_notifier(&coretemp_cpu_notifier);
+
+	/* Initialize the Interrupt Handlers */
+	t0_netlink_handlr = kzalloc(sizeof(struct work_struct), GFP_KERNEL);
+	if (!t0_netlink_handlr)
+		return -ENOMEM;
+
+	t1_netlink_handlr = kzalloc(sizeof(struct work_struct), GFP_KERNEL);
+	if (!t1_netlink_handlr) {
+		kfree(t0_netlink_handlr);
+		return -ENOMEM;
+	}
+	INIT_WORK(t0_netlink_handlr, (void *)gen_netlink_t0);
+	INIT_WORK(t1_netlink_handlr, (void *)gen_netlink_t1);
+
 	return 0;
 
 #ifndef CONFIG_HOTPLUG_CPU
-- 
1.6.5.2

Attachment: 0002-Adding_Notification_Support_to_Coretemp.patch
Description: 0002-Adding_Notification_Support_to_Coretemp.patch

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux