diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-15 15:10:32 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-15 15:10:32 -0500 |
| commit | 537a2f889ac847468c9aa040910c247b218302a7 (patch) | |
| tree | ea21b1dfd11e4234b108059c84c2a42887dc9254 /arch | |
| parent | fab349cceb25f92bac1400601c5ef8345a166958 (diff) | |
| parent | 272966c070237c8cb540fe67e06df51bc6ea9cc2 (diff) | |
Merge branch 'sh/for-2.6.28' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* 'sh/for-2.6.28' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6:
serial: sh-sci: Reorder the SCxTDR write after the TDxE clear.
sh: __copy_user function can corrupt the stack in case of exception
sh: Fixed the TMU0 reload value on resume
sh: Don't factor in PAGE_OFFSET for valid_phys_addr_range() check.
sh: early printk port type fix
i2c: fix i2c-sh_mobile rx underrun
sh: Provide a sane valid_phys_addr_range() to prevent TLB reset with PMB.
usb: r8a66597-hcd: fix wrong data access in SuperH on-chip USB
fix sci type for SH7723
serial: sh-sci: fix cannot work SH7723 SCIFA
sh: Handle fixmap TLB eviction more coherently.
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/sh/include/asm/io.h | 4 | ||||
| -rw-r--r-- | arch/sh/include/asm/pgtable.h | 6 | ||||
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7723.c | 6 | ||||
| -rw-r--r-- | arch/sh/kernel/early_printk.c | 3 | ||||
| -rw-r--r-- | arch/sh/kernel/timers/timer-tmu.c | 2 | ||||
| -rw-r--r-- | arch/sh/lib/copy_page.S | 11 | ||||
| -rw-r--r-- | arch/sh/mm/Makefile_32 | 2 | ||||
| -rw-r--r-- | arch/sh/mm/Makefile_64 | 2 | ||||
| -rw-r--r-- | arch/sh/mm/init.c | 12 | ||||
| -rw-r--r-- | arch/sh/mm/mmap.c | 31 | ||||
| -rw-r--r-- | arch/sh/mm/pg-sh4.c | 17 |
11 files changed, 83 insertions, 13 deletions
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index 436c2853957..65eaae34e75 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
| @@ -293,6 +293,10 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
| 293 | */ | 293 | */ |
| 294 | #define xlate_dev_kmem_ptr(p) p | 294 | #define xlate_dev_kmem_ptr(p) p |
| 295 | 295 | ||
| 296 | #define ARCH_HAS_VALID_PHYS_ADDR_RANGE | ||
| 297 | int valid_phys_addr_range(unsigned long addr, size_t size); | ||
| 298 | int valid_mmap_phys_addr_range(unsigned long pfn, size_t size); | ||
| 299 | |||
| 296 | #endif /* __KERNEL__ */ | 300 | #endif /* __KERNEL__ */ |
| 297 | 301 | ||
| 298 | #endif /* __ASM_SH_IO_H */ | 302 | #endif /* __ASM_SH_IO_H */ |
diff --git a/arch/sh/include/asm/pgtable.h b/arch/sh/include/asm/pgtable.h index 52220d70a09..b517ae08b9c 100644 --- a/arch/sh/include/asm/pgtable.h +++ b/arch/sh/include/asm/pgtable.h | |||
| @@ -148,6 +148,12 @@ extern void paging_init(void); | |||
| 148 | extern void page_table_range_init(unsigned long start, unsigned long end, | 148 | extern void page_table_range_init(unsigned long start, unsigned long end, |
| 149 | pgd_t *pgd); | 149 | pgd_t *pgd); |
| 150 | 150 | ||
| 151 | #if !defined(CONFIG_CACHE_OFF) && defined(CONFIG_CPU_SH4) && defined(CONFIG_MMU) | ||
| 152 | extern void kmap_coherent_init(void); | ||
| 153 | #else | ||
| 154 | #define kmap_coherent_init() do { } while (0) | ||
| 155 | #endif | ||
| 156 | |||
| 151 | #include <asm-generic/pgtable.h> | 157 | #include <asm-generic/pgtable.h> |
| 152 | 158 | ||
| 153 | #endif /* __ASM_SH_PGTABLE_H */ | 159 | #endif /* __ASM_SH_PGTABLE_H */ |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index a7412cede53..6d9e6972cfc 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
| @@ -119,17 +119,17 @@ static struct plat_sci_port sci_platform_data[] = { | |||
| 119 | },{ | 119 | },{ |
| 120 | .mapbase = 0xa4e30000, | 120 | .mapbase = 0xa4e30000, |
| 121 | .flags = UPF_BOOT_AUTOCONF, | 121 | .flags = UPF_BOOT_AUTOCONF, |
| 122 | .type = PORT_SCI, | 122 | .type = PORT_SCIFA, |
| 123 | .irqs = { 56, 56, 56, 56 }, | 123 | .irqs = { 56, 56, 56, 56 }, |
| 124 | },{ | 124 | },{ |
| 125 | .mapbase = 0xa4e40000, | 125 | .mapbase = 0xa4e40000, |
| 126 | .flags = UPF_BOOT_AUTOCONF, | 126 | .flags = UPF_BOOT_AUTOCONF, |
| 127 | .type = PORT_SCI, | 127 | .type = PORT_SCIFA, |
| 128 | .irqs = { 88, 88, 88, 88 }, | 128 | .irqs = { 88, 88, 88, 88 }, |
| 129 | },{ | 129 | },{ |
| 130 | .mapbase = 0xa4e50000, | 130 | .mapbase = 0xa4e50000, |
| 131 | .flags = UPF_BOOT_AUTOCONF, | 131 | .flags = UPF_BOOT_AUTOCONF, |
| 132 | .type = PORT_SCI, | 132 | .type = PORT_SCIFA, |
| 133 | .irqs = { 109, 109, 109, 109 }, | 133 | .irqs = { 109, 109, 109, 109 }, |
| 134 | }, { | 134 | }, { |
| 135 | .flags = 0, | 135 | .flags = 0, |
diff --git a/arch/sh/kernel/early_printk.c b/arch/sh/kernel/early_printk.c index 6b7d166694e..a952dcf9999 100644 --- a/arch/sh/kernel/early_printk.c +++ b/arch/sh/kernel/early_printk.c | |||
| @@ -75,6 +75,7 @@ static struct console bios_console = { | |||
| 75 | #endif | 75 | #endif |
| 76 | 76 | ||
| 77 | static struct uart_port scif_port = { | 77 | static struct uart_port scif_port = { |
| 78 | .type = PORT_SCIF, | ||
| 78 | .mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT, | 79 | .mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT, |
| 79 | .membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT, | 80 | .membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT, |
| 80 | }; | 81 | }; |
| @@ -84,9 +85,9 @@ static void scif_sercon_putc(int c) | |||
| 84 | while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE)) | 85 | while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE)) |
| 85 | ; | 86 | ; |
| 86 | 87 | ||
| 87 | sci_out(&scif_port, SCxTDR, c); | ||
| 88 | sci_in(&scif_port, SCxSR); | 88 | sci_in(&scif_port, SCxSR); |
| 89 | sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); | 89 | sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40)); |
| 90 | sci_out(&scif_port, SCxTDR, c); | ||
| 90 | 91 | ||
| 91 | while ((sci_in(&scif_port, SCxSR) & 0x40) == 0) | 92 | while ((sci_in(&scif_port, SCxSR) & 0x40) == 0) |
| 92 | ; | 93 | ; |
diff --git a/arch/sh/kernel/timers/timer-tmu.c b/arch/sh/kernel/timers/timer-tmu.c index aaaf90d06b8..3c61ddd4d43 100644 --- a/arch/sh/kernel/timers/timer-tmu.c +++ b/arch/sh/kernel/timers/timer-tmu.c | |||
| @@ -120,7 +120,7 @@ static void tmu_set_mode(enum clock_event_mode mode, | |||
| 120 | { | 120 | { |
| 121 | switch (mode) { | 121 | switch (mode) { |
| 122 | case CLOCK_EVT_MODE_PERIODIC: | 122 | case CLOCK_EVT_MODE_PERIODIC: |
| 123 | ctrl_outl(ctrl_inl(TMU0_TCNT), TMU0_TCOR); | 123 | ctrl_outl(tmu_latest_interval[TMU0], TMU0_TCOR); |
| 124 | break; | 124 | break; |
| 125 | case CLOCK_EVT_MODE_ONESHOT: | 125 | case CLOCK_EVT_MODE_ONESHOT: |
| 126 | ctrl_outl(0, TMU0_TCOR); | 126 | ctrl_outl(0, TMU0_TCOR); |
diff --git a/arch/sh/lib/copy_page.S b/arch/sh/lib/copy_page.S index 5d12e657be3..43de7e8e4e1 100644 --- a/arch/sh/lib/copy_page.S +++ b/arch/sh/lib/copy_page.S | |||
| @@ -80,6 +80,11 @@ ENTRY(copy_page) | |||
| 80 | .section __ex_table, "a"; \ | 80 | .section __ex_table, "a"; \ |
| 81 | .long 9999b, 6000f ; \ | 81 | .long 9999b, 6000f ; \ |
| 82 | .previous | 82 | .previous |
| 83 | #define EX_NO_POP(...) \ | ||
| 84 | 9999: __VA_ARGS__ ; \ | ||
| 85 | .section __ex_table, "a"; \ | ||
| 86 | .long 9999b, 6005f ; \ | ||
| 87 | .previous | ||
| 83 | ENTRY(__copy_user) | 88 | ENTRY(__copy_user) |
| 84 | ! Check if small number of bytes | 89 | ! Check if small number of bytes |
| 85 | mov #11,r0 | 90 | mov #11,r0 |
| @@ -139,9 +144,9 @@ EX( mov.b r1,@r4 ) | |||
| 139 | bt 1f | 144 | bt 1f |
| 140 | 145 | ||
| 141 | 2: | 146 | 2: |
| 142 | EX( mov.b @r5+,r0 ) | 147 | EX_NO_POP( mov.b @r5+,r0 ) |
| 143 | dt r6 | 148 | dt r6 |
| 144 | EX( mov.b r0,@r4 ) | 149 | EX_NO_POP( mov.b r0,@r4 ) |
| 145 | bf/s 2b | 150 | bf/s 2b |
| 146 | add #1,r4 | 151 | add #1,r4 |
| 147 | 152 | ||
| @@ -150,7 +155,7 @@ EX( mov.b r0,@r4 ) | |||
| 150 | 155 | ||
| 151 | # Exception handler: | 156 | # Exception handler: |
| 152 | .section .fixup, "ax" | 157 | .section .fixup, "ax" |
| 153 | 6000: | 158 | 6005: |
| 154 | mov.l 8000f,r1 | 159 | mov.l 8000f,r1 |
| 155 | mov r3,r0 | 160 | mov r3,r0 |
| 156 | jmp @r1 | 161 | jmp @r1 |
diff --git a/arch/sh/mm/Makefile_32 b/arch/sh/mm/Makefile_32 index 70e0906023c..f066e76da20 100644 --- a/arch/sh/mm/Makefile_32 +++ b/arch/sh/mm/Makefile_32 | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # Makefile for the Linux SuperH-specific parts of the memory manager. | 2 | # Makefile for the Linux SuperH-specific parts of the memory manager. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := init.o extable_32.o consistent.o | 5 | obj-y := init.o extable_32.o consistent.o mmap.o |
| 6 | 6 | ||
| 7 | ifndef CONFIG_CACHE_OFF | 7 | ifndef CONFIG_CACHE_OFF |
| 8 | cache-$(CONFIG_CPU_SH2) := cache-sh2.o | 8 | cache-$(CONFIG_CPU_SH2) := cache-sh2.o |
diff --git a/arch/sh/mm/Makefile_64 b/arch/sh/mm/Makefile_64 index 0d92a8a3ac9..9481d0f54ef 100644 --- a/arch/sh/mm/Makefile_64 +++ b/arch/sh/mm/Makefile_64 | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # Makefile for the Linux SuperH-specific parts of the memory manager. | 2 | # Makefile for the Linux SuperH-specific parts of the memory manager. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := init.o consistent.o | 5 | obj-y := init.o consistent.o mmap.o |
| 6 | 6 | ||
| 7 | mmu-y := tlb-nommu.o pg-nommu.o extable_32.o | 7 | mmu-y := tlb-nommu.o pg-nommu.o extable_32.o |
| 8 | mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \ | 8 | mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \ |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 4abf00031da..6cbef8caeb5 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
| @@ -137,6 +137,7 @@ void __init page_table_range_init(unsigned long start, unsigned long end, | |||
| 137 | void __init paging_init(void) | 137 | void __init paging_init(void) |
| 138 | { | 138 | { |
| 139 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | 139 | unsigned long max_zone_pfns[MAX_NR_ZONES]; |
| 140 | unsigned long vaddr; | ||
| 140 | int nid; | 141 | int nid; |
| 141 | 142 | ||
| 142 | /* We don't need to map the kernel through the TLB, as | 143 | /* We don't need to map the kernel through the TLB, as |
| @@ -148,10 +149,15 @@ void __init paging_init(void) | |||
| 148 | * check for a null value. */ | 149 | * check for a null value. */ |
| 149 | set_TTB(swapper_pg_dir); | 150 | set_TTB(swapper_pg_dir); |
| 150 | 151 | ||
| 151 | /* Populate the relevant portions of swapper_pg_dir so that | 152 | /* |
| 153 | * Populate the relevant portions of swapper_pg_dir so that | ||
| 152 | * we can use the fixmap entries without calling kmalloc. | 154 | * we can use the fixmap entries without calling kmalloc. |
| 153 | * pte's will be filled in by __set_fixmap(). */ | 155 | * pte's will be filled in by __set_fixmap(). |
| 154 | page_table_range_init(FIXADDR_START, FIXADDR_TOP, swapper_pg_dir); | 156 | */ |
| 157 | vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; | ||
| 158 | page_table_range_init(vaddr, 0, swapper_pg_dir); | ||
| 159 | |||
| 160 | kmap_coherent_init(); | ||
| 155 | 161 | ||
| 156 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 162 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); |
| 157 | 163 | ||
diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c new file mode 100644 index 00000000000..8837d511710 --- /dev/null +++ b/arch/sh/mm/mmap.c | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | /* | ||
| 2 | * arch/sh/mm/mmap.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008 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/io.h> | ||
| 11 | #include <linux/mm.h> | ||
| 12 | #include <asm/page.h> | ||
| 13 | |||
| 14 | /* | ||
| 15 | * You really shouldn't be using read() or write() on /dev/mem. This | ||
| 16 | * might go away in the future. | ||
| 17 | */ | ||
| 18 | int valid_phys_addr_range(unsigned long addr, size_t count) | ||
| 19 | { | ||
| 20 | if (addr < __MEMORY_START) | ||
| 21 | return 0; | ||
| 22 | if (addr + count > __pa(high_memory)) | ||
| 23 | return 0; | ||
| 24 | |||
| 25 | return 1; | ||
| 26 | } | ||
| 27 | |||
| 28 | int valid_mmap_phys_addr_range(unsigned long pfn, size_t size) | ||
| 29 | { | ||
| 30 | return 1; | ||
| 31 | } | ||
diff --git a/arch/sh/mm/pg-sh4.c b/arch/sh/mm/pg-sh4.c index 38870e0fc18..2fe14da1f83 100644 --- a/arch/sh/mm/pg-sh4.c +++ b/arch/sh/mm/pg-sh4.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
| 8 | */ | 8 | */ |
| 9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
| 10 | #include <linux/init.h> | ||
| 10 | #include <linux/mutex.h> | 11 | #include <linux/mutex.h> |
| 11 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
| 12 | #include <linux/highmem.h> | 13 | #include <linux/highmem.h> |
| @@ -16,6 +17,20 @@ | |||
| 16 | 17 | ||
| 17 | #define CACHE_ALIAS (current_cpu_data.dcache.alias_mask) | 18 | #define CACHE_ALIAS (current_cpu_data.dcache.alias_mask) |
| 18 | 19 | ||
| 20 | #define kmap_get_fixmap_pte(vaddr) \ | ||
| 21 | pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr)) | ||
| 22 | |||
| 23 | static pte_t *kmap_coherent_pte; | ||
| 24 | |||
| 25 | void __init kmap_coherent_init(void) | ||
| 26 | { | ||
| 27 | unsigned long vaddr; | ||
| 28 | |||
| 29 | /* cache the first coherent kmap pte */ | ||
| 30 | vaddr = __fix_to_virt(FIX_CMAP_BEGIN); | ||
| 31 | kmap_coherent_pte = kmap_get_fixmap_pte(vaddr); | ||
| 32 | } | ||
| 33 | |||
| 19 | static inline void *kmap_coherent(struct page *page, unsigned long addr) | 34 | static inline void *kmap_coherent(struct page *page, unsigned long addr) |
| 20 | { | 35 | { |
| 21 | enum fixed_addresses idx; | 36 | enum fixed_addresses idx; |
| @@ -34,6 +49,8 @@ static inline void *kmap_coherent(struct page *page, unsigned long addr) | |||
| 34 | 49 | ||
| 35 | update_mmu_cache(NULL, vaddr, pte); | 50 | update_mmu_cache(NULL, vaddr, pte); |
| 36 | 51 | ||
| 52 | set_pte(kmap_coherent_pte - (FIX_CMAP_END - idx), pte); | ||
| 53 | |||
| 37 | return (void *)vaddr; | 54 | return (void *)vaddr; |
| 38 | } | 55 | } |
| 39 | 56 | ||
