From patchwork Wed Feb 12 07:40:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 13971293 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 93B51C0219E for ; Wed, 12 Feb 2025 07:47:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To: In-Reply-To:References:Message-Id:Content-Transfer-Encoding:Content-Type: Subject:Date:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=801NIo4+87ARYLa5R5Iu89WiaawZopw6CsikR4i6YvI=; b=HTxWFbbLr9ZFEX2ei6rbq5x83A LKO3IHAZOsNIXghpSIF8GS7y/saEJGUgJb3HDJMO+0Vt17VirguF95avRTgIAzyGchv3dExtHStOb nFZhv2VvyuzHdivnbYSea3CglM05vTgywhP8NfCtUJ8PbDTbfmzN7xHQaki2/rOju7jiYY7k1fD7A dE9y181RSy++wFp5Fiz442rGGpBoDkPqU1/R2nR2StUSwN2yEvKwOq2FHuc/605rUe/wBog2QQXOK iz8BzGviFyvlcpAKWLaI46Cr/j4eqb+i4U7T5Oq6rdESBI8FHAz3rPBgRmk3J+W1ZZye+OsoMsFMR c6fCfIVw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1ti7Sf-00000006Wfs-06DL; Wed, 12 Feb 2025 07:47:09 +0000 Received: from mail-vi1eur05on20623.outbound.protection.outlook.com ([2a01:111:f403:2613::623] helo=EUR05-VI1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1ti7NI-00000006Vbz-3PzT for linux-arm-kernel@lists.infradead.org; Wed, 12 Feb 2025 07:41:37 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PTUOYeQ2MfL/YrWIFzZ0JUENX++Ykw6gqGjXQB5myUZX/CabfTrMMJjTAkFG/omq1AgTyZIl/Hp3mniOEt4U382+XjfbDsvmgLF+H6d8M/qeALWKY5ygctNpnanB1z2oXFxG363yfdZKT1gtD9eASrx7o+Vr4IV3j5R4j7MZhDe3V4qCvmO18yOx+MxlaIMxtphgS1HOkjXKb3d37tPvFk7YGDxvaLq3bdWhITaAxsi8ZoiAvF34enwdXkkS1KWuiesuXEJAdBmEQ+a5dHrcCz1B25rMlTOEHxNashjWPfC1IBWUUSh+DYWFgJJTaAQ4Mu8xPQZWt63z1r2A4zHjwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=801NIo4+87ARYLa5R5Iu89WiaawZopw6CsikR4i6YvI=; b=pjUGEfDnDIAZTT0xdx3rdGhjDEkT/L66x+9CwNi5NsHQfyhsHRJeM80ikeEM5OH+OcsGB7rwYt/KRSO3+3iEEpQm5k1JE1rbvSqHESPRQ0GQMd170+1xlszZBIYGwOoevxHMhDdTlDvBtkZLQoIyCOvABkyITKjfc9yobWUCsRDxuhsnLtiA2Doj8c1uW8mW+23erF/Ob51h5wX7I8QFU1pHEadpLNCQzl/o2EeU6ssn1n0scg94uXE7Y0tMFs+G0c7tSpykDRkL+QqWYCjCBd93uXmcSt04nCXleEGhhGw/83c098EZiPUSxq0dPpPo5ttKSMVw5sJZSzOQkLMYhA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=801NIo4+87ARYLa5R5Iu89WiaawZopw6CsikR4i6YvI=; b=UG+qV9OtNau9CpWWr/Pt1ZtE/jTXoYxM0fi0eJXUgSjfGnKdv1GWlOLemBvyqWkaWkiCJNGkj+pmyhxGNr7pACBGbpRSedyUeOXX78dBsteJ/5F/ojtDwdcEZSQs6jhuyYUl+bC2i69Fkl48ATqZ2kmulXHLlCEBUAj+drdcGA5c/pWJl1hDTD4c3u4MYU7I66aBWqS2wyylU963kiJwEfphJGswnUglxw85gHbbZpM00/72j8uig3z2dQgqxdmb1RDu7M3t/Zl9ds+UQybP+ppxIf1jy2VXhgs63bbwd89Ff3YtbRZzEGTEkjncS1B5HD4BQVoYiUEZAurH+cz0ng== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from PAXPR04MB8459.eurprd04.prod.outlook.com (2603:10a6:102:1da::15) by PA1PR04MB10865.eurprd04.prod.outlook.com (2603:10a6:102:48a::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8422.18; Wed, 12 Feb 2025 07:41:33 +0000 Received: from PAXPR04MB8459.eurprd04.prod.outlook.com ([fe80::165a:30a2:5835:9630]) by PAXPR04MB8459.eurprd04.prod.outlook.com ([fe80::165a:30a2:5835:9630%3]) with mapi id 15.20.8445.008; Wed, 12 Feb 2025 07:41:33 +0000 From: "Peng Fan (OSS)" Date: Wed, 12 Feb 2025 15:40:25 +0800 Subject: [PATCH v2 3/7] firmware: arm_scmi: imx: Add i.MX95 LMM protocol Message-Id: <20250212-imx-lmm-cpu-v2-3-3aee005968c1@nxp.com> References: <20250212-imx-lmm-cpu-v2-0-3aee005968c1@nxp.com> In-Reply-To: <20250212-imx-lmm-cpu-v2-0-3aee005968c1@nxp.com> To: Sudeep Holla , Cristian Marussi , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Dan Carpenter , linux-kernel@vger.kernel.org, arm-scmi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, imx@lists.linux.dev, devicetree@vger.kernel.org, Peng Fan X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739346036; l=10648; i=peng.fan@nxp.com; s=20230812; h=from:subject:message-id; bh=Vvy9asaU//yZ2UynoNHoDkay3kqMP0A6OlYkMhIlOH8=; b=qNIcPp9070KDtvnBnIAxa0hLp/ydAYn1tKYCqL6ipxXsVGs44rayEoIqFM5C8AJ8rSFAnCnWe 6nqJK4kbNVODLYV5OMPVYxnY5121p3pw03k151dv4D9fH70JuKTTpXp X-Developer-Key: i=peng.fan@nxp.com; a=ed25519; pk=I4sJg7atIT1g63H7bb5lDRGR2gJW14RKDD0wFL8TT1g= X-ClientProxiedBy: SI2P153CA0014.APCP153.PROD.OUTLOOK.COM (2603:1096:4:140::6) To PAXPR04MB8459.eurprd04.prod.outlook.com (2603:10a6:102:1da::15) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8459:EE_|PA1PR04MB10865:EE_ X-MS-Office365-Filtering-Correlation-Id: 9b72627f-b4c3-4dd2-1b3e-08dd4b38ac3d X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|52116014|366016|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?lTGyExQTlNFdgiqaNT+txXvj0VETLwl?= =?utf-8?q?gIfhnNu+ZobHw/JhlhuNrS7oMY59vL36z9/SCUctf+oFCm0Xx6AxMVz1R2ZiCq6Ui?= =?utf-8?q?deNxfKd2eEcS1GIhmqCah+chGif/1GvrvqHkhX6JDRqj3vlw0LH+/WIf1EuzfV7PJ?= =?utf-8?q?oWEbbRg8m2+MroW4jPHzEsKSNG78Lp4xrJltYXxiWCik0RfchsVSREVRfXS0JXlpC?= =?utf-8?q?6NXLasJqIjaQ2rzBjAmeZvYMZsFMpWeGLwWuvJ+HZ7Ww/rdF6Y1N+eEtNkcNy8ft1?= =?utf-8?q?XwoSqtusMpLpk/8CyuFOc8eHQGwy7ZxMO/uwqpmXopqtCh9ubtnCE4OVyWCbq9+va?= =?utf-8?q?I76gQhd1gK6v7phgEGt5ssg+6FLDaN7kT3Uz5txEizM9Sn9wkAnxNxR0Ti+qOvdfE?= =?utf-8?q?7E7/sm21h1Ity469yww0rAytGcu3K0NT+6dPyBmH5vMkAfXS0ZL8N8TSy2g+IEAjQ?= =?utf-8?q?pxZ9oDRTnPKP6Aza72+B9rfRWMp2mk9kdGR37xW44r1aE+UqlA0yDWZ59bhJIL78z?= =?utf-8?q?a+m502QAr2KaIYC4qmRQu0+3Q4yE7KZBLVSRmwlWYcG/gDQ18qKFR4LvbB6YTbHVD?= =?utf-8?q?EH/cHfDNyIIhqr7kPRZPbBvTYX7GwY6vaSFwVI2U8iKyRoAxCdd373QBUFu14neKM?= =?utf-8?q?xv8cLPYKbBbApqtTeyHQnwEppMA565Uvh2Ic8Ivh4e1BALGLg+Zgk2WJ+HYFXuKNp?= =?utf-8?q?CjU2PLAOCNESOafPmRDWnnqyzw60sNeNYbiupdAJLOE3/XuRWw6k5yDDwjl1dmEez?= =?utf-8?q?Os3o/co7vb3rzQpKtjfghFNuX+pqhgMze3ium8BGi8dG9COZu9at5LU/OHZa7obTm?= =?utf-8?q?OjtMqCdyc6r6gpf257vCJXJnmUMgbyZlEOiqctaEJucR0tjTzKiX8IIgI/pPRKbdM?= =?utf-8?q?O3jQrxqmr/Hdp60+j9904vUjV2WQ+cK4q6xn23v15/1u+mT81eHAWHnO71EmkyoJF?= =?utf-8?q?Qnou+hwgN163sQnW0ckekTqJbWnp5J2jIjwjDDZxvFM/pflpXAfh9YGpRhsURUHMz?= =?utf-8?q?xqrHWSGSMTDHRXD03Rrv8ULh6R+PH3YNm0FbUUvQiffcndaHhKf/aL1syMLrbO+nf?= =?utf-8?q?d6hrm5DWn6raRfbY+EK38osMkz20j8mclieUmwdGK2SR1WaXvuHw3znqW93BNrp8q?= =?utf-8?q?yH9/1uu781PHiDh4vBDUJOKYA3Ghi7cSstqRqr5xswWcMuXt5JX/PNqKiBvJiWzvW?= =?utf-8?q?hGHl4L4xIFjxx6uHs8yV8n6U0W4ash9d6j8wyGvdwuGRqyPFtcDvtKrLQvmkbEa/+?= =?utf-8?q?APPdu00kuXFvsVqeSl+p0pfvy0VdQRfTEZPtOT4RjadvjiCFvFTC/zA+J6GH+t+be?= =?utf-8?q?aS8qvnDLq6A3MGzvQcCv6Pk5tj0XxSY1SFi4cggBnyUk13ccNzwyzAC21tZWccEHT?= =?utf-8?q?nJeUGoBFebc?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB8459.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(52116014)(366016)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?S+q0MEdvJshY6lvHZqtC1EaAnmKp?= =?utf-8?q?uXMQpFW+f8TLfKVtdD011IY/7Tet8/J738oii7BwEFyLieBZpU5cHVZV9iGyG99I1?= =?utf-8?q?f9cy6yvb2s8BSc+z8e7YqF+jsnLEvNHsREf+6JO4a5PSYPGbhm23r6ESTpxm1VduS?= =?utf-8?q?Z0MnlC77rjhOVWgmKbC2QQzPdo7nUnzKtxws7YCNGJcsJhv4BxCsjs5azqWlZg26F?= =?utf-8?q?YSVkXXxP3BFZGogRcsUHrwpJCgbwC8zccAJXokNjKhOE/H48gbYWQUAEjosS/qlcG?= =?utf-8?q?mGCc12GOp+FTBfolcg1jDqWPkU5gi0J/l6SVMnGgUkwYd9/g0/HpLLMRxQZkuxfVO?= =?utf-8?q?RdhF1aC3K3qEPd86orqMR6YL4tnJ1/bDVkfBkb7XMuVoriB1Lae+khTL8eq80m3om?= =?utf-8?q?RM3XMlsExvgPgvWswTYRifkWT41YNpU9CJI58WwU/rlgzuplKz8X57nUydpChr8yv?= =?utf-8?q?jxSI50ytja6PUxYCmtUxHE80Qm+OCrdYEuYTradZ67NMI8TJjXoXBuvUCv3fJ3D9E?= =?utf-8?q?OOsUBlANxbsSUTYV763MgpRTIuEHELciskGqmK/0X4UQq3gMTsRMf66nGzhhe86Hq?= =?utf-8?q?YyiUQSsBLtu36LkJKkmwsiHdmG99nPjfAuTsUkOkTWQIeAJzKni62CkVc9NgqF3vR?= =?utf-8?q?FOgzNRqIy7ijNlCR2NWrFSvZjnh/rVaUckFV0tCPbj17VbirWDm8DeYU86kh2GT/n?= =?utf-8?q?seaR6pdlxEJninIXzp08Z9CR40G+aHcDcheGagsPw+D3bxcGsi4ow5jqgpvP24Ai5?= =?utf-8?q?fSHmoFC/a980CYgc4CXCIcGkaj1GiNDUvAcjyrcAssveNHEfHG+tKtvx1r6zNzhNq?= =?utf-8?q?tn4N5549xgAfNp0d1BBI46K8fg6USEtMkb0PwcPu4wF9Jal01mjfIQkON99Ii2rYT?= =?utf-8?q?2qqBQ3cYH69NA1wmj1EOZYWdDuqt8DcqS5s1kndH8wqSUWTYgPWOMcjAypZvuXA0p?= =?utf-8?q?INcvq2wJD3/5dilzVdgNd4Pq3M890x7nrEOiSojUuRmZ7dPuVlZ09wnE3F7pcQPiQ?= =?utf-8?q?nYUZo8nEaUcKY5X9NfTJGuP60RYFwOseV3VU1mWblez5f1dQY4bWY/Qv71p915go8?= =?utf-8?q?JVF6jx8VzruBrbczyunhTjAcI2a+eYmU8+zE0SHgAzPC2fmUAxRDvLVjajmkiOMQd?= =?utf-8?q?fizkRa6fBZvi8tw2bFj8NApgvtnYtC+MetOC1E3HzBmbdBfGEy4mfrFlpASS0Plrk?= =?utf-8?q?YQWkQzR8QoKG3w7wwyyoUjYXIfazbo2ghow6w7NFKRBXrFyA7Z8A4bRKpmb0mXuri?= =?utf-8?q?YfXL1QQ8YRnQCKDKd7R8GY5Ar67/ZsntmgrDv0bpLKIeLWY7YcMNrv4gHx00P7DU3?= =?utf-8?q?lIjPfs80AyflFnpF1LoND4e4+POeDVmK2KC2SHS2UORzj5JX/gqel3ZhvOWYjSf+s?= =?utf-8?q?sYmg9RC6a2so2INO4opZOarfWnSbntOe/gJP4EP92pzB5d1DtzuhaqkrVV6kANubU?= =?utf-8?q?Bl/hefBAyZxcqnS53+4c61oDS4QVavJQVwhxQDZxwGAg5NO531p/lT2lYf7DP3H5G?= =?utf-8?q?zKFZiwZM1eWf?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9b72627f-b4c3-4dd2-1b3e-08dd4b38ac3d X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8459.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Feb 2025 07:41:33.7688 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6nrcWiARwi0ZHGvgU2Ef47N03yrydGnAI9TLA2cIyfpguBmZVjhHcUH1CNpWR4explNJlRnaulF3jxyZPM0LfA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA1PR04MB10865 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250211_234136_870332_505E3D9E X-CRM114-Status: GOOD ( 15.38 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Peng Fan Add Logical Machine Management(LMM) protocol which is intended for boot, shutdown, and reset of other logical machines (LM). It is usually used to allow one LM to manager another used as an offload or accelerator engine. Signed-off-by: Peng Fan --- drivers/firmware/arm_scmi/vendors/imx/Kconfig | 11 + drivers/firmware/arm_scmi/vendors/imx/Makefile | 1 + drivers/firmware/arm_scmi/vendors/imx/imx-sm-lmm.c | 270 +++++++++++++++++++++ include/linux/scmi_imx_protocol.h | 31 +++ 4 files changed, 313 insertions(+) diff --git a/drivers/firmware/arm_scmi/vendors/imx/Kconfig b/drivers/firmware/arm_scmi/vendors/imx/Kconfig index a01bf5e47301d2f93c9bfc7eebc77e083ea4ed75..1a936fc87d2350e2a21bccd45dfbeebfa3b90286 100644 --- a/drivers/firmware/arm_scmi/vendors/imx/Kconfig +++ b/drivers/firmware/arm_scmi/vendors/imx/Kconfig @@ -12,6 +12,17 @@ config IMX_SCMI_BBM_EXT To compile this driver as a module, choose M here: the module will be called imx-sm-bbm. +config IMX_SCMI_LMM_EXT + tristate "i.MX SCMI LMM EXTENSION" + depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF) + default y if ARCH_MXC + help + This enables i.MX System Logical Machine Protocol to + manage Logical Machines boot, shutdown and etc. + + To compile this driver as a module, choose M here: the + module will be called imx-sm-lmm. + config IMX_SCMI_MISC_EXT tristate "i.MX SCMI MISC EXTENSION" depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF) diff --git a/drivers/firmware/arm_scmi/vendors/imx/Makefile b/drivers/firmware/arm_scmi/vendors/imx/Makefile index d3ee6d5449244a4f5cdf6abcf1845f312c512325..f39a99ccaf9af757475e8b112d224669444d7ddc 100644 --- a/drivers/firmware/arm_scmi/vendors/imx/Makefile +++ b/drivers/firmware/arm_scmi/vendors/imx/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_IMX_SCMI_BBM_EXT) += imx-sm-bbm.o +obj-$(CONFIG_IMX_SCMI_LMM_EXT) += imx-sm-lmm.o obj-$(CONFIG_IMX_SCMI_MISC_EXT) += imx-sm-misc.o diff --git a/drivers/firmware/arm_scmi/vendors/imx/imx-sm-lmm.c b/drivers/firmware/arm_scmi/vendors/imx/imx-sm-lmm.c new file mode 100644 index 0000000000000000000000000000000000000000..4b9211df2329623fae0400039db91cb2b98cded1 --- /dev/null +++ b/drivers/firmware/arm_scmi/vendors/imx/imx-sm-lmm.c @@ -0,0 +1,270 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * System control and Management Interface (SCMI) NXP LMM Protocol + * + * Copyright 2025 NXP + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "../../protocols.h" +#include "../../notify.h" + +#define SCMI_PROTOCOL_SUPPORTED_VERSION 0x10000 + +enum scmi_imx_lmm_protocol_cmd { + SCMI_IMX_LMM_ATTRIBUTES = 0x3, + SCMI_IMX_LMM_BOOT = 0x4, + SCMI_IMX_LMM_RESET = 0x5, + SCMI_IMX_LMM_SHUTDOWN = 0x6, + SCMI_IMX_LMM_WAKE = 0x7, + SCMI_IMX_LMM_SUSPEND = 0x8, + SCMI_IMX_LMM_NOTIFY = 0x9, + SCMI_IMX_LMM_RESET_REASON = 0xA, + SCMI_IMX_LMM_POWER_ON = 0xB, + SCMI_IMX_LMM_RESET_VECTOR_SET = 0xC, +}; + +struct scmi_imx_lmm_priv { + u32 nr_lmm; +}; + +#define SCMI_IMX_LMM_PROTO_ATTR_NUM_LM(x) (((x) & 0xFFU)) +struct scmi_msg_imx_lmm_protocol_attributes { + __le32 attributes; +}; + +struct scmi_msg_imx_lmm_attributes_out { + __le32 lmid; + __le32 attributes; + __le32 state; + __le32 errstatus; + u8 name[LMM_MAX_NAME]; +}; + +struct scmi_imx_lmm_reset_vector_set_in { + __le32 lmid; + __le32 cpuid; +#define SCMI_LMM_VEC_FLAGS_TABLE BIT(0) + __le32 flags; + __le32 resetvectorlow; + __le32 resetvectorhigh; +}; + +struct scmi_imx_lmm_shutdown_in { + __le32 lmid; + __le32 flags; +}; + +static int scmi_imx_lmm_validate_lmid(const struct scmi_protocol_handle *ph, u32 lmid) +{ + struct scmi_imx_lmm_priv *priv = ph->get_priv(ph); + + if (lmid >= priv->nr_lmm) + return -EINVAL; + + return 0; +} + +static int scmi_imx_lmm_attributes(const struct scmi_protocol_handle *ph, + u32 lmid, struct scmi_imx_lmm_info *info) +{ + struct scmi_msg_imx_lmm_attributes_out *out; + struct scmi_xfer *t; + int ret; + + ret = ph->xops->xfer_get_init(ph, SCMI_IMX_LMM_ATTRIBUTES, sizeof(u32), 0, &t); + if (ret) + return ret; + + put_unaligned_le32(lmid, t->tx.buf); + ret = ph->xops->do_xfer(ph, t); + if (!ret) { + out = t->rx.buf; + info->lmid = le32_to_cpu(out->lmid); + info->state = le32_to_cpu(out->state); + info->errstatus = le32_to_cpu(out->errstatus); + strscpy(info->name, out->name); + dev_dbg(ph->dev, "i.MX LMM: Logical Machine(%d), name: %s\n", + info->lmid, out->name); + } else { + dev_err(ph->dev, "i.MX LMM: Failed to get info of Logical Machine(%u)\n", lmid); + } + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_lmm_boot(const struct scmi_protocol_handle *ph, u32 lmid) +{ + struct scmi_xfer *t; + int ret; + + ret = scmi_imx_lmm_validate_lmid(ph, lmid); + if (ret) + return ret; + + ret = ph->xops->xfer_get_init(ph, SCMI_IMX_LMM_BOOT, sizeof(u32), + 0, &t); + if (ret) + return ret; + + put_unaligned_le32(lmid, t->tx.buf); + ret = ph->xops->do_xfer(ph, t); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_lmm_power_on(const struct scmi_protocol_handle *ph, u32 lmid) +{ + struct scmi_xfer *t; + int ret; + + ret = scmi_imx_lmm_validate_lmid(ph, lmid); + if (ret) + return ret; + + ret = ph->xops->xfer_get_init(ph, SCMI_IMX_LMM_POWER_ON, sizeof(u32), + 0, &t); + if (ret) + return ret; + + put_unaligned_le32(lmid, t->tx.buf); + ret = ph->xops->do_xfer(ph, t); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_lmm_reset_vector_set(const struct scmi_protocol_handle *ph, + u32 lmid, u32 cpuid, u32 flags, u64 vector) +{ + struct scmi_imx_lmm_reset_vector_set_in *in; + struct scmi_xfer *t; + int ret; + + ret = ph->xops->xfer_get_init(ph, SCMI_IMX_LMM_RESET_VECTOR_SET, sizeof(*in), + 0, &t); + if (ret) + return ret; + + in = t->tx.buf; + in->lmid = cpu_to_le32(lmid); + in->cpuid = cpu_to_le32(cpuid); + in->flags = cpu_to_le32(flags); + in->resetvectorlow = cpu_to_le32(lower_32_bits(vector)); + in->resetvectorhigh = cpu_to_le32(upper_32_bits(vector)); + ret = ph->xops->do_xfer(ph, t); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_lmm_shutdown(const struct scmi_protocol_handle *ph, u32 lmid, + u32 flags) +{ + struct scmi_imx_lmm_shutdown_in *in; + struct scmi_xfer *t; + int ret; + + ret = scmi_imx_lmm_validate_lmid(ph, lmid); + if (ret) + return ret; + + ret = ph->xops->xfer_get_init(ph, SCMI_IMX_LMM_SHUTDOWN, sizeof(*in), + 0, &t); + if (ret) + return ret; + + in = t->tx.buf; + in->lmid = cpu_to_le32(lmid); + in->flags = cpu_to_le32(flags); + ret = ph->xops->do_xfer(ph, t); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static const struct scmi_imx_lmm_proto_ops scmi_imx_lmm_proto_ops = { + .lmm_boot = scmi_imx_lmm_boot, + .lmm_info = scmi_imx_lmm_attributes, + .lmm_power_on = scmi_imx_lmm_power_on, + .lmm_reset_vector_set = scmi_imx_lmm_reset_vector_set, + .lmm_shutdown = scmi_imx_lmm_shutdown, +}; + +static int scmi_imx_lmm_protocol_attributes_get(const struct scmi_protocol_handle *ph, + struct scmi_imx_lmm_priv *priv) +{ + struct scmi_msg_imx_lmm_protocol_attributes *attr; + struct scmi_xfer *t; + int ret; + + ret = ph->xops->xfer_get_init(ph, PROTOCOL_ATTRIBUTES, 0, + sizeof(*attr), &t); + if (ret) + return ret; + + attr = t->rx.buf; + + ret = ph->xops->do_xfer(ph, t); + if (!ret) { + priv->nr_lmm = SCMI_IMX_LMM_PROTO_ATTR_NUM_LM(le32_to_cpu(attr->attributes)); + dev_info(ph->dev, "i.MX LMM: %d Logical Machines\n", + priv->nr_lmm); + } + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_lmm_protocol_init(const struct scmi_protocol_handle *ph) +{ + struct scmi_imx_lmm_priv *info; + u32 version; + int ret; + + ret = ph->xops->version_get(ph, &version); + if (ret) + return ret; + + dev_info(ph->dev, "NXP SM LMM Version %d.%d\n", + PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version)); + + info = devm_kzalloc(ph->dev, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + ret = scmi_imx_lmm_protocol_attributes_get(ph, info); + if (ret) + return ret; + + return ph->set_priv(ph, info, version); +} + +static const struct scmi_protocol scmi_imx_lmm = { + .id = SCMI_PROTOCOL_IMX_LMM, + .owner = THIS_MODULE, + .instance_init = &scmi_imx_lmm_protocol_init, + .ops = &scmi_imx_lmm_proto_ops, + .supported_version = SCMI_PROTOCOL_SUPPORTED_VERSION, + .vendor_id = SCMI_IMX_VENDOR, + .sub_vendor_id = SCMI_IMX_SUBVENDOR, +}; +module_scmi_protocol(scmi_imx_lmm); + +MODULE_DESCRIPTION("i.MX SCMI LMM driver"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/scmi_imx_protocol.h b/include/linux/scmi_imx_protocol.h index 53b356a26414279f4aaaa8287c32209ed1ad57b4..07779c36ef9a126907e26e304a8feca16fd60ab2 100644 --- a/include/linux/scmi_imx_protocol.h +++ b/include/linux/scmi_imx_protocol.h @@ -11,8 +11,10 @@ #include #include #include +#include #include +#define SCMI_PROTOCOL_IMX_LMM 0x80 #define SCMI_PROTOCOL_IMX_BBM 0x81 #define SCMI_PROTOCOL_IMX_MISC 0x84 @@ -57,4 +59,33 @@ struct scmi_imx_misc_proto_ops { int (*misc_ctrl_req_notify)(const struct scmi_protocol_handle *ph, u32 ctrl_id, u32 evt_id, u32 flags); }; + +#define LMM_ID_DISCOVER 0xFFFFFFFFU +#define LMM_MAX_NAME 16 + +enum scmi_imx_lmm_state { + LMM_STATE_LM_OFF, + LMM_STATE_LM_ON, + LMM_STATE_LM_SUSPEND, + LMM_STATE_LM_POWERED, +}; + +struct scmi_imx_lmm_info { + u32 lmid; + enum scmi_imx_lmm_state state; + u32 errstatus; + u8 name[LMM_MAX_NAME]; +}; + +struct scmi_imx_lmm_proto_ops { + int (*lmm_boot)(const struct scmi_protocol_handle *ph, u32 lmid); + int (*lmm_info)(const struct scmi_protocol_handle *ph, u32 lmid, + struct scmi_imx_lmm_info *info); + int (*lmm_power_on)(const struct scmi_protocol_handle *ph, u32 lmid); + int (*lmm_reset_vector_set)(const struct scmi_protocol_handle *ph, + u32 lmid, u32 cpuid, u32 flags, u64 vector); + int (*lmm_shutdown)(const struct scmi_protocol_handle *ph, u32 lmid, + u32 flags); +}; + #endif