return (get_sctlr() & CR_C) != 0;
}
+u64 *__weak arch_get_page_table(void) {
+ puts("No page table offset defined\n");
+
+ return NULL;
+}
+
void mmu_set_region_dcache_behaviour(phys_addr_t start, size_t size,
enum dcache_option option)
{
- /* get the level2_table0 start address */
- u64 *page_table = (u64 *)(gd->arch.tlb_addr + 0x3000);
+ u64 *page_table = arch_get_page_table();
u64 upto, end;
+ if (page_table == NULL)
+ return;
+
end = ALIGN(start + size, (1 << MMU_SECTION_SHIFT)) >>
MMU_SECTION_SHIFT;
start = start >> MMU_SECTION_SHIFT;
page_table[upto] &= ~PMD_ATTRINDX_MASK;
page_table[upto] |= PMD_ATTRINDX(option);
}
-
- flush_dcache_range(page_table[start], page_table[end]);
+ asm volatile("dsb sy");
__asm_invalidate_tlb_all();
+ asm volatile("dsb sy");
+ asm volatile("isb");
+ start = start << MMU_SECTION_SHIFT;
+ end = end << MMU_SECTION_SHIFT;
+ flush_dcache_range(start, end);
+ asm volatile("dsb sy");
}
#else /* CONFIG_SYS_DCACHE_OFF */