|
@@ -202,6 +202,13 @@ static void caam_jr_dequeue(unsigned long devarg)
|
|
|
userdesc = jrp->entinfo[sw_idx].desc_addr_virt;
|
|
|
userstatus = jrp->outring[hw_idx].jrstatus;
|
|
|
|
|
|
+ /*
|
|
|
+ * Make sure all information from the job has been obtained
|
|
|
+ * before telling CAAM that the job has been removed from the
|
|
|
+ * output ring.
|
|
|
+ */
|
|
|
+ mb();
|
|
|
+
|
|
|
/* set done */
|
|
|
wr_reg32(&jrp->rregs->outring_rmvd, 1);
|
|
|
|
|
@@ -351,12 +358,23 @@ int caam_jr_enqueue(struct device *dev, u32 *desc,
|
|
|
|
|
|
jrp->inpring[jrp->inp_ring_write_index] = desc_dma;
|
|
|
|
|
|
+ /*
|
|
|
+ * Guarantee that the descriptor's DMA address has been written to
|
|
|
+ * the next slot in the ring before the write index is updated, since
|
|
|
+ * other cores may update this index independently.
|
|
|
+ */
|
|
|
smp_wmb();
|
|
|
|
|
|
jrp->inp_ring_write_index = (jrp->inp_ring_write_index + 1) &
|
|
|
(JOBR_DEPTH - 1);
|
|
|
jrp->head = (head + 1) & (JOBR_DEPTH - 1);
|
|
|
|
|
|
+ /*
|
|
|
+ * Ensure that all job information has been written before
|
|
|
+ * notifying CAAM that a new job was added to the input ring.
|
|
|
+ */
|
|
|
+ wmb();
|
|
|
+
|
|
|
wr_reg32(&jrp->rregs->inpring_jobadd, 1);
|
|
|
|
|
|
spin_unlock_bh(&jrp->inplock);
|