ti: k3: drivers: sec_proxy: Allow clearing a Secure Proxy receive thread
authorAndrew F. Davis <afd@ti.com>
Fri, 4 Jan 2019 18:44:00 +0000 (12:44 -0600)
committerAndrew F. Davis <afd@ti.com>
Mon, 21 Jan 2019 19:33:32 +0000 (13:33 -0600)
It can be needed to discard all messages in a receive queue. This
can be used during some error recovery situations.

Signed-off-by: Andrew F. Davis <afd@ti.com>
Acked-by: Nishanth Menon <nm@ti.com>
plat/ti/k3/common/drivers/sec_proxy/sec_proxy.c
plat/ti/k3/common/drivers/sec_proxy/sec_proxy.h

index 5dd54d4ff3a53dc5a4d2a6a28984b77a0fc5b6a9..4924b13b9d32b56fcd919fd2a4476e027886763a 100644 (file)
@@ -162,6 +162,44 @@ static inline int k3_sec_proxy_verify_thread(struct k3_sec_proxy_thread *spt,
        return 0;
 }
 
+/**
+ * k3_sec_proxy_clear_rx_thread() - Clear Secure Proxy thread
+ *
+ * @id: Channel Identifier
+ *
+ * Return: 0 if all goes well, else appropriate error message
+ */
+int k3_sec_proxy_clear_rx_thread(enum k3_sec_proxy_chan_id id)
+{
+       struct k3_sec_proxy_thread *spt = &spm.threads[id];
+
+       /* Check for any errors already available */
+       if (mmio_read_32(spt->rt + RT_THREAD_STATUS) &
+           RT_THREAD_STATUS_ERROR_MASK) {
+               ERROR("Thread %d is corrupted, cannot send data\n", spt->id);
+               return -EINVAL;
+       }
+
+       /* Make sure thread is configured for right direction */
+       if (!(mmio_read_32(spt->scfg + SCFG_THREAD_CTRL) & SCFG_THREAD_CTRL_DIR_MASK)) {
+               ERROR("Cannot clear a transmit thread %d\n", spt->id);
+               return -EINVAL;
+       }
+
+       /* Read off messages from thread until empty */
+       uint32_t try_count = 10;
+       while (mmio_read_32(spt->rt + RT_THREAD_STATUS) & RT_THREAD_STATUS_CUR_CNT_MASK) {
+               if (!(try_count--)) {
+                       ERROR("Could not clear all messages from thread %d\n", spt->id);
+                       return -ETIMEDOUT;
+               }
+               WARN("Clearing message from thread %d\n", spt->id);
+               mmio_read_32(spt->data + spm.desc.data_end_offset);
+       }
+
+       return 0;
+}
+
 /**
  * k3_sec_proxy_send() - Send data over a Secure Proxy thread
  * @id: Channel Identifier
index 2d987f83a61c0eda409db4af32bdfa56f9752e3c..6c4f5dfffa7edcdbe380981368d7e5e937d66e12 100644 (file)
@@ -37,6 +37,15 @@ struct k3_sec_proxy_msg {
        uint8_t *buf;
 };
 
+/**
+ * k3_sec_proxy_send() - Send data over a Secure Proxy thread
+ * @id: Channel Identifier
+ * @msg: Pointer to k3_sec_proxy_msg
+ *
+ * Return: 0 if all goes well, else appropriate error message
+ */
+int k3_sec_proxy_clear_rx_thread(enum k3_sec_proxy_chan_id id);
+
 /**
  * k3_sec_proxy_send() - Send data over a Secure Proxy thread
  * @id: Channel Identifier