From: Jan Kiszka <[email protected]>

In case optee_bind_services is invoked more than once successfully, make
sure that already bound services are not rebound, creating multiple
instances of themselves. When introducing RPMB-driven service scanning
this scenario could pop up.

Signed-off-by: Jan Kiszka <[email protected]>
---
 drivers/tee/optee/core.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
index 2871760a7b7..e8ba8f6cddd 100644
--- a/drivers/tee/optee/core.c
+++ b/drivers/tee/optee/core.c
@@ -83,6 +83,7 @@ static int bind_service_list(struct udevice *dev, struct 
tee_shm *service_list,
 {
        const struct tee_optee_ta_uuid *service_uuid = (const void 
*)service_list->addr;
        struct optee_service *service;
+       struct udevice *service_dev;
        size_t idx;
        int ret;
 
@@ -91,6 +92,11 @@ static int bind_service_list(struct udevice *dev, struct 
tee_shm *service_list,
                if (!service)
                        continue;
 
+               ret = device_find_child_by_name(dev, service->driver_name,
+                                               &service_dev);
+               if (!ret && dev_get_flags(service_dev) & DM_FLAG_BOUND)
+                       continue;
+
                ret = device_bind_driver_to_node(dev, service->driver_name, 
service->driver_name,
                                                 dev_ofnode(dev), NULL);
                if (ret) {
-- 
2.47.3

Reply via email to