Commit 7269cba5 authored by Sumit Garg's avatar Sumit Garg Committed by Jens Wiklander

tee: optee: Fix supplicant based device enumeration

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: default avatarJan Kiszka <jan.kiszka@siemens.com>
Closes: https://github.com/OP-TEE/optee_os/issues/6094
Fixes: 5f178bb7 ("optee: enable support for multi-stage bus enumeration")
Signed-off-by: default avatarSumit Garg <sumit.garg@linaro.org>
Reviewed-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
Acked-by: default avatarJerome Forissier <jerome.forissier@linaro.org>
[jw: fixed up Date documentation]
Signed-off-by: default avatarJens Wiklander <jens.wiklander@linaro.org>
parent ffc25326
...@@ -6,3 +6,12 @@ Description: ...@@ -6,3 +6,12 @@ Description:
OP-TEE bus provides reference to registered drivers under this directory. The <uuid> 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 matches Trusted Application (TA) driver and corresponding TA in secure OS. Drivers
are free to create needed API under optee-ta-<uuid> directory. 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.
...@@ -60,7 +60,16 @@ static void optee_release_device(struct device *dev) ...@@ -60,7 +60,16 @@ static void optee_release_device(struct device *dev)
kfree(optee_device); 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; struct tee_client_device *optee_device = NULL;
int rc; int rc;
...@@ -83,6 +92,10 @@ static int optee_register_device(const uuid_t *device_uuid) ...@@ -83,6 +92,10 @@ static int optee_register_device(const uuid_t *device_uuid)
put_device(&optee_device->dev); put_device(&optee_device->dev);
} }
if (func == PTA_CMD_GET_DEVICES_SUPP)
device_create_file(&optee_device->dev,
&dev_attr_need_supplicant);
return rc; return rc;
} }
...@@ -142,7 +155,7 @@ static int __optee_enumerate_devices(u32 func) ...@@ -142,7 +155,7 @@ static int __optee_enumerate_devices(u32 func)
num_devices = shm_size / sizeof(uuid_t); num_devices = shm_size / sizeof(uuid_t);
for (idx = 0; idx < num_devices; idx++) { for (idx = 0; idx < num_devices; idx++) {
rc = optee_register_device(&device_uuid[idx]); rc = optee_register_device(&device_uuid[idx], func);
if (rc) if (rc)
goto out_shm; goto out_shm;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment