firmware: smccc: coco: Manage arm-smccc platform device and CCA auxiliary drivers
Subsystems (2)
PATCH v3 1/2 firmware: smccc: coco: Manage arm-smccc platform device and CCA auxiliary drivers
Make the SMCCC driver responsible for registering the arm-smccc platform device and after confirming the relevant SMCCC function IDs, create the arm_cca_guest auxiliary device.
Also update the arm-cca-guest driver to use the auxiliary device interface instead of the platform device (arm-cca-dev). The removal of the platform device registration will follow in a subsequent patch, allowing this change to be applied without immediately breaking existing userspace dependencies [1].
[1] https://lore.kernel.org/all/[email protected]
---
arch/arm64/include/asm/rsi.h | 2 +-
arch/arm64/kernel/rsi.c | 2 +-
drivers/firmware/smccc/Kconfig | 1 +
drivers/firmware/smccc/Makefile | 1 +
drivers/firmware/smccc/rmm.c | 25 ++++++++
drivers/firmware/smccc/rmm.h | 17 ++++++
drivers/firmware/smccc/smccc.c | 14 +++++
drivers/virt/coco/arm-cca-guest/Kconfig | 1 +
drivers/virt/coco/arm-cca-guest/Makefile | 2 +
.../{arm-cca-guest.c => arm-cca.c} | 59 +++++++++----------
10 files changed, 92 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} (84%)arch/arm64/include/asm/rsi.h +1 -1
@@ -10,7 +10,7 @@#include <linux/jump_label.h> #include <asm/rsi_cmds.h> -#define RSI_PDEV_NAME "arm-cca-dev" +#define RSI_DEV_NAME "arm-rsi-dev"DECLARE_STATIC_KEY_FALSE (rsi_present);
arch/arm64/kernel/rsi.c +1 -1
@@ -160,7 +160,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 };
drivers/firmware/smccc/Kconfig +1 -0
@@ -8,6 +8,7 @@ config HAVE_ARM_SMCCC config HAVE_ARM_SMCCC_DISCOVERY bool depends on ARM_PSCI_FW + select AUXILIARY_BUS default y help SMCCC v1.0 lacked discoverability and hence PSCI v1.0 was updated
drivers/firmware/smccc/Makefile +1 -0
@@ -2,3 +2,4 @@ # obj-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) += smccc.o kvm_guest.o obj-$(CONFIG_ARM_SMCCC_SOC_ID) += soc_id.o +obj-$(CONFIG_ARM64) += rmm.o
drivers/firmware/smccc/rmm.c new file +25 -0
@@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +* Copyright (C) 2026 Arm Limited +*/ + +#define pr_fmt (fmt) "smccc: " fmt + +#include <linux/auxiliary_bus.h> +#include "rmm.h" + +void __init register_rsi_device (struct platform_device *pdev) +{ +unsigned long ret; +unsigned long ver_lower, ver_higher; + +if (arm_smccc_1_1_get_conduit () !=SMCCC_CONDUIT_SMC ) +return ; + + ret =rsi_request_version (RSI_ABI_VERSION , &ver_lower, &ver_higher); +if (ret !=RSI_SUCCESS ) +return ; + +__devm_auxiliary_device_create (&pdev->dev, +"arm_cca_guest" ,RSI_DEV_NAME ,NULL ,0 ); +}
drivers/firmware/smccc/rmm.h new file +17 -0
@@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _SMCCC_RMM_H +#define _SMCCC_RMM_H + +#include <linux/platform_device.h> + +#ifdef CONFIG_ARM64 +#include <asm/rsi_cmds.h> +void __init register_rsi_device (struct platform_device *pdev); +#else + +static void __init register_rsi_device (struct platform_device *pdev) +{ + +} +#endif +#endif
drivers/firmware/smccc/smccc.c +14 -0
@@ -12,6 +12,8 @@#include <linux/platform_device.h> #include <asm/archrandom.h> +#include "rmm.h" +static u32 smccc_version =ARM_SMCCC_VERSION_1_0 ;static enum arm_smccc_conduit smccc_conduit =SMCCC_CONDUIT_NONE ;
@@ -85,6 +87,18 @@ static int __init smccc_devices_init(void) {struct platform_device *pdev; + pdev =platform_device_register_simple ("arm-smccc" , +PLATFORM_DEVID_NONE ,NULL ,0 ); +if (IS_ERR (pdev)) { +pr_err ("arm-smccc: could not register device: %ld\n" ,PTR_ERR (pdev)); + }else { +/* +* Register the RMI and RSI devices only when firmware exposes +* the required SMCCC function IDs at a supported revision. +*/ +register_rsi_device (pdev); + } +if (smccc_trng_available) { pdev =platform_device_register_simple ("smccc_trng" ,-1 ,NULL ,0 );
drivers/virt/coco/arm-cca-guest/Kconfig +1 -0
@@ -2,6 +2,7 @@ config ARM_CCA_GUEST tristate "Arm CCA Guest driver" depends on ARM64 select TSM_REPORTS + select AUXILIARY_BUS help The driver provides userspace interface to request and attestation report from the Realm Management Monitor(RMM).
drivers/virt/coco/arm-cca-guest/Makefile +2 -0
@@ -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
drivers/virt/coco/arm-cca-guest/arm-cca.c renamed from drivers/virt/coco/arm-cca-guest/arm-cca-guest.c +29 -30
87 lines not on this page · raw message
Signature · 1 line
2.43.0
PATCH v3 2/2 coco: guest: arm64: Drop dummy RSI platform device stub
The SMCCC firmware driver now creates the arm-smccc platform device and also creates the CCA auxiliary devices once the RSI ABI is discovered. This makes the arch-specific arm64_create_dummy_rsi_dev() helper redundant. Remove the arm-cca-dev platform device registration and let the SMCCC probe manage the RSI device.
systemd match on platform:arm-cca-dev for confidential vm detection [1]. Losing the platform device registration can break that. Keeping this removal in its own change makes it easy to revert if that regression blocks the rollout.
[1] https://lore.kernel.org/all/[email protected]
--- arch/arm64/kernel/rsi.c | 15 --------------- 1 file changed, 15 deletions(-)
arch/arm64/kernel/rsi.c +0 -15
@@ -158,18 +158,3 @@ void __init arm64_rsi_init(void)static_branch_enable (&rsi_present); } - -static struct platform_device rsi_dev = { - .name ="arm-cca-dev" , - .id =PLATFORM_DEVID_NONE -}; - -static int __init arm64_create_dummy_rsi_dev (void ) -{ -if (is_realm_world () && -platform_device_register (&rsi_dev)) -pr_err ("failed to register rsi platform device\n" ); -return 0 ; -} - -arch_initcall (arm64_create_dummy_rsi_dev)
Signature · 1 line
2.43.0
Quoted 91 lines · Aneesh Kumar K.V (Arm)
Make the SMCCC driver responsible for registering the arm-smccc platform device and after confirming the relevant SMCCC function IDs, create the
arm_cca_guestauxiliary device.Also update the arm-cca-guest driver to use the auxiliary device interface instead of the platform device (arm-cca-dev). The removal of the platform device registration will follow in a subsequent patch, allowing this change to be applied without immediately breaking existing userspace dependencies [1].
[1] https://lore.kernel.org/all/[email protected]
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Jeremy Linton <[email protected]>Cc Greg KH <[email protected]>Cc Mark Rutland <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Sudeep Holla <[email protected]>Cc Jonathan Cameron <[email protected]>Signed-off-by Aneesh Kumar K.V (Arm) <[email protected]>--- arch/arm64/include/asm/rsi.h | 2 +- arch/arm64/kernel/rsi.c | 2 +- drivers/firmware/smccc/Kconfig | 1 + drivers/firmware/smccc/Makefile | 1 + drivers/firmware/smccc/rmm.c | 25 ++++++++ drivers/firmware/smccc/rmm.h | 17 ++++++ drivers/firmware/smccc/smccc.c | 14 +++++ drivers/virt/coco/arm-cca-guest/Kconfig | 1 + drivers/virt/coco/arm-cca-guest/Makefile | 2 + .../{arm-cca-guest.c => arm-cca.c} | 59 +++++++++---------- 10 files changed, 92 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} (84%)arch/arm64/include/asm/rsi.h +1
-1@@ -10,7 +10,7 @@#include <linux/jump_label.h> #include <asm/rsi_cmds.h> -#define RSI_PDEV_NAME "arm-cca-dev" +#define RSI_DEV_NAME "arm-rsi-dev"DECLARE_STATIC_KEY_FALSE (rsi_present);arch/arm64/kernel/rsi.c +1
-1@@ -160,7 +160,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 };drivers/firmware/smccc/Kconfig +1
-0@@ -8,6 +8,7 @@ config HAVE_ARM_SMCCC config HAVE_ARM_SMCCC_DISCOVERY bool depends on ARM_PSCI_FW + select AUXILIARY_BUS default y help SMCCC v1.0 lacked discoverability and hence PSCI v1.0 was updateddrivers/firmware/smccc/Makefile +1
-0@@ -2,3 +2,4 @@ # obj-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) += smccc.o kvm_guest.o obj-$(CONFIG_ARM_SMCCC_SOC_ID) += soc_id.o +obj-$(CONFIG_ARM64) += rmm.odrivers/firmware/smccc/rmm.c new file +0
-0
drivers/firmware/smccc/rmm.c line 6
Quoted 6 lines
drivers/firmware/smccc/rmm.c new file +6
-0@@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +* Copyright (C) 2026 Arm Limited +*/ + +#define pr_fmt (fmt) "smccc: " fmt
No need for this define as you never use it in this file.
thanks,
greg k-h
v3 cover Switch Arm CCA to use an auxiliary device from a platform device
In reply to Aneesh Kumar K.V (Arm)As discussed here:
https://lore.kernel.org/all/[email protected]
The generic feedback was that a platform device should not be used when there is no underlying platform resource to represent. The existing CCA support uses a platform device solely to anchor the TSM interface in the device hierarchy, which is not an appropriate use of a platform device. Instead, introduce an auxiliary device to track CCA support.
The TSM framework uses the device abstraction to provide cross-architecture TSM and TEE I/O functionality, including:
Enumerating available platform TEE I/O capabilities Provisioning connections between the platform TSM and device DSM
For the CCA platform, the resulting device hierarchy appears as follows:
# cd /sys/class/tsm/ # ls -al total 0 drwxr-xr-x 2 root root 0 Jan 1 00:01 . drwxr-xr-x 23 root root 0 Jan 1 00:00 .. lrwxrwxrwx 1 root root 0 Jan 1 00:01 tsm0 -> ../../devices/platform/arm-smccc/arm_cca_host.arm-rmi-dev.0/tsm/tsm0
-aneesh