| From ba060423ff7ba12aaaa6a0ce353a85d0d2266489 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 2 Nov 2023 13:00:55 +0530 |
| Subject: tee: optee: Fix supplicant based device enumeration |
| |
| From: Sumit Garg <sumit.garg@linaro.org> |
| |
| [ Upstream commit 7269cba53d906cf257c139d3b3a53ad272176bca ] |
| |
| Currently supplicant dependent optee device enumeration only registers |
| devices whenever tee-supplicant is invoked for the first time. But it |
| forgets to remove devices when tee-supplicant daemon stops running and |
| closes its context gracefully. This leads to following error for fTPM |
| driver during reboot/shutdown: |
| |
| [ 73.466791] tpm tpm0: ftpm_tee_tpm_op_send: SUBMIT_COMMAND invoke error: 0xffff3024 |
| |
| Fix this by adding an attribute for supplicant dependent devices so that |
| the user-space service can detect and detach supplicant devices before |
| closing the supplicant: |
| |
| $ for dev in /sys/bus/tee/devices/*; do if [[ -f "$dev/need_supplicant" && -f "$dev/driver/unbind" ]]; \ |
| then echo $(basename "$dev") > $dev/driver/unbind; fi done |
| |
| Reported-by: Jan Kiszka <jan.kiszka@siemens.com> |
| Closes: https://github.com/OP-TEE/optee_os/issues/6094 |
| Fixes: 5f178bb71e3a ("optee: enable support for multi-stage bus enumeration") |
| Signed-off-by: Sumit Garg <sumit.garg@linaro.org> |
| Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> |
| Acked-by: Jerome Forissier <jerome.forissier@linaro.org> |
| [jw: fixed up Date documentation] |
| Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../ABI/testing/sysfs-bus-optee-devices | 9 +++++++++ |
| drivers/tee/optee/device.c | 17 +++++++++++++++-- |
| 2 files changed, 24 insertions(+), 2 deletions(-) |
| |
| diff --git a/Documentation/ABI/testing/sysfs-bus-optee-devices b/Documentation/ABI/testing/sysfs-bus-optee-devices |
| index 0f58701367b66..af31e5a22d89f 100644 |
| --- a/Documentation/ABI/testing/sysfs-bus-optee-devices |
| +++ b/Documentation/ABI/testing/sysfs-bus-optee-devices |
| @@ -6,3 +6,12 @@ Description: |
| OP-TEE bus provides reference to registered drivers under this directory. The <uuid> |
| matches Trusted Application (TA) driver and corresponding TA in secure OS. Drivers |
| are free to create needed API under optee-ta-<uuid> directory. |
| + |
| +What: /sys/bus/tee/devices/optee-ta-<uuid>/need_supplicant |
| +Date: November 2023 |
| +KernelVersion: 6.7 |
| +Contact: op-tee@lists.trustedfirmware.org |
| +Description: |
| + Allows to distinguish whether an OP-TEE based TA/device requires user-space |
| + tee-supplicant to function properly or not. This attribute will be present for |
| + devices which depend on tee-supplicant to be running. |
| diff --git a/drivers/tee/optee/device.c b/drivers/tee/optee/device.c |
| index 64f0e047c23d2..4b10921276942 100644 |
| --- a/drivers/tee/optee/device.c |
| +++ b/drivers/tee/optee/device.c |
| @@ -60,7 +60,16 @@ static void optee_release_device(struct device *dev) |
| kfree(optee_device); |
| } |
| |
| -static int optee_register_device(const uuid_t *device_uuid) |
| +static ssize_t need_supplicant_show(struct device *dev, |
| + struct device_attribute *attr, |
| + char *buf) |
| +{ |
| + return 0; |
| +} |
| + |
| +static DEVICE_ATTR_RO(need_supplicant); |
| + |
| +static int optee_register_device(const uuid_t *device_uuid, u32 func) |
| { |
| struct tee_client_device *optee_device = NULL; |
| int rc; |
| @@ -83,6 +92,10 @@ static int optee_register_device(const uuid_t *device_uuid) |
| put_device(&optee_device->dev); |
| } |
| |
| + if (func == PTA_CMD_GET_DEVICES_SUPP) |
| + device_create_file(&optee_device->dev, |
| + &dev_attr_need_supplicant); |
| + |
| return rc; |
| } |
| |
| @@ -142,7 +155,7 @@ static int __optee_enumerate_devices(u32 func) |
| num_devices = shm_size / sizeof(uuid_t); |
| |
| for (idx = 0; idx < num_devices; idx++) { |
| - rc = optee_register_device(&device_uuid[idx]); |
| + rc = optee_register_device(&device_uuid[idx], func); |
| if (rc) |
| goto out_shm; |
| } |
| -- |
| 2.42.0 |
| |