From nobody Sat Oct 3 04:23:40 2026 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 69B932EA732; Wed, 5 Aug 2026 06:33:24 +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=1785911605; cv=none; b=RvLZ3e9rb5ChQG651Jhad103GJvLvwfGxnSdBQk0DOWo6b8cxg3QGa3+XqmJxbegsJodJGfNJU6iUwT10nOjQLdV4XAFR5CDwvwVa4PepvndRhnfVFpV1IpnYXPItqc07G73Xh1F91JywDFCJRHWVgrf8YaDv1gOe7rAo6EgGdM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785911605; c=relaxed/simple; bh=JPgut0gqqM34j0FuL0r0czPrcxI0m3sIy4mRW5t/ITg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ifu2433NSRg7nKU5HYdQHNnK5Ek8rjn+yzjE54Nkd/N6torVYxdvnxR5I7bQoW6qW9X0FaLl0WcJhGjeMyd3r7AgQDxRdVwoQHsc+fAVU8f7YeqVktrrmAcLcaD17zQZCo3MtTKc6rmds75quUhTXGhRz9gPNXvlmCdJDnRxyJI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=I2D1DW9f; 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="I2D1DW9f" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A98B31F00A3A; Wed, 5 Aug 2026 06:33:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785911604; bh=JWRbVXSQALec+f/BABIBhOWEArXPPBxV0mZaTH3fyCU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=I2D1DW9fwn1g+veUz06iDIk4Y6InWEny+BtyQAXxPzkDo8Hu3m1s1fg3ccza2N6az u3yJeQGD4eS3rYbcVL+lGNYKl1DKm0NT445ZSkU/eyA84oCvPypTIDvfLgEJvIxUh7 ccaxMmGoLw5/yDAngSeym8Ahb4UE5lBiTJbVRruLr77ahEO+2CIB7SCfTf00qIRNoX RXNQYTdY/WTsUTm0IhK4O0w14T5SPD5ekjTM+HINRkTD/afqvzlsI2GGakb6z1JWLc aR7JuHOzx2yjr3adpZRkdxi83lIBF9qzS/woLrBfs6JIKdO0U9lrTYtbyo2uzsq73C 5IToRkiyk5z4A== 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 , Andre Przywara , Sudeep Holla Subject: [PATCH v9 1/7] firmware: smccc: Add an Arm SMCCC bus Date: Wed, 5 Aug 2026 12:02:49 +0530 Message-ID: <20260805063255.1638614-2-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260805063255.1638614-1-aneesh.kumar@kernel.org> References: <20260805063255.1638614-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" SMCCC-discovered firmware services are currently represented by separate platform devices, such as smccc_trng and arm-cca-dev. Those devices do not represent independent DT/ACPI-described platform resources; they are features of the SMCCC firmware interface. Add an Arm SMCCC bus for services discovered through the SMCCC firmware interface. The bus provides SMCCC device and driver registration helpers, name-based matching, modalias generation, and a sysfs modalias attribute so SMCCC service drivers can bind to discovered firmware services and autoload as modules. Follow-up changes can then register SMCCC firmware services as arm-smccc devices instead of creating independent per-feature platform devices. Based on arm_ffa code Reviewed-by: Sudeep Holla Signed-off-by: Aneesh Kumar K.V (Arm) --- drivers/firmware/smccc/Makefile | 2 +- drivers/firmware/smccc/bus.c | 166 ++++++++++++++++++++++++++++ include/linux/arm-smccc-bus.h | 49 ++++++++ include/linux/device-id/arm_smccc.h | 16 +++ include/linux/mod_devicetable.h | 1 + scripts/mod/devicetable-offsets.c | 3 + scripts/mod/file2alias.c | 8 ++ 7 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 drivers/firmware/smccc/bus.c create mode 100644 include/linux/arm-smccc-bus.h create mode 100644 include/linux/device-id/arm_smccc.h diff --git a/drivers/firmware/smccc/Makefile b/drivers/firmware/smccc/Makef= ile index 40d19144a860..68bbff1407b8 100644 --- a/drivers/firmware/smccc/Makefile +++ b/drivers/firmware/smccc/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 # -obj-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) +=3D smccc.o kvm_guest.o +obj-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) +=3D bus.o smccc.o kvm_guest.o obj-$(CONFIG_ARM_SMCCC_SOC_ID) +=3D soc_id.o diff --git a/drivers/firmware/smccc/bus.c b/drivers/firmware/smccc/bus.c new file mode 100644 index 000000000000..3147f5c58453 --- /dev/null +++ b/drivers/firmware/smccc/bus.c @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2026 Arm Limited + */ + +#include +#include +#include + +static DEFINE_IDA(arm_smccc_bus_id); + +static int arm_smccc_bus_match(struct device *dev, + const struct device_driver *drv) +{ + const struct arm_smccc_device_id *id_table; + struct arm_smccc_device *smccc_dev =3D to_arm_smccc_device(dev); + + id_table =3D to_arm_smccc_driver(drv)->id_table; + if (!id_table) + return 0; + + while (id_table->name[0]) { + if (!strcmp(smccc_dev->name, id_table->name)) + return 1; + id_table++; + } + + return 0; +} + +static int arm_smccc_bus_probe(struct device *dev) +{ + struct arm_smccc_driver *smccc_drv =3D to_arm_smccc_driver(dev->driver); + + return smccc_drv->probe(to_arm_smccc_device(dev)); +} + +static void arm_smccc_bus_remove(struct device *dev) +{ + struct arm_smccc_driver *smcc_drv =3D to_arm_smccc_driver(dev->driver); + + if (smcc_drv->remove) + smcc_drv->remove(to_arm_smccc_device(dev)); +} + +static int arm_smccc_bus_uevent(const struct device *dev, + struct kobj_uevent_env *env) +{ + const struct arm_smccc_device *smccc_dev =3D to_arm_smccc_device(dev); + + return add_uevent_var(env, "MODALIAS=3D" ARM_SMCCC_MODULE_PREFIX "%s", + smccc_dev->name); +} + +static ssize_t modalias_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct arm_smccc_device *smccc_dev =3D to_arm_smccc_device(dev); + + return sysfs_emit(buf, ARM_SMCCC_MODULE_PREFIX "%s\n", smccc_dev->name); +} +static DEVICE_ATTR_RO(modalias); + +static struct attribute *arm_smccc_device_attrs[] =3D { + &dev_attr_modalias.attr, + NULL, +}; +ATTRIBUTE_GROUPS(arm_smccc_device); + +const struct bus_type arm_smccc_bus_type =3D { + .name =3D "arm_smccc", + .match =3D arm_smccc_bus_match, + .probe =3D arm_smccc_bus_probe, + .remove =3D arm_smccc_bus_remove, + .uevent =3D arm_smccc_bus_uevent, + .dev_groups =3D arm_smccc_device_groups, +}; +EXPORT_SYMBOL_GPL(arm_smccc_bus_type); + +int arm_smccc_driver_register(struct arm_smccc_driver *driver, + struct module *owner, const char *mod_name) +{ + if (!driver->probe || !driver->id_table) + return -EINVAL; + + driver->driver.bus =3D &arm_smccc_bus_type; + driver->driver.name =3D driver->name; + driver->driver.owner =3D owner; + driver->driver.mod_name =3D mod_name; + + return driver_register(&driver->driver); +} +EXPORT_SYMBOL_GPL(arm_smccc_driver_register); + +void arm_smccc_driver_unregister(struct arm_smccc_driver *driver) +{ + driver_unregister(&driver->driver); +} +EXPORT_SYMBOL_GPL(arm_smccc_driver_unregister); + +static void arm_smccc_release_device(struct device *dev) +{ + struct arm_smccc_device *smccc_dev =3D to_arm_smccc_device(dev); + + ida_free(&arm_smccc_bus_id, smccc_dev->id); + kfree(smccc_dev); +} + +struct arm_smccc_device *arm_smccc_device_register(const char *name) +{ + int id, ret; + struct arm_smccc_device *smccc_dev; + + if (!name) + return ERR_PTR(-EINVAL); + + id =3D ida_alloc_min(&arm_smccc_bus_id, 1, GFP_KERNEL); + if (id < 0) + return ERR_PTR(id); + + smccc_dev =3D kzalloc_obj(*smccc_dev); + if (!smccc_dev) { + ida_free(&arm_smccc_bus_id, id); + return ERR_PTR(-ENOMEM); + } + + smccc_dev->id =3D id; + if (strscpy(smccc_dev->name, name) < 0) { + kfree(smccc_dev); + ida_free(&arm_smccc_bus_id, id); + return ERR_PTR(-EINVAL); + } + smccc_dev->dev.bus =3D &arm_smccc_bus_type; + smccc_dev->dev.release =3D arm_smccc_release_device; + + ret =3D dev_set_name(&smccc_dev->dev, "%s-%d", smccc_dev->name, id); + if (ret) { + kfree(smccc_dev); + ida_free(&arm_smccc_bus_id, id); + return ERR_PTR(ret); + } + + ret =3D device_register(&smccc_dev->dev); + if (ret) { + put_device(&smccc_dev->dev); + return ERR_PTR(ret); + } + + return smccc_dev; +} +EXPORT_SYMBOL_GPL(arm_smccc_device_register); + +void arm_smccc_device_unregister(struct arm_smccc_device *smccc_dev) +{ + if (!smccc_dev) + return; + + device_unregister(&smccc_dev->dev); +} +EXPORT_SYMBOL_GPL(arm_smccc_device_unregister); + +static int __init arm_smccc_bus_init(void) +{ + return bus_register(&arm_smccc_bus_type); +} +subsys_initcall(arm_smccc_bus_init); diff --git a/include/linux/arm-smccc-bus.h b/include/linux/arm-smccc-bus.h new file mode 100644 index 000000000000..2a08868507d1 --- /dev/null +++ b/include/linux/arm-smccc-bus.h @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2026 Arm Limited + */ +#ifndef __LINUX_ARM_SMCCC_BUS_H +#define __LINUX_ARM_SMCCC_BUS_H + +#include +#include +#include + +struct arm_smccc_device { + int id; + char name[ARM_SMCCC_NAME_SIZE]; + struct device dev; +}; + +#define to_arm_smccc_device(d) container_of(d, struct arm_smccc_device, de= v) + +struct arm_smccc_driver { + const char *name; + int (*probe)(struct arm_smccc_device *sdev); + void (*remove)(struct arm_smccc_device *sdev); + const struct arm_smccc_device_id *id_table; + + struct device_driver driver; +}; + +#define to_arm_smccc_driver(d) \ + container_of_const(d, struct arm_smccc_driver, driver) + +int arm_smccc_driver_register(struct arm_smccc_driver *driver, + struct module *owner, const char *mod_name); +void arm_smccc_driver_unregister(struct arm_smccc_driver *driver); +struct arm_smccc_device *arm_smccc_device_register(const char *name); +void arm_smccc_device_unregister(struct arm_smccc_device *smcc_dev); + +#define arm_smccc_register(driver) \ + arm_smccc_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) +#define arm_smccc_unregister(driver) \ + arm_smccc_driver_unregister(driver) + +#define module_arm_smccc_driver(__arm_smccc_driver) \ + module_driver(__arm_smccc_driver, arm_smccc_register, \ + arm_smccc_unregister) + +extern const struct bus_type arm_smccc_bus_type; + +#endif /* __LINUX_ARM_SMCCC_BUS_H */ diff --git a/include/linux/device-id/arm_smccc.h b/include/linux/device-id/= arm_smccc.h new file mode 100644 index 000000000000..c8d38a002bfd --- /dev/null +++ b/include/linux/device-id/arm_smccc.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LINUX_DEVICE_ID_ARM_SMCCC_H +#define __LINUX_DEVICE_ID_ARM_SMCCC_H + +#define ARM_SMCCC_NAME_SIZE 40 +#define ARM_SMCCC_MODULE_PREFIX "arm_smccc:" + +/** + * struct arm_smccc_device_id - Arm SMCCC bus device identifier + * @name: SMCCC device name + */ +struct arm_smccc_device_id { + char name[ARM_SMCCC_NAME_SIZE]; +}; + +#endif /* __LINUX_DEVICE_ID_ARM_SMCCC_H */ diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetabl= e.h index a397213bedac..318c4b5c3451 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -16,6 +16,7 @@ #include "device-id/amba.h" #include "device-id/ap.h" #include "device-id/apr.h" +#include "device-id/arm_smccc.h" #include "device-id/auxiliary.h" #include "device-id/bcma.h" #include "device-id/ccw.h" diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-of= fsets.c index b4178c42d08f..a485011ff137 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c @@ -254,6 +254,9 @@ int main(void) DEVID(auxiliary_device_id); DEVID_FIELD(auxiliary_device_id, name); =20 + DEVID(arm_smccc_device_id); + DEVID_FIELD(arm_smccc_device_id, name); + DEVID(ssam_device_id); DEVID_FIELD(ssam_device_id, match_flags); DEVID_FIELD(ssam_device_id, domain); diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 8d36c74dec2d..7d62e74f475d 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -1349,6 +1349,13 @@ static void do_auxiliary_entry(struct module *mod, v= oid *symval) module_alias_printf(mod, false, AUXILIARY_MODULE_PREFIX "%s", *name); } =20 +static void do_arm_smccc_entry(struct module *mod, void *symval) +{ + DEF_FIELD_ADDR(symval, arm_smccc_device_id, name); + + module_alias_printf(mod, false, ARM_SMCCC_MODULE_PREFIX "%s", *name); +} + /* * Looks like: ssam:dNcNtNiNfN * @@ -1519,6 +1526,7 @@ static const struct devtable devtable[] =3D { {"mhi", SIZE_mhi_device_id, do_mhi_entry}, {"mhi_ep", SIZE_mhi_device_id, do_mhi_ep_entry}, {"auxiliary", SIZE_auxiliary_device_id, do_auxiliary_entry}, + {"arm_smccc", SIZE_arm_smccc_device_id, do_arm_smccc_entry}, {"ssam", SIZE_ssam_device_id, do_ssam_entry}, {"dfl", SIZE_dfl_device_id, do_dfl_entry}, {"ishtp", SIZE_ishtp_device_id, do_ishtp_entry}, --=20 2.43.0 From nobody Sat Oct 3 04:23:40 2026 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 EC6AC33290F; Wed, 5 Aug 2026 06:33:29 +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=1785911611; cv=none; b=YhZPOscvKG1sswgPG38Ih1C8WHWayqqiD++gd2dMCM3T+U89uj+sxMQS+6+3boJlOKNeLq/J5emWdluxMGjeRX1cT/r7DSMnhkI6SHdZfw76Ftk86Ixp6PxSndRzyi9KC4QN8zJ5SQSkwd9QgA7s/CwlaeZb1rUPxwrrTzLXuUk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785911611; c=relaxed/simple; bh=OsF5CWJ0/1Z2cKONm2HWChwYCHJnXO2AVh8v6AGuXKw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t39X3xh4ASgGRV8AbBbSuFqnHjSbk/Ez8LsyrjRchjcksDAxBT+U+c0/JYJYwhLRXk9jCcE0ExJNJbYEnyKvxS6mT6Y0fCTQ2WreZqfX/BWIsRVO16zD2NT2vm0BGEXB1rsNHlNG4w8VBSACkyEpjZ5a3eek4HIZ3qNyZNG3YL4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oBCKQGzT; 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="oBCKQGzT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B0DAA1F00A3E; Wed, 5 Aug 2026 06:33:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785911609; bh=cNO8KX+tnbg1izPHkTLbYvlg8mMeD/CCy2enByxGwF0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=oBCKQGzTt7Ug6SBGrFy26U4RRKANXDP8eZDcMgmOsXAl2F3IVEH1HrrisGe/3f1+d R3DLjqxrw7aTuEkmyj6QSvdWZYh353HTMLzBHIcqZrqQvJxsaIlSikIN6MFsicP4oM pKiQi1oBSMZZFP4JBdh4bA30DojMaH4uUfB7vvNN5JMf69a1qXkuzFGYL98SZtyNNN 0hqxGRqr7C56fJFS0tnzf6YSRWwuJDqs4/Z2f61jY1UdflePO9VMnL+MQN6e6kmg7A g1tMm5KF7Ch6KZBIlHqTwGmOYxj7loqNDo+wXvytpk6AVNLCwyOzghITnsjid+fp3y qNi37CVBLcx4g== 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 , Andre Przywara Subject: [PATCH v9 2/7] firmware: hwrng: arm_smccc_trng: Register as an SMCCC device Date: Wed, 5 Aug 2026 12:02:50 +0530 Message-ID: <20260805063255.1638614-3-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260805063255.1638614-1-aneesh.kumar@kernel.org> References: <20260805063255.1638614-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The SMCCC TRNG interface is a firmware-provided SMCCC service rather than a standalone platform device. Now that the SMCCC core has an SMCCC bus, create an arm-smccc-trng device for the discovered TRNG service and convert the hwrng driver to an SMCCC driver. The SMCCC id table preserves module autoloading for systems where the TRNG driver is built as a module. The sysfs device path changes from the old smccc_trng platform-device path to an arm-smccc device path. No known userspace dependency on the old path was found; a Debian Code Search lookup for the existing platform-device name/path did not find any users. Tested-by: Andre Przywara Signed-off-by: Aneesh Kumar K.V (Arm) Reviewed-by: Jason Gunthorpe --- arch/arm/include/asm/archrandom.h | 2 +- arch/arm64/include/asm/archrandom.h | 2 +- drivers/char/hw_random/arm_smccc_trng.c | 32 +++++++++----- drivers/firmware/smccc/smccc.c | 58 +++++++++++++++++++++---- 4 files changed, 72 insertions(+), 22 deletions(-) diff --git a/arch/arm/include/asm/archrandom.h b/arch/arm/include/asm/archr= andom.h index cc4714eb1a75..ee39a03ddf8a 100644 --- a/arch/arm/include/asm/archrandom.h +++ b/arch/arm/include/asm/archrandom.h @@ -2,7 +2,7 @@ #ifndef _ASM_ARCHRANDOM_H #define _ASM_ARCHRANDOM_H =20 -static inline bool __init smccc_probe_trng(void) +static inline bool smccc_probe_trng(void) { return false; } diff --git a/arch/arm64/include/asm/archrandom.h b/arch/arm64/include/asm/a= rchrandom.h index 8babfbe31f95..7605dd81bd1e 100644 --- a/arch/arm64/include/asm/archrandom.h +++ b/arch/arm64/include/asm/archrandom.h @@ -12,7 +12,7 @@ =20 extern bool smccc_trng_available; =20 -static inline bool __init smccc_probe_trng(void) +static inline bool smccc_probe_trng(void) { struct arm_smccc_res res; =20 diff --git a/drivers/char/hw_random/arm_smccc_trng.c b/drivers/char/hw_rand= om/arm_smccc_trng.c index dcb8e7f37f25..8f7f9d830cf2 100644 --- a/drivers/char/hw_random/arm_smccc_trng.c +++ b/drivers/char/hw_random/arm_smccc_trng.c @@ -16,8 +16,10 @@ #include #include #include -#include #include +#include + +#include =20 #ifdef CONFIG_ARM64 #define ARM_SMCCC_TRNG_RND ARM_SMCCC_TRNG_RND64 @@ -94,29 +96,37 @@ static int smccc_trng_read(struct hwrng *rng, void *dat= a, size_t max, bool wait) return copied; } =20 -static int smccc_trng_probe(struct platform_device *pdev) +static int smccc_trng_probe(struct arm_smccc_device *sdev) { struct hwrng *trng; =20 - trng =3D devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL); + /* validate the minimum version requirement */ + if (!smccc_probe_trng()) + return -ENODEV; + + trng =3D devm_kzalloc(&sdev->dev, sizeof(*trng), GFP_KERNEL); if (!trng) return -ENOMEM; =20 trng->name =3D "smccc_trng"; trng->read =3D smccc_trng_read; =20 - return devm_hwrng_register(&pdev->dev, trng); + return devm_hwrng_register(&sdev->dev, trng); } =20 -static struct platform_driver smccc_trng_driver =3D { - .driver =3D { - .name =3D "smccc_trng", - }, - .probe =3D smccc_trng_probe, +static const struct arm_smccc_device_id smccc_trng_id_table[] =3D { + { .name =3D "arm-smccc-trng" }, + {} +}; +MODULE_DEVICE_TABLE(arm_smccc, smccc_trng_id_table); + +static struct arm_smccc_driver smccc_trng_driver =3D { + .name =3D KBUILD_MODNAME, + .probe =3D smccc_trng_probe, + .id_table =3D smccc_trng_id_table, }; -module_platform_driver(smccc_trng_driver); +module_arm_smccc_driver(smccc_trng_driver); =20 -MODULE_ALIAS("platform:smccc_trng"); MODULE_AUTHOR("Andre Przywara"); MODULE_DESCRIPTION("Arm SMCCC TRNG firmware interface support"); MODULE_LICENSE("GPL"); diff --git a/drivers/firmware/smccc/smccc.c b/drivers/firmware/smccc/smccc.c index bdee057db2fd..092bdbac26f2 100644 --- a/drivers/firmware/smccc/smccc.c +++ b/drivers/firmware/smccc/smccc.c @@ -9,7 +9,8 @@ #include #include #include -#include +#include + #include =20 static u32 smccc_version =3D ARM_SMCCC_VERSION_1_0; @@ -81,16 +82,55 @@ bool arm_smccc_hypervisor_has_uuid(const uuid_t *hyp_uu= id) } EXPORT_SYMBOL_GPL(arm_smccc_hypervisor_has_uuid); =20 +struct smccc_device_info { + u32 func_id; + bool requires_smc; + const char *device_name; +}; + +static const struct smccc_device_info smccc_devices[] __initconst =3D { + { + .func_id =3D ARM_SMCCC_TRNG_VERSION, + .requires_smc =3D false, + .device_name =3D "arm-smccc-trng", + }, +}; + +static bool __init smccc_probe_smccc_device(const struct smccc_device_info= *smccc_dev) +{ + int ret; + struct arm_smccc_res res =3D {}; + + if (smccc_conduit =3D=3D SMCCC_CONDUIT_NONE) + return false; + + if (smccc_dev->requires_smc && smccc_conduit !=3D SMCCC_CONDUIT_SMC) + return false; + + arm_smccc_1_1_invoke(smccc_dev->func_id, &res); + ret =3D res.a0; + + if (ret =3D=3D SMCCC_RET_NOT_SUPPORTED) + return false; + + return true; +} + static int __init smccc_devices_init(void) { - struct platform_device *pdev; - - if (smccc_trng_available) { - pdev =3D platform_device_register_simple("smccc_trng", -1, - NULL, 0); - if (IS_ERR(pdev)) - pr_err("smccc_trng: could not register device: %ld\n", - PTR_ERR(pdev)); + struct arm_smccc_device *sdev; + const struct smccc_device_info *smccc_dev; + + for (int i =3D 0; i < ARRAY_SIZE(smccc_devices); i++) { + smccc_dev =3D &smccc_devices[i]; + + if (!smccc_probe_smccc_device(smccc_dev)) + continue; + + sdev =3D arm_smccc_device_register(smccc_dev->device_name); + if (IS_ERR(sdev)) + pr_err("%s: could not register device: %ld\n", + smccc_dev->device_name, PTR_ERR(sdev)); } =20 return 0; --=20 2.43.0 From nobody Sat Oct 3 04:23:40 2026 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 14FE12DFF3F; Wed, 5 Aug 2026 06:33:35 +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=1785911616; cv=none; b=ukZdo2CRx3FBgr7LWLBiZOvp413/Q2JNbD5RT0mAvlAJz1PMmfg/IQ7q47LBZMWy8OPrmvPPsI8g0Ya84NnDj8jrZ5DURT9MMMx1Z2pSw5iHi6GqsSnrHqKjp9dJSU7ZSVdOOPeNFiBEI24CAqJgAvzo5HvWSY0+8KRFXUOSXFY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785911616; c=relaxed/simple; bh=xYTYalb68vEZvvnOrfyXrwHSJ39OpdZtRnoGmX2dOOM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Is+bbSwqsNWhaeDAOS6h2uswaSMXV7DHUDx1TMJwJ4GicMQHGgwbyjqGARICUOxLL2tjvrfg8Ni0OgrEcQeJLnPQR3nmEvGlH+zEa/9SmEWloV7FReKcoJq1YKNZa4t3lXI/6eixMrPthk96JynxtN0PgLpjbvrOze4E0dCTNhc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=alDRVMTs; 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="alDRVMTs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2B4B91F00A3D; Wed, 5 Aug 2026 06:33:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785911615; bh=2y9Yye4Zg46dJ1CXG1OwGxBDqqwehqDm2yUJntX8svk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=alDRVMTsjWxSY10GpjGZ6LOP0ffl2JjWAPOtmJ1h5cMw1xlbpgRlk8bfKbJ17WMTt ik6xu9SOfNQppreDR9XVScTgHQjXIzbVzy4gFhK0UC/T2ap1uHw9sd5JkSLcHpaVF2 zDEhHraVR6DXxUsMr718mOh0Q53miUpO61aZpLY0o3AeREsAaziPzj3NDQJXxAKT3t Qe3sf1EEfq5rQteGJuF2OyZ9LQFHNeRuvFL5hogXuUwM+WnxRi9DgFWZ5f2b21UzoQ RokVY6tfuh6IbTrS4reiJ2zkM62EYWcMU3YSFVIn+kOPFtDcirfZsgmFzErNPhzXex ikZ+RdlhrYlqA== 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 , Andre Przywara Subject: [PATCH v9 3/7] firmware: arm_rmm: Move RSI support out of arch/arm64 Date: Wed, 5 Aug 2026 12:02:51 +0530 Message-ID: <20260805063255.1638614-4-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260805063255.1638614-1-aneesh.kumar@kernel.org> References: <20260805063255.1638614-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The RSI SMCCC function IDs describe a firmware ABI and are not arm64 architecture specific definitions. Follow-up changes need to use them from non-arch code, including drivers/firmware/smccc and the Arm CCA guest driver. Move the complete Realm Service Interface (RSI) implementation from arch/arm64 to drivers/firmware/arm_rmm. The RSI SMCCC definitions and command helpers are also moved to include/linux so they can be shared by architecture code and firmware or driver code. This also keeps the firmware interface outside architecture code, as requested [1]. [1] https://lore.kernel.org/all/agsNO9cc7H-b0H8L@willie-the-truck Signed-off-by: Aneesh Kumar K.V (Arm) Acked-by: Suzuki K Poulose Reviewed-by: Jason Gunthorpe --- arch/arm64/Kconfig | 1 + arch/arm64/include/asm/io.h | 2 +- arch/arm64/include/asm/mem_encrypt.h | 2 +- arch/arm64/include/asm/pgtable-prot.h | 2 +- arch/arm64/include/asm/rsi.h | 70 ----------------- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/setup.c | 2 +- arch/arm64/mm/init.c | 3 +- drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/arm_rmm/Kconfig | 18 +++++ drivers/firmware/arm_rmm/Makefile | 2 + .../kernel =3D> drivers/firmware/arm_rmm}/rsi.c | 2 +- drivers/virt/coco/arm-cca-guest/Kconfig | 2 +- .../virt/coco/arm-cca-guest/arm-cca-guest.c | 5 +- .../linux/arm-rsi-cmds.h | 77 +++++++++++++++++-- .../linux/arm-smccc-rsi.h | 6 +- 17 files changed, 109 insertions(+), 89 deletions(-) delete mode 100644 arch/arm64/include/asm/rsi.h create mode 100644 drivers/firmware/arm_rmm/Kconfig create mode 100644 drivers/firmware/arm_rmm/Makefile rename {arch/arm64/kernel =3D> drivers/firmware/arm_rmm}/rsi.c (99%) rename arch/arm64/include/asm/rsi_cmds.h =3D> include/linux/arm-rsi-cmds.h= (69%) rename arch/arm64/include/asm/rsi_smc.h =3D> include/linux/arm-smccc-rsi.h= (98%) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 39eba438dad4..8c5088bfce57 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -38,6 +38,7 @@ config ARM64 select ARCH_HAS_MEMBARRIER_SYNC_CORE select ARCH_HAS_MEM_ENCRYPT select ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS + select ARCH_SUPPORTS_RMM select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE select ARCH_HAS_NONLEAF_PMD_YOUNG if ARM64_HAFT diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index 49a7002661a9..1620537f0332 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h @@ -8,6 +8,7 @@ #ifndef __ASM_IO_H #define __ASM_IO_H =20 +#include #include #include =20 @@ -17,7 +18,6 @@ #include #include #include -#include =20 /* * Generic IO read/write. These perform native-endian accesses. diff --git a/arch/arm64/include/asm/mem_encrypt.h b/arch/arm64/include/asm/= mem_encrypt.h index 636f45b4d8af..f03b9d7b83b4 100644 --- a/arch/arm64/include/asm/mem_encrypt.h +++ b/arch/arm64/include/asm/mem_encrypt.h @@ -2,8 +2,8 @@ #ifndef __ASM_MEM_ENCRYPT_H #define __ASM_MEM_ENCRYPT_H =20 +#include #include -#include =20 struct device; =20 diff --git a/arch/arm64/include/asm/pgtable-prot.h b/arch/arm64/include/asm= /pgtable-prot.h index 212ce1b02e15..6d4e275ed5ed 100644 --- a/arch/arm64/include/asm/pgtable-prot.h +++ b/arch/arm64/include/asm/pgtable-prot.h @@ -66,9 +66,9 @@ =20 #ifndef __ASSEMBLER__ =20 +#include #include #include -#include =20 extern bool arm64_use_ng_mappings; extern unsigned long prot_ns_shared; diff --git a/arch/arm64/include/asm/rsi.h b/arch/arm64/include/asm/rsi.h deleted file mode 100644 index 88b50d660e85..000000000000 --- a/arch/arm64/include/asm/rsi.h +++ /dev/null @@ -1,70 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (C) 2024 ARM Ltd. - */ - -#ifndef __ASM_RSI_H_ -#define __ASM_RSI_H_ - -#include -#include -#include - -#define RSI_PDEV_NAME "arm-cca-dev" - -DECLARE_STATIC_KEY_FALSE(rsi_present); - -void __init arm64_rsi_init(void); - -bool arm64_rsi_is_protected(phys_addr_t base, size_t size); - -static inline bool is_realm_world(void) -{ - return static_branch_unlikely(&rsi_present); -} - -static inline int rsi_set_memory_range(phys_addr_t start, phys_addr_t end, - enum ripas state, unsigned long flags) -{ - unsigned long ret; - phys_addr_t top; - - while (start !=3D end) { - ret =3D rsi_set_addr_range_state(start, end, state, flags, &top); - if (ret || top < start || top > end) - return -EINVAL; - start =3D top; - } - - return 0; -} - -/* - * Convert the specified range to RAM. Do not use this if you rely on the - * contents of a page that may already be in RAM state. - */ -static inline int rsi_set_memory_range_protected(phys_addr_t start, - phys_addr_t end) -{ - return rsi_set_memory_range(start, end, RSI_RIPAS_RAM, - RSI_CHANGE_DESTROYED); -} - -/* - * Convert the specified range to RAM. Do not convert any pages that may h= ave - * been DESTROYED, without our permission. - */ -static inline int rsi_set_memory_range_protected_safe(phys_addr_t start, - phys_addr_t end) -{ - return rsi_set_memory_range(start, end, RSI_RIPAS_RAM, - RSI_NO_CHANGE_DESTROYED); -} - -static inline int rsi_set_memory_range_shared(phys_addr_t start, - phys_addr_t end) -{ - return rsi_set_memory_range(start, end, RSI_RIPAS_EMPTY, - RSI_CHANGE_DESTROYED); -} -#endif /* __ASM_RSI_H_ */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index d2690c3ec528..21fc3a3d25c9 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -34,7 +34,7 @@ obj-y :=3D debug-monitors.o entry.o irq.o fpsimd.o \ cpufeature.o alternative.o cacheinfo.o \ smp.o smp_spin_table.o topology.o smccc-call.o \ syscall.o proton-pack.o idle.o patching.o pi/ \ - rsi.o jump_label.o + jump_label.o =20 obj-$(CONFIG_COMPAT) +=3D sys32.o signal32.o \ sys_compat.o diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 23c05dc7a8f2..d36f2f957d00 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -7,6 +7,7 @@ */ =20 #include +#include #include #include #include @@ -43,7 +44,6 @@ #include #include #include -#include #include #include #include diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 3b9e1b8de6cb..e5586df129d9 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -34,6 +34,8 @@ #include #include #include +#include + =20 #include #include @@ -43,7 +45,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index dbaca140a1b0..b35a0d8e2ea3 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -322,5 +322,6 @@ source "drivers/firmware/samsung/Kconfig" source "drivers/firmware/smccc/Kconfig" source "drivers/firmware/tegra/Kconfig" source "drivers/firmware/xilinx/Kconfig" +source "drivers/firmware/arm_rmm/Kconfig" =20 endmenu diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index be46f1e1dc77..196a650ccf02 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -39,3 +39,4 @@ obj-y +=3D samsung/ obj-y +=3D smccc/ obj-y +=3D tegra/ obj-y +=3D xilinx/ +obj-y +=3D arm_rmm/ diff --git a/drivers/firmware/arm_rmm/Kconfig b/drivers/firmware/arm_rmm/Kc= onfig new file mode 100644 index 000000000000..1322a1447b56 --- /dev/null +++ b/drivers/firmware/arm_rmm/Kconfig @@ -0,0 +1,18 @@ + +config ARCH_SUPPORTS_RMM + bool + +config ARM_RMM + bool "Realm Management Monitor (RMM) Support" + depends on ARCH_SUPPORTS_RMM + default y + help + Support the Realm Management Monitor (RMM) on Arm systems that + implement the Realm Management Extension (RME), as defined by the + Arm Confidential Compute Architecture. + + The RMM provides the Realm Management Interface (RMI) for use by + the Normal World host and the Realm Service Interface (RSI) for + use by Realm guests. The RSI is used to negotiate the RSI version + and Realm configuration with the RMM and manage the protected + state of memory. diff --git a/drivers/firmware/arm_rmm/Makefile b/drivers/firmware/arm_rmm/M= akefile new file mode 100644 index 000000000000..3d8181ae94a7 --- /dev/null +++ b/drivers/firmware/arm_rmm/Makefile @@ -0,0 +1,2 @@ + +obj-$(CONFIG_ARM_RMM) =3D rsi.o diff --git a/arch/arm64/kernel/rsi.c b/drivers/firmware/arm_rmm/rsi.c similarity index 99% rename from arch/arm64/kernel/rsi.c rename to drivers/firmware/arm_rmm/rsi.c index 25ca75ce1a4d..8e716f1c1e31 100644 --- a/arch/arm64/kernel/rsi.c +++ b/drivers/firmware/arm_rmm/rsi.c @@ -8,11 +8,11 @@ #include #include #include +#include =20 #include #include #include -#include =20 static struct realm_config config; =20 diff --git a/drivers/virt/coco/arm-cca-guest/Kconfig b/drivers/virt/coco/ar= m-cca-guest/Kconfig index 3f0f013f03f1..b2c225fd445c 100644 --- a/drivers/virt/coco/arm-cca-guest/Kconfig +++ b/drivers/virt/coco/arm-cca-guest/Kconfig @@ -1,6 +1,6 @@ config ARM_CCA_GUEST tristate "Arm CCA Guest driver" - depends on ARM64 + depends on ARM_RMM select TSM_REPORTS help The driver provides userspace interface to request and diff --git a/drivers/virt/coco/arm-cca-guest/arm-cca-guest.c b/drivers/virt= /coco/arm-cca-guest/arm-cca-guest.c index 0eeddd1ff05b..b741643d1364 100644 --- a/drivers/virt/coco/arm-cca-guest/arm-cca-guest.c +++ b/drivers/virt/coco/arm-cca-guest/arm-cca-guest.c @@ -3,7 +3,8 @@ * Copyright (C) 2023 ARM Ltd. */ =20 -#include +#include +#include #include #include #include @@ -12,8 +13,6 @@ #include #include =20 -#include - /** * struct arm_cca_token_info - a descriptor for the token buffer. * @granule: PA of the granule to which the token will be written diff --git a/arch/arm64/include/asm/rsi_cmds.h b/include/linux/arm-rsi-cmds= .h similarity index 69% rename from arch/arm64/include/asm/rsi_cmds.h rename to include/linux/arm-rsi-cmds.h index c1fab41f671e..13478e14c429 100644 --- a/arch/arm64/include/asm/rsi_cmds.h +++ b/include/linux/arm-rsi-cmds.h @@ -3,14 +3,36 @@ * Copyright (C) 2023 ARM Ltd. */ =20 -#ifndef __ASM_RSI_CMDS_H -#define __ASM_RSI_CMDS_H +#ifndef __LINUX_ARM_RSI_CMDS_H_ +#define __LINUX_ARM_RSI_CMDS_H_ =20 -#include +#include +#include #include #include =20 -#include +#define RSI_PDEV_NAME "arm-cca-dev" +#ifdef CONFIG_ARM_RMM +DECLARE_STATIC_KEY_FALSE(rsi_present); + +void __init arm64_rsi_init(void); + +bool arm64_rsi_is_protected(phys_addr_t base, size_t size); + +static inline bool is_realm_world(void) +{ + return static_branch_unlikely(&rsi_present); +} +#else +static inline void arm64_rsi_init(void) { } + +static inline bool arm64_rsi_is_protected(phys_addr_t base, size_t size) +{ + return false; +} + +static inline bool is_realm_world(void) { return false; } +#endif =20 #define RSI_GRANULE_SHIFT 12 #define RSI_GRANULE_SIZE (_AC(1, UL) << RSI_GRANULE_SHIFT) @@ -88,6 +110,51 @@ static inline long rsi_set_addr_range_state(phys_addr_t= start, return res.a0; } =20 +static inline int rsi_set_memory_range(phys_addr_t start, phys_addr_t end, + enum ripas state, unsigned long flags) +{ + unsigned long ret; + phys_addr_t top; + + while (start !=3D end) { + ret =3D rsi_set_addr_range_state(start, end, state, flags, &top); + if (ret || top < start || top > end) + return -EINVAL; + start =3D top; + } + + return 0; +} + +/* + * Convert the specified range to RAM. Do not use this if you rely on the + * contents of a page that may already be in RAM state. + */ +static inline int rsi_set_memory_range_protected(phys_addr_t start, + phys_addr_t end) +{ + return rsi_set_memory_range(start, end, RSI_RIPAS_RAM, + RSI_CHANGE_DESTROYED); +} + +/* + * Convert the specified range to RAM. Do not convert any pages that may h= ave + * been DESTROYED, without our permission. + */ +static inline int rsi_set_memory_range_protected_safe(phys_addr_t start, + phys_addr_t end) +{ + return rsi_set_memory_range(start, end, RSI_RIPAS_RAM, + RSI_NO_CHANGE_DESTROYED); +} + +static inline int rsi_set_memory_range_shared(phys_addr_t start, + phys_addr_t end) +{ + return rsi_set_memory_range(start, end, RSI_RIPAS_EMPTY, + RSI_CHANGE_DESTROYED); +} + #define RSI_ATTEST_CHALLENGE_MIN_SIZE 32 #define RSI_ATTEST_CHALLENGE_MAX_SIZE 64 =20 @@ -170,4 +237,4 @@ static inline unsigned long rsi_attestation_token_conti= nue(phys_addr_t granule, return res.a0; } =20 -#endif /* __ASM_RSI_CMDS_H */ +#endif /* __LINUX_ARM_RSI_CMDS_H_ */ diff --git a/arch/arm64/include/asm/rsi_smc.h b/include/linux/arm-smccc-rsi= .h similarity index 98% rename from arch/arm64/include/asm/rsi_smc.h rename to include/linux/arm-smccc-rsi.h index e19253f96c94..fddb77986f70 100644 --- a/arch/arm64/include/asm/rsi_smc.h +++ b/include/linux/arm-smccc-rsi.h @@ -3,8 +3,8 @@ * Copyright (C) 2023 ARM Ltd. */ =20 -#ifndef __ASM_RSI_SMC_H_ -#define __ASM_RSI_SMC_H_ +#ifndef __LINUX_ARM_SMCCC_RSI_H_ +#define __LINUX_ARM_SMCCC_RSI_H_ =20 #include =20 @@ -190,4 +190,4 @@ struct realm_config { */ #define SMC_RSI_HOST_CALL SMC_RSI_FID(0x199) =20 -#endif /* __ASM_RSI_SMC_H_ */ +#endif /* __LINUX_ARM_SMCCC_RSI_H_ */ --=20 2.43.0 From nobody Sat Oct 3 04:23:40 2026 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 824403DDDAB; Wed, 5 Aug 2026 06:33:40 +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=1785911621; cv=none; b=gIgkgr28bP9g3jw2At5/cEsfSJI+i5pwxBgDefxcjHbI1jD6UhTOeuYsG3QNo9knm6PEjvPqgziee4v264LeuTcRd3oEnuQ1/+4j3ha7J+31UDSIRj8RJPWWJ2Eb96bH+CJAqdtMVFygaWSRQlvnT3qxADyIzMFk40fJ0h6MpDg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785911621; c=relaxed/simple; bh=APxQx5dWo+xAcvxP1fewVRbuvrtZKgJKaoenzO4YTa0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GZf8h1MOLrBCpfWErhjyHo4QSr5cf9uj08QGyPt6uq06CSzLr7ugn9GaLHqgVAYoz42j5se4Q+Jsu+lA8n8WqV6z/7v4J6lYzMd+NnsDy1/9zTjxTfwrTguzyu1z7pC948DHq7uEpo5DZOQHIwPUg71b1nqdlbsAr2kjxf7cCek= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Vl28a5tD; 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="Vl28a5tD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9B6821F00A3A; Wed, 5 Aug 2026 06:33:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785911620; bh=Gq3cGAu0BaOnCuHNL8771EcN54SBHzT0LE23CmXIUFs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Vl28a5tD4rpIAeXzedXYjUFh8icyK8MFNqj7YcU399QtldDQb6hSiiFaLJkkoJyL5 dkWK5amQl2H9624sIooM2S1hbw0sCRWQ7AT+UZHVhQ+tlGx/gX1w/1kftGPKU7r0pL ZVDvHnkiA9HoP1VEk346LduOgyGVz26VgFGF6VYAuDGwW8r4mhgbJCRwvN3sM3MviC CsXxFFOnzhl3yB0pKb0+WXcvq9PCeyrNkw7AkJjCr5oQstWPnUViV1lpeH9x7L8oRY JbzwqNd4aSIquJ4moxo8SjN9NQJ/xiYa3gRgtvwdZazt1S/oEewoRXnb5NBHl2oC9N 610hlugqdkASA== 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 , Andre Przywara Subject: [PATCH v9 4/7] arm64: realm: Move Realm memory encryption ops to RSI code Date: Wed, 5 Aug 2026 12:02:52 +0530 Message-ID: <20260805063255.1638614-5-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260805063255.1638614-1-aneesh.kumar@kernel.org> References: <20260805063255.1638614-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Realm memory encryption callbacks are CCA-specific. Keep the Realm callback registration with the RSI initialization code instead of pageattr.c, which only needs to provide the low-level page-attribute transition helper. Export __set_memory_enc_dec() within arm64 so the RSI code can wrap it with the Realm-specific encrypt/decrypt callbacks and warning policy. No functional changes in this patch. Signed-off-by: Aneesh Kumar K.V (Arm) --- arch/arm64/include/asm/mem_encrypt.h | 3 +-- arch/arm64/mm/pageattr.c | 38 +--------------------------- drivers/firmware/arm_rmm/rsi.c | 34 +++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/arch/arm64/include/asm/mem_encrypt.h b/arch/arm64/include/asm/= mem_encrypt.h index f03b9d7b83b4..ef8b8463e52b 100644 --- a/arch/arm64/include/asm/mem_encrypt.h +++ b/arch/arm64/include/asm/mem_encrypt.h @@ -16,8 +16,7 @@ int arm64_mem_crypt_ops_register(const struct arm64_mem_c= rypt_ops *ops); =20 int set_memory_encrypted(unsigned long addr, int numpages); int set_memory_decrypted(unsigned long addr, int numpages); - -int realm_register_memory_enc_ops(void); +int __set_memory_enc_dec(unsigned long addr, int numpages, bool encrypt); =20 static inline bool force_dma_unencrypted(struct device *dev) { diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index bbe98ac9ad8c..14b2a3801f40 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -275,9 +275,7 @@ int set_direct_map_default_noflush(struct page *page) PAGE_SIZE, set_mask, clear_mask); } =20 -static int __set_memory_enc_dec(unsigned long addr, - int numpages, - bool encrypt) +int __set_memory_enc_dec(unsigned long addr, int numpages, bool encrypt) { unsigned long set_prot =3D 0, clear_prot =3D 0; phys_addr_t start, end; @@ -321,40 +319,6 @@ static int __set_memory_enc_dec(unsigned long addr, __pgprot(PTE_PRESENT_INVALID)); } =20 -static int realm_set_memory_encrypted(unsigned long addr, int numpages) -{ - int ret =3D __set_memory_enc_dec(addr, numpages, true); - - /* - * If the request to change state fails, then the only sensible cause - * of action for the caller is to leak the memory - */ - WARN(ret, "Failed to encrypt memory, %d pages will be leaked", - numpages); - - return ret; -} - -static int realm_set_memory_decrypted(unsigned long addr, int numpages) -{ - int ret =3D __set_memory_enc_dec(addr, numpages, false); - - WARN(ret, "Failed to decrypt memory, %d pages will be leaked", - numpages); - - return ret; -} - -static const struct arm64_mem_crypt_ops realm_crypt_ops =3D { - .encrypt =3D realm_set_memory_encrypted, - .decrypt =3D realm_set_memory_decrypted, -}; - -int realm_register_memory_enc_ops(void) -{ - return arm64_mem_crypt_ops_register(&realm_crypt_ops); -} - int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool vali= d) { unsigned long addr =3D (unsigned long)page_address(page); diff --git a/drivers/firmware/arm_rmm/rsi.c b/drivers/firmware/arm_rmm/rsi.c index 8e716f1c1e31..ada139d0e344 100644 --- a/drivers/firmware/arm_rmm/rsi.c +++ b/drivers/firmware/arm_rmm/rsi.c @@ -127,6 +127,40 @@ static int realm_ioremap_hook(phys_addr_t phys, size_t= size, pgprot_t *prot) return 0; } =20 +static int realm_set_memory_encrypted(unsigned long addr, int numpages) +{ + int ret =3D __set_memory_enc_dec(addr, numpages, true); + + /* + * If the request to change state fails, then the only sensible cause + * of action for the caller is to leak the memory + */ + WARN(ret, "Failed to encrypt memory, %d pages will be leaked", + numpages); + + return ret; +} + +static int realm_set_memory_decrypted(unsigned long addr, int numpages) +{ + int ret =3D __set_memory_enc_dec(addr, numpages, false); + + WARN(ret, "Failed to decrypt memory, %d pages will be leaked", + numpages); + + return ret; +} + +static const struct arm64_mem_crypt_ops realm_crypt_ops =3D { + .encrypt =3D realm_set_memory_encrypted, + .decrypt =3D realm_set_memory_decrypted, +}; + +static int realm_register_memory_enc_ops(void) +{ + return arm64_mem_crypt_ops_register(&realm_crypt_ops); +} + void __init arm64_rsi_init(void) { if (arm_smccc_1_1_get_conduit() !=3D SMCCC_CONDUIT_SMC) --=20 2.43.0 From nobody Sat Oct 3 04:23:40 2026 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 449E43DD500; Wed, 5 Aug 2026 06:33:46 +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=1785911627; cv=none; b=gBwcyUPA06eOojosAeEL2juKqUF+aA8T/LCqsAqEF+0b8Vb9CNghatfehc91E1bAZs2i1cwZZtOkiefR9x1Hvlf3L5p89pk7Yj9gUdn7JgPr6SO+N5Ax2bSaRA/1OJOYvOcs7jwq259Uh+3JxdKtpTTCT7oKCjcX5qct8SvV/DA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785911627; c=relaxed/simple; bh=OC4VLs58s2FAVASsFufhy7jRR+y56nqWvhjkO4JOX68=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TT2CzvRKRi7+hpl5JAGq/Js80mWzEmkx6OVxhAYJwZWJ7JNK4kdSjfmsQk1HXlqYj4Xy/llrdfmylQc3l4NFj6n731g7iR2SElwHFfQG8kE5//wzlQEZ19gmxxTWoV6wr2VrDCg74/C+kfXDDzZlWAlHk0tvT/kOgLSU7+fFUH4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AagRKnWq; 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="AagRKnWq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 15A951F00A3D; Wed, 5 Aug 2026 06:33:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785911626; bh=3UEgeoaW/w43eP7Ky5d+XFBp5+DMWGE+2R8m9AIqlWY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=AagRKnWqM2AZ8zBSbPoDdK5E/Mey0v8goo5rj2MlmDv08h4JvAdqulXwowUw5bCfP 0e1YzqFOrAqK+Ei76Ge/63J9i3MfLLgaP4F2kRwsVqdBVsrvq8gKK7RbDzwYoU4gtT wyfqdfD6yy48GDbm/mo8xhxvBoFJijGfPZFWCJUxUDIOkDA4Yd3LAZITCYcFjPtSAB c2Y56HViguYt8XU+drXPgJVO+3CYVGJ8AtRCKoobZQl7Bg1BjExklldJvL9xnSBA9A 5/+YX0+dn80SuGzVQid8Seo4PWHXICXKo+XROojQU3/+wCB60KOJbRA4U0e8POlJzS PUOHTpSHAcdlA== 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 , Andre Przywara , Suzuki K Poulose Subject: [PATCH v9 5/7] virt: coco: arm-cca-guest: Rename TSM report source file Date: Wed, 5 Aug 2026 12:02:53 +0530 Message-ID: <20260805063255.1638614-6-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260805063255.1638614-1-aneesh.kumar@kernel.org> References: <20260805063255.1638614-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Arm CCA guest driver currently only implements TSM report support, but follow-up changes will add more TSM-related functionality to the same module. Rename arm-cca-guest.c to arm-cca.c and build it as an object of the arm-cca-guest module. This leaves room for the module to grow additional source files. Reviewed-by: Suzuki K Poulose Signed-off-by: Aneesh Kumar K.V (Arm) --- drivers/virt/coco/arm-cca-guest/Makefile | 2 ++ .../virt/coco/arm-cca-guest/{arm-cca-guest.c =3D> arm-cca.c} | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) rename drivers/virt/coco/arm-cca-guest/{arm-cca-guest.c =3D> arm-cca.c} (9= 7%) diff --git a/drivers/virt/coco/arm-cca-guest/Makefile b/drivers/virt/coco/a= rm-cca-guest/Makefile index 69eeba08e98a..778146148515 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) +=3D arm-cca-guest.o + +arm-cca-guest-y +=3D 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 97% rename from drivers/virt/coco/arm-cca-guest/arm-cca-guest.c rename to drivers/virt/coco/arm-cca-guest/arm-cca.c index b741643d1364..80659f0885e9 100644 --- a/drivers/virt/coco/arm-cca-guest/arm-cca-guest.c +++ b/drivers/virt/coco/arm-cca-guest/arm-cca.c @@ -156,7 +156,7 @@ static int arm_cca_report_new(struct tsm_report *report= , void *data) return ret; } =20 -static const struct tsm_report_ops arm_cca_tsm_ops =3D { +static const struct tsm_report_ops arm_cca_tsm_report_ops =3D { .name =3D KBUILD_MODNAME, .report_new =3D arm_cca_report_new, }; @@ -177,7 +177,7 @@ static int __init arm_cca_guest_init(void) if (!is_realm_world()) return -ENODEV; =20 - ret =3D tsm_report_register(&arm_cca_tsm_ops, NULL); + ret =3D tsm_report_register(&arm_cca_tsm_report_ops, NULL); if (ret < 0) pr_err("Error %d registering with TSM\n", ret); =20 @@ -191,7 +191,7 @@ module_init(arm_cca_guest_init); */ static void __exit arm_cca_guest_exit(void) { - tsm_report_unregister(&arm_cca_tsm_ops); + tsm_report_unregister(&arm_cca_tsm_report_ops); } module_exit(arm_cca_guest_exit); =20 --=20 2.43.0 From nobody Sat Oct 3 04:23:40 2026 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 6A31D2EA732; Wed, 5 Aug 2026 06:33:52 +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=1785911633; cv=none; b=XNUSGUWXxJzPazUruozhtuSPzrkPKoyHaNsqrYtbv+IddsK8z2R5lz+y/TSjNfoJh7NKXRvazywl0BsVGxuNAnfY6tiNhwM9IVg1T6H+bW2tnzTVoshoK4O4Cho1C9ck3+WuHSDMhYmd3WPb9xlVnoLt+LT5jzr5k616L/6wGj0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785911633; c=relaxed/simple; bh=vTzqlnumgO9y/M/GsksLdc7xPdSuT6t8iO52edETyKY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uRwDQHCnTCydpwN6n75INNPrsVQmKH5lL0zKtkadMOLWhfZDOsbP/8tbRsT8C2y9nIwUwTenQApwr8Cq7vnnQiHy2uCD3DBLgIPwO9NIJ9ePO/p1/7xwClLbxBp43Cn7bZDx+HpZ/eK2yK8hBeFYPZpyno5fxBD9mXgSbXHi6ec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bBJiWdGR; 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="bBJiWdGR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CD6321F000E9; Wed, 5 Aug 2026 06:33:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785911631; bh=0nyaeGqcwyC8vyfXer1bbczMAxTPQxLzxMh0e3GapGw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=bBJiWdGRY6jSpEmnxcTCLK52mOZP0wGqF5vklhMPl3gF/4iWhVUYeMZsdSUQRQPW5 twbzxFru5NW1xAOz2Bl8JOfbN9DxQQAXSmOWjBs7w5vQVgYiMZhKZC8ToeW2JpcBAT M4HkW7j3P+K1XXXa1+xY3k3SzB0t031CMdzFxVOByvDjgYubqm4efsxFORWxOn5bl9 ThVZ0cukWQYeNSFi9EwCG7WYtwMdPhDPu/f18EI1dHN0fR7AFzypS+pTHcLVWD7pZS kc/Iy/uf5TBEmBmNo9HngHgi3XxIpdWc2uuqrf4wQ4bu2CIwfkm+jGo6k07qBP0wwp HJo1ihDWQOHiA== 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 , Andre Przywara , Suzuki K Poulose Subject: [PATCH v9 6/7] firmware: smccc: arm-cca-guest: Bind the TSM provider to an SMCCC device Date: Wed, 5 Aug 2026 12:02:54 +0530 Message-ID: <20260805063255.1638614-7-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260805063255.1638614-1-aneesh.kumar@kernel.org> References: <20260805063255.1638614-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 if RSI ABI version call is supported, 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. Reviewed-by: Suzuki K Poulose Signed-off-by: Aneesh Kumar K.V (Arm) --- drivers/firmware/arm_rmm/rsi.c | 2 +- drivers/firmware/smccc/smccc.c | 7 +++ drivers/virt/coco/arm-cca-guest/Kconfig | 1 + drivers/virt/coco/arm-cca-guest/arm-cca.c | 56 +++++++++++------------ include/linux/arm-rsi-cmds.h | 1 - include/linux/arm-smccc-rsi.h | 2 + 6 files changed, 39 insertions(+), 30 deletions(-) diff --git a/drivers/firmware/arm_rmm/rsi.c b/drivers/firmware/arm_rmm/rsi.c index ada139d0e344..2dd69febedbd 100644 --- a/drivers/firmware/arm_rmm/rsi.c +++ b/drivers/firmware/arm_rmm/rsi.c @@ -183,7 +183,7 @@ void __init arm64_rsi_init(void) } =20 static struct platform_device rsi_dev =3D { - .name =3D RSI_PDEV_NAME, + .name =3D "arm-cca-dev", .id =3D PLATFORM_DEVID_NONE }; =20 diff --git a/drivers/firmware/smccc/smccc.c b/drivers/firmware/smccc/smccc.c index 092bdbac26f2..537b4b22c395 100644 --- a/drivers/firmware/smccc/smccc.c +++ b/drivers/firmware/smccc/smccc.c @@ -10,6 +10,7 @@ #include #include #include +#include =20 #include =20 @@ -94,6 +95,12 @@ static const struct smccc_device_info smccc_devices[] __= initconst =3D { .requires_smc =3D false, .device_name =3D "arm-smccc-trng", }, + + { + .func_id =3D SMC_RSI_ABI_VERSION, + .requires_smc =3D true, + .device_name =3D RSI_DEV_NAME, + }, }; =20 static bool __init smccc_probe_smccc_device(const struct smccc_device_info= *smccc_dev) diff --git a/drivers/virt/coco/arm-cca-guest/Kconfig b/drivers/virt/coco/ar= m-cca-guest/Kconfig index b2c225fd445c..0511dd25cb13 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 ARM_RMM + 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/arm-cca.c b/drivers/virt/coco/= arm-cca-guest/arm-cca.c index 80659f0885e9..71bc1ecf0c80 100644 --- a/drivers/virt/coco/arm-cca-guest/arm-cca.c +++ b/drivers/virt/coco/arm-cca-guest/arm-cca.c @@ -4,6 +4,7 @@ */ =20 #include +#include #include #include #include @@ -161,16 +162,12 @@ static const struct tsm_report_ops arm_cca_tsm_report= _ops =3D { .report_new =3D arm_cca_report_new, }; =20 -/** - * 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; =20 @@ -178,30 +175,33 @@ static int __init arm_cca_guest_init(void) return -ENODEV; =20 ret =3D tsm_report_register(&arm_cca_tsm_report_ops, NULL); - if (ret < 0) - pr_err("Error %d registering with TSM\n", ret); + if (ret < 0) { + dev_err_probe(&sdev->dev, ret, "Error registering with TSM\n"); + return ret; + } =20 - return ret; -} -module_init(arm_cca_guest_init); + ret =3D 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; + } =20 -/** - * 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_report_ops); + return 0; } -module_exit(arm_cca_guest_exit); =20 -/* modalias, so userspace can autoload this module when RSI is available */ -static const struct platform_device_id arm_cca_match[] __maybe_unused =3D { - { .name =3D RSI_PDEV_NAME }, - { } +static const struct arm_smccc_device_id cca_tsm_id_table[] =3D { + { .name =3D RSI_DEV_NAME }, + {} }; +MODULE_DEVICE_TABLE(arm_smccc, cca_tsm_id_table); =20 -MODULE_DEVICE_TABLE(platform, arm_cca_match); +static struct arm_smccc_driver cca_tsm_driver =3D { + .name =3D KBUILD_MODNAME, + .probe =3D cca_tsm_probe, + .id_table =3D 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"); diff --git a/include/linux/arm-rsi-cmds.h b/include/linux/arm-rsi-cmds.h index 13478e14c429..0e89213bb140 100644 --- a/include/linux/arm-rsi-cmds.h +++ b/include/linux/arm-rsi-cmds.h @@ -11,7 +11,6 @@ #include #include =20 -#define RSI_PDEV_NAME "arm-cca-dev" #ifdef CONFIG_ARM_RMM DECLARE_STATIC_KEY_FALSE(rsi_present); =20 diff --git a/include/linux/arm-smccc-rsi.h b/include/linux/arm-smccc-rsi.h index fddb77986f70..ae663aa8fd7f 100644 --- a/include/linux/arm-smccc-rsi.h +++ b/include/linux/arm-smccc-rsi.h @@ -8,6 +8,8 @@ =20 #include =20 +#define RSI_DEV_NAME "arm-rsi-dev" + /* * This file describes the Realm Services Interface (RSI) Application Bina= ry * Interface (ABI) for SMC calls made from within the Realm to the RMM and --=20 2.43.0 From nobody Sat Oct 3 04:23:40 2026 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 C03022DFF3F; Wed, 5 Aug 2026 06:33:57 +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=1785911638; cv=none; b=QcXXY16VDRNmZQT6Vp9Kwn10UPnBpxLK37BZcTXoGh5MXcqn0FiHk+qDkxtE66gJkz29cj0WJKTPsQjPRglQjX1SMw7vQSBO0ADTxuIwdhrKO6Trf2Z9tbY5trfUwsPE4mHx/A46yBipz6gl2a+5X1gSVZXKXGwmc36gRKM14s0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785911638; c=relaxed/simple; bh=FVU3xe5AGsX0viUa88nyk3HG7aw7BYeaV8MaPt27LHM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kZuxOkf6khaGr1T1xJRNnNGvnJ4V+rsyqk6As2ZORJ1I0WhY/obOueJ+kMcxyAfJsCI6BvJ01IlnuaH+ZpBBkwE3zWNSB3FrD69cB50oGHadlWxTNhPtZhNKlOpMtryaMLTOaDL5HAeGajMxjPBowtgUmfiahSGAXoH5ldr7ddU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=c7BC+S65; 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="c7BC+S65" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 93A9F1F00A3A; Wed, 5 Aug 2026 06:33:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785911637; bh=cMzTwklpBU3wy8+bD821q3bVysjk6E6RgXPyQwoMEUI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=c7BC+S65yQ/0cUKCl/iURyQNb6SIteogNCpEn3Z948en19f0J4h+YpG5mio+bKmMH JCpi5SBDAHDp2mONb9lMXvnnfdK8OgaeNHBXwFmLWLtvKG1q0vdZ+AkjUXxmeFxORU Ugo+TMuPBMqjDqI9yJbIq8Yb7v9tSw9UUXDm2XVoYiOx6vDjfdGon1HhAk4IOTDmTV v6+sVvyLWe83TO9HBEQ2e9IdPgnOjY5hLIxhOg+3sHS9+UVb5p9zNo38Lh7V+dGzit fhkW7Ko0F+qwqV7sAb0+p0wGCn+LXCRFbLMGc+On0LV+72d2QRUR8EHaULTT7UA6V0 YiJTvxXo4dI1Q== 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 , Andre Przywara , Suzuki K Poulose Subject: [PATCH v9 7/7] coco: guest: arm64: Replace dummy CCA device with sysfs ABI Date: Wed, 5 Aug 2026 12:02:55 +0530 Message-ID: <20260805063255.1638614-8-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260805063255.1638614-1-aneesh.kumar@kernel.org> References: <20260805063255.1638614-1-aneesh.kumar@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The SMCCC firmware driver now creates the arm-smccc platform device and instantiates the CCA RSI auxiliary devices once the RSI ABI is discovered. The arm64-specific arm-cca-dev platform device stub is therefore no longer needed. However, userspace has used the arm-cca-dev platform device to detect Arm CCA Realm guests [1]. Removing it without a replacement would break that detection and would also leave userspace depending on kernel device-model details. Add /sys/firmware/cca/realm_guest as a stable, architecture-provided ABI for detecting whether the kernel is running as an Arm CCA Realm guest. The file returns 1 in Realm world and 0 otherwise, similar to the existing s390 /sys/firmware/uv/prot_virt_guest interface for protected virtualization guests. Remove the dummy arm-cca-dev registration now that userspace has a dedicated CCA Realm guest indicator, and document the new ABI in Documentation/ABI/testing/sysfs-firmware-cca. [1] https://lore.kernel.org/all/4a7d84b2-2ec4-4773-a2d5-7b63d5c683cf@arm.com Acked-by: Suzuki K Poulose Signed-off-by: Aneesh Kumar K.V (Arm) --- Documentation/ABI/testing/sysfs-firmware-cca | 10 +++++ drivers/firmware/arm_rmm/rsi.c | 39 +++++++++++++++----- 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-firmware-cca diff --git a/Documentation/ABI/testing/sysfs-firmware-cca b/Documentation/A= BI/testing/sysfs-firmware-cca new file mode 100644 index 000000000000..bf177d636b92 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-firmware-cca @@ -0,0 +1,10 @@ +What: /sys/firmware/cca/realm_guest +Date: May 2026 +Contact: Linux ARM Kernel Mailing list +Description: Read-only. Indicates whether the kernel is running as an + Arm Confidential Compute Architecture (CCA) Realm guest. + + The value is one of: + + 0: the kernel is not running as a Realm guest + 1: the kernel is running as a Realm guest diff --git a/drivers/firmware/arm_rmm/rsi.c b/drivers/firmware/arm_rmm/rsi.c index 2dd69febedbd..6bb315faecd7 100644 --- a/drivers/firmware/arm_rmm/rsi.c +++ b/drivers/firmware/arm_rmm/rsi.c @@ -9,12 +9,15 @@ #include #include #include +#include +#include =20 #include #include #include =20 static struct realm_config config; +static struct kobject *cca_kobj; =20 unsigned long prot_ns_shared; EXPORT_SYMBOL(prot_ns_shared); @@ -182,17 +185,33 @@ void __init arm64_rsi_init(void) static_branch_enable(&rsi_present); } =20 -static struct platform_device rsi_dev =3D { - .name =3D "arm-cca-dev", - .id =3D PLATFORM_DEVID_NONE +static ssize_t cca_is_realm_guest(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sysfs_emit(buf, "%d\n", is_realm_world()); +} + +static struct kobj_attribute cca_realm_guest =3D + __ATTR(realm_guest, 0444, cca_is_realm_guest, NULL); + +static const struct attribute *cca_realm_attrs[] =3D { + &cca_realm_guest.attr, + NULL, }; =20 -static int __init arm64_create_dummy_rsi_dev(void) +static int __init realm_sysfs_init(void) { - if (is_realm_world() && - platform_device_register(&rsi_dev)) - pr_err("failed to register rsi platform device\n"); - return 0; -} + int ret; + + cca_kobj =3D kobject_create_and_add("cca", firmware_kobj); + if (!cca_kobj) + return -ENOMEM; + + ret =3D sysfs_create_files(cca_kobj, cca_realm_attrs); + if (!ret) + return 0; =20 -arch_initcall(arm64_create_dummy_rsi_dev) + kobject_put(cca_kobj); + return ret; +} +device_initcall(realm_sysfs_init); --=20 2.43.0