Add cache coherency support to the CAAM scatterlist implementation.

Signed-off-by: Victoria Milhoan <vicki.milh...@freescale.com>
---
 drivers/crypto/caam/sg_sw_sec4.h | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/caam/sg_sw_sec4.h b/drivers/crypto/caam/sg_sw_sec4.h
index 6365585..6730b01 100644
--- a/drivers/crypto/caam/sg_sw_sec4.h
+++ b/drivers/crypto/caam/sg_sw_sec4.h
@@ -91,9 +91,14 @@ static int dma_map_sg_chained(struct device *dev, struct 
scatterlist *sg,
 {
        if (unlikely(chained)) {
                int i;
+       struct scatterlist *tsg = sg;
+
+       /* We use a local copy of the sg pointer to avoid moving the
+        * head of the list pointed to by sg as we wall the list.
+        */
                for (i = 0; i < nents; i++) {
-                       dma_map_sg(dev, sg, 1, dir);
-                       sg = sg_next(sg);
+                       dma_map_sg(dev, tsg, 1, dir);
+                       tsg = scatterwalk_sg_next(tsg);
                }
        } else {
                dma_map_sg(dev, sg, nents, dir);
@@ -106,6 +111,9 @@ static int dma_unmap_sg_chained(struct device *dev, struct 
scatterlist *sg,
                                unsigned int nents, enum dma_data_direction dir,
                                bool chained)
 {
+       if ((dir == DMA_FROM_DEVICE) || (dir == DMA_BIDIRECTIONAL))
+               dma_sync_sg_for_cpu(dev, sg, nents, dir);
+
        if (unlikely(chained)) {
                int i;
                for (i = 0; i < nents; i++) {
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to