diff options
author | Andrew F. Davis <afd@ti.com> | 2019-01-04 12:44:00 -0600 |
---|---|---|
committer | Andrew F. Davis <afd@ti.com> | 2019-01-21 13:33:32 -0600 |
commit | 2004552e62cb178a2b633e84371e459955aad150 (patch) | |
tree | 7a82018719f231ca823b5a56dbf8b058b3cab6c6 /plat/ti | |
parent | c40c88f81b7fb7c78e8f491b462f29814337dcf5 (diff) |
ti: k3: drivers: sec_proxy: Allow clearing a Secure Proxy receive thread
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>
Diffstat (limited to 'plat/ti')
-rw-r--r-- | plat/ti/k3/common/drivers/sec_proxy/sec_proxy.c | 38 | ||||
-rw-r--r-- | plat/ti/k3/common/drivers/sec_proxy/sec_proxy.h | 9 |
2 files changed, 47 insertions, 0 deletions
diff --git a/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.c b/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.c index 5dd54d4f..4924b13b 100644 --- a/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.c +++ b/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.c @@ -163,6 +163,44 @@ static inline int k3_sec_proxy_verify_thread(struct k3_sec_proxy_thread *spt, } /** + * 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 * @msg: Pointer to k3_sec_proxy_msg diff --git a/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.h b/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.h index 2d987f83..6c4f5dff 100644 --- a/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.h +++ b/plat/ti/k3/common/drivers/sec_proxy/sec_proxy.h @@ -44,6 +44,15 @@ struct 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 + * @msg: Pointer to k3_sec_proxy_msg + * + * Return: 0 if all goes well, else appropriate error message + */ int k3_sec_proxy_send(enum k3_sec_proxy_chan_id id, const struct k3_sec_proxy_msg *msg); /** |