brintos

brintos / linux-shallow public Read only

0
0
Text · 5.6 KiB · ba11d70 Raw
222 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright 2024, Intel Corporation4 *5 * Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>6 *7 * Thermal subsystem testing facility.8 *9 * This facility allows the thermal core functionality to be exercised in a10 * controlled way in order to verify its behavior.11 *12 * It resides in the "thermal-testing" directory under the debugfs root and13 * starts with a single file called "command" which can be written a string14 * representing a thermal testing facility command.15 *16 * The currently supported commands are listed in the tt_commands enum below.17 *18 * The "addtz" command causes a new test thermal zone template to be created,19 * for example:20 *21 * # echo addtz > /sys/kernel/debug/thermal-testing/command22 *23 * That template will be represented as a subdirectory in the "thermal-testing"24 * directory, for example25 *26 * # ls /sys/kernel/debug/thermal-testing/27 * command tz028 *29 * The thermal zone template can be populated with trip points with the help of30 * the "tzaddtrip" command, for example:31 *32 * # echo tzaddtrip:0 > /sys/kernel/debug/thermal-testing/command33 *34 * which causes a trip point template to be added to the test thermal zone35 * template 0 (represented by the tz0 subdirectory in "thermal-testing").36 *37 * # ls /sys/kernel/debug/thermal-testing/tz038 * init_temp temp trip_0_temp trip_0_hyst39 *40 * The temperature of a trip point template is initially THERMAL_TEMP_INVALID41 * and its hysteresis is initially 0.  They can be adjusted by writing to the42 * "trip_x_temp" and "trip_x_hyst" files correspoinding to that trip point43 * template, respectively.44 *45 * The initial temperature of a thermal zone based on a template can be set by46 * writing to the "init_temp" file in its directory under "thermal-testing", for47 * example:48 *49 * echo 50000 > /sys/kernel/debug/thermal-testing/tz0/init_temp50 *51 * When ready, "tzreg" command can be used for registering and enabling a52 * thermal zone based on a given template with the thermal core, for example53 *54 * # echo tzreg:0 > /sys/kernel/debug/thermal-testing/command55 *56 * In this case, test thermal zone template 0 is used for registering a new57 * thermal zone and the set of trip point templates associated with it is used58 * for populating the new thermal zone's trip points table.  The type of the new59 * thermal zone is "test_tz".60 *61 * The temperature and hysteresis of all of the trip points in that new thermal62 * zone are adjustable via sysfs, so they can be updated at any time.63 *64 * The current temperature of the new thermal zone can be set by writing to the65 * "temp" file in the corresponding thermal zone template's directory under66 * "thermal-testing", for example67 *68 * echo 10000 > /sys/kernel/debug/thermal-testing/tz0/temp69 *70 * which will also trigger a temperature update for this zone in the thermal71 * core, including checking its trip points, sending notifications to user space72 * if any of them have been crossed and so on.73 *74 * When it is not needed any more, a test thermal zone template can be deleted75 * with the help of the "deltz" command, for example76 *77 * # echo deltz:0 > /sys/kernel/debug/thermal-testing/command78 *79 * which will also unregister the thermal zone based on it, if present.80 */81 82#define pr_fmt(fmt) "thermal-testing: " fmt83 84#include <linux/debugfs.h>85#include <linux/module.h>86 87#include "thermal_testing.h"88 89struct dentry *d_testing;90 91#define TT_COMMAND_SIZE		1692 93enum tt_commands {94	TT_CMD_ADDTZ,95	TT_CMD_DELTZ,96	TT_CMD_TZADDTRIP,97	TT_CMD_TZREG,98	TT_CMD_TZUNREG,99};100 101static const char *tt_command_strings[] = {102	[TT_CMD_ADDTZ] = "addtz",103	[TT_CMD_DELTZ] = "deltz",104	[TT_CMD_TZADDTRIP] = "tzaddtrip",105	[TT_CMD_TZREG] = "tzreg",106	[TT_CMD_TZUNREG] = "tzunreg",107};108 109static int tt_command_exec(int index, const char *arg)110{111	int ret;112 113	switch (index) {114	case TT_CMD_ADDTZ:115		ret = tt_add_tz();116		break;117 118	case TT_CMD_DELTZ:119		ret = tt_del_tz(arg);120		break;121 122	case TT_CMD_TZADDTRIP:123		ret = tt_zone_add_trip(arg);124		break;125 126	case TT_CMD_TZREG:127		ret = tt_zone_reg(arg);128		break;129 130	case TT_CMD_TZUNREG:131		ret = tt_zone_unreg(arg);132		break;133 134	default:135		ret = -EINVAL;136		break;137	}138 139	return ret;140}141 142static ssize_t tt_command_process(struct dentry *dentry, const char __user *user_buf,143				  size_t count)144{145	char *buf __free(kfree);146	char *arg;147	int i;148 149	buf = kmalloc(count + 1, GFP_KERNEL);150	if (!buf)151		return -ENOMEM;152 153	if (copy_from_user(buf, user_buf, count))154		return -EFAULT;155 156	buf[count] = '\0';157	strim(buf);158 159	arg = strstr(buf, ":");160	if (arg) {161		*arg = '\0';162		arg++;163	}164 165	for (i = 0; i < ARRAY_SIZE(tt_command_strings); i++) {166		if (!strcmp(buf, tt_command_strings[i]))167			return tt_command_exec(i, arg);168	}169 170	return -EINVAL;171}172 173static ssize_t tt_command_write(struct file *file, const char __user *user_buf,174				size_t count, loff_t *ppos)175{176	struct dentry *dentry = file->f_path.dentry;177	ssize_t ret;178 179	if (*ppos)180		return -EINVAL;181 182	if (count + 1 > TT_COMMAND_SIZE)183		return -E2BIG;184 185	ret = debugfs_file_get(dentry);186	if (unlikely(ret))187		return ret;188 189	ret = tt_command_process(dentry, user_buf, count);190	if (ret)191		return ret;192 193	return count;194}195 196static const struct file_operations tt_command_fops = {197	.write = tt_command_write,198	.open =	 simple_open,199	.llseek = default_llseek,200};201 202static int __init thermal_testing_init(void)203{204	d_testing = debugfs_create_dir("thermal-testing", NULL);205	if (!IS_ERR(d_testing))206		debugfs_create_file("command", 0200, d_testing, NULL,207				    &tt_command_fops);208 209	return 0;210}211module_init(thermal_testing_init);212 213static void __exit thermal_testing_exit(void)214{215	debugfs_remove(d_testing);216	tt_zone_cleanup();217}218module_exit(thermal_testing_exit);219 220MODULE_DESCRIPTION("Thermal core testing facility");221MODULE_LICENSE("GPL v2");222