aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-11-15 15:10:32 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2008-11-15 15:10:32 -0500
commit537a2f889ac847468c9aa040910c247b218302a7 (patch)
treeea21b1dfd11e4234b108059c84c2a42887dc9254 /arch
parentfab349cceb25f92bac1400601c5ef8345a166958 (diff)
parent272966c070237c8cb540fe67e06df51bc6ea9cc2 (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.h4
-rw-r--r--arch/sh/include/asm/pgtable.h6
-rw-r--r--arch/sh/kernel/cpu/sh4a/setup-sh7723.c6
-rw-r--r--arch/sh/kernel/early_printk.c3
-rw-r--r--arch/sh/kernel/timers/timer-tmu.c2
-rw-r--r--arch/sh/lib/copy_page.S11
-rw-r--r--arch/sh/mm/Makefile_322
-rw-r--r--arch/sh/mm/Makefile_642
-rw-r--r--arch/sh/mm/init.c12
-rw-r--r--arch/sh/mm/mmap.c31
-rw-r--r--arch/sh/mm/pg-sh4.c17
11 files changed, 83 insertions, 13 deletions
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h
index 436c28539577..65eaae34e753 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
297int valid_phys_addr_range(unsigned long addr, size_t size);
298int 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 52220d70a096..b517ae08b9c0 100644
--- a/arch/sh/include/asm/pgtable.h
+++ b/arch/sh/include/asm/pgtable.h
@@ -148,6 +148,12 @@ extern void paging_init(void);
148extern void page_table_range_init(unsigned long start, unsigned long end, 148extern 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)
152extern 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 a7412cede534..6d9e6972cfc9 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 6b7d166694e2..a952dcf9999d 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
77static struct uart_port scif_port = { 77static 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 aaaf90d06b85..3c61ddd4d43e 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 5d12e657be34..43de7e8e4e17 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
83ENTRY(__copy_user) 88ENTRY(__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
1412: 1462:
142EX( mov.b @r5+,r0 ) 147EX_NO_POP( mov.b @r5+,r0 )
143 dt r6 148 dt r6
144EX( mov.b r0,@r4 ) 149EX_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"
1536000: 1586005:
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 70e0906023cc..f066e76da204 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
5obj-y := init.o extable_32.o consistent.o 5obj-y := init.o extable_32.o consistent.o mmap.o
6 6
7ifndef CONFIG_CACHE_OFF 7ifndef CONFIG_CACHE_OFF
8cache-$(CONFIG_CPU_SH2) := cache-sh2.o 8cache-$(CONFIG_CPU_SH2) := cache-sh2.o
diff --git a/arch/sh/mm/Makefile_64 b/arch/sh/mm/Makefile_64
index 0d92a8a3ac9a..9481d0f54efd 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
5obj-y := init.o consistent.o 5obj-y := init.o consistent.o mmap.o
6 6
7mmu-y := tlb-nommu.o pg-nommu.o extable_32.o 7mmu-y := tlb-nommu.o pg-nommu.o extable_32.o
8mmu-$(CONFIG_MMU) := fault_64.o ioremap_64.o tlbflush_64.o tlb-sh5.o \ 8mmu-$(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 4abf00031dae..6cbef8caeb56 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,
137void __init paging_init(void) 137void __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 000000000000..8837d511710a
--- /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 */
18int 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
28int 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 38870e0fc182..2fe14da1f839 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
23static pte_t *kmap_coherent_pte;
24
25void __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
19static inline void *kmap_coherent(struct page *page, unsigned long addr) 34static 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