Re: [PATCH v11 2/7] firmware: hwrng: arm_smccc_trng: Register as an SMCCC device
From: Jonathan Cameron <hidden>
Date: 2026-09-14 20:39:57
Also in:
linux-coco, lkml
On Mon, 14 Sep 2026 11:35:06 +0530 "Aneesh Kumar K.V (Arm)" [off-list ref] wrote:
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. Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Tested-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
Trivial stuff inline - nothing that needs changes Reviewed-by: Jonathan Cameron <redacted>
quoted hunk ↗ jump to hunk
diff --git a/drivers/firmware/smccc/smccc.c b/drivers/firmware/smccc/smccc.c index bdee057db2fd..756c79204e44 100644 --- a/drivers/firmware/smccc/smccc.c +++ b/drivers/firmware/smccc/smccc.c
+
+static const struct smccc_device_info smccc_devices[] __initconst = {Ah. With __init_const I suspect the string constant stuff I mentioned in previous patch won't work anyway.
+ {
+ .func_id = ARM_SMCCC_TRNG_VERSION,
+ .requires_smc = false,
+ .device_name = "arm-smccc-trng",
+ },
+};
+
+static bool __init smccc_probe_smccc_device(const struct smccc_device_info *smccc_dev)
+{
+ int ret;
+ struct arm_smccc_res res = {};
+
+ if (smccc_conduit == SMCCC_CONDUIT_NONE)
+ return false;
+
+ if (smccc_dev->requires_smc && smccc_conduit != SMCCC_CONDUIT_SMC)
+ return false;
+
+ if (IS_ENABLED(CONFIG_ARM) && ARM_SMCCC_IS_64(smccc_dev->func_id))
+ return false;
+
+ arm_smccc_1_1_invoke(smccc_dev->func_id,
+ 0, 0, 0, 0, 0, 0, 0, &res);Fits on one line. Up to you though as maybe it's cleaner to have all the numbers start on a new row.
+ ret = res.a0;
+
+ if (ret == SMCCC_RET_NOT_SUPPORTED)
+ return false;
+
+ return true;
+}
+
static int __init smccc_devices_init(void)
{
- struct platform_device *pdev;
-
- if (smccc_trng_available) {
- pdev = 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 = 0; i < ARRAY_SIZE(smccc_devices); i++) {
+ smccc_dev = &smccc_devices[i];
+
+ if (!smccc_probe_smccc_device(smccc_dev))
+ continue;
+
+ sdev = arm_smccc_device_register(smccc_dev->device_name, smccc_dev->func_id);
+ if (IS_ERR(sdev))
+ pr_err("%s: could not register device: %ld\n",
+ smccc_dev->device_name, PTR_ERR(sdev));Could be friendly to anyone reading this and use %pe. Up to you.
} return 0;