Merge branch 'sh/pgtable' of git://github.com/mfleming/linux-2.6
This commit is contained in:
@@ -219,7 +219,7 @@ config PAGE_SIZE_4KB
|
||||
|
||||
config PAGE_SIZE_8KB
|
||||
bool "8kB"
|
||||
depends on !MMU || X2TLB && !PGTABLE_LEVELS_3
|
||||
depends on !MMU || X2TLB
|
||||
help
|
||||
This enables 8kB pages as supported by SH-X2 and later MMUs.
|
||||
|
||||
@@ -231,7 +231,7 @@ config PAGE_SIZE_16KB
|
||||
|
||||
config PAGE_SIZE_64KB
|
||||
bool "64kB"
|
||||
depends on !MMU || CPU_SH4 && !PGTABLE_LEVELS_3 || CPU_SH5
|
||||
depends on !MMU || CPU_SH4 || CPU_SH5
|
||||
help
|
||||
This enables support for 64kB pages, possible on all SH-4
|
||||
CPUs and later.
|
||||
|
@@ -15,7 +15,7 @@ obj-y += $(cacheops-y)
|
||||
|
||||
mmu-y := nommu.o extable_32.o
|
||||
mmu-$(CONFIG_MMU) := extable_$(BITS).o fault_$(BITS).o \
|
||||
ioremap_$(BITS).o kmap.o tlbflush_$(BITS).o
|
||||
ioremap_$(BITS).o kmap.o pgtable.o tlbflush_$(BITS).o
|
||||
|
||||
obj-y += $(mmu-y)
|
||||
obj-$(CONFIG_DEBUG_FS) += asids-debugfs.o
|
||||
|
@@ -109,6 +109,7 @@ static inline void flush_cache_one(unsigned long start, unsigned long phys)
|
||||
static void sh4_flush_dcache_page(void *arg)
|
||||
{
|
||||
struct page *page = arg;
|
||||
unsigned long addr = (unsigned long)page_address(page);
|
||||
#ifndef CONFIG_SMP
|
||||
struct address_space *mapping = page_mapping(page);
|
||||
|
||||
@@ -116,16 +117,8 @@ static void sh4_flush_dcache_page(void *arg)
|
||||
set_bit(PG_dcache_dirty, &page->flags);
|
||||
else
|
||||
#endif
|
||||
{
|
||||
unsigned long phys = page_to_phys(page);
|
||||
unsigned long addr = CACHE_OC_ADDRESS_ARRAY;
|
||||
int i, n;
|
||||
|
||||
/* Loop all the D-cache */
|
||||
n = boot_cpu_data.dcache.n_aliases;
|
||||
for (i = 0; i < n; i++, addr += PAGE_SIZE)
|
||||
flush_cache_one(addr, phys);
|
||||
}
|
||||
flush_cache_one(CACHE_OC_ADDRESS_ARRAY |
|
||||
(addr & shm_align_mask), page_to_phys(page));
|
||||
|
||||
wmb();
|
||||
}
|
||||
|
57
arch/sh/mm/pgtable.c
Normal file
57
arch/sh/mm/pgtable.c
Normal file
@@ -0,0 +1,57 @@
|
||||
#include <linux/mm.h>
|
||||
|
||||
#define PGALLOC_GFP GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO
|
||||
|
||||
static struct kmem_cache *pgd_cachep;
|
||||
|
||||
#ifdef CONFIG_PGTABLE_LEVELS_3
|
||||
static struct kmem_cache *pmd_cachep;
|
||||
#endif
|
||||
|
||||
void pgd_ctor(void *x)
|
||||
{
|
||||
pgd_t *pgd = x;
|
||||
|
||||
memcpy(pgd + USER_PTRS_PER_PGD,
|
||||
swapper_pg_dir + USER_PTRS_PER_PGD,
|
||||
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
|
||||
}
|
||||
|
||||
void pgtable_cache_init(void)
|
||||
{
|
||||
pgd_cachep = kmem_cache_create("pgd_cache",
|
||||
PTRS_PER_PGD * (1<<PTE_MAGNITUDE),
|
||||
PAGE_SIZE, SLAB_PANIC, pgd_ctor);
|
||||
#ifdef CONFIG_PGTABLE_LEVELS_3
|
||||
pmd_cachep = kmem_cache_create("pmd_cache",
|
||||
PTRS_PER_PMD * (1<<PTE_MAGNITUDE),
|
||||
PAGE_SIZE, SLAB_PANIC, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
pgd_t *pgd_alloc(struct mm_struct *mm)
|
||||
{
|
||||
return kmem_cache_alloc(pgd_cachep, PGALLOC_GFP);
|
||||
}
|
||||
|
||||
void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||
{
|
||||
kmem_cache_free(pgd_cachep, pgd);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PGTABLE_LEVELS_3
|
||||
void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
|
||||
{
|
||||
set_pud(pud, __pud((unsigned long)pmd));
|
||||
}
|
||||
|
||||
pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||
{
|
||||
return kmem_cache_alloc(pmd_cachep, PGALLOC_GFP);
|
||||
}
|
||||
|
||||
void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
||||
{
|
||||
kmem_cache_free(pmd_cachep, pmd);
|
||||
}
|
||||
#endif /* CONFIG_PGTABLE_LEVELS_3 */
|
Reference in New Issue
Block a user