1 // SPDX-License-Identifier: GPL-2.0
3 #include <asm/mmu_context.h>
4 #include <asm/cache_insns.h>
5 #include <asm/cacheflush.h>
9 * Write back the dirty D-caches, but not invalidate them.
11 * START: Virtual Address (U0, P1, or P3)
12 * SIZE: Size of the region.
14 static void sh4__flush_wback_region(void *start
, int size
)
16 reg_size_t aligned_start
, v
, cnt
, end
;
18 aligned_start
= register_align(start
);
19 v
= aligned_start
& ~(L1_CACHE_BYTES
-1);
20 end
= (aligned_start
+ size
+ L1_CACHE_BYTES
-1)
21 & ~(L1_CACHE_BYTES
-1);
22 cnt
= (end
- v
) / L1_CACHE_BYTES
;
25 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
26 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
27 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
28 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
29 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
30 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
31 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
32 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
37 __ocbwb(v
); v
+= L1_CACHE_BYTES
;
43 * Write back the dirty D-caches and invalidate them.
45 * START: Virtual Address (U0, P1, or P3)
46 * SIZE: Size of the region.
48 static void sh4__flush_purge_region(void *start
, int size
)
50 reg_size_t aligned_start
, v
, cnt
, end
;
52 aligned_start
= register_align(start
);
53 v
= aligned_start
& ~(L1_CACHE_BYTES
-1);
54 end
= (aligned_start
+ size
+ L1_CACHE_BYTES
-1)
55 & ~(L1_CACHE_BYTES
-1);
56 cnt
= (end
- v
) / L1_CACHE_BYTES
;
59 __ocbp(v
); v
+= L1_CACHE_BYTES
;
60 __ocbp(v
); v
+= L1_CACHE_BYTES
;
61 __ocbp(v
); v
+= L1_CACHE_BYTES
;
62 __ocbp(v
); v
+= L1_CACHE_BYTES
;
63 __ocbp(v
); v
+= L1_CACHE_BYTES
;
64 __ocbp(v
); v
+= L1_CACHE_BYTES
;
65 __ocbp(v
); v
+= L1_CACHE_BYTES
;
66 __ocbp(v
); v
+= L1_CACHE_BYTES
;
70 __ocbp(v
); v
+= L1_CACHE_BYTES
;
76 * No write back please
78 static void sh4__flush_invalidate_region(void *start
, int size
)
80 reg_size_t aligned_start
, v
, cnt
, end
;
82 aligned_start
= register_align(start
);
83 v
= aligned_start
& ~(L1_CACHE_BYTES
-1);
84 end
= (aligned_start
+ size
+ L1_CACHE_BYTES
-1)
85 & ~(L1_CACHE_BYTES
-1);
86 cnt
= (end
- v
) / L1_CACHE_BYTES
;
89 __ocbi(v
); v
+= L1_CACHE_BYTES
;
90 __ocbi(v
); v
+= L1_CACHE_BYTES
;
91 __ocbi(v
); v
+= L1_CACHE_BYTES
;
92 __ocbi(v
); v
+= L1_CACHE_BYTES
;
93 __ocbi(v
); v
+= L1_CACHE_BYTES
;
94 __ocbi(v
); v
+= L1_CACHE_BYTES
;
95 __ocbi(v
); v
+= L1_CACHE_BYTES
;
96 __ocbi(v
); v
+= L1_CACHE_BYTES
;
101 __ocbi(v
); v
+= L1_CACHE_BYTES
;
106 void __init
sh4__flush_region_init(void)
108 __flush_wback_region
= sh4__flush_wback_region
;
109 __flush_invalidate_region
= sh4__flush_invalidate_region
;
110 __flush_purge_region
= sh4__flush_purge_region
;