From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8EB01366DC1 for ; Thu, 23 Apr 2026 15:23:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957784; cv=none; b=tuAUmVqCVOMFSoxjKC6HnTFQixW6g4UB3r/5uggxbSnKJPMm0IA/KUoQ+Bv4SI9o4iRiA7V2FOEZj8UabL1n5NimL8qgqWi+RRm1yZ+hekjC2SyI9H1PQgU/0ulVMU1fZ4BmlDPZhz4GoSORx+04CUwqEibieYLlwplRtazaB6I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957784; c=relaxed/simple; bh=DUqmD7ypzAi56hF5Rjwm27fjn6fmPFxHtwOu1/9raE8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=E6Ihrz1OiaW6G0Tpcjn2bLRVNKsuKnpV4RPHhE7xVKDUM3oarkazcmDX2C6Vn0z+YT/ml3gLg/u0AUQ6HPSQMIeuxiVjQszset6Do9yziGE1iLURr4mj9LyeoSF2+Lu1WP4K9zUyZNbG1O21Aaa06ZOvcl18nJ3y6Npuj91SCCI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Ck2aqFEG; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Ck2aqFEG" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-483487335c2so66965255e9.2 for ; Thu, 23 Apr 2026 08:23:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957780; x=1777562580; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=eQd9HkoufNSOLhuozcm6yh3/OjVqgZubRjD9rpq9iNY=; b=Ck2aqFEGjVZhmCjDJY2NfhhpSfB/Kad+p2K0ejR+OP3X1dVJAao7KU5Z1lAMTKh8Ps e1pH1JPXkDFW+FF9+iU5QZBq0NVj7JtZntRnFzjADXqeUD6WqCZ9cdARV0NSzW6AvMd8 Vu4xyV6zgLmP13LO2pVi3WMifyTXqNy5zvRyd/ewo18x03HXlBcKtca7ChXuNuxf9n9x 8pir36OTpPEpt+aZJkWvfg5gwkzmtYa9eS1UrXKVraywIgjA1/B9iU1M3KU4+F98Qo0K iNiqHktU+efYNDOQprVkRYzEliTZiiRCHYA9A5ll9hkrlfzwlT/on3hQlG1VDY1mLHn/ PRcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957780; x=1777562580; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=eQd9HkoufNSOLhuozcm6yh3/OjVqgZubRjD9rpq9iNY=; b=Tx5m73pcSZt+boabzZ7Wm9qzsp5xnXIqnprVnz4ZOWPKhv/TfsZs8T9r2bWSk/fpUF PzFVOYX2Vw9f3ZWexHZiN2WCyXrKBee+GnHSY9j9HfymR9Yiu+GZfkQ+lhRkCBvRUwLH Zz+HPwa1MJ1Ortosla+EzEaRkHsDBAPRU4d+Dxk5nqnaxT0oei0UsHDrwD3ImKdXlU3G DGxWgMrrur4GDD5H4vs5uXHGXyl2iYSkQBDVuCTGJKHELl/MLtVVFFnIW7SGP21A5Z42 +PiE3h2POSs4LrssE++2KYr7YLqkz5gIWZuvGMf90wp83g+n8yPDrb19RSKjK5scfYDN gqPw== X-Forwarded-Encrypted: i=1; AFNElJ9qsxq0RwOLYXDs/4yQ8riwflEpTIU7pNUY7D+1lI8016rS07srZ8LUaC881DIJXHwK35wuZKkc+s6JUn0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8M8kPeJeNiO0lpaQeo6NEsXMrlxdsOSL6oKyciJOdrJaiaqyM gdiO1ywIDpsAmfYQUjkUaONZltDojw0sDTx+4XonUlhNsGRBB8WnKHPWAu3SznuIUeM= X-Gm-Gg: AeBDieskIbdgyKYXFXI4eIv5iVayfX2/ULb2Tqdp+hpqZOzDkXHPc/89oc1Tpif7syc /txTIoW16mXgN5MtoCe2On4lf0dDnkUJikt1CMXrwpLi/bccyxCkumPBHmjFABJRBokm5aNOICz Y8yHL3+p32nSrfvEfJnycEsHjxPsgxz3doaRAsYSc6nPgDryKRcrUwGVbquY56/4+EQwezohswt hzunZ+f96zfjYiFPpYIsiRAGBb3jw6Y7k4gGE7t8+iP4VW4NTq84fupR/3QMUVSBPCH6A6jOfqk zkyXnLO3a34tIbUAeYELvqrBKcXeJDvTPGUcgM4LLb/buiniFaViwRWJORntDTwai3BygsDJUXN BRVacQQ8qisQVaNdlwYIpaUY7H0GXAfrTq5wezxHZ8+XKn0AwoqKT+SK72wL7FGxhSxTgDvO1zu KYGhywyNdHklYNvLko9hvzPtAZhS8NgUWD2XCTct5sktNLydBIPeUI63fysrKgNeOTKTf4vhoc6 8A5q7sCIzcl99aKxg== X-Received: by 2002:a05:600c:4f8c:b0:48a:58ae:993b with SMTP id 5b1f17b1804b1-48a58ae9faemr164398395e9.16.1776957779732; Thu, 23 Apr 2026 08:22:59 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.22.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:22:59 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:49 +0000 Subject: [PATCH v4 01/11] dt-bindings: thermal: Add Google GS101 TMU Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-1-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus , Krzysztof Kozlowski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=3371; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=DUqmD7ypzAi56hF5Rjwm27fjn6fmPFxHtwOu1/9raE8=; b=UhqzoM8PdUosgQawfVF9WiuGetFtR1EtE1aMLLS4ZQ4GarNM/s0p3imCIaP1Jdt1/LJEbxtQW MfMJ8SzgeYkAtmV3J0vYms9+qiOl5uPDZyy2+Zqhf2Qyfd8zS2aTut+ X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Document the Thermal Management Unit (TMU) found on the Google GS101 SoC. The GS101 TMU utilizes a hybrid control model shared between the Application Processor (AP) and the ACPM (Alive Clock and Power Manager) firmware. This hybrid ACPM TMU architecture is also present on other Samsung Exynos SoCs (e.g., AutoV920, Exynos850). While the TMU is a standard memory-mapped IP block, on this platform the AP's direct register access is restricted to the interrupt pending (INTPEND) registers for event identification. High-level functional tasks, such as sensor initialization, threshold programming, and temperature reads, are delegated to the ACPM firmware. Signed-off-by: Tudor Ambarus Reviewed-by: Krzysztof Kozlowski --- .../bindings/thermal/google,gs101-tmu-top.yaml | 68 ++++++++++++++++++= ++++ 1 file changed, 68 insertions(+) diff --git a/Documentation/devicetree/bindings/thermal/google,gs101-tmu-top= .yaml b/Documentation/devicetree/bindings/thermal/google,gs101-tmu-top.yaml new file mode 100644 index 000000000000..d0eb2393d581 --- /dev/null +++ b/Documentation/devicetree/bindings/thermal/google,gs101-tmu-top.yaml @@ -0,0 +1,68 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/thermal/google,gs101-tmu-top.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Samsung Exynos ACPM Thermal Management Unit (TMU) + +maintainers: + - Tudor Ambarus + +description: + The Samsung Exynos ACPM TMU is a thermal sensor block found on Exynos + based platforms (such as Google GS101 and Exynos850). It supports + both direct register-level access and firmware-mediated management + via the ACPM (Alive Clock and Power Manager) firmware. + + On these platforms, the hardware is managed in a hybrid fashion. The + Application Processor (AP) maintains direct memory-mapped access + exclusively to the interrupt pending registers to identify thermal + events. All other functional aspects - including sensor + initialization, threshold configuration, and temperature acquisition + - are handled by the ACPM firmware. The AP coordinates these + operations through the ACPM IPC protocol. + +properties: + compatible: + const: google,gs101-tmu-top + + reg: + maxItems: 1 + + clocks: + items: + - description: APB peripheral clock (PCLK) for TMU register access. + + interrupts: + maxItems: 1 + + "#thermal-sensor-cells": + const: 1 + + samsung,acpm-ipc: + $ref: /schemas/types.yaml#/definitions/phandle + description: Phandle to the ACPM IPC node. + +required: + - compatible + - reg + - clocks + - interrupts + - "#thermal-sensor-cells" + +additionalProperties: false + +examples: + - | + #include + #include + + thermal-sensor@100a0000 { + compatible =3D "google,gs101-tmu-top"; + reg =3D <0x100a0000 0x800>; + clocks =3D <&cmu_misc CLK_GOUT_MISC_TMU_TOP_PCLK>; + interrupts =3D ; + #thermal-sensor-cells =3D <1>; + samsung,acpm-ipc =3D <&acpm_ipc>; + }; --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE1CB368977 for ; Thu, 23 Apr 2026 15:23:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957786; cv=none; b=KO9j4dxh1EDEdvUDUseGqxe1BlQMalwnWaqdKvgAupoCYCnYjyb0tPf1DEO72zMR6RkIBcdG27ixXjgktYE9Qtt5CEezMReBurW4uZt8T1JK4xjf7R0mq4rIVvIBe/U+AUoOTcYT2KiY88jUV7n6qKR2wgHKNXyP+s0uHc+iI0A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957786; c=relaxed/simple; bh=WSYPY9iqE8C0uGE7CEj3pZ+0q6CdfpIesN0FucLaxbs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TXbnmywgUp2+ng1/1LJAqgBOnLLAP+LKIS97svVHBMzzLp/RStSg0vK5dW/95HIaCZ41VDWbpd3uY+MnfQ+NtBxFapE7SJKYPSuuJ6B0Ii7nwdlDlamxPC2CXtDgClXduqhPHcH98p63LCYBO7pP0pzTawkapZX7i6sKf8xveOw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=CJRwfmCl; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="CJRwfmCl" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4890d945eb4so31695165e9.0 for ; Thu, 23 Apr 2026 08:23:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957780; x=1777562580; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=QpUZgWWTaSsaq1LDjiiiQmFNF42FiKaOIWpuF73h/84=; b=CJRwfmClkVou+iN61eap84Bk4iQksZeNBr4g8HGFsZoQlOICETzdqRA65g5rsbAp9J SXWFOIPV+gaWkbjTugC842f7zzOA+rumIZDIQ6reuA304iCp3Q8DDJFVbkugrhleBfZp u8SExG+1gp9dCVQ3dSQB9Sr6kN907JJs/fV5cWpSV9dTmjAmVfHsIfwJLDRia54Hf15+ pIyLJX5V6kOtKUEGPMVuZjbsKTLUujymMhZpX+fjcZZwqQtMUWIFjwdHJ8QWTKb1+tYZ 1xujO9hbgv0yQ97H9JqD/pzlLHgu4JyifuG26r2plVm+x7OXDqgRzHGPoEFDRaBWeoGg 4UOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957780; x=1777562580; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=QpUZgWWTaSsaq1LDjiiiQmFNF42FiKaOIWpuF73h/84=; b=lxsK8Af13IbPy+DjOg9CI/C+Yyy2aiUbvMfLVEMd1DDtDCqiUD+bkdmkxTQkAcTvul H1ikWaEglFhwdZ5hTL7r3az4/EzN4rwneL6/rS7LipjhhfMUu2odjVDrTLFVi5B5U0/H TThANF4Rml1wHd9/q6DjbfUcGhlUitn51AqjrQFOJg4tda6iUt1Hz8kzuXGN2OcbDlzt Q5YnNIP56ahgUb619Ko3MhRS8oK7a89+s7BTCDd/6Z47W5noi+itqGn749iB3RQNBMH1 qpLfp2Ch1mVYtdkbA7Komn1uMfPTLpytyXacjMJ5qpZHWDCV4eYWX8IyR+fXRIsc4716 Bj+w== X-Forwarded-Encrypted: i=1; AFNElJ9sXUXcrwx0YEOKAx/Qca1fe+SJKrM2McOEWCeV6FH0k8G2PeiP0+sYwY37okA6k2f/vkST61wJZEloOJc=@vger.kernel.org X-Gm-Message-State: AOJu0YzP34G5iku3njSqNDzcVb9BMEuMQr7my9ABzDYvCqXcaj4qZWzo dv+FXwNIWACYMXrXd/N+Qb5ByqdMfd3MVrPkDFAkxtYa0GTzipeClN5I+IHKLs/V15g= X-Gm-Gg: AeBDietgqmicaqTSkicegxumGTo0U6zyHwVDnj0n3ULpflLhKAu+pTuuJhQYffrteM5 YYgAZL2+gOa8d3WDxf67IENcBbvunvT+bwRqkZV3pE5KLdcqlCxXG6DaD7MPIl9qwAiLErFpj8m XrBLzdA7kTHsbTgwa3qovREZQ7MGoHkov58raWoiIRXE3MEOGRKHYrkSfeQ2Ea/yjBNJFCEQFAw 8HpA3qPirJ5PQaNOcfzfPrRQdghNWHztkIfqOWirMXamWekFqp4VWVonf4Ydtl3gnwxaXtdHTZO CjlDxq2c8UIf5d3WGbkJqNDBwyYrdTCKNY3fAnbyjjjIx7B/kNFxA8uKCWQtXyA3hzSz35ZFklE Gb9MpJU1RobXM2/hAZAJ4rjrT9/iiOElcsv1Qh60rSRqdQr1+UbCmY/e1DC3bKD2pUk90Pmw/Sr MtG60SsGmrnQIMKcd8KMX0dFEbL3UsAuFlj1e7IhzGCAwaHApxCY4Ks3GUPCNbmGgwk8CuCCAXV 8FLyej+PTKG/exBjA== X-Received: by 2002:a05:600c:19d3:b0:48a:55ec:c007 with SMTP id 5b1f17b1804b1-48a55ecc113mr154907315e9.15.1776957780309; Thu, 23 Apr 2026 08:23:00 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.22.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:00 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:50 +0000 Subject: [PATCH v4 02/11] firmware: samsung: acpm: Consolidate transfer initialization helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-2-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=6750; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=WSYPY9iqE8C0uGE7CEj3pZ+0q6CdfpIesN0FucLaxbs=; b=7YhVrYTYppr/evYne8g7qkOgpDwx34xpUSaTTqSDFBzt4lFPktjNyWA2+EUcMTV5g3RxkXQJ4 nPs/BdLeqbdD1F05RWvKaogUsG4uavx2s/80A9eAke9FL0aQsWP04bx X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Both the DVFS and PMIC ACPM sub-drivers implement their own identical local helper functions (acpm_dvfs_set_xfer and acpm_pmic_set_xfer) to initialize the acpm_xfer structure before sending an IPC message. Move this logic into a single centralized helper, acpm_set_xfer(), in the core ACPM driver to reduce boilerplate and code duplication. In addition to cleaning up the DVFS and PMIC implementations, this centralized method will also be utilized by the upcoming Exynos ACPM Thermal Management Unit (TMU) driver. Signed-off-by: Tudor Ambarus --- drivers/firmware/samsung/exynos-acpm-dvfs.c | 20 ++------------------ drivers/firmware/samsung/exynos-acpm-pmic.c | 20 +++++--------------- drivers/firmware/samsung/exynos-acpm.c | 26 ++++++++++++++++++++++++++ drivers/firmware/samsung/exynos-acpm.h | 2 ++ 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/drivers/firmware/samsung/exynos-acpm-dvfs.c b/drivers/firmware= /samsung/exynos-acpm-dvfs.c index fdea7aa24ca0..7266312ef5a6 100644 --- a/drivers/firmware/samsung/exynos-acpm-dvfs.c +++ b/drivers/firmware/samsung/exynos-acpm-dvfs.c @@ -21,22 +21,6 @@ #define ACPM_DVFS_FREQ_REQ 0 #define ACPM_DVFS_FREQ_GET 1 =20 -static void acpm_dvfs_set_xfer(struct acpm_xfer *xfer, u32 *cmd, size_t cm= dlen, - unsigned int acpm_chan_id, bool response) -{ - xfer->acpm_chan_id =3D acpm_chan_id; - xfer->txcnt =3D cmdlen; - xfer->txd =3D cmd; - - if (response) { - xfer->rxcnt =3D cmdlen; - xfer->rxd =3D cmd; - } else { - xfer->rxcnt =3D 0; - xfer->rxd =3D NULL; - } -} - static void acpm_dvfs_init_set_rate_cmd(u32 cmd[4], unsigned int clk_id, unsigned long rate) { @@ -54,7 +38,7 @@ int acpm_dvfs_set_rate(struct acpm_handle *handle, u32 cmd[4]; =20 acpm_dvfs_init_set_rate_cmd(cmd, clk_id, rate); - acpm_dvfs_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, false); + acpm_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, false); =20 return acpm_do_xfer(handle, &xfer); } @@ -74,7 +58,7 @@ unsigned long acpm_dvfs_get_rate(struct acpm_handle *hand= le, int ret; =20 acpm_dvfs_init_get_rate_cmd(cmd, clk_id); - acpm_dvfs_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); + acpm_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); =20 ret =3D acpm_do_xfer(handle, &xfer); if (ret) diff --git a/drivers/firmware/samsung/exynos-acpm-pmic.c b/drivers/firmware= /samsung/exynos-acpm-pmic.c index 0c50993cc9a8..f032f2c69685 100644 --- a/drivers/firmware/samsung/exynos-acpm-pmic.c +++ b/drivers/firmware/samsung/exynos-acpm-pmic.c @@ -58,16 +58,6 @@ static inline u32 acpm_pmic_get_bulk(u32 data, unsigned = int i) return (data >> (ACPM_PMIC_BULK_SHIFT * i)) & ACPM_PMIC_BULK_MASK; } =20 -static void acpm_pmic_set_xfer(struct acpm_xfer *xfer, u32 *cmd, size_t cm= dlen, - unsigned int acpm_chan_id) -{ - xfer->txd =3D cmd; - xfer->rxd =3D cmd; - xfer->txcnt =3D cmdlen; - xfer->rxcnt =3D cmdlen; - xfer->acpm_chan_id =3D acpm_chan_id; -} - static void acpm_pmic_init_read_cmd(u32 cmd[4], u8 type, u8 reg, u8 chan) { cmd[0] =3D FIELD_PREP(ACPM_PMIC_TYPE, type) | @@ -86,7 +76,7 @@ int acpm_pmic_read_reg(struct acpm_handle *handle, int ret; =20 acpm_pmic_init_read_cmd(cmd, type, reg, chan); - acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); + acpm_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); =20 ret =3D acpm_do_xfer(handle, &xfer); if (ret) @@ -119,7 +109,7 @@ int acpm_pmic_bulk_read(struct acpm_handle *handle, return -EINVAL; =20 acpm_pmic_init_bulk_read_cmd(cmd, type, reg, chan, count); - acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); + acpm_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); =20 ret =3D acpm_do_xfer(handle, &xfer); if (ret) @@ -159,7 +149,7 @@ int acpm_pmic_write_reg(struct acpm_handle *handle, int ret; =20 acpm_pmic_init_write_cmd(cmd, type, reg, chan, value); - acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); + acpm_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); =20 ret =3D acpm_do_xfer(handle, &xfer); if (ret) @@ -199,7 +189,7 @@ int acpm_pmic_bulk_write(struct acpm_handle *handle, return -EINVAL; =20 acpm_pmic_init_bulk_write_cmd(cmd, type, reg, chan, count, buf); - acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); + acpm_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); =20 ret =3D acpm_do_xfer(handle, &xfer); if (ret) @@ -229,7 +219,7 @@ int acpm_pmic_update_reg(struct acpm_handle *handle, int ret; =20 acpm_pmic_init_update_cmd(cmd, type, reg, chan, value, mask); - acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); + acpm_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); =20 ret =3D acpm_do_xfer(handle, &xfer); if (ret) diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/sams= ung/exynos-acpm.c index 896fbdc2700e..c4aca61a63e4 100644 --- a/drivers/firmware/samsung/exynos-acpm.c +++ b/drivers/firmware/samsung/exynos-acpm.c @@ -470,6 +470,32 @@ int acpm_do_xfer(struct acpm_handle *handle, const str= uct acpm_xfer *xfer) return acpm_wait_for_message_response(achan, xfer); } =20 +/** + * acpm_set_xfer() - initialize an ACPM IPC transfer structure. + * @xfer: pointer to the ACPM transfer structure that is being initialized. + * @cmd: pointer to the buffer containing the command to be transmitted + * to the ACPM firmware. + * @cmdcnt: length of the command in 32-bit words. + * @acpm_chan_id: mailbox channel identifier. + * @response: boolean flag indicating whether the kernel expects the ACPM + * firmware to send a reply to this specific command. + */ +static void acpm_set_xfer(struct acpm_xfer *xfer, u32 *cmd, size_t cmdcnt, + unsigned int acpm_chan_id, bool response) +{ + xfer->acpm_chan_id =3D acpm_chan_id; + xfer->txcnt =3D cmdcnt; + xfer->txd =3D cmd; + + if (response) { + xfer->rxcnt =3D cmdcnt; + xfer->rxd =3D cmd; + } else { + xfer->rxcnt =3D 0; + xfer->rxd =3D NULL; + } +} + /** * acpm_chan_shmem_get_params() - get channel parameters and addresses of = the * TX/RX queues. diff --git a/drivers/firmware/samsung/exynos-acpm.h b/drivers/firmware/sams= ung/exynos-acpm.h index 5df8354dc96c..708f6b0102ac 100644 --- a/drivers/firmware/samsung/exynos-acpm.h +++ b/drivers/firmware/samsung/exynos-acpm.h @@ -17,6 +17,8 @@ struct acpm_xfer { =20 struct acpm_handle; =20 +void acpm_set_xfer(struct acpm_xfer *xfer, u32 *cmd, size_t cmdcnt, + unsigned int acpm_chan_id, bool response); int acpm_do_xfer(struct acpm_handle *handle, const struct acpm_xfer *xfer); =20 --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96F34369999 for ; Thu, 23 Apr 2026 15:23:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957785; cv=none; b=HbNELS+kl2KXLsQGApJqIbekDEaYqmaSsZdUfCM+93n1Cug1rRbpOYjKFyN9JeGexqkkL1o30geuTV5/hpuBrJiK2/gpobKTb3aB6zpblLJb/9SA/V+zdkkB8i4Ya0+Nxvssx/99usC0YQc/txFFycKC+3TQ6RZUWD2MPy3YR+o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957785; c=relaxed/simple; bh=gury5o9fYQVnz5W9CUhyVTJ47BHUwb3hn+iE10aL2Hg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BvRlGagvmO7f9tVazePYUL+KNYIoRX4nYZJMmgOZyWzqitNJ5axWhHn+J5LloOu07QduH8J78i61OzJLwZQdUbCo2SdPymngOwu2w5tXDKc9yYeT4RlPZEGgCVcwHTXQfqpk5/tfiKjpXsU59RRNDYGWJcAja+dj7rsF/iMD09I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=LgzzNB7J; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="LgzzNB7J" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-48374014a77so88947405e9.3 for ; Thu, 23 Apr 2026 08:23:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957781; x=1777562581; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=5JCThqhLH7NqPNtx6lIFMXhC0R0ZENSripHC9ZQYy5U=; b=LgzzNB7JBQu42//n6yFjQskEW1mXxvv5rt1e9kA9WYUUMar/kWtA2mKfxtJ/FQlWE8 ZzIx50EliucmykkSWvWFQaJLJ73GhAIJe0amseF9vEPWwIYu0WcYSqfgicz8GBcJQ1oR JJ4mziBHE0jLsWXjDFurj9+FadSrulj8HSvCzq1hXHSGQzaUi9+S3VjubqQZwEIOku6Q ap1Y4CURWUbw3by80qgomRwqh0tbhaV3zksgqzMWgW5Vm59cHyHwiLAFWtAOISzZKi4F BANI/UKB2bvzwOnejjsJVgFqqtXAsx6SkGZlxwm7amLRD13P0v7Nx6IPtF8dW480C4Ms oIMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957781; x=1777562581; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=5JCThqhLH7NqPNtx6lIFMXhC0R0ZENSripHC9ZQYy5U=; b=p2I5dRdiGHlafq7C5Zm/ORBfdCpV4+5asqBab78Ht1tROAvMMyaXv20yblXGOblZRI mYaoJHj2t8XxGQajvAggWGZ5xP5E8oVoHSo7YFRl4jFJFr90HGAR+N7cOnM+X1P4zf6t Acrkz4XLKy/BWxKfhEA2Uk/k4baQSItXMFYoXWQkD4LU/Hi/hhxR5rRCrZgzwdysic4r qFVVGlkUpow12t0tUb9l6riyo6wHJcOsG7ikG09fhi+JDTdKsj3JRFxO4WlvMn6oAYAf otNFNp9BF/VwbwVBoCshdDhkdjHLW5N7r8wVU7Yxc6d6DYoo/ODjjCDpaE3vV4U77fiK VEuw== X-Forwarded-Encrypted: i=1; AFNElJ9ThHTF2k3Dxkn2Ff86DlhFyLXWwYvIjWaOWO7U84gMy7N0MTcgDprJ09joNsKbmjjyLna4Eq8esYmDRlQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yyuj4e6TOzOAj3kDRwrJ6hteciP8owLokgH4/3nRyVfzaGYjYo2 gIwbzK9/ylTqcLHED6UYfW8ZiXcc9pWBIsCi6c7MWj3TNoEUetMNrzdAxlJyjvoTO5w= X-Gm-Gg: AeBDietjLXObRKOf0vpDjBMues3dbr0E8JwyNArzqwMwpdEWDF/H4bWws8dntnZHkni 7oCx0LHy4CI5IwnO+IZQjYWLZ3MbsqBst+rOFE2tjfUSMSuZPkY4yCPiYYxDquJOdIZnWQErkbI kY7qjqKyr3137j+y4O+xv+n4kjTBmVTU1YVYvk4l7sN8q/o0RlQlrQsGrEoH7R5/iPMgxDGcgRl ZWY41Q6viVNV8wclZyKZ32vJEBD9dP71MzCq6muGZck5bP+4SwUjNAcFUpbK5OLP8TG3GQZO1Cl GId6eY5/pgRbj4DDx5WeTPRXj6lLYipuCvyq5ycUetLP6fx3QmzAR8U1O4zHAH8kfsz9U1QDnqn gxcgoHGdpSDXLTP+GUb7b6FJHhT8QAh2MaFEpYqlf0wh62bHL4NaCOrvEkyvzwSFfu1bJEjJ17i CE3fhK5JyPja4ttrrfoV44vSPK01e7f8zB6KV/g0cv3aphdCJ2cc/szoURJNTb3ZfnH2raP3O0F CZ/fUhZZmdYnso3tg== X-Received: by 2002:a05:600c:8717:b0:48a:568f:ae6d with SMTP id 5b1f17b1804b1-48a568faffemr168084565e9.8.1776957780945; Thu, 23 Apr 2026 08:23:00 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:00 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:51 +0000 Subject: [PATCH v4 03/11] firmware: samsung: acpm: Annotate rx_data->cmd with __counted_by_ptr Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-3-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=2360; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=gury5o9fYQVnz5W9CUhyVTJ47BHUwb3hn+iE10aL2Hg=; b=rnq8EwtbRM8Uo4+EdwheI9WJInqZ2Ii7f76t+qs1T0eX1VEh7VaHRXuo3uQIS5mJhWB2Hl3W3 K9JwcPUFqrTCwdeRp4V5y5l9W2cA/B6S/kY9D29yeAnF06612VjIT9V X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Rename the `n_cmd` member of `struct acpm_rx_data` to `cmdcnt` to maintain consistent nomenclature across the driver (aligning with `txcnt`, `rxcnt`, and transfer helpers). With the member renamed, annotate the dynamically allocated `cmd` pointer with the `__counted_by_ptr(cmdcnt)` macro to improve runtime bounds checking. Signed-off-by: Tudor Ambarus --- drivers/firmware/samsung/exynos-acpm.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/sams= ung/exynos-acpm.c index c4aca61a63e4..e5c85d769d0a 100644 --- a/drivers/firmware/samsung/exynos-acpm.c +++ b/drivers/firmware/samsung/exynos-acpm.c @@ -103,12 +103,12 @@ struct acpm_queue { * struct acpm_rx_data - RX queue data. * * @cmd: pointer to where the data shall be saved. - * @n_cmd: number of 32-bit commands. + * @cmdcnt: allocated capacity of the @cmd buffer in 32-bit words. * @rxcnt: expected length of the response in 32-bit words. */ struct acpm_rx_data { - u32 *cmd; - size_t n_cmd; + u32 *cmd __counted_by_ptr(cmdcnt); + size_t cmdcnt; size_t rxcnt; }; =20 @@ -384,7 +384,7 @@ static void acpm_prepare_xfer(struct acpm_chan *achan, =20 /* Clear data for upcoming responses */ rx_data =3D &achan->rx_data[achan->seqnum - 1]; - memset(rx_data->cmd, 0, sizeof(*rx_data->cmd) * rx_data->n_cmd); + memset(rx_data->cmd, 0, sizeof(*rx_data->cmd) * rx_data->cmdcnt); /* zero means no response expected */ rx_data->rxcnt =3D xfer->rxcnt; =20 @@ -537,19 +537,19 @@ static int acpm_achan_alloc_cmds(struct acpm_chan *ac= han) { struct device *dev =3D achan->acpm->dev; struct acpm_rx_data *rx_data; - size_t cmd_size, n_cmd; + size_t cmd_size, cmdcnt; int i; =20 if (achan->mlen =3D=3D 0) return 0; =20 cmd_size =3D sizeof(*(achan->rx_data[0].cmd)); - n_cmd =3D DIV_ROUND_UP_ULL(achan->mlen, cmd_size); + cmdcnt =3D DIV_ROUND_UP_ULL(achan->mlen, cmd_size); =20 for (i =3D 0; i < ACPM_SEQNUM_MAX; i++) { rx_data =3D &achan->rx_data[i]; - rx_data->n_cmd =3D n_cmd; - rx_data->cmd =3D devm_kcalloc(dev, n_cmd, cmd_size, GFP_KERNEL); + rx_data->cmdcnt =3D cmdcnt; + rx_data->cmd =3D devm_kcalloc(dev, cmdcnt, cmd_size, GFP_KERNEL); if (!rx_data->cmd) return -ENOMEM; } --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85B8B36897E for ; Thu, 23 Apr 2026 15:23:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957786; cv=none; b=W9lfaNliAuNCeOaYWJBF/IiNEEakW0btB4r6dMXJvxgqYvkaHPL/0TG8sHFmEIUPVwjyJgDpKhKAwBMfsHTowACnT/qtpTrQ82BijQZplGfIlrUV2iWKmRDgM4xSM79VBA4xqz6BJlKfS72i23lCRacwR2KTmZd9ovddpvdr43c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957786; c=relaxed/simple; bh=6Fhzjxw+vi8XP19sFgBxNUlkscVh4nTSp5CfK4gr45o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LZBIuSB4SLBLsXBmP5SWNae+CmGCznkkOksp53bguBqh1BPi8J0YTKB7Mv2laGl0c5dD5jxlI0z2UzEq4Vj7h/7W3WLIrIVDWMmERhrn6U8CP9IXxXDhhuFHuxx3H/uyqAEa/bhQZuA/CIx8ODCtHFwu8H6EfTEpGnGwbD3Z/hc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=mZX7+hid; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="mZX7+hid" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-488af9fdaa7so41351465e9.1 for ; Thu, 23 Apr 2026 08:23:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957781; x=1777562581; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=EN4V9UR7DRre5LEE2+ZTpG14TXvnUwqmjv4/QNq2Ugs=; b=mZX7+hidc61FA6sH/uyYWJldAoksCQcQsVAhILJPId2UQIio9Ged0bLOmGtAA5UflZ AQC+l1Fkvp4MziSQgyZbOX2Fs06xSkOqnziv5hTUiGR2oDD7QCF2H3Ht6NG60mDdwDtt H/vE/n98RVt96vVl106DByEk3DNimyuz5WZxVXSrfZ+hQ+wL4yHnZwW5kr+QOy9hvFHB 40sYhLjK7WGmSXkA9CbK9PlyirO8jAjMUZN49Wk2U1XsLc9Kl8EMs8K3znv8uxrviQUK 6uLwsd41GoL+fQvOUmS8r5oZ+2eX6KvMIZWOgfiLUnau4OXWjLqSm6kreh5tXBT9fHbl PlWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957781; x=1777562581; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=EN4V9UR7DRre5LEE2+ZTpG14TXvnUwqmjv4/QNq2Ugs=; b=nmHXBfgDmLTpdu82V3573D8UyyUi1Bjw5wl8SDmE8NGYoxfPz7yLrY2QDgZDPh9+1t YEXmoKTEtKocC31xrL81hhJsBXn+O+Q8pPCmhNlDQzX1PZu3fhVSLj0rPccvIpru9qzW 2lzkoE/KHMuKO1gJ+OzOjOdoidNpJ908D2lg9Z/YKhXX4gmdhkBykiWccHHLq1eIdouf nYbQwI+gaGxyM3thXSz815oxsjJS40hEa6xyOhXipiVCbceVpqTyBQQlg/Vhwjl8d2db 3H/YOlbFrZPGIQQ6jWtkreymVGCTu5RPiQVyPWIVyoiKLL5crHqiSU66GFtjLXPOt/3r Ufww== X-Forwarded-Encrypted: i=1; AFNElJ9IuWjrjjm9AFLRNP/KYQ498bv0hVTCWLSX3v3cRxzaFvG4CP7znxPTcQIWun2oQtLiYdYJNoWRsPbdvUY=@vger.kernel.org X-Gm-Message-State: AOJu0YyA2xxbeIpl3Qy6KncXbAML2zV+vspWZYl8U4SI7XJ/lvgWxWke fCoTujuOk2NTy0bFY2il87lG235DX+xKg7c/aS1fj4qdDv4WNTcyzXjdHFky0UTbtR0= X-Gm-Gg: AeBDietY4hNIyPcXEsV1o3q0WJOypJVBkPGbqkp+OsjbKQlRcfDklMeLPvQVfVavcw/ d71fDK6VnBYOgHTkatreru5VIdV/sc72SDQhBIVJjgWJW5x8OUjWgSqDR0xELPMwAoaX9+tyjl9 dF63yvo2H8CUOBWOMh98PJMJmnwQ7tXJe9i92p2XcE/SbWsHqrqJ9iMbGghiC6qsWkBU1xxsPEC mI/GehnZ0o8A8xByExhh6+j0saMK9eUTgDvs4T9WMz0S5WQRGXA3sLSjkpiAXO1TRUOw73+OqBz x55YN8OHAKSNOhS4Qqk/T24lIVBjRpxhcnM6nX4DwSfjzyYkbjjJX8ylD58bs95E0YAYcepUlJY Mu/5m0JNz/lkKuoV88sRYL3cjqruGI4DwFkuPSxdZJr3QldBQR9eViKnAnynv5h+XZ1gv2E7IM6 6h11+jdGEqv4B+49iLh89d6fAvKV0iqhRqFjSE0SNwBMhZUfcqTKbcXode/i38PdVDaf0tXLcON 3oMmg1t9av/n+QT2w== X-Received: by 2002:a05:600c:a105:b0:486:fb69:4960 with SMTP id 5b1f17b1804b1-488fb7786e4mr293834645e9.19.1776957781446; Thu, 23 Apr 2026 08:23:01 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:01 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:52 +0000 Subject: [PATCH v4 04/11] firmware: samsung: acpm: Drop redundant _ops suffix in acpm_ops members Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-4-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=4435; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=6Fhzjxw+vi8XP19sFgBxNUlkscVh4nTSp5CfK4gr45o=; b=m4fvvg7wwQHeVb0yPnYIqHEWlawnheJct73ayBmrt0vkfwIxMaAcSV6BGF7raasQPHx7k6W2Y gg/2Y1LaGpgDZ1YNuIQjhH8k3GmTU4AO/Uu4HrbMnBnxExDYFknXje1 X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Rename the `dvfs_ops` and `pmic_ops` members of `struct acpm_ops` to `dvfs` and `pmic` respectively. Since these members are housed within the `acpm_ops` structure and utilize the `acpm_*_ops` types, the `_ops` suffix on the variable names creates unnecessary redundancy (e.g., `handle.ops.dvfs_ops`). This cleanup removes the stuttering, leading to cleaner consumer code. Signed-off-by: Tudor Ambarus --- drivers/clk/samsung/clk-acpm.c | 8 ++++---- drivers/firmware/samsung/exynos-acpm.c | 4 ++-- drivers/mfd/sec-acpm.c | 6 +++--- include/linux/firmware/samsung/exynos-acpm-protocol.h | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/clk/samsung/clk-acpm.c b/drivers/clk/samsung/clk-acpm.c index d8944160793a..93667777094c 100644 --- a/drivers/clk/samsung/clk-acpm.c +++ b/drivers/clk/samsung/clk-acpm.c @@ -68,8 +68,8 @@ static unsigned long acpm_clk_recalc_rate(struct clk_hw *= hw, { struct acpm_clk *clk =3D to_acpm_clk(hw); =20 - return clk->handle->ops.dvfs_ops.get_rate(clk->handle, - clk->mbox_chan_id, clk->id); + return clk->handle->ops.dvfs.get_rate(clk->handle, clk->mbox_chan_id, + clk->id); } =20 static int acpm_clk_determine_rate(struct clk_hw *hw, @@ -89,8 +89,8 @@ static int acpm_clk_set_rate(struct clk_hw *hw, unsigned = long rate, { struct acpm_clk *clk =3D to_acpm_clk(hw); =20 - return clk->handle->ops.dvfs_ops.set_rate(clk->handle, - clk->mbox_chan_id, clk->id, rate); + return clk->handle->ops.dvfs.set_rate(clk->handle, clk->mbox_chan_id, + clk->id, rate); } =20 static const struct clk_ops acpm_clk_ops =3D { diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/sams= ung/exynos-acpm.c index e5c85d769d0a..a2cd54ee4589 100644 --- a/drivers/firmware/samsung/exynos-acpm.c +++ b/drivers/firmware/samsung/exynos-acpm.c @@ -627,8 +627,8 @@ static int acpm_channels_init(struct acpm_info *acpm) */ static void acpm_setup_ops(struct acpm_info *acpm) { - struct acpm_dvfs_ops *dvfs_ops =3D &acpm->handle.ops.dvfs_ops; - struct acpm_pmic_ops *pmic_ops =3D &acpm->handle.ops.pmic_ops; + struct acpm_dvfs_ops *dvfs_ops =3D &acpm->handle.ops.dvfs; + struct acpm_pmic_ops *pmic_ops =3D &acpm->handle.ops.pmic; =20 dvfs_ops->set_rate =3D acpm_dvfs_set_rate; dvfs_ops->get_rate =3D acpm_dvfs_get_rate; diff --git a/drivers/mfd/sec-acpm.c b/drivers/mfd/sec-acpm.c index 0e23b9d9f7ee..9e15b260b8df 100644 --- a/drivers/mfd/sec-acpm.c +++ b/drivers/mfd/sec-acpm.c @@ -391,7 +391,7 @@ static int sec_pmic_acpm_bus_write(void *context, const= void *data, { struct sec_pmic_acpm_bus_context *ctx =3D context; struct acpm_handle *acpm =3D ctx->shared->acpm; - const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic_ops; + const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic; size_t val_count =3D count - BITS_TO_BYTES(ACPM_ADDR_BITS); const u8 *d =3D data; const u8 *vals =3D &d[BITS_TO_BYTES(ACPM_ADDR_BITS)]; @@ -411,7 +411,7 @@ static int sec_pmic_acpm_bus_read(void *context, const = void *reg_buf, size_t reg { struct sec_pmic_acpm_bus_context *ctx =3D context; struct acpm_handle *acpm =3D ctx->shared->acpm; - const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic_ops; + const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic; const u8 *r =3D reg_buf; u8 reg; =20 @@ -430,7 +430,7 @@ static int sec_pmic_acpm_bus_reg_update_bits(void *cont= ext, unsigned int reg, un { struct sec_pmic_acpm_bus_context *ctx =3D context; struct acpm_handle *acpm =3D ctx->shared->acpm; - const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic_ops; + const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic; =20 return pmic_ops->update_reg(acpm, ctx->shared->acpm_chan_id, ctx->type, r= eg & 0xff, ctx->shared->speedy_channel, val, mask); diff --git a/include/linux/firmware/samsung/exynos-acpm-protocol.h b/includ= e/linux/firmware/samsung/exynos-acpm-protocol.h index d4db2796a6fb..b206efa62be6 100644 --- a/include/linux/firmware/samsung/exynos-acpm-protocol.h +++ b/include/linux/firmware/samsung/exynos-acpm-protocol.h @@ -36,8 +36,8 @@ struct acpm_pmic_ops { }; =20 struct acpm_ops { - struct acpm_dvfs_ops dvfs_ops; - struct acpm_pmic_ops pmic_ops; + struct acpm_dvfs_ops dvfs; + struct acpm_pmic_ops pmic; }; =20 /** --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 84951370D4A for ; Thu, 23 Apr 2026 15:23:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957787; cv=none; b=h4tQ5VbIFDz+OEa6Bu4sGQGQJ9nVLv8IY/kK7UdhwosFc2JFl+B0W72pnfxH/Ok/YebkGoJc/0SwwDLWMzLiEJwS/kNYWCCSIbzyaPf2rwxb55IP6+2n8FO/9EXBkkN23G+Rc0eBfdk10QvO6RWbEY9xjHzwRLABumJ5+UGK88w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957787; c=relaxed/simple; bh=wmSJ4leNLyELML627FEDTONj947cYs+EgV6hiLIWw+Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Po76gUcdlMTYwdjemxLgL+fZeBcd86pUUqcyAYh6RZI0kMtEPzUB01WafH3jyIBw43b3Wg6GQGOAZz7Ky1Sluvjcpw92MY1B1HlpOVGq341af7yHG4FzqfpilW4qYC3TMo2op1Fj+WVEmMtCtat7owCCt2OyqmZicsrFpHSNGaM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=O3CEo/To; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="O3CEo/To" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-4891c00e7aeso44164975e9.2 for ; Thu, 23 Apr 2026 08:23:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957783; x=1777562583; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=uoK1C2zStDqs2HDGBFigq8hHFdAU01w+3goGRavdu6k=; b=O3CEo/ToVAe550MkMX20OXgGItWnsi5C5GBxQu4FHSrTgJJ/Sx+ucUqhqzXyNpU2OT /6R8cgSNEoUlFygmJxtsIS0y0+Mg9DcWGP95FlPTG0uYhrVDn5SfMKWCjS86QbU0LAjU yPGh8GgmTOpzX1E0ibfLrRF1kg2G8Sgu1/c1yZXHzlic5bmU3MXDEMIu/RkhaGFGxpH1 MYMOdOnFHUjCkiPo8xb7NUzCDTCWpT/mPLM+tIK0LjFmICFFqhIxiPrFrgvIRsspUlwf YbENrgmBOy019ff8jdE13pnCgg3nunMF+td3V5Ce+z6W4rM3bP8qSSnjSj1klMe1X1WK dYHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957783; x=1777562583; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=uoK1C2zStDqs2HDGBFigq8hHFdAU01w+3goGRavdu6k=; b=T/VKMQzsOT3g6wIVNd3MrQaW9zU88hh/xsGGMK5k3JEGl1If7/oEBUjfLtUle4gfQ0 Sh9PzMMbc80pYG5XrRz4/1oATmCo8zNgKCrtjMH8NUjuymgFzVkDkdo+goVtpp315+m1 jfL96JDr54JIuu8hC6PMVLFNEhYa5t0mtWGsOYx+GDjjOPLMrqyN9OvaNp2fuTwyvVnk SPv2gAj0SFVBerstUx85H5Ouwsd5Rb5KkcMdGRRc/vE6JtqNZjzTMVwe4Tt5/4gmuYCR l8CUqwU4ZYn728/NpIj84mRGLw67JHrHAc9X+okTvdGv5mJngJeCTUo2pE3G+19/UJbt wEXg== X-Forwarded-Encrypted: i=1; AFNElJ9hrMStEYP5W1LGZseD3erUffNpMoT4qdFqDGVfivhyZFQ5ZDhWTSvqlEoxAvgNs5ek7qj/oP2OMzOQoYI=@vger.kernel.org X-Gm-Message-State: AOJu0YyGnZ4hs16d5MgRlP+fcqdol2PJVprh3DRWLqyLPaMc1nIqiLC3 TfX3ElG+edK04rC3tzbD+/PIzCYrE59YCsm/lTWD34Q90YP5NGOZmK8YaAw6dFMf7xk= X-Gm-Gg: AeBDietlrJFJpxnfE/uAnBvO8HUbWqabSz0D2aoRbtmuE+ahEi591aa+wWUv1LoVOo6 waVaZ2DhAJWPx3EgyBsAm4hASG3XgWO6vxXC2GEJtU01ax/AjIo9icekGqRccb8p1uDIhBxfDPc 0ESIgzRL6vgKw91N1DLOIzNA5FbYPX3pXICEku2BoLCBF6NTpPwe9MbV/ZuJxmcesoXSln2XsDS SioGIkcsiUc728ww6d2unvfN8OsyqFxzUAS/sDN8qqA0MwsYVAl7G3QYfLECtwZlB846yMNisyN esMcZMV+AKzgKBoeyp9AgZKelhHu0iRUGngIpW/uChIxdKHp6PPvvTGoA1vocqMJBxltsGgWHCz mmKnooPpn/L3fZ/UA90+98in+Eu1P9RWp7yxWQ2tVKE5HLYhngohyI3lCmxOI4v1ahPmrIzjaGl XJhpb7NI8gbOjlN1zSBj0GGMxYqXwPUvhSqqG7ylCC/U8zBwq98jshY1akEI4NXm55Y3WhECTTY bo3bQD07dCkXKU8kg== X-Received: by 2002:a05:600c:6289:b0:488:f941:aab2 with SMTP id 5b1f17b1804b1-488fb78a561mr382038865e9.30.1776957782397; Thu, 23 Apr 2026 08:23:02 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:01 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:53 +0000 Subject: [PATCH v4 05/11] firmware: samsung: acpm: Make acpm_ops const and access via pointer Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-5-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=6122; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=wmSJ4leNLyELML627FEDTONj947cYs+EgV6hiLIWw+Q=; b=BNyvDPIvGqa6/baxNysPZ0qCl8LZAy+enzTQt4VLh7RQ3zyZPXe3Jc6F07To8ReEXWUrzZgfV t25sgONY5DyCjkQDnN05QW80Bd/6kpW4iksNcx/rOZfje6/YKiWr21x X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Replace the embedded `struct acpm_ops` inside `struct acpm_handle` with a pointer to a `const struct acpm_ops`. Previously, the operations structure was embedded directly within the handle and populated dynamically at runtime via `acpm_setup_ops()`. This resulted in mutable function pointers and unnecessary per-instance memory overhead. By defining `exynos_acpm_driver_ops` statically as a `const` structure, the function pointers are now safely housed in the read-only `.rodata` section. This improves security by preventing function pointer overwrites, saves memory, and slightly reduces initialization overhead in `acpm_probe()`. Consequently, update all consumer drivers (clk, mfd) to access the operations via the new pointer indirection (`->ops->`). Finally, fix the previously empty kernel-doc description for the ops member to reflect its new pointer nature. Signed-off-by: Tudor Ambarus --- drivers/clk/samsung/clk-acpm.c | 8 ++--- drivers/firmware/samsung/exynos-acpm.c | 36 ++++++++++--------= ---- drivers/mfd/sec-acpm.c | 6 ++-- .../linux/firmware/samsung/exynos-acpm-protocol.h | 4 +-- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/drivers/clk/samsung/clk-acpm.c b/drivers/clk/samsung/clk-acpm.c index 93667777094c..953ca8d5720a 100644 --- a/drivers/clk/samsung/clk-acpm.c +++ b/drivers/clk/samsung/clk-acpm.c @@ -68,8 +68,8 @@ static unsigned long acpm_clk_recalc_rate(struct clk_hw *= hw, { struct acpm_clk *clk =3D to_acpm_clk(hw); =20 - return clk->handle->ops.dvfs.get_rate(clk->handle, clk->mbox_chan_id, - clk->id); + return clk->handle->ops->dvfs.get_rate(clk->handle, clk->mbox_chan_id, + clk->id); } =20 static int acpm_clk_determine_rate(struct clk_hw *hw, @@ -89,8 +89,8 @@ static int acpm_clk_set_rate(struct clk_hw *hw, unsigned = long rate, { struct acpm_clk *clk =3D to_acpm_clk(hw); =20 - return clk->handle->ops.dvfs.set_rate(clk->handle, clk->mbox_chan_id, - clk->id, rate); + return clk->handle->ops->dvfs.set_rate(clk->handle, clk->mbox_chan_id, + clk->id, rate); } =20 static const struct clk_ops acpm_clk_ops =3D { diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/sams= ung/exynos-acpm.c index a2cd54ee4589..38f40fb67ea7 100644 --- a/drivers/firmware/samsung/exynos-acpm.c +++ b/drivers/firmware/samsung/exynos-acpm.c @@ -621,30 +621,26 @@ static int acpm_channels_init(struct acpm_info *acpm) return 0; } =20 -/** - * acpm_setup_ops() - setup the operations structures. - * @acpm: pointer to the driver data. - */ -static void acpm_setup_ops(struct acpm_info *acpm) -{ - struct acpm_dvfs_ops *dvfs_ops =3D &acpm->handle.ops.dvfs; - struct acpm_pmic_ops *pmic_ops =3D &acpm->handle.ops.pmic; - - dvfs_ops->set_rate =3D acpm_dvfs_set_rate; - dvfs_ops->get_rate =3D acpm_dvfs_get_rate; - - pmic_ops->read_reg =3D acpm_pmic_read_reg; - pmic_ops->bulk_read =3D acpm_pmic_bulk_read; - pmic_ops->write_reg =3D acpm_pmic_write_reg; - pmic_ops->bulk_write =3D acpm_pmic_bulk_write; - pmic_ops->update_reg =3D acpm_pmic_update_reg; -} - static void acpm_clk_pdev_unregister(void *data) { platform_device_unregister(data); } =20 +static const struct acpm_ops exynos_acpm_driver_ops =3D { + .dvfs =3D { + .set_rate =3D acpm_dvfs_set_rate, + .get_rate =3D acpm_dvfs_get_rate, + }, + + .pmic =3D { + .read_reg =3D acpm_pmic_read_reg, + .bulk_read =3D acpm_pmic_bulk_read, + .write_reg =3D acpm_pmic_write_reg, + .bulk_write =3D acpm_pmic_bulk_write, + .update_reg =3D acpm_pmic_update_reg, + }, +}; + static int acpm_probe(struct platform_device *pdev) { const struct acpm_match_data *match_data; @@ -689,7 +685,7 @@ static int acpm_probe(struct platform_device *pdev) if (ret) return dev_err_probe(dev, ret, "Failed to add mbox free action.\n"); =20 - acpm_setup_ops(acpm); + acpm->handle.ops =3D &exynos_acpm_driver_ops; =20 platform_set_drvdata(pdev, acpm); =20 diff --git a/drivers/mfd/sec-acpm.c b/drivers/mfd/sec-acpm.c index 9e15b260b8df..3397d13d3b7f 100644 --- a/drivers/mfd/sec-acpm.c +++ b/drivers/mfd/sec-acpm.c @@ -391,7 +391,7 @@ static int sec_pmic_acpm_bus_write(void *context, const= void *data, { struct sec_pmic_acpm_bus_context *ctx =3D context; struct acpm_handle *acpm =3D ctx->shared->acpm; - const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic; + const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops->pmic; size_t val_count =3D count - BITS_TO_BYTES(ACPM_ADDR_BITS); const u8 *d =3D data; const u8 *vals =3D &d[BITS_TO_BYTES(ACPM_ADDR_BITS)]; @@ -411,7 +411,7 @@ static int sec_pmic_acpm_bus_read(void *context, const = void *reg_buf, size_t reg { struct sec_pmic_acpm_bus_context *ctx =3D context; struct acpm_handle *acpm =3D ctx->shared->acpm; - const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic; + const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops->pmic; const u8 *r =3D reg_buf; u8 reg; =20 @@ -430,7 +430,7 @@ static int sec_pmic_acpm_bus_reg_update_bits(void *cont= ext, unsigned int reg, un { struct sec_pmic_acpm_bus_context *ctx =3D context; struct acpm_handle *acpm =3D ctx->shared->acpm; - const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops.pmic; + const struct acpm_pmic_ops *pmic_ops =3D &acpm->ops->pmic; =20 return pmic_ops->update_reg(acpm, ctx->shared->acpm_chan_id, ctx->type, r= eg & 0xff, ctx->shared->speedy_channel, val, mask); diff --git a/include/linux/firmware/samsung/exynos-acpm-protocol.h b/includ= e/linux/firmware/samsung/exynos-acpm-protocol.h index b206efa62be6..fbf1829b33db 100644 --- a/include/linux/firmware/samsung/exynos-acpm-protocol.h +++ b/include/linux/firmware/samsung/exynos-acpm-protocol.h @@ -42,10 +42,10 @@ struct acpm_ops { =20 /** * struct acpm_handle - Reference to an initialized protocol instance - * @ops: + * @ops: pointer to the constant ACPM protocol operations. */ struct acpm_handle { - struct acpm_ops ops; + const struct acpm_ops *ops; }; =20 struct device; --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F412366561 for ; Thu, 23 Apr 2026 15:23:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957788; cv=none; b=lzoBeq/pPZINLZOdtmA+f3SQtbVtHp/j5+6JY7AYgO0gUSJ0SqRQyI85njiA/GvxMzdtB2azAyENMCmAXrBQX6nm9y5KtCAC78sYx8sqOx014BDT2oRD+LrFmqSeB/pytzWk+L84CiklbHCQTOKngmUlftJIwR1GNtSrNtgIjSg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957788; c=relaxed/simple; bh=yeIM1tygkcAJHD4Fuo6dYmfGw6Kjwz0lWPb9oCpXElA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Sf+3fvsFVN9D1osSVqzHwtvBlzc6WzQQVz2qCOOX4mw4KLvzbSRSPshMNWUSStcBGxkqhU2r9mMS28j223aXoZq/evjHhKVX82LlMIiPWJmImpUbvUvjqZ8wTbdC5wJJYbdhbjn8OwDSxR/LHc9WxuH0ZcAJ756loxLJRBvFvOQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=ap1dPu9n; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ap1dPu9n" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4891b0786beso41913605e9.1 for ; Thu, 23 Apr 2026 08:23:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957783; x=1777562583; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=WUbgzZSjuFhpqCOcKnUVLASDnnm/oM22X9b2CDF2EUE=; b=ap1dPu9n7AztdTHxjYnmxQkU62x07yaPNuef0me9Pq9kpHElQfHZslAhVb2ycQhxW/ geOIc2lv5+1r1S//QnIOI4T7Clr8YEnjw6me2tWYMICGuNgYquTUXhMTSE6Skw0FDsea jtobTq0UhxEtVanNeR+/3uRjyk5Vkt1s6CNVWF/Tt8lB/WGk72sBcEBXAiAk9bdP4/vJ rXSBXmnqACn58CR1kuR9G8/zkLMJ/dOkPvf1QET1LD6DsgVS7oqtTvx5C9vLGlw6VNC5 B9z5znMLHf0hGqxWdEuthmR3udF8rEOE7YmMzqwWNLPzVPPXZnQPQS+nQLniCPr28WuC l1kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957783; x=1777562583; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=WUbgzZSjuFhpqCOcKnUVLASDnnm/oM22X9b2CDF2EUE=; b=Ma8lmrc19E4QkPlFr7F1/1ioRBdN4+MepMVfmtOqb8+LMIr3p63gaJtsPQtHLeZX4Q PHBTjs/+opGJGfe4qzWD4vMJsLpB+zH7IiwaXPBs0kddzLhpJAr3a4NgwqG9Jeaktcsv jHTM5ic38W4WN1B67g+N5mcJdv5Iv+gunH7bLaLS7/v7spVFwHqk/IHh5BPQXmhQ3NXp 0wPgIA497FSq8CoJw2wZAtGcfbv3gEJsXufYtN4FrGgEGaidqSXVyssyPr9WL0LP4+4J 7cmrE+MUKnx00O3odT7/u5Ov1pA0ofIR24QmPAZMALHBEAekI7924JjkHW4ui4HsABo/ pjVQ== X-Forwarded-Encrypted: i=1; AFNElJ/GE42hGIVGXYBlLSolUj6b9btumXj0/33z38mKISeTLIiykeVALM1X25qTf1s/Hia0RyorzEbDd0dGDA0=@vger.kernel.org X-Gm-Message-State: AOJu0YwLwzNl7M6nDoV6eMZxiA1OTa1l5ZVJMfCVZx0gZLFaxxAyn5or sxhBWMWGmXkSZxVugA2ZVKfbF953EMKE0LAvDU+4THttXn4YdR9Nv9oPTeIyHd24YoM= X-Gm-Gg: AeBDiesitBNlpxpLBocXHpy/wDFIccqPG0/7gKk2KU1FFsrunNqoeGKePg4emwpB+ol ltmDmxGoBmQeb/wS8MjlKQ6GIR2RR07K832p91eJUrvLYaoKszUmFl7pRE+gNDz4MWdz8AG/P8e t6qEc7X7n8X2Zc8PHdFwZ0whGpRN9S9aWqdWGw5dgiff//D8qzxFMUvxOp7IUC1uTRHn6is1Qzy L9QdQiUIuodKYGTAXtSGrEmsYzcgaH7CPtmD6P1y1+hwcv0jHgQErzoDxPGrBtZXWb4+dFsQZCo TK1/rKCliJYpjxmFTfVLtEQrB5mkpV4i+UiqNFvVuXeVzQ6b60VKi4+hwDGpmZaKHM/yqs5yIBl E5JG4tTcvusBTGMF09JYSQZGQoD+Inb5TlWw7dssoJto3f2fu2QqOuEVA82MtD9by0ZtQstaGy1 Vfblx9A2Vnq/H5YNDuxEMiNPet0nPOLezeng1Ydlc6FavhG7ePRn8KOe/oS/XkAn1+0MsCIdk8N lMFBSfCOl7DwYqHy3PTcnj1yncL X-Received: by 2002:a05:600c:1c29:b0:48a:5574:3a48 with SMTP id 5b1f17b1804b1-48a55743b73mr190127085e9.16.1776957783102; Thu, 23 Apr 2026 08:23:03 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:02 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:54 +0000 Subject: [PATCH v4 06/11] firmware: samsung: acpm: Add TMU protocol support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-6-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus , Krzysztof Kozlowski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=10617; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=yeIM1tygkcAJHD4Fuo6dYmfGw6Kjwz0lWPb9oCpXElA=; b=Qn7QvHP6vi2y49sjroBwBKcwegyoEouE8Snb4n3cRYs8Q3PM/1g7nVcIGcSeTVqZDQDEmEYpO OVoyGYQ2hFdApUfOIff6JCW5i311p9AWSVx9nv9oMVwePGyJhsbKVlO X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= The Thermal Management Unit (TMU) on the Google GS101 SoC is managed through a hybrid model shared between the kernel and the Alive Clock and Power Manager (ACPM) firmware. Add the protocol helpers required to communicate with the ACPM for thermal operations, including initialization, threshold configuration, temperature reading, and system suspend/resume handshakes. Signed-off-by: Tudor Ambarus Reviewed-by: Krzysztof Kozlowski --- drivers/firmware/samsung/Makefile | 1 + drivers/firmware/samsung/exynos-acpm-tmu.c | 240 +++++++++++++++++= ++++ drivers/firmware/samsung/exynos-acpm-tmu.h | 28 +++ drivers/firmware/samsung/exynos-acpm.c | 12 ++ .../linux/firmware/samsung/exynos-acpm-protocol.h | 18 ++ 5 files changed, 299 insertions(+) diff --git a/drivers/firmware/samsung/Makefile b/drivers/firmware/samsung/M= akefile index 80d4f89b33a9..5a6f72bececf 100644 --- a/drivers/firmware/samsung/Makefile +++ b/drivers/firmware/samsung/Makefile @@ -3,4 +3,5 @@ acpm-protocol-objs :=3D exynos-acpm.o acpm-protocol-objs +=3D exynos-acpm-pmic.o acpm-protocol-objs +=3D exynos-acpm-dvfs.o +acpm-protocol-objs +=3D exynos-acpm-tmu.o obj-$(CONFIG_EXYNOS_ACPM_PROTOCOL) +=3D acpm-protocol.o diff --git a/drivers/firmware/samsung/exynos-acpm-tmu.c b/drivers/firmware/= samsung/exynos-acpm-tmu.c new file mode 100644 index 000000000000..7d9b75be032c --- /dev/null +++ b/drivers/firmware/samsung/exynos-acpm-tmu.c @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2020 Samsung Electronics Co., Ltd. + * Copyright 2020 Google LLC. + * Copyright 2026 Linaro Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "exynos-acpm.h" +#include "exynos-acpm-tmu.h" + +/* IPC Request Types */ +#define ACPM_TMU_INIT 0x01 +#define ACPM_TMU_READ_TEMP 0x02 +#define ACPM_TMU_SUSPEND 0x04 +#define ACPM_TMU_RESUME 0x10 +#define ACPM_TMU_THRESHOLD 0x11 +#define ACPM_TMU_INTEN 0x12 +#define ACPM_TMU_CONTROL 0x13 +#define ACPM_TMU_IRQ_CLEAR 0x14 + +#define ACPM_TMU_TX_DATA_LEN 8 +#define ACPM_TMU_RX_DATA_LEN 7 + +struct acpm_tmu_tx { + u16 ctx; + u16 fw_use; + u8 type; + u8 rsvd0; + u8 tzid; + u8 rsvd1; + u8 data[ACPM_TMU_TX_DATA_LEN]; +} __packed; + +struct acpm_tmu_rx { + u16 ctx; + u16 fw_use; + u8 type; + s8 ret; + u8 tzid; + s8 temp; + u8 rsvd; + u8 data[ACPM_TMU_RX_DATA_LEN]; +} __packed; + +union acpm_tmu_msg { + u32 data[4]; + struct acpm_tmu_tx tx; + struct acpm_tmu_rx rx; +}; + +static int acpm_tmu_to_linux_err(s8 fw_err) +{ + /* + * ACPM_TMU_INIT uses BIT(0) and BIT(1) of msg.rx.ret to flag APM + * capabilities. Treat zero and all positive values as success. + */ + if (fw_err >=3D 0) + return 0; + + if (fw_err =3D=3D -1) + return -EACCES; + + return -EIO; +} + +int acpm_tmu_init(struct acpm_handle *handle, unsigned int acpm_chan_id) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int ret; + + msg.tx.type =3D ACPM_TMU_INIT; + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + return acpm_tmu_to_linux_err(msg.rx.ret); +} + +int acpm_tmu_read_temp(struct acpm_handle *handle, unsigned int acpm_chan_= id, + u8 tz, int *temp) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int ret; + + msg.tx.type =3D ACPM_TMU_READ_TEMP; + msg.tx.tzid =3D tz; + + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + ret =3D acpm_tmu_to_linux_err(msg.rx.ret); + if (ret) + return ret; + + *temp =3D msg.rx.temp; + + return 0; +} + +int acpm_tmu_set_threshold(struct acpm_handle *handle, + unsigned int acpm_chan_id, u8 tz, + const u8 temperature[8], size_t tlen) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int i, ret; + + if (tlen > ACPM_TMU_TX_DATA_LEN) + return -EINVAL; + + msg.tx.type =3D ACPM_TMU_THRESHOLD; + msg.tx.tzid =3D tz; + + for (i =3D 0; i < tlen; i++) + msg.tx.data[i] =3D temperature[i]; + + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + return acpm_tmu_to_linux_err(msg.rx.ret); +} + +int acpm_tmu_set_interrupt_enable(struct acpm_handle *handle, + unsigned int acpm_chan_id, u8 tz, u8 inten) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int ret; + + msg.tx.type =3D ACPM_TMU_INTEN; + msg.tx.tzid =3D tz; + msg.tx.data[0] =3D inten; + + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + return acpm_tmu_to_linux_err(msg.rx.ret); +} + +int acpm_tmu_tz_control(struct acpm_handle *handle, unsigned int acpm_chan= _id, + u8 tz, bool enable) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int ret; + + msg.tx.type =3D ACPM_TMU_CONTROL; + msg.tx.tzid =3D tz; + msg.tx.data[0] =3D enable ? 1 : 0; + + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + return acpm_tmu_to_linux_err(msg.rx.ret); +} + +int acpm_tmu_clear_tz_irq(struct acpm_handle *handle, unsigned int acpm_ch= an_id, + u8 tz) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int ret; + + msg.tx.type =3D ACPM_TMU_IRQ_CLEAR; + msg.tx.tzid =3D tz; + + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + return acpm_tmu_to_linux_err(msg.rx.ret); +} + +int acpm_tmu_suspend(struct acpm_handle *handle, unsigned int acpm_chan_id) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int ret; + + msg.tx.type =3D ACPM_TMU_SUSPEND; + + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + return acpm_tmu_to_linux_err(msg.rx.ret); +} + +int acpm_tmu_resume(struct acpm_handle *handle, unsigned int acpm_chan_id) +{ + union acpm_tmu_msg msg =3D {0}; + struct acpm_xfer xfer; + int ret; + + msg.tx.type =3D ACPM_TMU_RESUME; + + acpm_set_xfer(&xfer, msg.data, ARRAY_SIZE(msg.data), acpm_chan_id, + true); + + ret =3D acpm_do_xfer(handle, &xfer); + if (ret) + return ret; + + return acpm_tmu_to_linux_err(msg.rx.ret); +} diff --git a/drivers/firmware/samsung/exynos-acpm-tmu.h b/drivers/firmware/= samsung/exynos-acpm-tmu.h new file mode 100644 index 000000000000..8b89f29fda67 --- /dev/null +++ b/drivers/firmware/samsung/exynos-acpm-tmu.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright 2020 Samsung Electronics Co., Ltd. + * Copyright 2020 Google LLC. + * Copyright 2026 Linaro Ltd. + */ +#ifndef __EXYNOS_ACPM_TMU_H__ +#define __EXYNOS_ACPM_TMU_H__ + +#include + +struct acpm_handle; + +int acpm_tmu_init(struct acpm_handle *handle, unsigned int acpm_chan_id); +int acpm_tmu_read_temp(struct acpm_handle *handle, unsigned int acpm_chan_= id, + u8 tz, int *temp); +int acpm_tmu_set_threshold(struct acpm_handle *handle, + unsigned int acpm_chan_id, u8 tz, + const u8 temperature[8], size_t tlen); +int acpm_tmu_set_interrupt_enable(struct acpm_handle *handle, + unsigned int acpm_chan_id, u8 tz, u8 inten); +int acpm_tmu_tz_control(struct acpm_handle *handle, unsigned int acpm_chan= _id, + u8 tz, bool enable); +int acpm_tmu_clear_tz_irq(struct acpm_handle *handle, unsigned int acpm_ch= an_id, + u8 tz); +int acpm_tmu_suspend(struct acpm_handle *handle, unsigned int acpm_chan_id= ); +int acpm_tmu_resume(struct acpm_handle *handle, unsigned int acpm_chan_id); +#endif /* __EXYNOS_ACPM_TMU_H__ */ diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/sams= ung/exynos-acpm.c index 38f40fb67ea7..655b80fc635f 100644 --- a/drivers/firmware/samsung/exynos-acpm.c +++ b/drivers/firmware/samsung/exynos-acpm.c @@ -31,6 +31,7 @@ #include "exynos-acpm.h" #include "exynos-acpm-dvfs.h" #include "exynos-acpm-pmic.h" +#include "exynos-acpm-tmu.h" =20 #define ACPM_PROTOCOL_SEQNUM GENMASK(21, 16) =20 @@ -639,6 +640,17 @@ static const struct acpm_ops exynos_acpm_driver_ops = =3D { .bulk_write =3D acpm_pmic_bulk_write, .update_reg =3D acpm_pmic_update_reg, }, + + .tmu =3D { + .init =3D acpm_tmu_init, + .read_temp =3D acpm_tmu_read_temp, + .set_threshold =3D acpm_tmu_set_threshold, + .set_interrupt_enable =3D acpm_tmu_set_interrupt_enable, + .tz_control =3D acpm_tmu_tz_control, + .clear_tz_irq =3D acpm_tmu_clear_tz_irq, + .suspend =3D acpm_tmu_suspend, + .resume =3D acpm_tmu_resume, + }, }; =20 static int acpm_probe(struct platform_device *pdev) diff --git a/include/linux/firmware/samsung/exynos-acpm-protocol.h b/includ= e/linux/firmware/samsung/exynos-acpm-protocol.h index fbf1829b33db..08d9f5c95701 100644 --- a/include/linux/firmware/samsung/exynos-acpm-protocol.h +++ b/include/linux/firmware/samsung/exynos-acpm-protocol.h @@ -35,9 +35,27 @@ struct acpm_pmic_ops { u8 type, u8 reg, u8 chan, u8 value, u8 mask); }; =20 +struct acpm_tmu_ops { + int (*init)(struct acpm_handle *handle, unsigned int acpm_chan_id); + int (*read_temp)(struct acpm_handle *handle, unsigned int acpm_chan_id, + u8 tz, int *temp); + int (*set_threshold)(struct acpm_handle *handle, + unsigned int acpm_chan_id, u8 tz, + const u8 temperature[8], size_t tlen); + int (*set_interrupt_enable)(struct acpm_handle *handle, + unsigned int acpm_chan_id, u8 tz, u8 inten); + int (*tz_control)(struct acpm_handle *handle, unsigned int acpm_chan_id, + u8 tz, bool enable); + int (*clear_tz_irq)(struct acpm_handle *handle, + unsigned int acpm_chan_id, u8 tz); + int (*suspend)(struct acpm_handle *handle, unsigned int acpm_chan_id); + int (*resume)(struct acpm_handle *handle, unsigned int acpm_chan_id); +}; + struct acpm_ops { struct acpm_dvfs_ops dvfs; struct acpm_pmic_ops pmic; + struct acpm_tmu_ops tmu; }; =20 /** --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A220376BD3 for ; Thu, 23 Apr 2026 15:23:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957789; cv=none; b=LYiy5c/QVUV8cu5bvHRkLUNZz1/W/FFq4iiCCC2KsnBzMdpNspgUtelj9jPqc8hQ+M24UBhOtse0oNDTrlVcu06xdhYwuE6BJiVC/5iQ4ydArp8MoIN68i2AGTeZTICpbfqjdOggUCG6/JBjsqoxvZJ0kmNb+cOUiQgg2FWytzE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957789; c=relaxed/simple; bh=YbKU8bNkuqniUi6opUD1cEX17xfpbeAqZSEM023mUjQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eKygA11sMQReyL73LXcz3paKlh/Jr41BtOGkk5FMfnzcN3XUnFRlj7MLDuyK2YG+X06/ETEa1D5Xi3zbb8NOJ9+7Tb+QfBBvjX6Y3fziG2/D0lFv5aEbvqod4QeOs4DlrGd/jX9/OjaG5WedueD6sysMLVhJpb9k4AbQ9lkD7as= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=HCBv9gYr; arc=none smtp.client-ip=209.85.221.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="HCBv9gYr" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-43cfd1f9fd1so4243152f8f.3 for ; Thu, 23 Apr 2026 08:23:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957784; x=1777562584; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=SFRx8vQlRrTBYadIbF6D8n4BAlzLtgQdTMGBUepLq/s=; b=HCBv9gYrqGwlmqcdlTp6ImFIYSGlEpnKto6UDlX6eUw4taAucfMlJQbadwxhid/LcN ANJxk5h9TChMAr4qlMzBUHtvneKDCF4exl5eARDnucA3qUqYbs2vohm/JsRMUTlwLelj z2NS/0neXn68+yJFvEaMv7eZhLSQ+l1+poo/HyAkFHM87lAuz8uJjAaRPb56F5ovrhwx 0ONTf6nc2flvNeykyswJht5xHBlGAvP4ND5OipxOSjFpOhZyqt8gX7nwGXiKzVbqPkrU xxyaH9KJ8jua99OIteIpA6rmA2Br6aUctExZVSzqRJho+GaNBMCzIkodqWb1zyu+WlqA PXPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957784; x=1777562584; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=SFRx8vQlRrTBYadIbF6D8n4BAlzLtgQdTMGBUepLq/s=; b=fB6rgyTF9DY0rJU3zUMPsW8m38oxlMLr7v1wCcx2KWQuswCC+eFM7NQq3L9kRU/u4a YADgxxo80lu1Cuydd43ZG7X8fq3i51KVTTYwp8ckzo5DXFMelRbnSgmzAE7K+QA8VSLR IAccBpAXp87Szj062iYm1XuUKDmfnWIVxdIx2t5EXl9aYhVboEB0V9SQJTb5m/ynub8P 4EI7INDmk+pVUeWpStNPgt38tj1yj/U3w0w1WWxD5qlzPhNKMqE8lslhXRssO+YOGIsz JgAUezeUH1hFpOQMs0Par3YBtcpHujkXqUlGXhuBVj7eYdgI9q0yciTl2wJZyX/lXGBd SXbA== X-Forwarded-Encrypted: i=1; AFNElJ8YzuMRZ0CeNiFbU/WRIp1nWLKF2u/Tdi4u/2vDq5pAscOrR0PvPpq960LbfEGj5PdtbbUCL4uQhixz1+M=@vger.kernel.org X-Gm-Message-State: AOJu0YzSnO6wqk4Lw+ZOuxah9mS203wBeZrOgl6E3qR37Fg4sV1ing+A 54ZcS7621kpx9ZThSIjLqLMpakPOvrL1enFEXatq2te8TnAAwF3e8uF38P0PG2ISzNw= X-Gm-Gg: AeBDiesyS+jN5Xus0+Q3XbXgJKKBUm/lu57dkBI/emS24ALyTBT9RgTJEK6FkZWjmsg hjqjvgRk4IXub7zIf7IkcVUovZkR6y22XM5asyM4/rSKK/gqkhsO3OYtfZdy9lDSTwmI+IUOPfS HGs5U0hXjKkIgfCs+yU/EPmexz94dL8bpn/yB6uHyyZcObolxekFZcHYSDBhkNY9JY2xa5qxbCy vUvRc0WwkxFcc6TRghzAkvCnVAvNSxEMWdMleSe3ww9WxfxEpaioJIeBQqUjsIN30cKNCuUF8z3 zZihBFuBQMjXR0TogYwXRfOBNfeaM+HOhd+G3X+6NBcwlY2ylgdvBFbSM5lSstuzRaYQ6TuPW5g pU4W7Q5BLsPmcmmSEcT8OxWL+uGXbw8Zwag9HXTqW/csKTQZ+MwabBvNCSdI4jElDlNJm9HR3m/ MiYOeId8Eeg+YKKg4bVO7rUJrt9niQa8tWq4KY/E/16nV1etsN92/O8INHoB8mvaCu81khrnbVq /OGxKwEkoO6zPR0Tg== X-Received: by 2002:a05:600c:3b14:b0:48a:52d9:54ab with SMTP id 5b1f17b1804b1-48a52d95604mr227748485e9.30.1776957783700; Thu, 23 Apr 2026 08:23:03 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:03 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:55 +0000 Subject: [PATCH v4 07/11] firmware: samsung: acpm: Add devm_acpm_get_by_phandle helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-7-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=3024; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=YbKU8bNkuqniUi6opUD1cEX17xfpbeAqZSEM023mUjQ=; b=gWU8Thuqdu+garSPEjoTkbNiCDA9yevszfEqnNqdri4bAmJgHoIk33bjFw1V63C+yxyWRNccp 1IZUWsWg+OQBSrbw4xbsja5qvOYRQjVDFPrpXNZYNlcZfXVGIx37b57 X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Introduce devm_acpm_get_by_phandle() to standardize how consumer drivers acquire a handle to the ACPM IPC interface. Enforce the use of the "samsung,acpm-ipc" property name across the SoC and simplify the boilerplate code in client drivers. The first consumer of this helper is the Exynos ACPM Thermal Management Unit (TMU) driver. The TMU utilizes a hybrid management approach: direct register access from the Application Processor (AP) is restricted to the interrupt pending (INTPEND) registers for event identification. High-level functional tasks, such as sensor initialization, threshold programming, and temperature reads, are delegated to the ACPM firmware via this IPC interface. Signed-off-by: Tudor Ambarus --- drivers/firmware/samsung/exynos-acpm.c | 23 ++++++++++++++++++= ++++ .../linux/firmware/samsung/exynos-acpm-protocol.h | 6 ++++++ 2 files changed, 29 insertions(+) diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/sams= ung/exynos-acpm.c index 655b80fc635f..6dee461f5827 100644 --- a/drivers/firmware/samsung/exynos-acpm.c +++ b/drivers/firmware/samsung/exynos-acpm.c @@ -812,6 +812,29 @@ struct acpm_handle *devm_acpm_get_by_node(struct devic= e *dev, } EXPORT_SYMBOL_GPL(devm_acpm_get_by_node); =20 +/** + * devm_acpm_get_by_phandle - Resource managed lookup of the standardized + * "samsung,acpm-ipc" handle. + * @dev: consumer device + * + * Returns a pointer to the acpm_handle on success, or an ERR_PTR on failu= re. + */ +struct acpm_handle *devm_acpm_get_by_phandle(struct device *dev) +{ + struct acpm_handle *handle; + struct device_node *np; + + np =3D of_parse_phandle(dev->of_node, "samsung,acpm-ipc", 0); + if (!np) + return ERR_PTR(-ENODEV); + + handle =3D devm_acpm_get_by_node(dev, np); + of_node_put(np); + + return handle; +} +EXPORT_SYMBOL_GPL(devm_acpm_get_by_phandle); + static const struct acpm_match_data acpm_gs101 =3D { .initdata_base =3D ACPM_GS101_INITDATA_BASE, .acpm_clk_dev_name =3D "gs101-acpm-clk", diff --git a/include/linux/firmware/samsung/exynos-acpm-protocol.h b/includ= e/linux/firmware/samsung/exynos-acpm-protocol.h index 08d9f5c95701..83cbd425b652 100644 --- a/include/linux/firmware/samsung/exynos-acpm-protocol.h +++ b/include/linux/firmware/samsung/exynos-acpm-protocol.h @@ -71,6 +71,7 @@ struct device; #if IS_ENABLED(CONFIG_EXYNOS_ACPM_PROTOCOL) struct acpm_handle *devm_acpm_get_by_node(struct device *dev, struct device_node *np); +struct acpm_handle *devm_acpm_get_by_phandle(struct device *dev); #else =20 static inline struct acpm_handle *devm_acpm_get_by_node(struct device *dev, @@ -78,6 +79,11 @@ static inline struct acpm_handle *devm_acpm_get_by_node(= struct device *dev, { return ERR_PTR(-ENODEV); } + +static inline struct acpm_handle *devm_acpm_get_by_phandle(struct device *= dev) +{ + return ERR_PTR(-ENODEV); +} #endif =20 #endif /* __EXYNOS_ACPM_PROTOCOL_H */ --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 12C09368957 for ; Thu, 23 Apr 2026 15:23:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957791; cv=none; b=vBb7ivX2uVe2PLFc/RcLLvrz45XDl+fIXejGA9ZH+vlN/Ot5q7orofrIZdE5oxjtcVq8KPsxr2X809FZptuBH3K18Wt+ELk22+mYomJrYakHA43pMuVVnBZrYnP503KJBngOKHFKjeKp8Q1kOnScsAS+9FvpA1nM1gbFIr993So= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957791; c=relaxed/simple; bh=zxg1FULbNTUkoux2Au8ZOLUPcY7E6Qx3fEcmuLPIAS4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gommTfC+SQG6ktAHk2W+n7QRWrc+/IbPDUoqH0ZFPVyOCZEtFAhTc+9foDGXYmnr+S4IlhXltfM3jlpMM3KF2YY+MX51F9yHvnmte57RxdxyYMke2kFbJ0pT4dOnF5z8VXXXnFm+AcQsg52zTpAhOyZC0BavDuhmC8faG0/nn9c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=plkvjx2w; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="plkvjx2w" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-48a3e9862f0so31783965e9.1 for ; Thu, 23 Apr 2026 08:23:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957785; x=1777562585; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=EmgllqiEN3YjH9bhlhX1QQbEhk151lq+8q6iAm7CWs8=; b=plkvjx2wW+ePOGEPf9rWbsC/4lPn/oVOAr9eNQ04XhAVCB1WoKiPeuIZuhSkipF+qu sEFhG8Zc6V7kurCVNlLPodOmcCHCeyOt6lsEppiua1qlb4xCuFmjdRGv72N1jTU3Ikni 9NyttUcjKIF2+bj1JoZ9co+dbN0dXG5KqgnI/zH7DEwNUHigiDJY580W6cU2Rv2Q5h3w ygsws/aO9A58zgSP0wYyqAOUGHcs8zzwKAGJQZxxGyEIEzxGnyAqh9DCOmq46thVozHO jrxTGlhIQMhfOBrt1auw7C8DkjfBn6uZ+cJ45kr+sR/r48fMdc1hvqCeWAnNitJQKfzf 9x6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957785; x=1777562585; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=EmgllqiEN3YjH9bhlhX1QQbEhk151lq+8q6iAm7CWs8=; b=qoAPZZRrqUXymDoZomHqPGG2BFQYXVzD++4UUCSvlMVgueYHhWVpcyLkfvVsRPDuv8 9IW6ewQo64q+WvTWQvI5MFEg6YA9Bti8GM9r9ryLE8D/xUuSEzwIelWZCIq+QNwnetRe dyKz7uz5QwmejVyn3baMmOZNkK9Lu0WuyGaEKTYj61A5emdmOtUJeXuXUZktJ33J7drl SKEYSCO1H4xOc6Cw+ZINXCgJc7xl+KlB4Rf82fa385JyGkDiTqspCJyqQj/4qzAJfvq5 w52aPJHW68UuwR8xJu7a08Kr5g5R3Q40GUN7jtG5jVcBGgAIdkqTztGH7CdhVcrZrMaB W3aQ== X-Forwarded-Encrypted: i=1; AFNElJ8b2dxzJg9AyGbqpg1PCqV2hFM5Pt5n7lomE6wwI5RIBWKxTchIJ1KNC+VF6NohZg9F26cyc0pNIowR0Fo=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8o6DI97TVmHULfOcKL97O6l80SKcXPn9JKdOQofwA+YDQg3U7 YTAPIF0hRytfPzO2jBedjoh+pkU/p78B/PfK53qtcYgbknVxYmKy7Bm9bGbTWmFl/vE= X-Gm-Gg: AeBDietV5lRDQMJIfeuzJDxLBS/LjXhs6x+yYIHMDprCBgzGotoOAwk8DlGrQii8EMA 7ZuhlbhUd9ndqIf0ydu0yJTlZMrcdKz8SFVke2WQ8aBSX5FaUT7eAmu2rUGq8ED0VlvsRs/8bpN qDPxOgMAfMplOkj2U+s8WmF4AZzh40vdkSbFiMAxAxy5PM1Um6utXYv6yDJR8woEL6C7s43mtbV 6RcXTOFXucdOtc1KjqRr3IzInMBxXxk5pvdZ7qtTEiq+dOIdqq8WSd+d6Tdc1B2HPezBmhIdJPL 8KhNPWSwuM62ZwVJB893Vk7QKXXbYnoQ+UUgtJ223YhM2mVoFpqwx4dXDKz7uxgRx/SC2flWZA9 NSo4ysY6ElwDngkTwOlctbTS7VCclIL5+SUHR0kV0tgnDbbRXaFra15C0zh+fUNyzMf1CuEE+FB PCP9H4WsnYcAh/iBxBPLcwOsAHhKsSskXy6bH0MdtOhXHn3DWGSbLFBt8vIvCrJEBKpOy+ylrq6 g4qmx/EG39Jl6YKTw== X-Received: by 2002:a05:600c:34ca:b0:48a:761:5816 with SMTP id 5b1f17b1804b1-48a07615b87mr197883155e9.8.1776957784787; Thu, 23 Apr 2026 08:23:04 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:03 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:56 +0000 Subject: [PATCH v4 08/11] thermal: samsung: Add Exynos ACPM TMU driver GS101 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-8-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus , Krzysztof Kozlowski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=17724; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=zxg1FULbNTUkoux2Au8ZOLUPcY7E6Qx3fEcmuLPIAS4=; b=xRwOnwMeYFk1vT8fK+X6ODrbo/P5smIoijFYTeD66A9tIkCSUGx9KfvFaMkrTLqxsY1GEVYRP 4gGfG+qW3JNCsIqUqJk9PVI0enf7Fn+ms4fiup6yjadFLau2Z4gNth/ X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Add driver for the Thermal Management Unit (TMU) managed via the Alive Clock and Power Manager (ACPM), found on Samsung Exynos SoCs such as Google GS101 (and Exynos850, autov920, etc.). The TMU on utilizes a hybrid management model shared between the Application Processor (AP) and the ACPM firmware. The driver maintains direct memory-mapped access to the TMU interrupt pending registers to identify thermal events, while delegating functional tasks - such as sensor initialization, threshold configuration, and temperature acquisition - to the ACPM firmware via the ACPM IPC protocol. Signed-off-by: Tudor Ambarus Acked-by: Krzysztof Kozlowski --- drivers/thermal/samsung/Kconfig | 17 ++ drivers/thermal/samsung/Makefile | 2 + drivers/thermal/samsung/acpm-tmu.c | 547 +++++++++++++++++++++++++++++++++= ++++ 3 files changed, 566 insertions(+) diff --git a/drivers/thermal/samsung/Kconfig b/drivers/thermal/samsung/Kcon= fig index f4eff5a41a84..0d3ffbdc66f0 100644 --- a/drivers/thermal/samsung/Kconfig +++ b/drivers/thermal/samsung/Kconfig @@ -9,3 +9,20 @@ config EXYNOS_THERMAL the TMU, reports temperature and handles cooling action if defined. This driver uses the Exynos core thermal APIs and TMU configuration data from the supported SoCs. + +config EXYNOS_ACPM_THERMAL + tristate "Exynos ACPM thermal management unit driver" + depends on THERMAL_OF + depends on EXYNOS_ACPM_PROTOCOL || (COMPILE_TEST && !EXYNOS_ACPM_PROTOCOL) + help + Support for the Thermal Management Unit (TMU) on Samsung Exynos SoCs + (such as Google GS101 and Exynos850). + + The TMU on these platforms is managed through a hybrid architecture. + This driver handles direct register access for thermal interrupt status + monitoring and communicates with the Alive Clock and Power Manager + (ACPM) firmware via the ACPM IPC protocol for functional sensor control + and configuration. + + Select this if you want to monitor device temperature and enable + thermal mitigation on Samsung Exynos ACPM based devices. diff --git a/drivers/thermal/samsung/Makefile b/drivers/thermal/samsung/Mak= efile index f139407150d2..daed80647c34 100644 --- a/drivers/thermal/samsung/Makefile +++ b/drivers/thermal/samsung/Makefile @@ -4,3 +4,5 @@ # obj-$(CONFIG_EXYNOS_THERMAL) +=3D exynos_thermal.o exynos_thermal-y :=3D exynos_tmu.o +obj-$(CONFIG_EXYNOS_ACPM_THERMAL) +=3D exynos_acpm_thermal.o +exynos_acpm_thermal-y :=3D acpm-tmu.o diff --git a/drivers/thermal/samsung/acpm-tmu.c b/drivers/thermal/samsung/a= cpm-tmu.c new file mode 100644 index 000000000000..d4e42b23c0c1 --- /dev/null +++ b/drivers/thermal/samsung/acpm-tmu.c @@ -0,0 +1,547 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2019 Samsung Electronics Co., Ltd. + * Copyright 2025 Google LLC. + * Copyright 2026 Linaro Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../thermal_hwmon.h" + +#define EXYNOS_TMU_SENSOR(i) BIT(i) +#define EXYNOS_TMU_SENSORS_MAX_COUNT 16 + +#define GS101_CPUCL2_SENSOR_MASK (EXYNOS_TMU_SENSOR(0) | \ + EXYNOS_TMU_SENSOR(6) | \ + EXYNOS_TMU_SENSOR(7) | \ + EXYNOS_TMU_SENSOR(8) | \ + EXYNOS_TMU_SENSOR(9)) +#define GS101_CPUCL1_SENSOR_MASK (EXYNOS_TMU_SENSOR(4) | \ + EXYNOS_TMU_SENSOR(5)) +#define GS101_CPUCL0_SENSOR_MASK (EXYNOS_TMU_SENSOR(1) | \ + EXYNOS_TMU_SENSOR(2)) + +#define GS101_REG_INTPEND(i) ((i) * 0x50 + 0xf8) + +enum { + P0_INTPEND, + P1_INTPEND, + P2_INTPEND, + P3_INTPEND, + P4_INTPEND, + P5_INTPEND, + P6_INTPEND, + P7_INTPEND, + P8_INTPEND, + P9_INTPEND, + P10_INTPEND, + P11_INTPEND, + P12_INTPEND, + P13_INTPEND, + P14_INTPEND, + P15_INTPEND, + REG_INTPEND_COUNT, +}; + +struct acpm_tmu_sensor_group { + u16 mask; + u8 id; +}; + +struct acpm_tmu_sensor { + const struct acpm_tmu_sensor_group *group; + struct thermal_zone_device *tzd; + struct acpm_tmu_priv *priv; + struct mutex lock; /* protects sensor state */ + bool enabled; +}; + +struct acpm_tmu_priv { + struct regmap_field *regmap_fields[REG_INTPEND_COUNT]; + struct acpm_handle *handle; + struct device *dev; + struct clk *clk; + unsigned int mbox_chan_id; + unsigned int num_sensors; + int irq; + struct acpm_tmu_sensor sensors[] __counted_by(num_sensors); +}; + +struct acpm_tmu_driver_data { + const struct reg_field *reg_fields; + const struct acpm_tmu_sensor_group *sensor_groups; + unsigned int num_sensor_groups; + unsigned int mbox_chan_id; +}; + +#define ACPM_TMU_SENSOR_GROUP(_mask, _id) \ + { \ + .mask =3D _mask, \ + .id =3D _id, \ + } + +static const struct acpm_tmu_sensor_group gs101_sensor_groups[] =3D { + ACPM_TMU_SENSOR_GROUP(GS101_CPUCL2_SENSOR_MASK, 0), + ACPM_TMU_SENSOR_GROUP(GS101_CPUCL1_SENSOR_MASK, 1), + ACPM_TMU_SENSOR_GROUP(GS101_CPUCL0_SENSOR_MASK, 2), +}; + +static const struct reg_field gs101_reg_fields[REG_INTPEND_COUNT] =3D { + [P0_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(0), 0, 31), + [P1_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(1), 0, 31), + [P2_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(2), 0, 31), + [P3_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(3), 0, 31), + [P4_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(4), 0, 31), + [P5_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(5), 0, 31), + [P6_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(6), 0, 31), + [P7_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(7), 0, 31), + [P8_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(8), 0, 31), + [P9_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(9), 0, 31), + [P10_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(10), 0, 31), + [P11_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(11), 0, 31), + [P12_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(12), 0, 31), + [P13_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(13), 0, 31), + [P14_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(14), 0, 31), + [P15_INTPEND] =3D REG_FIELD(GS101_REG_INTPEND(15), 0, 31), +}; + +static const struct regmap_config gs101_regmap_config =3D { + .reg_bits =3D 32, + .reg_stride =3D 4, + .val_bits =3D 32, + .use_relaxed_mmio =3D true, + .max_register =3D GS101_REG_INTPEND(15), +}; + +static const struct acpm_tmu_driver_data acpm_tmu_gs101 =3D { + .reg_fields =3D gs101_reg_fields, + .sensor_groups =3D gs101_sensor_groups, + .num_sensor_groups =3D ARRAY_SIZE(gs101_sensor_groups), + .mbox_chan_id =3D 9, +}; + +static int acpm_tmu_op_tz_control(struct acpm_tmu_sensor *sensor, bool on) +{ + struct acpm_tmu_priv *priv =3D sensor->priv; + struct acpm_handle *handle =3D priv->handle; + const struct acpm_tmu_ops *ops =3D &handle->ops->tmu; + int ret; + + ret =3D ops->tz_control(handle, priv->mbox_chan_id, sensor->group->id, + on); + if (ret) + return ret; + + sensor->enabled =3D on; + + return 0; +} + +static int acpm_tmu_control(struct acpm_tmu_priv *priv, bool on) +{ + struct device *dev =3D priv->dev; + int i, ret; + + ret =3D pm_runtime_resume_and_get(dev); + if (ret < 0) + return ret; + + for (i =3D 0; i < priv->num_sensors; i++) { + struct acpm_tmu_sensor *sensor =3D &priv->sensors[i]; + + /* Skip sensors that weren't found in DT */ + if (!sensor->tzd) + continue; + + mutex_lock(&sensor->lock); + ret =3D acpm_tmu_op_tz_control(sensor, on); + mutex_unlock(&sensor->lock); + if (ret) + break; + } + + pm_runtime_put_autosuspend(dev); + return ret; +} + +static int acpm_tmu_get_temp(struct thermal_zone_device *tz, int *temp) +{ + struct acpm_tmu_sensor *sensor =3D thermal_zone_device_priv(tz); + struct acpm_tmu_priv *priv =3D sensor->priv; + struct acpm_handle *handle =3D priv->handle; + const struct acpm_tmu_ops *ops =3D &handle->ops->tmu; + struct device *dev =3D priv->dev; + int acpm_temp, ret; + + if (!sensor->enabled) + return -EAGAIN; + + ret =3D pm_runtime_resume_and_get(dev); + if (ret < 0) + return ret; + + scoped_guard(mutex, &sensor->lock) { + ret =3D ops->read_temp(handle, priv->mbox_chan_id, + sensor->group->id, &acpm_temp); + } + + pm_runtime_put_autosuspend(dev); + + if (ret) + return ret; + + *temp =3D acpm_temp * MILLIDEGREE_PER_DEGREE; + + return 0; +} + +static int acpm_tmu_update_thresholds(struct acpm_tmu_sensor *sensor, + u8 thresholds[2], u8 inten) +{ + struct acpm_tmu_priv *priv =3D sensor->priv; + struct acpm_handle *handle =3D priv->handle; + const struct acpm_tmu_ops *ops =3D &handle->ops->tmu; + unsigned int mbox_chan_id =3D priv->mbox_chan_id; + u8 acpm_sensor_id =3D sensor->group->id; + bool was_enabled =3D sensor->enabled; + int ret; + + guard(mutex)(&sensor->lock); + + if (was_enabled) { + ret =3D acpm_tmu_op_tz_control(sensor, false); + if (ret) + return ret; + } + + ret =3D ops->set_threshold(handle, mbox_chan_id, acpm_sensor_id, + thresholds, 2); + if (ret) + return ret; + + ret =3D ops->set_interrupt_enable(handle, mbox_chan_id, acpm_sensor_id, + inten); + if (ret) + return ret; + + /* Restore based on cached state. */ + if (was_enabled) + ret =3D acpm_tmu_op_tz_control(sensor, true); + + return ret; +} + +static int acpm_tmu_set_trips(struct thermal_zone_device *tz, int low, int= high) +{ + struct acpm_tmu_sensor *sensor =3D thermal_zone_device_priv(tz); + struct acpm_tmu_priv *priv =3D sensor->priv; + struct device *dev =3D priv->dev; + u8 thresholds[2] =3D {}; + u8 inten =3D 0; + int ret; + + /* If a valid lower bound exists, set the threshold and enable its interr= upt */ + if (low > -INT_MAX) { + thresholds[0] =3D clamp_val(low / MILLIDEGREE_PER_DEGREE, 0, 255); + inten |=3D BIT(0); + } + + /* If a valid upper bound exists, set the threshold and enable its interr= upt */ + if (high < INT_MAX) { + thresholds[1] =3D clamp_val(high / MILLIDEGREE_PER_DEGREE, 0, 255); + inten |=3D BIT(1); + } + + ret =3D pm_runtime_resume_and_get(dev); + if (ret) + return ret; + + ret =3D acpm_tmu_update_thresholds(sensor, thresholds, inten); + + pm_runtime_put_autosuspend(dev); + + return ret; +} + +static const struct thermal_zone_device_ops acpm_tmu_sensor_ops =3D { + .get_temp =3D acpm_tmu_get_temp, + .set_trips =3D acpm_tmu_set_trips, +}; + +static int acpm_tmu_has_pending_irq(struct acpm_tmu_sensor *sensor, + bool *pending_irq) +{ + struct acpm_tmu_priv *priv =3D sensor->priv; + unsigned long mask =3D sensor->group->mask; + int i, ret; + u32 val; + + guard(mutex)(&sensor->lock); + + for_each_set_bit(i, &mask, EXYNOS_TMU_SENSORS_MAX_COUNT) { + ret =3D regmap_field_read(priv->regmap_fields[i], &val); + if (ret) + return ret; + + if (val) { + *pending_irq =3D true; + break; + } + } + + return 0; +} + +static irqreturn_t acpm_tmu_thread_fn(int irq, void *id) +{ + struct acpm_tmu_priv *priv =3D id; + struct acpm_handle *handle =3D priv->handle; + const struct acpm_tmu_ops *ops =3D &handle->ops->tmu; + struct device *dev =3D priv->dev; + int i, ret; + + ret =3D pm_runtime_resume_and_get(dev); + if (ret) { + dev_err(dev, "Failed to resume: %d\n", ret); + return IRQ_NONE; + } + + for (i =3D 0; i < priv->num_sensors; i++) { + struct acpm_tmu_sensor *sensor =3D &priv->sensors[i]; + bool pending_irq =3D false; + + if (!sensor->tzd) + continue; + + ret =3D acpm_tmu_has_pending_irq(sensor, &pending_irq); + if (ret || !pending_irq) + continue; + + thermal_zone_device_update(sensor->tzd, + THERMAL_EVENT_UNSPECIFIED); + + scoped_guard(mutex, &sensor->lock) { + ret =3D ops->clear_tz_irq(handle, priv->mbox_chan_id, + sensor->group->id); + if (ret) + dev_err(priv->dev, "Sensor %d: failed to clear IRQ (%d)\n", + i, ret); + } + } + + pm_runtime_put_autosuspend(dev); + + return IRQ_HANDLED; +} + +static const struct of_device_id acpm_tmu_match[] =3D { + { .compatible =3D "google,gs101-tmu-top" }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, acpm_tmu_match); + +static int acpm_tmu_probe(struct platform_device *pdev) +{ + const struct acpm_tmu_driver_data *data =3D &acpm_tmu_gs101; + struct acpm_handle *acpm_handle; + struct device *dev =3D &pdev->dev; + struct acpm_tmu_priv *priv; + struct regmap *regmap; + void __iomem *base; + int i, ret; + + acpm_handle =3D devm_acpm_get_by_phandle(dev); + if (IS_ERR(acpm_handle)) + return dev_err_probe(dev, PTR_ERR(acpm_handle), + "Failed to get ACPM handle\n"); + + priv =3D devm_kzalloc(dev, + struct_size(priv, sensors, data->num_sensor_groups), + GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev =3D dev; + priv->handle =3D acpm_handle; + priv->mbox_chan_id =3D data->mbox_chan_id; + priv->num_sensors =3D data->num_sensor_groups; + + platform_set_drvdata(pdev, priv); + + base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return dev_err_probe(dev, PTR_ERR(base), "Failed to ioremap resource\n"); + + regmap =3D devm_regmap_init_mmio(dev, base, &gs101_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), "Failed to init regmap\n"); + + ret =3D devm_regmap_field_bulk_alloc(dev, regmap, priv->regmap_fields, + data->reg_fields, REG_INTPEND_COUNT); + if (ret) + return dev_err_probe(dev, ret, + "Unable to map syscon registers\n"); + + priv->clk =3D devm_clk_get(dev, NULL); + if (IS_ERR(priv->clk)) + return dev_err_probe(dev, PTR_ERR(priv->clk), + "Failed to get the clock\n"); + + priv->irq =3D platform_get_irq(pdev, 0); + if (priv->irq < 0) + return dev_err_probe(dev, priv->irq, "Failed to get irq\n"); + + ret =3D devm_request_threaded_irq(dev, priv->irq, NULL, + acpm_tmu_thread_fn, IRQF_ONESHOT, + dev_name(dev), priv); + if (ret) + return dev_err_probe(dev, ret, "Failed to request irq\n"); + + pm_runtime_set_autosuspend_delay(dev, 100); + pm_runtime_use_autosuspend(dev); + + ret =3D devm_pm_runtime_enable(dev); + if (ret) + return dev_err_probe(dev, ret, "Failed to enable runtime PM\n"); + + ret =3D pm_runtime_resume_and_get(dev); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to resume device\n"); + + ret =3D acpm_handle->ops->tmu.init(acpm_handle, priv->mbox_chan_id); + if (ret) { + ret =3D dev_err_probe(dev, ret, "Failed to init TMU\n"); + goto err_pm_put; + } + + for (i =3D 0; i < priv->num_sensors; i++) { + struct acpm_tmu_sensor *sensor =3D &priv->sensors[i]; + + mutex_init(&sensor->lock); + sensor->group =3D &data->sensor_groups[i]; + sensor->priv =3D priv; + + sensor->tzd =3D devm_thermal_of_zone_register(dev, i, sensor, + &acpm_tmu_sensor_ops); + if (IS_ERR(sensor->tzd)) { + ret =3D PTR_ERR(sensor->tzd); + if (ret =3D=3D -ENODEV) { + sensor->tzd =3D NULL; + dev_dbg(dev, "Sensor %d not used in DT, skipping\n", i); + continue; + } + + ret =3D dev_err_probe(dev, ret, "Failed to register sensor %d\n", i); + goto err_pm_put; + } + + ret =3D devm_thermal_add_hwmon_sysfs(dev, sensor->tzd); + if (ret) + dev_warn(dev, "Failed to add hwmon sysfs!\n"); + } + + ret =3D acpm_tmu_control(priv, true); + if (ret) { + ret =3D dev_err_probe(dev, ret, "Failed to enable TMU\n"); + goto err_pm_put; + } + + pm_runtime_put_autosuspend(dev); + + return 0; + +err_pm_put: + pm_runtime_put_sync(dev); + return ret; +} + +static void acpm_tmu_remove(struct platform_device *pdev) +{ + struct acpm_tmu_priv *priv =3D platform_get_drvdata(pdev); + + /* Stop IRQ first to prevent race with thread_fn */ + disable_irq(priv->irq); + + acpm_tmu_control(priv, false); +} + +static int acpm_tmu_suspend(struct device *dev) +{ + struct acpm_tmu_priv *priv =3D dev_get_drvdata(dev); + struct acpm_handle *handle =3D priv->handle; + const struct acpm_tmu_ops *ops =3D &handle->ops->tmu; + int ret; + + ret =3D acpm_tmu_control(priv, false); + if (ret) + return ret; + + /* APB clock not required for this specific msg */ + return ops->suspend(handle, priv->mbox_chan_id); +} + +static int acpm_tmu_resume(struct device *dev) +{ + struct acpm_tmu_priv *priv =3D dev_get_drvdata(dev); + struct acpm_handle *handle =3D priv->handle; + const struct acpm_tmu_ops *ops =3D &handle->ops->tmu; + int ret; + + /* APB clock not required for this specific msg */ + ret =3D ops->resume(handle, priv->mbox_chan_id); + if (ret) + return ret; + + return acpm_tmu_control(priv, true); +} + +static int acpm_tmu_runtime_suspend(struct device *dev) +{ + struct acpm_tmu_priv *priv =3D dev_get_drvdata(dev); + + clk_disable_unprepare(priv->clk); + + return 0; +} + +static int acpm_tmu_runtime_resume(struct device *dev) +{ + struct acpm_tmu_priv *priv =3D dev_get_drvdata(dev); + + return clk_prepare_enable(priv->clk); +} + +static const struct dev_pm_ops acpm_tmu_pm_ops =3D { + SYSTEM_SLEEP_PM_OPS(acpm_tmu_suspend, acpm_tmu_resume) + RUNTIME_PM_OPS(acpm_tmu_runtime_suspend, acpm_tmu_runtime_resume, NULL) +}; + +static struct platform_driver acpm_tmu_driver =3D { + .driver =3D { + .name =3D "gs-tmu", + .pm =3D pm_ptr(&acpm_tmu_pm_ops), + .of_match_table =3D acpm_tmu_match, + }, + .probe =3D acpm_tmu_probe, + .remove =3D acpm_tmu_remove, +}; +module_platform_driver(acpm_tmu_driver); + +MODULE_AUTHOR("Tudor Ambarus "); +MODULE_DESCRIPTION("Samsung Exynos ACPM TMU Driver"); +MODULE_LICENSE("GPL"); --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7DA0D37E308 for ; Thu, 23 Apr 2026 15:23:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957793; cv=none; b=aoS7Br4PnJOXXRvDJx4Mwo28KrBvhI8mbY1VEhL4K/g72vDwjPPJpYGX3P8csIftTZn6a9aOmjHdHZ8JEbk/C9f3v3Hs4dcaO23o4hMUpql2XmzqiOIut95I+GnsBw1grSTKShUT3jrPsT699X10UL0gDm6IVDKF+BRcLXFisHA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957793; c=relaxed/simple; bh=FWU5VNsYMZRRVGYIioWPuaaPLaZNzDvKQUDpPiPlMQk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jLPg7J1ZqRgpbDA6wm4eQ7IuL3egxn1sctUGplMciD51dadNJHGytAOI8o7o+7ICOFnVdjKXQQwrgW6my+tALt25gVk9mf5VeSgJLxFub4HeGEtAjyvkIgyw6nXsUvtlXaZJWVrM9bCQeBNgs6TxZmYMAniv0I7rxksHqdhcbGE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=GCAAZbYY; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="GCAAZbYY" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-488ab2db91aso92380975e9.3 for ; Thu, 23 Apr 2026 08:23:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957785; x=1777562585; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=/2rw/F+vOuT6UFAdYwCBkXsXOmQ9+TggXzaKDVp2DDM=; b=GCAAZbYYy/w0aeRmk5QZsvV5wURYbYWtVTwOAMINonLeq5HBbGn/Av0cd+ba/u4LTM SN2iOemM1vnNT9JwCPtIvNL9WlrC1X4pRpJqEgZT0VAnHRq7podSz3q+QPuMHrVOSDLH TWEEuBPfpz/3d4HqBZ2yz2Vo6tvlOX3U81by3UcDU1jcJGjqh88gaEaetY1CAtWsQOUU 2cN+TAJVM8/Wimal812AvM7qIoDyuQAe7/YqY4bG6Wb99um1MFIEJI6HqxrQjG2+F7dh 6dsR0bOh95tRe2qA39DhAiheNmE/SP+0RPwHLfGMJuCUrP/jbtZz9KhmUW+5LafOkxh1 iXWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957785; x=1777562585; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=/2rw/F+vOuT6UFAdYwCBkXsXOmQ9+TggXzaKDVp2DDM=; b=m0dvvprbn71ICoIJYnAxwT9BzBlg8MDLaTPt1DFbbezInUydV2NhotU0V4oQ929ho1 5NUXDC2akdEkEad+yDXh6jV8YW+Q5oXywV90SZeqgZN62yG9beqvOtT4iuzEsOThCnAN 1O5JITXwlxX8zbh2sRvU9gUmE7Mqanl+bCnA0gHdYHdPlhfx0+pTZ+hl2GpdPbmOxJBx z5LCpXaanUDrZHlgNMU0SWI0lTh0Uim9XGhLjP2a6XzQqr44nVXyKN8bA/i9VIg/psTf JaokvRgWrM8F4223cHkH7T2VywX/wQLGdIW1q+RVOFCaWOpY7F9vrIQhu4pxrn9kJh5g KN4Q== X-Forwarded-Encrypted: i=1; AFNElJ8xyeAGxSoIRFiCxAKJ1uAKPM+rI+PJ8UtDEFuGo6Ugli67qcuncAMvhviv4NGcZ90dn17Bnh5F1ArLUK8=@vger.kernel.org X-Gm-Message-State: AOJu0YwJE7uEE6CFTnV7HIeX1fOPhwTfBPiGBqsvI0ZFuUWokI3mN01W W+vsI3Vvd6mjEtvxqtqLhrj/Wbur/SzXul5n1A9pCtAkww2vN9Hw78y+nSHdoY30CJY= X-Gm-Gg: AeBDietOe15ePNOmYLKW0boQeKXWl4/yvnvSpFJWRazkSIWMOuBZg3mzIQ1sTxJsZZs e1dazhC+HbnVfxCQCUs59DecfmaczqhOu76shuvpLsdiw1TPXrE1jenCc1OPWRwXfUtnORE5F3D 69Mnug4bj0sYERHUXNi7lntzlmFCsl6lQm2fuNSa806ZdY3Qmpcds5tKlJVJc51sLHkqimypxsW uLlO30DVMy7bzpRDJ5O/6o8IEevOSIG8QI5I03+G4mHF8oBo1BN5+2JsQgWh4PjLCFm9EfImsdT VL62cgiHaBvFB9ks48aEgG94wun/SncDXBctDMXOpV0HNtY+q03X/4l9115nseRajQQxKuHHX2h jdgk4N0J/wkKqLiNoSYD5A1FrqdnzvVkP/hqhIFwikT3W3sTv6EbmfMfVpTgOns2QA10B+5vudz MMS4caC9S2JbLvLLDjU12EJrXA7qTbIWjrr2SDuL4wca28ZMSIzL3Ho5y+OcEfrg7mC4FcSjeTo rxEe1cCEvy4yPnMcw== X-Received: by 2002:a05:600c:4fd1:b0:488:78f2:6b0 with SMTP id 5b1f17b1804b1-488fb78ede0mr397227715e9.29.1776957785364; Thu, 23 Apr 2026 08:23:05 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:05 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:57 +0000 Subject: [PATCH v4 09/11] MAINTAINERS: Add entry for Samsung Exynos ACPM thermal driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-9-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus , Krzysztof Kozlowski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=988; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=FWU5VNsYMZRRVGYIioWPuaaPLaZNzDvKQUDpPiPlMQk=; b=oGan3n0YDDTqNrNPvT5e5tY9UzUuAumcLznabKnHsbyyIVFfufKds/6MUWf1Xq0V0ycSAXT3/ KZjDYxlqCdNAPXdbDR3RyrFMLbqE0LrVkmWv13ndxJQsDwP/6anSJj2 X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Add a MAINTAINERS entry for the Samsung Exynos ACPM thermal driver. Signed-off-by: Tudor Ambarus Reviewed-by: Krzysztof Kozlowski --- MAINTAINERS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index c9b7b6f9828e..759c05bd0004 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23693,6 +23693,14 @@ F: drivers/clk/samsung/clk-acpm.c F: drivers/firmware/samsung/exynos-acpm* F: include/linux/firmware/samsung/exynos-acpm-protocol.h =20 +SAMSUNG EXYNOS ACPM THERMAL DRIVER +M: Tudor Ambarus +L: linux-kernel@vger.kernel.org +L: linux-samsung-soc@vger.kernel.org +S: Supported +F: Documentation/devicetree/bindings/thermal/google,gs101-tmu-top.yaml +F: drivers/thermal/samsung/acpm-tmu.c + SAMSUNG EXYNOS MAILBOX DRIVER M: Tudor Ambarus L: linux-kernel@vger.kernel.org --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C9A636C9CC for ; Thu, 23 Apr 2026 15:23:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957792; cv=none; b=FZik/t3QBCQZ4hd+hfZkyrJnR5TrG728482ZhghTaqF3TwK+Z0zzf23ooANzIiQ6Wc8qUrX1IYk4EvZaKVHM98pKru6+/nZOvYMgAmP+jiXwdaW0RAQHpTg0WwTqRiHVa0Y7B7et1IgEbOe3FWoI2/aaLxXj/H0mDO0r3zBF640= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957792; c=relaxed/simple; bh=KQQowGSYHyP5O60zag3Qa4kZIABUdv6AfqKEPj7hS28=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Wcj+fgz0vYIrY5acqyhiEq/NzgJ18kcNoJc5iGaxj0FhQCSFbL7fJA0iJ10H5m6hNEgR4kPizp1Blf3TCLzMJAf831hdK3YWHcBrS88rU1hPLgRJ8KF4Oj1ExV2dqhGrnuwR1+Sejw+FRaGJFnl2brExgqtnX6BA3gt/Xukl0h8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=EqXH9UAY; arc=none smtp.client-ip=209.85.221.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="EqXH9UAY" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-43cfce3a195so3995135f8f.2 for ; Thu, 23 Apr 2026 08:23:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957786; x=1777562586; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=+2AQHJXAix8UIwlLwfkFr/1VOjL9EcULNjZvsXFLBOQ=; b=EqXH9UAYBJYuWg4xzix1lpiUrWwB48KBJhGWKOXtNSaYoQxBLMzIBYM2B+aNtruEBK oXjkJAh4R9VKpPDkoWOS90Op8HhGFmteZzP9Ydq7VXMvkUPdxYvo7ZQUCSwrw2MpVN1I BbmirSOcQ3V6GMDCjMiRg9N58SMaTDACEn2FWm5ho9DAcPZEx8MQ2F/IZc01EwfLTL4f 0j7r0k8R58fjCDjoT5D39LWc3tsiA61nwzOQhXfCk9PpBEzpjq6Wtteq6aLXf/h39GoE 2fVMPWmIL6SBBUQ0juwSDrlm5Ki/S6uzgky1EgAiZNqYxNJ3v+04LM1nUGE5CQ4R4Rze p7Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957786; x=1777562586; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=+2AQHJXAix8UIwlLwfkFr/1VOjL9EcULNjZvsXFLBOQ=; b=ZNUPDsdVL/ZNE1/4hSw/5GDK7+GARV8jubtEnOTjRTU4qEdFFzYwQ8WH9P4QOPmP88 QbUkLB5KuK378NeQHwiAIxQrnZZetehDWX1AKIE6OvEl6Zu6SjgLhr5msrx+ebmUlX12 FZwm8bTZZOuQoYjuX8LclLdu4P0jUZGE7LGpQfOYa2TYZQ9Tqfbc3hoUW0S4QfcDgQW3 D8BLV7RoS5nyb9lup8DjqMM2sK9yFxu1gj0fqMBviS7RWFF8VmOcTYWTuFT3o3Mv/zB1 OzJfsJRU7DwSi/h+AjjElUzy4HJpU+T0SzM7ShxTzPYaCcyI5hXHM6vjCM5DQk3FXfba v3Pg== X-Forwarded-Encrypted: i=1; AFNElJ83z8+tfmMdM4JK4TaTTZV+gs7xboUgirJ84ZQ8H7VzZbbfAG7krsz+wwT1RjiNW+wocZzxddh+1JTXNno=@vger.kernel.org X-Gm-Message-State: AOJu0YwrCHkMXxQ765HwLwDiXmbrjCbXfHfCeNu6Y0+EswOnOXa5pW6J ZIY98+aGTz7w9jJA9q+rCZDIb6TyXOp0bYYh34i1aKMyGlvaUQ2Svf5bbpxWgrWJTsM= X-Gm-Gg: AeBDiet9cgMlwwJXJTSi0qYZKOcQEkgX3WgSPsBILcutgrObxMAMtLHVxUJ8MsltAGS 9Q4FFUj3h1tnYtLHQmAdBzxCw4zmcnX9wYq90hNadQmojccHbTJ0ZR+aQ6rfVG7DXUOCtzxdnyd Aug2WG+vKXTZ224Z7mgIDuJfFb5mvER9ZdVFRME5QRIT2T3moKWd6nSbPcAQ2DweyTgG9X7K1wy IP9EKEUHajVrIrxHXtRmy1nczpOkLheZ3IDdvvCnijmvw4L29iQNkI+IMq+YLWZumJf9YL4tcrf xVIyry9MG3H6VXSy9RHmB3bsVMWkF2SGzvGRauD+XuchI2r/3AEKLeZi0cHZGRcHgchWdNd5dFA SCgGkQnabQMYFy8bO1LUhJ8tlShZf8J4WouHDxoQkhuE+sZoKMJlqJbvLx9b2lApi3xPv2fyq5Q lnS+0MUDklcmxOZKKf6guRP+e8S1VwbMPZhz7GyEnC+32IeWm1GiAFIDzP567zOhIgPbGgxq1nZ zuhj99J6Sc+5T1iMQ== X-Received: by 2002:a05:600c:3ba0:b0:485:ae14:8191 with SMTP id 5b1f17b1804b1-488fb73a089mr426452985e9.5.1776957786157; Thu, 23 Apr 2026 08:23:06 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:05 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:58 +0000 Subject: [PATCH v4 10/11] arm64: dts: exynos: gs101: Add thermal management unit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-10-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=7065; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=KQQowGSYHyP5O60zag3Qa4kZIABUdv6AfqKEPj7hS28=; b=4CUGYuOoxwR0trgYo8nv8J6lmrRotEL68AOZIfM9WhNX9rc2cRay9r/oGiWTvQpEWWoVb2esY 03tUxY1bgkQBwXltokjCrC39Z3XqMm1ieeO+RgU2kHYfYIGt6tqjTXo X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Add the Thermal Management Unit (TMU) support for the Google GS101 SoC. Describe the TMU using a consolidated SoC node that includes memory resources for interrupt identification and a phandle to the ACPM IPC interface for functional control. Define thermal zones for the little, mid, and big CPU clusters, including associated trip points and cooling-device maps to enable thermal mitigation. Signed-off-by: Tudor Ambarus --- arch/arm64/boot/dts/exynos/google/gs101-tmu.dtsi | 136 +++++++++++++++++++= ++++ arch/arm64/boot/dts/exynos/google/gs101.dtsi | 18 +++ 2 files changed, 154 insertions(+) diff --git a/arch/arm64/boot/dts/exynos/google/gs101-tmu.dtsi b/arch/arm64/= boot/dts/exynos/google/gs101-tmu.dtsi new file mode 100644 index 000000000000..b27d1a539ec2 --- /dev/null +++ b/arch/arm64/boot/dts/exynos/google/gs101-tmu.dtsi @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Google GS101 TMU configurations device tree source + * + * Copyright 2020 Samsung Electronics Co., Ltd. + * Copyright 2020 Google LLC. + * Copyright 2026 Linaro Ltd. + */ + +#include + +/ { + thermal-zones { + cpucl2-thermal { + polling-delay-passive =3D <0>; + polling-delay =3D <0>; + thermal-sensors =3D <&tmu_top 0>; + + trips { + big_switch_on: big-switch-on { + temperature =3D <80000>; + hysteresis =3D <2000>; + type =3D "passive"; + }; + + big_mitigate: big-mitigate { + temperature =3D <90000>; + hysteresis =3D <5000>; + type =3D "passive"; + }; + + big_hot: big-hot { + temperature =3D <100000>; + hysteresis =3D <5000>; + type =3D "hot"; + }; + + big_critical: big-critical { + temperature =3D <105000>; + hysteresis =3D <2000>; + type =3D "critical"; + }; + }; + + cooling-maps { + map0 { + trip =3D <&big_mitigate>; + cooling-device =3D <&cpu6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + }; + + cpucl1-thermal { + polling-delay-passive =3D <0>; + polling-delay =3D <0>; + thermal-sensors =3D <&tmu_top 1>; + + trips { + mid_switch_on: mid-switch-on { + temperature =3D <80000>; + hysteresis =3D <2000>; + type =3D "passive"; + }; + + mid_mitigate: mid-mitigate { + temperature =3D <90000>; + hysteresis =3D <5000>; + type =3D "passive"; + }; + + mid_hot: mid-hot { + temperature =3D <100000>; + hysteresis =3D <5000>; + type =3D "hot"; + }; + + mid_critical: mid-critical { + temperature =3D <105000>; + hysteresis =3D <2000>; + type =3D "critical"; + }; + }; + + cooling-maps { + map0 { + trip =3D <&mid_mitigate>; + cooling-device =3D <&cpu4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + }; + + cpucl0-thermal { + polling-delay-passive =3D <0>; + polling-delay =3D <0>; + thermal-sensors =3D <&tmu_top 2>; + + trips { + little_switch_on: little-switch-on { + temperature =3D <80000>; + hysteresis =3D <2000>; + type =3D "passive"; + }; + + little_mitigate: little-mitigate { + temperature =3D <90000>; + hysteresis =3D <5000>; + type =3D "passive"; + }; + + little_hot: little-hot { + temperature =3D <100000>; + hysteresis =3D <5000>; + type =3D "hot"; + }; + + little_critical: little-critical { + temperature =3D <105000>; + hysteresis =3D <2000>; + type =3D "critical"; + }; + }; + + cooling-maps { + map0 { + trip =3D <&little_mitigate>; + cooling-device =3D <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + }; + }; +}; diff --git a/arch/arm64/boot/dts/exynos/google/gs101.dtsi b/arch/arm64/boot= /dts/exynos/google/gs101.dtsi index d085f9fb0f62..4b8c7edaddb6 100644 --- a/arch/arm64/boot/dts/exynos/google/gs101.dtsi +++ b/arch/arm64/boot/dts/exynos/google/gs101.dtsi @@ -74,6 +74,7 @@ cpu0: cpu@0 { compatible =3D "arm,cortex-a55"; reg =3D <0x0000>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL0>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&ananke_cpu_sleep>; capacity-dmips-mhz =3D <250>; @@ -86,6 +87,7 @@ cpu1: cpu@100 { compatible =3D "arm,cortex-a55"; reg =3D <0x0100>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL0>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&ananke_cpu_sleep>; capacity-dmips-mhz =3D <250>; @@ -98,6 +100,7 @@ cpu2: cpu@200 { compatible =3D "arm,cortex-a55"; reg =3D <0x0200>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL0>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&ananke_cpu_sleep>; capacity-dmips-mhz =3D <250>; @@ -110,6 +113,7 @@ cpu3: cpu@300 { compatible =3D "arm,cortex-a55"; reg =3D <0x0300>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL0>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&ananke_cpu_sleep>; capacity-dmips-mhz =3D <250>; @@ -122,6 +126,7 @@ cpu4: cpu@400 { compatible =3D "arm,cortex-a76"; reg =3D <0x0400>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL1>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&enyo_cpu_sleep>; capacity-dmips-mhz =3D <620>; @@ -134,6 +139,7 @@ cpu5: cpu@500 { compatible =3D "arm,cortex-a76"; reg =3D <0x0500>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL1>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&enyo_cpu_sleep>; capacity-dmips-mhz =3D <620>; @@ -146,6 +152,7 @@ cpu6: cpu@600 { compatible =3D "arm,cortex-x1"; reg =3D <0x0600>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL2>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&hera_cpu_sleep>; capacity-dmips-mhz =3D <1024>; @@ -158,6 +165,7 @@ cpu7: cpu@700 { compatible =3D "arm,cortex-x1"; reg =3D <0x0700>; clocks =3D <&acpm_ipc GS101_CLK_ACPM_DVFS_CPUCL2>; + #cooling-cells =3D <2>; enable-method =3D "psci"; cpu-idle-states =3D <&hera_cpu_sleep>; capacity-dmips-mhz =3D <1024>; @@ -639,6 +647,15 @@ watchdog_cl1: watchdog@10070000 { status =3D "disabled"; }; =20 + tmu_top: thermal-sensor@100a0000 { + compatible =3D "google,gs101-tmu-top"; + reg =3D <0x100a0000 0x800>; + clocks =3D <&cmu_misc CLK_GOUT_MISC_TMU_TOP_PCLK>; + interrupts =3D ; + samsung,acpm-ipc =3D <&acpm_ipc>; + #thermal-sensor-cells =3D <1>; + }; + trng: rng@10141400 { compatible =3D "google,gs101-trng", "samsung,exynos850-trng"; @@ -1861,3 +1878,4 @@ timer { }; =20 #include "gs101-pinctrl.dtsi" +#include "gs101-tmu.dtsi" --=20 2.54.0.545.g6539524ca2-goog From nobody Wed Jun 17 07:35:34 2026 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 39E1D37F8DF for ; Thu, 23 Apr 2026 15:23:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957793; cv=none; b=gs72vLbRNB8JN4C19CMy4y1OKqEK7OxguOgi0UPdO7pa0n9HrT6kVgz5FexLBOUXKM+O+gJEuvMQ4YB93cLwjGhLcVUY51QvjLo9qpA1LbJPIO3N9MYFkTWu/wsoiXWe8rcyMomMvn95pSK753xstIwJ+TMsdvInWzIwPxxNuuo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776957793; c=relaxed/simple; bh=7AhKBHwg3sF5ZQfICMhVBtTO5MM//2w9hYFIb8IP1yU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=icAzor0+bVfIaoqMZC78tLoq/tRCHRQbsTKzfEHhG1CPXo1C8Zbp+GKSIoJ8g/M69kwVazRYW/Eu3bX/2adIkhit1clxYCDs7OuXka17mu0ml8NqBZT+gi6no5dF8c1NVueA4D6iRS695vZDu7dy8LoABfBMxRrM3oPLVosKO8k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=NlF05pQf; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="NlF05pQf" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-4891d7164ddso29626005e9.3 for ; Thu, 23 Apr 2026 08:23:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1776957787; x=1777562587; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=45rJAXYOq5QzWK7uWpAJrY/aJNT+spUoA8Oj8mxs4Uw=; b=NlF05pQfvz30iToZPuVXHWFBWmVK7cb2B/KJwOeVySZZIS2ikJt/BRj8IKg6pIxHv8 cobX1fG5uyLrMm+Vdqy968vKWoEUqRGfqtY5KtwKujTgl1/4Kn05ZwVaXVqelo9b2zCO 97Dkd9+Vgbm0cjBed31iAYcU+snjv+sEABYNWuOp5DY1t9uITqW8zwMrXyyKoRNu3Y7t 3SLzLsp2ocgYTz+XykRUIKZIWoslHdaTb7hfDjVTguhqM0RVjMLD2Hj1q2Y3BHcfZxZC /LSbphCxg2KsVqMkY5j9Y2SFMjLzGfv3KpB0or7azjs+kiZMhNUkgCi6CsE+zW1y66Gj 9yAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776957787; x=1777562587; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=45rJAXYOq5QzWK7uWpAJrY/aJNT+spUoA8Oj8mxs4Uw=; b=svRG+8L/afDlH6Uc2a6yG5W4r7kTgchnp4hgxdaNgmsdYv7+pf4UJ/N3X11+E75rKb GV+wNmQKOkJrCfETw5U71A0ZMjdqFF5+wLwQTKi9hEdaVmY2Rrij7GWReRlMXcqLXBXw LhBV4MjcAUuo7LfkTUpTx2X/Gghg9k3OtRf7FS9txASKgt+Vn58A9flBviPjnaHkUStB nIqLcO8jcm9vAVIr3NQGdRJROqMQbYYPApqriIYWJ81Bl7KwyPM3kqd0Je5V/f1SYfJk kGXHawppWUbPTkFEO0n4r64Od8wfxwf4a5qUY2ZpVqSAkS1cDNjRc1WzR6qKwu4n3V40 A3yA== X-Forwarded-Encrypted: i=1; AFNElJ/103ZCr/48Pe///MTZkKQ+BdLp6fONZF6a6ufWjYpwZDG+KLodpbUTqCiMfGoDS14mDxA0qL1Aj0bLI1g=@vger.kernel.org X-Gm-Message-State: AOJu0YyBYgfBDAlRff7G2MeMkXNpWyyC6NtDdLh6q+B0OLFo8F3kaHHv d/TO/AZRNL+JOPluqi6/Vbl3s+V6BJOL/tdt2e2ralJ3Uc+pkvYNsAQ3/vMhYn+k01s= X-Gm-Gg: AeBDieu5h3CYl1SpQwJkV9aoAHJQyeDS16/c3fG+bngSdJIsvGvn65orqPvRnwxuJ3o ADvYuTz+xDM04CSxEMz2lirJdZNett3ikvDm5lTu98JU8EnwFKjlJ7UqTH6YiidCLUlxzwakPMh vrCUrtezBraQ0CMoG1nPGt2w2XmMhTl3ztA/GO23YUMzxKFMXMRZkiuM1wLYnMKI6OP8UO90eHm 9MyDeczfDfGo9XPGadms6YFML/wer1aFs6tG4ujygkbVVtDwN8sK+l20knXdj63VFpjQvhQe6xL 2k2qqI0AQkGlpFt8ryp6Q/8FHwEUwIqS6qWPrM7oHWyPwpDEa90tieVe8GMQmMVATj6k9DAY6Ou xkT5KFN+VHYJ/pvVIxYfFVVX4nkXMJ25eiJBmXRS3AnxEK0SpbA+ImRSz+grpdzLLzHny6bmHut hX0nu2OHBdHVadsxJiIU3yFHW7zawji8/geFRG2uRxXQ9djgHjZG1Ez/j9e6ZFX0pqUTZiA2BWV BPUNq6cJJeTpC2gRA== X-Received: by 2002:a05:600c:8a08:b0:488:a82f:bb9b with SMTP id 5b1f17b1804b1-488ff369a1cmr299536255e9.30.1776957786885; Thu, 23 Apr 2026 08:23:06 -0700 (PDT) Received: from ta2.c.googlers.com (17.83.155.104.bc.googleusercontent.com. [104.155.83.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4891f98728dsm90550755e9.23.2026.04.23.08.23.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 08:23:06 -0700 (PDT) From: Tudor Ambarus Date: Thu, 23 Apr 2026 15:22:59 +0000 Subject: [PATCH v4 11/11] arm64: defconfig: enable Exynos ACPM thermal support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-acpm-tmu-v4-11-8b59f8548634@linaro.org> References: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> In-Reply-To: <20260423-acpm-tmu-v4-0-8b59f8548634@linaro.org> To: "Rafael J. Wysocki" , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Alim Akhtar , Bartlomiej Zolnierkiewicz , Kees Cook , "Gustavo A. R. Silva" , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Daniel Lezcano , Sylwester Nawrocki , Chanwoo Choi , Michael Turquette , Stephen Boyd , Lee Jones Cc: willmcvicker@google.com, jyescas@google.com, shin.son@samsung.com, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-hardening@vger.kernel.org, linux-clk@vger.kernel.org, Tudor Ambarus X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776957778; l=812; i=tudor.ambarus@linaro.org; s=20241212; h=from:subject:message-id; bh=7AhKBHwg3sF5ZQfICMhVBtTO5MM//2w9hYFIb8IP1yU=; b=5VX9qU+w1MAGCTcm/KONCzXTpE/zawPv8s4NGdTf7+yTo8O2OSQ5R1ITDc/bhnFX4LjS7V1lm qjj5hM1FeU8CPP2c5DU5SvgZzv7wBhNlnAt3R1NZBOCz6liqK8uA6Jp X-Developer-Key: i=tudor.ambarus@linaro.org; a=ed25519; pk=uQzE0NXo3dIjeowMTOPCpIiPHEz12IA/MbyzrZVh9WI= Enable the Exynos ACPM thermal driver (CONFIG_EXYNOS_ACPM_THERMAL) to allow temperature monitoring and thermal management on Samsung Exynos SoCs that use the Alive Clock and Power Manager (ACPM) protocol. Signed-off-by: Tudor Ambarus --- arch/arm64/configs/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index d905a0777f93..3fe76a4c2633 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -793,6 +793,7 @@ CONFIG_BCM2711_THERMAL=3Dm CONFIG_BCM2835_THERMAL=3Dm CONFIG_BRCMSTB_THERMAL=3Dm CONFIG_EXYNOS_THERMAL=3Dy +CONFIG_EXYNOS_ACPM_THERMAL=3Dm CONFIG_TEGRA_SOCTHERM=3Dm CONFIG_TEGRA_BPMP_THERMAL=3Dm CONFIG_GENERIC_ADC_THERMAL=3Dm --=20 2.54.0.545.g6539524ca2-goog