From patchwork Mon Mar 3 02:53:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 13998078 Received: from EUR03-VI1-obe.outbound.protection.outlook.com (mail-vi1eur03on2063.outbound.protection.outlook.com [40.107.103.63]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4012B1D9A54 for ; Mon, 3 Mar 2025 02:54:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.103.63 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740970483; cv=fail; b=qwcXRmK+Y9ZXviBchppl46bx/uxWz4OdzY7limfOZ6aRWQjDlPNzB4hq9F1T1Rpk0M0Qvwz7IbLDbJFe2hb3gPh8LnRsC0zCMdTAJkeZPjY2ZYvegFjRWvcT1GXlos0PRGQL1Pn0kvB035unSEOpy/O7R1UHYkac8giL7GhS94o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740970483; c=relaxed/simple; bh=KlB2r0Yg8B/2G0URaahBMjIf7vfb65DpWW0Ywkn7vdk=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=JH0JAuZj2gDnmnLYXwlgqC4ttrm0Fj7KncoMxIoxUPK4nHQGAskIF3PZYGvUuKoXxXXrRhLTLxR6NWELCfptYflhbTRVeIDTnANjssACOrp73ibc525XjaPBjExuhW8BLbAvO6yJZ96xRDtTt2d7z5/EbEt6/Fxabn5ttJWCMg0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=CD0/hRcj; arc=fail smtp.client-ip=40.107.103.63 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="CD0/hRcj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wOAZq4fFmxR8qZbJJ6hMuXuJvoLShYidyORr33dyoLyikcMG7sCJRwOAMbyvenvvujdqMxZ/x+1T7k51BP9I6QHwauvv89b5znZ/0r7uZGjVaSDCsh71YRMYY3nkwztQ42PTgJjhkMdGiH60Zpe8BWgSB3j+zFXJEuXy5dhYSNpPx1uYOyrR1C91n6uEL6Ap6jooqW4W9PoNDAXXdMP49QvsiWe1CXTwojNR+yAkhVJqK6w+Mb3/0Pxtv3+wu40YNTmWpAJxrCIP3SWYX8KPvoRKPe20X5yCEkiWOV+SZgtQoczrIabpdhsfWNApFT4sQTejFyNzZUKLMPqDvY/Pfw== 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=RTJU2LSZH/a4Snc0eHG9ppB4nXWE3SaBO4x0PidCjuM=; b=hDq9a3mZk8eI0vEFw15A0ZTCZBYy5Xndm3rmTokNVInnAbtgGGXbUefDf0X3hUdoQXviXi8iWsDbG+r6GMkyW2TjC8rxLs81hHT/hdtyN/T9QB35rZelQZTT+u0XcwmshaekZZut3k/kZ8VSw0U1dyxuhZN5WP8zfpx095MOz5ssXKE68Qmi0/IdRBNlWI2p+F1ptsz91LBu7OKc1h0WyFiJbId35dCcYg97RyW64QwEsYCQ4ilWdqHTVcojHhPmDi5VaRUXConiRknse9FxBaCpLmxmM5xBIyIz919AiHq2mOMCafGK3ppm2NCTqpf7T0hVMkIMhFLo00m28uJgiw== 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=RTJU2LSZH/a4Snc0eHG9ppB4nXWE3SaBO4x0PidCjuM=; b=CD0/hRcjjLTmZvaPfk4986lCyyqdEge+KUSTGcwGz1MO6T/wXGDXQy/Ry2ezMnN08fz2yDJkZrTX08giBJG2m98AwDxA1Swh9DBBptVUlZ6eYxIL2BVHDPemHtP6JkK94T2/IVlO/W/Kvgo+kqLF2OXn1Earx/o9Nlx+6RvF1GHEP6zcNjcR7TysTfEFbhJLYyy/ajAwNRkFNEXnxVTxdZabtPgysE0rXuaeUIEzqZJ06aaQ3NpwWBwkRhGbdNvvEEbzazfToRCmHegknCQEMpiAnSpCd5Nmr1OeyErRG5eDRIgMprAQbQFQuHr/gmRzbJe2KKdWF0tSW5IDh3AG5g== 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 AM9PR04MB8308.eurprd04.prod.outlook.com (2603:10a6:20b:3e3::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.27; Mon, 3 Mar 2025 02:54:38 +0000 Received: from PAXPR04MB8459.eurprd04.prod.outlook.com ([fe80::165a:30a2:5835:9630]) by PAXPR04MB8459.eurprd04.prod.outlook.com ([fe80::165a:30a2:5835:9630%4]) with mapi id 15.20.8489.025; Mon, 3 Mar 2025 02:54:38 +0000 From: "Peng Fan (OSS)" Date: Mon, 03 Mar 2025 10:53:24 +0800 Subject: [PATCH v3 3/7] firmware: arm_scmi: imx: Add i.MX95 LMM protocol Message-Id: <20250303-imx-lmm-cpu-v3-3-7695f6f61cfc@nxp.com> References: <20250303-imx-lmm-cpu-v3-0-7695f6f61cfc@nxp.com> In-Reply-To: <20250303-imx-lmm-cpu-v3-0-7695f6f61cfc@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=1740970413; l=10476; i=peng.fan@nxp.com; s=20230812; h=from:subject:message-id; bh=BzUid/SowDeLCOlaJZfYyf1Brti466FL1p93GAdRZFU=; b=71fARmeF3lfszi+2r0wtbz110lGXvzO/mnymMzZA/X6xexA2wNn/6IWIq8zKubdQEhgA7dKxE aqAh5dOKeD4CkyTDbcgcw7NNQcQK+6H5gsZq6k0OeRUwrjmwp4iUJyf 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) Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8459:EE_|AM9PR04MB8308:EE_ X-MS-Office365-Filtering-Correlation-Id: c6ee3c24-9079-4a01-aa93-08dd59febce5 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|1800799024|366016|52116014|7416014|376014|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?msjLTHaOhUDP11LfcUwhhOdbNiQSxSp?= =?utf-8?q?q3rcYeZlpXWLg34Xa6bsgIEsC4IKuSc+d6qnbPFHxyQgIfL0Q1fJIMen86b6zydKs?= =?utf-8?q?OdgEgzos0cMdvMyHouRj1dawxolrvkWrnyZsreBs+3pzwFCotzZeEDRw9idy2riyz?= =?utf-8?q?eEV5sdu8QmIV3VTkkklAUXZ+gIp7Xq3dP4cghwyQNIL6RCE06s6vG3E7uFnWlhyNx?= =?utf-8?q?nuXpKgTq+CF5mzrlxhJ/rofnFuOnHfMqHPStpbdQYqcerWJOMVM45XftU+H08Sqp4?= =?utf-8?q?DiCpMCOE+fkrRhmjeFYmwPa0CmRqVa/jn8wfz9qfp9H6o/BTFQAhUkJCGeOxE4EjM?= =?utf-8?q?4Ea1lHMhi3D7zBTJrH3CmoPPdq+wy55fXYEfZfaGSexzL1GbYTxyP6EAhQXUedUbJ?= =?utf-8?q?JrL4OVbd+X+ba6sWmulzWi52XiwaQdJXSay1EcS8DigZRsCTjuHkl65x3beeCJ+Yr?= =?utf-8?q?oLBFF2XjcFKxXnOab1e0RbI9Q5NtwSSIVINelsDpv6xAK0kwfiGmV8ztppnNexB2O?= =?utf-8?q?s97hOnYCc2tLQhHWfccbiWsK3pQKTAak6eGHVPLN0QNzbVtPZZ/akxIrw7XamzT2x?= =?utf-8?q?kvJj87LeipQusa64jRSq0sFZFMBwDk4+MxcCWm2LtgpypOUMHLx/f380uZoBlQsFJ?= =?utf-8?q?u+V9q3zOuoQR1MvrjqfKF69bgIYk8En4fQZ+S3xyP739hiZyyPQ07xgg7XD3hPgSM?= =?utf-8?q?5u2i86dK9y7YxOq+ioKqi1LaRXN9MWXQQ3Jo+f2fayGURKAq5EcE1XZM1U51Gxk+c?= =?utf-8?q?HNxAo88xybsIq2ohE3lYZUG9jHG5CSphoQs6OmTRHBVAjgR+yT9hRqB+lNblhTQhm?= =?utf-8?q?MLEejZP+jv8jKh27pQ1Z+qyDZJt7WSWI5fCIs88d8gNbxbpuC2c7JNX48td2Hcvdv?= =?utf-8?q?WsKK8QaykWI0d9Ub3AddfJjxPRvEhKuirYA4p8nWmru656cx8dyRWIpSwDzGeSX+C?= =?utf-8?q?xSYrQ7OeVYRv6eQkP9tyXMpQ/IJLZLDwdohxT1Z1f2iScm4XZJkOCcW17sNaRfgcn?= =?utf-8?q?U+bI/sE58UgJ9LDAb8TeHfGgRjLdp+toFA/tfJ0i7g73oljzHqzHWk+PtUxPzW4mG?= =?utf-8?q?vpFXZ6Jp1Z0sZ3UTmjlZH6GZ6ra9ppKhyNdYMod0o5PfsHvurZBrMMJLXg8JasPFz?= =?utf-8?q?JB+HfT9LVjGJKAKZ2Q8icamnEjuj83StfovMv3IGJPDfGvuqbWcB715ZHldSLe6IX?= =?utf-8?q?XJhAeugDX76sWZizzPjVOnWUVaM4ddYqs9eClYGSf+n+XkTI1gnDA2v553cSHxKzg?= =?utf-8?q?/+W6V6zA+hH6aGx/GDXDwsbrmQdlFdxI2oaxpQ6UEWfFbbE4Hnga00hj6RLugz++x?= =?utf-8?q?Fp6NTz00zDQIOXxDxl5rIOi9k4Ls/VczkqmuN1fimSQRROFNbCuE05ewIkHUWIdZP?= =?utf-8?q?V4TkBLFssJz?= 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)(1800799024)(366016)(52116014)(7416014)(376014)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?QDWtahuvXIvv5hA03Z0Hhk76HUEx?= =?utf-8?q?nyfudhq6zhUHwwuh2mZ+2H7U/JPr4UqP1X6AH8rI0t94hPCQDctuR2Zh0/kfPn0nw?= =?utf-8?q?Jxgup2OtuTHSnuYrmN8ukK3n0DlGbdjUP993aWZ6W+RBYp7MbwJa/sQZZOEqcmBcJ?= =?utf-8?q?A/BwHLuLpZ7DDVuZ6qaHztn+dl1WcV1mnZCLcaPDjKkM3Vh+e0IRZHabuEyQWTGxG?= =?utf-8?q?jG9BWjMrPYwevSNqbRXKmvAwyPvB9xwgBip2Xa8OCBmh9DbJZo/RA31nPn5bGdm3u?= =?utf-8?q?kozNT9GiFBcriWq0bg+wmgmbB5hGQ6VlPmnj3aN7fTtijidr/LJLaw6sGbWtHlc9c?= =?utf-8?q?B7zT6TsAbqF2ZtKOe6pxhI52Pbl3Ej3sq+nC5l7VNzvF3OLRNbm3fOyQe4iWy8Snk?= =?utf-8?q?SDn6RTuvbfx/navTcYd7YWrjXerXQUuNsCuH3C0WU17IYQwN9XuA3i1EFOi1SaPQL?= =?utf-8?q?iVGJIX8yrqRfVE8s23rdyAa8rAG5NfxWKSmdfYjaHU06nQ24PcqbJP6u1wPQIEMlX?= =?utf-8?q?RU067WjkQ9E+lrREdMjEcKA1HFBucbcFwE38drMBIMrAnZiI73mgEKIIA3eL7uY83?= =?utf-8?q?bTYfR9U3CXwsc3IfrceVrcL28ZpQRGYoeHzlMXDBNU+y0FEbAcGEoUVA4Gq2+91SM?= =?utf-8?q?GMwMI8UdIv8jPyl3PuoCR2efGE0IWSG9/JtlhPPYZeY2JaGW3corAPcpj0OQkBa+z?= =?utf-8?q?bMMWZbj9hMs2IbEVVqjcpvMC4TCsvgMdS6ZQJw0jJ5U2L8T4y2mkEf6NS/ugkOX6Y?= =?utf-8?q?baxLY3tXxSVGipSp3kzfCcCw4eo23CfHSZUoQqwv73ak0+DnZYPp1H7/ZnBtgu6H1?= =?utf-8?q?PVHP8opDwLCm+YS0FxjRMCWXs+Sy0MrWIzpxdR4vp8qwfRciEBXfAq1r0yl8s/8XG?= =?utf-8?q?KNJGKGxpRGTfpdFx8joPfuQ1lnlHpJb9+9boSKlMzUeTWnKsnLwAjB+M2KDhoHVUy?= =?utf-8?q?4sqfPBsF4HJsBGmYpY/UbHqiUYRAKtz1YBuvpwdQXEn4/nYULMOWIgXY+WUC5xVd1?= =?utf-8?q?C02hAHwh3UR5bS1NBB2fBL+PgN7Odgd9zSO8OATnTK9W679dav0alMFvvk7io9MIL?= =?utf-8?q?tf/beWDkF1mCZR13/WkqHVZ361bmWDu7DoeRzFNj7A//FLJ0PLVy7+RwfdVqkrnZP?= =?utf-8?q?cWuaB0CJqZVg5heplP6d7JgsD15i4/wVxG1OLLF5tQOJtSGAA9AkvYU2GeK20ZT3w?= =?utf-8?q?mCf+geEv9hmjCmNB/iVoSfiOnmi/AzFakeYzEFWtVuimDO2v26NEixm1I7RCWzw8A?= =?utf-8?q?7VcuzLdI5yJKMFCKTpvLoXFwYOebJ1eAul2AYh6ier439F7GY7RYYQxtmshRZACTm?= =?utf-8?q?bEA2ARnZoB6lxReufhLmHJFp/8jSPSWiSyD3GCPbGqL42x+PvAZF129PcEOqc+por?= =?utf-8?q?JsuouSwfdYHEgBGfy+wGmnX/sUg3zJmA1nPhRLdiIVZJtqMp/ZTj3V4w50L6nPVly?= =?utf-8?q?rsbpNGBSis78EsgzYpWigaMgOllaijccOVOSiIDzgK70FrpXIv6El+1Odo+24DXkA?= =?utf-8?q?4XsXvH8C6ywg?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: c6ee3c24-9079-4a01-aa93-08dd59febce5 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8459.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Mar 2025 02:54:38.3273 (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: aEvYMAE9WEvvzjYoncCXIcMG+4+hJtyQz0nlFv2kvB+s7B9KsGfXIKUkvNvuhAonJg/8v/Tt7WeroZ/E91ck0Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8308 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 | 257 +++++++++++++++++++++ include/linux/scmi_imx_protocol.h | 32 +++ 4 files changed, 301 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..b56a566fb96ee72c025096c025847f4e9d0fefe9 --- /dev/null +++ b/drivers/firmware/arm_scmi/vendors/imx/imx-sm-lmm.c @@ -0,0 +1,257 @@ +// 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_NR_LM_MASK GENMASK(7, 0) +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; + __le32 flags; /* reserved for future extension */ + __le32 resetvectorlow; + __le32 resetvectorhigh; +}; + +struct scmi_imx_lmm_shutdown_in { + __le32 lmid; +#define SCMI_IMX_LMM_SHUTDOWN_GRACEFUL BIT(0) + __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_power_boot(const struct scmi_protocol_handle *ph, u32 lmid, bool boot) +{ + struct scmi_xfer *t; + u8 msg_id; + int ret; + + ret = scmi_imx_lmm_validate_lmid(ph, lmid); + if (ret) + return ret; + + if (boot) + msg_id = SCMI_IMX_LMM_BOOT; + else + msg_id = SCMI_IMX_LMM_POWER_ON; + + ret = ph->xops->xfer_get_init(ph, msg_id, 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(0); + 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); + if (flags & SCMI_IMX_LMM_SHUTDOWN_GRACEFUL) + in->flags = cpu_to_le32(SCMI_IMX_LMM_SHUTDOWN_GRACEFUL); + else + in->flags = cpu_to_le32(0); + 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_power_boot = scmi_imx_lmm_power_boot, + .lmm_info = scmi_imx_lmm_attributes, + .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 = le32_get_bits(attr->attributes, SCMI_IMX_LMM_NR_LM_MASK); + 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_ALIAS("scmi-protocol-" __stringify(SCMI_PROTOCOL_IMX_LMM) "-" SCMI_IMX_VENDOR); +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..2a96fc29cb6f4dd1e4c29e0aaaa614ae9783da4a 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,34 @@ 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); }; + +/* See LMM_ATTRIBUTES in imx95.rst */ +#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_power_boot)(const struct scmi_protocol_handle *ph, u32 lmid, + bool boot); + int (*lmm_info)(const struct scmi_protocol_handle *ph, u32 lmid, + struct scmi_imx_lmm_info *info); + 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