]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
feat(ti): synchronize access to secure proxy threads
authorAndrew Davis <afd@ti.com>
Mon, 13 Mar 2023 18:56:27 +0000 (13:56 -0500)
committerAndrew Davis <afd@ti.com>
Thu, 30 Mar 2023 15:19:21 +0000 (10:19 -0500)
When communicating with the system controller over secure proxy we clear
a thread, write our message, then wait for a response. This must not be
interrupted by a different transfer on the same thread. Take a lock
during this sequence to prevent contention.

Signed-off-by: Andrew Davis <afd@ti.com>
Change-Id: I7789f017fde7180ab6b4ac07458464b967c8e580

plat/ti/k3/common/drivers/ti_sci/ti_sci.c

index f0529d07ad792fb6182993ee5c23fdcbee4bcb8c..dacef74204972c31862ee46c0a5d5a6c44039ca7 100644 (file)
@@ -13,6 +13,7 @@
 #include <string.h>
 
 #include <platform_def.h>
+#include <lib/bakery_lock.h>
 
 #include <common/debug.h>
 #include <sec_proxy.h>
@@ -25,6 +26,8 @@ __section(".tzfw_coherent_mem")
 #endif
 static uint8_t message_sequence;
 
+DEFINE_BAKERY_LOCK(ti_sci_xfer_lock);
+
 /**
  * struct ti_sci_xfer - Structure representing a message flow
  * @tx_message:        Transmit message
@@ -146,6 +149,8 @@ static int ti_sci_do_xfer(struct ti_sci_xfer *xfer)
        struct k3_sec_proxy_msg *rx_msg = &xfer->rx_message;
        int ret;
 
+       bakery_lock_get(&ti_sci_xfer_lock);
+
        /* Clear any spurious messages in receive queue */
        ret = k3_sec_proxy_clear_rx_thread(SP_RESPONSE);
        if (ret) {
@@ -169,6 +174,8 @@ static int ti_sci_do_xfer(struct ti_sci_xfer *xfer)
                }
        }
 
+       bakery_lock_release(&ti_sci_xfer_lock);
+
        return 0;
 }