From nobody Tue Feb 10 04:12:54 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 54DCE32D439 for ; Tue, 23 Dec 2025 12:33:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766493219; cv=none; b=aXjrMl+MxcYp7oCxiL5p9HR20VqmnQmTZ+Lt6Z5ZxtEmvRk6KbGpRx+7B2wRSIKzhRyXmwWWgX/tTU2NRlrTSEjpvc+X1NyPn7sJJxXDhFPsYVMsPuDwhsH2cWf5gH9+p3t8wgtflnTJVLkLxtyOlLUQJgTGDPdYiQ4PB1tjPb8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766493219; c=relaxed/simple; bh=foVZcuk0ELu8rn+Y1h/AXjrAXtCeEHIt7M7SE9rpY3M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JGAfKjD0AA4wku1H7ZwkJ42r8NFR/3WOKccZyv/FdGZIZhuL/DUMrvnJJH/qBIWpIbg6OpJzErI6Pmn0tJ+1QB1hmwGOUH5T2dYudk/kOUFdPEuohLtkEcqzEDY2dVrZnDy5sx95hYUEJwV26Vvk6duIGG/r3Y+QoQn7vLT4tqo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ED0+or5y; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=c2f1xjz5; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ED0+or5y"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="c2f1xjz5" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BN89Sda2747756 for ; Tue, 23 Dec 2025 12:33:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=YULFLgxmKKR dhUCw5G92AvuzjeLGGojQfJhhxT0OW9U=; b=ED0+or5yOMs7UP598p2TIOV1YK9 vYOBVxuqxfppBdZl/fHGpxtsalrJv+Gu3M1t7yTIWXXk//elu9YCg9HM+mPCl5li mGQ25oWCsDI+6JOmBvy8dCWBRAqm4yHxECZBSOCJivzph8V2aRkO24Gg5PvUCLhN YcqGfB/H++FzH+xXYmhmoWzo979bpiygVEWCAl6Bl4VP+XUF7IVPaocV8nkMGfGB fv9uW3/E8eoqAPDfPrYIXm0LvPCowr5f+YGM/ITSCcYBXIu9zIhUUMaBqtQ7OpBN mHgVR1P+k57ZpNITncdCkMVjbynPpuAkjl4CjBEIfM+Xckl/OJo4XHyeUyw== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7h5ct2ws-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 23 Dec 2025 12:33:36 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-34abd303b4aso14081282a91.1 for ; Tue, 23 Dec 2025 04:33:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766493216; x=1767098016; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YULFLgxmKKRdhUCw5G92AvuzjeLGGojQfJhhxT0OW9U=; b=c2f1xjz5zgfngb1UMTfsisIvO1bq20+6uCCBMbbI60yb6bxk3W+2VHnTQ6dnRZPIWS UiqnWB+ig2gtkgb/D9+RrGilPMlTeNuRZ72j0e36NWXXx2U0spguBmJxGakHPrZeB4AA VDnImlr9Ab2MUR4KE1yHoLN4b42gXxlIoQtlznl/kBc1yBcBRXMM0MSqPyo0hDzCBeyI qV146+O57dPI4Ci3cCG7lp7L55El0mFCmfhkB3dCkONZIZqnGmLDw+pHUCtUILrzRWwO 4I3JpZswbDyGmPTbv7ec9PAHWEft0y4iK6eKVZNNDInDIJC2E0uh5V0DpGTBiUZNn52P 0rFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766493216; x=1767098016; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=YULFLgxmKKRdhUCw5G92AvuzjeLGGojQfJhhxT0OW9U=; b=pOXIxqJG1BaXNRIoqPZGZAGKAm3z3uq0eJH/LP5Oq+brZQQAMCTUjwgAu0Z5zUiCRB fQKDOpCeDM8tBk+Xv0Ic9gJbgF1ORTJMuBaTDbyqJbopg7zu7wDMOGdgsZGpKVAuoT7h 8DWkqL020OFXhV3A+TFXSgX/Pjzx1hcymjcpToKIFOJOp3ZnHgeiiy9cHxW1Z9mjFubq zrxzjQ0hBErl5qBpN7/+1zaZiDB1E1WjL5+qzXBsy3Y/rO8+28T5ibeZ9ag+tsCDJIlq WWZqK1yusTdjziD1OQzjAWWaQMfEUwWQYyzS27QrOXYpXnlX+C1r7OTTTF/lYwMMAZBg u+Iw== X-Forwarded-Encrypted: i=1; AJvYcCVqBMcCNKcOpfNnZgwf6VIesEztZSRuksSyhok7t+Ya0u3M/PKCCfePszPX5Ag9tIHB0TSmqKmc6swm4+Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzZwHuTPLo/54W2LmTAaLAGcupJamEkDq+UDKWq9xVVRyN+jNTv YCzYtpZBHY6EBipE6FZsGUt23eDQKQyhSHxB/7/A8cgTRBpNkbjAt5mrNVVhli+geFu8WoogICU PAJc12kPpOz+Mjk+GvYNtLOKCAjA6Fia+S1XeFfn6EpSbk8Dle9fxRZjhyEPA01H6ItQ= X-Gm-Gg: AY/fxX7AeoDmqqsBituXa527odPoR+vcUFwRc2WmoaUGhaUpBBXAhJiM9PzAmcu4i8O AsfBABPH2pyxV1DKPVvH/IB2g/2f3aQ+VzoCIbpXVxnSvh+SKY4VbSjkkIgCpg2nL2ADmw1Tiep KLozc4ZKUbo93suZA8qlcoY9gTI29yvumVkqcd5t76gqKBFksa0JDrABAq8AMegh7I09laOs9f/ y1SSW/tpXiqmDGx7OaYNnW/yOy5ko1GPz3hi5zbDe+zAkdqpEFT2ps4eCdotMc9K/tvZzolc4Ug TCSlbBF+EZ+zuwS0ixJ02frEozfUWwiViGulNaTsFEDbUvHlZ1o9jWsxgVQxyhSK6yvyEkDivLf ooxaooHk9VQYcMhNSvChWxNJZP2hFx/Yo53/YUog= X-Received: by 2002:a17:90b:35d1:b0:340:ff89:8b62 with SMTP id 98e67ed59e1d1-34e921b05a1mr12712299a91.21.1766493215447; Tue, 23 Dec 2025 04:33:35 -0800 (PST) X-Google-Smtp-Source: AGHT+IFbcsMdo+iwlrL6OggSVKKtuzxeCLAMwngRRk7btZQwlB6vQf6eEjfycmecYDIyqPN8zgQ02w== X-Received: by 2002:a17:90b:35d1:b0:340:ff89:8b62 with SMTP id 98e67ed59e1d1-34e921b05a1mr12712264a91.21.1766493214936; Tue, 23 Dec 2025 04:33:34 -0800 (PST) Received: from hu-gkohli-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-34e921b39dfsm12936044a91.8.2025.12.23.04.33.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 04:33:34 -0800 (PST) From: Gaurav Kohli To: andersson@kernel.org, mathieu.poirier@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, rafael@kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com, konradybcio@kernel.org, amitk@kernel.org, mani@kernel.org, casey.connolly@linaro.org Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Gaurav Kohli , Amit Kucheria Subject: [PATCH v1 1/8] thermal: Add Remote Proc cooling driver Date: Tue, 23 Dec 2025 18:02:20 +0530 Message-Id: <20251223123227.1317244-2-gaurav.kohli@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251223123227.1317244-1-gaurav.kohli@oss.qualcomm.com> References: <20251223123227.1317244-1-gaurav.kohli@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjIzMDEwMiBTYWx0ZWRfX3rEfA7Gxjrd5 XYDxvvScpNBfRV+KJAh2h0GfLxqItM8clwUnwIFKOPQZYX87DgGCaDuq9wYOmephroUSMjUGcyl rt/tqVE8D/Em0ig2JSIDZiaqfhis9BlUfnd0AnyyCEnSQA3H273AMX0hhMbjnC3xbU4LaDpk0+n T6RauHrep/R1i/5Ovag4gD5aEj9WFjylu+KP9Ffr1SL1ViapcVTd9F9oKeUCyXeGLt69NYRLNiu KnT1hWUyV1HmgTJTi6V1+Z8WzlzePdY72u6gkUzzVkfI6LggrJqwiyMIHfHUHEVpkMisqgG8cvd v81DpqpJ+an3jFq5ngnIIBwv8upiBlb9xj7GtREUrNif2L/Kh+wG8KQS8URUHGJ2C0U98EM6h3D 2ac6yFkJvBtK06jrED0+QfH9m2KEBe36KuLkV9cHPd33LdgQtYIwj8dxXhxz8VCY4YRmYNiuZDQ 85gRHkYfWtY3w0iL9bg== X-Proofpoint-ORIG-GUID: onedCVBayN2B7EWba2iM7NmEALa72owL X-Authority-Analysis: v=2.4 cv=LeUxKzfi c=1 sm=1 tr=0 ts=694a8c20 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=VwQbUJbxAAAA:8 a=7CQSdrXTAAAA:8 a=2qJnY-jACA4cO-adHyEA:9 a=iS9zxrgQBfv6-_F4QbHw:22 a=a-qgeE7W1pNrGK8U0ZQC:22 X-Proofpoint-GUID: onedCVBayN2B7EWba2iM7NmEALa72owL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_03,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 impostorscore=0 adultscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512230102 Content-Type: text/plain; charset="utf-8" Add a new generic driver for thermal cooling devices that control remote processors (modem, DSP, etc.) through various communication channels. This driver provides an abstraction layer between the thermal subsystem and vendor-specific remote processor communication mechanisms. Suggested-by: Amit Kucheria Signed-off-by: Gaurav Kohli --- MAINTAINERS | 8 ++ drivers/thermal/Kconfig | 11 ++ drivers/thermal/Makefile | 2 + drivers/thermal/remoteproc_cooling.c | 154 +++++++++++++++++++++++++++ include/linux/remoteproc_cooling.h | 52 +++++++++ 5 files changed, 227 insertions(+) create mode 100644 drivers/thermal/remoteproc_cooling.c create mode 100644 include/linux/remoteproc_cooling.h diff --git a/MAINTAINERS b/MAINTAINERS index 679e5f11e672..c1ba87315cdf 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -25935,6 +25935,14 @@ F: drivers/thermal/cpufreq_cooling.c F: drivers/thermal/cpuidle_cooling.c F: include/linux/cpu_cooling.h =20 +THERMAL/REMOTEPROC_COOLING +M: Gaurav Kohli +L: linux-pm@vger.kernel.org +S: Supported +F: drivers/thermal/remoteproc_cooling.c +F: include/linux/remoteproc_cooling.h + + THERMAL/POWER_ALLOCATOR M: Lukasz Luba L: linux-pm@vger.kernel.org diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index b10080d61860..31e92be34387 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig @@ -229,6 +229,17 @@ config PCIE_THERMAL =20 If you want this support, you should say Y here. =20 + +config REMOTEPROC_THERMAL + bool "Remote processor cooling support" + help + This implements a generic cooling mechanism for remote processors + (modem, DSP, etc.) that allows vendor-specific implementations to + register thermal cooling devices and provide callbacks for thermal + mitigation. + + If you want this support, you should say Y here. + config THERMAL_EMULATION bool "Thermal emulation mode support" help diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile index bb21e7ea7fc6..ae747dde54fe 100644 --- a/drivers/thermal/Makefile +++ b/drivers/thermal/Makefile @@ -34,6 +34,8 @@ thermal_sys-$(CONFIG_DEVFREQ_THERMAL) +=3D devfreq_coolin= g.o =20 thermal_sys-$(CONFIG_PCIE_THERMAL) +=3D pcie_cooling.o =20 +thermal_sys-$(CONFIG_REMOTEPROC_THERMAL) +=3D remoteproc_cooling.o + obj-$(CONFIG_K3_THERMAL) +=3D k3_bandgap.o k3_j72xx_bandgap.o # platform thermal drivers obj-y +=3D broadcom/ diff --git a/drivers/thermal/remoteproc_cooling.c b/drivers/thermal/remotep= roc_cooling.c new file mode 100644 index 000000000000..a1f948cbde0f --- /dev/null +++ b/drivers/thermal/remoteproc_cooling.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Remote Processor Cooling Device + * + * Copyright (c) 2025, Qualcomm Innovation Center, Inc. All rights reserve= d. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define REMOTEPROC_PREFIX "rproc_" + +struct remoteproc_cooling_ops { + int (*get_max_level)(void *devdata, unsigned long *level); + int (*get_cur_level)(void *devdata, unsigned long *level); + int (*set_cur_level)(void *devdata, unsigned long level); +}; + +/** + * struct remoteproc_cdev - Remote processor cooling device + * @cdev: Thermal cooling device handle + * @ops: Vendor-specific operation callbacks + * @devdata: Private data for vendor implementation + * @np: Device tree node associated with this cooling device + * @lock: Mutex to protect cooling device operations + */ +struct remoteproc_cdev { + struct thermal_cooling_device *cdev; + const struct remoteproc_cooling_ops *ops; + void *devdata; + struct device_node *np; + struct mutex lock; +}; + + +/* Thermal cooling device callbacks */ + +static int remoteproc_get_max_state(struct thermal_cooling_device *cdev, + unsigned long *state) +{ + struct remoteproc_cdev *rproc_cdev =3D cdev->devdata; + int ret; + + if (!rproc_cdev || !rproc_cdev->ops) + return -EINVAL; + + mutex_lock(&rproc_cdev->lock); + ret =3D rproc_cdev->ops->get_max_level(rproc_cdev->devdata, state); + mutex_unlock(&rproc_cdev->lock); + + return ret; +} + +static int remoteproc_get_cur_state(struct thermal_cooling_device *cdev, + unsigned long *state) +{ + struct remoteproc_cdev *rproc_cdev =3D cdev->devdata; + int ret; + + if (!rproc_cdev || !rproc_cdev->ops) + return -EINVAL; + + mutex_lock(&rproc_cdev->lock); + ret =3D rproc_cdev->ops->get_cur_level(rproc_cdev->devdata, state); + mutex_unlock(&rproc_cdev->lock); + + return ret; +} + +static int remoteproc_set_cur_state(struct thermal_cooling_device *cdev, + unsigned long state) +{ + struct remoteproc_cdev *rproc_cdev =3D cdev->devdata; + int ret; + + if (!rproc_cdev || !rproc_cdev->ops) + return -EINVAL; + + mutex_lock(&rproc_cdev->lock); + ret =3D rproc_cdev->ops->set_cur_level(rproc_cdev->devdata, state); + mutex_unlock(&rproc_cdev->lock); + + return ret; +} + +static const struct thermal_cooling_device_ops remoteproc_cooling_ops =3D { + .get_max_state =3D remoteproc_get_max_state, + .get_cur_state =3D remoteproc_get_cur_state, + .set_cur_state =3D remoteproc_set_cur_state, +}; + +struct remoteproc_cdev * +remoteproc_cooling_register(struct device_node *np, + const char *name, const struct remoteproc_cooling_ops *ops, + void *devdata) +{ + struct remoteproc_cdev *rproc_cdev; + struct thermal_cooling_device *cdev; + int ret; + + if (!name || !ops) { + return ERR_PTR(-EINVAL); + } + + rproc_cdev =3D kzalloc(sizeof(*rproc_cdev), GFP_KERNEL); + if (!rproc_cdev) + return ERR_PTR(-ENOMEM); + + rproc_cdev->ops =3D ops; + rproc_cdev->devdata =3D devdata; + rproc_cdev->np =3D np; + mutex_init(&rproc_cdev->lock); + + char *rproc_name __free(kfree) =3D + kasprintf(GFP_KERNEL, REMOTEPROC_PREFIX "%s", name); + /* Register with thermal framework */ + if (np) { + cdev =3D thermal_of_cooling_device_register(np, rproc_name, rproc_cdev, + &remoteproc_cooling_ops); + } + + if (IS_ERR(cdev)) { + ret =3D PTR_ERR(cdev); + goto free_rproc_cdev; + } + + rproc_cdev->cdev =3D cdev; + + return rproc_cdev; + +free_rproc_cdev: + kfree(rproc_cdev); + return ERR_PTR(ret); +} +EXPORT_SYMBOL_GPL(remoteproc_cooling_register); + +void remoteproc_cooling_unregister(struct remoteproc_cdev *rproc_cdev) +{ + if (!rproc_cdev) + return; + + thermal_cooling_device_unregister(rproc_cdev->cdev); + mutex_destroy(&rproc_cdev->lock); + kfree(rproc_cdev); +} +EXPORT_SYMBOL_GPL(remoteproc_cooling_unregister); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Remote Processor Cooling Device"); diff --git a/include/linux/remoteproc_cooling.h b/include/linux/remoteproc_= cooling.h new file mode 100644 index 000000000000..ef94019d220d --- /dev/null +++ b/include/linux/remoteproc_cooling.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Remote Processor Cooling Device + * + * Copyright (c) 2025, Qualcomm Innovation Center + */ + +#ifndef __REMOTEPROC_COOLING_H__ +#define __REMOTEPROC_COOLING_H__ + +#include + +struct device; +struct device_node; + +struct remoteproc_cooling_ops { + int (*get_max_level)(void *devdata, unsigned long *level); + int (*get_cur_level)(void *devdata, unsigned long *level); + int (*set_cur_level)(void *devdata, unsigned long level); +}; + +struct remoteproc_cdev; + +#ifdef CONFIG_REMOTEPROC_THERMAL + +struct remoteproc_cdev * +remoteproc_cooling_register(struct device_node *np, + const char *name, + const struct remoteproc_cooling_ops *ops, + void *devdata); + +void remoteproc_cooling_unregister(struct remoteproc_cdev *rproc_cdev); + +#else /* !CONFIG_REMOTEPROC_THERMAL */ + +static inline struct remoteproc_cdev * +remoteproc_cooling_register(struct device_node *np, + const char *name, + const struct remoteproc_cooling_ops *ops, + void *devdata) +{ + return ERR_PTR(-EINVAL); +} + +static inline void +remoteproc_cooling_unregister(struct remoteproc_cdev *rproc_cdev) +{ +} + +#endif /* CONFIG_REMOTEPROC_THERMAL */ + +#endif /* __REMOTEPROC_COOLING_H__ */ --=20 2.34.1