From patchwork Thu Jul 18 07:41:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Peng Fan (OSS)" X-Patchwork-Id: 13736139 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 543D6C3DA60 for ; Thu, 18 Jul 2024 07:34:35 +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=9xkagEKIddeT9VSxKdk2VEbIxtLknUAa+k5fp4B5DyM=; b=uAyxSPTvx1dTWwzz0NYn5Wkdrc s0vBTLA0KVDaQYaW1+4QNhaqeWknmI6NbkwF71xWOsGTEPZ12rMgaqqcSlIOA/uyNdHP8yJy5qHPX cbBsJh9gUNOTSc0zvFW9sbah+ULYx0vU0Z4SbDN7MDyIv2o8u/LyE2Yfm0++YKTs5o4MlLQ+udI03 EQM+YMxgXqCesytesTipTl16Jm2a0+s9l8Evyb5JTq2CS9xUyCSKuV++75GQ3bSFmk5d180xwrZ0e fKicfdUHiojS43kUI4Z8ir0m+c/7swcYGWiAKEhNrtM3ZBY8j5pzbfPmw+KCW3dG7i3maDTMg0dQz RMsQ6C/A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sULed-0000000GDNj-3rsI; Thu, 18 Jul 2024 07:34:20 +0000 Received: from mail-northeuropeazlp170120003.outbound.protection.outlook.com ([2a01:111:f403:c200::3] helo=DU2PR03CU002.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sULdh-0000000GCth-0zCR for linux-arm-kernel@lists.infradead.org; Thu, 18 Jul 2024 07:33:23 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iH9N2dcvKVta1IgFEz6rVv4/1dNMMg3YjAFHI75GxLJr0kq+60DNtfnAGW5JMHGOdqOoKzq5NFHz6lsqS7oviYaW+S2a8XChEHR+PuARCh2zi/2bI6WRI5xMa6NlvKcpyDrSSg1eNaHv2zWAuJKPUe5n2HaJ+rsvKUKl12GTIhEUDvLa1wUkUXxukYT8sd7xa7Ayw0gI8P19F87l1hgg6GGiL81KyLlsUKPgdKAOY7qTOEOt9wmSQAWcUacs/bPcqh+HkVIxftQ0CRZzGKOW5uD/VbfJ/fOYfC1J0RVWt0fPLZZG6gSUWTYY+QmCLWUB+9kWGAczuYsYjw+vFMPL/g== 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=9xkagEKIddeT9VSxKdk2VEbIxtLknUAa+k5fp4B5DyM=; b=HRpuXqn/Wor06ycy3fUFBmve1JyE9Yvw0dShNtqbALts3+iTVuAVtjLtecpxUn6q6RPWIVs58ZGeTAymSNe3jN5VACwBx+D+CAweOj85D+Zs4a+ZjdGkS3SJOwDOGpge662TTZLi+sWFrLgdnrqUlGngYJ3O1TK8b5bS45/ELzx+jQP5sgmc8fWevziUYnSaXt73hk5Xb52p31ulqx4wqIkwa3fmHdfMa4OHFsQzA4K/UFH0ueRSeR4PtlL4GGOhk8YZckTBnhAa9/GxsdHFuGOt/FYI5hAGZkesiE4g0ImfK/kVgMIsAKhki3PyWAvDJTRh1wUj4Y2pOwpZNpq3Rg== 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=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9xkagEKIddeT9VSxKdk2VEbIxtLknUAa+k5fp4B5DyM=; b=Oi5CCZvhKJxpVdcx2q1UKiex+veXn3zq0W7rA8R0s1mi/e205mEb9oUGEAalk0EJj7GJq263exURHjC2ST45I2+ZbESSloLN2OcpL64j6vEGYTpdBt84btSskqe6ZfcBgN6OUrzdy7LIwFp+imv28yzJpXlICmPhpVoUml/3eXA= 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 DU4PR04MB10457.eurprd04.prod.outlook.com (2603:10a6:10:561::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7784.16; Thu, 18 Jul 2024 07:33:13 +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.7762.020; Thu, 18 Jul 2024 07:33:13 +0000 From: "Peng Fan (OSS)" Date: Thu, 18 Jul 2024 15:41:54 +0800 Subject: [PATCH v6 2/7] firmware: arm_scmi: add initial support for i.MX BBM protocol Message-Id: <20240718-imx95-bbm-misc-v2-v6-2-18f008e16e9d@nxp.com> References: <20240718-imx95-bbm-misc-v2-v6-0-18f008e16e9d@nxp.com> In-Reply-To: <20240718-imx95-bbm-misc-v2-v6-0-18f008e16e9d@nxp.com> To: Sudeep Holla , Cristian Marussi , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Alexandre Belloni , Dmitry Torokhov Cc: Peng Fan , arm-scmi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-rtc@vger.kernel.org, linux-input@vger.kernel.org X-Mailer: b4 0.12.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1721288528; l=13923; i=peng.fan@nxp.com; s=20230812; h=from:subject:message-id; bh=m4/zUnBHrvUCml6LwbVFtKf2AEb1qkvpVEohGFcAPm0=; b=egMFvfpmIl9jECaizNKqWYP7F4mMKqfzSeHZPbApLHRLsGrqfXUvWqi6Ps2KU8bsASE4YtHZI Q1PZV9EYFvjAEqJZsXiwwLNQqmCzFWxAN2iKUqqXkQl7lvZOpZMZ8+s X-Developer-Key: i=peng.fan@nxp.com; a=ed25519; pk=I4sJg7atIT1g63H7bb5lDRGR2gJW14RKDD0wFL8TT1g= X-ClientProxiedBy: SI1PR02CA0046.apcprd02.prod.outlook.com (2603:1096:4:1f5::14) 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_|DU4PR04MB10457:EE_ X-MS-Office365-Filtering-Correlation-Id: ead6aa7a-3191-4d16-205c-08dca6fbe1a6 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|376014|7416014|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?BZJdXiBKoN3Fj6Gw/x8K8PZ8O92wfkZ?= =?utf-8?q?gw7sOTRKnIAmxd+8Yzeyeu50k7+3LHeMDD0R5H0sSJ7TvXDMRtlCnCbWMVwS6HN/o?= =?utf-8?q?ut2270Tx+mE/EPs5bfBHUY/l0e5V6hgHT80lH9SJxLopa6s8ugIIgFx1PKQCSW+MT?= =?utf-8?q?kzmCumWPVagB+dhG/FEl0GxWVAmJ9tV9DUOuZMrbY/qfJbzuZQlW7zq0CUfbmSLf9?= =?utf-8?q?mn/AuZmylDeFA1Y33XfBq+qC7Rp0OX5ESa8ox9sff2KRM/gn7Iveoufhs5gHgTpce?= =?utf-8?q?fPfhNqRxh0zknHzlInzjsvJCtE1R9JVkflfihdNaHZ0lFCOgWBtlHRbr5E0dlPUgV?= =?utf-8?q?ZEoWc+UomWrmJg+4TFkW2GFL2AqiNtkoHo0HFnjhoZB2J39g/rmUjATGB1eUkupPy?= =?utf-8?q?lwniT2umOFKNtu5tMp4O6n/RtE0GubkNGmfNAGGMoxAblNqqUOuQ66mlElN6IwTA6?= =?utf-8?q?GDA6r5Q0ulYo21It6zFwBfc9ltPr/YgNYw7ErTx8/v0VzAG6ozXWdvVbxUmU4zO92?= =?utf-8?q?KV7MU74DdYllpx8u/zIs6dIbUy6Wt1fl1XltW6RGy+/567RdfWJFezXXFOHCyp1iM?= =?utf-8?q?KcQd4BDqohvzT/sCcLQ9dmnE5jG9aHUwh6HxaXqHqgPtjlTOrMeWEd/N+om+aVN+C?= =?utf-8?q?crpU7Zlw5WMB02hyQklxY62ilQ/idoGLjZI6Teb6oahPmzkOSCJ3MNSxHl63C50aw?= =?utf-8?q?BIfIVAdGdyMSxsnk/YVGfO7hh61NDsZaqGGOO3iUuwly2QTyrVw8YK4pVdQH76+eY?= =?utf-8?q?eyhkhmqNEytirnTL5M40ZxoaAJwD4kimN6YH2FZQMgN9h2n+aL/G06lPtv4hygFAt?= =?utf-8?q?+p60VdbA3wtUjLCXW7ly9IDDp50PKAmufidPkrwgzAY0un/cC7w+03JMvb+URbtzU?= =?utf-8?q?RybgFsG0u83gJTL6epblb89p1UQCvUcrsjbv/2NMSuNm6QAjXmU7Z1HiyHSkbWa2J?= =?utf-8?q?BwPjzoqKklPKyh2W7S0sC8fz+rFCHP/tbP6af8APAKCaYrxDGbX91uog/VMmxFOsb?= =?utf-8?q?Ck4ZoeGpmXS/+B24D2yBIWys6QgqcxPCtE4vecVz0ay2u1V0mlBf4lXAmquHDSqU4?= =?utf-8?q?k6TnOVCNtubdtfdzXbIDP5v3buU0ij+mWbXr7LmRhok/V2+1d5gIlfLXtM0CFxrx8?= =?utf-8?q?/lgsgLN9GT9UZplXd3UJvoqHYH+bHumg9AMm0Dy9Rxp8LSNwHxdbWFdsKzEBU5ZXA?= =?utf-8?q?QudydRbxATAxRodn8cTvQAij/FeZruvpld8UUd8LmAPt8o8riYIt2RRqDe+d/0icn?= =?utf-8?q?GAkRyOUh3qhzhX9Nxrnx1dyQ4PAfqqSKuNajK5EJRLpcKUePmoAUlAL7yvBZF8WUb?= =?utf-8?q?nW+UV1brHBgMet8BGRnGTGLAxvk5Yh8nf731gQzSZNhV57gWUGZiAlA=3D?= 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)(376014)(7416014)(921020)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?tP+IjKKeRQ+FzQxxdck5UbbNJwer?= =?utf-8?q?w/S2Wb41BPRNcnz7+O1eZAqYmVTBxqWTtGQedcJbnTe2iQdAMGG2qXce/SW9cWWpv?= =?utf-8?q?3ZDJufSf8Qk/dWwhwfkQksOtxjk281DyD4a0XWxXXhcheM8c2ncY+NOtmMnWHbd8Z?= =?utf-8?q?r3xEcBimF6oVIMqs9pGYtojT7+ChwU6RF4jNc/rQRL6rUsDdIIzCASPE+FnJh/yiZ?= =?utf-8?q?lshYDC4tWjB7OAxjAtfWWAGfYINZU2VeV6LzoRlPVMmIAKIvdvro92YUbGmqm6ZL+?= =?utf-8?q?uVShEaV9HrNZo1BQJf7OxU5ZAwl45g1jQC5ufPka9uEH7vK5bLnKByhHK26SJ1Hgt?= =?utf-8?q?TIw+0mXp+OP/VLlHPr9UIMLUecRlecPcr1KxXezk3oxF7RO4RPANm7drzGvEsWUqV?= =?utf-8?q?XKEy+FsHK6SO3gabj848Ijerb/aZmN4zlIfg91wqM94Wj8vMIzKikaV1j/ThVBqya?= =?utf-8?q?bQhMCLeLlaevGBMhLX8bHVXVKWRVwhdSRokBzE4UAmsgjKyVtisLNi8d/Za3XSYe4?= =?utf-8?q?yhp3DRx1EYS5Tj/RR5hSx/8ABAHa8+1N8NbOn5kc4p7MQb/aPNdrg2gR72Aql/0FR?= =?utf-8?q?NaIwe3PPpInDKW5HbuDVyIlCrgcaEzeSegS+O3NzFjSkIqfX9O+N9C1BRiuEkW58A?= =?utf-8?q?P9LyR/J34X92K28vBO429FQD+aV/S/6n47V5TPYogGi54ipEUXhF75yXusmTi/HLX?= =?utf-8?q?Fqga8mkXatQZadCVcRJKShyohvfG8bp6sskY5wxDdGiTht/4WAXgCbdyJQ6fnQoqR?= =?utf-8?q?mMvW+0AhntZuou/rezWY3+whloYnfqRIPqdxUim37lYEIdzYf6DfpY0Sg+TWlQF+P?= =?utf-8?q?ETykTcQli2/4FjAmi6iZjc6d48YobD5naY0nH++0dfw0gteSEWBIS2F4cOHsjkBYZ?= =?utf-8?q?FY4wnYX/8FC2nho1TS1dg2LC+RzxUNNo3CuC5aBvBDWGTDp/kSP3qcee8fZQT3nn9?= =?utf-8?q?iyXh33tE2Dc1/ztW3Owrtj2+zmvj7ahSQLJv8M1PE7oqwOMELej3qny4iu01YQzA0?= =?utf-8?q?K3FBRIuOqn6xEYP5Kc6iineVC8rQYzKw/Nz6iaGFScfNKu5p7neaAqArZpYc3aeKP?= =?utf-8?q?3vPAH2rqJs26/V1mMIZeRl1WDhL76Ch2GgbqYsesSV7tO9pi4qnQPtYXdVAPZOJNM?= =?utf-8?q?bZht0Z9A7AqNt0gYshdimUMMygNpN0f79tY+UJWCB8yjC81Xu4ifWSKGq/bA74Q2b?= =?utf-8?q?PeTFHcK0fL66QfDoMbSXUl+9wDANFY8oQnjK3Vv7BuX7ppcdmvEpxZ3zPU2W66vmb?= =?utf-8?q?rM8SV3tM4zHMj+bYSOFe9YsitobT+VbBEotkCAsjz+KGUnRJAJlPuVnJk8hDb6Qug?= =?utf-8?q?+nlQcE3xd26bOrUZp6bylVGLZ1XFvzI+xE7J/IJOdsQxalIKcO5rDMb3vQKPrcHMp?= =?utf-8?q?4ZdXx0PtmGf7lWQc3GnnQVquoKko3yIiCoPmZv73teeUzyBvN3AexbeKcPrXqJYA8?= =?utf-8?q?xw7M1mKVmO/gIXeMwsvTZOvz+JxcN8Lq7EvUkPnX0ISMj4QpuhizViD6w3g6SGcGc?= =?utf-8?q?zzNDv6nQdjWA?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: ead6aa7a-3191-4d16-205c-08dca6fbe1a6 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8459.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jul 2024 07:33:13.3919 (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: GJZlkMWJD1AC5ZiRpfDheaDiBODQiMtrcvx2wxZ4mzE6PTcQU8Z/Q16s/6pUfNh6ph1fuQgeT0YytnJ8b3BuSA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR04MB10457 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240718_003321_653180_84430EA2 X-CRM114-Status: GOOD ( 14.92 ) 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 i.MX95 has a battery-backed module(BBM), which has persistent storage (GPR), an RTC, and the ON/OFF button. The System Manager(SM) firmware use SCMI vendor protocol(SCMI BBM) to let agent be able to use GPR, RTC and ON/OFF button. Reviewed-by: Cristian Marussi Signed-off-by: Peng Fan --- drivers/firmware/arm_scmi/Kconfig | 2 + drivers/firmware/arm_scmi/Makefile | 1 + drivers/firmware/arm_scmi/imx/Kconfig | 14 ++ drivers/firmware/arm_scmi/imx/Makefile | 2 + drivers/firmware/arm_scmi/imx/imx-sm-bbm.c | 379 +++++++++++++++++++++++++++++ include/linux/scmi_imx_protocol.h | 42 ++++ 6 files changed, 440 insertions(+) diff --git a/drivers/firmware/arm_scmi/Kconfig b/drivers/firmware/arm_scmi/Kconfig index aa5842be19b2..79846cbaf71b 100644 --- a/drivers/firmware/arm_scmi/Kconfig +++ b/drivers/firmware/arm_scmi/Kconfig @@ -180,4 +180,6 @@ config ARM_SCMI_POWER_CONTROL called scmi_power_control. Note this may needed early in boot to catch early shutdown/reboot SCMI requests. +source "drivers/firmware/arm_scmi/imx/Kconfig" + endmenu diff --git a/drivers/firmware/arm_scmi/Makefile b/drivers/firmware/arm_scmi/Makefile index fd59f58ce8a2..fb9407fef60c 100644 --- a/drivers/firmware/arm_scmi/Makefile +++ b/drivers/firmware/arm_scmi/Makefile @@ -16,6 +16,7 @@ scmi-module-objs := $(scmi-driver-y) $(scmi-protocols-y) $(scmi-transport-y) obj-$(CONFIG_ARM_SCMI_PROTOCOL) += scmi-core.o obj-$(CONFIG_ARM_SCMI_PROTOCOL) += scmi-module.o +obj-$(CONFIG_ARM_SCMI_PROTOCOL) += imx/ obj-$(CONFIG_ARM_SCMI_POWER_CONTROL) += scmi_power_control.o diff --git a/drivers/firmware/arm_scmi/imx/Kconfig b/drivers/firmware/arm_scmi/imx/Kconfig new file mode 100644 index 000000000000..4b6ac7febe8f --- /dev/null +++ b/drivers/firmware/arm_scmi/imx/Kconfig @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-only +menu "ARM SCMI NXP i.MX Vendor Protocols" + +config IMX_SCMI_BBM_EXT + tristate "i.MX SCMI BBM EXTENSION" + depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF) + default y if ARCH_MXC + help + This enables i.MX System BBM control logic which supports RTC + and BUTTON. + + This driver can also be built as a module. + +endmenu diff --git a/drivers/firmware/arm_scmi/imx/Makefile b/drivers/firmware/arm_scmi/imx/Makefile new file mode 100644 index 000000000000..a7dbdd20dbb9 --- /dev/null +++ b/drivers/firmware/arm_scmi/imx/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +obj-$(CONFIG_IMX_SCMI_BBM_EXT) += imx-sm-bbm.o diff --git a/drivers/firmware/arm_scmi/imx/imx-sm-bbm.c b/drivers/firmware/arm_scmi/imx/imx-sm-bbm.c new file mode 100644 index 000000000000..017183caaadb --- /dev/null +++ b/drivers/firmware/arm_scmi/imx/imx-sm-bbm.c @@ -0,0 +1,379 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * System Control and Management Interface (SCMI) NXP BBM Protocol + * + * Copyright 2024 NXP + */ + +#define pr_fmt(fmt) "SCMI Notifications BBM - " fmt + +#include +#include +#include +#include +#include +#include +#include + +#include "../protocols.h" +#include "../notify.h" + +#define SCMI_PROTOCOL_SUPPORTED_VERSION 0x10000 + +enum scmi_imx_bbm_protocol_cmd { + IMX_BBM_GPR_SET = 0x3, + IMX_BBM_GPR_GET = 0x4, + IMX_BBM_RTC_ATTRIBUTES = 0x5, + IMX_BBM_RTC_TIME_SET = 0x6, + IMX_BBM_RTC_TIME_GET = 0x7, + IMX_BBM_RTC_ALARM_SET = 0x8, + IMX_BBM_BUTTON_GET = 0x9, + IMX_BBM_RTC_NOTIFY = 0xA, + IMX_BBM_BUTTON_NOTIFY = 0xB, +}; + +#define GET_RTCS_NR(x) le32_get_bits((x), GENMASK(23, 16)) +#define GET_GPRS_NR(x) le32_get_bits((x), GENMASK(15, 0)) + +#define SCMI_IMX_BBM_NOTIFY_RTC_UPDATED BIT(2) +#define SCMI_IMX_BBM_NOTIFY_RTC_ROLLOVER BIT(1) +#define SCMI_IMX_BBM_NOTIFY_RTC_ALARM BIT(0) + +#define SCMI_IMX_BBM_RTC_ALARM_ENABLE_FLAG BIT(0) + +#define SCMI_IMX_BBM_NOTIFY_RTC_FLAG \ + (SCMI_IMX_BBM_NOTIFY_RTC_UPDATED | SCMI_IMX_BBM_NOTIFY_RTC_ROLLOVER | \ + SCMI_IMX_BBM_NOTIFY_RTC_ALARM) + +#define SCMI_IMX_BBM_EVENT_RTC_MASK GENMASK(31, 24) + +struct scmi_imx_bbm_info { + u32 version; + int nr_rtc; + int nr_gpr; +}; + +struct scmi_msg_imx_bbm_protocol_attributes { + __le32 attributes; +}; + +struct scmi_imx_bbm_set_time { + __le32 id; + __le32 flags; + __le32 value_low; + __le32 value_high; +}; + +struct scmi_imx_bbm_get_time { + __le32 id; + __le32 flags; +}; + +struct scmi_imx_bbm_alarm_time { + __le32 id; + __le32 flags; + __le32 value_low; + __le32 value_high; +}; + +struct scmi_msg_imx_bbm_rtc_notify { + __le32 rtc_id; + __le32 flags; +}; + +struct scmi_msg_imx_bbm_button_notify { + __le32 flags; +}; + +struct scmi_imx_bbm_notify_payld { + __le32 flags; +}; + +static int scmi_imx_bbm_attributes_get(const struct scmi_protocol_handle *ph, + struct scmi_imx_bbm_info *pi) +{ + int ret; + struct scmi_xfer *t; + struct scmi_msg_imx_bbm_protocol_attributes *attr; + + 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) { + pi->nr_rtc = GET_RTCS_NR(attr->attributes); + pi->nr_gpr = GET_GPRS_NR(attr->attributes); + } + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_bbm_notify(const struct scmi_protocol_handle *ph, + u32 src_id, int message_id, bool enable) +{ + int ret; + struct scmi_xfer *t; + + if (message_id == IMX_BBM_RTC_NOTIFY) { + struct scmi_msg_imx_bbm_rtc_notify *rtc_notify; + + ret = ph->xops->xfer_get_init(ph, message_id, + sizeof(*rtc_notify), 0, &t); + if (ret) + return ret; + + rtc_notify = t->tx.buf; + rtc_notify->rtc_id = cpu_to_le32(0); + rtc_notify->flags = + cpu_to_le32(enable ? SCMI_IMX_BBM_NOTIFY_RTC_FLAG : 0); + } else if (message_id == IMX_BBM_BUTTON_NOTIFY) { + struct scmi_msg_imx_bbm_button_notify *button_notify; + + ret = ph->xops->xfer_get_init(ph, message_id, + sizeof(*button_notify), 0, &t); + if (ret) + return ret; + + button_notify = t->tx.buf; + button_notify->flags = cpu_to_le32(enable ? 1 : 0); + } else { + return -EINVAL; + } + + ret = ph->xops->do_xfer(ph, t); + + ph->xops->xfer_put(ph, t); + return ret; +} + +static enum scmi_imx_bbm_protocol_cmd evt_2_cmd[] = { + IMX_BBM_RTC_NOTIFY, + IMX_BBM_BUTTON_NOTIFY +}; + +static int scmi_imx_bbm_set_notify_enabled(const struct scmi_protocol_handle *ph, + u8 evt_id, u32 src_id, bool enable) +{ + int ret, cmd_id; + + if (evt_id >= ARRAY_SIZE(evt_2_cmd)) + return -EINVAL; + + cmd_id = evt_2_cmd[evt_id]; + ret = scmi_imx_bbm_notify(ph, src_id, cmd_id, enable); + if (ret) + pr_debug("FAIL_ENABLED - evt[%X] dom[%d] - ret:%d\n", + evt_id, src_id, ret); + + return ret; +} + +static void *scmi_imx_bbm_fill_custom_report(const struct scmi_protocol_handle *ph, + u8 evt_id, ktime_t timestamp, + const void *payld, size_t payld_sz, + void *report, u32 *src_id) +{ + const struct scmi_imx_bbm_notify_payld *p = payld; + struct scmi_imx_bbm_notif_report *r = report; + + if (sizeof(*p) != payld_sz) + return NULL; + + if (evt_id == SCMI_EVENT_IMX_BBM_RTC) { + r->is_rtc = true; + r->is_button = false; + r->timestamp = timestamp; + r->rtc_id = le32_get_bits(p->flags, SCMI_IMX_BBM_EVENT_RTC_MASK); + r->rtc_evt = le32_get_bits(p->flags, SCMI_IMX_BBM_NOTIFY_RTC_FLAG); + dev_dbg(ph->dev, "RTC: %d evt: %x\n", r->rtc_id, r->rtc_evt); + *src_id = r->rtc_evt; + } else if (evt_id == SCMI_EVENT_IMX_BBM_BUTTON) { + r->is_rtc = false; + r->is_button = true; + r->timestamp = timestamp; + dev_dbg(ph->dev, "BBM Button\n"); + *src_id = 0; + } else { + WARN_ON_ONCE(1); + return NULL; + } + + return r; +} + +static const struct scmi_event scmi_imx_bbm_events[] = { + { + .id = SCMI_EVENT_IMX_BBM_RTC, + .max_payld_sz = sizeof(struct scmi_imx_bbm_notify_payld), + .max_report_sz = sizeof(struct scmi_imx_bbm_notif_report), + }, + { + .id = SCMI_EVENT_IMX_BBM_BUTTON, + .max_payld_sz = sizeof(struct scmi_imx_bbm_notify_payld), + .max_report_sz = sizeof(struct scmi_imx_bbm_notif_report), + }, +}; + +static const struct scmi_event_ops scmi_imx_bbm_event_ops = { + .set_notify_enabled = scmi_imx_bbm_set_notify_enabled, + .fill_custom_report = scmi_imx_bbm_fill_custom_report, +}; + +static const struct scmi_protocol_events scmi_imx_bbm_protocol_events = { + .queue_sz = SCMI_PROTO_QUEUE_SZ, + .ops = &scmi_imx_bbm_event_ops, + .evts = scmi_imx_bbm_events, + .num_events = ARRAY_SIZE(scmi_imx_bbm_events), + .num_sources = 1, +}; + +static int scmi_imx_bbm_rtc_time_set(const struct scmi_protocol_handle *ph, + u32 rtc_id, u64 sec) +{ + struct scmi_imx_bbm_info *pi = ph->get_priv(ph); + struct scmi_imx_bbm_set_time *cfg; + struct scmi_xfer *t; + int ret; + + if (rtc_id >= pi->nr_rtc) + return -EINVAL; + + ret = ph->xops->xfer_get_init(ph, IMX_BBM_RTC_TIME_SET, sizeof(*cfg), 0, &t); + if (ret) + return ret; + + cfg = t->tx.buf; + cfg->id = cpu_to_le32(rtc_id); + cfg->flags = 0; + cfg->value_low = cpu_to_le32(lower_32_bits(sec)); + cfg->value_high = cpu_to_le32(upper_32_bits(sec)); + + ret = ph->xops->do_xfer(ph, t); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_bbm_rtc_time_get(const struct scmi_protocol_handle *ph, + u32 rtc_id, u64 *value) +{ + struct scmi_imx_bbm_info *pi = ph->get_priv(ph); + struct scmi_imx_bbm_get_time *cfg; + struct scmi_xfer *t; + int ret; + + if (rtc_id >= pi->nr_rtc) + return -EINVAL; + + ret = ph->xops->xfer_get_init(ph, IMX_BBM_RTC_TIME_GET, sizeof(*cfg), + sizeof(u64), &t); + if (ret) + return ret; + + cfg = t->tx.buf; + cfg->id = cpu_to_le32(rtc_id); + cfg->flags = 0; + + ret = ph->xops->do_xfer(ph, t); + if (!ret) + *value = get_unaligned_le64(t->rx.buf); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_bbm_rtc_alarm_set(const struct scmi_protocol_handle *ph, + u32 rtc_id, bool enable, u64 sec) +{ + struct scmi_imx_bbm_info *pi = ph->get_priv(ph); + struct scmi_imx_bbm_alarm_time *cfg; + struct scmi_xfer *t; + int ret; + + if (rtc_id >= pi->nr_rtc) + return -EINVAL; + + ret = ph->xops->xfer_get_init(ph, IMX_BBM_RTC_ALARM_SET, sizeof(*cfg), 0, &t); + if (ret) + return ret; + + cfg = t->tx.buf; + cfg->id = cpu_to_le32(rtc_id); + cfg->flags = enable ? SCMI_IMX_BBM_RTC_ALARM_ENABLE_FLAG : 0; + cfg->value_low = cpu_to_le32(lower_32_bits(sec)); + cfg->value_high = cpu_to_le32(upper_32_bits(sec)); + + ret = ph->xops->do_xfer(ph, t); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static int scmi_imx_bbm_button_get(const struct scmi_protocol_handle *ph, u32 *state) +{ + struct scmi_xfer *t; + int ret; + + ret = ph->xops->xfer_get_init(ph, IMX_BBM_BUTTON_GET, 0, sizeof(u32), &t); + if (ret) + return ret; + + ret = ph->xops->do_xfer(ph, t); + if (!ret) + *state = get_unaligned_le32(t->rx.buf); + + ph->xops->xfer_put(ph, t); + + return ret; +} + +static const struct scmi_imx_bbm_proto_ops scmi_imx_bbm_proto_ops = { + .rtc_time_get = scmi_imx_bbm_rtc_time_get, + .rtc_time_set = scmi_imx_bbm_rtc_time_set, + .rtc_alarm_set = scmi_imx_bbm_rtc_alarm_set, + .button_get = scmi_imx_bbm_button_get, +}; + +static int scmi_imx_bbm_protocol_init(const struct scmi_protocol_handle *ph) +{ + u32 version; + int ret; + struct scmi_imx_bbm_info *binfo; + + ret = ph->xops->version_get(ph, &version); + if (ret) + return ret; + + dev_info(ph->dev, "NXP SM BBM Version %d.%d\n", + PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version)); + + binfo = devm_kzalloc(ph->dev, sizeof(*binfo), GFP_KERNEL); + if (!binfo) + return -ENOMEM; + + ret = scmi_imx_bbm_attributes_get(ph, binfo); + if (ret) + return ret; + + return ph->set_priv(ph, binfo, version); +} + +static const struct scmi_protocol scmi_imx_bbm = { + .id = SCMI_PROTOCOL_IMX_BBM, + .owner = THIS_MODULE, + .instance_init = &scmi_imx_bbm_protocol_init, + .ops = &scmi_imx_bbm_proto_ops, + .events = &scmi_imx_bbm_protocol_events, + .supported_version = SCMI_PROTOCOL_SUPPORTED_VERSION, + .vendor_id = "NXP", + .sub_vendor_id = "IMX", +}; +module_scmi_protocol(scmi_imx_bbm); diff --git a/include/linux/scmi_imx_protocol.h b/include/linux/scmi_imx_protocol.h new file mode 100644 index 000000000000..2df2ea0f1809 --- /dev/null +++ b/include/linux/scmi_imx_protocol.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * SCMI Message Protocol driver NXP extension header + * + * Copyright 2024 NXP. + */ + +#ifndef _LINUX_SCMI_NXP_PROTOCOL_H +#define _LINUX_SCMI_NXP_PROTOCOL_H + +#include +#include +#include +#include + +enum scmi_nxp_protocol { + SCMI_PROTOCOL_IMX_BBM = 0x81, +}; + +struct scmi_imx_bbm_proto_ops { + int (*rtc_time_set)(const struct scmi_protocol_handle *ph, u32 id, + uint64_t sec); + int (*rtc_time_get)(const struct scmi_protocol_handle *ph, u32 id, + u64 *val); + int (*rtc_alarm_set)(const struct scmi_protocol_handle *ph, u32 id, + bool enable, u64 sec); + int (*button_get)(const struct scmi_protocol_handle *ph, u32 *state); +}; + +enum scmi_nxp_notification_events { + SCMI_EVENT_IMX_BBM_RTC = 0x0, + SCMI_EVENT_IMX_BBM_BUTTON = 0x1, +}; + +struct scmi_imx_bbm_notif_report { + bool is_rtc; + bool is_button; + ktime_t timestamp; + unsigned int rtc_id; + unsigned int rtc_evt; +}; +#endif