diff options
Diffstat (limited to 'arch/sh/include/asm')
-rw-r--r-- | arch/sh/include/asm/io.h | 22 | ||||
-rw-r--r-- | arch/sh/include/asm/mmu.h | 40 | ||||
-rw-r--r-- | arch/sh/include/asm/page.h | 17 | ||||
-rw-r--r-- | arch/sh/include/asm/ptrace.h | 11 | ||||
-rw-r--r-- | arch/sh/include/asm/uncached.h | 18 |
5 files changed, 62 insertions, 46 deletions
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index bd5fafa23eb4..7dab7b23a5ec 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
@@ -133,6 +133,28 @@ static inline void ctrl_delay(void) | |||
133 | __raw_readw(generic_io_base); | 133 | __raw_readw(generic_io_base); |
134 | } | 134 | } |
135 | 135 | ||
136 | #define __BUILD_UNCACHED_IO(bwlq, type) \ | ||
137 | static inline type read##bwlq##_uncached(unsigned long addr) \ | ||
138 | { \ | ||
139 | type ret; \ | ||
140 | jump_to_uncached(); \ | ||
141 | ret = __raw_read##bwlq(addr); \ | ||
142 | back_to_cached(); \ | ||
143 | return ret; \ | ||
144 | } \ | ||
145 | \ | ||
146 | static inline void write##bwlq##_uncached(type v, unsigned long addr) \ | ||
147 | { \ | ||
148 | jump_to_uncached(); \ | ||
149 | __raw_write##bwlq(v, addr); \ | ||
150 | back_to_cached(); \ | ||
151 | } | ||
152 | |||
153 | __BUILD_UNCACHED_IO(b, u8) | ||
154 | __BUILD_UNCACHED_IO(w, u16) | ||
155 | __BUILD_UNCACHED_IO(l, u32) | ||
156 | __BUILD_UNCACHED_IO(q, u64) | ||
157 | |||
136 | #define __BUILD_MEMORY_STRING(bwlq, type) \ | 158 | #define __BUILD_MEMORY_STRING(bwlq, type) \ |
137 | \ | 159 | \ |
138 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ | 160 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ |
diff --git a/arch/sh/include/asm/mmu.h b/arch/sh/include/asm/mmu.h index ca7d91e8aa72..15a05b615ba7 100644 --- a/arch/sh/include/asm/mmu.h +++ b/arch/sh/include/asm/mmu.h | |||
@@ -11,7 +11,9 @@ | |||
11 | 11 | ||
12 | #define PMB_ADDR 0xf6100000 | 12 | #define PMB_ADDR 0xf6100000 |
13 | #define PMB_DATA 0xf7100000 | 13 | #define PMB_DATA 0xf7100000 |
14 | #define PMB_ENTRY_MAX 16 | 14 | |
15 | #define NR_PMB_ENTRIES 16 | ||
16 | |||
15 | #define PMB_E_MASK 0x0000000f | 17 | #define PMB_E_MASK 0x0000000f |
16 | #define PMB_E_SHIFT 8 | 18 | #define PMB_E_SHIFT 8 |
17 | 19 | ||
@@ -25,6 +27,7 @@ | |||
25 | #define PMB_C 0x00000008 | 27 | #define PMB_C 0x00000008 |
26 | #define PMB_WT 0x00000001 | 28 | #define PMB_WT 0x00000001 |
27 | #define PMB_UB 0x00000200 | 29 | #define PMB_UB 0x00000200 |
30 | #define PMB_CACHE_MASK (PMB_C | PMB_WT | PMB_UB) | ||
28 | #define PMB_V 0x00000100 | 31 | #define PMB_V 0x00000100 |
29 | 32 | ||
30 | #define PMB_NO_ENTRY (-1) | 33 | #define PMB_NO_ENTRY (-1) |
@@ -32,6 +35,7 @@ | |||
32 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
33 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
34 | #include <linux/threads.h> | 37 | #include <linux/threads.h> |
38 | #include <asm/page.h> | ||
35 | 39 | ||
36 | /* Default "unsigned long" context */ | 40 | /* Default "unsigned long" context */ |
37 | typedef unsigned long mm_context_id_t[NR_CPUS]; | 41 | typedef unsigned long mm_context_id_t[NR_CPUS]; |
@@ -49,46 +53,22 @@ typedef struct { | |||
49 | #endif | 53 | #endif |
50 | } mm_context_t; | 54 | } mm_context_t; |
51 | 55 | ||
52 | struct pmb_entry; | ||
53 | |||
54 | struct pmb_entry { | ||
55 | unsigned long vpn; | ||
56 | unsigned long ppn; | ||
57 | unsigned long flags; | ||
58 | |||
59 | /* | ||
60 | * 0 .. NR_PMB_ENTRIES for specific entry selection, or | ||
61 | * PMB_NO_ENTRY to search for a free one | ||
62 | */ | ||
63 | int entry; | ||
64 | |||
65 | struct pmb_entry *next; | ||
66 | /* Adjacent entry link for contiguous multi-entry mappings */ | ||
67 | struct pmb_entry *link; | ||
68 | }; | ||
69 | |||
70 | #ifdef CONFIG_PMB | 56 | #ifdef CONFIG_PMB |
71 | /* arch/sh/mm/pmb.c */ | 57 | /* arch/sh/mm/pmb.c */ |
72 | long pmb_remap(unsigned long virt, unsigned long phys, | 58 | long pmb_remap(unsigned long virt, unsigned long phys, |
73 | unsigned long size, unsigned long flags); | 59 | unsigned long size, pgprot_t prot); |
74 | void pmb_unmap(unsigned long addr); | 60 | void pmb_unmap(unsigned long addr); |
75 | int pmb_init(void); | 61 | void pmb_init(void); |
76 | bool __in_29bit_mode(void); | 62 | bool __in_29bit_mode(void); |
77 | #else | 63 | #else |
78 | static inline long pmb_remap(unsigned long virt, unsigned long phys, | 64 | static inline long pmb_remap(unsigned long virt, unsigned long phys, |
79 | unsigned long size, unsigned long flags) | 65 | unsigned long size, pgprot_t prot) |
80 | { | 66 | { |
81 | return -EINVAL; | 67 | return -EINVAL; |
82 | } | 68 | } |
83 | 69 | ||
84 | static inline void pmb_unmap(unsigned long addr) | 70 | #define pmb_unmap(addr) do { } while (0) |
85 | { | 71 | #define pmb_init(addr) do { } while (0) |
86 | } | ||
87 | |||
88 | static inline int pmb_init(void) | ||
89 | { | ||
90 | return -ENODEV; | ||
91 | } | ||
92 | 72 | ||
93 | #ifdef CONFIG_29BIT | 73 | #ifdef CONFIG_29BIT |
94 | #define __in_29bit_mode() (1) | 74 | #define __in_29bit_mode() (1) |
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h index 61e58105adc3..d71feb359304 100644 --- a/arch/sh/include/asm/page.h +++ b/arch/sh/include/asm/page.h | |||
@@ -45,6 +45,7 @@ | |||
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #ifndef __ASSEMBLY__ | 47 | #ifndef __ASSEMBLY__ |
48 | #include <asm/uncached.h> | ||
48 | 49 | ||
49 | extern unsigned long shm_align_mask; | 50 | extern unsigned long shm_align_mask; |
50 | extern unsigned long max_low_pfn, min_low_pfn; | 51 | extern unsigned long max_low_pfn, min_low_pfn; |
@@ -56,7 +57,6 @@ pages_do_alias(unsigned long addr1, unsigned long addr2) | |||
56 | return (addr1 ^ addr2) & shm_align_mask; | 57 | return (addr1 ^ addr2) & shm_align_mask; |
57 | } | 58 | } |
58 | 59 | ||
59 | |||
60 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) | 60 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) |
61 | extern void copy_page(void *to, void *from); | 61 | extern void copy_page(void *to, void *from); |
62 | 62 | ||
@@ -127,12 +127,7 @@ typedef struct page *pgtable_t; | |||
127 | * is not visible (it is part of the PMB mapping) and so needs to be | 127 | * is not visible (it is part of the PMB mapping) and so needs to be |
128 | * added or subtracted as required. | 128 | * added or subtracted as required. |
129 | */ | 129 | */ |
130 | #if defined(CONFIG_PMB_LEGACY) | 130 | #ifdef CONFIG_PMB |
131 | /* phys = virt - PAGE_OFFSET - (__MEMORY_START & 0xe0000000) */ | ||
132 | #define PMB_OFFSET (PAGE_OFFSET - PXSEG(__MEMORY_START)) | ||
133 | #define __pa(x) ((unsigned long)(x) - PMB_OFFSET) | ||
134 | #define __va(x) ((void *)((unsigned long)(x) + PMB_OFFSET)) | ||
135 | #elif defined(CONFIG_32BIT) | ||
136 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START) | 131 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START) |
137 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START)) | 132 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START)) |
138 | #else | 133 | #else |
@@ -140,6 +135,14 @@ typedef struct page *pgtable_t; | |||
140 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) | 135 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) |
141 | #endif | 136 | #endif |
142 | 137 | ||
138 | #ifdef CONFIG_UNCACHED_MAPPING | ||
139 | #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + uncached_start) | ||
140 | #define CAC_ADDR(addr) ((addr) - uncached_start + PAGE_OFFSET) | ||
141 | #else | ||
142 | #define UNCAC_ADDR(addr) ((addr)) | ||
143 | #define CAC_ADDR(addr) ((addr)) | ||
144 | #endif | ||
145 | |||
143 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 146 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
144 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) | 147 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) |
145 | 148 | ||
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index e879dffa324b..e11b14ea2c43 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
@@ -139,15 +139,8 @@ static inline unsigned long profile_pc(struct pt_regs *regs) | |||
139 | { | 139 | { |
140 | unsigned long pc = instruction_pointer(regs); | 140 | unsigned long pc = instruction_pointer(regs); |
141 | 141 | ||
142 | #ifdef CONFIG_UNCACHED_MAPPING | 142 | if (virt_addr_uncached(pc)) |
143 | /* | 143 | return CAC_ADDR(pc); |
144 | * If PC points in to the uncached mapping, fix it up and hand | ||
145 | * back the cached equivalent. | ||
146 | */ | ||
147 | if ((pc >= (memory_start + cached_to_uncached)) && | ||
148 | (pc < (memory_start + cached_to_uncached + uncached_size))) | ||
149 | pc -= cached_to_uncached; | ||
150 | #endif | ||
151 | 144 | ||
152 | return pc; | 145 | return pc; |
153 | } | 146 | } |
diff --git a/arch/sh/include/asm/uncached.h b/arch/sh/include/asm/uncached.h new file mode 100644 index 000000000000..e3419f96626a --- /dev/null +++ b/arch/sh/include/asm/uncached.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef __ASM_SH_UNCACHED_H | ||
2 | #define __ASM_SH_UNCACHED_H | ||
3 | |||
4 | #include <linux/bug.h> | ||
5 | |||
6 | #ifdef CONFIG_UNCACHED_MAPPING | ||
7 | extern unsigned long uncached_start, uncached_end; | ||
8 | |||
9 | extern int virt_addr_uncached(unsigned long kaddr); | ||
10 | extern void uncached_init(void); | ||
11 | extern void uncached_resize(unsigned long size); | ||
12 | #else | ||
13 | #define virt_addr_uncached(kaddr) (0) | ||
14 | #define uncached_init() do { } while (0) | ||
15 | #define uncached_resize(size) BUG() | ||
16 | #endif | ||
17 | |||
18 | #endif /* __ASM_SH_UNCACHED_H */ | ||