Received: by 2002:a05:7412:3b8b:b0:fc:a2b0:25d7 with SMTP id nd11csp955967rdb; Fri, 9 Feb 2024 06:20:44 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCUH2WL5Nt/7vN+5D3AKtNTR7+3N19lcAZBR5Llub3Ss4+K6P18M4uZt+jOHYrZiMF4mcTt/KnClZL5R6UinEmLvpoOmPe4iAePP4A3BOg== X-Google-Smtp-Source: AGHT+IGDsZ+uhYq9GIPPxIiIIjj+DaEfnewcGG3h8HJ9HPYFZAFLeh2erjhxz+OQaWc44LkrkyqT X-Received: by 2002:a0c:df85:0:b0:68c:bc30:fc86 with SMTP id w5-20020a0cdf85000000b0068cbc30fc86mr1777567qvl.56.1707488444159; Fri, 09 Feb 2024 06:20:44 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707488444; cv=pass; d=google.com; s=arc-20160816; b=QvCXyPIlGcJeuFWYX7zT3kyTvAE7erVvVivlIHD6knfvYPNIjqJwL+dMxnNm11EK46 mtvwkB9YYTEGSVHGC4A/ntThoajbvZKwSqFg8iP879qc4am7HkaDzpY1gbebu91hgz+k R+/OWW5LSwDGhTPbLpoS0Gb3uPZhoKmtZlWrzJ7FiEY42T6yKr2aNpfDFBTl1EbbysqI Gw1Ldcsbv9MPx5bLf+jfNGjLcfXV1wdAQBAAClQqD34FAXsT0z7n/RrJMpFWVPBUfzAi X+n9P/+sRIRaXhNtl0aXmgguLYxG8BaJOLx1I2JbHu0dTasTn0+xM6eJ4zv3iadDmBJ1 +tsg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=ztfp5tqTcLe/yikbyo98hSJA4XQpMBA3EvuXBQbIpL4=; fh=QilNcuAT1T7AD0awmvmctEXJmgoarZdLLK5fF7WWqeA=; b=jHiq6nCUtN1i+Jkn2T+w2AOgIAUFWuY1HzudU4q1jFnHK4kE+95U0gKutwszHzbRT7 33b1n12hR95XmisSc6wRCCG4In7q9WYWl4uWXu9Y/0LvIl0ogg67qTBNhMJJb0HLQ3iB NdxGRkL1Egbp85i6dvfG1lhHC7RQWgvn2W/XXzPF77oa+30JJ1FvBCLEu6MehmPEHqwJ BEqCaOB1WbXMm9w5h5NjOjuQummj+U4NZDYQ2zAT+AnieZ+iy1DBkS/H3Ay2RUFqjzGV pHdskewaq2Jx5dt0OLfMyqtU1q9uA5BTSEtTXDHozMWY+TRp8f9e1Bt+msUIOCqTE766 Apng==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=rjwysocki.net); spf=pass (google.com: domain of linux-kernel+bounces-59439-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-59439-linux.lists.archive=gmail.com@vger.kernel.org" X-Forwarded-Encrypted: i=2; AJvYcCUlkGhJ3s6uLkpEnU9yRd3wGowsxOlfR4n1HcMU11qZ0ZltgDDSHadJXvdPKycVbkac1Z0Ie/FPMXb5Fi5OyKQ+FtHD7mBTuDdpzjxWZw== Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id s1-20020a05620a030100b00783cc18b28bsi1906292qkm.565.2024.02.09.06.20.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Feb 2024 06:20:44 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-59439-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=rjwysocki.net); spf=pass (google.com: domain of linux-kernel+bounces-59439-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-59439-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id ED8FD1C2277C for ; Fri, 9 Feb 2024 14:20:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5B7EB7BB16; Fri, 9 Feb 2024 14:14:53 +0000 (UTC) Received: from cloudserver094114.home.pl (cloudserver094114.home.pl [79.96.170.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 74FE47867D; Fri, 9 Feb 2024 14:14:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=79.96.170.134 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707488092; cv=none; b=GFAxptUVTRP+ML8qep92bi+6VcIsmWfPy5e+ewAeQmv2fI2jiSe/ao1LCFR7cHIcoYo4TC8nnEnyq6Ev/JNp9VU+yLpiRMNjRadg55YWClOLNlMhymY9RCKTk+wP5wB9HIi90EyITzABgP7I4YCQDbNjBTnLZTOjldicwb07HUM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707488092; c=relaxed/simple; bh=iyvlwc3EOmpZ2lJqDjD3YbtFrwjtOtM4CH3EkmXDNX4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WzssANl7/BtvX+m2dFsYv/bkHStK9hoJ+Ad4tkxojeMS9CAxGAbDVyHuajy8VjDJZD1QWjEWrfoLuEq6yDh+bzrzhYBZN68i0Z0tt+US01gxs4kq9UOl9Zf8OLZQxpfdU7T4bg2fn2H/bGSzO+/o9QWFx6xby3AKKgi/4pwupGo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rjwysocki.net; spf=pass smtp.mailfrom=rjwysocki.net; arc=none smtp.client-ip=79.96.170.134 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rjwysocki.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rjwysocki.net Received: from localhost (127.0.0.1) (HELO v370.home.net.pl) by /usr/run/smtp (/usr/run/postfix/private/idea_relay_lmtp) via UNIX with SMTP (IdeaSmtpServer 5.4.0) id a66302ca18b67ebd; Fri, 9 Feb 2024 15:14:47 +0100 Received: from kreacher.localnet (unknown [195.136.19.94]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by cloudserver094114.home.pl (Postfix) with ESMTPSA id F0013669C4D; Fri, 9 Feb 2024 15:14:46 +0100 (CET) From: "Rafael J. Wysocki" To: Linux PM Cc: Lukasz Luba , LKML , Daniel Lezcano , Stanislaw Gruszka , Srinivas Pandruvada , Zhang Rui , netdev@vger.kernel.org, Ido Schimmel , Petr Machata , Miri Korenblit , linux-wireless@vger.kernel.org, Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Manaf Meethalavalappu Pallikunhi Subject: [PATCH v1 2/9] thermal: core: Add flags to struct thermal_trip Date: Fri, 09 Feb 2024 15:06:16 +0100 Message-ID: <2002876.usQuhbGJ8B@kreacher> In-Reply-To: <3232442.5fSG56mABF@kreacher> References: <3232442.5fSG56mABF@kreacher> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="UTF-8" X-CLIENT-IP: 195.136.19.94 X-CLIENT-HOSTNAME: 195.136.19.94 X-VADE-SPAMSTATE: clean X-VADE-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvledrtdeigdeiudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfjqffogffrnfdpggftiffpkfenuceurghilhhouhhtmecuudehtdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefufffkjghfggfgtgesthfuredttddtjeenucfhrhhomhepfdftrghfrggvlhculfdrucghhihsohgtkhhifdcuoehrjhifsehrjhifhihsohgtkhhirdhnvghtqeenucggtffrrghtthgvrhhnpedvffeuiedtgfdvtddugeeujedtffetteegfeekffdvfedttddtuefhgeefvdejhfenucfkphepudelhedrudefiedrudelrdelgeenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpeduleehrddufeeirdduledrleegpdhhvghlohepkhhrvggrtghhvghrrdhlohgtrghlnhgvthdpmhgrihhlfhhrohhmpedftfgrfhgrvghlucflrdcuhgihshhotghkihdfuceorhhjfiesrhhjfiihshhotghkihdrnhgvtheqpdhnsggprhgtphhtthhopeduiedprhgtphhtthhopehlihhnuhigqdhpmhesvhhgvghrrdhkvghrnhgvlhdrohhrghdprhgtphhtthhopehluhhkrghsiidrlhhusggrsegrrhhmrdgtohhmpdhrtghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepuggrnhhivghlrdhlvgiitggrnhhosehlihhnrghrohdrohhrghdprhgtphhtthhopehsthgr nhhishhlrgifrdhgrhhushiikhgrsehlihhnuhigrdhinhhtvghlrdgtohhmpdhrtghpthhtohepshhrihhnihhvrghsrdhprghnughruhhvrggurgeslhhinhhugidrihhnthgvlhdrtghomh X-DCC--Metrics: v370.home.net.pl 1024; Body=16 Fuz1=16 Fuz2=16 From: Rafael J. Wysocki In order to allow thermal zone creators to specify the writability of trip point temperature and hysteresis on a per-trip basis, add a flags field to struct thermal_trip and define flags to represent the desired trip properties. Also make thermal_zone_device_register_with_trips() set the THERMAL_TRIP_WRITABLE_TEMP flag for all trips covered by the writable trips mask passed to it and modify the thermal sysfs code to look at the trip flags instead of using the writable trips mask directly or checking the presence of the .set_trip_hyst() zone callback. Additionally, make trip_point_temp_store() and trip_point_hyst_store() fail with an error code if the trip passed to one of them has THERMAL_TRIP_WRITABLE_TEMP or THERMAL_TRIP_WRITABLE_HYST, respectively, clear in its flags. No intentional functional impact. Signed-off-by: Rafael J. Wysocki --- drivers/thermal/thermal_core.c | 12 +++++++++++- drivers/thermal/thermal_core.h | 2 +- drivers/thermal/thermal_sysfs.c | 28 +++++++++++++++++++--------- include/linux/thermal.h | 7 +++++++ 4 files changed, 38 insertions(+), 11 deletions(-) Index: linux-pm/include/linux/thermal.h =================================================================== --- linux-pm.orig/include/linux/thermal.h +++ linux-pm/include/linux/thermal.h @@ -64,15 +64,22 @@ enum thermal_notify_event { * @threshold: trip crossing notification threshold miliCelsius * @type: trip point type * @priv: pointer to driver data associated with this trip + * @flags: flags representing binary properties of the trip */ struct thermal_trip { int temperature; int hysteresis; int threshold; enum thermal_trip_type type; + u8 flags; void *priv; }; +#define THERMAL_TRIP_WRITABLE_TEMP BIT(0) +#define THERMAL_TRIP_WRITABLE_HYST BIT(1) + +#define THERMAL_TRIP_WRITABLE (THERMAL_TRIP_WRITABLE_TEMP | THERMAL_TRIP_WRITABLE_HYST) + struct thermal_zone_device_ops { int (*bind) (struct thermal_zone_device *, struct thermal_cooling_device *); Index: linux-pm/drivers/thermal/thermal_core.c =================================================================== --- linux-pm.orig/drivers/thermal/thermal_core.c +++ linux-pm/drivers/thermal/thermal_core.c @@ -1356,13 +1356,23 @@ thermal_zone_device_register_with_trips( tz->devdata = devdata; tz->trips = trips; tz->num_trips = num_trips; + if (num_trips > 0) { + struct thermal_trip *trip; + + for_each_trip(tz, trip) { + if (mask & 1) + trip->flags |= THERMAL_TRIP_WRITABLE_TEMP; + + mask >>= 1; + } + } thermal_set_delay_jiffies(&tz->passive_delay_jiffies, passive_delay); thermal_set_delay_jiffies(&tz->polling_delay_jiffies, polling_delay); /* sys I/F */ /* Add nodes that are always present via .groups */ - result = thermal_zone_create_device_groups(tz, mask); + result = thermal_zone_create_device_groups(tz); if (result) goto remove_id; Index: linux-pm/drivers/thermal/thermal_core.h =================================================================== --- linux-pm.orig/drivers/thermal/thermal_core.h +++ linux-pm/drivers/thermal/thermal_core.h @@ -131,7 +131,7 @@ void thermal_zone_trip_updated(struct th int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp); /* sysfs I/F */ -int thermal_zone_create_device_groups(struct thermal_zone_device *, int); +int thermal_zone_create_device_groups(struct thermal_zone_device *tz); void thermal_zone_destroy_device_groups(struct thermal_zone_device *); void thermal_cooling_device_setup_sysfs(struct thermal_cooling_device *); void thermal_cooling_device_destroy_sysfs(struct thermal_cooling_device *cdev); Index: linux-pm/drivers/thermal/thermal_sysfs.c =================================================================== --- linux-pm.orig/drivers/thermal/thermal_sysfs.c +++ linux-pm/drivers/thermal/thermal_sysfs.c @@ -122,6 +122,11 @@ trip_point_temp_store(struct device *dev trip = &tz->trips[trip_id]; + if (!(trip->flags & THERMAL_TRIP_WRITABLE_TEMP)) { + ret = -EPERM; + goto unlock; + } + if (temp != trip->temperature) { if (tz->ops->set_trip_temp) { ret = tz->ops->set_trip_temp(tz, trip_id, temp); @@ -173,6 +178,11 @@ trip_point_hyst_store(struct device *dev trip = &tz->trips[trip_id]; + if (!(trip->flags & THERMAL_TRIP_WRITABLE_HYST)) { + ret = -EPERM; + goto unlock; + } + if (hyst != trip->hysteresis) { if (tz->ops->set_trip_hyst) { ret = tz->ops->set_trip_hyst(tz, trip_id, hyst); @@ -392,17 +402,16 @@ static const struct attribute_group *the /** * create_trip_attrs() - create attributes for trip points * @tz: the thermal zone device - * @mask: Writeable trip point bitmap. * * helper function to instantiate sysfs entries for every trip * point and its properties of a struct thermal_zone_device. * * Return: 0 on success, the proper error value otherwise. */ -static int create_trip_attrs(struct thermal_zone_device *tz, int mask) +static int create_trip_attrs(struct thermal_zone_device *tz) { + const struct thermal_trip *trip; struct attribute **attrs; - int indx; /* This function works only for zones with at least one trip */ if (tz->num_trips <= 0) @@ -437,7 +446,9 @@ static int create_trip_attrs(struct ther return -ENOMEM; } - for (indx = 0; indx < tz->num_trips; indx++) { + for_each_trip(tz, trip) { + int indx = thermal_zone_trip_id(tz, trip); + /* create trip type attribute */ snprintf(tz->trip_type_attrs[indx].name, THERMAL_NAME_LENGTH, "trip_point_%d_type", indx); @@ -458,7 +469,7 @@ static int create_trip_attrs(struct ther tz->trip_temp_attrs[indx].name; tz->trip_temp_attrs[indx].attr.attr.mode = S_IRUGO; tz->trip_temp_attrs[indx].attr.show = trip_point_temp_show; - if (mask & (1 << indx)) { + if (trip->flags & THERMAL_TRIP_WRITABLE_TEMP) { tz->trip_temp_attrs[indx].attr.attr.mode |= S_IWUSR; tz->trip_temp_attrs[indx].attr.store = trip_point_temp_store; @@ -473,7 +484,7 @@ static int create_trip_attrs(struct ther tz->trip_hyst_attrs[indx].name; tz->trip_hyst_attrs[indx].attr.attr.mode = S_IRUGO; tz->trip_hyst_attrs[indx].attr.show = trip_point_hyst_show; - if (tz->ops->set_trip_hyst) { + if (trip->flags & THERMAL_TRIP_WRITABLE_HYST) { tz->trip_hyst_attrs[indx].attr.attr.mode |= S_IWUSR; tz->trip_hyst_attrs[indx].attr.store = trip_point_hyst_store; @@ -505,8 +516,7 @@ static void destroy_trip_attrs(struct th kfree(tz->trips_attribute_group.attrs); } -int thermal_zone_create_device_groups(struct thermal_zone_device *tz, - int mask) +int thermal_zone_create_device_groups(struct thermal_zone_device *tz) { const struct attribute_group **groups; int i, size, result; @@ -522,7 +532,7 @@ int thermal_zone_create_device_groups(st groups[i] = thermal_zone_attribute_groups[i]; if (tz->num_trips) { - result = create_trip_attrs(tz, mask); + result = create_trip_attrs(tz); if (result) { kfree(groups);