/* FIXME: only update enc_len field */
        if (!sreq->skip_ctx) {
-               memcpy(engine->sram, &sreq->op, sizeof(sreq->op));
+               memcpy_toio(engine->sram, &sreq->op, sizeof(sreq->op));
                sreq->skip_ctx = true;
        } else {
-               memcpy(engine->sram, &sreq->op, sizeof(sreq->op.desc));
+               memcpy_toio(engine->sram, &sreq->op, sizeof(sreq->op.desc));
        }
 
        mv_cesa_set_int_mask(engine, CESA_SA_INT_ACCEL0_DONE);
        if (ret)
                return ret;
 
-       memcpy(ablkreq->info, engine->sram + CESA_SA_CRYPT_IV_SRAM_OFFSET,
-              crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(ablkreq)));
+       memcpy_fromio(ablkreq->info,
+                     engine->sram + CESA_SA_CRYPT_IV_SRAM_OFFSET,
+                     crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(ablkreq)));
 
        return 0;
 }
        sreq->size = 0;
        sreq->offset = 0;
        mv_cesa_adjust_op(engine, &sreq->op);
-       memcpy(engine->sram, &sreq->op, sizeof(sreq->op));
+       memcpy_toio(engine->sram, &sreq->op, sizeof(sreq->op));
 }
 
 static inline void mv_cesa_ablkcipher_prepare(struct crypto_async_request *req,
 
        size_t  len;
 
        if (creq->cache_ptr)
-               memcpy(engine->sram + CESA_SA_DATA_SRAM_OFFSET, creq->cache,
-                      creq->cache_ptr);
+               memcpy_toio(engine->sram + CESA_SA_DATA_SRAM_OFFSET,
+                           creq->cache, creq->cache_ptr);
 
        len = min_t(size_t, req->nbytes + creq->cache_ptr - sreq->offset,
                    CESA_SA_SRAM_PAYLOAD_SIZE);
                        if (len + trailerlen > CESA_SA_SRAM_PAYLOAD_SIZE) {
                                len &= CESA_HASH_BLOCK_SIZE_MSK;
                                new_cache_ptr = 64 - trailerlen;
-                               memcpy(creq->cache,
-                                      engine->sram +
-                                      CESA_SA_DATA_SRAM_OFFSET + len,
-                                      new_cache_ptr);
+                               memcpy_fromio(creq->cache,
+                                             engine->sram +
+                                             CESA_SA_DATA_SRAM_OFFSET + len,
+                                             new_cache_ptr);
                        } else {
                                len += mv_cesa_ahash_pad_req(creq,
                                                engine->sram + len +
        mv_cesa_update_op_cfg(op, frag_mode, CESA_SA_DESC_CFG_FRAG_MSK);
 
        /* FIXME: only update enc_len field */
-       memcpy(engine->sram, op, sizeof(*op));
+       memcpy_toio(engine->sram, op, sizeof(*op));
 
        if (frag_mode == CESA_SA_DESC_CFG_FIRST_FRAG)
                mv_cesa_update_op_cfg(op, CESA_SA_DESC_CFG_MID_FRAG,
 
        sreq->offset = 0;
        mv_cesa_adjust_op(engine, &creq->op_tmpl);
-       memcpy(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
+       memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
 }
 
 static void mv_cesa_ahash_step(struct crypto_async_request *req)