diff options
Diffstat (limited to 'arch/sh/mm')
-rw-r--r-- | arch/sh/mm/Kconfig | 4 | ||||
-rw-r--r-- | arch/sh/mm/Makefile | 3 | ||||
-rw-r--r-- | arch/sh/mm/asids-debugfs.c | 2 | ||||
-rw-r--r-- | arch/sh/mm/cache-debugfs.c | 10 | ||||
-rw-r--r-- | arch/sh/mm/consistent.c | 3 | ||||
-rw-r--r-- | arch/sh/mm/init.c | 52 | ||||
-rw-r--r-- | arch/sh/mm/nommu.c | 4 | ||||
-rw-r--r-- | arch/sh/mm/pmb.c | 35 | ||||
-rw-r--r-- | arch/sh/mm/sram.c | 34 | ||||
-rw-r--r-- | arch/sh/mm/tlb-debugfs.c | 11 | ||||
-rw-r--r-- | arch/sh/mm/tlbflush_32.c | 16 | ||||
-rw-r--r-- | arch/sh/mm/tlbflush_64.c | 5 |
12 files changed, 126 insertions, 53 deletions
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 1445ca6257df..09370392aff1 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -168,6 +168,10 @@ config IOREMAP_FIXED | |||
168 | config UNCACHED_MAPPING | 168 | config UNCACHED_MAPPING |
169 | bool | 169 | bool |
170 | 170 | ||
171 | config HAVE_SRAM_POOL | ||
172 | bool | ||
173 | select GENERIC_ALLOCATOR | ||
174 | |||
171 | choice | 175 | choice |
172 | prompt "Kernel page size" | 176 | prompt "Kernel page size" |
173 | default PAGE_SIZE_4KB | 177 | default PAGE_SIZE_4KB |
diff --git a/arch/sh/mm/Makefile b/arch/sh/mm/Makefile index 53f7c684afb2..ab89ea4f9414 100644 --- a/arch/sh/mm/Makefile +++ b/arch/sh/mm/Makefile | |||
@@ -40,6 +40,7 @@ obj-$(CONFIG_PMB) += pmb.o | |||
40 | obj-$(CONFIG_NUMA) += numa.o | 40 | obj-$(CONFIG_NUMA) += numa.o |
41 | obj-$(CONFIG_IOREMAP_FIXED) += ioremap_fixed.o | 41 | obj-$(CONFIG_IOREMAP_FIXED) += ioremap_fixed.o |
42 | obj-$(CONFIG_UNCACHED_MAPPING) += uncached.o | 42 | obj-$(CONFIG_UNCACHED_MAPPING) += uncached.o |
43 | obj-$(CONFIG_HAVE_SRAM_POOL) += sram.o | ||
43 | 44 | ||
44 | # Special flags for fault_64.o. This puts restrictions on the number of | 45 | # Special flags for fault_64.o. This puts restrictions on the number of |
45 | # caller-save registers that the compiler can target when building this file. | 46 | # caller-save registers that the compiler can target when building this file. |
@@ -66,4 +67,4 @@ CFLAGS_fault_64.o += -ffixed-r7 \ | |||
66 | -ffixed-r60 -ffixed-r61 -ffixed-r62 \ | 67 | -ffixed-r60 -ffixed-r61 -ffixed-r62 \ |
67 | -fomit-frame-pointer | 68 | -fomit-frame-pointer |
68 | 69 | ||
69 | EXTRA_CFLAGS += -Werror | 70 | ccflags-y := -Werror |
diff --git a/arch/sh/mm/asids-debugfs.c b/arch/sh/mm/asids-debugfs.c index cd8c3bf39b5a..74c03ecc4871 100644 --- a/arch/sh/mm/asids-debugfs.c +++ b/arch/sh/mm/asids-debugfs.c | |||
@@ -63,7 +63,7 @@ static int __init asids_debugfs_init(void) | |||
63 | { | 63 | { |
64 | struct dentry *asids_dentry; | 64 | struct dentry *asids_dentry; |
65 | 65 | ||
66 | asids_dentry = debugfs_create_file("asids", S_IRUSR, sh_debugfs_root, | 66 | asids_dentry = debugfs_create_file("asids", S_IRUSR, arch_debugfs_dir, |
67 | NULL, &asids_debugfs_fops); | 67 | NULL, &asids_debugfs_fops); |
68 | if (!asids_dentry) | 68 | if (!asids_dentry) |
69 | return -ENOMEM; | 69 | return -ENOMEM; |
diff --git a/arch/sh/mm/cache-debugfs.c b/arch/sh/mm/cache-debugfs.c index 690ed010d002..52411462c409 100644 --- a/arch/sh/mm/cache-debugfs.c +++ b/arch/sh/mm/cache-debugfs.c | |||
@@ -126,25 +126,19 @@ static int __init cache_debugfs_init(void) | |||
126 | { | 126 | { |
127 | struct dentry *dcache_dentry, *icache_dentry; | 127 | struct dentry *dcache_dentry, *icache_dentry; |
128 | 128 | ||
129 | dcache_dentry = debugfs_create_file("dcache", S_IRUSR, sh_debugfs_root, | 129 | dcache_dentry = debugfs_create_file("dcache", S_IRUSR, arch_debugfs_dir, |
130 | (unsigned int *)CACHE_TYPE_DCACHE, | 130 | (unsigned int *)CACHE_TYPE_DCACHE, |
131 | &cache_debugfs_fops); | 131 | &cache_debugfs_fops); |
132 | if (!dcache_dentry) | 132 | if (!dcache_dentry) |
133 | return -ENOMEM; | 133 | return -ENOMEM; |
134 | if (IS_ERR(dcache_dentry)) | ||
135 | return PTR_ERR(dcache_dentry); | ||
136 | 134 | ||
137 | icache_dentry = debugfs_create_file("icache", S_IRUSR, sh_debugfs_root, | 135 | icache_dentry = debugfs_create_file("icache", S_IRUSR, arch_debugfs_dir, |
138 | (unsigned int *)CACHE_TYPE_ICACHE, | 136 | (unsigned int *)CACHE_TYPE_ICACHE, |
139 | &cache_debugfs_fops); | 137 | &cache_debugfs_fops); |
140 | if (!icache_dentry) { | 138 | if (!icache_dentry) { |
141 | debugfs_remove(dcache_dentry); | 139 | debugfs_remove(dcache_dentry); |
142 | return -ENOMEM; | 140 | return -ENOMEM; |
143 | } | 141 | } |
144 | if (IS_ERR(icache_dentry)) { | ||
145 | debugfs_remove(dcache_dentry); | ||
146 | return PTR_ERR(icache_dentry); | ||
147 | } | ||
148 | 142 | ||
149 | return 0; | 143 | return 0; |
150 | } | 144 | } |
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index c86a08540258..038793286990 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
@@ -38,11 +38,12 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size, | |||
38 | void *ret, *ret_nocache; | 38 | void *ret, *ret_nocache; |
39 | int order = get_order(size); | 39 | int order = get_order(size); |
40 | 40 | ||
41 | gfp |= __GFP_ZERO; | ||
42 | |||
41 | ret = (void *)__get_free_pages(gfp, order); | 43 | ret = (void *)__get_free_pages(gfp, order); |
42 | if (!ret) | 44 | if (!ret) |
43 | return NULL; | 45 | return NULL; |
44 | 46 | ||
45 | memset(ret, 0, size); | ||
46 | /* | 47 | /* |
47 | * Pages from the page allocator may have data present in | 48 | * Pages from the page allocator may have data present in |
48 | * cache. So flush the cache before using uncached memory. | 49 | * cache. So flush the cache before using uncached memory. |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 552bea5113f5..3385b28acaac 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -47,7 +47,6 @@ static pte_t *__get_pte_phys(unsigned long addr) | |||
47 | pgd_t *pgd; | 47 | pgd_t *pgd; |
48 | pud_t *pud; | 48 | pud_t *pud; |
49 | pmd_t *pmd; | 49 | pmd_t *pmd; |
50 | pte_t *pte; | ||
51 | 50 | ||
52 | pgd = pgd_offset_k(addr); | 51 | pgd = pgd_offset_k(addr); |
53 | if (pgd_none(*pgd)) { | 52 | if (pgd_none(*pgd)) { |
@@ -67,8 +66,7 @@ static pte_t *__get_pte_phys(unsigned long addr) | |||
67 | return NULL; | 66 | return NULL; |
68 | } | 67 | } |
69 | 68 | ||
70 | pte = pte_offset_kernel(pmd, addr); | 69 | return pte_offset_kernel(pmd, addr); |
71 | return pte; | ||
72 | } | 70 | } |
73 | 71 | ||
74 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | 72 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) |
@@ -125,13 +123,45 @@ void __clear_fixmap(enum fixed_addresses idx, pgprot_t prot) | |||
125 | clear_pte_phys(address, prot); | 123 | clear_pte_phys(address, prot); |
126 | } | 124 | } |
127 | 125 | ||
126 | static pmd_t * __init one_md_table_init(pud_t *pud) | ||
127 | { | ||
128 | if (pud_none(*pud)) { | ||
129 | pmd_t *pmd; | ||
130 | |||
131 | pmd = alloc_bootmem_pages(PAGE_SIZE); | ||
132 | pud_populate(&init_mm, pud, pmd); | ||
133 | BUG_ON(pmd != pmd_offset(pud, 0)); | ||
134 | } | ||
135 | |||
136 | return pmd_offset(pud, 0); | ||
137 | } | ||
138 | |||
139 | static pte_t * __init one_page_table_init(pmd_t *pmd) | ||
140 | { | ||
141 | if (pmd_none(*pmd)) { | ||
142 | pte_t *pte; | ||
143 | |||
144 | pte = alloc_bootmem_pages(PAGE_SIZE); | ||
145 | pmd_populate_kernel(&init_mm, pmd, pte); | ||
146 | BUG_ON(pte != pte_offset_kernel(pmd, 0)); | ||
147 | } | ||
148 | |||
149 | return pte_offset_kernel(pmd, 0); | ||
150 | } | ||
151 | |||
152 | static pte_t * __init page_table_kmap_check(pte_t *pte, pmd_t *pmd, | ||
153 | unsigned long vaddr, pte_t *lastpte) | ||
154 | { | ||
155 | return pte; | ||
156 | } | ||
157 | |||
128 | void __init page_table_range_init(unsigned long start, unsigned long end, | 158 | void __init page_table_range_init(unsigned long start, unsigned long end, |
129 | pgd_t *pgd_base) | 159 | pgd_t *pgd_base) |
130 | { | 160 | { |
131 | pgd_t *pgd; | 161 | pgd_t *pgd; |
132 | pud_t *pud; | 162 | pud_t *pud; |
133 | pmd_t *pmd; | 163 | pmd_t *pmd; |
134 | pte_t *pte; | 164 | pte_t *pte = NULL; |
135 | int i, j, k; | 165 | int i, j, k; |
136 | unsigned long vaddr; | 166 | unsigned long vaddr; |
137 | 167 | ||
@@ -144,19 +174,13 @@ void __init page_table_range_init(unsigned long start, unsigned long end, | |||
144 | for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) { | 174 | for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) { |
145 | pud = (pud_t *)pgd; | 175 | pud = (pud_t *)pgd; |
146 | for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) { | 176 | for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) { |
147 | #ifdef __PAGETABLE_PMD_FOLDED | 177 | pmd = one_md_table_init(pud); |
148 | pmd = (pmd_t *)pud; | 178 | #ifndef __PAGETABLE_PMD_FOLDED |
149 | #else | ||
150 | pmd = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE); | ||
151 | pud_populate(&init_mm, pud, pmd); | ||
152 | pmd += k; | 179 | pmd += k; |
153 | #endif | 180 | #endif |
154 | for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) { | 181 | for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) { |
155 | if (pmd_none(*pmd)) { | 182 | pte = page_table_kmap_check(one_page_table_init(pmd), |
156 | pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); | 183 | pmd, vaddr, pte); |
157 | pmd_populate_kernel(&init_mm, pmd, pte); | ||
158 | BUG_ON(pte != pte_offset_kernel(pmd, 0)); | ||
159 | } | ||
160 | vaddr += PMD_SIZE; | 184 | vaddr += PMD_SIZE; |
161 | } | 185 | } |
162 | k = 0; | 186 | k = 0; |
diff --git a/arch/sh/mm/nommu.c b/arch/sh/mm/nommu.c index 7694f50c9034..36312d254faf 100644 --- a/arch/sh/mm/nommu.c +++ b/arch/sh/mm/nommu.c | |||
@@ -67,6 +67,10 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end) | |||
67 | BUG(); | 67 | BUG(); |
68 | } | 68 | } |
69 | 69 | ||
70 | void __flush_tlb_global(void) | ||
71 | { | ||
72 | } | ||
73 | |||
70 | void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) | 74 | void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) |
71 | { | 75 | { |
72 | } | 76 | } |
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index 6379091a1647..b20b1b3eee4b 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
@@ -40,7 +40,7 @@ struct pmb_entry { | |||
40 | unsigned long flags; | 40 | unsigned long flags; |
41 | unsigned long size; | 41 | unsigned long size; |
42 | 42 | ||
43 | spinlock_t lock; | 43 | raw_spinlock_t lock; |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * 0 .. NR_PMB_ENTRIES for specific entry selection, or | 46 | * 0 .. NR_PMB_ENTRIES for specific entry selection, or |
@@ -265,7 +265,7 @@ static struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn, | |||
265 | 265 | ||
266 | memset(pmbe, 0, sizeof(struct pmb_entry)); | 266 | memset(pmbe, 0, sizeof(struct pmb_entry)); |
267 | 267 | ||
268 | spin_lock_init(&pmbe->lock); | 268 | raw_spin_lock_init(&pmbe->lock); |
269 | 269 | ||
270 | pmbe->vpn = vpn; | 270 | pmbe->vpn = vpn; |
271 | pmbe->ppn = ppn; | 271 | pmbe->ppn = ppn; |
@@ -327,9 +327,9 @@ static void set_pmb_entry(struct pmb_entry *pmbe) | |||
327 | { | 327 | { |
328 | unsigned long flags; | 328 | unsigned long flags; |
329 | 329 | ||
330 | spin_lock_irqsave(&pmbe->lock, flags); | 330 | raw_spin_lock_irqsave(&pmbe->lock, flags); |
331 | __set_pmb_entry(pmbe); | 331 | __set_pmb_entry(pmbe); |
332 | spin_unlock_irqrestore(&pmbe->lock, flags); | 332 | raw_spin_unlock_irqrestore(&pmbe->lock, flags); |
333 | } | 333 | } |
334 | #endif /* CONFIG_PM */ | 334 | #endif /* CONFIG_PM */ |
335 | 335 | ||
@@ -368,7 +368,7 @@ int pmb_bolt_mapping(unsigned long vaddr, phys_addr_t phys, | |||
368 | return PTR_ERR(pmbe); | 368 | return PTR_ERR(pmbe); |
369 | } | 369 | } |
370 | 370 | ||
371 | spin_lock_irqsave(&pmbe->lock, flags); | 371 | raw_spin_lock_irqsave(&pmbe->lock, flags); |
372 | 372 | ||
373 | pmbe->size = pmb_sizes[i].size; | 373 | pmbe->size = pmb_sizes[i].size; |
374 | 374 | ||
@@ -383,9 +383,10 @@ int pmb_bolt_mapping(unsigned long vaddr, phys_addr_t phys, | |||
383 | * entries for easier tear-down. | 383 | * entries for easier tear-down. |
384 | */ | 384 | */ |
385 | if (likely(pmbp)) { | 385 | if (likely(pmbp)) { |
386 | spin_lock(&pmbp->lock); | 386 | raw_spin_lock_nested(&pmbp->lock, |
387 | SINGLE_DEPTH_NESTING); | ||
387 | pmbp->link = pmbe; | 388 | pmbp->link = pmbe; |
388 | spin_unlock(&pmbp->lock); | 389 | raw_spin_unlock(&pmbp->lock); |
389 | } | 390 | } |
390 | 391 | ||
391 | pmbp = pmbe; | 392 | pmbp = pmbe; |
@@ -398,7 +399,7 @@ int pmb_bolt_mapping(unsigned long vaddr, phys_addr_t phys, | |||
398 | i--; | 399 | i--; |
399 | mapped++; | 400 | mapped++; |
400 | 401 | ||
401 | spin_unlock_irqrestore(&pmbe->lock, flags); | 402 | raw_spin_unlock_irqrestore(&pmbe->lock, flags); |
402 | } | 403 | } |
403 | } while (size >= SZ_16M); | 404 | } while (size >= SZ_16M); |
404 | 405 | ||
@@ -627,15 +628,14 @@ static void __init pmb_synchronize(void) | |||
627 | continue; | 628 | continue; |
628 | } | 629 | } |
629 | 630 | ||
630 | spin_lock_irqsave(&pmbe->lock, irqflags); | 631 | raw_spin_lock_irqsave(&pmbe->lock, irqflags); |
631 | 632 | ||
632 | for (j = 0; j < ARRAY_SIZE(pmb_sizes); j++) | 633 | for (j = 0; j < ARRAY_SIZE(pmb_sizes); j++) |
633 | if (pmb_sizes[j].flag == size) | 634 | if (pmb_sizes[j].flag == size) |
634 | pmbe->size = pmb_sizes[j].size; | 635 | pmbe->size = pmb_sizes[j].size; |
635 | 636 | ||
636 | if (pmbp) { | 637 | if (pmbp) { |
637 | spin_lock(&pmbp->lock); | 638 | raw_spin_lock_nested(&pmbp->lock, SINGLE_DEPTH_NESTING); |
638 | |||
639 | /* | 639 | /* |
640 | * Compare the previous entry against the current one to | 640 | * Compare the previous entry against the current one to |
641 | * see if the entries span a contiguous mapping. If so, | 641 | * see if the entries span a contiguous mapping. If so, |
@@ -644,13 +644,12 @@ static void __init pmb_synchronize(void) | |||
644 | */ | 644 | */ |
645 | if (pmb_can_merge(pmbp, pmbe)) | 645 | if (pmb_can_merge(pmbp, pmbe)) |
646 | pmbp->link = pmbe; | 646 | pmbp->link = pmbe; |
647 | 647 | raw_spin_unlock(&pmbp->lock); | |
648 | spin_unlock(&pmbp->lock); | ||
649 | } | 648 | } |
650 | 649 | ||
651 | pmbp = pmbe; | 650 | pmbp = pmbe; |
652 | 651 | ||
653 | spin_unlock_irqrestore(&pmbe->lock, irqflags); | 652 | raw_spin_unlock_irqrestore(&pmbe->lock, irqflags); |
654 | } | 653 | } |
655 | } | 654 | } |
656 | 655 | ||
@@ -757,7 +756,7 @@ static void __init pmb_resize(void) | |||
757 | /* | 756 | /* |
758 | * Found it, now resize it. | 757 | * Found it, now resize it. |
759 | */ | 758 | */ |
760 | spin_lock_irqsave(&pmbe->lock, flags); | 759 | raw_spin_lock_irqsave(&pmbe->lock, flags); |
761 | 760 | ||
762 | pmbe->size = SZ_16M; | 761 | pmbe->size = SZ_16M; |
763 | pmbe->flags &= ~PMB_SZ_MASK; | 762 | pmbe->flags &= ~PMB_SZ_MASK; |
@@ -767,7 +766,7 @@ static void __init pmb_resize(void) | |||
767 | 766 | ||
768 | __set_pmb_entry(pmbe); | 767 | __set_pmb_entry(pmbe); |
769 | 768 | ||
770 | spin_unlock_irqrestore(&pmbe->lock, flags); | 769 | raw_spin_unlock_irqrestore(&pmbe->lock, flags); |
771 | } | 770 | } |
772 | 771 | ||
773 | read_unlock(&pmb_rwlock); | 772 | read_unlock(&pmb_rwlock); |
@@ -866,11 +865,9 @@ static int __init pmb_debugfs_init(void) | |||
866 | struct dentry *dentry; | 865 | struct dentry *dentry; |
867 | 866 | ||
868 | dentry = debugfs_create_file("pmb", S_IFREG | S_IRUGO, | 867 | dentry = debugfs_create_file("pmb", S_IFREG | S_IRUGO, |
869 | sh_debugfs_root, NULL, &pmb_debugfs_fops); | 868 | arch_debugfs_dir, NULL, &pmb_debugfs_fops); |
870 | if (!dentry) | 869 | if (!dentry) |
871 | return -ENOMEM; | 870 | return -ENOMEM; |
872 | if (IS_ERR(dentry)) | ||
873 | return PTR_ERR(dentry); | ||
874 | 871 | ||
875 | return 0; | 872 | return 0; |
876 | } | 873 | } |
diff --git a/arch/sh/mm/sram.c b/arch/sh/mm/sram.c new file mode 100644 index 000000000000..bc156ec4545e --- /dev/null +++ b/arch/sh/mm/sram.c | |||
@@ -0,0 +1,34 @@ | |||
1 | /* | ||
2 | * SRAM pool for tiny memories not otherwise managed. | ||
3 | * | ||
4 | * Copyright (C) 2010 Paul Mundt | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <asm/sram.h> | ||
13 | |||
14 | /* | ||
15 | * This provides a standard SRAM pool for tiny memories that can be | ||
16 | * added either by the CPU or the platform code. Typical SRAM sizes | ||
17 | * to be inserted in to the pool will generally be less than the page | ||
18 | * size, with anything more reasonably sized handled as a NUMA memory | ||
19 | * node. | ||
20 | */ | ||
21 | struct gen_pool *sram_pool; | ||
22 | |||
23 | static int __init sram_pool_init(void) | ||
24 | { | ||
25 | /* | ||
26 | * This is a global pool, we don't care about node locality. | ||
27 | */ | ||
28 | sram_pool = gen_pool_create(1, -1); | ||
29 | if (unlikely(!sram_pool)) | ||
30 | return -ENOMEM; | ||
31 | |||
32 | return 0; | ||
33 | } | ||
34 | core_initcall(sram_pool_init); | ||
diff --git a/arch/sh/mm/tlb-debugfs.c b/arch/sh/mm/tlb-debugfs.c index 229bf75f28df..dea637a09246 100644 --- a/arch/sh/mm/tlb-debugfs.c +++ b/arch/sh/mm/tlb-debugfs.c | |||
@@ -151,15 +151,13 @@ static int __init tlb_debugfs_init(void) | |||
151 | { | 151 | { |
152 | struct dentry *itlb, *utlb; | 152 | struct dentry *itlb, *utlb; |
153 | 153 | ||
154 | itlb = debugfs_create_file("itlb", S_IRUSR, sh_debugfs_root, | 154 | itlb = debugfs_create_file("itlb", S_IRUSR, arch_debugfs_dir, |
155 | (unsigned int *)TLB_TYPE_ITLB, | 155 | (unsigned int *)TLB_TYPE_ITLB, |
156 | &tlb_debugfs_fops); | 156 | &tlb_debugfs_fops); |
157 | if (unlikely(!itlb)) | 157 | if (unlikely(!itlb)) |
158 | return -ENOMEM; | 158 | return -ENOMEM; |
159 | if (IS_ERR(itlb)) | ||
160 | return PTR_ERR(itlb); | ||
161 | 159 | ||
162 | utlb = debugfs_create_file("utlb", S_IRUSR, sh_debugfs_root, | 160 | utlb = debugfs_create_file("utlb", S_IRUSR, arch_debugfs_dir, |
163 | (unsigned int *)TLB_TYPE_UTLB, | 161 | (unsigned int *)TLB_TYPE_UTLB, |
164 | &tlb_debugfs_fops); | 162 | &tlb_debugfs_fops); |
165 | if (unlikely(!utlb)) { | 163 | if (unlikely(!utlb)) { |
@@ -167,11 +165,6 @@ static int __init tlb_debugfs_init(void) | |||
167 | return -ENOMEM; | 165 | return -ENOMEM; |
168 | } | 166 | } |
169 | 167 | ||
170 | if (IS_ERR(utlb)) { | ||
171 | debugfs_remove(itlb); | ||
172 | return PTR_ERR(utlb); | ||
173 | } | ||
174 | |||
175 | return 0; | 168 | return 0; |
176 | } | 169 | } |
177 | module_init(tlb_debugfs_init); | 170 | module_init(tlb_debugfs_init); |
diff --git a/arch/sh/mm/tlbflush_32.c b/arch/sh/mm/tlbflush_32.c index 3fbe03ce8fe3..a6a20d6de4c0 100644 --- a/arch/sh/mm/tlbflush_32.c +++ b/arch/sh/mm/tlbflush_32.c | |||
@@ -119,3 +119,19 @@ void local_flush_tlb_mm(struct mm_struct *mm) | |||
119 | local_irq_restore(flags); | 119 | local_irq_restore(flags); |
120 | } | 120 | } |
121 | } | 121 | } |
122 | |||
123 | void __flush_tlb_global(void) | ||
124 | { | ||
125 | unsigned long flags; | ||
126 | |||
127 | local_irq_save(flags); | ||
128 | |||
129 | /* | ||
130 | * This is the most destructive of the TLB flushing options, | ||
131 | * and will tear down all of the UTLB/ITLB mappings, including | ||
132 | * wired entries. | ||
133 | */ | ||
134 | __raw_writel(__raw_readl(MMUCR) | MMUCR_TI, MMUCR); | ||
135 | |||
136 | local_irq_restore(flags); | ||
137 | } | ||
diff --git a/arch/sh/mm/tlbflush_64.c b/arch/sh/mm/tlbflush_64.c index 03db41cc1268..7f5810f5dfdc 100644 --- a/arch/sh/mm/tlbflush_64.c +++ b/arch/sh/mm/tlbflush_64.c | |||
@@ -455,6 +455,11 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end) | |||
455 | flush_tlb_all(); | 455 | flush_tlb_all(); |
456 | } | 456 | } |
457 | 457 | ||
458 | void __flush_tlb_global(void) | ||
459 | { | ||
460 | flush_tlb_all(); | ||
461 | } | ||
462 | |||
458 | void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) | 463 | void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) |
459 | { | 464 | { |
460 | } | 465 | } |