aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/mm/init.c
diff options
context:
space:
mode:
authorPaul Burton <paul.burton@imgtec.com>2014-07-14 05:32:15 -0400
committerRalf Baechle <ralf@linux-mips.org>2014-08-01 18:06:46 -0400
commitab9988a3dafb8c94c2a19637fb00f7d1db799347 (patch)
tree6c564bb08c92d79fcad07b8add4c555842ba3246 /arch/mips/mm/init.c
parent1f6c52ff7225789d20c1d69883f263d502b7eda7 (diff)
MIPS: Initialise MAARs
Add initialisation for Memory Accessibility Attribute Registers. Generic code cannot know the platform-specific requirements with regards to speculative accesses, so it simply calls a platform_maar_init function which platforms with MAARs are expected to implement by calling the provided write_maar_pair function & returning the number of MAAR pairs used. A weak default implementation will simply use no MAAR pairs. Any present but unused MAAR pairs are then marked invalid, effectively disabling them. The end result of this patch is that MAARs are all marked invalid, until platforms implement the platform_maar_init function. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/7331/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/mm/init.c')
-rw-r--r--arch/mips/mm/init.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 6e4413330e36..571aab064936 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -325,6 +325,38 @@ static inline void mem_init_free_highmem(void)
325#endif 325#endif
326} 326}
327 327
328unsigned __weak platform_maar_init(unsigned num_maars)
329{
330 return 0;
331}
332
333static void maar_init(void)
334{
335 unsigned num_maars, used, i;
336
337 if (!cpu_has_maar)
338 return;
339
340 /* Detect the number of MAARs */
341 write_c0_maari(~0);
342 back_to_back_c0_hazard();
343 num_maars = read_c0_maari() + 1;
344
345 /* MAARs should be in pairs */
346 WARN_ON(num_maars % 2);
347
348 /* Configure the required MAARs */
349 used = platform_maar_init(num_maars / 2);
350
351 /* Disable any further MAARs */
352 for (i = (used * 2); i < num_maars; i++) {
353 write_c0_maari(i);
354 back_to_back_c0_hazard();
355 write_c0_maar(0);
356 back_to_back_c0_hazard();
357 }
358}
359
328void __init mem_init(void) 360void __init mem_init(void)
329{ 361{
330#ifdef CONFIG_HIGHMEM 362#ifdef CONFIG_HIGHMEM
@@ -337,6 +369,7 @@ void __init mem_init(void)
337#endif 369#endif
338 high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); 370 high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
339 371
372 maar_init();
340 free_all_bootmem(); 373 free_all_bootmem();
341 setup_zero_pages(); /* Setup zeroed pages. */ 374 setup_zero_pages(); /* Setup zeroed pages. */
342 mem_init_free_highmem(); 375 mem_init_free_highmem();