summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2016-07-02 18:52:44 +0200
committerPavel Pisa <pisa@cmp.felk.cvut.cz>2016-07-04 15:55:57 +0200
commit2d5902d6aedb45ea4139a7e291f7edebe8b5fc18 (patch)
tree6f750c1472cbac9e5f25776f189924cd2c9ab77d
parentscore/arm: Ensure that copile time alignment is 64 bytes for Cortex-A multilib. (diff)
downloadrtems-2d5902d6aedb45ea4139a7e291f7edebe8b5fc18.tar.bz2
arm/raspberrypi: update VideoCore cache flush workaround to work on RPi2.
The arm_cp15_data_cache_clean_and_invalidate leads to hang on RPi2, clean by individual lines works on RPi1 and RPi2.
-rw-r--r--c/src/lib/libbsp/arm/raspberrypi/misc/vc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c b/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c
index 7bc17ba797..0bec0c2dab 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c
+++ b/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c
@@ -73,9 +73,20 @@ static inline void bcm2835_mailbox_buffer_flush_and_invalidate(
*/
rtems_cache_flush_multiple_data_lines( buf, size );
rtems_cache_invalidate_multiple_data_lines( buf, size );
-#else
- /* Flush complete data cache */
+#elif 0
+ /* Flush complete data cache, does not work on RPi2 for some reason */
arm_cp15_data_cache_clean_and_invalidate();
+#else
+ /*
+ * This is temporal workaround for missing cache meanager
+ * which works on RPi2
+ */
+ size += (uintptr_t)buf & ~63;
+ size = (size + 63) & ~63;
+ while ( size ) {
+ size -= 32;
+ arm_cp15_data_cache_clean_and_invalidate_line(buf);
+ }
#endif
}
}