|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * arch/sh/mm/pg-sh4.c
|
|
|
+ * arch/sh/mm/pg-mmu.c
|
|
|
*
|
|
|
* Copyright (C) 1999, 2000, 2002 Niibe Yutaka
|
|
|
* Copyright (C) 2002 - 2009 Paul Mundt
|
|
@@ -22,11 +22,13 @@ static pte_t *kmap_coherent_pte;
|
|
|
|
|
|
void __init kmap_coherent_init(void)
|
|
|
{
|
|
|
+#if defined(CONFIG_CPU_SH4) || defined(CONFIG_SH7705_CACHE_32KB)
|
|
|
unsigned long vaddr;
|
|
|
|
|
|
/* cache the first coherent kmap pte */
|
|
|
vaddr = __fix_to_virt(FIX_CMAP_BEGIN);
|
|
|
kmap_coherent_pte = kmap_get_fixmap_pte(vaddr);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
static inline void *kmap_coherent(struct page *page, unsigned long addr)
|
|
@@ -62,13 +64,15 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
|
|
unsigned long vaddr, void *dst, const void *src,
|
|
|
unsigned long len)
|
|
|
{
|
|
|
- if (page_mapped(page) && !test_bit(PG_dcache_dirty, &page->flags)) {
|
|
|
+ if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
|
|
|
+ !test_bit(PG_dcache_dirty, &page->flags)) {
|
|
|
void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
|
|
memcpy(vto, src, len);
|
|
|
kunmap_coherent(vto);
|
|
|
} else {
|
|
|
memcpy(dst, src, len);
|
|
|
- set_bit(PG_dcache_dirty, &page->flags);
|
|
|
+ if (boot_cpu_data.dcache.n_aliases)
|
|
|
+ set_bit(PG_dcache_dirty, &page->flags);
|
|
|
}
|
|
|
|
|
|
if (vma->vm_flags & VM_EXEC)
|
|
@@ -79,13 +83,15 @@ void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
|
|
|
unsigned long vaddr, void *dst, const void *src,
|
|
|
unsigned long len)
|
|
|
{
|
|
|
- if (page_mapped(page) && !test_bit(PG_dcache_dirty, &page->flags)) {
|
|
|
+ if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
|
|
|
+ !test_bit(PG_dcache_dirty, &page->flags)) {
|
|
|
void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
|
|
memcpy(dst, vfrom, len);
|
|
|
kunmap_coherent(vfrom);
|
|
|
} else {
|
|
|
memcpy(dst, src, len);
|
|
|
- set_bit(PG_dcache_dirty, &page->flags);
|
|
|
+ if (boot_cpu_data.dcache.n_aliases)
|
|
|
+ set_bit(PG_dcache_dirty, &page->flags);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -96,7 +102,8 @@ void copy_user_highpage(struct page *to, struct page *from,
|
|
|
|
|
|
vto = kmap_atomic(to, KM_USER1);
|
|
|
|
|
|
- if (page_mapped(from) && !test_bit(PG_dcache_dirty, &from->flags)) {
|
|
|
+ if (boot_cpu_data.dcache.n_aliases && page_mapped(from) &&
|
|
|
+ !test_bit(PG_dcache_dirty, &from->flags)) {
|
|
|
vfrom = kmap_coherent(from, vaddr);
|
|
|
copy_page(vto, vfrom);
|
|
|
kunmap_coherent(vfrom);
|