powerpc/mm: Don't call __flush_dcache_icache_phys() with PA>VA
__flush_dcache_icache_phys() requires the ability to access the memory with the MMU disabled, which means that on a 32-bit system any memory above 4 GiB is inaccessible. In particular, mpc86xx is 32-bit and can have more than 4 GiB of RAM. Signed-off-by: Scott Wood <scottwood@freescale.com>
This commit is contained in:
Родитель
501c8de7b0
Коммит
2f7d2b74a9
|
@ -40,7 +40,12 @@ extern void __flush_dcache_icache(void *page_va);
|
|||
extern void flush_dcache_icache_page(struct page *page);
|
||||
#if defined(CONFIG_PPC32) && !defined(CONFIG_BOOKE)
|
||||
extern void __flush_dcache_icache_phys(unsigned long physaddr);
|
||||
#endif /* CONFIG_PPC32 && !CONFIG_BOOKE */
|
||||
#else
|
||||
static inline void __flush_dcache_icache_phys(unsigned long physaddr)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
#endif
|
||||
|
||||
extern void flush_dcache_range(unsigned long start, unsigned long stop);
|
||||
#ifdef CONFIG_PPC32
|
||||
|
|
|
@ -414,17 +414,17 @@ void flush_dcache_icache_page(struct page *page)
|
|||
return;
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_BOOKE
|
||||
{
|
||||
#if defined(CONFIG_8xx) || defined(CONFIG_PPC64)
|
||||
/* On 8xx there is no need to kmap since highmem is not supported */
|
||||
__flush_dcache_icache(page_address(page));
|
||||
#else
|
||||
if (IS_ENABLED(CONFIG_BOOKE) || sizeof(phys_addr_t) > sizeof(void *)) {
|
||||
void *start = kmap_atomic(page);
|
||||
__flush_dcache_icache(start);
|
||||
kunmap_atomic(start);
|
||||
} else {
|
||||
__flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT);
|
||||
}
|
||||
#elif defined(CONFIG_8xx) || defined(CONFIG_PPC64)
|
||||
/* On 8xx there is no need to kmap since highmem is not supported */
|
||||
__flush_dcache_icache(page_address(page));
|
||||
#else
|
||||
__flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT);
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_icache_page);
|
||||
|
|
Загрузка…
Ссылка в новой задаче