From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 EE5D13ED131; Wed, 27 May 2026 10:03:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779876182; cv=none; b=V2iJyzsNPDIzJhSrHqgdgilk110m+R/64/9i928SLb8zhIofq6H8Iaiz27GkJ7ZjLQyXTvUi6mj0sflJmpzAMA3IR54JiomBlAqzJFg8oqCmKF3zObi2uBvmN8xz633MJ5uGXKnAUpJV9356JzINJo2G6i7ifWdzcLhrYTfsmEM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779876182; c=relaxed/simple; bh=fYtaNND/Vw0C/IZmVGaFgs8+/6qQguq1ztXbb8nChgA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rU/tzLz7F78Uyjsf+i5VyqwdFEO2i5uHnTfPkfLYrXVQXi9eHhNsOUgrVefIJBr5po05Qll59zCpWqDFiSyBJYcygcltEMUUicVO4I8zQyxFJVc3BUSRWoocbGMBEm1S+WmdpEuwCkmNDCUofi2LSF67bg6kt33Zh7M37Qe4E0E= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mQysdZQy; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mQysdZQy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 739911F00A3E; Wed, 27 May 2026 10:02:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1779876180; bh=BQWTn2sfv+IWdKP7amId+9tkPRT0XJQZiYY2NFUg7kU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=mQysdZQyoUfhXaOOopCcx+N81WmIbyRlNDyzPkhtz1E425E0OAbVAecmj4SPJlsfi bK1M+EUbmLZKA6KXPOWZcGmhF92Q+J0d60NliOUH6sVHLPGsPIJg8WjZtDe3dU/0RC psFQwOIqnj/iFjpdnKJhPhyhG+800GiNK2OSgb4osGpImqStI/eak1ksTLpuwpOo4e nG6EcLvEVUkRL1UpsXlrpMYxD7aFH8zivaT7h/2Erd3feLBOvLO8ARhO/II9L2c9Bm vjMU7RZiDxdZvh+2nGnlq6UVLJnS0/ol4mnhbNgt2rjRvikEbsYiWTiQdMeTG6qzmF doW+J5QIq5TYg== From: "Aneesh Kumar K.V (Arm)" To: linux-coco@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: "Aneesh Kumar K.V (Arm)" , Catalin Marinas , Greg KH , Jeremy Linton , Jonathan Cameron , Lorenzo Pieralisi , Mark Rutland , Sudeep Holla , Will Deacon , Steven Price , Suzuki K Poulose Subject: [PATCH v6 3/4] firmware: smccc: arm-cca-guest: Bind the TSM provider to an SMCCC device Date: Wed, 27 May 2026 15:32:32 +0530 Message-ID: <20260527100233.428018-4-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260527100233.428018-1-aneesh.kumar@kernel.org> References: <20260527100233.428018-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-coco@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The Arm CCA guest TSM provider currently binds through the arm-cca-dev platform device. Like arm-smccc-trng, this device is not an independent platform resource; it is a software representation of the RSI firmware service discovered through SMCCC. Move RSI discovery into the SMCCC firmware driver. When the SMCCC conduit is SMC and the RSI ABI version check succeeds, create an arm-rsi-dev SMCCC device. Convert the Arm CCA guest TSM provider to an SMCCC driver so it binds to that discovered RSI service and keeps module autoloading through the SMCCC device id table. Keep the old arm-cca-dev platform-device registration for now. Userspace has used that device as a Realm-guest indicator, so removing it is left to a follow-up patch that adds a replacement sysfs ABI. Signed-off-by: Aneesh Kumar K.V (Arm) --- arch/arm64/include/asm/rsi.h | 2 +- arch/arm64/kernel/rsi.c | 2 +- drivers/firmware/smccc/Makefile | 4 ++ drivers/firmware/smccc/rmm.c | 25 ++++++++ drivers/firmware/smccc/rmm.h | 17 ++++++ drivers/firmware/smccc/smccc.c | 8 +++ drivers/virt/coco/arm-cca-guest/Kconfig | 1 + drivers/virt/coco/arm-cca-guest/Makefile | 2 + .../{arm-cca-guest.c => arm-cca.c} | 60 +++++++++---------- 9 files changed, 89 insertions(+), 32 deletions(-) create mode 100644 drivers/firmware/smccc/rmm.c create mode 100644 drivers/firmware/smccc/rmm.h rename drivers/virt/coco/arm-cca-guest/{arm-cca-guest.c => arm-cca.c} (85%) diff --git a/arch/arm64/include/asm/rsi.h b/arch/arm64/include/asm/rsi.h index 88b50d660e85..2d2d363aaaee 100644 --- a/arch/arm64/include/asm/rsi.h +++ b/arch/arm64/include/asm/rsi.h @@ -10,7 +10,7 @@ #include #include -#define RSI_PDEV_NAME "arm-cca-dev" +#define RSI_DEV_NAME "arm-rsi-dev" DECLARE_STATIC_KEY_FALSE(rsi_present); diff --git a/arch/arm64/kernel/rsi.c b/arch/arm64/kernel/rsi.c index 92160f2e57ff..da440f71bb64 100644 --- a/arch/arm64/kernel/rsi.c +++ b/arch/arm64/kernel/rsi.c @@ -161,7 +161,7 @@ void __init arm64_rsi_init(void) } static struct platform_device rsi_dev = { - .name = RSI_PDEV_NAME, + .name = "arm-cca-dev", .id = PLATFORM_DEVID_NONE }; diff --git a/drivers/firmware/smccc/Makefile b/drivers/firmware/smccc/Makefile index 40d19144a860..33c850aaff4d 100644 --- a/drivers/firmware/smccc/Makefile +++ b/drivers/firmware/smccc/Makefile @@ -2,3 +2,7 @@ # obj-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) += smccc.o kvm_guest.o obj-$(CONFIG_ARM_SMCCC_SOC_ID) += soc_id.o + +ifeq ($(CONFIG_HAVE_ARM_SMCCC_DISCOVERY),y) +obj-$(CONFIG_ARM64) += rmm.o +endif diff --git a/drivers/firmware/smccc/rmm.c b/drivers/firmware/smccc/rmm.c new file mode 100644 index 000000000000..d572f47e955c --- /dev/null +++ b/drivers/firmware/smccc/rmm.c @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2026 Arm Limited + */ + +#include +#include +#include + +#include "rmm.h" + +void __init register_rsi_device(void) +{ + unsigned long ret; + + if (arm_smccc_1_1_get_conduit() != SMCCC_CONDUIT_SMC) + return; + + ret = rsi_request_version(RSI_ABI_VERSION, NULL, NULL); + if (ret != RSI_SUCCESS) + return; + + if (IS_ERR(arm_smccc_device_register(RSI_DEV_NAME))) + pr_err("%s: could not register device\n", RSI_DEV_NAME); +} diff --git a/drivers/firmware/smccc/rmm.h b/drivers/firmware/smccc/rmm.h new file mode 100644 index 000000000000..627098e2ae1f --- /dev/null +++ b/drivers/firmware/smccc/rmm.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _SMCCC_RMM_H +#define _SMCCC_RMM_H + +#include + +#ifdef CONFIG_ARM64 +#include +#include +void __init register_rsi_device(void); +#else + +static inline void __init register_rsi_device(void) +{ +} +#endif +#endif diff --git a/drivers/firmware/smccc/smccc.c b/drivers/firmware/smccc/smccc.c index 6d260354d0f9..888e7f1d6f86 100644 --- a/drivers/firmware/smccc/smccc.c +++ b/drivers/firmware/smccc/smccc.c @@ -15,6 +15,8 @@ #include +#include "rmm.h" + static u32 smccc_version = ARM_SMCCC_VERSION_1_0; static enum arm_smccc_conduit smccc_conduit = SMCCC_CONDUIT_NONE; static DEFINE_IDA(arm_smccc_bus_id); @@ -240,6 +242,12 @@ subsys_initcall(arm_smccc_bus_init); static int __init smccc_devices_init(void) { + /* + * Register the RMI and RSI devices only when firmware exposes + * the required SMCCC function IDs at a supported revision. + */ + register_rsi_device(); + if (smccc_trng_available) { struct arm_smccc_device *sdev; diff --git a/drivers/virt/coco/arm-cca-guest/Kconfig b/drivers/virt/coco/arm-cca-guest/Kconfig index 3f0f013f03f1..ad7538750c5a 100644 --- a/drivers/virt/coco/arm-cca-guest/Kconfig +++ b/drivers/virt/coco/arm-cca-guest/Kconfig @@ -1,6 +1,7 @@ config ARM_CCA_GUEST tristate "Arm CCA Guest driver" depends on ARM64 + depends on HAVE_ARM_SMCCC_DISCOVERY select TSM_REPORTS help The driver provides userspace interface to request and diff --git a/drivers/virt/coco/arm-cca-guest/Makefile b/drivers/virt/coco/arm-cca-guest/Makefile index 69eeba08e98a..75a120e24fda 100644 --- a/drivers/virt/coco/arm-cca-guest/Makefile +++ b/drivers/virt/coco/arm-cca-guest/Makefile @@ -1,2 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_ARM_CCA_GUEST) += arm-cca-guest.o + +arm-cca-guest-y += arm-cca.o diff --git a/drivers/virt/coco/arm-cca-guest/arm-cca-guest.c b/drivers/virt/coco/arm-cca-guest/arm-cca.c similarity index 85% rename from drivers/virt/coco/arm-cca-guest/arm-cca-guest.c rename to drivers/virt/coco/arm-cca-guest/arm-cca.c index 66d00b6ceb78..8d5a09bd772a 100644 --- a/drivers/virt/coco/arm-cca-guest/arm-cca-guest.c +++ b/drivers/virt/coco/arm-cca-guest/arm-cca.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -182,52 +183,51 @@ static int arm_cca_report_new(struct tsm_report *report, void *data) return ret; } -static const struct tsm_report_ops arm_cca_tsm_ops = { +static const struct tsm_report_ops arm_cca_tsm_report_ops = { .name = KBUILD_MODNAME, .report_new = arm_cca_report_new, }; -/** - * arm_cca_guest_init - Register with the Trusted Security Module (TSM) - * interface. - * - * Return: - * * %0 - Registered successfully with the TSM interface. - * * %-ENODEV - The execution context is not an Arm Realm. - * * %-EBUSY - Already registered. - */ -static int __init arm_cca_guest_init(void) +static void unregister_cca_tsm_report(void *data) +{ + tsm_report_unregister(&arm_cca_tsm_report_ops); +} + +static int cca_tsm_probe(struct arm_smccc_device *sdev) { int ret; if (!is_realm_world()) return -ENODEV; - ret = tsm_report_register(&arm_cca_tsm_ops, NULL); - if (ret < 0) - pr_err("Error %d registering with TSM\n", ret); + ret = tsm_report_register(&arm_cca_tsm_report_ops, NULL); + if (ret < 0) { + dev_err_probe(&sdev->dev, ret, "Error registering with TSM\n"); + return ret; + } - return ret; -} -module_init(arm_cca_guest_init); + ret = devm_add_action_or_reset(&sdev->dev, unregister_cca_tsm_report, + NULL); + if (ret < 0) { + dev_err_probe(&sdev->dev, ret, "Error registering devm action\n"); + return ret; + } -/** - * arm_cca_guest_exit - unregister with the Trusted Security Module (TSM) - * interface. - */ -static void __exit arm_cca_guest_exit(void) -{ - tsm_report_unregister(&arm_cca_tsm_ops); + return 0; } -module_exit(arm_cca_guest_exit); -/* modalias, so userspace can autoload this module when RSI is available */ -static const struct platform_device_id arm_cca_match[] __maybe_unused = { - { RSI_PDEV_NAME, 0}, - { } +static const struct arm_smccc_device_id cca_tsm_id_table[] = { + { .name = RSI_DEV_NAME }, + {} }; +MODULE_DEVICE_TABLE(arm_smccc, cca_tsm_id_table); -MODULE_DEVICE_TABLE(platform, arm_cca_match); +static struct arm_smccc_driver cca_tsm_driver = { + .name = KBUILD_MODNAME, + .probe = cca_tsm_probe, + .id_table = cca_tsm_id_table, +}; +module_arm_smccc_driver(cca_tsm_driver); MODULE_AUTHOR("Sami Mujawar "); MODULE_DESCRIPTION("Arm CCA Guest TSM Driver"); MODULE_LICENSE("GPL"); -- 2.43.0