|
|
@@ -271,6 +271,14 @@ static void scmi_tx_prepare(struct mbox_client *cl, void *m)
|
|
|
struct scmi_chan_info *cinfo = client_to_scmi_chan_info(cl);
|
|
|
struct scmi_shared_mem __iomem *mem = cinfo->payload;
|
|
|
|
|
|
+ /*
|
|
|
+ * Ideally channel must be free by now unless OS timeout last
|
|
|
+ * request and platform continued to process the same, wait
|
|
|
+ * until it releases the shared memory, otherwise we may endup
|
|
|
+ * overwriting its response with new message payload or vice-versa
|
|
|
+ */
|
|
|
+ spin_until_cond(ioread32(&mem->channel_status) &
|
|
|
+ SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE);
|
|
|
/* Mark channel busy + clear error */
|
|
|
iowrite32(0x0, &mem->channel_status);
|
|
|
iowrite32(t->hdr.poll_completion ? 0 : SCMI_SHMEM_FLAG_INTR_ENABLED,
|