From patchwork Wed Jul 31 12:56:06 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: 815806 Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11013004.outbound.protection.outlook.com [52.101.67.4]) (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 C1DE61AED3D; Wed, 31 Jul 2024 12:47:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.67.4 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722430050; cv=fail; b=IbhL1O7xTEJw5/I6KEHYJRXIEVHFH1QDv9fz348wmIs762lCuw84YV76P1ZEPb5KaWsLrWUB4XuZ0CklCv5zn+lFFoN/pTCrN6AIOLSNk0iTHN0dqgH+X5mtXvlKPOLHOvh/atgI9YYxpe7YtoU3qla4NkWs6D7aUCzxirZebh8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722430050; c=relaxed/simple; bh=E5LpsSI+IBisa2obdH4gzsQzu8srJbB8PmQjInA7uFI=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=lCQtG49lDxO4mD/0ld1zCpW5QwIDPXF6BPc6HgZ6gf3q5f/lBMnNvXF09kn10Q1DwBIgLqrayO0FtFuypBu1AD3nZQw8juKYISSn+t2fdMWSEYrit7YP4+7coq1JzRa0Cje5nX4cWw0lLuiBspVcDLFcJ8MLIaoqT6VppntXEn8= 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=W0Lw/TTj; arc=fail smtp.client-ip=52.101.67.4 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="W0Lw/TTj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=E1jkbrTbq3KLXZ4GgdjvTJ42ZVoiVtnHnFxItlhvtIjrL4rwTxGJ8JFsBD9jSSIfUFrMgL5p8vR6wZzvVmLger9W+1i83ZquC+D1bOQaLjjT/i7AxrKg9ftThGpuvksmAbZgIaC0fz/wDJWGxcaCGT2qptbfTmc5uNgRuWhFo8uXkqHupsRjo3YEnG89+F0r0cyGwrgtxevd8zPMsl6lHuF/ha0GOM/gvg+SHrnex0MPek0C8na2VcSNQCC4Vl3IhQSJKv4C/pa+sQ/ixkwQA8Zq4MX/61hhyUJP5N4TkNSHZRtXNIuDTeDzdFHsID6AkvyRtBVZBNdUTN9OR9Y+hg== 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=xYyPSkMS5EU6CAxGOzkZ5DFkV7AF21Pa3lieYjjw0XFDR1N4iXRoV921A17RwmRXN2nFxCtxhx89mIW89yE9RI/An/FAYnsPpY7u8I/bf5azZ3g1gOEmVNaceoNv6TMouX/s+NiG+KCmJXWhIPJaKCT/dMXMAmhy1LH4DQKmtIaMeCZe465tyLMy/aVs+h243yNRkkYHMt/Q1uXwmzuzePEcHXi6MngjVc3tpck3GPzJbM2KIfL64DwsG6okSbi8zyKcyfGLk7RozeOsjIgH/CXL+/8Gi3mK5ExsfhBnyG9s7N7kgjT8/k4ql4YI+j3yR521DND8nN7tNW3Qnia5VA== 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=9xkagEKIddeT9VSxKdk2VEbIxtLknUAa+k5fp4B5DyM=; b=W0Lw/TTjnlmhj1OD/fizwd/BSxYqDI0EsdQYU00p1YlBb2nffqHD0TxaVCmMmtpmJBtceBpimKYTmFcm5JMZ7kU242/+Zu1uxgFBs+bmauPd8veW0njvhJJV2Dcc94xIp/Pk543gc13S1j2Hhpj/ZziKpBfnsjkqDGYZSuWxqqi3vMG1L0HDOzExsWbs5ujBFYcG3MxUXx3z3OgmOoaPwkK4M9HRi9T+EguoiZ7F54/xnb0ZMxvAXRmuF+5HaGwiLwtflT7fHxOBHTPOBWlf8PxaSCDxG1RvB46IPnGwys5wG0iKXFqhxfgPmUjfcuOnD2iy/r7/gWwRYxACKsmtaA== 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 AS8PR04MB7735.eurprd04.prod.outlook.com (2603:10a6:20b:2a5::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7828.19; Wed, 31 Jul 2024 12:47:24 +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.7784.020; Wed, 31 Jul 2024 12:47:24 +0000 From: "Peng Fan (OSS)" Date: Wed, 31 Jul 2024 20:56:06 +0800 Subject: [PATCH v7 2/7] firmware: arm_scmi: add initial support for i.MX BBM protocol Message-Id: <20240731-imx95-bbm-misc-v2-v7-2-a41394365602@nxp.com> References: <20240731-imx95-bbm-misc-v2-v7-0-a41394365602@nxp.com> In-Reply-To: <20240731-imx95-bbm-misc-v2-v7-0-a41394365602@nxp.com> To: Sudeep Holla , Cristian Marussi , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Peng Fan , Alexandre Belloni , Dmitry Torokhov Cc: 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.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722430577; l=13923; i=peng.fan@nxp.com; s=20230812; h=from:subject:message-id; bh=m4/zUnBHrvUCml6LwbVFtKf2AEb1qkvpVEohGFcAPm0=; b=BfJ8kjWn3QOVxvHg2rJ68KRkDhN8OZZ539n29TBN+P6c81qHLN7IbyOZJEiwQdIB+q1sQ/YDR tdPcy22W0UNCoYCy72h9mAAjgGOzpBDVeVkz7WCqinYrMo2+lOL2LCa X-Developer-Key: i=peng.fan@nxp.com; a=ed25519; pk=I4sJg7atIT1g63H7bb5lDRGR2gJW14RKDD0wFL8TT1g= X-ClientProxiedBy: SI2PR02CA0027.apcprd02.prod.outlook.com (2603:1096:4:195::14) To PAXPR04MB8459.eurprd04.prod.outlook.com (2603:10a6:102:1da::15) Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8459:EE_|AS8PR04MB7735:EE_ X-MS-Office365-Filtering-Correlation-Id: 87039bba-ce72-4db5-6bc2-08dcb15eecf7 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|366016|52116014|7416014|376014|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?TY3kOoOPhq2y4gbzSea6j1DqRu08A4C?= =?utf-8?q?nTUMJjPqG5A4QNsOKQ8kYAiFc7+pNCp140MLCWRA4nITurk2c62HHW6SWQJf8rJoQ?= =?utf-8?q?BpM1Ux8DfLV68u9Ihye85Xz4rKTtB4uVbW5GgrBK7AUwj0YUKhFI/LT4O8XDmv6tr?= =?utf-8?q?XTXDVR9jVE3EqHGRNWFrAVGIlJvM5chS2evRZgXgTpMiLfvkVla/9p9SfIGVzljzy?= =?utf-8?q?02okmLNxqP7pnj4jjsBr5QUpRjtII3lYOtMGQe8MJHWJm05pkdnVRF7whsh4MmOj4?= =?utf-8?q?WuDefOfcJB1Cy4Pnj6R7yfI9F8bG+a3O/Os+nS+6zqE0GVUwjtdKznucUCkpPzR7U?= =?utf-8?q?j8DLV/vW9dLFK5k3V0QxRSytigZrkeC2J73IE9JMX0mUGDJ6FXvGm5pkIZpth1jz7?= =?utf-8?q?wOLwe1651uK10MUuNXPuVv7CRgNDfEjbe7UspFFbufnSOmzjSKqoSscuod3dgAuyM?= =?utf-8?q?L+sVe0KzhJF4AltpT9w07vQEXiBtNucrqnAvGXORwqwAH0SxSj30ijzyq5R9lItPM?= =?utf-8?q?HGjhg2fIm13UpKyE13oba+yhuoniKz0a6r2oI7stuQ4wG6ll0SnHJ4cpsIFJzBmWo?= =?utf-8?q?sYF1Kd0SYBZGwvpPSoA8/z2karQQoXHX5N0dz8m5EwXgCOWnXCAW22RwS6fF2JF0W?= =?utf-8?q?lVBkxwAFM/FQZZysX5hNEWFXl24R2voQGaflkiuSn1lEj+VkY5CdCzFWQ0omPB0bB?= =?utf-8?q?A/W0bbES/TY+VTVJ4iQjxbi1PxNa8G/m2/hzUdAf+TRqXi7DuBvImkhW4ofQrqMmv?= =?utf-8?q?mmnoy7hJgfFRUEGun9KmRbzZiBINdcRiXFlOfdsRdqNJhseNRXCm55dZa4Gsr3U+L?= =?utf-8?q?K8FwPNZZlpP44eOa6uC9HabumEsycRPjcKGcRxBP3tGb+VFJpNzEldVOZmGh0sUwA?= =?utf-8?q?iG3cc2RZ/tTfRIInUhZAQb8M07WLUL2isoAfSqt0Cjnl7IgQOqN0ta+uylXE8XIYu?= =?utf-8?q?kaJ1N63u6FU0HxztClX/VnMaPUIfFaN1i6W5bGc4rhinzXUlUp0aetLgp/a3p7hvS?= =?utf-8?q?J4AGEMsNBj0MJZn15Dz7l+nx7kSSjcrFH4b6ovlIlGXfqQM4lm43+B8jpSJvuhlw9?= =?utf-8?q?sfUm71SGKULZghmsLPB3z3Wbc4bFCj0VuwFxcEycCpKbMLmHxjNLJCENqeYkiDBoN?= =?utf-8?q?DygI8gRT/S+eHHHSiMGVEZ5CN5RM159vPIhOsT68AJut9itv1J55XrRKm59a7CL6A?= =?utf-8?q?A8q6u8PkKz+JkQ4zST/dxew4xvVhHyoo+AQngjHur0N1e+72aOWx3faY2uQTW+V2i?= =?utf-8?q?vNpR6qUjw5a9c4oxPPiHCMI6serQCjT1oPe/M3h9A49B9sqiWGzfu85QJEO5fu8Rm?= =?utf-8?q?IvVFg1X2S/UmAFUpMkT5LJ9XqR/x5t32D3Kk3WEhsIQYMxt7n5pAjXs=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)(366016)(52116014)(7416014)(376014)(1800799024)(38350700014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?ZwDNlBfAwyL7I+TeiM6n8ikXoKl0?= =?utf-8?q?39NZhXn8ifxFEkLNhlMsNt5oPDeAN7nQXVrgFlvWKoyoWFVW/i64QFlvY08silosO?= =?utf-8?q?s9iYCPKS6i13bKdO88aA2/Pz9tlx3Gm4YlK5VA5N8jiy+lqhkobBqWc26rt2q63Wm?= =?utf-8?q?7Oq/pPD6aV0xuZWrulQitOOFVYkvJLuTdToqZHuzixZO+3f+uyJpU4fad4sp7ueQl?= =?utf-8?q?kmRkEpevfX8o4seIFhEtuz2ieOiW30jsiRJjanT0ZpyAfIg0jEOyXupBbg2hep/eq?= =?utf-8?q?44ff4TdR5Me+lE00CREPJTlOZ/19fMnljO9z2G0fw5A3CJn4KC+sCivGb6EQMkNel?= =?utf-8?q?VmLOI8ZJHRs+MAZaIw5hK+OlmgDx+eCxgzRrupR3wCDTUdRQSZQavquWagDF4GpND?= =?utf-8?q?WvJXGO4kCugpYPdlODLMjyA0vYmKVfhnGXERZmZq+AjzpSVECiriRMAyERSZNO7mF?= =?utf-8?q?XbRxkS4ET723CzgeJDbAeIFHn+/D6NEXbOraoJs6SRhUK1DaEOF7pvfqfDNx+nghW?= =?utf-8?q?W7jupPWzd4rbO2srYMJd4Yfk32CsT+ByLKMA51gou+w310g8huihGnunCSEn8wexf?= =?utf-8?q?V+blyHyLKDffOpUr614rszOTIg/b2nWib5FInGXXvZIqAvl/pinsqZk7Y5aHoXZaJ?= =?utf-8?q?rHiQqgmJ+VclNHdtttxWZCQrvczS/AmbJ1v3AJm+17VMulNIZI0W/mcpssRfcJyjC?= =?utf-8?q?ro8GfzeS76mtsMXpxWIKGKR4CArfBrOOX+LTZ2fMPUYpDIjZ7mQmjaqis6CK2izNA?= =?utf-8?q?NbgfV00eZsmxAMyWz9S127aPuLT+THbB/dit5lLdpY+RNw1ByGzN1xlsMGkZw+rcN?= =?utf-8?q?IQH6fu6RN/Amx56L0hi2gXds3dvteZtgVkoMr6M3zepWnTkeyt3wLayR67o4Mz5pV?= =?utf-8?q?+Zb9S9TzQGWUdL7WxRm7WebEDJdewLth+Qpdi24yVB7HHwfb/2mKekDDeFwq0bFk4?= =?utf-8?q?AqBE7U5IAj79w6TsLvDTrs7RGaKuZ7E0KHBiBk7rf1+xDZKB9nJi4m3bfARhjvDOw?= =?utf-8?q?6efgVk+LnPJOaJ3Qz8LUq591aOGcNXtR9F+OeKOS4p9yLrQNdC5HjJ8qQgMC2tZu2?= =?utf-8?q?pRoVB6nVI9RkZEc4gJu0Nn7EhRsAdU3Kqpf/Rhf2n2Y42gonMJmGjx1LhEU1Jp6Eh?= =?utf-8?q?RA6K2v0PDG0DfiLn3gw0uQJBVKbpRvxVLD9N/7qjpcbm42nQnArl6vn7lsRk8eQw2?= =?utf-8?q?3kgHspNqhop1I337t1z9JKoGbCPGGe5z8V9p6OuE+MiyeRQe2CXMqJvl3hBPiQOIW?= =?utf-8?q?PdQ1Bs8/WDmKotmHFvMuXA8vvgHdBf7yyDWnzBDUqJ+16fEGjblPztJfZuOnLIO25?= =?utf-8?q?y6wdHSIkkXSP0wsYrGALjTKFBzt/YPQ/Z8cCKnXdXNssOGinTvgi28eH/Hhao8ITF?= =?utf-8?q?LTttHw1lAJjuJga1rSQhpu20eJFTND24rKVpGcxgGKXxUkFkdFw9Vu1pzIPIdSPsa?= =?utf-8?q?Hfi/q6mj9lak7U4rhXphVAXTsSFYoIS+arvGLITeTZHE1ZKk4kjZlipM5Fuz3d/GC?= =?utf-8?q?Iqg74DNoe+yf?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 87039bba-ce72-4db5-6bc2-08dcb15eecf7 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8459.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jul 2024 12:47:24.1358 (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: x54bkAuEILarcbgb5rabctjKJLDm5dLpCNDXp9bNK8OXZR+fVabA8l4WFVcViX8phrkiR+FNOL1bUXAWHZvD4g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB7735 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 From patchwork Wed Jul 31 12:56:08 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: 815805 Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11013028.outbound.protection.outlook.com [52.101.67.28]) (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 779501B1409; Wed, 31 Jul 2024 12:47:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.67.28 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722430062; cv=fail; b=G73smblPZike1s1rluvdOqZRnDEkBrrDjXLEEt1HG+0a5NLAVm8uLnPrdrZRpjNDI2QrQsajETrSKtq6uAAtJyqfolBpPUqWU6Ha4LAD/yZoH0dPLpjlVEP4OXsJzD0903mWgPi4GGS4Hbk0Od+S2hqdWpwY6PMEARVNwn7demE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722430062; c=relaxed/simple; bh=5R7x1rhj1TYPjKc6u9bHCeGcNZSKvIA3B92jHkks3vc=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=goL8+GzQRVncXpV6fS5miTRY+PaFmYkrkObojPICGDVcgKvhNOBCM+LB6WGqci9Nc8z/NHzEfi/HySDQZ7OrpMtRMJr2an3kk3QahaSJoLjtiSY+15JoRRVgsGH1Y5NFbLDCB+jbhO+qyiRLeSG9Vjk5+mwNjtEE46eyBUP+Sno= 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=kiTz3pUj; arc=fail smtp.client-ip=52.101.67.28 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="kiTz3pUj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wC56I8gEfEbsdR2ZGVHI6KQe0Zlt02dTn71S6TXUahzRSYN1X794GfAuP36ZICX3HhdU2yycvzRkrZniRkTpS80759upTid/6U3BC+tfTqG7xtTVO9e5/ucCFxUQo1WjJ7O12OPV9j7Wo0sE0io+BPqVj79qzjgxahQnEy3nXiZHrBaG9mTRwk8+5zhnR0UI+LhNTtBh4ZuDuQY7jNyKMpWxSoVX0L9Nn7odoUEfj0OxzEi90eNrB1WwKPAkrx1w8XZJYn3nXBgTcibzD9NURshkWBZZDgffrwE3jr2M8Drh9yapuefQYSLxYNDN+Nrx2IObI+RDDREur6pmHrRsbw== 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=VKqRmRGJCU2bjse9FkKJJPqPuq+AJgTGg1aQq7hRCcE=; b=vAul+An5FvcL/5Kkeu2Cdhk/HY7rf08WLReKoeHuyPprs7s7QBRz+OVzZRSwjD7oU/QeKU7ds2rNVMcu6c7sWpCu0gkGLB91+quVLaG5EX/nz9ARBEAQzDSvTiSd/MzB+Z3dDzyK9xOqz2ZeGdUj+dp9xKrTIiZheShTL0rYNNnmAlFD5FXeJhZ3XXbw4dQhWZJZW4rxp1FI2bd3d3K19dTBec3NAM3OrrSpTZx15jgMmzNmJaeQOll1z5u402IAOnzVWjKVsvMyh2Us4ck9kph0wD5gbb+RnlDprL35YLhsomcytS5iZXCgnst9U8WNJ1k3BrqzUq5gMuP2R3V+2g== 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=VKqRmRGJCU2bjse9FkKJJPqPuq+AJgTGg1aQq7hRCcE=; b=kiTz3pUjhmvYLFQuqPhVnkAKYrep2tz+gL6qfp73E6/OYIJ2C0X97h7o+73bkhIt8acWFJGrcEkS75quemhX9s+AMedtC1sm/ng1ViFiCkOOHmxYrb5v7K48IbQxZT8g4xj/ksytShazF3iJguvPlG5Y8yQUsf22ed8dQyK/uucL/v10ar/cirxr/zLxWTVLwDHg/yO72ZMcnGkPOumANA+lNfqqkJ/uDbzFNAvE0fhQ6glBzDlbIZSTNalevD4kp1VVwL4sGFVweEpio+JAOEhTgOdF4Ks4KA6u1E8vple4ojohvVvkVh0Uq5MvyKDcLiYAmynW3259bFW77hwyQA== 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 AS8PR04MB7735.eurprd04.prod.outlook.com (2603:10a6:20b:2a5::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7828.19; Wed, 31 Jul 2024 12:47:34 +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.7784.020; Wed, 31 Jul 2024 12:47:34 +0000 From: "Peng Fan (OSS)" Date: Wed, 31 Jul 2024 20:56:08 +0800 Subject: [PATCH v7 4/7] firmware: arm_scmi: add NXP i.MX95 SCMI documentation Message-Id: <20240731-imx95-bbm-misc-v2-v7-4-a41394365602@nxp.com> References: <20240731-imx95-bbm-misc-v2-v7-0-a41394365602@nxp.com> In-Reply-To: <20240731-imx95-bbm-misc-v2-v7-0-a41394365602@nxp.com> To: Sudeep Holla , Cristian Marussi , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Peng Fan , Alexandre Belloni , Dmitry Torokhov Cc: 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.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722430577; l=55298; i=peng.fan@nxp.com; s=20230812; h=from:subject:message-id; bh=awGI47uCRhda8RgNOE4cyUBLlzqkWBO1IIkfhQqujqA=; b=kWvPL8nSpqwCwK7judF9pnJqadBCYy+rs0fZpkY2MtSjBXl05EoLLtfNSBR2k6TdiIUVtFG0F /twmRmTAbwWDFP47tX+7J/sNlVayM6/SaMapsA7yxKZu2Iq7ZZu6KGc X-Developer-Key: i=peng.fan@nxp.com; a=ed25519; pk=I4sJg7atIT1g63H7bb5lDRGR2gJW14RKDD0wFL8TT1g= X-ClientProxiedBy: SI2PR02CA0027.apcprd02.prod.outlook.com (2603:1096:4:195::14) To PAXPR04MB8459.eurprd04.prod.outlook.com (2603:10a6:102:1da::15) Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8459:EE_|AS8PR04MB7735:EE_ X-MS-Office365-Filtering-Correlation-Id: 3a62a903-5cc2-4d8c-899f-08dcb15ef31d 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|366016|52116014|7416014|376014|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?dGISP83vbwfqHUXiDfqknlPSXs5EV04?= =?utf-8?q?0nX/YVYlVBcNZdjJ/i1/1MNT7y8thpuVWQiqxtF5xBJY0BqJXpip8xqyVfkcW9+Zd?= =?utf-8?q?pXMBhbEOB9ghQfVmc0lQouGnJgDLTSxMeVn6uEHK7tjBafCkQWNiX6uU2qA5PJJUY?= =?utf-8?q?lcA6izMowVNqP6fWTdrt8xNY/laZ8hDtrAw7f00bmaKK8TDJmekaalSK9o0R00lrK?= =?utf-8?q?9KjO9SeXn6qV4rAGiKW1GwY0JlizOH7EcoCrKSA/t6DxFBeHxPfQ6yhRue+ODKlXy?= =?utf-8?q?DnCD4tzAknq7dQZuA632lLH9249WRyEbTlUu2AUhKnl1fPXelw1jMj5gSF+z1Ng3Z?= =?utf-8?q?c6Z/FBwFqVWk0gQ5Hlg3/mcWLJUMRl3DEcG7V4IDxPQZIh9eKWWkt2KwRXpT7R67z?= =?utf-8?q?W3p4x2EMILIzJ2woyyMJB0TmSCpcJYEXejH0INu/r7sxW2jIyn7PZCsejXqEm0FYf?= =?utf-8?q?y6GdUe9rXcAqhOiisSMhP2QZqntx1VPA9/XLnU7928Vl3wcMBUPQncj6rdNDy7x8r?= =?utf-8?q?uTBecMBvKt9owIb88bGTQ6RDsMdU1CnDLGLBJ6RuopSaf2WoH+3qkefmba4MhFbyF?= =?utf-8?q?O3axQSIWtAHBOQdIwAOcy/eUvqu4sLYRlpnQOJuX0T4PnzkLpL9VNIZyu/5IjXW7A?= =?utf-8?q?kydEJLUnxrXzPe+KuYfqBK3NJCZEvHpS7OKyAImzFl8B0XduiH26UqassNnJZYxd+?= =?utf-8?q?nZD2t1CzCGtujdAJOvXcT6xjWD17oD/iqE2hp1Hl8DshbT6y6lwL1na20Nq4dV0ua?= =?utf-8?q?/Rrfx4pu1dadajGAOmmU4YUwaHqbd53f1Qn4fHuas1hP3l/0m/7q35Gn/YtPbT3y9?= =?utf-8?q?nnMZXePrKLy74n9WO8OUjjcOS8QdsINwl0kro3y7Nsg5wVPZlgRTlNc78GKxnkQlc?= =?utf-8?q?EGBaXgNWh+HjpLgF9oCFcZFCMDzM1BudsSi/L0skb/uL/2glT4wq6xOA1/yPjwuN/?= =?utf-8?q?Ks52EBiy0ZlrvuwPb75eZVN1gitxJeSd9uT99Embye+28M8MwpT60bndgIDrGiD9n?= =?utf-8?q?Xf1Lg/ak/Qi0FXTF5wrmNlOm9DL0CqDtvRoNFUZPP+mVQvi6RcFIdkbXilWxvfnL9?= =?utf-8?q?HaEOqPoCfjZtjYwigZ520ojRIl2MDKEHlr0BFBam3mCFzCk8jetVKei4vYefJMiAp?= =?utf-8?q?Bb1/ZRc7PIC6Ksc99/FMSJTUHN11CJrtzrwSo/bdBFBaaJI98Wfhiv50q/dlF4op4?= =?utf-8?q?wsBym/sPXV0t7kgcnNTLlKRzRPvrlkJnsf6Lcsg1+nvAgKL3qQ3pHU2tQ1t0J8VOZ?= =?utf-8?q?9qER/RLf0Y+yOTX/8Tq8byrfXTN8la5e9E07HpXNacbgIyYvHhURZSKRPfzH09Mxf?= =?utf-8?q?XwK8F7ptghfkElC62wVBoiHaqK8X/5Z1Sf5IPs3NORGfAMnYIyp2WOI=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)(366016)(52116014)(7416014)(376014)(1800799024)(38350700014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?uT0Nvlnn019N5nNYOw8/oyPfNRPg?= =?utf-8?q?uWOawsV+uVtK7PTL+0PbgSkryIbKqyfzov6DmQH7RaPoa7Fyn6En0U5Y3WJA7qTl8?= =?utf-8?q?BWcPozN+Nfwf8+eNnQubLYm4dbKVNbdHa6xYTWsMYxoRxE5y4dbhMXcef36eyEPED?= =?utf-8?q?6NIgoyrR/ZCxp3NoO63LJNmLehP6aWOOXnTQxjbjoRD9BNQZ/JaFe6k3BIFXRBnXj?= =?utf-8?q?UQ5HBBKrnIE8YGjgzmAMNuBSN/u5MIGUFLV3ytXztXK4wPcYEliydByisY7LxJtpQ?= =?utf-8?q?8MDGWbIN8Wfnl2if7a8x54wLmFV58AmrKBf6moQUzxro561E0jml44DZvlRRksEtk?= =?utf-8?q?PFAszzmKe0x8pPG0mSN8TO+eS2luTz5TaEsAYtQKEG9AK9eNeq+FA02cPiVrpOS8i?= =?utf-8?q?t++/pSG9SLetj1ECN3WJIftrcshqOG1cmoD8WYD2IoltCi7h4Ro15IVS9UZuufrMy?= =?utf-8?q?mgcEYJM/g2S86tFkVUu6LJNES+oOMmTpptNuBa4pYN8ayLDn1pKFoLTt7Sv+toML7?= =?utf-8?q?Bm5/i1dOoBkN1FtW1N88Z4NglbdV8sPhy7dquIjze/kuAncm6Wiukb0x3qZrR+bEK?= =?utf-8?q?It+ueN4TPleo3GF12BF2Y0rOpw73eLKIeZgYxP5oP5EpxmAyeyvelp52+xzomGd7P?= =?utf-8?q?AQGf68ONd8tU6CZVgOE3RG0G6KiEyIosaX6+Ih12JtrX6mh2ftxcYM+IBgxbiH7tV?= =?utf-8?q?Ez7tlk+lLNiFYAcx9D7OQDXS0t047/pLa39vArwqaOYso6FH+K2DBzGMDCZZmXvPD?= =?utf-8?q?ojvAoxuIQEPA5uqXc3XCEXSn+FlIKxKVsFd7u71FeXTWKnwAdfX1hepsl723z+LmZ?= =?utf-8?q?lbmr12SpRtOoN4PAYqDtv53gLiicMD77JvPTmEszqmXTyIimBCrtRNr2qEXBcAeDO?= =?utf-8?q?bzUDkaucaDejNU2Xwg47DSLJrEwRw30u4iWtoSyApkws/kIBZb6SvLkD8NT9WaUz9?= =?utf-8?q?rRUPwoSB0sYBYG2i3w6juWJ6ESJs6V5oP5LpQYc2TpIxUSUjoTfgKw5PxriSzsoQ7?= =?utf-8?q?aCra1n0sOWmjw1vjL5kAZgEKZHwDQreOKHrpsntp7iI9GXkaImF6a03cM+SmVVXcO?= =?utf-8?q?F/nYPJrwj8WHnzVJ9yKOprOOgKB8b4RoMeQCGuyKzqtPODQdP0mfsdvkDjlTid8yC?= =?utf-8?q?FC9GyeC93NQFv8VgPwxetGTNLpt57P6V2uM0piDA6blX0XbKP1FBM6d4t9O6S9xJJ?= =?utf-8?q?Fg0U+gNvcRFoBu5lNaP44xWW5apSLiuM6zDdhFdV+0tEjWEKeOsIHHNFAtaEcYkFC?= =?utf-8?q?FcZjZWs5jdWy0q79hrmBZ3fJOBRGTVZJBOMzkR3NwhSvsJYQknCWVBrdxcvRkqEC/?= =?utf-8?q?YzqrfVlpEryBIcojOI+FXzIafD0E7VzhD/WL8H2qGQXCSS8g/JRGVBVzmNbZ9WF5Q?= =?utf-8?q?VDYcQdNdFwS/3pcXPVz8zasCy25jxYzgTpCBUcN0ItmRWirEYPzD0Maoq7EfH37xs?= =?utf-8?q?JmNlw7wJnLM/2+imifNO2jfWPiVNRI96/WKs3aBfIkeapfudD65aV37n4CFgepZ5X?= =?utf-8?q?XhR2QoNKniPW?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3a62a903-5cc2-4d8c-899f-08dcb15ef31d X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8459.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jul 2024 12:47:34.5630 (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: H/jdPWkhgRZ4tdj8dJ3kBWjbbWhvymIdAYpwaMdZKaGKZbRKMawy5R7i1x5GxDY/0iJ9VA5HwYMOVfaNBD6YGw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB7735 From: Peng Fan Add NXP i.MX95 System Control Management Interface(SCMI) vendor extensions protocol documentation. Reviewed-by: Cristian Marussi Signed-off-by: Peng Fan --- drivers/firmware/arm_scmi/imx/imx95.rst | 886 ++++++++++++++++++++++++++++++++ 1 file changed, 886 insertions(+) diff --git a/drivers/firmware/arm_scmi/imx/imx95.rst b/drivers/firmware/arm_scmi/imx/imx95.rst new file mode 100644 index 000000000000..6a9e53c17df1 --- /dev/null +++ b/drivers/firmware/arm_scmi/imx/imx95.rst @@ -0,0 +1,886 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: + +=============================================================================== +i.MX95 System Control and Management Interface(SCMI) Vendor Protocols Extension +=============================================================================== + +:Copyright: |copy| 2024 NXP + +:Author: Peng Fan + +The System Manager (SM) is a low-level system function which runs on a System +Control Processor (SCP) to support isolation and management of power domains, +clocks, resets, sensors, pins, etc. on complex application processors. It often +runs on a Cortex-M processor and provides an abstraction to many of the +underlying features of the hardware. The primary purpose of the SM is to allow +isolation between software running on different cores in the SoC. It does this +by having exclusive access to critical resources such as those controlling +power, clocks, reset, PMIC, etc. and then providing an RPC interface to those +clients. This allows the SM to provide access control, arbitration, and +aggregation policies for those shared critical resources. + +SM introduces a concept Logic Machine(LM) which is analogous to VM and each has +its own instance of SCMI. All normal SCMI calls only apply to that LM. That +includes boot, shutdown, reset, suspend, wake, etc. Each LM (e.g. A55 and M7) +are completely isolated from the others and each LM has its own communication +channels talking to the same SCMI server. + +This document covers all the information necessary to understand, maintain, +port, and deploy the SM on supported processors. + +The SM implements an interface compliant with the Arm SCMI Specification +with additional vendor specific extensions. + +SCMI_BBM: System Control and Management BBM Vendor Protocol +============================================================== + +This protocol is intended provide access to the battery-backed module. This +contains persistent storage (GPR), an RTC, and the ON/OFF button. The protocol +can also provide access to similar functions implemented via external board +components. The BBM protocol provides functions to: + +- Describe the protocol version. +- Discover implementation attributes. +- Read/write GPR +- Discover the RTCs available in the system. +- Read/write the RTC time in seconds and ticks +- Set an alarm (per LM) in seconds +- Get notifications on RTC update, alarm, or rollover. +- Get notification on ON/OFF button activity. + +For most SoC, there is one on-chip RTC (e.g. in BBNSM) and this is RTC ID 0. +Board code can add additional GPR and RTC. + +GPR are not aggregated. The RTC time is also not aggregated. Setting these +sets for all so normally exclusive access would be granted to one agent for +each. However, RTC alarms are maintained for each LM and the hardware is +programmed with the next nearest alarm time. So only one agent in an LM should +be given access rights to set an RTC alarm. + +Commands: +_________ + +PROTOCOL_VERSION +~~~~~~~~~~~~~~~~ + +message_id: 0x0 +protocol_id: 0x81 + ++---------------+--------------------------------------------------------------+ +|Return values | ++---------------+--------------------------------------------------------------+ +|Name |Description | ++---------------+--------------------------------------------------------------+ +|int32 status | See ARM SCMI Specification for status code definitions. | ++---------------+--------------------------------------------------------------+ +|uint32 version | For this revision of the specification, this value must be | +| | 0x10000. | ++---------------+--------------------------------------------------------------+ + +PROTOCOL_ATTRIBUTES +~~~~~~~~~~~~~~~~~~~ + +message_id: 0x1 +protocol_id: 0x81 + ++---------------+--------------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status | See ARM SCMI Specification for status code definitions. | ++------------------+-----------------------------------------------------------+ +|uint32 attributes | Bits[31:8] Number of RTCs. | +| | Bits[15:0] Number of persistent storage (GPR) words. | ++------------------+-----------------------------------------------------------+ + +PROTOCOL_MESSAGE_ATTRIBUTES +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +message_id: 0x2 +protocol_id: 0x81 + ++---------------+--------------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: in case the message is implemented and available | +| |to use. | +| |NOT_FOUND: if the message identified by message_id is | +| |invalid or not implemented | ++------------------+-----------------------------------------------------------+ +|uint32 attributes |Flags that are associated with a specific function in the | +| |protocol. For all functions in this protocol, this | +| |parameter has a value of 0 | ++------------------+-----------------------------------------------------------+ + +BBM_GPR_SET +~~~~~~~~~~~ + +message_id: 0x3 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of GPR to write | ++------------------+-----------------------------------------------------------+ +|uint32 value |32-bit value to write to the GPR | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the GPR was successfully written. | +| |NOT_FOUND: if the index is not valid. | +| |DENIED: if the agent does not have permission to write | +| |the specified GPR | ++------------------+-----------------------------------------------------------+ + +BBM_GPR_GET +~~~~~~~~~~~ + +message_id: 0x4 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of GPR to read | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the GPR was successfully read. | +| |NOT_FOUND: if the index is not valid. | +| |DENIED: if the agent does not have permission to read | +| |the specified GPR. | ++------------------+-----------------------------------------------------------+ +|uint32 value |32-bit value read from the GPR | ++------------------+-----------------------------------------------------------+ + +BBM_RTC_ATTRIBUTES +~~~~~~~~~~~~~~~~~~ + +message_id: 0x5 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of RTC | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: returned the attributes. | +| |NOT_FOUND: Index is invalid. | ++------------------+-----------------------------------------------------------+ +|uint32 attributes |Bit[31:24] Bit width of RTC seconds. | +| |Bit[23:16] Bit width of RTC ticks. | +| |Bits[15:0] RTC ticks per second | ++------------------+-----------------------------------------------------------+ +|uint8 name[16] |Null-terminated ASCII string of up to 16 bytes in length | +| |describing the RTC name | ++------------------+-----------------------------------------------------------+ + +BBM_RTC_TIME_SET +~~~~~~~~~~~~~~~~ + +message_id: 0x6 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of RTC | ++------------------+-----------------------------------------------------------+ +|uint32 flags |Bits[31:1] Reserved, must be zero. | +| |Bit[0] RTC time format: | +| |Set to 1 if the time is in ticks. | +| |Set to 0 if the time is in seconds | ++------------------+-----------------------------------------------------------+ +|uint32 time[2] |Lower word: Lower 32 bits of the time in seconds/ticks. | +| |Upper word: Upper 32 bits of the time in seconds/ticks. | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: RTC time was successfully set. | +| |NOT_FOUND: rtcId pertains to a non-existent RTC. | +| |INVALID_PARAMETERS: time is not valid | +| |(beyond the range of the RTC). | +| |DENIED: the agent does not have permission to set the RTC. | ++------------------+-----------------------------------------------------------+ + +BBM_RTC_TIME_GET +~~~~~~~~~~~~~~~~ + +message_id: 0x7 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of RTC | ++------------------+-----------------------------------------------------------+ +|uint32 flags |Bits[31:1] Reserved, must be zero. | +| |Bit[0] RTC time format: | +| |Set to 1 if the time is in ticks. | +| |Set to 0 if the time is in seconds | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: RTC time was successfully get. | +| |NOT_FOUND: rtcId pertains to a non-existent RTC. | ++------------------+-----------------------------------------------------------+ +|uint32 time[2] |Lower word: Lower 32 bits of the time in seconds/ticks. | +| |Upper word: Upper 32 bits of the time in seconds/ticks. | ++------------------+-----------------------------------------------------------+ + +BBM_RTC_ALARM_SET +~~~~~~~~~~~~~~~~~ + +message_id: 0x8 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of RTC | ++------------------+-----------------------------------------------------------+ +|uint32 flags |Bits[31:1] Reserved, must be zero. | +| |Bit[0] RTC enable flag: | +| |Set to 1 if the RTC alarm should be enabled. | +| |Set to 0 if the RTC alarm should be disabled | ++------------------+-----------------------------------------------------------+ +|uint32 time[2] |Lower word: Lower 32 bits of the time in seconds. | +| |Upper word: Upper 32 bits of the time in seconds. | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: RTC time was successfully set. | +| |NOT_FOUND: rtcId pertains to a non-existent RTC. | +| |INVALID_PARAMETERS: time is not valid | +| |(beyond the range of the RTC). | +| |DENIED: the agent does not have permission to set the RTC | +| |alarm | ++------------------+-----------------------------------------------------------+ + +BBM_BUTTON_GET +~~~~~~~~~~~~~~ + +message_id: 0x9 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the button status was read. | +| |Other value: ARM SCMI Specification status code definitions| ++------------------+-----------------------------------------------------------+ +|uint32 state |State of the ON/OFF button. 1: ON, 0: OFF | ++------------------+-----------------------------------------------------------+ + +BBM_RTC_NOTIFY +~~~~~~~~~~~~~~ + +message_id: 0xA +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of RTC | ++------------------+-----------------------------------------------------------+ +|uint32 flags |Notification flags | +| |Bits[31:3] Reserved, must be zero. | +| |Bit[2] Update enable: | +| |Set to 1 to send notification. | +| |Set to 0 if no notification. | +| |Bit[1] Rollover enable: | +| |Set to 1 to send notification. | +| |Set to 0 if no notification. | +| |Bit[0] Alarm enable: | +| |Set to 1 to send notification. | +| |Set to 0 if no notification | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: notification configuration was successfully | +| |updated. | +| |NOT_FOUND: rtcId pertains to a non-existent RTC. | +| |DENIED: the agent does not have permission to request RTC | +| |notifications. | ++------------------+-----------------------------------------------------------+ + +BBM_BUTTON_NOTIFY +~~~~~~~~~~~~~~~~~ + +message_id: 0xB +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 flags |Notification flags | +| |Bits[31:1] Reserved, must be zero. | +| |Bit[0] Enable button: | +| |Set to 1 to send notification. | +| |Set to 0 if no notification | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: notification configuration was successfully | +| |updated. | +| |DENIED: the agent does not have permission to request | +| |button notifications. | ++------------------+-----------------------------------------------------------+ + +NEGOTIATE_PROTOCOL_VERSION +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +message_id: 0x10 +protocol_id: 0x81 + ++--------------------+---------------------------------------------------------+ +|Parameters | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|uint32 version |The negotiated protocol version the agent intends to use | ++--------------------+---------------------------------------------------------+ +|Return values | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|int32 status |SUCCESS: if the negotiated protocol version is supported | +| |by the platform. All commands, responses, and | +| |notifications post successful return of this command must| +| |comply with the negotiated version. | +| |NOT_SUPPORTED: if the protocol version is not supported. | ++--------------------+---------------------------------------------------------+ + +Notifications +_____________ + +BBM_RTC_EVENT +~~~~~~~~~~~~~ + +message_id: 0x0 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 flags |RTC events: | +| |Bits[31:2] Reserved, must be zero. | +| |Bit[1] RTC rollover notification: | +| |1 RTC rollover detected. | +| |0 no RTC rollover detected. | +| |Bit[0] RTC alarm notification: | +| |1 RTC alarm generated. | +| |0 no RTC alarm generated. | ++------------------+-----------------------------------------------------------+ + +BBM_BUTTON_EVENT +~~~~~~~~~~~~~~~~ + +message_id: 0x1 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 flags |RTC events: | ++------------------+-----------------------------------------------------------+ +| |Button events: | +| |Bits[31:1] Reserved, must be zero. | +| |Bit[0] Button notification: | +| |1 button change detected. | +| |0 no button change detected. | ++------------------+-----------------------------------------------------------+ + +SCMI_MISC: System Control and Management MISC Vendor Protocol +================================================================ + +Provides miscellaneous functions. This includes controls that are miscellaneous +settings/actions that must be exposed from the SM to agents. They are device +specific and are usually define to access bit fields in various mix block +control modules, IOMUX_GPR, and other GPR/CSR owned by the SM. This protocol +supports the following functions: + +- Describe the protocol version. +- Discover implementation attributes. +- Set/Get a control. +- Initiate an action on a control. +- Obtain platform (i.e. SM) build information. +- Obtain ROM passover data. +- Read boot/shutdown/reset information for the LM or the system. + +Commands: +_________ + +PROTOCOL_VERSION +~~~~~~~~~~~~~~~~ + +message_id: 0x0 +protocol_id: 0x84 + ++---------------+--------------------------------------------------------------+ +|Return values | ++---------------+--------------------------------------------------------------+ +|Name |Description | ++---------------+--------------------------------------------------------------+ +|int32 status | See ARM SCMI Specification for status code definitions. | ++---------------+--------------------------------------------------------------+ +|uint32 version | For this revision of the specification, this value must be | +| | 0x10000. | ++---------------+--------------------------------------------------------------+ + +PROTOCOL_ATTRIBUTES +~~~~~~~~~~~~~~~~~~~ + +message_id: 0x1 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status | See ARM SCMI Specification for status code definitions. | ++------------------+-----------------------------------------------------------+ +|uint32 attributes |Protocol attributes: | +| |Bits[31:24] Reserved, must be zero. | +| |Bits[23:16] Number of reset reasons. | +| |Bits[15:0] Number of controls | ++------------------+-----------------------------------------------------------+ + +PROTOCOL_MESSAGE_ATTRIBUTES +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +message_id: 0x2 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: in case the message is implemented and available | +| |to use. | +| |NOT_FOUND: if the message identified by message_id is | +| |invalid or not implemented | ++------------------+-----------------------------------------------------------+ +|uint32 attributes |Flags that are associated with a specific function in the | +| |protocol. For all functions in this protocol, this | +| |parameter has a value of 0 | ++------------------+-----------------------------------------------------------+ + +MISC_CONTROL_SET +~~~~~~~~~~~~~~~~ + +message_id: 0x3 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of the control | ++------------------+-----------------------------------------------------------+ +|uint32 num |Size of the value data in words | ++------------------+-----------------------------------------------------------+ +|uint32 val[8] |value data array | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the control was set successfully. | +| |NOT_FOUND: if the index is not valid. | +| |DENIED: if the agent does not have permission to set the | +| |control | ++------------------+-----------------------------------------------------------+ + +MISC_CONTROL_GET +~~~~~~~~~~~~~~~~ + +message_id: 0x4 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of the control | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the control was get successfully. | +| |NOT_FOUND: if the index is not valid. | +| |DENIED: if the agent does not have permission to get the | +| |control | ++------------------+-----------------------------------------------------------+ +|uint32 num |Size of the return data in words, max 8 | ++------------------+-----------------------------------------------------------+ +|uint32 | | +|val[0, num - 1] |value data array | ++------------------+-----------------------------------------------------------+ + +MISC_CONTROL_ACTION +~~~~~~~~~~~~~~~~~~~ + +message_id: 0x5 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of the control | ++------------------+-----------------------------------------------------------+ +|uint32 action |Action for the control | ++------------------+-----------------------------------------------------------+ +|uint32 numarg |Size of the argument data, max 8 | ++------------------+-----------------------------------------------------------+ +|uint32 | | +|arg[0, numarg -1] |Argument data array | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the action was set successfully. | +| |NOT_FOUND: if the index is not valid. | +| |DENIED: if the agent does not have permission to get the | +| |control | ++------------------+-----------------------------------------------------------+ +|uint32 num |Size of the return data in words, max 8 | ++------------------+-----------------------------------------------------------+ +|uint32 | | +|val[0, num - 1] |value data array | ++------------------+-----------------------------------------------------------+ + +MISC_DISCOVER_BUILD_INFO +~~~~~~~~~~~~~~~~~~~~~~~~ + +This function is used to obtain the build commit, data, time, number. + +message_id: 0x6 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the build info was got successfully. | +| |NOT_SUPPORTED: if the data is not available. | ++------------------+-----------------------------------------------------------+ +|uint32 buildnum |Build number | ++------------------+-----------------------------------------------------------+ +|uint32 buildcommit|Most significant 32 bits of the git commit hash | ++------------------+-----------------------------------------------------------+ +|uint8 date[16] |Date of build. Null terminated ASCII string of up to 16 | +| |bytes in length | ++------------------+-----------------------------------------------------------+ +|uint8 time[16] |Time of build. Null terminated ASCII string of up to 16 | +| |bytes in length | ++------------------+-----------------------------------------------------------+ + +MISC_ROM_PASSOVER_GET +~~~~~~~~~~~~~~~~~~~~~ + +ROM passover data is information exported by ROM and could be used by others. +It includes boot device, instance, type, mode and etc. This function is used +to obtain the ROM passover data. The returned block of words is structured as +defined in the ROM passover section in the SoC RM. + +message_id: 0x7 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if the data was got successfully. | +| |NOT_SUPPORTED: if the data is not available. | ++------------------+-----------------------------------------------------------+ +|uint32 num |Size of the passover data in words, max 13 | ++------------------+-----------------------------------------------------------+ +|uint32_t | | +|data[0, num - 1] |Passover data array | ++------------------+-----------------------------------------------------------+ + +MISC_CONTROL_NOTIFY +~~~~~~~~~~~~~~~~~~~ + +message_id: 0x8 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 index |Index of control | ++------------------+-----------------------------------------------------------+ +|uint32 flags |Notification flags, varies by control | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: notification configuration was successfully | +| |updated. | +| |NOT_FOUND: control id not exists. | +| |INVALID_PARAMETERS: if the input attributes flag specifies | +| |unsupported or invalid configurations.. | +| |DENIED: if the calling agent is not permitted to request | +| |the notification. | ++------------------+-----------------------------------------------------------+ + +MISC_RESET_REASON_ATTRIBUTES +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +message_id: 0x9 +protocol_id: 0x84 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 reasonid |Identifier for the reason | ++------------------+-----------------------------------------------------------+ +|Return values | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|int32 status |SUCCESS: if valid reason attributes are returned | +| |NOT_FOUND: if reasonId pertains to a non-existent reason. | ++------------------+-----------------------------------------------------------+ +|uint32 attributes |Reason attributes. This parameter has the following | +| |format: Bits[31:0] Reserved, must be zero | +| |Bits[15:0] Number of persistent storage (GPR) words. | ++------------------+-----------------------------------------------------------+ +|uint8 name[16] |Null-terminated ASCII string of up to 16 bytes in length | +| |describing the reason | ++------------------+-----------------------------------------------------------+ + +MISC_RESET_REASON_GET +~~~~~~~~~~~~~~~~~~~~~ + +message_id: 0xA +protocol_id: 0x84 + ++--------------------+---------------------------------------------------------+ +|Parameters | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|uint32 flags |Reason flags. This parameter has the following format: | +| |Bits[31:1] Reserved, must be zero. | +| |Bit[0] System: | +| |Set to 1 to return the system reason. | +| |Set to 0 to return the LM reason | ++--------------------+---------------------------------------------------------+ +|Return values | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|int32 status |SUCCESS: reset reason return | ++--------------------+---------------------------------------------------------+ +|uint32 bootflags |Boot reason flags. This parameter has the format: | +| |Bits[31] Valid. | +| |Set to 1 if the entire reason is valid. | +| |Set to 0 if the entire reason is not valid. | +| |Bits[30:29] Reserved, must be zero. | +| |Bit[28] Valid origin: | +| |Set to 1 if the origin field is valid. | +| |Set to 0 if the origin field is not valid. | +| |Bits[27:24] Origin. | +| |Bit[23] Valid err ID: | +| |Set to 1 if the error ID field is valid. | +| |Set to 0 if the error ID field is not valid. | +| |Bits[22:8] Error ID. | +| |Bit[7:0] Reason | ++--------------------+---------------------------------------------------------+ +|uint32 shutdownflags|Shutdown reason flags. This parameter has the format: | +| |Bits[31] Valid. | +| |Set to 1 if the entire reason is valid. | +| |Set to 0 if the entire reason is not valid. | +| |Bits[30:29] Number of valid extended info words. | +| |Bit[28] Valid origin: | +| |Set to 1 if the origin field is valid. | +| |Set to 0 if the origin field is not valid. | +| |Bits[27:24] Origin. | +| |Bit[23] Valid err ID: | +| |Set to 1 if the error ID field is valid. | +| |Set to 0 if the error ID field is not valid. | +| |Bits[22:8] Error ID. | +| |Bit[7:0] Reason | ++--------------------+---------------------------------------------------------+ +|uint32 extinfo[8] |Array of extended info words | ++--------------------+---------------------------------------------------------+ + +MISC_SI_INFO_GET +~~~~~~~~~~~~~~~~ + +message_id: 0xB +protocol_id: 0x84 + ++--------------------+---------------------------------------------------------+ +|Return values | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|int32 status |SUCCESS: silicon info return | ++--------------------+---------------------------------------------------------+ +|uint32 deviceid |Silicon specific device ID | ++--------------------+---------------------------------------------------------+ +|uint32 sirev |Silicon specific revision | ++--------------------+---------------------------------------------------------+ +|uint32 partnum |Silicon specific part number | ++--------------------+---------------------------------------------------------+ +|uint8 siname[16] |Silicon name/revision. Null terminated ASCII string of up| +| |to 16 bytes in length | ++--------------------+---------------------------------------------------------+ + +MISC_CFG_INFO_GET +~~~~~~~~~~~~~~~~~ + +message_id: 0xC +protocol_id: 0x84 + ++--------------------+---------------------------------------------------------+ +|Return values | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|int32 status |SUCCESS: config name return | +| |NOT_SUPPORTED: name not available | ++--------------------+---------------------------------------------------------+ +|uint32 msel |Mode selector value | ++--------------------+---------------------------------------------------------+ +|uint8 cfgname[16] |config file basename. Null terminated ASCII string of up | +| |to 16 bytes in length | ++--------------------+---------------------------------------------------------+ + +MISC_SYSLOG_GET +~~~~~~~~~~~~~~~ + +message_id: 0xD +protocol_id: 0x84 + ++--------------------+---------------------------------------------------------+ +|Parameters | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|uint32 flags |Device specific flags that might impact the data returned| +| |or clearing of the data | ++--------------------+---------------------------------------------------------+ +|uint32 logindex |Index to the first log word. Will be the first element in| +| |the return array | ++--------------------+---------------------------------------------------------+ +|Return values | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|int32 status |SUCCESS: system log return | ++--------------------+---------------------------------------------------------+ +|uint32 numLogflags |Descriptor for the log data returned by this call. | +| |Bits[31:20] Number of remaining log words. | +| |Bits[15:12] Reserved, must be zero. | +| |Bits[11:0] Number of log words that are returned by this | +| |call | ++--------------------+---------------------------------------------------------+ +|uint32 syslog[N] |Log data array, N is defined in bits[11:0] of numLogflags| ++--------------------+---------------------------------------------------------+ + +NEGOTIATE_PROTOCOL_VERSION +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +message_id: 0x10 +protocol_id: 0x84 + ++--------------------+---------------------------------------------------------+ +|Parameters | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|uint32 version |The negotiated protocol version the agent intends to use | ++--------------------+---------------------------------------------------------+ +|Return values | ++--------------------+---------------------------------------------------------+ +|Name |Description | ++--------------------+---------------------------------------------------------+ +|int32 status |SUCCESS: if the negotiated protocol version is supported | +| |by the platform. All commands, responses, and | +| |notifications post successful return of this command must| +| |comply with the negotiated version. | +| |NOT_SUPPORTED: if the protocol version is not supported. | ++--------------------+---------------------------------------------------------+ + +Notifications +_____________ + +MISC_CONTROL_EVENT +~~~~~~~~~~~~~~~~~~ + +message_id: 0x0 +protocol_id: 0x81 + ++------------------+-----------------------------------------------------------+ +|Parameters | ++------------------+-----------------------------------------------------------+ +|Name |Description | ++------------------+-----------------------------------------------------------+ +|uint32 ctrlid |Identifier for the control that caused the event. | ++------------------+-----------------------------------------------------------+ +|uint32 flags |Event flags, varies by control. | ++------------------+-----------------------------------------------------------+ From patchwork Wed Jul 31 12:56:10 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: 815804 Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11013052.outbound.protection.outlook.com [52.101.67.52]) (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 622981B3750; Wed, 31 Jul 2024 12:47:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.67.52 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722430073; cv=fail; b=N68UGi22egOYsA73RtvOtPafhjUmQb7hvUK6wouwuf92gQpbZdiIls78MClbAPD3TcGOMD8W8jUA6dSfBCxi/9N2KfDjX0m3hAkSGAJb7o3qBR0QnQuFCSaP3dpkrbqHXGwPqBVEQ2B8MM+ad0wzgBaLXiWs/pvZLRjqoOjZdgs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722430073; c=relaxed/simple; bh=lB0din7YUuASkUYMScY/zMN+DX9irTFze5qsm4nmRik=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=bb/xvKdYrtPIvcN+sDR577Gzzdw2D8GoZWusV0TyCT7nE5fN9fSoGqEnwK1qAwq72yxfQEyetdZ0oBn2fO2JV4Li+8BsOJbGRCEup0KDvPf0pmDmHBgIM4nwMZmCXqbVl/dsEn4PIcVGAte8n0FN0en/t6330yRZGIa1EFywnG8= 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=ESMrakXZ; arc=fail smtp.client-ip=52.101.67.52 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="ESMrakXZ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=g5QN5FvDphkFViJ76j7p1RvoU6sDUGIu1t36VB2WvGeEoczJAqL4UeuWs8iyFplAgP+xGYnj2o53aSIJeEYcYyUfxbRKEuVNIy0onrc5cEaQqytcRVafoNI9+w04yXN6x1KsQdce0OxlNrbsyUAMQ19mbwaWtuT+6RmcxZegQi7SZNT/XfIXiooPDAMarpWhi37yQx3knJYuV9U/sH7zcEtJnapamCDXEZkKJsjEkvLbM/HXYitghVThWqzgsW8K8TbccMoKn9UHSKTx47/eJUCqd+SK3VE705iWIricXfXj3ZG1kFAs/9eR/xSQhhIq/RvweDN8I4zNhphe97Rz0A== 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=2y1quUvokU0Up4oQp8r3/9zDfWHRyol2aqI1a4ysBr4=; b=ZtrfqBw8kV/Wb8O6w+ggYnNNOGrKBd5gv5sw+kjmFNPAutAa0GMouQFks5I31ogSUQH9afMR9W6bs5XV0vtpqAbrVt3NXitNzjjySFyK9rmc3uNQ3TUjG2Wt15zQA6DNU2tk6JGO49C6IvCsFT1n0KB1FI/DhN1RY6k6MkYyN585abSl7uCd/NZjuH6zP7PayhmpwIHhjiGi9N/H0RPwwbr4XFZAjsG5HpDAc3qlYKK3tN+kEtyguwXY01mM5fGtAGKw7gy9iSqSvAxABKscuxEWNFtWP3arohQDDbzSvv6BtQ4bT2UPihkwomUefmNOs0I0SDVh1G59f2+R4EtN+A== 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=2y1quUvokU0Up4oQp8r3/9zDfWHRyol2aqI1a4ysBr4=; b=ESMrakXZr1HMAx/OnutmfG/mJQFnC6Ya2jVuk/3Vj5UPV5xGhZix1kw5bxlJgnapVs3GmHYM9n3HlXOg3NEfNCA7gmXST+BjMttnY/Iy4GV5JEblPgNi++YilgG5FSERfgCjE9oQbC8Sp1fReSuHxQyC4CXvUZqVPxofQTHd+7M+42ezECLV6mjYCxSj8vXTJ07B39vmJ3TGWnBjgVgwT1SW4DDMvcwibYP/pINeLoiwBLpiMYsUwP7O7MU/Be3bywbamXc3KafvX1mtnSTZI167uIBoRhD9F9tW5/xCtBdtoXGw0M1vbeUbE6XMdmOIj22idwjnfapM0tZ3JBx7wg== 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 AS8PR04MB7735.eurprd04.prod.outlook.com (2603:10a6:20b:2a5::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7828.19; Wed, 31 Jul 2024 12:47:44 +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.7784.020; Wed, 31 Jul 2024 12:47:44 +0000 From: "Peng Fan (OSS)" Date: Wed, 31 Jul 2024 20:56:10 +0800 Subject: [PATCH v7 6/7] rtc: support i.MX95 BBM RTC Message-Id: <20240731-imx95-bbm-misc-v2-v7-6-a41394365602@nxp.com> References: <20240731-imx95-bbm-misc-v2-v7-0-a41394365602@nxp.com> In-Reply-To: <20240731-imx95-bbm-misc-v2-v7-0-a41394365602@nxp.com> To: Sudeep Holla , Cristian Marussi , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Peng Fan , Alexandre Belloni , Dmitry Torokhov Cc: 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.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722430577; l=6360; i=peng.fan@nxp.com; s=20230812; h=from:subject:message-id; bh=Oy5Gyoso0Y/G/kwZwRlXVgA45ZaX4xes2SzW2BSybKo=; b=LAM7679d6oIlUq8nhpfhhaN+/2UB7pSIBfwX1XVyEmiMjnmrA75iZVe3tFMOCfbba8bn/4JjS JLxlgJxtBKuBi+pEHw/AnrTQ3wBIabcyOhX/HfFbUaJ/+65M8UxhmA2 X-Developer-Key: i=peng.fan@nxp.com; a=ed25519; pk=I4sJg7atIT1g63H7bb5lDRGR2gJW14RKDD0wFL8TT1g= X-ClientProxiedBy: SI2PR02CA0027.apcprd02.prod.outlook.com (2603:1096:4:195::14) To PAXPR04MB8459.eurprd04.prod.outlook.com (2603:10a6:102:1da::15) Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8459:EE_|AS8PR04MB7735:EE_ X-MS-Office365-Filtering-Correlation-Id: ab3fe108-5eb1-4a65-17a0-08dcb15ef956 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|366016|52116014|7416014|376014|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?NDxZD34kjfYOEU+n5rVKx51pmdfD0vu?= =?utf-8?q?JkxVAXtM7wgxcmjBVWj7dvH86rEBWiR/N5OpC8cDbgrQ5FEB7nRmXQDOf0iD5iihn?= =?utf-8?q?wKmJX6IrdXE7lu46NwvvlHwHVkj7iCrI2T+/vF7kz8b2lTvlBqVBrvnl/V8jFHsiZ?= =?utf-8?q?C4odDTVvPyd4K61H+VLwbErbwsYvE4H6DhZUej1NKHELW1FbQXAiDFJEUWaBacYJp?= =?utf-8?q?tUTRqolBDMFCn/9elg0ZC+DthqByLlhxQHu2VacJL8l+aAn6ZrKVHq+jQJ7jdv2Qv?= =?utf-8?q?WsJnkH4yhWn4G4cQCQu/O+GkBEin3FR+QEdUADuRy7hD0ff534hAl9P65xEv/2h9T?= =?utf-8?q?3I14142+M0FDWIvnXDkhFpmjS9JmR0LqEPzN8P8JSXx/MHkOue3BzutDizPdqlroV?= =?utf-8?q?Xfak5hLvO+xczjL7NFcEMw8/EIIZ/VQeIg8cgBnwSLmITkFa4slBBDsihjx0YBkrM?= =?utf-8?q?2Fj0BjhMFZOvL1ptVwpEivdntC+/Z11izD4me2jHc5jmeq3TP0oBw6ii66Vf1V4qN?= =?utf-8?q?lZzGizCNXixphoL2dgFoh00AjfH0sslhK8NC/1JQI4HqBcZox5XK0MOVkvLFgzPjt?= =?utf-8?q?hnk1u1FMRhudPaL4HRhFV9tQSyW+iDzJtGHoKIF6QaZV2nLpdxTnXgHvN2lywESFT?= =?utf-8?q?IEWmqot/IcQ1Qe8H77zGxsBxPFhEkvhPdVo6KaeI8YuocbLe6iXMDAHrh0t8849Cc?= =?utf-8?q?JGeroSTJ642wsA8gOHDpkDGgJAyrB4n97g1wIM9gcf7HCgaRUWh7eSPJl51ISFzGR?= =?utf-8?q?SRpFtalr+TspZOiqlARFTW6hBAVgGvluzG5LXFu62Z1agvssLPfRsLM+kMECRKttq?= =?utf-8?q?yTdpA9/II92mvZ3eU6hDVvtEfljcon953bi/vp4cabBbTrje2RA/1GW6yBYIIgsGG?= =?utf-8?q?4L3LIL9V9nkfkOkLUArL0tp5s/633g7CvHGyWVwXTG5qROj93fOaF3DS3JKBnwUH0?= =?utf-8?q?/692jfUxzdPr/E02ycAnPyya+LY+vykoQ6P+gGYUFlYvQyiBr5rdV2f/3bfVLUiVj?= =?utf-8?q?i28hWhrW1QX2n58VHG52xu39a94uqRkf7bD95edZGF/LkbU6EOLRVJ0uulCh1GR4d?= =?utf-8?q?s4Jr/IuQMOBHILgXiOpK9yad8NzFuKxLGYqoIi+TnrCneaFSdrNK5uLFCYwfZ/StE?= =?utf-8?q?VOglqTYH47QiwfrwUwr7Yj33P0YbywkOSMSeRu5Cda6AsmaoQqzgEPR1vDoQn7l/h?= =?utf-8?q?o7b+mA8EtLpprSC6Ln7ju4dSaNOVfJ1xUovna/peBjYEzqCSiURUd95sqqrJ/rFS1?= =?utf-8?q?wdCRBMZ9MJsQG63M/pE7kzYm9WekWP99xmB9D47C8dYo+UFlLhs1ENfKYNL6uV/JI?= =?utf-8?q?Gwg6dEZIy/6V3p0RNeu3twrlIyd9t32EWraXG/NhIK3NEdtm8php1sg=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)(366016)(52116014)(7416014)(376014)(1800799024)(38350700014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?U4uppM8iuYIoVc7Hhtr9bB+TiI4i?= =?utf-8?q?1Aj5olnu+expzfNqUmFbl/BdWz9OlzP/j+MCZaUjcBVv2CVkPl6k4a1HbMaJJyVcq?= =?utf-8?q?mtQz6c8bm9Oyw08pW4nS7z0oI6XWXOmqaxH1A9NEhN7l0LgcmSvUU5zkgftNBPDVK?= =?utf-8?q?6seZc+XU/hQ6v0VUG50lF8YXL9EcOB6n+Sj3og4vMEmwyQLpiwOn2IDrBMQgeblEd?= =?utf-8?q?+XFVudUf+4g0h9n7P6UToXP8Fsl5PK5YJpa9jb0wj+dyOqXpwFAfwX1GNhAITYTut?= =?utf-8?q?PeJE+hbmOCTuIvczXWkGe9mWh1m/E5UtzMg2i/0kJM2irDwM4J/zy2FwpIvhvOW2m?= =?utf-8?q?ZD7uWqUfXPwZ8I8ydFKNTZKEnjedfyi3bFpubsElyndfcR8vj4bBJbkThIp1b7sdp?= =?utf-8?q?tubryCJSB1tjIiOtp0NQWTFUs5skpMiYvfzNZPQ+8+QoU8tMuT8l6l9DyP62bjDPi?= =?utf-8?q?IlnFjLUqTZD6Pr/9F04flLG2ka0QfYIUBBnmX9PDxFGBICPscLsAr9D7RfmhSE+Ds?= =?utf-8?q?2donRNszJ+RJ6lgZ5bII8Mcv9xEdLMN0CaqiXQVjUfb9AQnmHBU4WYtiPQ3+7obIm?= =?utf-8?q?iIKEok9f597ryEjUsSEtieHofv/PozWwEe0vr/mW4I/ngQWgRGTKthg3KCyYWwE17?= =?utf-8?q?W7EgFKzupSUa40XImPYwQZo42q26jUVqr2Fkc3ZLxdZur8k4FnQMgUudgbdW31x54?= =?utf-8?q?Uxd/x4S+TsoYrbarsUNuxaywKSWAHVvxX1ygy76qGHXud0vLj1gszd6s902hNtTew?= =?utf-8?q?zhC9RQAlRyRNo9TcS+EV8WmCnECd4hGqu3iOuMG5XU1/YZXiqNoOpPbl6/LcpDyKX?= =?utf-8?q?9XiLRR3+CBwSm53qs5UlZ3OysilEuN9yPQgKAD2u9c5Hkhth+dAi1cmJ/JwWRWmFp?= =?utf-8?q?NBfy01s9li1P44H3oGQLag9t8934gA5dpWQzsiW6qMuu8m0JlOvz8W9J7x2L6jIfg?= =?utf-8?q?TlC3y5CgdxPVi4cixoaFrY1iLXY+3l5EzQwB4cbZK49wpXVu7Xan88SUN4JlbAJvO?= =?utf-8?q?cGUPgtMZRcloszfUa23NL5y2wWsUcmfnSTXeVGbrgTERuCUfIt3hezWym26BZ/LPD?= =?utf-8?q?OfhR8D/Jr7lN2+NMfVAWa7XPcvMCHGIv0bGPTTDh5fWUhvk618Kyyv0pVGtbouOPW?= =?utf-8?q?/fnigUpqXanRTHQlRibh+IBP543npGEVQdFTURgOtvx7ZmT/GMC7hWzTBY312x4GS?= =?utf-8?q?U1q1/k/MvrIX6Sl85B9ZohorKN2fpgCEQDXw65NEA6D+kJezixmSjGf9I0o5Z6jhm?= =?utf-8?q?8xJ3sQX3peeWzqBHdpumDV3gmGMZYYlwNytb7SuFOEs3x5jIQAdnOJ+NhcvN3BuKa?= =?utf-8?q?TM8uzxzmqyN5kUAefKP83fCryteY2ppk4S2dqzLtPtTmqSAwaUkUWLcIfOLlgJMKW?= =?utf-8?q?1QHpIdlVgfOa5QD/QBNu2FdEbf722dSH/OdW8jc7Sk1V7VjHoGf6aUI2bKeumUul0?= =?utf-8?q?KfXVkUpvDtH0h7rDA5fmRby0tYjzdpPNK/t7OvsjyC7IIvzd+miFFNAgmMtC8sytc?= =?utf-8?q?OFnFq2lWYBMH?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: ab3fe108-5eb1-4a65-17a0-08dcb15ef956 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8459.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jul 2024 12:47:44.8720 (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: nMC2Lj8GM/REbjKjSZ5S8TwODRCZSPk/trjIr+IxTYLjr93WvGXw/afcj94CpVOgkhubjo7Cgl6qJ/UcPHDqIQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB7735 From: Peng Fan The BBM module provides RTC feature. To i.MX95, this module is managed by System Manager and exported System Control Management Interface(SCMI). Linux could use i.MX SCMI BBM Extension protocol to use RTC feature. This driver is to use SCMI interface to get/set RTC. Reviewed-by: Cristian Marussi Signed-off-by: Peng Fan --- drivers/rtc/Kconfig | 8 +++ drivers/rtc/Makefile | 1 + drivers/rtc/rtc-imx-sm-bbm.c | 162 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 2a95b05982ad..8122bfeba8c0 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -1827,6 +1827,14 @@ config RTC_DRV_BBNSM This driver can also be built as a module, if so, the module will be called "rtc-bbnsm". +config RTC_DRV_IMX_BBM_SCMI + depends on IMX_SCMI_BBM_EXT || COMPILE_TEST + default y if ARCH_MXC + tristate "NXP i.MX BBM SCMI RTC support" + help + If you say yes here you get support for the NXP i.MX BBSM SCMI + RTC module. + config RTC_DRV_IMX_SC depends on IMX_SCU depends on HAVE_ARM_SMCCC diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 3004e372f25f..8ee79cb18322 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -74,6 +74,7 @@ obj-$(CONFIG_RTC_DRV_HID_SENSOR_TIME) += rtc-hid-sensor-time.o obj-$(CONFIG_RTC_DRV_HYM8563) += rtc-hym8563.o obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o obj-$(CONFIG_RTC_DRV_IMX_SC) += rtc-imx-sc.o +obj-$(CONFIG_RTC_DRV_IMX_BBM_SCMI) += rtc-imx-sm-bbm.o obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o obj-$(CONFIG_RTC_DRV_ISL12026) += rtc-isl12026.o obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o diff --git a/drivers/rtc/rtc-imx-sm-bbm.c b/drivers/rtc/rtc-imx-sm-bbm.c new file mode 100644 index 000000000000..daa472be7c80 --- /dev/null +++ b/drivers/rtc/rtc-imx-sm-bbm.c @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2024 NXP. + */ + +#include +#include +#include +#include +#include +#include + +struct scmi_imx_bbm { + const struct scmi_imx_bbm_proto_ops *ops; + struct rtc_device *rtc_dev; + struct scmi_protocol_handle *ph; + struct notifier_block nb; +}; + +static int scmi_imx_bbm_read_time(struct device *dev, struct rtc_time *tm) +{ + struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev); + struct scmi_protocol_handle *ph = bbnsm->ph; + u64 val; + int ret; + + ret = bbnsm->ops->rtc_time_get(ph, 0, &val); + if (ret) + return ret; + + rtc_time64_to_tm(val, tm); + + return 0; +} + +static int scmi_imx_bbm_set_time(struct device *dev, struct rtc_time *tm) +{ + struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev); + struct scmi_protocol_handle *ph = bbnsm->ph; + u64 val; + + val = rtc_tm_to_time64(tm); + + return bbnsm->ops->rtc_time_set(ph, 0, val); +} + +static int scmi_imx_bbm_alarm_irq_enable(struct device *dev, unsigned int enable) +{ + struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev); + struct scmi_protocol_handle *ph = bbnsm->ph; + + /* scmi_imx_bbm_set_alarm enables the irq, just handle disable here */ + if (!enable) + return bbnsm->ops->rtc_alarm_set(ph, 0, false, 0); + + return 0; +} + +static int scmi_imx_bbm_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) +{ + struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev); + struct scmi_protocol_handle *ph = bbnsm->ph; + struct rtc_time *alrm_tm = &alrm->time; + u64 val; + + val = rtc_tm_to_time64(alrm_tm); + + return bbnsm->ops->rtc_alarm_set(ph, 0, true, val); +} + +static const struct rtc_class_ops smci_imx_bbm_rtc_ops = { + .read_time = scmi_imx_bbm_read_time, + .set_time = scmi_imx_bbm_set_time, + .set_alarm = scmi_imx_bbm_set_alarm, + .alarm_irq_enable = scmi_imx_bbm_alarm_irq_enable, +}; + +static int scmi_imx_bbm_rtc_notifier(struct notifier_block *nb, unsigned long event, void *data) +{ + struct scmi_imx_bbm *bbnsm = container_of(nb, struct scmi_imx_bbm, nb); + struct scmi_imx_bbm_notif_report *r = data; + + if (r->is_rtc) + rtc_update_irq(bbnsm->rtc_dev, 1, RTC_AF | RTC_IRQF); + else + pr_err("Unexpected bbm event: %s\n", __func__); + + return 0; +} + +static int scmi_imx_bbm_rtc_init(struct scmi_device *sdev) +{ + const struct scmi_handle *handle = sdev->handle; + struct device *dev = &sdev->dev; + struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev); + int ret; + + bbnsm->rtc_dev = devm_rtc_allocate_device(dev); + if (IS_ERR(bbnsm->rtc_dev)) + return PTR_ERR(bbnsm->rtc_dev); + + bbnsm->rtc_dev->ops = &smci_imx_bbm_rtc_ops; + bbnsm->rtc_dev->range_max = U32_MAX; + + bbnsm->nb.notifier_call = &scmi_imx_bbm_rtc_notifier; + ret = handle->notify_ops->devm_event_notifier_register(sdev, SCMI_PROTOCOL_IMX_BBM, + SCMI_EVENT_IMX_BBM_RTC, + NULL, &bbnsm->nb); + if (ret) + return ret; + + return devm_rtc_register_device(bbnsm->rtc_dev); +} + +static int scmi_imx_bbm_rtc_probe(struct scmi_device *sdev) +{ + const struct scmi_handle *handle = sdev->handle; + struct device *dev = &sdev->dev; + struct scmi_protocol_handle *ph; + struct scmi_imx_bbm *bbnsm; + int ret; + + if (!handle) + return -ENODEV; + + bbnsm = devm_kzalloc(dev, sizeof(*bbnsm), GFP_KERNEL); + if (!bbnsm) + return -ENOMEM; + + bbnsm->ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_IMX_BBM, &ph); + if (IS_ERR(bbnsm->ops)) + return PTR_ERR(bbnsm->ops); + + bbnsm->ph = ph; + + device_init_wakeup(dev, true); + + dev_set_drvdata(dev, bbnsm); + + ret = scmi_imx_bbm_rtc_init(sdev); + if (ret) + device_init_wakeup(dev, false); + + return ret; +} + +static const struct scmi_device_id scmi_id_table[] = { + { SCMI_PROTOCOL_IMX_BBM, "imx-bbm-rtc" }, + { }, +}; +MODULE_DEVICE_TABLE(scmi, scmi_id_table); + +static struct scmi_driver scmi_imx_bbm_rtc_driver = { + .name = "scmi-imx-bbm-rtc", + .probe = scmi_imx_bbm_rtc_probe, + .id_table = scmi_id_table, +}; +module_scmi_driver(scmi_imx_bbm_rtc_driver); + +MODULE_AUTHOR("Peng Fan "); +MODULE_DESCRIPTION("IMX SM BBM RTC driver"); +MODULE_LICENSE("GPL");