These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / crypto / caam / jr.c
index b8b5d47..f7e0d8d 100644 (file)
@@ -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);
@@ -392,18 +410,17 @@ static int caam_jr_init(struct device *dev)
                goto out_free_irq;
 
        error = -ENOMEM;
-       jrp->inpring = dma_alloc_coherent(dev, sizeof(dma_addr_t) * JOBR_DEPTH,
-                                         &inpbusaddr, GFP_KERNEL);
+       jrp->inpring = dma_alloc_coherent(dev, sizeof(*jrp->inpring) *
+                                         JOBR_DEPTH, &inpbusaddr, GFP_KERNEL);
        if (!jrp->inpring)
                goto out_free_irq;
 
-       jrp->outring = dma_alloc_coherent(dev, sizeof(struct jr_outentry) *
+       jrp->outring = dma_alloc_coherent(dev, sizeof(*jrp->outring) *
                                          JOBR_DEPTH, &outbusaddr, GFP_KERNEL);
        if (!jrp->outring)
                goto out_free_inpring;
 
-       jrp->entinfo = kzalloc(sizeof(struct caam_jrentry_info) * JOBR_DEPTH,
-                              GFP_KERNEL);
+       jrp->entinfo = kcalloc(JOBR_DEPTH, sizeof(*jrp->entinfo), GFP_KERNEL);
        if (!jrp->entinfo)
                goto out_free_outring;
 
@@ -461,8 +478,7 @@ static int caam_jr_probe(struct platform_device *pdev)
        int error;
 
        jrdev = &pdev->dev;
-       jrpriv = devm_kmalloc(jrdev, sizeof(struct caam_drv_private_jr),
-                             GFP_KERNEL);
+       jrpriv = devm_kmalloc(jrdev, sizeof(*jrpriv), GFP_KERNEL);
        if (!jrpriv)
                return -ENOMEM;