cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

thermal.c (31613B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  acpi_thermal.c - ACPI Thermal Zone Driver ($Revision: 41 $)
      4 *
      5 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
      6 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
      7 *
      8 *  This driver fully implements the ACPI thermal policy as described in the
      9 *  ACPI 2.0 Specification.
     10 *
     11 *  TBD: 1. Implement passive cooling hysteresis.
     12 *       2. Enhance passive cooling (CPU) states/limit interface to support
     13 *          concepts of 'multiple limiters', upper/lower limits, etc.
     14 */
     15
     16#define pr_fmt(fmt) "ACPI: thermal: " fmt
     17
     18#include <linux/kernel.h>
     19#include <linux/module.h>
     20#include <linux/dmi.h>
     21#include <linux/init.h>
     22#include <linux/slab.h>
     23#include <linux/types.h>
     24#include <linux/jiffies.h>
     25#include <linux/kmod.h>
     26#include <linux/reboot.h>
     27#include <linux/device.h>
     28#include <linux/thermal.h>
     29#include <linux/acpi.h>
     30#include <linux/workqueue.h>
     31#include <linux/uaccess.h>
     32#include <linux/units.h>
     33
     34#define ACPI_THERMAL_CLASS		"thermal_zone"
     35#define ACPI_THERMAL_DEVICE_NAME	"Thermal Zone"
     36#define ACPI_THERMAL_NOTIFY_TEMPERATURE	0x80
     37#define ACPI_THERMAL_NOTIFY_THRESHOLDS	0x81
     38#define ACPI_THERMAL_NOTIFY_DEVICES	0x82
     39#define ACPI_THERMAL_NOTIFY_CRITICAL	0xF0
     40#define ACPI_THERMAL_NOTIFY_HOT		0xF1
     41#define ACPI_THERMAL_MODE_ACTIVE	0x00
     42
     43#define ACPI_THERMAL_MAX_ACTIVE	10
     44#define ACPI_THERMAL_MAX_LIMIT_STR_LEN 65
     45
     46MODULE_AUTHOR("Paul Diefenbaugh");
     47MODULE_DESCRIPTION("ACPI Thermal Zone Driver");
     48MODULE_LICENSE("GPL");
     49
     50static int act;
     51module_param(act, int, 0644);
     52MODULE_PARM_DESC(act, "Disable or override all lowest active trip points.");
     53
     54static int crt;
     55module_param(crt, int, 0644);
     56MODULE_PARM_DESC(crt, "Disable or lower all critical trip points.");
     57
     58static int tzp;
     59module_param(tzp, int, 0444);
     60MODULE_PARM_DESC(tzp, "Thermal zone polling frequency, in 1/10 seconds.");
     61
     62static int nocrt;
     63module_param(nocrt, int, 0);
     64MODULE_PARM_DESC(nocrt, "Set to take no action upon ACPI thermal zone critical trips points.");
     65
     66static int off;
     67module_param(off, int, 0);
     68MODULE_PARM_DESC(off, "Set to disable ACPI thermal support.");
     69
     70static int psv;
     71module_param(psv, int, 0644);
     72MODULE_PARM_DESC(psv, "Disable or override all passive trip points.");
     73
     74static struct workqueue_struct *acpi_thermal_pm_queue;
     75
     76static int acpi_thermal_add(struct acpi_device *device);
     77static int acpi_thermal_remove(struct acpi_device *device);
     78static void acpi_thermal_notify(struct acpi_device *device, u32 event);
     79
     80static const struct acpi_device_id  thermal_device_ids[] = {
     81	{ACPI_THERMAL_HID, 0},
     82	{"", 0},
     83};
     84MODULE_DEVICE_TABLE(acpi, thermal_device_ids);
     85
     86#ifdef CONFIG_PM_SLEEP
     87static int acpi_thermal_suspend(struct device *dev);
     88static int acpi_thermal_resume(struct device *dev);
     89#else
     90#define acpi_thermal_suspend NULL
     91#define acpi_thermal_resume NULL
     92#endif
     93static SIMPLE_DEV_PM_OPS(acpi_thermal_pm, acpi_thermal_suspend, acpi_thermal_resume);
     94
     95static struct acpi_driver acpi_thermal_driver = {
     96	.name = "thermal",
     97	.class = ACPI_THERMAL_CLASS,
     98	.ids = thermal_device_ids,
     99	.ops = {
    100		.add = acpi_thermal_add,
    101		.remove = acpi_thermal_remove,
    102		.notify = acpi_thermal_notify,
    103		},
    104	.drv.pm = &acpi_thermal_pm,
    105};
    106
    107struct acpi_thermal_state {
    108	u8 critical:1;
    109	u8 hot:1;
    110	u8 passive:1;
    111	u8 active:1;
    112	u8 reserved:4;
    113	int active_index;
    114};
    115
    116struct acpi_thermal_state_flags {
    117	u8 valid:1;
    118	u8 enabled:1;
    119	u8 reserved:6;
    120};
    121
    122struct acpi_thermal_critical {
    123	struct acpi_thermal_state_flags flags;
    124	unsigned long temperature;
    125};
    126
    127struct acpi_thermal_hot {
    128	struct acpi_thermal_state_flags flags;
    129	unsigned long temperature;
    130};
    131
    132struct acpi_thermal_passive {
    133	struct acpi_thermal_state_flags flags;
    134	unsigned long temperature;
    135	unsigned long tc1;
    136	unsigned long tc2;
    137	unsigned long tsp;
    138	struct acpi_handle_list devices;
    139};
    140
    141struct acpi_thermal_active {
    142	struct acpi_thermal_state_flags flags;
    143	unsigned long temperature;
    144	struct acpi_handle_list devices;
    145};
    146
    147struct acpi_thermal_trips {
    148	struct acpi_thermal_critical critical;
    149	struct acpi_thermal_hot hot;
    150	struct acpi_thermal_passive passive;
    151	struct acpi_thermal_active active[ACPI_THERMAL_MAX_ACTIVE];
    152};
    153
    154struct acpi_thermal_flags {
    155	u8 cooling_mode:1;	/* _SCP */
    156	u8 devices:1;		/* _TZD */
    157	u8 reserved:6;
    158};
    159
    160struct acpi_thermal {
    161	struct acpi_device * device;
    162	acpi_bus_id name;
    163	unsigned long temperature;
    164	unsigned long last_temperature;
    165	unsigned long polling_frequency;
    166	volatile u8 zombie;
    167	struct acpi_thermal_flags flags;
    168	struct acpi_thermal_state state;
    169	struct acpi_thermal_trips trips;
    170	struct acpi_handle_list devices;
    171	struct thermal_zone_device *thermal_zone;
    172	int kelvin_offset;	/* in millidegrees */
    173	struct work_struct thermal_check_work;
    174	struct mutex thermal_check_lock;
    175	refcount_t thermal_check_count;
    176};
    177
    178/* --------------------------------------------------------------------------
    179                             Thermal Zone Management
    180   -------------------------------------------------------------------------- */
    181
    182static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
    183{
    184	acpi_status status = AE_OK;
    185	unsigned long long tmp;
    186
    187	if (!tz)
    188		return -EINVAL;
    189
    190	tz->last_temperature = tz->temperature;
    191
    192	status = acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tmp);
    193	if (ACPI_FAILURE(status))
    194		return -ENODEV;
    195
    196	tz->temperature = tmp;
    197
    198	acpi_handle_debug(tz->device->handle, "Temperature is %lu dK\n",
    199			  tz->temperature);
    200
    201	return 0;
    202}
    203
    204static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
    205{
    206	acpi_status status = AE_OK;
    207	unsigned long long tmp;
    208
    209	if (!tz)
    210		return -EINVAL;
    211
    212	status = acpi_evaluate_integer(tz->device->handle, "_TZP", NULL, &tmp);
    213	if (ACPI_FAILURE(status))
    214		return -ENODEV;
    215
    216	tz->polling_frequency = tmp;
    217	acpi_handle_debug(tz->device->handle, "Polling frequency is %lu dS\n",
    218			  tz->polling_frequency);
    219
    220	return 0;
    221}
    222
    223static int acpi_thermal_set_cooling_mode(struct acpi_thermal *tz, int mode)
    224{
    225	if (!tz)
    226		return -EINVAL;
    227
    228	if (ACPI_FAILURE(acpi_execute_simple_method(tz->device->handle,
    229						    "_SCP", mode)))
    230		return -ENODEV;
    231
    232	return 0;
    233}
    234
    235#define ACPI_TRIPS_CRITICAL	0x01
    236#define ACPI_TRIPS_HOT		0x02
    237#define ACPI_TRIPS_PASSIVE	0x04
    238#define ACPI_TRIPS_ACTIVE	0x08
    239#define ACPI_TRIPS_DEVICES	0x10
    240
    241#define ACPI_TRIPS_REFRESH_THRESHOLDS	(ACPI_TRIPS_PASSIVE | ACPI_TRIPS_ACTIVE)
    242#define ACPI_TRIPS_REFRESH_DEVICES	ACPI_TRIPS_DEVICES
    243
    244#define ACPI_TRIPS_INIT      (ACPI_TRIPS_CRITICAL | ACPI_TRIPS_HOT |	\
    245			      ACPI_TRIPS_PASSIVE | ACPI_TRIPS_ACTIVE |	\
    246			      ACPI_TRIPS_DEVICES)
    247
    248/*
    249 * This exception is thrown out in two cases:
    250 * 1.An invalid trip point becomes invalid or a valid trip point becomes invalid
    251 *   when re-evaluating the AML code.
    252 * 2.TODO: Devices listed in _PSL, _ALx, _TZD may change.
    253 *   We need to re-bind the cooling devices of a thermal zone when this occurs.
    254 */
    255#define ACPI_THERMAL_TRIPS_EXCEPTION(flags, tz, str)	\
    256do {	\
    257	if (flags != ACPI_TRIPS_INIT)	\
    258		acpi_handle_info(tz->device->handle,	\
    259		"ACPI thermal trip point %s changed\n"	\
    260		"Please report to linux-acpi@vger.kernel.org\n", str); \
    261} while (0)
    262
    263static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
    264{
    265	acpi_status status = AE_OK;
    266	unsigned long long tmp;
    267	struct acpi_handle_list devices;
    268	int valid = 0;
    269	int i;
    270
    271	/* Critical Shutdown */
    272	if (flag & ACPI_TRIPS_CRITICAL) {
    273		status = acpi_evaluate_integer(tz->device->handle,
    274				"_CRT", NULL, &tmp);
    275		tz->trips.critical.temperature = tmp;
    276		/*
    277		 * Treat freezing temperatures as invalid as well; some
    278		 * BIOSes return really low values and cause reboots at startup.
    279		 * Below zero (Celsius) values clearly aren't right for sure..
    280		 * ... so lets discard those as invalid.
    281		 */
    282		if (ACPI_FAILURE(status)) {
    283			tz->trips.critical.flags.valid = 0;
    284			acpi_handle_debug(tz->device->handle,
    285					  "No critical threshold\n");
    286		} else if (tmp <= 2732) {
    287			pr_info(FW_BUG "Invalid critical threshold (%llu)\n",
    288				tmp);
    289			tz->trips.critical.flags.valid = 0;
    290		} else {
    291			tz->trips.critical.flags.valid = 1;
    292			acpi_handle_debug(tz->device->handle,
    293					  "Found critical threshold [%lu]\n",
    294					  tz->trips.critical.temperature);
    295		}
    296		if (tz->trips.critical.flags.valid == 1) {
    297			if (crt == -1) {
    298				tz->trips.critical.flags.valid = 0;
    299			} else if (crt > 0) {
    300				unsigned long crt_k = celsius_to_deci_kelvin(crt);
    301
    302				/*
    303				 * Allow override critical threshold
    304				 */
    305				if (crt_k > tz->trips.critical.temperature)
    306					pr_info("Critical threshold %d C\n", crt);
    307
    308				tz->trips.critical.temperature = crt_k;
    309			}
    310		}
    311	}
    312
    313	/* Critical Sleep (optional) */
    314	if (flag & ACPI_TRIPS_HOT) {
    315		status = acpi_evaluate_integer(tz->device->handle,
    316				"_HOT", NULL, &tmp);
    317		if (ACPI_FAILURE(status)) {
    318			tz->trips.hot.flags.valid = 0;
    319			acpi_handle_debug(tz->device->handle,
    320					  "No hot threshold\n");
    321		} else {
    322			tz->trips.hot.temperature = tmp;
    323			tz->trips.hot.flags.valid = 1;
    324			acpi_handle_debug(tz->device->handle,
    325					  "Found hot threshold [%lu]\n",
    326					  tz->trips.hot.temperature);
    327		}
    328	}
    329
    330	/* Passive (optional) */
    331	if (((flag & ACPI_TRIPS_PASSIVE) && tz->trips.passive.flags.valid) ||
    332		(flag == ACPI_TRIPS_INIT)) {
    333		valid = tz->trips.passive.flags.valid;
    334		if (psv == -1) {
    335			status = AE_SUPPORT;
    336		} else if (psv > 0) {
    337			tmp = celsius_to_deci_kelvin(psv);
    338			status = AE_OK;
    339		} else {
    340			status = acpi_evaluate_integer(tz->device->handle,
    341				"_PSV", NULL, &tmp);
    342		}
    343
    344		if (ACPI_FAILURE(status))
    345			tz->trips.passive.flags.valid = 0;
    346		else {
    347			tz->trips.passive.temperature = tmp;
    348			tz->trips.passive.flags.valid = 1;
    349			if (flag == ACPI_TRIPS_INIT) {
    350				status = acpi_evaluate_integer(
    351						tz->device->handle, "_TC1",
    352						NULL, &tmp);
    353				if (ACPI_FAILURE(status))
    354					tz->trips.passive.flags.valid = 0;
    355				else
    356					tz->trips.passive.tc1 = tmp;
    357				status = acpi_evaluate_integer(
    358						tz->device->handle, "_TC2",
    359						NULL, &tmp);
    360				if (ACPI_FAILURE(status))
    361					tz->trips.passive.flags.valid = 0;
    362				else
    363					tz->trips.passive.tc2 = tmp;
    364				status = acpi_evaluate_integer(
    365						tz->device->handle, "_TSP",
    366						NULL, &tmp);
    367				if (ACPI_FAILURE(status))
    368					tz->trips.passive.flags.valid = 0;
    369				else
    370					tz->trips.passive.tsp = tmp;
    371			}
    372		}
    373	}
    374	if ((flag & ACPI_TRIPS_DEVICES) && tz->trips.passive.flags.valid) {
    375		memset(&devices, 0, sizeof(struct acpi_handle_list));
    376		status = acpi_evaluate_reference(tz->device->handle, "_PSL",
    377							NULL, &devices);
    378		if (ACPI_FAILURE(status)) {
    379			acpi_handle_info(tz->device->handle,
    380					 "Invalid passive threshold\n");
    381			tz->trips.passive.flags.valid = 0;
    382		}
    383		else
    384			tz->trips.passive.flags.valid = 1;
    385
    386		if (memcmp(&tz->trips.passive.devices, &devices,
    387				sizeof(struct acpi_handle_list))) {
    388			memcpy(&tz->trips.passive.devices, &devices,
    389				sizeof(struct acpi_handle_list));
    390			ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "device");
    391		}
    392	}
    393	if ((flag & ACPI_TRIPS_PASSIVE) || (flag & ACPI_TRIPS_DEVICES)) {
    394		if (valid != tz->trips.passive.flags.valid)
    395				ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "state");
    396	}
    397
    398	/* Active (optional) */
    399	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
    400		char name[5] = { '_', 'A', 'C', ('0' + i), '\0' };
    401		valid = tz->trips.active[i].flags.valid;
    402
    403		if (act == -1)
    404			break; /* disable all active trip points */
    405
    406		if ((flag == ACPI_TRIPS_INIT) || ((flag & ACPI_TRIPS_ACTIVE) &&
    407			tz->trips.active[i].flags.valid)) {
    408			status = acpi_evaluate_integer(tz->device->handle,
    409							name, NULL, &tmp);
    410			if (ACPI_FAILURE(status)) {
    411				tz->trips.active[i].flags.valid = 0;
    412				if (i == 0)
    413					break;
    414				if (act <= 0)
    415					break;
    416				if (i == 1)
    417					tz->trips.active[0].temperature =
    418						celsius_to_deci_kelvin(act);
    419				else
    420					/*
    421					 * Don't allow override higher than
    422					 * the next higher trip point
    423					 */
    424					tz->trips.active[i - 1].temperature =
    425						(tz->trips.active[i - 2].temperature <
    426						celsius_to_deci_kelvin(act) ?
    427						tz->trips.active[i - 2].temperature :
    428						celsius_to_deci_kelvin(act));
    429				break;
    430			} else {
    431				tz->trips.active[i].temperature = tmp;
    432				tz->trips.active[i].flags.valid = 1;
    433			}
    434		}
    435
    436		name[2] = 'L';
    437		if ((flag & ACPI_TRIPS_DEVICES) && tz->trips.active[i].flags.valid ) {
    438			memset(&devices, 0, sizeof(struct acpi_handle_list));
    439			status = acpi_evaluate_reference(tz->device->handle,
    440						name, NULL, &devices);
    441			if (ACPI_FAILURE(status)) {
    442				acpi_handle_info(tz->device->handle,
    443						 "Invalid active%d threshold\n", i);
    444				tz->trips.active[i].flags.valid = 0;
    445			}
    446			else
    447				tz->trips.active[i].flags.valid = 1;
    448
    449			if (memcmp(&tz->trips.active[i].devices, &devices,
    450					sizeof(struct acpi_handle_list))) {
    451				memcpy(&tz->trips.active[i].devices, &devices,
    452					sizeof(struct acpi_handle_list));
    453				ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "device");
    454			}
    455		}
    456		if ((flag & ACPI_TRIPS_ACTIVE) || (flag & ACPI_TRIPS_DEVICES))
    457			if (valid != tz->trips.active[i].flags.valid)
    458				ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "state");
    459
    460		if (!tz->trips.active[i].flags.valid)
    461			break;
    462	}
    463
    464	if (flag & ACPI_TRIPS_DEVICES) {
    465		memset(&devices, 0, sizeof(devices));
    466		status = acpi_evaluate_reference(tz->device->handle, "_TZD",
    467						NULL, &devices);
    468		if (ACPI_SUCCESS(status)
    469		    && memcmp(&tz->devices, &devices, sizeof(devices))) {
    470			tz->devices = devices;
    471			ACPI_THERMAL_TRIPS_EXCEPTION(flag, tz, "device");
    472		}
    473	}
    474
    475	return 0;
    476}
    477
    478static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
    479{
    480	int i, valid, ret = acpi_thermal_trips_update(tz, ACPI_TRIPS_INIT);
    481
    482	if (ret)
    483		return ret;
    484
    485	valid = tz->trips.critical.flags.valid |
    486		tz->trips.hot.flags.valid |
    487		tz->trips.passive.flags.valid;
    488
    489	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++)
    490		valid |= tz->trips.active[i].flags.valid;
    491
    492	if (!valid) {
    493		pr_warn(FW_BUG "No valid trip found\n");
    494		return -ENODEV;
    495	}
    496	return 0;
    497}
    498
    499/* sys I/F for generic thermal sysfs support */
    500
    501static int thermal_get_temp(struct thermal_zone_device *thermal, int *temp)
    502{
    503	struct acpi_thermal *tz = thermal->devdata;
    504	int result;
    505
    506	if (!tz)
    507		return -EINVAL;
    508
    509	result = acpi_thermal_get_temperature(tz);
    510	if (result)
    511		return result;
    512
    513	*temp = deci_kelvin_to_millicelsius_with_offset(tz->temperature,
    514							tz->kelvin_offset);
    515	return 0;
    516}
    517
    518static int thermal_get_trip_type(struct thermal_zone_device *thermal,
    519				 int trip, enum thermal_trip_type *type)
    520{
    521	struct acpi_thermal *tz = thermal->devdata;
    522	int i;
    523
    524	if (!tz || trip < 0)
    525		return -EINVAL;
    526
    527	if (tz->trips.critical.flags.valid) {
    528		if (!trip) {
    529			*type = THERMAL_TRIP_CRITICAL;
    530			return 0;
    531		}
    532		trip--;
    533	}
    534
    535	if (tz->trips.hot.flags.valid) {
    536		if (!trip) {
    537			*type = THERMAL_TRIP_HOT;
    538			return 0;
    539		}
    540		trip--;
    541	}
    542
    543	if (tz->trips.passive.flags.valid) {
    544		if (!trip) {
    545			*type = THERMAL_TRIP_PASSIVE;
    546			return 0;
    547		}
    548		trip--;
    549	}
    550
    551	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
    552		tz->trips.active[i].flags.valid; i++) {
    553		if (!trip) {
    554			*type = THERMAL_TRIP_ACTIVE;
    555			return 0;
    556		}
    557		trip--;
    558	}
    559
    560	return -EINVAL;
    561}
    562
    563static int thermal_get_trip_temp(struct thermal_zone_device *thermal,
    564				 int trip, int *temp)
    565{
    566	struct acpi_thermal *tz = thermal->devdata;
    567	int i;
    568
    569	if (!tz || trip < 0)
    570		return -EINVAL;
    571
    572	if (tz->trips.critical.flags.valid) {
    573		if (!trip) {
    574			*temp = deci_kelvin_to_millicelsius_with_offset(
    575				tz->trips.critical.temperature,
    576				tz->kelvin_offset);
    577			return 0;
    578		}
    579		trip--;
    580	}
    581
    582	if (tz->trips.hot.flags.valid) {
    583		if (!trip) {
    584			*temp = deci_kelvin_to_millicelsius_with_offset(
    585				tz->trips.hot.temperature,
    586				tz->kelvin_offset);
    587			return 0;
    588		}
    589		trip--;
    590	}
    591
    592	if (tz->trips.passive.flags.valid) {
    593		if (!trip) {
    594			*temp = deci_kelvin_to_millicelsius_with_offset(
    595				tz->trips.passive.temperature,
    596				tz->kelvin_offset);
    597			return 0;
    598		}
    599		trip--;
    600	}
    601
    602	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
    603		tz->trips.active[i].flags.valid; i++) {
    604		if (!trip) {
    605			*temp = deci_kelvin_to_millicelsius_with_offset(
    606				tz->trips.active[i].temperature,
    607				tz->kelvin_offset);
    608			return 0;
    609		}
    610		trip--;
    611	}
    612
    613	return -EINVAL;
    614}
    615
    616static int thermal_get_crit_temp(struct thermal_zone_device *thermal,
    617				int *temperature)
    618{
    619	struct acpi_thermal *tz = thermal->devdata;
    620
    621	if (tz->trips.critical.flags.valid) {
    622		*temperature = deci_kelvin_to_millicelsius_with_offset(
    623				tz->trips.critical.temperature,
    624				tz->kelvin_offset);
    625		return 0;
    626	} else
    627		return -EINVAL;
    628}
    629
    630static int thermal_get_trend(struct thermal_zone_device *thermal,
    631				int trip, enum thermal_trend *trend)
    632{
    633	struct acpi_thermal *tz = thermal->devdata;
    634	enum thermal_trip_type type;
    635	int i;
    636
    637	if (thermal_get_trip_type(thermal, trip, &type))
    638		return -EINVAL;
    639
    640	if (type == THERMAL_TRIP_ACTIVE) {
    641		int trip_temp;
    642		int temp = deci_kelvin_to_millicelsius_with_offset(
    643					tz->temperature, tz->kelvin_offset);
    644		if (thermal_get_trip_temp(thermal, trip, &trip_temp))
    645			return -EINVAL;
    646
    647		if (temp > trip_temp) {
    648			*trend = THERMAL_TREND_RAISING;
    649			return 0;
    650		} else {
    651			/* Fall back on default trend */
    652			return -EINVAL;
    653		}
    654	}
    655
    656	/*
    657	 * tz->temperature has already been updated by generic thermal layer,
    658	 * before this callback being invoked
    659	 */
    660	i = (tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature))
    661		+ (tz->trips.passive.tc2
    662		* (tz->temperature - tz->trips.passive.temperature));
    663
    664	if (i > 0)
    665		*trend = THERMAL_TREND_RAISING;
    666	else if (i < 0)
    667		*trend = THERMAL_TREND_DROPPING;
    668	else
    669		*trend = THERMAL_TREND_STABLE;
    670	return 0;
    671}
    672
    673static void acpi_thermal_zone_device_hot(struct thermal_zone_device *thermal)
    674{
    675	struct acpi_thermal *tz = thermal->devdata;
    676
    677	acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
    678					dev_name(&tz->device->dev),
    679					ACPI_THERMAL_NOTIFY_HOT, 1);
    680}
    681
    682static void acpi_thermal_zone_device_critical(struct thermal_zone_device *thermal)
    683{
    684	struct acpi_thermal *tz = thermal->devdata;
    685
    686	acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
    687					dev_name(&tz->device->dev),
    688					ACPI_THERMAL_NOTIFY_CRITICAL, 1);
    689
    690	thermal_zone_device_critical(thermal);
    691}
    692
    693static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
    694					struct thermal_cooling_device *cdev,
    695					bool bind)
    696{
    697	struct acpi_device *device = cdev->devdata;
    698	struct acpi_thermal *tz = thermal->devdata;
    699	struct acpi_device *dev;
    700	acpi_handle handle;
    701	int i;
    702	int j;
    703	int trip = -1;
    704	int result = 0;
    705
    706	if (tz->trips.critical.flags.valid)
    707		trip++;
    708
    709	if (tz->trips.hot.flags.valid)
    710		trip++;
    711
    712	if (tz->trips.passive.flags.valid) {
    713		trip++;
    714		for (i = 0; i < tz->trips.passive.devices.count;
    715		    i++) {
    716			handle = tz->trips.passive.devices.handles[i];
    717			dev = acpi_fetch_acpi_dev(handle);
    718			if (dev != device)
    719				continue;
    720			if (bind)
    721				result =
    722					thermal_zone_bind_cooling_device
    723					(thermal, trip, cdev,
    724					 THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
    725					 THERMAL_WEIGHT_DEFAULT);
    726			else
    727				result =
    728					thermal_zone_unbind_cooling_device
    729					(thermal, trip, cdev);
    730			if (result)
    731				goto failed;
    732		}
    733	}
    734
    735	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
    736		if (!tz->trips.active[i].flags.valid)
    737			break;
    738		trip++;
    739		for (j = 0;
    740		    j < tz->trips.active[i].devices.count;
    741		    j++) {
    742			handle = tz->trips.active[i].devices.handles[j];
    743			dev = acpi_fetch_acpi_dev(handle);
    744			if (dev != device)
    745				continue;
    746			if (bind)
    747				result = thermal_zone_bind_cooling_device
    748					(thermal, trip, cdev,
    749					 THERMAL_NO_LIMIT, THERMAL_NO_LIMIT,
    750					 THERMAL_WEIGHT_DEFAULT);
    751			else
    752				result = thermal_zone_unbind_cooling_device
    753					(thermal, trip, cdev);
    754			if (result)
    755				goto failed;
    756		}
    757	}
    758
    759failed:
    760	return result;
    761}
    762
    763static int
    764acpi_thermal_bind_cooling_device(struct thermal_zone_device *thermal,
    765					struct thermal_cooling_device *cdev)
    766{
    767	return acpi_thermal_cooling_device_cb(thermal, cdev, true);
    768}
    769
    770static int
    771acpi_thermal_unbind_cooling_device(struct thermal_zone_device *thermal,
    772					struct thermal_cooling_device *cdev)
    773{
    774	return acpi_thermal_cooling_device_cb(thermal, cdev, false);
    775}
    776
    777static struct thermal_zone_device_ops acpi_thermal_zone_ops = {
    778	.bind = acpi_thermal_bind_cooling_device,
    779	.unbind	= acpi_thermal_unbind_cooling_device,
    780	.get_temp = thermal_get_temp,
    781	.get_trip_type = thermal_get_trip_type,
    782	.get_trip_temp = thermal_get_trip_temp,
    783	.get_crit_temp = thermal_get_crit_temp,
    784	.get_trend = thermal_get_trend,
    785	.hot = acpi_thermal_zone_device_hot,
    786	.critical = acpi_thermal_zone_device_critical,
    787};
    788
    789static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
    790{
    791	int trips = 0;
    792	int result;
    793	acpi_status status;
    794	int i;
    795
    796	if (tz->trips.critical.flags.valid)
    797		trips++;
    798
    799	if (tz->trips.hot.flags.valid)
    800		trips++;
    801
    802	if (tz->trips.passive.flags.valid)
    803		trips++;
    804
    805	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
    806			tz->trips.active[i].flags.valid; i++, trips++);
    807
    808	if (tz->trips.passive.flags.valid)
    809		tz->thermal_zone =
    810			thermal_zone_device_register("acpitz", trips, 0, tz,
    811						&acpi_thermal_zone_ops, NULL,
    812						     tz->trips.passive.tsp*100,
    813						     tz->polling_frequency*100);
    814	else
    815		tz->thermal_zone =
    816			thermal_zone_device_register("acpitz", trips, 0, tz,
    817						&acpi_thermal_zone_ops, NULL,
    818						0, tz->polling_frequency*100);
    819	if (IS_ERR(tz->thermal_zone))
    820		return -ENODEV;
    821
    822	result = sysfs_create_link(&tz->device->dev.kobj,
    823				   &tz->thermal_zone->device.kobj, "thermal_zone");
    824	if (result)
    825		goto unregister_tzd;
    826
    827	result = sysfs_create_link(&tz->thermal_zone->device.kobj,
    828				   &tz->device->dev.kobj, "device");
    829	if (result)
    830		goto remove_tz_link;
    831
    832	status =  acpi_bus_attach_private_data(tz->device->handle,
    833					       tz->thermal_zone);
    834	if (ACPI_FAILURE(status)) {
    835		result = -ENODEV;
    836		goto remove_dev_link;
    837	}
    838
    839	result = thermal_zone_device_enable(tz->thermal_zone);
    840	if (result)
    841		goto acpi_bus_detach;
    842
    843	dev_info(&tz->device->dev, "registered as thermal_zone%d\n",
    844		 tz->thermal_zone->id);
    845
    846	return 0;
    847
    848acpi_bus_detach:
    849	acpi_bus_detach_private_data(tz->device->handle);
    850remove_dev_link:
    851	sysfs_remove_link(&tz->thermal_zone->device.kobj, "device");
    852remove_tz_link:
    853	sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
    854unregister_tzd:
    855	thermal_zone_device_unregister(tz->thermal_zone);
    856
    857	return result;
    858}
    859
    860static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
    861{
    862	sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
    863	sysfs_remove_link(&tz->thermal_zone->device.kobj, "device");
    864	thermal_zone_device_unregister(tz->thermal_zone);
    865	tz->thermal_zone = NULL;
    866	acpi_bus_detach_private_data(tz->device->handle);
    867}
    868
    869
    870/* --------------------------------------------------------------------------
    871                                 Driver Interface
    872   -------------------------------------------------------------------------- */
    873
    874static void acpi_queue_thermal_check(struct acpi_thermal *tz)
    875{
    876	if (!work_pending(&tz->thermal_check_work))
    877		queue_work(acpi_thermal_pm_queue, &tz->thermal_check_work);
    878}
    879
    880static void acpi_thermal_notify(struct acpi_device *device, u32 event)
    881{
    882	struct acpi_thermal *tz = acpi_driver_data(device);
    883
    884
    885	if (!tz)
    886		return;
    887
    888	switch (event) {
    889	case ACPI_THERMAL_NOTIFY_TEMPERATURE:
    890		acpi_queue_thermal_check(tz);
    891		break;
    892	case ACPI_THERMAL_NOTIFY_THRESHOLDS:
    893		acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_THRESHOLDS);
    894		acpi_queue_thermal_check(tz);
    895		acpi_bus_generate_netlink_event(device->pnp.device_class,
    896						  dev_name(&device->dev), event, 0);
    897		break;
    898	case ACPI_THERMAL_NOTIFY_DEVICES:
    899		acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_DEVICES);
    900		acpi_queue_thermal_check(tz);
    901		acpi_bus_generate_netlink_event(device->pnp.device_class,
    902						  dev_name(&device->dev), event, 0);
    903		break;
    904	default:
    905		acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n",
    906				  event);
    907		break;
    908	}
    909}
    910
    911/*
    912 * On some platforms, the AML code has dependency about
    913 * the evaluating order of _TMP and _CRT/_HOT/_PSV/_ACx.
    914 * 1. On HP Pavilion G4-1016tx, _TMP must be invoked after
    915 *    /_CRT/_HOT/_PSV/_ACx, or else system will be power off.
    916 * 2. On HP Compaq 6715b/6715s, the return value of _PSV is 0
    917 *    if _TMP has never been evaluated.
    918 *
    919 * As this dependency is totally transparent to OS, evaluate
    920 * all of them once, in the order of _CRT/_HOT/_PSV/_ACx,
    921 * _TMP, before they are actually used.
    922 */
    923static void acpi_thermal_aml_dependency_fix(struct acpi_thermal *tz)
    924{
    925	acpi_handle handle = tz->device->handle;
    926	unsigned long long value;
    927	int i;
    928
    929	acpi_evaluate_integer(handle, "_CRT", NULL, &value);
    930	acpi_evaluate_integer(handle, "_HOT", NULL, &value);
    931	acpi_evaluate_integer(handle, "_PSV", NULL, &value);
    932	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
    933		char name[5] = { '_', 'A', 'C', ('0' + i), '\0' };
    934		acpi_status status;
    935
    936		status = acpi_evaluate_integer(handle, name, NULL, &value);
    937		if (status == AE_NOT_FOUND)
    938			break;
    939	}
    940	acpi_evaluate_integer(handle, "_TMP", NULL, &value);
    941}
    942
    943static int acpi_thermal_get_info(struct acpi_thermal *tz)
    944{
    945	int result = 0;
    946
    947
    948	if (!tz)
    949		return -EINVAL;
    950
    951	acpi_thermal_aml_dependency_fix(tz);
    952
    953	/* Get trip points [_CRT, _PSV, etc.] (required) */
    954	result = acpi_thermal_get_trip_points(tz);
    955	if (result)
    956		return result;
    957
    958	/* Get temperature [_TMP] (required) */
    959	result = acpi_thermal_get_temperature(tz);
    960	if (result)
    961		return result;
    962
    963	/* Set the cooling mode [_SCP] to active cooling (default) */
    964	result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE);
    965	if (!result)
    966		tz->flags.cooling_mode = 1;
    967
    968	/* Get default polling frequency [_TZP] (optional) */
    969	if (tzp)
    970		tz->polling_frequency = tzp;
    971	else
    972		acpi_thermal_get_polling_frequency(tz);
    973
    974	return 0;
    975}
    976
    977/*
    978 * The exact offset between Kelvin and degree Celsius is 273.15. However ACPI
    979 * handles temperature values with a single decimal place. As a consequence,
    980 * some implementations use an offset of 273.1 and others use an offset of
    981 * 273.2. Try to find out which one is being used, to present the most
    982 * accurate and visually appealing number.
    983 *
    984 * The heuristic below should work for all ACPI thermal zones which have a
    985 * critical trip point with a value being a multiple of 0.5 degree Celsius.
    986 */
    987static void acpi_thermal_guess_offset(struct acpi_thermal *tz)
    988{
    989	if (tz->trips.critical.flags.valid &&
    990	    (tz->trips.critical.temperature % 5) == 1)
    991		tz->kelvin_offset = 273100;
    992	else
    993		tz->kelvin_offset = 273200;
    994}
    995
    996static void acpi_thermal_check_fn(struct work_struct *work)
    997{
    998	struct acpi_thermal *tz = container_of(work, struct acpi_thermal,
    999					       thermal_check_work);
   1000
   1001	/*
   1002	 * In general, it is not sufficient to check the pending bit, because
   1003	 * subsequent instances of this function may be queued after one of them
   1004	 * has started running (e.g. if _TMP sleeps).  Avoid bailing out if just
   1005	 * one of them is running, though, because it may have done the actual
   1006	 * check some time ago, so allow at least one of them to block on the
   1007	 * mutex while another one is running the update.
   1008	 */
   1009	if (!refcount_dec_not_one(&tz->thermal_check_count))
   1010		return;
   1011
   1012	mutex_lock(&tz->thermal_check_lock);
   1013
   1014	thermal_zone_device_update(tz->thermal_zone, THERMAL_EVENT_UNSPECIFIED);
   1015
   1016	refcount_inc(&tz->thermal_check_count);
   1017
   1018	mutex_unlock(&tz->thermal_check_lock);
   1019}
   1020
   1021static int acpi_thermal_add(struct acpi_device *device)
   1022{
   1023	int result = 0;
   1024	struct acpi_thermal *tz = NULL;
   1025
   1026
   1027	if (!device)
   1028		return -EINVAL;
   1029
   1030	tz = kzalloc(sizeof(struct acpi_thermal), GFP_KERNEL);
   1031	if (!tz)
   1032		return -ENOMEM;
   1033
   1034	tz->device = device;
   1035	strcpy(tz->name, device->pnp.bus_id);
   1036	strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
   1037	strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
   1038	device->driver_data = tz;
   1039
   1040	result = acpi_thermal_get_info(tz);
   1041	if (result)
   1042		goto free_memory;
   1043
   1044	acpi_thermal_guess_offset(tz);
   1045
   1046	result = acpi_thermal_register_thermal_zone(tz);
   1047	if (result)
   1048		goto free_memory;
   1049
   1050	refcount_set(&tz->thermal_check_count, 3);
   1051	mutex_init(&tz->thermal_check_lock);
   1052	INIT_WORK(&tz->thermal_check_work, acpi_thermal_check_fn);
   1053
   1054	pr_info("%s [%s] (%ld C)\n", acpi_device_name(device),
   1055		acpi_device_bid(device), deci_kelvin_to_celsius(tz->temperature));
   1056	goto end;
   1057
   1058free_memory:
   1059	kfree(tz);
   1060end:
   1061	return result;
   1062}
   1063
   1064static int acpi_thermal_remove(struct acpi_device *device)
   1065{
   1066	struct acpi_thermal *tz = NULL;
   1067
   1068	if (!device || !acpi_driver_data(device))
   1069		return -EINVAL;
   1070
   1071	flush_workqueue(acpi_thermal_pm_queue);
   1072	tz = acpi_driver_data(device);
   1073
   1074	acpi_thermal_unregister_thermal_zone(tz);
   1075	kfree(tz);
   1076	return 0;
   1077}
   1078
   1079#ifdef CONFIG_PM_SLEEP
   1080static int acpi_thermal_suspend(struct device *dev)
   1081{
   1082	/* Make sure the previously queued thermal check work has been done */
   1083	flush_workqueue(acpi_thermal_pm_queue);
   1084	return 0;
   1085}
   1086
   1087static int acpi_thermal_resume(struct device *dev)
   1088{
   1089	struct acpi_thermal *tz;
   1090	int i, j, power_state, result;
   1091
   1092	if (!dev)
   1093		return -EINVAL;
   1094
   1095	tz = acpi_driver_data(to_acpi_device(dev));
   1096	if (!tz)
   1097		return -EINVAL;
   1098
   1099	for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
   1100		if (!tz->trips.active[i].flags.valid)
   1101			break;
   1102		tz->trips.active[i].flags.enabled = 1;
   1103		for (j = 0; j < tz->trips.active[i].devices.count; j++) {
   1104			result = acpi_bus_update_power(
   1105					tz->trips.active[i].devices.handles[j],
   1106					&power_state);
   1107			if (result || (power_state != ACPI_STATE_D0)) {
   1108				tz->trips.active[i].flags.enabled = 0;
   1109				break;
   1110			}
   1111		}
   1112		tz->state.active |= tz->trips.active[i].flags.enabled;
   1113	}
   1114
   1115	acpi_queue_thermal_check(tz);
   1116
   1117	return AE_OK;
   1118}
   1119#endif
   1120
   1121static int thermal_act(const struct dmi_system_id *d) {
   1122
   1123	if (act == 0) {
   1124		pr_notice("%s detected: disabling all active thermal trip points\n",
   1125			  d->ident);
   1126		act = -1;
   1127	}
   1128	return 0;
   1129}
   1130static int thermal_nocrt(const struct dmi_system_id *d) {
   1131
   1132	pr_notice("%s detected: disabling all critical thermal trip point actions.\n",
   1133		  d->ident);
   1134	nocrt = 1;
   1135	return 0;
   1136}
   1137static int thermal_tzp(const struct dmi_system_id *d) {
   1138
   1139	if (tzp == 0) {
   1140		pr_notice("%s detected: enabling thermal zone polling\n",
   1141			  d->ident);
   1142		tzp = 300;	/* 300 dS = 30 Seconds */
   1143	}
   1144	return 0;
   1145}
   1146static int thermal_psv(const struct dmi_system_id *d) {
   1147
   1148	if (psv == 0) {
   1149		pr_notice("%s detected: disabling all passive thermal trip points\n",
   1150			  d->ident);
   1151		psv = -1;
   1152	}
   1153	return 0;
   1154}
   1155
   1156static const struct dmi_system_id thermal_dmi_table[] __initconst = {
   1157	/*
   1158	 * Award BIOS on this AOpen makes thermal control almost worthless.
   1159	 * http://bugzilla.kernel.org/show_bug.cgi?id=8842
   1160	 */
   1161	{
   1162	 .callback = thermal_act,
   1163	 .ident = "AOpen i915GMm-HFS",
   1164	 .matches = {
   1165		DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
   1166		DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
   1167		},
   1168	},
   1169	{
   1170	 .callback = thermal_psv,
   1171	 .ident = "AOpen i915GMm-HFS",
   1172	 .matches = {
   1173		DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
   1174		DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
   1175		},
   1176	},
   1177	{
   1178	 .callback = thermal_tzp,
   1179	 .ident = "AOpen i915GMm-HFS",
   1180	 .matches = {
   1181		DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
   1182		DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
   1183		},
   1184	},
   1185	{
   1186	 .callback = thermal_nocrt,
   1187	 .ident = "Gigabyte GA-7ZX",
   1188	 .matches = {
   1189		DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
   1190		DMI_MATCH(DMI_BOARD_NAME, "7ZX"),
   1191		},
   1192	},
   1193	{}
   1194};
   1195
   1196static int __init acpi_thermal_init(void)
   1197{
   1198	int result = 0;
   1199
   1200	dmi_check_system(thermal_dmi_table);
   1201
   1202	if (off) {
   1203		pr_notice("thermal control disabled\n");
   1204		return -ENODEV;
   1205	}
   1206
   1207	acpi_thermal_pm_queue = alloc_workqueue("acpi_thermal_pm",
   1208						WQ_HIGHPRI | WQ_MEM_RECLAIM, 0);
   1209	if (!acpi_thermal_pm_queue)
   1210		return -ENODEV;
   1211
   1212	result = acpi_bus_register_driver(&acpi_thermal_driver);
   1213	if (result < 0) {
   1214		destroy_workqueue(acpi_thermal_pm_queue);
   1215		return -ENODEV;
   1216	}
   1217
   1218	return 0;
   1219}
   1220
   1221static void __exit acpi_thermal_exit(void)
   1222{
   1223	acpi_bus_unregister_driver(&acpi_thermal_driver);
   1224	destroy_workqueue(acpi_thermal_pm_queue);
   1225
   1226	return;
   1227}
   1228
   1229module_init(acpi_thermal_init);
   1230module_exit(acpi_thermal_exit);