+ uint32_t linelen = armv7a_cache->dminline;
+ uint32_t va_line, va_end;
+ int retval, i = 0;
+
+ retval = armv7a_l1_d_cache_sanity_check(target);
+ if (retval != ERROR_OK)
+ return retval;
+
+ retval = dpm->prepare(dpm);
+ if (retval != ERROR_OK)
+ goto done;
+
+ va_line = virt & (-linelen);
+ va_end = virt + size;
+
+ while (va_line < va_end) {
+ if ((i++ & 0x3f) == 0)
+ keep_alive();
+ /* DCCMVAC - Data Cache Clean by MVA to PoC */
+ retval = dpm->instr_write_data_r0(dpm,
+ ARMV4_5_MCR(15, 0, 0, 7, 10, 1), va_line);
+ if (retval != ERROR_OK)
+ goto done;
+ va_line += linelen;
+ }
+
+ keep_alive();
+ dpm->finish(dpm);
+ return retval;
+
+done:
+ LOG_ERROR("d-cache invalidate failed");
+ keep_alive();
+ dpm->finish(dpm);
+
+ return retval;
+}
+
+int armv7a_l1_d_cache_flush_virt(struct target *target, uint32_t virt,
+ unsigned int size)
+{
+ struct armv7a_common *armv7a = target_to_armv7a(target);
+ struct arm_dpm *dpm = armv7a->arm.dpm;
+ struct armv7a_cache_common *armv7a_cache = &armv7a->armv7a_mmu.armv7a_cache;
+ uint32_t linelen = armv7a_cache->dminline;
+ uint32_t va_line, va_end;
+ int retval, i = 0;