|
@@ -37,6 +37,7 @@
|
|
|
#include <asm/cpu.h>
|
|
|
#include <asm/dma.h>
|
|
|
#include <asm/kmap_types.h>
|
|
|
+#include <asm/maar.h>
|
|
|
#include <asm/mmu_context.h>
|
|
|
#include <asm/sections.h>
|
|
|
#include <asm/pgtable.h>
|
|
@@ -333,9 +334,40 @@ static inline void mem_init_free_highmem(void)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-unsigned __weak platform_maar_init(unsigned num_maars)
|
|
|
+unsigned __weak platform_maar_init(unsigned num_pairs)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ struct maar_config cfg[BOOT_MEM_MAP_MAX];
|
|
|
+ unsigned i, num_configured, num_cfg = 0;
|
|
|
+ phys_addr_t skip;
|
|
|
+
|
|
|
+ for (i = 0; i < boot_mem_map.nr_map; i++) {
|
|
|
+ switch (boot_mem_map.map[i].type) {
|
|
|
+ case BOOT_MEM_RAM:
|
|
|
+ case BOOT_MEM_INIT_RAM:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ skip = 0x10000 - (boot_mem_map.map[i].addr & 0xffff);
|
|
|
+
|
|
|
+ cfg[num_cfg].lower = boot_mem_map.map[i].addr;
|
|
|
+ cfg[num_cfg].lower += skip;
|
|
|
+
|
|
|
+ cfg[num_cfg].upper = cfg[num_cfg].lower;
|
|
|
+ cfg[num_cfg].upper += boot_mem_map.map[i].size - 1;
|
|
|
+ cfg[num_cfg].upper -= skip;
|
|
|
+
|
|
|
+ cfg[num_cfg].attrs = MIPS_MAAR_S;
|
|
|
+ num_cfg++;
|
|
|
+ }
|
|
|
+
|
|
|
+ num_configured = maar_config(cfg, num_cfg, num_pairs);
|
|
|
+ if (num_configured < num_cfg)
|
|
|
+ pr_warn("Not enough MAAR pairs (%u) for all bootmem regions (%u)\n",
|
|
|
+ num_pairs, num_cfg);
|
|
|
+
|
|
|
+ return num_configured;
|
|
|
}
|
|
|
|
|
|
static void maar_init(void)
|