diff options
Diffstat (limited to 'arch/m32r')
87 files changed, 24796 insertions, 0 deletions
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig new file mode 100644 index 000000000000..0d90ea58a0cb --- /dev/null +++ b/arch/m32r/Kconfig | |||
@@ -0,0 +1,367 @@ | |||
1 | # | ||
2 | # For a description of the syntax of this configuration file, | ||
3 | # see Documentation/kbuild/kconfig-language.txt. | ||
4 | # | ||
5 | |||
6 | mainmenu "Linux/M32R Kernel Configuration" | ||
7 | |||
8 | config M32R | ||
9 | bool | ||
10 | default y | ||
11 | |||
12 | config SBUS | ||
13 | bool | ||
14 | |||
15 | config UID16 | ||
16 | bool | ||
17 | default n | ||
18 | |||
19 | config GENERIC_ISA_DMA | ||
20 | bool | ||
21 | default y | ||
22 | |||
23 | config GENERIC_HARDIRQS | ||
24 | bool | ||
25 | default y | ||
26 | |||
27 | config GENERIC_IRQ_PROBE | ||
28 | bool | ||
29 | default y | ||
30 | |||
31 | source "init/Kconfig" | ||
32 | |||
33 | |||
34 | menu "Processor type and features" | ||
35 | |||
36 | choice | ||
37 | prompt "Platform Type" | ||
38 | default PLAT_MAPPI | ||
39 | |||
40 | config PLAT_MAPPI | ||
41 | bool "Mappi-I" | ||
42 | help | ||
43 | The Mappi-I is an FPGA board for SOC (System-On-a-Chip) prototyping. | ||
44 | You can operate a Linux system on this board by using an M32R | ||
45 | softmacro core, which is a fully-synthesizable functional model | ||
46 | described in Verilog-HDL. | ||
47 | |||
48 | The Mappi-I board was the first platform, which had been used | ||
49 | to port and develop a Linux system for the M32R processor. | ||
50 | Currently, the Mappi-II, an heir to the Mappi-I, is available. | ||
51 | |||
52 | config PLAT_USRV | ||
53 | bool "uServer" | ||
54 | |||
55 | config PLAT_M32700UT | ||
56 | bool "M32700UT" | ||
57 | help | ||
58 | The M3T-M32700UT is an evaluation board based on uT-Engine | ||
59 | specification. This board has an M32700 (Chaos) evaluation chip. | ||
60 | You can say Y for SMP, because the M32700 is a single chip | ||
61 | multiprocessor. | ||
62 | |||
63 | config PLAT_OPSPUT | ||
64 | bool "OPSPUT" | ||
65 | help | ||
66 | The OPSPUT is an evaluation board based on uT-Engine | ||
67 | specification. This board has a OPSP-REP chip. | ||
68 | |||
69 | config PLAT_OAKS32R | ||
70 | bool "OAKS32R" | ||
71 | help | ||
72 | The OAKS32R is a tiny, inexpensive evaluation board. | ||
73 | Please note that if you say Y here and choose chip "M32102", | ||
74 | say N for MMU and select a no-MMU version kernel, otherwise | ||
75 | a kernel with MMU support will not work, because the M32102 | ||
76 | is a microcontroller for embedded systems and it has no MMU. | ||
77 | |||
78 | config PLAT_MAPPI2 | ||
79 | bool "Mappi-II(M3A-ZA36/M3A-ZA52)" | ||
80 | |||
81 | endchoice | ||
82 | |||
83 | choice | ||
84 | prompt "Processor family" | ||
85 | default CHIP_M32700 | ||
86 | |||
87 | config CHIP_M32700 | ||
88 | bool "M32700 (Chaos)" | ||
89 | |||
90 | config CHIP_M32102 | ||
91 | bool "M32102" | ||
92 | |||
93 | config CHIP_VDEC2 | ||
94 | bool "VDEC2" | ||
95 | |||
96 | config CHIP_OPSP | ||
97 | bool "OPSP" | ||
98 | |||
99 | endchoice | ||
100 | |||
101 | config MMU | ||
102 | bool "Support for memory management hardware" | ||
103 | depends on CHIP_M32700 || CHIP_VDEC2 || CHIP_OPSP | ||
104 | default y | ||
105 | |||
106 | config TLB_ENTRIES | ||
107 | int "TLB Entries" | ||
108 | depends on CHIP_M32700 || CHIP_VDEC2 || CHIP_OPSP | ||
109 | default 32 if CHIP_M32700 || CHIP_OPSP | ||
110 | default 16 if CHIP_VDEC2 | ||
111 | |||
112 | |||
113 | config ISA_M32R | ||
114 | bool | ||
115 | depends on CHIP_M32102 | ||
116 | default y | ||
117 | |||
118 | config ISA_M32R2 | ||
119 | bool | ||
120 | depends on CHIP_M32700 || CHIP_VDEC2 || CHIP_OPSP | ||
121 | default y | ||
122 | |||
123 | config ISA_DSP_LEVEL2 | ||
124 | bool | ||
125 | depends on CHIP_M32700 || CHIP_OPSP | ||
126 | default y | ||
127 | |||
128 | config ISA_DUAL_ISSUE | ||
129 | bool | ||
130 | depends on CHIP_M32700 || CHIP_OPSP | ||
131 | default y | ||
132 | |||
133 | config BUS_CLOCK | ||
134 | int "Bus Clock [Hz] (integer)" | ||
135 | default "70000000" if PLAT_MAPPI | ||
136 | default "25000000" if PLAT_USRV | ||
137 | default "50000000" if PLAT_M32700UT | ||
138 | default "50000000" if PLAT_OPSPUT | ||
139 | default "33333333" if PLAT_OAKS32R | ||
140 | default "20000000" if PLAT_MAPPI2 | ||
141 | |||
142 | config TIMER_DIVIDE | ||
143 | int "Timer divider (integer)" | ||
144 | default "128" | ||
145 | |||
146 | config CPU_LITTLE_ENDIAN | ||
147 | bool "Generate little endian code" | ||
148 | default n | ||
149 | |||
150 | config MEMORY_START | ||
151 | hex "Physical memory start address (hex)" | ||
152 | default "08000000" if PLAT_MAPPI || PLAT_MAPPI2 | ||
153 | default "08000000" if PLAT_USRV | ||
154 | default "08000000" if PLAT_M32700UT | ||
155 | default "08000000" if PLAT_OPSPUT | ||
156 | default "01000000" if PLAT_OAKS32R | ||
157 | |||
158 | config MEMORY_SIZE | ||
159 | hex "Physical memory size (hex)" | ||
160 | default "04000000" if PLAT_MAPPI || PLAT_MAPPI2 | ||
161 | default "02000000" if PLAT_USRV | ||
162 | default "01000000" if PLAT_M32700UT | ||
163 | default "01000000" if PLAT_OPSPUT | ||
164 | default "00800000" if PLAT_OAKS32R | ||
165 | |||
166 | config NOHIGHMEM | ||
167 | bool | ||
168 | default y | ||
169 | |||
170 | config DISCONTIGMEM | ||
171 | bool "Internal RAM Support" | ||
172 | depends on CHIP_M32700 || CHIP_M32102 || CHIP_VDEC2 || CHIP_OPSP | ||
173 | default y | ||
174 | |||
175 | config IRAM_START | ||
176 | hex "Internal memory start address (hex)" | ||
177 | default "00f00000" | ||
178 | depends on (CHIP_M32700 || CHIP_M32102 || CHIP_VDEC2 || CHIP_OPSP) && DISCONTIGMEM | ||
179 | |||
180 | config IRAM_SIZE | ||
181 | hex "Internal memory size (hex)" | ||
182 | depends on (CHIP_M32700 || CHIP_M32102 || CHIP_VDEC2 || CHIP_OPSP) && DISCONTIGMEM | ||
183 | default "00080000" if CHIP_M32700 | ||
184 | default "00010000" if CHIP_M32102 || CHIP_OPSP | ||
185 | default "00008000" if CHIP_VDEC2 | ||
186 | |||
187 | # | ||
188 | # Define implied options from the CPU selection here | ||
189 | # | ||
190 | |||
191 | config RWSEM_GENERIC_SPINLOCK | ||
192 | bool | ||
193 | depends on M32R | ||
194 | default y | ||
195 | |||
196 | config RWSEM_XCHGADD_ALGORITHM | ||
197 | bool | ||
198 | default n | ||
199 | |||
200 | config GENERIC_CALIBRATE_DELAY | ||
201 | bool | ||
202 | default y | ||
203 | |||
204 | config PREEMPT | ||
205 | bool "Preemptible Kernel" | ||
206 | help | ||
207 | This option reduces the latency of the kernel when reacting to | ||
208 | real-time or interactive events by allowing a low priority process to | ||
209 | be preempted even if it is in kernel mode executing a system call. | ||
210 | This allows applications to run more reliably even when the system is | ||
211 | under load. | ||
212 | |||
213 | Say Y here if you are building a kernel for a desktop, embedded | ||
214 | or real-time system. Say N if you are unsure. | ||
215 | |||
216 | config HAVE_DEC_LOCK | ||
217 | bool | ||
218 | depends on (SMP || PREEMPT) | ||
219 | default n | ||
220 | |||
221 | config SMP | ||
222 | bool "Symmetric multi-processing support" | ||
223 | ---help--- | ||
224 | This enables support for systems with more than one CPU. If you have | ||
225 | a system with only one CPU, like most personal computers, say N. If | ||
226 | you have a system with more than one CPU, say Y. | ||
227 | |||
228 | If you say N here, the kernel will run on single and multiprocessor | ||
229 | machines, but will use only one CPU of a multiprocessor machine. If | ||
230 | you say Y here, the kernel will run on many, but not all, | ||
231 | singleprocessor machines. On a singleprocessor machine, the kernel | ||
232 | will run faster if you say N here. | ||
233 | |||
234 | People using multiprocessor machines who say Y here should also say | ||
235 | Y to "Enhanced Real Time Clock Support", below. The "Advanced Power | ||
236 | Management" code will be disabled if you say Y here. | ||
237 | |||
238 | See also the <file:Documentation/smp.tex>, | ||
239 | <file:Documentation/smp.txt> and the SMP-HOWTO available at | ||
240 | <http://www.linuxdoc.org/docs.html#howto>. | ||
241 | |||
242 | If you don't know what to do here, say N. | ||
243 | |||
244 | config CHIP_M32700_TS1 | ||
245 | bool "Workaround code for the M32700 TS1 chip's bug" | ||
246 | depends on (CHIP_M32700 && SMP) | ||
247 | default n | ||
248 | |||
249 | config NR_CPUS | ||
250 | int "Maximum number of CPUs (2-32)" | ||
251 | range 2 32 | ||
252 | depends on SMP | ||
253 | default "2" | ||
254 | help | ||
255 | This allows you to specify the maximum number of CPUs which this | ||
256 | kernel will support. The maximum supported value is 32 and the | ||
257 | minimum value which makes sense is 2. | ||
258 | |||
259 | This is purely to save memory - each supported CPU adds | ||
260 | approximately eight kilobytes to the kernel image. | ||
261 | |||
262 | # Common NUMA Features | ||
263 | config NUMA | ||
264 | bool "Numa Memory Allocation Support" | ||
265 | depends on SMP | ||
266 | default n | ||
267 | |||
268 | # turning this on wastes a bunch of space. | ||
269 | # Summit needs it only when NUMA is on | ||
270 | config BOOT_IOREMAP | ||
271 | bool | ||
272 | depends on NUMA | ||
273 | default n | ||
274 | |||
275 | endmenu | ||
276 | |||
277 | |||
278 | menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)" | ||
279 | |||
280 | config PCI | ||
281 | bool "PCI support" | ||
282 | default n | ||
283 | help | ||
284 | Find out whether you have a PCI motherboard. PCI is the name of a | ||
285 | bus system, i.e. the way the CPU talks to the other stuff inside | ||
286 | your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or | ||
287 | VESA. If you have PCI, say Y, otherwise N. | ||
288 | |||
289 | The PCI-HOWTO, available from | ||
290 | <http://www.linuxdoc.org/docs.html#howto>, contains valuable | ||
291 | information about which PCI hardware does work under Linux and which | ||
292 | doesn't. | ||
293 | |||
294 | choice | ||
295 | prompt "PCI access mode" | ||
296 | depends on PCI | ||
297 | default PCI_GOANY | ||
298 | |||
299 | config PCI_GOBIOS | ||
300 | bool "BIOS" | ||
301 | ---help--- | ||
302 | On PCI systems, the BIOS can be used to detect the PCI devices and | ||
303 | determine their configuration. However, some old PCI motherboards | ||
304 | have BIOS bugs and may crash if this is done. Also, some embedded | ||
305 | PCI-based systems don't have any BIOS at all. Linux can also try to | ||
306 | detect the PCI hardware directly without using the BIOS. | ||
307 | |||
308 | With this option, you can specify how Linux should detect the PCI | ||
309 | devices. If you choose "BIOS", the BIOS will be used, if you choose | ||
310 | "Direct", the BIOS won't be used, and if you choose "Any", the | ||
311 | kernel will try the direct access method and falls back to the BIOS | ||
312 | if that doesn't work. If unsure, go with the default, which is | ||
313 | "Any". | ||
314 | |||
315 | config PCI_GODIRECT | ||
316 | bool "Direct" | ||
317 | |||
318 | config PCI_GOANY | ||
319 | bool "Any" | ||
320 | |||
321 | endchoice | ||
322 | |||
323 | config PCI_BIOS | ||
324 | bool | ||
325 | depends on PCI && (PCI_GOBIOS || PCI_GOANY) | ||
326 | default y | ||
327 | |||
328 | config PCI_DIRECT | ||
329 | bool | ||
330 | depends on PCI && (PCI_GODIRECT || PCI_GOANY) | ||
331 | default y | ||
332 | |||
333 | source "drivers/pci/Kconfig" | ||
334 | |||
335 | config ISA | ||
336 | bool "ISA support" | ||
337 | help | ||
338 | Find out whether you have ISA slots on your motherboard. ISA is the | ||
339 | name of a bus system, i.e. the way the CPU talks to the other stuff | ||
340 | inside your box. If you have ISA, say Y, otherwise N. | ||
341 | |||
342 | source "drivers/pcmcia/Kconfig" | ||
343 | |||
344 | source "drivers/pci/hotplug/Kconfig" | ||
345 | |||
346 | endmenu | ||
347 | |||
348 | |||
349 | menu "Executable file formats" | ||
350 | |||
351 | source "fs/Kconfig.binfmt" | ||
352 | |||
353 | endmenu | ||
354 | |||
355 | source "drivers/Kconfig" | ||
356 | |||
357 | source "fs/Kconfig" | ||
358 | |||
359 | source "arch/m32r/oprofile/Kconfig" | ||
360 | |||
361 | source "arch/m32r/Kconfig.debug" | ||
362 | |||
363 | source "security/Kconfig" | ||
364 | |||
365 | source "crypto/Kconfig" | ||
366 | |||
367 | source "lib/Kconfig" | ||
diff --git a/arch/m32r/Kconfig.debug b/arch/m32r/Kconfig.debug new file mode 100644 index 000000000000..36788c2c310d --- /dev/null +++ b/arch/m32r/Kconfig.debug | |||
@@ -0,0 +1,34 @@ | |||
1 | menu "Kernel hacking" | ||
2 | |||
3 | source "lib/Kconfig.debug" | ||
4 | |||
5 | config DEBUG_STACKOVERFLOW | ||
6 | bool "Check for stack overflows" | ||
7 | depends on DEBUG_KERNEL | ||
8 | |||
9 | config DEBUG_STACK_USAGE | ||
10 | bool "Stack utilization instrumentation" | ||
11 | depends on DEBUG_KERNEL | ||
12 | help | ||
13 | Enables the display of the minimum amount of free stack which each | ||
14 | task has ever had available in the sysrq-T and sysrq-P debug output. | ||
15 | |||
16 | This option will slow down process creation somewhat. | ||
17 | |||
18 | config DEBUG_PAGEALLOC | ||
19 | bool "Page alloc debugging" | ||
20 | depends on DEBUG_KERNEL | ||
21 | help | ||
22 | Unmap pages from the kernel linear mapping after free_pages(). | ||
23 | This results in a large slowdown, but helps to find certain types | ||
24 | of memory corruptions. | ||
25 | |||
26 | config FRAME_POINTER | ||
27 | bool "Compile the kernel with frame pointers" | ||
28 | help | ||
29 | If you say Y here the resulting kernel image will be slightly larger | ||
30 | and slower, but it will give very useful debugging information. | ||
31 | If you don't debug the kernel, you can say N, but we may not be able | ||
32 | to solve problems without frame pointers. | ||
33 | |||
34 | endmenu | ||
diff --git a/arch/m32r/Makefile b/arch/m32r/Makefile new file mode 100644 index 000000000000..dd4418d846e9 --- /dev/null +++ b/arch/m32r/Makefile | |||
@@ -0,0 +1,56 @@ | |||
1 | # | ||
2 | # m32r/Makefile | ||
3 | # | ||
4 | |||
5 | LDFLAGS := | ||
6 | OBJCOPYFLAGS := -O binary -R .note -R .comment -S | ||
7 | LDFLAGS_vmlinux := -e startup_32 | ||
8 | |||
9 | CFLAGS += -pipe -fno-schedule-insns | ||
10 | CFLAGS_KERNEL += -mmodel=medium | ||
11 | CFLAGS_MODULE += -mmodel=large | ||
12 | |||
13 | ifdef CONFIG_CHIP_VDEC2 | ||
14 | cflags-$(CONFIG_ISA_M32R2) += -DNO_FPU -Wa,-bitinst | ||
15 | aflags-$(CONFIG_ISA_M32R2) += -DNO_FPU -Wa,-bitinst | ||
16 | else | ||
17 | cflags-$(CONFIG_ISA_M32R2) += -DNO_FPU -m32r2 | ||
18 | aflags-$(CONFIG_ISA_M32R2) += -DNO_FPU -m32r2 | ||
19 | endif | ||
20 | |||
21 | cflags-$(CONFIG_ISA_M32R) += -DNO_FPU | ||
22 | aflags-$(CONFIG_ISA_M32R) += -DNO_FPU -Wa,-no-bitinst | ||
23 | |||
24 | CFLAGS += $(cflags-y) | ||
25 | AFLAGS += $(aflags-y) | ||
26 | |||
27 | CHECKFLAGS := $(CHECK) -D__m32r__ | ||
28 | |||
29 | head-y := arch/m32r/kernel/head.o arch/m32r/kernel/init_task.o | ||
30 | |||
31 | LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) | ||
32 | |||
33 | libs-y += arch/m32r/lib/ $(LIBGCC) | ||
34 | core-y += arch/m32r/kernel/ \ | ||
35 | arch/m32r/mm/ \ | ||
36 | arch/m32r/boot/ | ||
37 | |||
38 | drivers-$(CONFIG_OPROFILE) += arch/m32r/oprofile/ | ||
39 | |||
40 | boot := arch/m32r/boot | ||
41 | |||
42 | .PHONY: zImage | ||
43 | |||
44 | all: zImage | ||
45 | |||
46 | zImage: vmlinux | ||
47 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ | ||
48 | |||
49 | compressed: zImage | ||
50 | |||
51 | archclean: | ||
52 | $(Q)$(MAKE) $(clean)=$(boot) | ||
53 | |||
54 | define archhelp | ||
55 | echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)' | ||
56 | endef | ||
diff --git a/arch/m32r/boot/Makefile b/arch/m32r/boot/Makefile new file mode 100644 index 000000000000..af2cef475d98 --- /dev/null +++ b/arch/m32r/boot/Makefile | |||
@@ -0,0 +1,19 @@ | |||
1 | # | ||
2 | # arch/m32r/boot/Makefile | ||
3 | # | ||
4 | # This file is subject to the terms and conditions of the GNU General Public | ||
5 | # License. See the file "COPYING" in the main directory of this archive | ||
6 | # for more details. | ||
7 | |||
8 | targets := zImage | ||
9 | subdir- := compressed | ||
10 | |||
11 | obj-y := setup.o | ||
12 | |||
13 | $(obj)/zImage: $(obj)/compressed/vmlinux FORCE | ||
14 | $(call if_changed,objcopy) | ||
15 | @echo 'Kernel: $@ is ready' | ||
16 | |||
17 | $(obj)/compressed/vmlinux: FORCE | ||
18 | $(Q)$(MAKE) $(build)=$(obj)/compressed $@ | ||
19 | |||
diff --git a/arch/m32r/boot/compressed/Makefile b/arch/m32r/boot/compressed/Makefile new file mode 100644 index 000000000000..d908e1d3c07f --- /dev/null +++ b/arch/m32r/boot/compressed/Makefile | |||
@@ -0,0 +1,42 @@ | |||
1 | # | ||
2 | # linux/arch/sh/boot/compressed/Makefile | ||
3 | # | ||
4 | # create a compressed vmlinux image from the original vmlinux | ||
5 | # | ||
6 | |||
7 | targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o \ | ||
8 | piggy.o vmlinux.lds | ||
9 | EXTRA_AFLAGS := -traditional | ||
10 | |||
11 | OBJECTS = $(obj)/head.o $(obj)/misc.o | ||
12 | |||
13 | # | ||
14 | # IMAGE_OFFSET is the load offset of the compression loader | ||
15 | # | ||
16 | #IMAGE_OFFSET := $(shell printf "0x%08x" $$[$(CONFIG_MEMORY_START)+0x2000]) | ||
17 | #IMAGE_OFFSET := $(shell printf "0x%08x" $$[$(CONFIG_MEMORY_START)+0x00400000]) | ||
18 | |||
19 | LDFLAGS_vmlinux := -T | ||
20 | |||
21 | $(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS) $(obj)/piggy.o FORCE | ||
22 | $(call if_changed,ld) | ||
23 | @: | ||
24 | |||
25 | $(obj)/vmlinux.bin: vmlinux FORCE | ||
26 | $(call if_changed,objcopy) | ||
27 | |||
28 | $(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE | ||
29 | $(call if_changed,gzip) | ||
30 | |||
31 | CFLAGS_misc.o += -fpic | ||
32 | |||
33 | ifdef CONFIG_MMU | ||
34 | LDFLAGS_piggy.o := -r --format binary --oformat elf32-m32r-linux -T | ||
35 | else | ||
36 | LDFLAGS_piggy.o := -r --format binary --oformat elf32-m32r -T | ||
37 | endif | ||
38 | |||
39 | OBJCOPYFLAGS += -R .empty_zero_page | ||
40 | |||
41 | $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE | ||
42 | $(call if_changed,ld) | ||
diff --git a/arch/m32r/boot/compressed/boot.h b/arch/m32r/boot/compressed/boot.h new file mode 100644 index 000000000000..9272e38d1104 --- /dev/null +++ b/arch/m32r/boot/compressed/boot.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /* | ||
2 | * 1. load vmlinuz | ||
3 | * | ||
4 | * CONFIG_MEMORY_START +-----------------------+ | ||
5 | * | vmlinuz | | ||
6 | * +-----------------------+ | ||
7 | * 2. decompressed | ||
8 | * | ||
9 | * CONFIG_MEMORY_START +-----------------------+ | ||
10 | * | vmlinuz | | ||
11 | * +-----------------------+ | ||
12 | * | | | ||
13 | * BOOT_RELOC_ADDR +-----------------------+ | ||
14 | * | | | ||
15 | * KERNEL_DECOMPRESS_ADDR +-----------------------+ | ||
16 | * | vmlinux | | ||
17 | * +-----------------------+ | ||
18 | * | ||
19 | * 3. relocate copy & jump code | ||
20 | * | ||
21 | * CONFIG_MEMORY_START +-----------------------+ | ||
22 | * | vmlinuz | | ||
23 | * +-----------------------+ | ||
24 | * | | | ||
25 | * BOOT_RELOC_ADDR +-----------------------+ | ||
26 | * | boot(copy&jump) | | ||
27 | * KERNEL_DECOMPRESS_ADDR +-----------------------+ | ||
28 | * | vmlinux | | ||
29 | * +-----------------------+ | ||
30 | * | ||
31 | * 4. relocate decompressed kernel | ||
32 | * | ||
33 | * CONFIG_MEMORY_START +-----------------------+ | ||
34 | * | vmlinux | | ||
35 | * +-----------------------+ | ||
36 | * | | | ||
37 | * BOOT_RELOC_ADDR +-----------------------+ | ||
38 | * | boot(copy&jump) | | ||
39 | * KERNEL_DECOMPRESS_ADDR +-----------------------+ | ||
40 | * | | | ||
41 | * +-----------------------+ | ||
42 | * | ||
43 | */ | ||
44 | #ifdef __ASSEMBLY__ | ||
45 | #define __val(x) x | ||
46 | #else | ||
47 | #define __val(x) (x) | ||
48 | #endif | ||
49 | |||
50 | #define DECOMPRESS_OFFSET_BASE __val(0x00900000) | ||
51 | #define BOOT_RELOC_SIZE __val(0x00001000) | ||
52 | |||
53 | #define KERNEL_EXEC_ADDR __val(CONFIG_MEMORY_START) | ||
54 | #define KERNEL_DECOMPRESS_ADDR __val(CONFIG_MEMORY_START + \ | ||
55 | DECOMPRESS_OFFSET_BASE + BOOT_RELOC_SIZE) | ||
56 | #define KERNEL_ENTRY __val(CONFIG_MEMORY_START + 0x1000) | ||
57 | |||
58 | #define BOOT_EXEC_ADDR __val(CONFIG_MEMORY_START) | ||
59 | #define BOOT_RELOC_ADDR __val(CONFIG_MEMORY_START + DECOMPRESS_OFFSET_BASE) | ||
diff --git a/arch/m32r/boot/compressed/head.S b/arch/m32r/boot/compressed/head.S new file mode 100644 index 000000000000..07cfd6ad1ae4 --- /dev/null +++ b/arch/m32r/boot/compressed/head.S | |||
@@ -0,0 +1,172 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/boot/compressed/head.S | ||
3 | * | ||
4 | * Copyright (c) 2001-2003 Hiroyuki Kondo, Hirokazu Takata, | ||
5 | * Hitoshi Yamamoto, Takeo Takahashi | ||
6 | * Copyright (c) 2004 Hirokazu Takata | ||
7 | */ | ||
8 | |||
9 | .text | ||
10 | #include <linux/config.h> | ||
11 | #include <linux/linkage.h> | ||
12 | #include <asm/addrspace.h> | ||
13 | #include <asm/page.h> | ||
14 | #include <asm/assembler.h> | ||
15 | |||
16 | /* | ||
17 | * This code can be loaded anywhere, as long as output will not | ||
18 | * overlap it. | ||
19 | * | ||
20 | * NOTE: This head.S should *NOT* be compiled with -fpic. | ||
21 | * | ||
22 | */ | ||
23 | |||
24 | .global startup | ||
25 | .global __bss_start, _ebss, end, zimage_data, zimage_len | ||
26 | __ALIGN | ||
27 | startup: | ||
28 | ldi r0, #0x0000 /* SPI, disable EI */ | ||
29 | mvtc r0, psw | ||
30 | |||
31 | ldi r12, #-8 | ||
32 | bl 1f | ||
33 | .fillinsn | ||
34 | 1: | ||
35 | seth r1, #high(CONFIG_MEMORY_START + 0x00400000) /* Start address */ | ||
36 | add r12, r14 /* Real address */ | ||
37 | sub r12, r1 /* difference */ | ||
38 | |||
39 | .global got_len | ||
40 | seth r3, #high(_GLOBAL_OFFSET_TABLE_+8) | ||
41 | or3 r3, r3, #low(_GLOBAL_OFFSET_TABLE_+12) | ||
42 | add r3, r14 | ||
43 | |||
44 | /* Update the contents of global offset table */ | ||
45 | ldi r1, #low(got_len) | ||
46 | srli r1, #2 | ||
47 | beqz r1, 2f | ||
48 | .fillinsn | ||
49 | 1: | ||
50 | ld r2, @r3 | ||
51 | add r2, r12 | ||
52 | st r2, @r3 | ||
53 | addi r3, #4 | ||
54 | addi r1, #-1 | ||
55 | bnez r1, 1b | ||
56 | .fillinsn | ||
57 | 2: | ||
58 | /* XXX: resolve plt */ | ||
59 | |||
60 | /* | ||
61 | * Clear BSS first so that there are no surprises... | ||
62 | */ | ||
63 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
64 | seth r2, #high(__bss_start) | ||
65 | or3 r2, r2, #low(__bss_start) | ||
66 | add r2, r12 | ||
67 | seth r3, #high(_ebss) | ||
68 | or3 r3, r3, #low(_ebss) | ||
69 | add r3, r12 | ||
70 | sub r3, r2 | ||
71 | |||
72 | ; R4 = BSS size in longwords (rounded down) | ||
73 | mv r4, r3 || ldi r1, #0 | ||
74 | srli r4, #4 || addi r2, #-4 | ||
75 | beqz r4, .Lendloop1 | ||
76 | .Lloop1: | ||
77 | #ifndef CONFIG_CHIP_M32310 | ||
78 | ; Touch memory for the no-write-allocating cache. | ||
79 | ld r0, @(4,r2) | ||
80 | #endif | ||
81 | st r1, @+r2 || addi r4, #-1 | ||
82 | st r1, @+r2 | ||
83 | st r1, @+r2 | ||
84 | st r1, @+r2 || cmpeq r1, r4 ; R4 = 0? | ||
85 | bnc .Lloop1 | ||
86 | .Lendloop1: | ||
87 | and3 r4, r3, #15 | ||
88 | addi r2, #4 | ||
89 | beqz r4, .Lendloop2 | ||
90 | .Lloop2: | ||
91 | stb r1, @r2 || addi r4, #-1 | ||
92 | addi r2, #1 | ||
93 | bnez r4, .Lloop2 | ||
94 | .Lendloop2: | ||
95 | |||
96 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
97 | seth r2, #high(__bss_start) | ||
98 | or3 r2, r2, #low(__bss_start) | ||
99 | add r2, r12 | ||
100 | seth r3, #high(_ebss) | ||
101 | or3 r3, r3, #low(_ebss) | ||
102 | add r3, r12 | ||
103 | sub r3, r2 | ||
104 | mv r4, r3 | ||
105 | srli r4, #2 ; R4 = BSS size in longwords (rounded down) | ||
106 | ldi r1, #0 ; clear R1 for longwords store | ||
107 | addi r2, #-4 ; account for pre-inc store | ||
108 | beqz r4, .Lendloop1 ; any more to go? | ||
109 | .Lloop1: | ||
110 | st r1, @+r2 ; yep, zero out another longword | ||
111 | addi r4, #-1 ; decrement count | ||
112 | bnez r4, .Lloop1 ; go do some more | ||
113 | .Lendloop1: | ||
114 | |||
115 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
116 | |||
117 | seth r1, #high(end) | ||
118 | or3 r1, r1, #low(end) | ||
119 | add r1, r12 | ||
120 | mv sp, r1 | ||
121 | |||
122 | /* | ||
123 | * decompress the kernel | ||
124 | */ | ||
125 | mv r0, sp | ||
126 | srli r0, 31 /* MMU is ON or OFF */ | ||
127 | seth r1, #high(zimage_data) | ||
128 | or3 r1, r1, #low(zimage_data) | ||
129 | add r1, r12 | ||
130 | seth r2, #high(zimage_len) | ||
131 | or3 r2, r2, #low(zimage_len) | ||
132 | mv r3, sp | ||
133 | |||
134 | bl decompress_kernel | ||
135 | |||
136 | #if defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_OPSP) || defined(CONFIG_CHIP_VDEC2) | ||
137 | /* Cache flush */ | ||
138 | ldi r0, -1 | ||
139 | ldi r1, 0xd0 ; invalidate i-cache, copy back d-cache | ||
140 | stb r1, @r0 | ||
141 | #elif defined(CONFIG_CHIP_M32102) | ||
142 | /* Cache flush */ | ||
143 | ldi r0, -2 | ||
144 | ldi r1, 0x0100 ; invalidate | ||
145 | stb r1, @r0 | ||
146 | #else | ||
147 | #error "put your cache flush function, please" | ||
148 | #endif | ||
149 | |||
150 | mv r0, sp | ||
151 | srli r0, 31 /* MMU is ON or OFF */ | ||
152 | slli r0, 31 | ||
153 | or3 r0, r0, #0x2000 | ||
154 | seth r1, #high(CONFIG_MEMORY_START) | ||
155 | or r0, r1 | ||
156 | jmp r0 | ||
157 | |||
158 | .balign 512 | ||
159 | fake_headers_as_bzImage: | ||
160 | .short 0 | ||
161 | .ascii "HdrS" | ||
162 | .short 0x0202 | ||
163 | .short 0 | ||
164 | .short 0 | ||
165 | .byte 0x00, 0x10 | ||
166 | .short 0 | ||
167 | .byte 0 | ||
168 | .byte 1 | ||
169 | .byte 0x00, 0x80 | ||
170 | .long 0 | ||
171 | .long 0 | ||
172 | |||
diff --git a/arch/m32r/boot/compressed/install.sh b/arch/m32r/boot/compressed/install.sh new file mode 100644 index 000000000000..6d72e9e72697 --- /dev/null +++ b/arch/m32r/boot/compressed/install.sh | |||
@@ -0,0 +1,57 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # arch/sh/boot/install.sh | ||
4 | # | ||
5 | # This file is subject to the terms and conditions of the GNU General Public | ||
6 | # License. See the file "COPYING" in the main directory of this archive | ||
7 | # for more details. | ||
8 | # | ||
9 | # Copyright (C) 1995 by Linus Torvalds | ||
10 | # | ||
11 | # Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin | ||
12 | # Adapted from code in arch/i386/boot/install.sh by Russell King | ||
13 | # Adapted from code in arch/arm/boot/install.sh by Stuart Menefy | ||
14 | # Adapted from code in arch/sh/boot/install.sh by Takeo Takahashi | ||
15 | # | ||
16 | # "make install" script for sh architecture | ||
17 | # | ||
18 | # Arguments: | ||
19 | # $1 - kernel version | ||
20 | # $2 - kernel image file | ||
21 | # $3 - kernel map file | ||
22 | # $4 - default install path (blank if root directory) | ||
23 | # | ||
24 | |||
25 | # User may have a custom install script | ||
26 | |||
27 | if [ -x /sbin/installkernel ]; then | ||
28 | exec /sbin/installkernel "$@" | ||
29 | fi | ||
30 | |||
31 | if [ "$2" = "zImage" ]; then | ||
32 | # Compressed install | ||
33 | echo "Installing compressed kernel" | ||
34 | if [ -f $4/vmlinuz-$1 ]; then | ||
35 | mv $4/vmlinuz-$1 $4/vmlinuz.old | ||
36 | fi | ||
37 | |||
38 | if [ -f $4/System.map-$1 ]; then | ||
39 | mv $4/System.map-$1 $4/System.old | ||
40 | fi | ||
41 | |||
42 | cat $2 > $4/vmlinuz-$1 | ||
43 | cp $3 $4/System.map-$1 | ||
44 | else | ||
45 | # Normal install | ||
46 | echo "Installing normal kernel" | ||
47 | if [ -f $4/vmlinux-$1 ]; then | ||
48 | mv $4/vmlinux-$1 $4/vmlinux.old | ||
49 | fi | ||
50 | |||
51 | if [ -f $4/System.map ]; then | ||
52 | mv $4/System.map $4/System.old | ||
53 | fi | ||
54 | |||
55 | cat $2 > $4/vmlinux-$1 | ||
56 | cp $3 $4/System.map | ||
57 | fi | ||
diff --git a/arch/m32r/boot/compressed/m32r_sio.c b/arch/m32r/boot/compressed/m32r_sio.c new file mode 100644 index 000000000000..bad5475eff90 --- /dev/null +++ b/arch/m32r/boot/compressed/m32r_sio.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * arch/m32r/boot/compressed/m32r_sio.c | ||
3 | * | ||
4 | * 2003-02-12: Takeo Takahashi | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | #include <linux/config.h> | ||
9 | |||
10 | static void putc(char c); | ||
11 | |||
12 | static int puts(const char *s) | ||
13 | { | ||
14 | char c; | ||
15 | while ((c = *s++)) putc(c); | ||
16 | return 0; | ||
17 | } | ||
18 | |||
19 | #if defined(CONFIG_PLAT_M32700UT_Alpha) || defined(CONFIG_PLAT_M32700UT) | ||
20 | #include <asm/m32r.h> | ||
21 | #include <asm/io.h> | ||
22 | |||
23 | #define USE_FPGA_MAP 0 | ||
24 | |||
25 | #if USE_FPGA_MAP | ||
26 | /* | ||
27 | * fpga configuration program uses MMU, and define map as same as | ||
28 | * M32104 uT-Engine board. | ||
29 | */ | ||
30 | #define BOOT_SIO0STS (volatile unsigned short *)(0x02c00000 + 0x20006) | ||
31 | #define BOOT_SIO0TXB (volatile unsigned short *)(0x02c00000 + 0x2000c) | ||
32 | #else | ||
33 | #undef PLD_BASE | ||
34 | #define PLD_BASE 0xa4c00000 | ||
35 | #define BOOT_SIO0STS PLD_ESIO0STS | ||
36 | #define BOOT_SIO0TXB PLD_ESIO0TXB | ||
37 | #endif | ||
38 | |||
39 | static void putc(char c) | ||
40 | { | ||
41 | |||
42 | while ((*BOOT_SIO0STS & 0x3) != 0x3) ; | ||
43 | if (c == '\n') { | ||
44 | *BOOT_SIO0TXB = '\r'; | ||
45 | while ((*BOOT_SIO0STS & 0x3) != 0x3) ; | ||
46 | } | ||
47 | *BOOT_SIO0TXB = c; | ||
48 | } | ||
49 | #else /* defined(CONFIG_PLAT_M32700UT_Alpha) || defined(CONFIG_PLAT_M32700UT) */ | ||
50 | #ifdef CONFIG_MMU | ||
51 | #define SIO0STS (volatile unsigned short *)(0xa0efd000 + 14) | ||
52 | #define SIO0TXB (volatile unsigned short *)(0xa0efd000 + 30) | ||
53 | #else | ||
54 | #define SIO0STS (volatile unsigned short *)(0x00efd000 + 14) | ||
55 | #define SIO0TXB (volatile unsigned short *)(0x00efd000 + 30) | ||
56 | #endif | ||
57 | |||
58 | static void putc(char c) | ||
59 | { | ||
60 | |||
61 | while ((*SIO0STS & 0x1) == 0) ; | ||
62 | if (c == '\n') { | ||
63 | *SIO0TXB = '\r'; | ||
64 | while ((*SIO0STS & 0x1) == 0) ; | ||
65 | } | ||
66 | *SIO0TXB = c; | ||
67 | } | ||
68 | #endif | ||
diff --git a/arch/m32r/boot/compressed/misc.c b/arch/m32r/boot/compressed/misc.c new file mode 100644 index 000000000000..70fa799005c3 --- /dev/null +++ b/arch/m32r/boot/compressed/misc.c | |||
@@ -0,0 +1,210 @@ | |||
1 | /* | ||
2 | * arch/m32r/boot/compressed/misc.c | ||
3 | * | ||
4 | * This is a collection of several routines from gzip-1.0.3 | ||
5 | * adapted for Linux. | ||
6 | * | ||
7 | * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 | ||
8 | * | ||
9 | * Adapted for SH by Stuart Menefy, Aug 1999 | ||
10 | * | ||
11 | * 2003-02-12: Support M32R by Takeo Takahashi | ||
12 | * This is based on arch/sh/boot/compressed/misc.c. | ||
13 | */ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/string.h> | ||
17 | |||
18 | /* | ||
19 | * gzip declarations | ||
20 | */ | ||
21 | |||
22 | #define OF(args) args | ||
23 | #define STATIC static | ||
24 | |||
25 | #undef memset | ||
26 | #undef memcpy | ||
27 | #define memzero(s, n) memset ((s), 0, (n)) | ||
28 | |||
29 | typedef unsigned char uch; | ||
30 | typedef unsigned short ush; | ||
31 | typedef unsigned long ulg; | ||
32 | |||
33 | #define WSIZE 0x8000 /* Window size must be at least 32k, */ | ||
34 | /* and a power of two */ | ||
35 | |||
36 | static uch *inbuf; /* input buffer */ | ||
37 | static uch window[WSIZE]; /* Sliding window buffer */ | ||
38 | |||
39 | static unsigned insize = 0; /* valid bytes in inbuf */ | ||
40 | static unsigned inptr = 0; /* index of next byte to be processed in inbuf */ | ||
41 | static unsigned outcnt = 0; /* bytes in output buffer */ | ||
42 | |||
43 | /* gzip flag byte */ | ||
44 | #define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ | ||
45 | #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ | ||
46 | #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ | ||
47 | #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ | ||
48 | #define COMMENT 0x10 /* bit 4 set: file comment present */ | ||
49 | #define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ | ||
50 | #define RESERVED 0xC0 /* bit 6,7: reserved */ | ||
51 | |||
52 | #define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) | ||
53 | |||
54 | /* Diagnostic functions */ | ||
55 | #ifdef DEBUG | ||
56 | # define Assert(cond,msg) {if(!(cond)) error(msg);} | ||
57 | # define Trace(x) fprintf x | ||
58 | # define Tracev(x) {if (verbose) fprintf x ;} | ||
59 | # define Tracevv(x) {if (verbose>1) fprintf x ;} | ||
60 | # define Tracec(c,x) {if (verbose && (c)) fprintf x ;} | ||
61 | # define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} | ||
62 | #else | ||
63 | # define Assert(cond,msg) | ||
64 | # define Trace(x) | ||
65 | # define Tracev(x) | ||
66 | # define Tracevv(x) | ||
67 | # define Tracec(c,x) | ||
68 | # define Tracecv(c,x) | ||
69 | #endif | ||
70 | |||
71 | static int fill_inbuf(void); | ||
72 | static void flush_window(void); | ||
73 | static void error(char *m); | ||
74 | static void gzip_mark(void **); | ||
75 | static void gzip_release(void **); | ||
76 | |||
77 | static unsigned char *input_data; | ||
78 | static int input_len; | ||
79 | |||
80 | static long bytes_out = 0; | ||
81 | static uch *output_data; | ||
82 | static unsigned long output_ptr = 0; | ||
83 | |||
84 | #include "m32r_sio.c" | ||
85 | |||
86 | static void *malloc(int size); | ||
87 | static void free(void *where); | ||
88 | |||
89 | static unsigned long free_mem_ptr; | ||
90 | static unsigned long free_mem_end_ptr; | ||
91 | |||
92 | #define HEAP_SIZE 0x10000 | ||
93 | |||
94 | #include "../../../../lib/inflate.c" | ||
95 | |||
96 | static void *malloc(int size) | ||
97 | { | ||
98 | void *p; | ||
99 | |||
100 | if (size <0) error("Malloc error"); | ||
101 | if (free_mem_ptr == 0) error("Memory error"); | ||
102 | |||
103 | free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */ | ||
104 | |||
105 | p = (void *)free_mem_ptr; | ||
106 | free_mem_ptr += size; | ||
107 | |||
108 | if (free_mem_ptr >= free_mem_end_ptr) | ||
109 | error("Out of memory"); | ||
110 | |||
111 | return p; | ||
112 | } | ||
113 | |||
114 | static void free(void *where) | ||
115 | { /* Don't care */ | ||
116 | } | ||
117 | |||
118 | static void gzip_mark(void **ptr) | ||
119 | { | ||
120 | *ptr = (void *) free_mem_ptr; | ||
121 | } | ||
122 | |||
123 | static void gzip_release(void **ptr) | ||
124 | { | ||
125 | free_mem_ptr = (long) *ptr; | ||
126 | } | ||
127 | |||
128 | void* memset(void* s, int c, size_t n) | ||
129 | { | ||
130 | int i; | ||
131 | char *ss = (char*)s; | ||
132 | |||
133 | for (i=0;i<n;i++) ss[i] = c; | ||
134 | return s; | ||
135 | } | ||
136 | |||
137 | void* memcpy(void* __dest, __const void* __src, | ||
138 | size_t __n) | ||
139 | { | ||
140 | int i; | ||
141 | char *d = (char *)__dest, *s = (char *)__src; | ||
142 | |||
143 | for (i=0;i<__n;i++) d[i] = s[i]; | ||
144 | return __dest; | ||
145 | } | ||
146 | |||
147 | /* =========================================================================== | ||
148 | * Fill the input buffer. This is called only when the buffer is empty | ||
149 | * and at least one byte is really needed. | ||
150 | */ | ||
151 | static int fill_inbuf(void) | ||
152 | { | ||
153 | if (insize != 0) { | ||
154 | error("ran out of input data"); | ||
155 | } | ||
156 | |||
157 | inbuf = input_data; | ||
158 | insize = input_len; | ||
159 | inptr = 1; | ||
160 | return inbuf[0]; | ||
161 | } | ||
162 | |||
163 | /* =========================================================================== | ||
164 | * Write the output window window[0..outcnt-1] and update crc and bytes_out. | ||
165 | * (Used for the decompressed data only.) | ||
166 | */ | ||
167 | static void flush_window(void) | ||
168 | { | ||
169 | ulg c = crc; /* temporary variable */ | ||
170 | unsigned n; | ||
171 | uch *in, *out, ch; | ||
172 | |||
173 | in = window; | ||
174 | out = &output_data[output_ptr]; | ||
175 | for (n = 0; n < outcnt; n++) { | ||
176 | ch = *out++ = *in++; | ||
177 | c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8); | ||
178 | } | ||
179 | crc = c; | ||
180 | bytes_out += (ulg)outcnt; | ||
181 | output_ptr += (ulg)outcnt; | ||
182 | outcnt = 0; | ||
183 | } | ||
184 | |||
185 | static void error(char *x) | ||
186 | { | ||
187 | puts("\n\n"); | ||
188 | puts(x); | ||
189 | puts("\n\n -- System halted"); | ||
190 | |||
191 | while(1); /* Halt */ | ||
192 | } | ||
193 | |||
194 | /* return decompressed size */ | ||
195 | void | ||
196 | decompress_kernel(int mmu_on, unsigned char *zimage_data, | ||
197 | unsigned int zimage_len, unsigned long heap) | ||
198 | { | ||
199 | output_data = (unsigned char *)CONFIG_MEMORY_START + 0x2000 | ||
200 | + (mmu_on ? 0x80000000 : 0); | ||
201 | free_mem_ptr = heap; | ||
202 | free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; | ||
203 | input_data = zimage_data; | ||
204 | input_len = zimage_len; | ||
205 | |||
206 | makecrc(); | ||
207 | puts("Uncompressing Linux... "); | ||
208 | gunzip(); | ||
209 | puts("Ok, booting the kernel.\n"); | ||
210 | } | ||
diff --git a/arch/m32r/boot/compressed/vmlinux.lds.S b/arch/m32r/boot/compressed/vmlinux.lds.S new file mode 100644 index 000000000000..a18431759633 --- /dev/null +++ b/arch/m32r/boot/compressed/vmlinux.lds.S | |||
@@ -0,0 +1,31 @@ | |||
1 | #include <linux/config.h> | ||
2 | |||
3 | OUTPUT_ARCH(m32r) | ||
4 | ENTRY(startup) | ||
5 | SECTIONS | ||
6 | { | ||
7 | . = CONFIG_MEMORY_START + 0x00400000; | ||
8 | |||
9 | _text = .; | ||
10 | .text : { *(.text) } = 0 | ||
11 | .rodata : { *(.rodata) *(.rodata.*) } | ||
12 | _etext = .; | ||
13 | |||
14 | . = ALIGN(32 / 8); | ||
15 | .data : { *(.data) } | ||
16 | . = ALIGN(32 / 8); | ||
17 | _got = .; | ||
18 | .got : { *(.got) _egot = .; *(.got.*) } | ||
19 | _edata = .; | ||
20 | |||
21 | . = ALIGN(32 / 8); | ||
22 | __bss_start = .; | ||
23 | .bss : { *(.bss) *(.sbss) } | ||
24 | . = ALIGN(32 / 8); | ||
25 | _ebss = .; | ||
26 | . = ALIGN(4096); | ||
27 | . += 4096; | ||
28 | end = . ; | ||
29 | |||
30 | got_len = (_egot - _got); | ||
31 | } | ||
diff --git a/arch/m32r/boot/compressed/vmlinux.scr b/arch/m32r/boot/compressed/vmlinux.scr new file mode 100644 index 000000000000..924c7992c55b --- /dev/null +++ b/arch/m32r/boot/compressed/vmlinux.scr | |||
@@ -0,0 +1,9 @@ | |||
1 | SECTIONS | ||
2 | { | ||
3 | .data : { | ||
4 | zimage_data = .; | ||
5 | *(.data) | ||
6 | zimage_data_end = .; | ||
7 | } | ||
8 | zimage_len = zimage_data_end - zimage_data; | ||
9 | } | ||
diff --git a/arch/m32r/boot/setup.S b/arch/m32r/boot/setup.S new file mode 100644 index 000000000000..5d256434b4ad --- /dev/null +++ b/arch/m32r/boot/setup.S | |||
@@ -0,0 +1,167 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/boot/setup.S -- A setup code. | ||
3 | * | ||
4 | * Copyright (C) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
5 | * and Hitoshi Yamamoto | ||
6 | * | ||
7 | */ | ||
8 | /* $Id$ */ | ||
9 | |||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/segment.h> | ||
12 | #include <asm/page.h> | ||
13 | #include <asm/pgtable.h> | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <asm/assembler.h> | ||
17 | #include <asm/mmu_context.h> | ||
18 | #include <asm/m32r.h> | ||
19 | |||
20 | /* | ||
21 | * References to members of the boot_cpu_data structure. | ||
22 | */ | ||
23 | |||
24 | #define CPU_PARAMS boot_cpu_data | ||
25 | #define M32R_MCICAR 0xfffffff0 | ||
26 | #define M32R_MCDCAR 0xfffffff4 | ||
27 | #define M32R_MCCR 0xfffffffc | ||
28 | #define M32R_BSCR0 0xffffffd2 | ||
29 | |||
30 | ;BSEL | ||
31 | #define BSEL0CR0 0x00ef5000 | ||
32 | #define BSEL0CR1 0x00ef5004 | ||
33 | #define BSEL1CR0 0x00ef5100 | ||
34 | #define BSEL1CR1 0x00ef5104 | ||
35 | #define BSEL0CR0_VAL 0x00000000 | ||
36 | #define BSEL0CR1_VAL 0x01200100 | ||
37 | #define BSEL1CR0_VAL 0x01018000 | ||
38 | #define BSEL1CR1_VAL 0x00200001 | ||
39 | |||
40 | ;SDRAMC | ||
41 | #define SDRAMC_SDRF0 0x00ef6000 | ||
42 | #define SDRAMC_SDRF1 0x00ef6004 | ||
43 | #define SDRAMC_SDIR0 0x00ef6008 | ||
44 | #define SDRAMC_SDIR1 0x00ef600c | ||
45 | #define SDRAMC_SD0ADR 0x00ef6020 | ||
46 | #define SDRAMC_SD0ER 0x00ef6024 | ||
47 | #define SDRAMC_SD0TR 0x00ef6028 | ||
48 | #define SDRAMC_SD0MOD 0x00ef602c | ||
49 | #define SDRAMC_SD1ADR 0x00ef6040 | ||
50 | #define SDRAMC_SD1ER 0x00ef6044 | ||
51 | #define SDRAMC_SD1TR 0x00ef6048 | ||
52 | #define SDRAMC_SD1MOD 0x00ef604c | ||
53 | #define SDRAM0 0x18000000 | ||
54 | #define SDRAM1 0x1c000000 | ||
55 | |||
56 | /*------------------------------------------------------------------------ | ||
57 | * start up | ||
58 | */ | ||
59 | |||
60 | /*------------------------------------------------------------------------ | ||
61 | * Kernel entry | ||
62 | */ | ||
63 | .section .boot, "ax" | ||
64 | ENTRY(boot) | ||
65 | |||
66 | /* Set cache mode */ | ||
67 | #if defined(CONFIG_CHIP_XNUX2) | ||
68 | ldi r0, #-2 ;LDIMM (r0, M32R_MCCR) | ||
69 | ldi r1, #0x0101 ; cache on (with invalidation) | ||
70 | ; ldi r1, #0x00 ; cache off | ||
71 | sth r1, @r0 | ||
72 | #elif defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_VDEC2) \ | ||
73 | || defined(CONFIG_CHIP_OPSP) | ||
74 | ldi r0, #-4 ;LDIMM (r0, M32R_MCCR) | ||
75 | ldi r1, #0x73 ; cache on (with invalidation) | ||
76 | ; ldi r1, #0x00 ; cache off | ||
77 | st r1, @r0 | ||
78 | #elif defined(CONFIG_CHIP_M32102) | ||
79 | ldi r0, #-4 ;LDIMM (r0, M32R_MCCR) | ||
80 | ldi r1, #0x101 ; cache on (with invalidation) | ||
81 | ; ldi r1, #0x00 ; cache off | ||
82 | st r1, @r0 | ||
83 | #else | ||
84 | #error unknown chip configuration | ||
85 | #endif | ||
86 | |||
87 | #ifdef CONFIG_SMP | ||
88 | ;; if not BSP (CPU#0) goto AP_loop | ||
89 | seth r5, #shigh(M32R_CPUID_PORTL) | ||
90 | ld r5, @(low(M32R_CPUID_PORTL), r5) | ||
91 | bnez r5, AP_loop | ||
92 | #if !defined(CONFIG_PLAT_USRV) | ||
93 | ;; boot AP | ||
94 | ld24 r5, #0xeff2f8 ; IPICR7 | ||
95 | ldi r6, #0x2 ; IPI to CPU1 | ||
96 | st r6, @r5 | ||
97 | #endif | ||
98 | #endif | ||
99 | |||
100 | /* | ||
101 | * Now, Jump to stext | ||
102 | * if with MMU, TLB on. | ||
103 | * if with no MMU, only jump. | ||
104 | */ | ||
105 | .global eit_vector | ||
106 | mmu_on: | ||
107 | LDIMM (r13, stext) | ||
108 | #ifdef CONFIG_MMU | ||
109 | bl init_tlb | ||
110 | LDIMM (r2, eit_vector) ; set EVB(cr5) | ||
111 | mvtc r2, cr5 | ||
112 | seth r0, #high(MMU_REG_BASE) ; Set MMU_REG_BASE higher | ||
113 | or3 r0, r0, #low(MMU_REG_BASE) ; Set MMU_REG_BASE lower | ||
114 | ldi r1, #0x01 | ||
115 | st r1, @(MATM_offset,r0) ; Set MATM (T bit ON) | ||
116 | ld r0, @(MATM_offset,r0) ; Check | ||
117 | #else | ||
118 | seth r0,#high(M32R_MCDCAR) | ||
119 | or3 r0,r0,#low(M32R_MCDCAR) | ||
120 | ld24 r1,#0x8080 | ||
121 | st r1,@r0 | ||
122 | #endif /* CONFIG_MMU */ | ||
123 | jmp r13 | ||
124 | nop | ||
125 | nop | ||
126 | |||
127 | #ifdef CONFIG_SMP | ||
128 | /* | ||
129 | * AP wait loop | ||
130 | */ | ||
131 | ENTRY(AP_loop) | ||
132 | ;; disable interrupt | ||
133 | clrpsw #0x40 | ||
134 | ;; reset EVB | ||
135 | LDIMM (r4, _AP_RE) | ||
136 | seth r5, #high(__PAGE_OFFSET) | ||
137 | or3 r5, r5, #low(__PAGE_OFFSET) | ||
138 | not r5, r5 | ||
139 | and r4, r5 | ||
140 | mvtc r4, cr5 | ||
141 | ;; disable maskable interrupt | ||
142 | seth r4, #high(M32R_ICU_IMASK_PORTL) | ||
143 | or3 r4, r4, #low(M32R_ICU_IMASK_PORTL) | ||
144 | ldi r5, #0 | ||
145 | st r5, @r4 | ||
146 | ld r5, @r4 | ||
147 | ;; enable only IPI | ||
148 | setpsw #0x40 | ||
149 | ;; LOOOOOOOOOOOOOOP!!! | ||
150 | .fillinsn | ||
151 | 2: | ||
152 | nop | ||
153 | nop | ||
154 | bra 2b | ||
155 | nop | ||
156 | nop | ||
157 | |||
158 | #ifdef CONFIG_CHIP_M32700_TS1 | ||
159 | .global dcache_dummy | ||
160 | .balign 16, 0 | ||
161 | dcache_dummy: | ||
162 | .byte 16 | ||
163 | #endif /* CONFIG_CHIP_M32700_TS1 */ | ||
164 | #endif /* CONFIG_SMP */ | ||
165 | |||
166 | .end | ||
167 | |||
diff --git a/arch/m32r/defconfig b/arch/m32r/defconfig new file mode 100644 index 000000000000..417c95ba87e9 --- /dev/null +++ b/arch/m32r/defconfig | |||
@@ -0,0 +1,747 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:10:44 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | CONFIG_CLEAN_COMPILE=y | ||
17 | CONFIG_BROKEN_ON_SMP=y | ||
18 | CONFIG_LOCK_KERNEL=y | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_LOCALVERSION="" | ||
24 | CONFIG_SWAP=y | ||
25 | CONFIG_SYSVIPC=y | ||
26 | # CONFIG_POSIX_MQUEUE is not set | ||
27 | CONFIG_BSD_PROCESS_ACCT=y | ||
28 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
29 | CONFIG_SYSCTL=y | ||
30 | # CONFIG_AUDIT is not set | ||
31 | CONFIG_LOG_BUF_SHIFT=14 | ||
32 | CONFIG_HOTPLUG=y | ||
33 | CONFIG_KOBJECT_UEVENT=y | ||
34 | CONFIG_IKCONFIG=y | ||
35 | # CONFIG_IKCONFIG_PROC is not set | ||
36 | CONFIG_EMBEDDED=y | ||
37 | # CONFIG_KALLSYMS is not set | ||
38 | # CONFIG_FUTEX is not set | ||
39 | # CONFIG_EPOLL is not set | ||
40 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
41 | CONFIG_SHMEM=y | ||
42 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
43 | CONFIG_CC_ALIGN_LABELS=0 | ||
44 | CONFIG_CC_ALIGN_LOOPS=0 | ||
45 | CONFIG_CC_ALIGN_JUMPS=0 | ||
46 | # CONFIG_TINY_SHMEM is not set | ||
47 | |||
48 | # | ||
49 | # Loadable module support | ||
50 | # | ||
51 | CONFIG_MODULES=y | ||
52 | CONFIG_MODULE_UNLOAD=y | ||
53 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
54 | CONFIG_OBSOLETE_MODPARM=y | ||
55 | # CONFIG_MODVERSIONS is not set | ||
56 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
57 | CONFIG_KMOD=y | ||
58 | |||
59 | # | ||
60 | # Processor type and features | ||
61 | # | ||
62 | # CONFIG_PLAT_MAPPI is not set | ||
63 | # CONFIG_PLAT_USRV is not set | ||
64 | CONFIG_PLAT_M32700UT=y | ||
65 | # CONFIG_PLAT_OPSPUT is not set | ||
66 | # CONFIG_PLAT_OAKS32R is not set | ||
67 | # CONFIG_PLAT_MAPPI2 is not set | ||
68 | CONFIG_CHIP_M32700=y | ||
69 | # CONFIG_CHIP_M32102 is not set | ||
70 | # CONFIG_CHIP_VDEC2 is not set | ||
71 | # CONFIG_CHIP_OPSP is not set | ||
72 | CONFIG_MMU=y | ||
73 | CONFIG_TLB_ENTRIES=32 | ||
74 | CONFIG_ISA_M32R2=y | ||
75 | CONFIG_ISA_DSP_LEVEL2=y | ||
76 | CONFIG_ISA_DUAL_ISSUE=y | ||
77 | CONFIG_BUS_CLOCK=50000000 | ||
78 | CONFIG_TIMER_DIVIDE=128 | ||
79 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
80 | CONFIG_MEMORY_START=0x08000000 | ||
81 | CONFIG_MEMORY_SIZE=0x01000000 | ||
82 | CONFIG_NOHIGHMEM=y | ||
83 | # CONFIG_DISCONTIGMEM is not set | ||
84 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
85 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
86 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
87 | CONFIG_PREEMPT=y | ||
88 | # CONFIG_HAVE_DEC_LOCK is not set | ||
89 | # CONFIG_SMP is not set | ||
90 | |||
91 | # | ||
92 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
93 | # | ||
94 | # CONFIG_PCI is not set | ||
95 | # CONFIG_ISA is not set | ||
96 | |||
97 | # | ||
98 | # PCCARD (PCMCIA/CardBus) support | ||
99 | # | ||
100 | CONFIG_PCCARD=y | ||
101 | # CONFIG_PCMCIA_DEBUG is not set | ||
102 | CONFIG_PCMCIA=y | ||
103 | |||
104 | # | ||
105 | # PC-card bridges | ||
106 | # | ||
107 | # CONFIG_TCIC is not set | ||
108 | # CONFIG_M32R_PCC is not set | ||
109 | CONFIG_M32R_CFC=y | ||
110 | CONFIG_M32R_CFC_NUM=1 | ||
111 | |||
112 | # | ||
113 | # PCI Hotplug Support | ||
114 | # | ||
115 | |||
116 | # | ||
117 | # Executable file formats | ||
118 | # | ||
119 | CONFIG_BINFMT_ELF=y | ||
120 | # CONFIG_BINFMT_MISC is not set | ||
121 | |||
122 | # | ||
123 | # Device Drivers | ||
124 | # | ||
125 | |||
126 | # | ||
127 | # Generic Driver Options | ||
128 | # | ||
129 | CONFIG_STANDALONE=y | ||
130 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
131 | # CONFIG_FW_LOADER is not set | ||
132 | |||
133 | # | ||
134 | # Memory Technology Devices (MTD) | ||
135 | # | ||
136 | # CONFIG_MTD is not set | ||
137 | |||
138 | # | ||
139 | # Parallel port support | ||
140 | # | ||
141 | # CONFIG_PARPORT is not set | ||
142 | |||
143 | # | ||
144 | # Plug and Play support | ||
145 | # | ||
146 | |||
147 | # | ||
148 | # Block devices | ||
149 | # | ||
150 | # CONFIG_BLK_DEV_FD is not set | ||
151 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
152 | CONFIG_BLK_DEV_LOOP=y | ||
153 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
154 | CONFIG_BLK_DEV_NBD=y | ||
155 | CONFIG_BLK_DEV_RAM=y | ||
156 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
157 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
158 | # CONFIG_BLK_DEV_INITRD is not set | ||
159 | CONFIG_INITRAMFS_SOURCE="" | ||
160 | # CONFIG_CDROM_PKTCDVD is not set | ||
161 | |||
162 | # | ||
163 | # IO Schedulers | ||
164 | # | ||
165 | CONFIG_IOSCHED_NOOP=y | ||
166 | # CONFIG_IOSCHED_AS is not set | ||
167 | CONFIG_IOSCHED_DEADLINE=y | ||
168 | CONFIG_IOSCHED_CFQ=y | ||
169 | # CONFIG_ATA_OVER_ETH is not set | ||
170 | |||
171 | # | ||
172 | # ATA/ATAPI/MFM/RLL support | ||
173 | # | ||
174 | CONFIG_IDE=y | ||
175 | CONFIG_BLK_DEV_IDE=y | ||
176 | |||
177 | # | ||
178 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
179 | # | ||
180 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
181 | CONFIG_BLK_DEV_IDEDISK=y | ||
182 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
183 | CONFIG_BLK_DEV_IDECS=y | ||
184 | CONFIG_BLK_DEV_IDECD=m | ||
185 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
186 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
187 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
188 | # CONFIG_IDE_TASK_IOCTL is not set | ||
189 | |||
190 | # | ||
191 | # IDE chipset support/bugfixes | ||
192 | # | ||
193 | CONFIG_IDE_GENERIC=y | ||
194 | # CONFIG_IDE_ARM is not set | ||
195 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
196 | # CONFIG_IDEDMA_AUTO is not set | ||
197 | # CONFIG_BLK_DEV_HD is not set | ||
198 | |||
199 | # | ||
200 | # SCSI device support | ||
201 | # | ||
202 | CONFIG_SCSI=m | ||
203 | CONFIG_SCSI_PROC_FS=y | ||
204 | |||
205 | # | ||
206 | # SCSI support type (disk, tape, CD-ROM) | ||
207 | # | ||
208 | CONFIG_BLK_DEV_SD=m | ||
209 | # CONFIG_CHR_DEV_ST is not set | ||
210 | # CONFIG_CHR_DEV_OSST is not set | ||
211 | CONFIG_BLK_DEV_SR=m | ||
212 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
213 | CONFIG_CHR_DEV_SG=m | ||
214 | |||
215 | # | ||
216 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
217 | # | ||
218 | CONFIG_SCSI_MULTI_LUN=y | ||
219 | # CONFIG_SCSI_CONSTANTS is not set | ||
220 | # CONFIG_SCSI_LOGGING is not set | ||
221 | |||
222 | # | ||
223 | # SCSI Transport Attributes | ||
224 | # | ||
225 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
226 | # CONFIG_SCSI_FC_ATTRS is not set | ||
227 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
228 | |||
229 | # | ||
230 | # SCSI low-level drivers | ||
231 | # | ||
232 | # CONFIG_SCSI_SATA is not set | ||
233 | # CONFIG_SCSI_DEBUG is not set | ||
234 | |||
235 | # | ||
236 | # PCMCIA SCSI adapter support | ||
237 | # | ||
238 | # CONFIG_PCMCIA_AHA152X is not set | ||
239 | # CONFIG_PCMCIA_FDOMAIN is not set | ||
240 | # CONFIG_PCMCIA_NINJA_SCSI is not set | ||
241 | # CONFIG_PCMCIA_QLOGIC is not set | ||
242 | # CONFIG_PCMCIA_SYM53C500 is not set | ||
243 | |||
244 | # | ||
245 | # Multi-device support (RAID and LVM) | ||
246 | # | ||
247 | # CONFIG_MD is not set | ||
248 | |||
249 | # | ||
250 | # Fusion MPT device support | ||
251 | # | ||
252 | |||
253 | # | ||
254 | # IEEE 1394 (FireWire) support | ||
255 | # | ||
256 | |||
257 | # | ||
258 | # I2O device support | ||
259 | # | ||
260 | |||
261 | # | ||
262 | # Networking support | ||
263 | # | ||
264 | CONFIG_NET=y | ||
265 | |||
266 | # | ||
267 | # Networking options | ||
268 | # | ||
269 | CONFIG_PACKET=y | ||
270 | # CONFIG_PACKET_MMAP is not set | ||
271 | # CONFIG_NETLINK_DEV is not set | ||
272 | CONFIG_UNIX=y | ||
273 | # CONFIG_NET_KEY is not set | ||
274 | CONFIG_INET=y | ||
275 | # CONFIG_IP_MULTICAST is not set | ||
276 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
277 | CONFIG_IP_PNP=y | ||
278 | CONFIG_IP_PNP_DHCP=y | ||
279 | # CONFIG_IP_PNP_BOOTP is not set | ||
280 | # CONFIG_IP_PNP_RARP is not set | ||
281 | # CONFIG_NET_IPIP is not set | ||
282 | # CONFIG_NET_IPGRE is not set | ||
283 | # CONFIG_ARPD is not set | ||
284 | # CONFIG_SYN_COOKIES is not set | ||
285 | # CONFIG_INET_AH is not set | ||
286 | # CONFIG_INET_ESP is not set | ||
287 | # CONFIG_INET_IPCOMP is not set | ||
288 | # CONFIG_INET_TUNNEL is not set | ||
289 | CONFIG_IP_TCPDIAG=y | ||
290 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
291 | # CONFIG_IPV6 is not set | ||
292 | # CONFIG_NETFILTER is not set | ||
293 | |||
294 | # | ||
295 | # SCTP Configuration (EXPERIMENTAL) | ||
296 | # | ||
297 | # CONFIG_IP_SCTP is not set | ||
298 | # CONFIG_ATM is not set | ||
299 | # CONFIG_BRIDGE is not set | ||
300 | # CONFIG_VLAN_8021Q is not set | ||
301 | # CONFIG_DECNET is not set | ||
302 | # CONFIG_LLC2 is not set | ||
303 | # CONFIG_IPX is not set | ||
304 | # CONFIG_ATALK is not set | ||
305 | # CONFIG_X25 is not set | ||
306 | # CONFIG_LAPB is not set | ||
307 | # CONFIG_NET_DIVERT is not set | ||
308 | # CONFIG_ECONET is not set | ||
309 | # CONFIG_WAN_ROUTER is not set | ||
310 | |||
311 | # | ||
312 | # QoS and/or fair queueing | ||
313 | # | ||
314 | # CONFIG_NET_SCHED is not set | ||
315 | # CONFIG_NET_CLS_ROUTE is not set | ||
316 | |||
317 | # | ||
318 | # Network testing | ||
319 | # | ||
320 | # CONFIG_NET_PKTGEN is not set | ||
321 | # CONFIG_NETPOLL is not set | ||
322 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
323 | # CONFIG_HAMRADIO is not set | ||
324 | # CONFIG_IRDA is not set | ||
325 | # CONFIG_BT is not set | ||
326 | CONFIG_NETDEVICES=y | ||
327 | # CONFIG_DUMMY is not set | ||
328 | # CONFIG_BONDING is not set | ||
329 | # CONFIG_EQUALIZER is not set | ||
330 | # CONFIG_TUN is not set | ||
331 | |||
332 | # | ||
333 | # Ethernet (10 or 100Mbit) | ||
334 | # | ||
335 | CONFIG_NET_ETHERNET=y | ||
336 | CONFIG_MII=y | ||
337 | CONFIG_SMC91X=y | ||
338 | # CONFIG_NE2000 is not set | ||
339 | |||
340 | # | ||
341 | # Ethernet (1000 Mbit) | ||
342 | # | ||
343 | |||
344 | # | ||
345 | # Ethernet (10000 Mbit) | ||
346 | # | ||
347 | |||
348 | # | ||
349 | # Token Ring devices | ||
350 | # | ||
351 | |||
352 | # | ||
353 | # Wireless LAN (non-hamradio) | ||
354 | # | ||
355 | # CONFIG_NET_RADIO is not set | ||
356 | |||
357 | # | ||
358 | # PCMCIA network device support | ||
359 | # | ||
360 | # CONFIG_NET_PCMCIA is not set | ||
361 | |||
362 | # | ||
363 | # Wan interfaces | ||
364 | # | ||
365 | # CONFIG_WAN is not set | ||
366 | # CONFIG_PPP is not set | ||
367 | # CONFIG_SLIP is not set | ||
368 | # CONFIG_SHAPER is not set | ||
369 | # CONFIG_NETCONSOLE is not set | ||
370 | |||
371 | # | ||
372 | # ISDN subsystem | ||
373 | # | ||
374 | # CONFIG_ISDN is not set | ||
375 | |||
376 | # | ||
377 | # Telephony Support | ||
378 | # | ||
379 | # CONFIG_PHONE is not set | ||
380 | |||
381 | # | ||
382 | # Input device support | ||
383 | # | ||
384 | CONFIG_INPUT=y | ||
385 | |||
386 | # | ||
387 | # Userland interfaces | ||
388 | # | ||
389 | # CONFIG_INPUT_MOUSEDEV is not set | ||
390 | # CONFIG_INPUT_JOYDEV is not set | ||
391 | # CONFIG_INPUT_TSDEV is not set | ||
392 | # CONFIG_INPUT_EVDEV is not set | ||
393 | # CONFIG_INPUT_EVBUG is not set | ||
394 | |||
395 | # | ||
396 | # Input I/O drivers | ||
397 | # | ||
398 | # CONFIG_GAMEPORT is not set | ||
399 | CONFIG_SOUND_GAMEPORT=y | ||
400 | CONFIG_SERIO=y | ||
401 | # CONFIG_SERIO_I8042 is not set | ||
402 | CONFIG_SERIO_SERPORT=y | ||
403 | # CONFIG_SERIO_CT82C710 is not set | ||
404 | # CONFIG_SERIO_LIBPS2 is not set | ||
405 | # CONFIG_SERIO_RAW is not set | ||
406 | |||
407 | # | ||
408 | # Input Device Drivers | ||
409 | # | ||
410 | # CONFIG_INPUT_KEYBOARD is not set | ||
411 | # CONFIG_INPUT_MOUSE is not set | ||
412 | # CONFIG_INPUT_JOYSTICK is not set | ||
413 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
414 | # CONFIG_INPUT_MISC is not set | ||
415 | |||
416 | # | ||
417 | # Character devices | ||
418 | # | ||
419 | CONFIG_VT=y | ||
420 | CONFIG_VT_CONSOLE=y | ||
421 | CONFIG_HW_CONSOLE=y | ||
422 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
423 | |||
424 | # | ||
425 | # Serial drivers | ||
426 | # | ||
427 | # CONFIG_SERIAL_8250 is not set | ||
428 | |||
429 | # | ||
430 | # Non-8250 serial port support | ||
431 | # | ||
432 | CONFIG_SERIAL_CORE=y | ||
433 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
434 | CONFIG_SERIAL_M32R_SIO=y | ||
435 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
436 | CONFIG_SERIAL_M32R_PLDSIO=y | ||
437 | CONFIG_UNIX98_PTYS=y | ||
438 | CONFIG_LEGACY_PTYS=y | ||
439 | CONFIG_LEGACY_PTY_COUNT=256 | ||
440 | |||
441 | # | ||
442 | # IPMI | ||
443 | # | ||
444 | # CONFIG_IPMI_HANDLER is not set | ||
445 | |||
446 | # | ||
447 | # Watchdog Cards | ||
448 | # | ||
449 | # CONFIG_WATCHDOG is not set | ||
450 | # CONFIG_RTC is not set | ||
451 | # CONFIG_GEN_RTC is not set | ||
452 | CONFIG_DS1302=y | ||
453 | # CONFIG_DTLK is not set | ||
454 | # CONFIG_R3964 is not set | ||
455 | |||
456 | # | ||
457 | # Ftape, the floppy tape device driver | ||
458 | # | ||
459 | # CONFIG_DRM is not set | ||
460 | |||
461 | # | ||
462 | # PCMCIA character devices | ||
463 | # | ||
464 | # CONFIG_SYNCLINK_CS is not set | ||
465 | # CONFIG_RAW_DRIVER is not set | ||
466 | |||
467 | # | ||
468 | # I2C support | ||
469 | # | ||
470 | # CONFIG_I2C is not set | ||
471 | |||
472 | # | ||
473 | # Dallas's 1-wire bus | ||
474 | # | ||
475 | # CONFIG_W1 is not set | ||
476 | |||
477 | # | ||
478 | # Misc devices | ||
479 | # | ||
480 | |||
481 | # | ||
482 | # Multimedia devices | ||
483 | # | ||
484 | CONFIG_VIDEO_DEV=y | ||
485 | |||
486 | # | ||
487 | # Video For Linux | ||
488 | # | ||
489 | |||
490 | # | ||
491 | # Video Adapters | ||
492 | # | ||
493 | # CONFIG_VIDEO_CPIA is not set | ||
494 | CONFIG_VIDEO_M32R_AR=y | ||
495 | CONFIG_VIDEO_M32R_AR_M64278=y | ||
496 | |||
497 | # | ||
498 | # Radio Adapters | ||
499 | # | ||
500 | # CONFIG_RADIO_MAESTRO is not set | ||
501 | |||
502 | # | ||
503 | # Digital Video Broadcasting Devices | ||
504 | # | ||
505 | # CONFIG_DVB is not set | ||
506 | |||
507 | # | ||
508 | # Graphics support | ||
509 | # | ||
510 | CONFIG_FB=y | ||
511 | # CONFIG_FB_MODE_HELPERS is not set | ||
512 | # CONFIG_FB_TILEBLITTING is not set | ||
513 | # CONFIG_FB_VIRTUAL is not set | ||
514 | |||
515 | # | ||
516 | # Console display driver support | ||
517 | # | ||
518 | # CONFIG_VGA_CONSOLE is not set | ||
519 | CONFIG_DUMMY_CONSOLE=y | ||
520 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
521 | # CONFIG_FONTS is not set | ||
522 | CONFIG_FONT_8x8=y | ||
523 | CONFIG_FONT_8x16=y | ||
524 | |||
525 | # | ||
526 | # Logo configuration | ||
527 | # | ||
528 | CONFIG_LOGO=y | ||
529 | CONFIG_LOGO_LINUX_MONO=y | ||
530 | CONFIG_LOGO_LINUX_VGA16=y | ||
531 | CONFIG_LOGO_LINUX_CLUT224=y | ||
532 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
533 | |||
534 | # | ||
535 | # Sound | ||
536 | # | ||
537 | # CONFIG_SOUND is not set | ||
538 | |||
539 | # | ||
540 | # USB support | ||
541 | # | ||
542 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
543 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
544 | |||
545 | # | ||
546 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
547 | # | ||
548 | |||
549 | # | ||
550 | # USB Gadget Support | ||
551 | # | ||
552 | # CONFIG_USB_GADGET is not set | ||
553 | |||
554 | # | ||
555 | # MMC/SD Card support | ||
556 | # | ||
557 | # CONFIG_MMC is not set | ||
558 | |||
559 | # | ||
560 | # InfiniBand support | ||
561 | # | ||
562 | # CONFIG_INFINIBAND is not set | ||
563 | |||
564 | # | ||
565 | # File systems | ||
566 | # | ||
567 | CONFIG_EXT2_FS=y | ||
568 | # CONFIG_EXT2_FS_XATTR is not set | ||
569 | CONFIG_EXT3_FS=m | ||
570 | CONFIG_EXT3_FS_XATTR=y | ||
571 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
572 | # CONFIG_EXT3_FS_SECURITY is not set | ||
573 | CONFIG_JBD=m | ||
574 | CONFIG_JBD_DEBUG=y | ||
575 | CONFIG_FS_MBCACHE=y | ||
576 | CONFIG_REISERFS_FS=m | ||
577 | # CONFIG_REISERFS_CHECK is not set | ||
578 | # CONFIG_REISERFS_PROC_INFO is not set | ||
579 | # CONFIG_REISERFS_FS_XATTR is not set | ||
580 | # CONFIG_JFS_FS is not set | ||
581 | |||
582 | # | ||
583 | # XFS support | ||
584 | # | ||
585 | # CONFIG_XFS_FS is not set | ||
586 | # CONFIG_MINIX_FS is not set | ||
587 | # CONFIG_ROMFS_FS is not set | ||
588 | # CONFIG_QUOTA is not set | ||
589 | CONFIG_DNOTIFY=y | ||
590 | # CONFIG_AUTOFS_FS is not set | ||
591 | # CONFIG_AUTOFS4_FS is not set | ||
592 | |||
593 | # | ||
594 | # CD-ROM/DVD Filesystems | ||
595 | # | ||
596 | CONFIG_ISO9660_FS=m | ||
597 | CONFIG_JOLIET=y | ||
598 | # CONFIG_ZISOFS is not set | ||
599 | CONFIG_UDF_FS=m | ||
600 | CONFIG_UDF_NLS=y | ||
601 | |||
602 | # | ||
603 | # DOS/FAT/NT Filesystems | ||
604 | # | ||
605 | CONFIG_FAT_FS=m | ||
606 | CONFIG_MSDOS_FS=m | ||
607 | CONFIG_VFAT_FS=m | ||
608 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
609 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
610 | # CONFIG_NTFS_FS is not set | ||
611 | |||
612 | # | ||
613 | # Pseudo filesystems | ||
614 | # | ||
615 | CONFIG_PROC_FS=y | ||
616 | CONFIG_PROC_KCORE=y | ||
617 | CONFIG_SYSFS=y | ||
618 | CONFIG_DEVFS_FS=y | ||
619 | CONFIG_DEVFS_MOUNT=y | ||
620 | # CONFIG_DEVFS_DEBUG is not set | ||
621 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
622 | CONFIG_TMPFS=y | ||
623 | # CONFIG_TMPFS_XATTR is not set | ||
624 | # CONFIG_HUGETLB_PAGE is not set | ||
625 | CONFIG_RAMFS=y | ||
626 | |||
627 | # | ||
628 | # Miscellaneous filesystems | ||
629 | # | ||
630 | # CONFIG_ADFS_FS is not set | ||
631 | # CONFIG_AFFS_FS is not set | ||
632 | # CONFIG_HFS_FS is not set | ||
633 | # CONFIG_HFSPLUS_FS is not set | ||
634 | # CONFIG_BEFS_FS is not set | ||
635 | # CONFIG_BFS_FS is not set | ||
636 | # CONFIG_EFS_FS is not set | ||
637 | # CONFIG_CRAMFS is not set | ||
638 | # CONFIG_VXFS_FS is not set | ||
639 | # CONFIG_HPFS_FS is not set | ||
640 | # CONFIG_QNX4FS_FS is not set | ||
641 | # CONFIG_SYSV_FS is not set | ||
642 | # CONFIG_UFS_FS is not set | ||
643 | |||
644 | # | ||
645 | # Network File Systems | ||
646 | # | ||
647 | CONFIG_NFS_FS=y | ||
648 | CONFIG_NFS_V3=y | ||
649 | # CONFIG_NFS_V4 is not set | ||
650 | # CONFIG_NFS_DIRECTIO is not set | ||
651 | # CONFIG_NFSD is not set | ||
652 | CONFIG_ROOT_NFS=y | ||
653 | CONFIG_LOCKD=y | ||
654 | CONFIG_LOCKD_V4=y | ||
655 | CONFIG_SUNRPC=y | ||
656 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
657 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
658 | # CONFIG_SMB_FS is not set | ||
659 | # CONFIG_CIFS is not set | ||
660 | # CONFIG_NCP_FS is not set | ||
661 | # CONFIG_CODA_FS is not set | ||
662 | # CONFIG_AFS_FS is not set | ||
663 | |||
664 | # | ||
665 | # Partition Types | ||
666 | # | ||
667 | # CONFIG_PARTITION_ADVANCED is not set | ||
668 | CONFIG_MSDOS_PARTITION=y | ||
669 | |||
670 | # | ||
671 | # Native Language Support | ||
672 | # | ||
673 | CONFIG_NLS=y | ||
674 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
675 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
676 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
677 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
678 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
679 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
680 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
681 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
682 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
683 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
684 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
685 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
686 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
687 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
688 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
689 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
690 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
691 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
692 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
693 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
694 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
695 | # CONFIG_NLS_ISO8859_8 is not set | ||
696 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
697 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
698 | # CONFIG_NLS_ASCII is not set | ||
699 | # CONFIG_NLS_ISO8859_1 is not set | ||
700 | # CONFIG_NLS_ISO8859_2 is not set | ||
701 | # CONFIG_NLS_ISO8859_3 is not set | ||
702 | # CONFIG_NLS_ISO8859_4 is not set | ||
703 | # CONFIG_NLS_ISO8859_5 is not set | ||
704 | # CONFIG_NLS_ISO8859_6 is not set | ||
705 | # CONFIG_NLS_ISO8859_7 is not set | ||
706 | # CONFIG_NLS_ISO8859_9 is not set | ||
707 | # CONFIG_NLS_ISO8859_13 is not set | ||
708 | # CONFIG_NLS_ISO8859_14 is not set | ||
709 | # CONFIG_NLS_ISO8859_15 is not set | ||
710 | # CONFIG_NLS_KOI8_R is not set | ||
711 | # CONFIG_NLS_KOI8_U is not set | ||
712 | # CONFIG_NLS_UTF8 is not set | ||
713 | |||
714 | # | ||
715 | # Profiling support | ||
716 | # | ||
717 | # CONFIG_PROFILING is not set | ||
718 | |||
719 | # | ||
720 | # Kernel hacking | ||
721 | # | ||
722 | # CONFIG_DEBUG_KERNEL is not set | ||
723 | CONFIG_DEBUG_PREEMPT=y | ||
724 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
725 | # CONFIG_FRAME_POINTER is not set | ||
726 | |||
727 | # | ||
728 | # Security options | ||
729 | # | ||
730 | # CONFIG_KEYS is not set | ||
731 | # CONFIG_SECURITY is not set | ||
732 | |||
733 | # | ||
734 | # Cryptographic options | ||
735 | # | ||
736 | # CONFIG_CRYPTO is not set | ||
737 | |||
738 | # | ||
739 | # Hardware crypto devices | ||
740 | # | ||
741 | |||
742 | # | ||
743 | # Library routines | ||
744 | # | ||
745 | # CONFIG_CRC_CCITT is not set | ||
746 | CONFIG_CRC32=y | ||
747 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/m32r/kernel/Makefile b/arch/m32r/kernel/Makefile new file mode 100644 index 000000000000..cfd690bf6d8a --- /dev/null +++ b/arch/m32r/kernel/Makefile | |||
@@ -0,0 +1,20 @@ | |||
1 | # | ||
2 | # Makefile for the Linux/M32R kernel. | ||
3 | # | ||
4 | |||
5 | extra-y := head.o init_task.o vmlinux.lds | ||
6 | |||
7 | obj-y := process.o entry.o traps.o align.o irq.o setup.o time.o \ | ||
8 | m32r_ksyms.o sys_m32r.o semaphore.o signal.o ptrace.o | ||
9 | |||
10 | obj-$(CONFIG_SMP) += smp.o smpboot.o | ||
11 | obj-$(CONFIG_PLAT_MAPPI) += setup_mappi.o io_mappi.o | ||
12 | obj-$(CONFIG_PLAT_MAPPI2) += setup_mappi2.o io_mappi2.o | ||
13 | obj-$(CONFIG_PLAT_USRV) += setup_usrv.o io_usrv.o | ||
14 | obj-$(CONFIG_PLAT_M32700UT) += setup_m32700ut.o io_m32700ut.o | ||
15 | obj-$(CONFIG_PLAT_OPSPUT) += setup_opsput.o io_opsput.o | ||
16 | obj-$(CONFIG_MODULES) += module.o | ||
17 | obj-$(CONFIG_PLAT_OAKS32R) += setup_oaks32r.o io_oaks32r.o | ||
18 | |||
19 | EXTRA_AFLAGS := -traditional | ||
20 | |||
diff --git a/arch/m32r/kernel/align.c b/arch/m32r/kernel/align.c new file mode 100644 index 000000000000..48ec29714238 --- /dev/null +++ b/arch/m32r/kernel/align.c | |||
@@ -0,0 +1,585 @@ | |||
1 | /* | ||
2 | * align.c - address exception handler for M32R | ||
3 | * | ||
4 | * Copyright (c) 2003 Hitoshi Yamamoto | ||
5 | */ | ||
6 | |||
7 | #include <linux/config.h> | ||
8 | #include <asm/ptrace.h> | ||
9 | #include <asm/uaccess.h> | ||
10 | |||
11 | static int get_reg(struct pt_regs *regs, int nr) | ||
12 | { | ||
13 | int val; | ||
14 | |||
15 | if (nr < 4) | ||
16 | val = *(unsigned long *)(®s->r0 + nr); | ||
17 | else if (nr < 7) | ||
18 | val = *(unsigned long *)(®s->r4 + (nr - 4)); | ||
19 | else if (nr < 13) | ||
20 | val = *(unsigned long *)(®s->r7 + (nr - 7)); | ||
21 | else | ||
22 | val = *(unsigned long *)(®s->fp + (nr - 13)); | ||
23 | |||
24 | return val; | ||
25 | } | ||
26 | |||
27 | static void set_reg(struct pt_regs *regs, int nr, int val) | ||
28 | { | ||
29 | if (nr < 4) | ||
30 | *(unsigned long *)(®s->r0 + nr) = val; | ||
31 | else if (nr < 7) | ||
32 | *(unsigned long *)(®s->r4 + (nr - 4)) = val; | ||
33 | else if (nr < 13) | ||
34 | *(unsigned long *)(®s->r7 + (nr - 7)) = val; | ||
35 | else | ||
36 | *(unsigned long *)(®s->fp + (nr - 13)) = val; | ||
37 | } | ||
38 | |||
39 | #define REG1(insn) (((insn) & 0x0f00) >> 8) | ||
40 | #define REG2(insn) ((insn) & 0x000f) | ||
41 | #define PSW_BC 0x100 | ||
42 | |||
43 | /* O- instruction */ | ||
44 | #define ISA_LD1 0x20c0 /* ld Rdest, @Rsrc */ | ||
45 | #define ISA_LD2 0x20e0 /* ld Rdest, @Rsrc+ */ | ||
46 | #define ISA_LDH 0x20a0 /* ldh Rdest, @Rsrc */ | ||
47 | #define ISA_LDUH 0x20b0 /* lduh Rdest, @Rsrc */ | ||
48 | #define ISA_ST1 0x2040 /* st Rsrc1, @Rsrc2 */ | ||
49 | #define ISA_ST2 0x2060 /* st Rsrc1, @+Rsrc2 */ | ||
50 | #define ISA_ST3 0x2070 /* st Rsrc1, @-Rsrc2 */ | ||
51 | #define ISA_STH1 0x2020 /* sth Rsrc1, @Rsrc2 */ | ||
52 | #define ISA_STH2 0x2030 /* sth Rsrc1, @Rsrc2+ */ | ||
53 | |||
54 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
55 | |||
56 | /* OS instruction */ | ||
57 | #define ISA_ADD 0x00a0 /* add Rdest, Rsrc */ | ||
58 | #define ISA_ADDI 0x4000 /* addi Rdest, #imm8 */ | ||
59 | #define ISA_ADDX 0x0090 /* addx Rdest, Rsrc */ | ||
60 | #define ISA_AND 0x00c0 /* and Rdest, Rsrc */ | ||
61 | #define ISA_CMP 0x0040 /* cmp Rsrc1, Rsrc2 */ | ||
62 | #define ISA_CMPEQ 0x0060 /* cmpeq Rsrc1, Rsrc2 */ | ||
63 | #define ISA_CMPU 0x0050 /* cmpu Rsrc1, Rsrc2 */ | ||
64 | #define ISA_CMPZ 0x0070 /* cmpz Rsrc */ | ||
65 | #define ISA_LDI 0x6000 /* ldi Rdest, #imm8 */ | ||
66 | #define ISA_MV 0x1080 /* mv Rdest, Rsrc */ | ||
67 | #define ISA_NEG 0x0030 /* neg Rdest, Rsrc */ | ||
68 | #define ISA_NOP 0x7000 /* nop */ | ||
69 | #define ISA_NOT 0x00b0 /* not Rdest, Rsrc */ | ||
70 | #define ISA_OR 0x00e0 /* or Rdest, Rsrc */ | ||
71 | #define ISA_SUB 0x0020 /* sub Rdest, Rsrc */ | ||
72 | #define ISA_SUBX 0x0010 /* subx Rdest, Rsrc */ | ||
73 | #define ISA_XOR 0x00d0 /* xor Rdest, Rsrc */ | ||
74 | |||
75 | /* -S instruction */ | ||
76 | #define ISA_MUL 0x1060 /* mul Rdest, Rsrc */ | ||
77 | #define ISA_MULLO_A0 0x3010 /* mullo Rsrc1, Rsrc2, A0 */ | ||
78 | #define ISA_MULLO_A1 0x3090 /* mullo Rsrc1, Rsrc2, A1 */ | ||
79 | #define ISA_MVFACMI_A0 0x50f2 /* mvfacmi Rdest, A0 */ | ||
80 | #define ISA_MVFACMI_A1 0x50f6 /* mvfacmi Rdest, A1 */ | ||
81 | |||
82 | static int emu_addi(unsigned short insn, struct pt_regs *regs) | ||
83 | { | ||
84 | char imm = (char)(insn & 0xff); | ||
85 | int dest = REG1(insn); | ||
86 | int val; | ||
87 | |||
88 | val = get_reg(regs, dest); | ||
89 | val += imm; | ||
90 | set_reg(regs, dest, val); | ||
91 | |||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | static int emu_ldi(unsigned short insn, struct pt_regs *regs) | ||
96 | { | ||
97 | char imm = (char)(insn & 0xff); | ||
98 | |||
99 | set_reg(regs, REG1(insn), (int)imm); | ||
100 | |||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | static int emu_add(unsigned short insn, struct pt_regs *regs) | ||
105 | { | ||
106 | int dest = REG1(insn); | ||
107 | int src = REG2(insn); | ||
108 | int val; | ||
109 | |||
110 | val = get_reg(regs, dest); | ||
111 | val += get_reg(regs, src); | ||
112 | set_reg(regs, dest, val); | ||
113 | |||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | static int emu_addx(unsigned short insn, struct pt_regs *regs) | ||
118 | { | ||
119 | int dest = REG1(insn); | ||
120 | unsigned int val, tmp; | ||
121 | |||
122 | val = regs->psw & PSW_BC ? 1 : 0; | ||
123 | tmp = get_reg(regs, dest); | ||
124 | val += tmp; | ||
125 | val += (unsigned int)get_reg(regs, REG2(insn)); | ||
126 | set_reg(regs, dest, val); | ||
127 | |||
128 | /* C bit set */ | ||
129 | if (val < tmp) | ||
130 | regs->psw |= PSW_BC; | ||
131 | else | ||
132 | regs->psw &= ~(PSW_BC); | ||
133 | |||
134 | return 0; | ||
135 | } | ||
136 | |||
137 | static int emu_and(unsigned short insn, struct pt_regs *regs) | ||
138 | { | ||
139 | int dest = REG1(insn); | ||
140 | int val; | ||
141 | |||
142 | val = get_reg(regs, dest); | ||
143 | val &= get_reg(regs, REG2(insn)); | ||
144 | set_reg(regs, dest, val); | ||
145 | |||
146 | return 0; | ||
147 | } | ||
148 | |||
149 | static int emu_cmp(unsigned short insn, struct pt_regs *regs) | ||
150 | { | ||
151 | if (get_reg(regs, REG1(insn)) < get_reg(regs, REG2(insn))) | ||
152 | regs->psw |= PSW_BC; | ||
153 | else | ||
154 | regs->psw &= ~(PSW_BC); | ||
155 | |||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static int emu_cmpeq(unsigned short insn, struct pt_regs *regs) | ||
160 | { | ||
161 | if (get_reg(regs, REG1(insn)) == get_reg(regs, REG2(insn))) | ||
162 | regs->psw |= PSW_BC; | ||
163 | else | ||
164 | regs->psw &= ~(PSW_BC); | ||
165 | |||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static int emu_cmpu(unsigned short insn, struct pt_regs *regs) | ||
170 | { | ||
171 | if ((unsigned int)get_reg(regs, REG1(insn)) | ||
172 | < (unsigned int)get_reg(regs, REG2(insn))) | ||
173 | regs->psw |= PSW_BC; | ||
174 | else | ||
175 | regs->psw &= ~(PSW_BC); | ||
176 | |||
177 | return 0; | ||
178 | } | ||
179 | |||
180 | static int emu_cmpz(unsigned short insn, struct pt_regs *regs) | ||
181 | { | ||
182 | if (!get_reg(regs, REG2(insn))) | ||
183 | regs->psw |= PSW_BC; | ||
184 | else | ||
185 | regs->psw &= ~(PSW_BC); | ||
186 | |||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | static int emu_mv(unsigned short insn, struct pt_regs *regs) | ||
191 | { | ||
192 | int val; | ||
193 | |||
194 | val = get_reg(regs, REG2(insn)); | ||
195 | set_reg(regs, REG1(insn), val); | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | static int emu_neg(unsigned short insn, struct pt_regs *regs) | ||
201 | { | ||
202 | int val; | ||
203 | |||
204 | val = get_reg(regs, REG2(insn)); | ||
205 | set_reg(regs, REG1(insn), 0 - val); | ||
206 | |||
207 | return 0; | ||
208 | } | ||
209 | |||
210 | static int emu_not(unsigned short insn, struct pt_regs *regs) | ||
211 | { | ||
212 | int val; | ||
213 | |||
214 | val = get_reg(regs, REG2(insn)); | ||
215 | set_reg(regs, REG1(insn), ~val); | ||
216 | |||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static int emu_or(unsigned short insn, struct pt_regs *regs) | ||
221 | { | ||
222 | int dest = REG1(insn); | ||
223 | int val; | ||
224 | |||
225 | val = get_reg(regs, dest); | ||
226 | val |= get_reg(regs, REG2(insn)); | ||
227 | set_reg(regs, dest, val); | ||
228 | |||
229 | return 0; | ||
230 | } | ||
231 | |||
232 | static int emu_sub(unsigned short insn, struct pt_regs *regs) | ||
233 | { | ||
234 | int dest = REG1(insn); | ||
235 | int val; | ||
236 | |||
237 | val = get_reg(regs, dest); | ||
238 | val -= get_reg(regs, REG2(insn)); | ||
239 | set_reg(regs, dest, val); | ||
240 | |||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | static int emu_subx(unsigned short insn, struct pt_regs *regs) | ||
245 | { | ||
246 | int dest = REG1(insn); | ||
247 | unsigned int val, tmp; | ||
248 | |||
249 | val = tmp = get_reg(regs, dest); | ||
250 | val -= (unsigned int)get_reg(regs, REG2(insn)); | ||
251 | val -= regs->psw & PSW_BC ? 1 : 0; | ||
252 | set_reg(regs, dest, val); | ||
253 | |||
254 | /* C bit set */ | ||
255 | if (val > tmp) | ||
256 | regs->psw |= PSW_BC; | ||
257 | else | ||
258 | regs->psw &= ~(PSW_BC); | ||
259 | |||
260 | return 0; | ||
261 | } | ||
262 | |||
263 | static int emu_xor(unsigned short insn, struct pt_regs *regs) | ||
264 | { | ||
265 | int dest = REG1(insn); | ||
266 | unsigned int val; | ||
267 | |||
268 | val = (unsigned int)get_reg(regs, dest); | ||
269 | val ^= (unsigned int)get_reg(regs, REG2(insn)); | ||
270 | set_reg(regs, dest, val); | ||
271 | |||
272 | return 0; | ||
273 | } | ||
274 | |||
275 | static int emu_mul(unsigned short insn, struct pt_regs *regs) | ||
276 | { | ||
277 | int dest = REG1(insn); | ||
278 | int reg1, reg2; | ||
279 | |||
280 | reg1 = get_reg(regs, dest); | ||
281 | reg2 = get_reg(regs, REG2(insn)); | ||
282 | |||
283 | __asm__ __volatile__ ( | ||
284 | "mul %0, %1; \n\t" | ||
285 | : "+r" (reg1) : "r" (reg2) | ||
286 | ); | ||
287 | |||
288 | set_reg(regs, dest, reg1); | ||
289 | |||
290 | return 0; | ||
291 | } | ||
292 | |||
293 | static int emu_mullo_a0(unsigned short insn, struct pt_regs *regs) | ||
294 | { | ||
295 | int reg1, reg2; | ||
296 | |||
297 | reg1 = get_reg(regs, REG1(insn)); | ||
298 | reg2 = get_reg(regs, REG2(insn)); | ||
299 | |||
300 | __asm__ __volatile__ ( | ||
301 | "mullo %0, %1, a0; \n\t" | ||
302 | "mvfachi %0, a0; \n\t" | ||
303 | "mvfaclo %1, a0; \n\t" | ||
304 | : "+r" (reg1), "+r" (reg2) | ||
305 | ); | ||
306 | |||
307 | regs->acc0h = reg1; | ||
308 | regs->acc0l = reg2; | ||
309 | |||
310 | return 0; | ||
311 | } | ||
312 | |||
313 | static int emu_mullo_a1(unsigned short insn, struct pt_regs *regs) | ||
314 | { | ||
315 | int reg1, reg2; | ||
316 | |||
317 | reg1 = get_reg(regs, REG1(insn)); | ||
318 | reg2 = get_reg(regs, REG2(insn)); | ||
319 | |||
320 | __asm__ __volatile__ ( | ||
321 | "mullo %0, %1, a0; \n\t" | ||
322 | "mvfachi %0, a0; \n\t" | ||
323 | "mvfaclo %1, a0; \n\t" | ||
324 | : "+r" (reg1), "+r" (reg2) | ||
325 | ); | ||
326 | |||
327 | regs->acc1h = reg1; | ||
328 | regs->acc1l = reg2; | ||
329 | |||
330 | return 0; | ||
331 | } | ||
332 | |||
333 | static int emu_mvfacmi_a0(unsigned short insn, struct pt_regs *regs) | ||
334 | { | ||
335 | unsigned long val; | ||
336 | |||
337 | val = (regs->acc0h << 16) | (regs->acc0l >> 16); | ||
338 | set_reg(regs, REG1(insn), (int)val); | ||
339 | |||
340 | return 0; | ||
341 | } | ||
342 | |||
343 | static int emu_mvfacmi_a1(unsigned short insn, struct pt_regs *regs) | ||
344 | { | ||
345 | unsigned long val; | ||
346 | |||
347 | val = (regs->acc1h << 16) | (regs->acc1l >> 16); | ||
348 | set_reg(regs, REG1(insn), (int)val); | ||
349 | |||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | static int emu_m32r2(unsigned short insn, struct pt_regs *regs) | ||
354 | { | ||
355 | int res = -1; | ||
356 | |||
357 | if ((insn & 0x7fff) == ISA_NOP) /* nop */ | ||
358 | return 0; | ||
359 | |||
360 | switch(insn & 0x7000) { | ||
361 | case ISA_ADDI: /* addi Rdest, #imm8 */ | ||
362 | res = emu_addi(insn, regs); | ||
363 | break; | ||
364 | case ISA_LDI: /* ldi Rdest, #imm8 */ | ||
365 | res = emu_ldi(insn, regs); | ||
366 | break; | ||
367 | default: | ||
368 | break; | ||
369 | } | ||
370 | |||
371 | if (!res) | ||
372 | return 0; | ||
373 | |||
374 | switch(insn & 0x70f0) { | ||
375 | case ISA_ADD: /* add Rdest, Rsrc */ | ||
376 | res = emu_add(insn, regs); | ||
377 | break; | ||
378 | case ISA_ADDX: /* addx Rdest, Rsrc */ | ||
379 | res = emu_addx(insn, regs); | ||
380 | break; | ||
381 | case ISA_AND: /* and Rdest, Rsrc */ | ||
382 | res = emu_and(insn, regs); | ||
383 | break; | ||
384 | case ISA_CMP: /* cmp Rsrc1, Rsrc2 */ | ||
385 | res = emu_cmp(insn, regs); | ||
386 | break; | ||
387 | case ISA_CMPEQ: /* cmpeq Rsrc1, Rsrc2 */ | ||
388 | res = emu_cmpeq(insn, regs); | ||
389 | break; | ||
390 | case ISA_CMPU: /* cmpu Rsrc1, Rsrc2 */ | ||
391 | res = emu_cmpu(insn, regs); | ||
392 | break; | ||
393 | case ISA_CMPZ: /* cmpz Rsrc */ | ||
394 | res = emu_cmpz(insn, regs); | ||
395 | break; | ||
396 | case ISA_MV: /* mv Rdest, Rsrc */ | ||
397 | res = emu_mv(insn, regs); | ||
398 | break; | ||
399 | case ISA_NEG: /* neg Rdest, Rsrc */ | ||
400 | res = emu_neg(insn, regs); | ||
401 | break; | ||
402 | case ISA_NOT: /* not Rdest, Rsrc */ | ||
403 | res = emu_not(insn, regs); | ||
404 | break; | ||
405 | case ISA_OR: /* or Rdest, Rsrc */ | ||
406 | res = emu_or(insn, regs); | ||
407 | break; | ||
408 | case ISA_SUB: /* sub Rdest, Rsrc */ | ||
409 | res = emu_sub(insn, regs); | ||
410 | break; | ||
411 | case ISA_SUBX: /* subx Rdest, Rsrc */ | ||
412 | res = emu_subx(insn, regs); | ||
413 | break; | ||
414 | case ISA_XOR: /* xor Rdest, Rsrc */ | ||
415 | res = emu_xor(insn, regs); | ||
416 | break; | ||
417 | case ISA_MUL: /* mul Rdest, Rsrc */ | ||
418 | res = emu_mul(insn, regs); | ||
419 | break; | ||
420 | case ISA_MULLO_A0: /* mullo Rsrc1, Rsrc2 */ | ||
421 | res = emu_mullo_a0(insn, regs); | ||
422 | break; | ||
423 | case ISA_MULLO_A1: /* mullo Rsrc1, Rsrc2 */ | ||
424 | res = emu_mullo_a1(insn, regs); | ||
425 | break; | ||
426 | default: | ||
427 | break; | ||
428 | } | ||
429 | |||
430 | if (!res) | ||
431 | return 0; | ||
432 | |||
433 | switch(insn & 0x70ff) { | ||
434 | case ISA_MVFACMI_A0: /* mvfacmi Rdest */ | ||
435 | res = emu_mvfacmi_a0(insn, regs); | ||
436 | break; | ||
437 | case ISA_MVFACMI_A1: /* mvfacmi Rdest */ | ||
438 | res = emu_mvfacmi_a1(insn, regs); | ||
439 | break; | ||
440 | default: | ||
441 | break; | ||
442 | } | ||
443 | |||
444 | return res; | ||
445 | } | ||
446 | |||
447 | #endif /* CONFIG_ISA_DUAL_ISSUE */ | ||
448 | |||
449 | /* | ||
450 | * ld : ?010 dest 1100 src | ||
451 | * 0010 dest 1110 src : ld Rdest, @Rsrc+ | ||
452 | * ldh : ?010 dest 1010 src | ||
453 | * lduh : ?010 dest 1011 src | ||
454 | * st : ?010 src1 0100 src2 | ||
455 | * 0010 src1 0110 src2 : st Rsrc1, @+Rsrc2 | ||
456 | * 0010 src1 0111 src2 : st Rsrc1, @-Rsrc2 | ||
457 | * sth : ?010 src1 0010 src2 | ||
458 | */ | ||
459 | |||
460 | static int insn_check(unsigned long insn, struct pt_regs *regs, | ||
461 | unsigned char **ucp) | ||
462 | { | ||
463 | int res = 0; | ||
464 | |||
465 | /* | ||
466 | * 32bit insn | ||
467 | * ld Rdest, @(disp16, Rsrc) | ||
468 | * st Rdest, @(disp16, Rsrc) | ||
469 | */ | ||
470 | if (insn & 0x80000000) { /* 32bit insn */ | ||
471 | *ucp += (short)(insn & 0x0000ffff); | ||
472 | regs->bpc += 4; | ||
473 | } else { /* 16bit insn */ | ||
474 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
475 | /* parallel exec check */ | ||
476 | if (!(regs->bpc & 0x2) && insn & 0x8000) { | ||
477 | res = emu_m32r2((unsigned short)insn, regs); | ||
478 | regs->bpc += 4; | ||
479 | } else | ||
480 | #endif /* CONFIG_ISA_DUAL_ISSUE */ | ||
481 | regs->bpc += 2; | ||
482 | } | ||
483 | |||
484 | return res; | ||
485 | } | ||
486 | |||
487 | static int emu_ld(unsigned long insn32, struct pt_regs *regs) | ||
488 | { | ||
489 | unsigned char *ucp; | ||
490 | unsigned long val; | ||
491 | unsigned short insn16; | ||
492 | int size, src; | ||
493 | |||
494 | insn16 = insn32 >> 16; | ||
495 | src = REG2(insn16); | ||
496 | ucp = (unsigned char *)get_reg(regs, src); | ||
497 | |||
498 | if (insn_check(insn32, regs, &ucp)) | ||
499 | return -1; | ||
500 | |||
501 | size = insn16 & 0x0040 ? 4 : 2; | ||
502 | if (copy_from_user(&val, ucp, size)) | ||
503 | return -1; | ||
504 | |||
505 | if (size == 2) | ||
506 | val >>= 16; | ||
507 | |||
508 | /* ldh sign check */ | ||
509 | if ((insn16 & 0x00f0) == 0x00a0 && (val & 0x8000)) | ||
510 | val |= 0xffff0000; | ||
511 | |||
512 | set_reg(regs, REG1(insn16), val); | ||
513 | |||
514 | /* ld increment check */ | ||
515 | if ((insn16 & 0xf0f0) == ISA_LD2) /* ld Rdest, @Rsrc+ */ | ||
516 | set_reg(regs, src, (unsigned long)(ucp + 4)); | ||
517 | |||
518 | return 0; | ||
519 | } | ||
520 | |||
521 | static int emu_st(unsigned long insn32, struct pt_regs *regs) | ||
522 | { | ||
523 | unsigned char *ucp; | ||
524 | unsigned long val; | ||
525 | unsigned short insn16; | ||
526 | int size, src2; | ||
527 | |||
528 | insn16 = insn32 >> 16; | ||
529 | src2 = REG2(insn16); | ||
530 | |||
531 | ucp = (unsigned char *)get_reg(regs, src2); | ||
532 | |||
533 | if (insn_check(insn32, regs, &ucp)) | ||
534 | return -1; | ||
535 | |||
536 | size = insn16 & 0x0040 ? 4 : 2; | ||
537 | val = get_reg(regs, REG1(insn16)); | ||
538 | if (size == 2) | ||
539 | val <<= 16; | ||
540 | |||
541 | /* st inc/dec check */ | ||
542 | if ((insn16 & 0xf0e0) == 0x2060) { | ||
543 | if (insn16 & 0x0010) | ||
544 | ucp -= 4; | ||
545 | else | ||
546 | ucp += 4; | ||
547 | |||
548 | set_reg(regs, src2, (unsigned long)ucp); | ||
549 | } | ||
550 | |||
551 | if (copy_to_user(ucp, &val, size)) | ||
552 | return -1; | ||
553 | |||
554 | /* sth inc check */ | ||
555 | if ((insn16 & 0xf0f0) == ISA_STH2) { | ||
556 | ucp += 2; | ||
557 | set_reg(regs, src2, (unsigned long)ucp); | ||
558 | } | ||
559 | |||
560 | return 0; | ||
561 | } | ||
562 | |||
563 | int handle_unaligned_access(unsigned long insn32, struct pt_regs *regs) | ||
564 | { | ||
565 | unsigned short insn16; | ||
566 | int res; | ||
567 | |||
568 | insn16 = insn32 >> 16; | ||
569 | |||
570 | /* ld or st check */ | ||
571 | if ((insn16 & 0x7000) != 0x2000) | ||
572 | return -1; | ||
573 | |||
574 | /* insn alignment check */ | ||
575 | if ((insn16 & 0x8000) && (regs->bpc & 3)) | ||
576 | return -1; | ||
577 | |||
578 | if (insn16 & 0x0080) /* ld */ | ||
579 | res = emu_ld(insn32, regs); | ||
580 | else /* st */ | ||
581 | res = emu_st(insn32, regs); | ||
582 | |||
583 | return res; | ||
584 | } | ||
585 | |||
diff --git a/arch/m32r/kernel/entry.S b/arch/m32r/kernel/entry.S new file mode 100644 index 000000000000..dddbf6b5ed2c --- /dev/null +++ b/arch/m32r/kernel/entry.S | |||
@@ -0,0 +1,1000 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/entry.S | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hirokazu Takata, Hitoshi Yamamoto, H. Kondo | ||
5 | * Copyright (c) 2003 Hitoshi Yamamoto | ||
6 | * Copyright (c) 2004 Hirokazu Takata <takata at linux-m32r.org> | ||
7 | * | ||
8 | * Taken from i386 version. | ||
9 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * entry.S contains the system-call and fault low-level handling routines. | ||
14 | * This also contains the timer-interrupt handler, as well as all interrupts | ||
15 | * and faults that can result in a task-switch. | ||
16 | * | ||
17 | * NOTE: This code handles signal-recognition, which happens every time | ||
18 | * after a timer-interrupt and after each system call. | ||
19 | * | ||
20 | * Stack layout in 'ret_from_system_call': | ||
21 | * ptrace needs to have all regs on the stack. | ||
22 | * if the order here is changed, it needs to be | ||
23 | * updated in fork.c:copy_process, signal.c:do_signal, | ||
24 | * ptrace.c and ptrace.h | ||
25 | * | ||
26 | * M32Rx/M32R2 M32R | ||
27 | * @(sp) - r4 ditto | ||
28 | * @(0x04,sp) - r5 ditto | ||
29 | * @(0x08,sp) - r6 ditto | ||
30 | * @(0x0c,sp) - *pt_regs ditto | ||
31 | * @(0x10,sp) - r0 ditto | ||
32 | * @(0x14,sp) - r1 ditto | ||
33 | * @(0x18,sp) - r2 ditto | ||
34 | * @(0x1c,sp) - r3 ditto | ||
35 | * @(0x20,sp) - r7 ditto | ||
36 | * @(0x24,sp) - r8 ditto | ||
37 | * @(0x28,sp) - r9 ditto | ||
38 | * @(0x2c,sp) - r10 ditto | ||
39 | * @(0x30,sp) - r11 ditto | ||
40 | * @(0x34,sp) - r12 ditto | ||
41 | * @(0x38,sp) - syscall_nr ditto | ||
42 | * @(0x3c,sp) - acc0h @(0x3c,sp) - acch | ||
43 | * @(0x40,sp) - acc0l @(0x40,sp) - accl | ||
44 | * @(0x44,sp) - acc1h @(0x44,sp) - psw | ||
45 | * @(0x48,sp) - acc1l @(0x48,sp) - bpc | ||
46 | * @(0x4c,sp) - psw @(0x4c,sp) - bbpsw | ||
47 | * @(0x50,sp) - bpc @(0x50,sp) - bbpc | ||
48 | * @(0x54,sp) - bbpsw @(0x54,sp) - spu (cr3) | ||
49 | * @(0x58,sp) - bbpc @(0x58,sp) - fp (r13) | ||
50 | * @(0x5c,sp) - spu (cr3) @(0x5c,sp) - lr (r14) | ||
51 | * @(0x60,sp) - fp (r13) @(0x60,sp) - spi (cr12) | ||
52 | * @(0x64,sp) - lr (r14) @(0x64,sp) - orig_r0 | ||
53 | * @(0x68,sp) - spi (cr2) | ||
54 | * @(0x6c,sp) - orig_r0 | ||
55 | * | ||
56 | */ | ||
57 | |||
58 | #include <linux/config.h> | ||
59 | #include <linux/linkage.h> | ||
60 | #include <asm/irq.h> | ||
61 | #include <asm/unistd.h> | ||
62 | #include <asm/assembler.h> | ||
63 | #include <asm/thread_info.h> | ||
64 | #include <asm/errno.h> | ||
65 | #include <asm/segment.h> | ||
66 | #include <asm/smp.h> | ||
67 | #include <asm/page.h> | ||
68 | #include <asm/m32r.h> | ||
69 | #include <asm/mmu_context.h> | ||
70 | |||
71 | #if !defined(CONFIG_MMU) | ||
72 | #define sys_madvise sys_ni_syscall | ||
73 | #define sys_readahead sys_ni_syscall | ||
74 | #define sys_mprotect sys_ni_syscall | ||
75 | #define sys_msync sys_ni_syscall | ||
76 | #define sys_mlock sys_ni_syscall | ||
77 | #define sys_munlock sys_ni_syscall | ||
78 | #define sys_mlockall sys_ni_syscall | ||
79 | #define sys_munlockall sys_ni_syscall | ||
80 | #define sys_mremap sys_ni_syscall | ||
81 | #define sys_mincore sys_ni_syscall | ||
82 | #define sys_remap_file_pages sys_ni_syscall | ||
83 | #endif /* CONFIG_MMU */ | ||
84 | |||
85 | #define R4(reg) @reg | ||
86 | #define R5(reg) @(0x04,reg) | ||
87 | #define R6(reg) @(0x08,reg) | ||
88 | #define PTREGS(reg) @(0x0C,reg) | ||
89 | #define R0(reg) @(0x10,reg) | ||
90 | #define R1(reg) @(0x14,reg) | ||
91 | #define R2(reg) @(0x18,reg) | ||
92 | #define R3(reg) @(0x1C,reg) | ||
93 | #define R7(reg) @(0x20,reg) | ||
94 | #define R8(reg) @(0x24,reg) | ||
95 | #define R9(reg) @(0x28,reg) | ||
96 | #define R10(reg) @(0x2C,reg) | ||
97 | #define R11(reg) @(0x30,reg) | ||
98 | #define R12(reg) @(0x34,reg) | ||
99 | #define SYSCALL_NR(reg) @(0x38,reg) | ||
100 | #if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) | ||
101 | #define ACC0H(reg) @(0x3C,reg) | ||
102 | #define ACC0L(reg) @(0x40,reg) | ||
103 | #define ACC1H(reg) @(0x44,reg) | ||
104 | #define ACC1L(reg) @(0x48,reg) | ||
105 | #define PSW(reg) @(0x4C,reg) | ||
106 | #define BPC(reg) @(0x50,reg) | ||
107 | #define BBPSW(reg) @(0x54,reg) | ||
108 | #define BBPC(reg) @(0x58,reg) | ||
109 | #define SPU(reg) @(0x5C,reg) | ||
110 | #define FP(reg) @(0x60,reg) /* FP = R13 */ | ||
111 | #define LR(reg) @(0x64,reg) | ||
112 | #define SP(reg) @(0x68,reg) | ||
113 | #define ORIG_R0(reg) @(0x6C,reg) | ||
114 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||
115 | #define ACCH(reg) @(0x3C,reg) | ||
116 | #define ACCL(reg) @(0x40,reg) | ||
117 | #define PSW(reg) @(0x44,reg) | ||
118 | #define BPC(reg) @(0x48,reg) | ||
119 | #define BBPSW(reg) @(0x4C,reg) | ||
120 | #define BBPC(reg) @(0x50,reg) | ||
121 | #define SPU(reg) @(0x54,reg) | ||
122 | #define FP(reg) @(0x58,reg) /* FP = R13 */ | ||
123 | #define LR(reg) @(0x5C,reg) | ||
124 | #define SP(reg) @(0x60,reg) | ||
125 | #define ORIG_R0(reg) @(0x64,reg) | ||
126 | #else | ||
127 | #error unknown isa configuration | ||
128 | #endif | ||
129 | |||
130 | CF_MASK = 0x00000001 | ||
131 | TF_MASK = 0x00000100 | ||
132 | IF_MASK = 0x00000200 | ||
133 | DF_MASK = 0x00000400 | ||
134 | NT_MASK = 0x00004000 | ||
135 | VM_MASK = 0x00020000 | ||
136 | |||
137 | #ifdef CONFIG_PREEMPT | ||
138 | #define preempt_stop(x) CLI(x) | ||
139 | #else | ||
140 | #define preempt_stop(x) | ||
141 | #define resume_kernel restore_all | ||
142 | #endif | ||
143 | |||
144 | ENTRY(ret_from_fork) | ||
145 | ld r0, @sp+ | ||
146 | bl schedule_tail | ||
147 | GET_THREAD_INFO(r8) | ||
148 | bra syscall_exit | ||
149 | |||
150 | /* | ||
151 | * Return to user mode is not as complex as all this looks, | ||
152 | * but we want the default path for a system call return to | ||
153 | * go as quickly as possible which is why some of this is | ||
154 | * less clear than it otherwise should be. | ||
155 | */ | ||
156 | |||
157 | ; userspace resumption stub bypassing syscall exit tracing | ||
158 | ALIGN | ||
159 | ret_from_exception: | ||
160 | preempt_stop(r4) | ||
161 | ret_from_intr: | ||
162 | ld r4, PSW(sp) | ||
163 | #ifdef CONFIG_ISA_M32R2 | ||
164 | and3 r4, r4, #0x8800 ; check BSM and BPM bits | ||
165 | #else | ||
166 | and3 r4, r4, #0x8000 ; check BSM bit | ||
167 | #endif | ||
168 | beqz r4, resume_kernel | ||
169 | ENTRY(resume_userspace) | ||
170 | CLI(r4) ; make sure we don't miss an interrupt | ||
171 | ; setting need_resched or sigpending | ||
172 | ; between sampling and the iret | ||
173 | GET_THREAD_INFO(r8) | ||
174 | ld r9, @(TI_FLAGS, r8) | ||
175 | and3 r4, r9, #_TIF_WORK_MASK ; is there any work to be done on | ||
176 | ; int/exception return? | ||
177 | bnez r4, work_pending | ||
178 | bra restore_all | ||
179 | |||
180 | #ifdef CONFIG_PREEMPT | ||
181 | ENTRY(resume_kernel) | ||
182 | GET_THREAD_INFO(r8) | ||
183 | ld r9, @(TI_PRE_COUNT, r8) ; non-zero preempt_count ? | ||
184 | bnez r9, restore_all | ||
185 | need_resched: | ||
186 | ld r9, @(TI_FLAGS, r8) ; need_resched set ? | ||
187 | and3 r4, r9, #_TIF_NEED_RESCHED | ||
188 | beqz r4, restore_all | ||
189 | ld r4, PSW(sp) ; interrupts off (exception path) ? | ||
190 | and3 r4, r4, #0x4000 | ||
191 | beqz r4, restore_all | ||
192 | LDIMM (r4, PREEMPT_ACTIVE) | ||
193 | st r4, @(TI_PRE_COUNT, r8) | ||
194 | STI(r4) | ||
195 | bl schedule | ||
196 | ldi r4, #0 | ||
197 | st r4, @(TI_PRE_COUNT, r8) | ||
198 | CLI(r4) | ||
199 | bra need_resched | ||
200 | #endif | ||
201 | |||
202 | ; system call handler stub | ||
203 | ENTRY(system_call) | ||
204 | SWITCH_TO_KERNEL_STACK | ||
205 | SAVE_ALL | ||
206 | STI(r4) ; Enable interrupt | ||
207 | st sp, PTREGS(sp) ; implicit pt_regs parameter | ||
208 | cmpui r7, #NR_syscalls | ||
209 | bnc syscall_badsys | ||
210 | st r7, SYSCALL_NR(sp) ; syscall_nr | ||
211 | ; system call tracing in operation | ||
212 | GET_THREAD_INFO(r8) | ||
213 | ld r9, @(TI_FLAGS, r8) | ||
214 | and3 r4, r9, #_TIF_SYSCALL_TRACE | ||
215 | bnez r4, syscall_trace_entry | ||
216 | syscall_call: | ||
217 | slli r7, #2 ; table jump for the system call | ||
218 | LDIMM (r4, sys_call_table) | ||
219 | add r7, r4 | ||
220 | ld r7, @r7 | ||
221 | jl r7 ; execute system call | ||
222 | st r0, R0(sp) ; save the return value | ||
223 | syscall_exit: | ||
224 | CLI(r4) ; make sure we don't miss an interrupt | ||
225 | ; setting need_resched or sigpending | ||
226 | ; between sampling and the iret | ||
227 | ld r9, @(TI_FLAGS, r8) | ||
228 | and3 r4, r9, #_TIF_ALLWORK_MASK ; current->work | ||
229 | bnez r4, syscall_exit_work | ||
230 | restore_all: | ||
231 | RESTORE_ALL | ||
232 | |||
233 | # perform work that needs to be done immediately before resumption | ||
234 | # r9 : frags | ||
235 | ALIGN | ||
236 | work_pending: | ||
237 | and3 r4, r9, #_TIF_NEED_RESCHED | ||
238 | beqz r4, work_notifysig | ||
239 | work_resched: | ||
240 | bl schedule | ||
241 | CLI(r4) ; make sure we don't miss an interrupt | ||
242 | ; setting need_resched or sigpending | ||
243 | ; between sampling and the iret | ||
244 | ld r9, @(TI_FLAGS, r8) | ||
245 | and3 r4, r9, #_TIF_WORK_MASK ; is there any work to be done other | ||
246 | ; than syscall tracing? | ||
247 | beqz r4, restore_all | ||
248 | and3 r4, r4, #_TIF_NEED_RESCHED | ||
249 | bnez r4, work_resched | ||
250 | |||
251 | work_notifysig: ; deal with pending signals and | ||
252 | ; notify-resume requests | ||
253 | mv r0, sp ; arg1 : struct pt_regs *regs | ||
254 | ldi r1, #0 ; arg2 : sigset_t *oldset | ||
255 | mv r2, r9 ; arg3 : __u32 thread_info_flags | ||
256 | bl do_notify_resume | ||
257 | bra restore_all | ||
258 | |||
259 | ; perform syscall exit tracing | ||
260 | ALIGN | ||
261 | syscall_trace_entry: | ||
262 | ldi r4, #-ENOSYS | ||
263 | st r4, R0(sp) | ||
264 | bl do_syscall_trace | ||
265 | ld r0, ORIG_R0(sp) | ||
266 | ld r1, R1(sp) | ||
267 | ld r2, R2(sp) | ||
268 | ld r3, R3(sp) | ||
269 | ld r4, R4(sp) | ||
270 | ld r5, R5(sp) | ||
271 | ld r6, R6(sp) | ||
272 | ld r7, SYSCALL_NR(sp) | ||
273 | cmpui r7, #NR_syscalls | ||
274 | bc syscall_call | ||
275 | bra syscall_exit | ||
276 | |||
277 | ; perform syscall exit tracing | ||
278 | ALIGN | ||
279 | syscall_exit_work: | ||
280 | ld r9, @(TI_FLAGS, r8) | ||
281 | and3 r4, r9, #_TIF_SYSCALL_TRACE | ||
282 | beqz r4, work_pending | ||
283 | STI(r4) ; could let do_syscall_trace() call | ||
284 | ; schedule() instead | ||
285 | bl do_syscall_trace | ||
286 | bra resume_userspace | ||
287 | |||
288 | ALIGN | ||
289 | syscall_fault: | ||
290 | SAVE_ALL | ||
291 | GET_THREAD_INFO(r8) | ||
292 | ldi r4, #-EFAULT | ||
293 | st r4, R0(sp) | ||
294 | bra resume_userspace | ||
295 | |||
296 | ALIGN | ||
297 | syscall_badsys: | ||
298 | ldi r4, #-ENOSYS | ||
299 | st r4, R0(sp) | ||
300 | bra resume_userspace | ||
301 | |||
302 | .global eit_vector | ||
303 | |||
304 | .equ ei_vec_table, eit_vector + 0x0200 | ||
305 | |||
306 | /* | ||
307 | * EI handler routine | ||
308 | */ | ||
309 | ENTRY(ei_handler) | ||
310 | #if defined(CONFIG_CHIP_M32700) | ||
311 | SWITCH_TO_KERNEL_STACK | ||
312 | ; WORKAROUND: force to clear SM bit and use the kernel stack (SPI). | ||
313 | #endif | ||
314 | SAVE_ALL | ||
315 | mv r1, sp ; arg1(regs) | ||
316 | #if defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_XNUX2) \ | ||
317 | || defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_M32102) \ | ||
318 | || defined(CONFIG_CHIP_OPSP) | ||
319 | |||
320 | ; GET_ICU_STATUS; | ||
321 | seth r0, #shigh(M32R_ICU_ISTS_ADDR) | ||
322 | ld r0, @(low(M32R_ICU_ISTS_ADDR),r0) | ||
323 | st r0, @-sp | ||
324 | #if defined(CONFIG_SMP) | ||
325 | /* | ||
326 | * If IRQ == 0 --> Nothing to do, Not write IMASK | ||
327 | * If IRQ == IPI --> Do IPI handler, Not write IMASK | ||
328 | * If IRQ != 0, IPI --> Do do_IRQ(), Write IMASK | ||
329 | */ | ||
330 | slli r0, #4 | ||
331 | srli r0, #24 ; r0(irq_num<<2) | ||
332 | ;; IRQ exist check | ||
333 | #if defined(CONFIG_CHIP_M32700) | ||
334 | /* WORKAROUND: IMASK bug M32700-TS1, TS2 chip. */ | ||
335 | beqz r0, 3f ; if (!irq_num) goto exit | ||
336 | #else | ||
337 | beqz r0, 1f ; if (!irq_num) goto exit | ||
338 | #endif /* WORKAROUND */ | ||
339 | ;; IPI check | ||
340 | cmpi r0, #(M32R_IRQ_IPI0<<2) ; ISN < IPI0 check | ||
341 | bc 2f | ||
342 | cmpi r0, #((M32R_IRQ_IPI7+1)<<2) ; ISN > IPI7 check | ||
343 | bnc 2f | ||
344 | LDIMM (r2, ei_vec_table) | ||
345 | add r2, r0 | ||
346 | ld r2, @r2 | ||
347 | beqz r2, 1f ; if (no IPI handler) goto exit | ||
348 | mv r0, r1 ; arg0(regs) | ||
349 | jl r2 | ||
350 | .fillinsn | ||
351 | 1: | ||
352 | addi sp, #4 | ||
353 | bra ret_to_intr | ||
354 | #if defined(CONFIG_CHIP_M32700) | ||
355 | /* WORKAROUND: IMASK bug M32700-TS1, TS2 chip. */ | ||
356 | .fillinsn | ||
357 | 3: | ||
358 | ld24 r14, #0x00070000 | ||
359 | seth r0, #shigh(M32R_ICU_IMASK_ADDR) | ||
360 | st r14, @(low(M32R_ICU_IMASK_ADDR), r0) | ||
361 | addi sp, #4 | ||
362 | bra ret_to_intr | ||
363 | #endif /* WORKAROUND */ | ||
364 | ;; do_IRQ | ||
365 | .fillinsn | ||
366 | 2: | ||
367 | srli r0, #2 | ||
368 | #if defined(CONFIG_PLAT_USRV) | ||
369 | add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt | ||
370 | bnez r2, 9f | ||
371 | ; read ICU status register of PLD | ||
372 | seth r0, #high(PLD_ICUISTS) | ||
373 | or3 r0, r0, #low(PLD_ICUISTS) | ||
374 | lduh r0, @r0 | ||
375 | slli r0, #21 | ||
376 | srli r0, #27 ; ISN | ||
377 | addi r0, #(M32700UT_PLD_IRQ_BASE) | ||
378 | .fillinsn | ||
379 | 9: | ||
380 | #elif defined(CONFIG_PLAT_M32700UT) | ||
381 | add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt | ||
382 | bnez r2, check_int0 | ||
383 | ; read ICU status register of PLD | ||
384 | seth r0, #high(PLD_ICUISTS) | ||
385 | or3 r0, r0, #low(PLD_ICUISTS) | ||
386 | lduh r0, @r0 | ||
387 | slli r0, #21 | ||
388 | srli r0, #27 ; ISN | ||
389 | addi r0, #(M32700UT_PLD_IRQ_BASE) | ||
390 | bra check_end | ||
391 | .fillinsn | ||
392 | check_int0: | ||
393 | add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt | ||
394 | bnez r2, check_int2 | ||
395 | ; read ICU status of LAN-board | ||
396 | seth r0, #high(M32700UT_LAN_ICUISTS) | ||
397 | or3 r0, r0, #low(M32700UT_LAN_ICUISTS) | ||
398 | lduh r0, @r0 | ||
399 | slli r0, #21 | ||
400 | srli r0, #27 ; ISN | ||
401 | add3 r0, r0, #(M32700UT_LAN_PLD_IRQ_BASE) | ||
402 | bra check_end | ||
403 | .fillinsn | ||
404 | check_int2: | ||
405 | add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt | ||
406 | bnez r2, check_end | ||
407 | ; read ICU status of LCD-board | ||
408 | seth r0, #high(M32700UT_LCD_ICUISTS) | ||
409 | or3 r0, r0, #low(M32700UT_LCD_ICUISTS) | ||
410 | lduh r0, @r0 | ||
411 | slli r0, #21 | ||
412 | srli r0, #27 ; ISN | ||
413 | add3 r0, r0, #(M32700UT_LCD_PLD_IRQ_BASE) | ||
414 | bra check_end | ||
415 | .fillinsn | ||
416 | check_end: | ||
417 | #elif defined(CONFIG_PLAT_OPSPUT) | ||
418 | add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt | ||
419 | bnez r2, check_int0 | ||
420 | ; read ICU status register of PLD | ||
421 | seth r0, #high(PLD_ICUISTS) | ||
422 | or3 r0, r0, #low(PLD_ICUISTS) | ||
423 | lduh r0, @r0 | ||
424 | slli r0, #21 | ||
425 | srli r0, #27 ; ISN | ||
426 | addi r0, #(OPSPUT_PLD_IRQ_BASE) | ||
427 | bra check_end | ||
428 | .fillinsn | ||
429 | check_int0: | ||
430 | add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt | ||
431 | bnez r2, check_int2 | ||
432 | ; read ICU status of LAN-board | ||
433 | seth r0, #high(OPSPUT_LAN_ICUISTS) | ||
434 | or3 r0, r0, #low(OPSPUT_LAN_ICUISTS) | ||
435 | lduh r0, @r0 | ||
436 | slli r0, #21 | ||
437 | srli r0, #27 ; ISN | ||
438 | add3 r0, r0, #(OPSPUT_LAN_PLD_IRQ_BASE) | ||
439 | bra check_end | ||
440 | .fillinsn | ||
441 | check_int2: | ||
442 | add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt | ||
443 | bnez r2, check_end | ||
444 | ; read ICU status of LCD-board | ||
445 | seth r0, #high(OPSPUT_LCD_ICUISTS) | ||
446 | or3 r0, r0, #low(OPSPUT_LCD_ICUISTS) | ||
447 | lduh r0, @r0 | ||
448 | slli r0, #21 | ||
449 | srli r0, #27 ; ISN | ||
450 | add3 r0, r0, #(OPSPUT_LCD_PLD_IRQ_BASE) | ||
451 | bra check_end | ||
452 | .fillinsn | ||
453 | check_end: | ||
454 | #endif /* CONFIG_PLAT_OPSPUT */ | ||
455 | bl do_IRQ ; r0(irq), r1(regs) | ||
456 | #else /* not CONFIG_SMP */ | ||
457 | srli r0, #22 ; r0(irq) | ||
458 | #if defined(CONFIG_PLAT_USRV) | ||
459 | add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt | ||
460 | bnez r2, 1f | ||
461 | ; read ICU status register of PLD | ||
462 | seth r0, #high(PLD_ICUISTS) | ||
463 | or3 r0, r0, #low(PLD_ICUISTS) | ||
464 | lduh r0, @r0 | ||
465 | slli r0, #21 | ||
466 | srli r0, #27 ; ISN | ||
467 | addi r0, #(M32700UT_PLD_IRQ_BASE) | ||
468 | .fillinsn | ||
469 | 1: | ||
470 | #elif defined(CONFIG_PLAT_M32700UT) | ||
471 | add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt | ||
472 | bnez r2, check_int0 | ||
473 | ; read ICU status register of PLD | ||
474 | seth r0, #high(PLD_ICUISTS) | ||
475 | or3 r0, r0, #low(PLD_ICUISTS) | ||
476 | lduh r0, @r0 | ||
477 | slli r0, #21 | ||
478 | srli r0, #27 ; ISN | ||
479 | addi r0, #(M32700UT_PLD_IRQ_BASE) | ||
480 | bra check_end | ||
481 | .fillinsn | ||
482 | check_int0: | ||
483 | add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt | ||
484 | bnez r2, check_int2 | ||
485 | ; read ICU status of LAN-board | ||
486 | seth r0, #high(M32700UT_LAN_ICUISTS) | ||
487 | or3 r0, r0, #low(M32700UT_LAN_ICUISTS) | ||
488 | lduh r0, @r0 | ||
489 | slli r0, #21 | ||
490 | srli r0, #27 ; ISN | ||
491 | add3 r0, r0, #(M32700UT_LAN_PLD_IRQ_BASE) | ||
492 | bra check_end | ||
493 | .fillinsn | ||
494 | check_int2: | ||
495 | add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt | ||
496 | bnez r2, check_end | ||
497 | ; read ICU status of LCD-board | ||
498 | seth r0, #high(M32700UT_LCD_ICUISTS) | ||
499 | or3 r0, r0, #low(M32700UT_LCD_ICUISTS) | ||
500 | lduh r0, @r0 | ||
501 | slli r0, #21 | ||
502 | srli r0, #27 ; ISN | ||
503 | add3 r0, r0, #(M32700UT_LCD_PLD_IRQ_BASE) | ||
504 | bra check_end | ||
505 | .fillinsn | ||
506 | check_end: | ||
507 | #elif defined(CONFIG_PLAT_OPSPUT) | ||
508 | add3 r2, r0, #-(M32R_IRQ_INT1) ; INT1# interrupt | ||
509 | bnez r2, check_int0 | ||
510 | ; read ICU status register of PLD | ||
511 | seth r0, #high(PLD_ICUISTS) | ||
512 | or3 r0, r0, #low(PLD_ICUISTS) | ||
513 | lduh r0, @r0 | ||
514 | slli r0, #21 | ||
515 | srli r0, #27 ; ISN | ||
516 | addi r0, #(OPSPUT_PLD_IRQ_BASE) | ||
517 | bra check_end | ||
518 | .fillinsn | ||
519 | check_int0: | ||
520 | add3 r2, r0, #-(M32R_IRQ_INT0) ; INT0# interrupt | ||
521 | bnez r2, check_int2 | ||
522 | ; read ICU status of LAN-board | ||
523 | seth r0, #high(OPSPUT_LAN_ICUISTS) | ||
524 | or3 r0, r0, #low(OPSPUT_LAN_ICUISTS) | ||
525 | lduh r0, @r0 | ||
526 | slli r0, #21 | ||
527 | srli r0, #27 ; ISN | ||
528 | add3 r0, r0, #(OPSPUT_LAN_PLD_IRQ_BASE) | ||
529 | bra check_end | ||
530 | .fillinsn | ||
531 | check_int2: | ||
532 | add3 r2, r0, #-(M32R_IRQ_INT2) ; INT2# interrupt | ||
533 | bnez r2, check_end | ||
534 | ; read ICU status of LCD-board | ||
535 | seth r0, #high(OPSPUT_LCD_ICUISTS) | ||
536 | or3 r0, r0, #low(OPSPUT_LCD_ICUISTS) | ||
537 | lduh r0, @r0 | ||
538 | slli r0, #21 | ||
539 | srli r0, #27 ; ISN | ||
540 | add3 r0, r0, #(OPSPUT_LCD_PLD_IRQ_BASE) | ||
541 | bra check_end | ||
542 | .fillinsn | ||
543 | check_end: | ||
544 | #endif /* CONFIG_PLAT_OPSPUT */ | ||
545 | bl do_IRQ | ||
546 | #endif /* CONFIG_SMP */ | ||
547 | ld r14, @sp+ | ||
548 | seth r0, #shigh(M32R_ICU_IMASK_ADDR) | ||
549 | st r14, @(low(M32R_ICU_IMASK_ADDR),r0) | ||
550 | #else | ||
551 | #error no chip configuration | ||
552 | #endif | ||
553 | ret_to_intr: | ||
554 | bra ret_from_intr | ||
555 | |||
556 | /* | ||
557 | * Default EIT handler | ||
558 | */ | ||
559 | ALIGN | ||
560 | int_msg: | ||
561 | .asciz "Unknown interrupt\n" | ||
562 | .byte 0 | ||
563 | |||
564 | ENTRY(default_eit_handler) | ||
565 | push r0 | ||
566 | mvfc r0, psw | ||
567 | push r1 | ||
568 | push r2 | ||
569 | push r3 | ||
570 | push r0 | ||
571 | LDIMM (r0, __KERNEL_DS) | ||
572 | mv r0, r1 | ||
573 | mv r0, r2 | ||
574 | LDIMM (r0, int_msg) | ||
575 | bl printk | ||
576 | pop r0 | ||
577 | pop r3 | ||
578 | pop r2 | ||
579 | pop r1 | ||
580 | mvtc r0, psw | ||
581 | pop r0 | ||
582 | infinit: | ||
583 | bra infinit | ||
584 | |||
585 | #ifdef CONFIG_MMU | ||
586 | /* | ||
587 | * Access Exception handler | ||
588 | */ | ||
589 | ENTRY(ace_handler) | ||
590 | SWITCH_TO_KERNEL_STACK | ||
591 | SAVE_ALL | ||
592 | |||
593 | seth r2, #shigh(MMU_REG_BASE) /* Check status register */ | ||
594 | ld r4, @(low(MESTS_offset),r2) | ||
595 | st r4, @(low(MESTS_offset),r2) | ||
596 | srl3 r1, r4, #4 | ||
597 | #ifdef CONFIG_CHIP_M32700 | ||
598 | and3 r1, r1, #0x0000ffff | ||
599 | ; WORKAROUND: ignore TME bit for the M32700(TS1). | ||
600 | #endif /* CONFIG_CHIP_M32700 */ | ||
601 | beqz r1, inst | ||
602 | oprand: | ||
603 | ld r2, @(low(MDEVA_offset),r2) ; set address | ||
604 | srli r2, #12 | ||
605 | slli r2, #12 | ||
606 | srli r1, #1 | ||
607 | bra 1f | ||
608 | inst: | ||
609 | and3 r1, r4, #2 | ||
610 | srli r1, #1 | ||
611 | or3 r1, r1, #8 | ||
612 | mvfc r2, bpc ; set address | ||
613 | .fillinsn | ||
614 | 1: | ||
615 | mvfc r3, psw | ||
616 | mv r0, sp | ||
617 | and3 r3, r3, 0x800 | ||
618 | srli r3, #9 | ||
619 | or r1, r3 | ||
620 | /* | ||
621 | * do_page_fault(): | ||
622 | * r0 : struct pt_regs *regs | ||
623 | * r1 : unsigned long error-code | ||
624 | * r2 : unsigned long address | ||
625 | * error-code: | ||
626 | * +------+------+------+------+ | ||
627 | * | bit3 | bit2 | bit1 | bit0 | | ||
628 | * +------+------+------+------+ | ||
629 | * bit 3 == 0:means data, 1:means instruction | ||
630 | * bit 2 == 0:means kernel, 1:means user-mode | ||
631 | * bit 1 == 0:means read, 1:means write | ||
632 | * bit 0 == 0:means no page found 1:means protection fault | ||
633 | * | ||
634 | */ | ||
635 | bl do_page_fault | ||
636 | bra ret_from_intr | ||
637 | #endif /* CONFIG_MMU */ | ||
638 | |||
639 | |||
640 | ENTRY(alignment_check) | ||
641 | /* void alignment_check(int error_code) */ | ||
642 | SWITCH_TO_KERNEL_STACK | ||
643 | SAVE_ALL | ||
644 | ldi r1, #0x30 ; error_code | ||
645 | mv r0, sp ; pt_regs | ||
646 | bl do_alignment_check | ||
647 | error_code: | ||
648 | bra ret_from_exception | ||
649 | |||
650 | ENTRY(rie_handler) | ||
651 | /* void rie_handler(int error_code) */ | ||
652 | SWITCH_TO_KERNEL_STACK | ||
653 | SAVE_ALL | ||
654 | mvfc r0, bpc | ||
655 | ld r1, @r0 | ||
656 | seth r0, #0xa0f0 | ||
657 | st r1, @r0 | ||
658 | ldi r1, #0x20 ; error_code | ||
659 | mv r0, sp ; pt_regs | ||
660 | bl do_rie_handler | ||
661 | bra error_code | ||
662 | |||
663 | ENTRY(pie_handler) | ||
664 | /* void pie_handler(int error_code) */ | ||
665 | SWITCH_TO_KERNEL_STACK | ||
666 | SAVE_ALL | ||
667 | ldi r1, #0 ; error_code ; FIXME | ||
668 | mv r0, sp ; pt_regs | ||
669 | bl do_pie_handler | ||
670 | bra error_code | ||
671 | |||
672 | ENTRY(debug_trap) | ||
673 | .global withdraw_debug_trap | ||
674 | /* void debug_trap(void) */ | ||
675 | SWITCH_TO_KERNEL_STACK | ||
676 | SAVE_ALL | ||
677 | mv r0, sp ; pt_regs | ||
678 | bl withdraw_debug_trap | ||
679 | ldi r1, #0 ; error_code | ||
680 | mv r0, sp ; pt_regs | ||
681 | bl do_debug_trap | ||
682 | bra error_code | ||
683 | |||
684 | |||
685 | /* Cache flushing handler */ | ||
686 | ENTRY(cache_flushing_handler) | ||
687 | .global _flush_cache_all | ||
688 | /* void _flush_cache_all(void); */ | ||
689 | SWITCH_TO_KERNEL_STACK | ||
690 | push r0 | ||
691 | push r1 | ||
692 | push r2 | ||
693 | push r3 | ||
694 | push r4 | ||
695 | push r5 | ||
696 | push r6 | ||
697 | push r7 | ||
698 | push lr | ||
699 | bl _flush_cache_all | ||
700 | pop lr | ||
701 | pop r7 | ||
702 | pop r6 | ||
703 | pop r5 | ||
704 | pop r4 | ||
705 | pop r3 | ||
706 | pop r2 | ||
707 | pop r1 | ||
708 | pop r0 | ||
709 | rte | ||
710 | |||
711 | .data | ||
712 | ENTRY(sys_call_table) | ||
713 | .long sys_restart_syscall /* 0 - old "setup()" system call*/ | ||
714 | .long sys_exit | ||
715 | .long sys_fork | ||
716 | .long sys_read | ||
717 | .long sys_write | ||
718 | .long sys_open /* 5 */ | ||
719 | .long sys_close | ||
720 | .long sys_waitpid | ||
721 | .long sys_creat | ||
722 | .long sys_link | ||
723 | .long sys_unlink /* 10 */ | ||
724 | .long sys_execve | ||
725 | .long sys_chdir | ||
726 | .long sys_time | ||
727 | .long sys_mknod | ||
728 | .long sys_chmod /* 15 */ | ||
729 | .long sys_ni_syscall /* lchown16 syscall holder */ | ||
730 | .long sys_ni_syscall /* old break syscall holder */ | ||
731 | .long sys_ni_syscall /* old stat syscall holder */ | ||
732 | .long sys_lseek | ||
733 | .long sys_getpid /* 20 */ | ||
734 | .long sys_mount | ||
735 | .long sys_oldumount | ||
736 | .long sys_ni_syscall /* setuid16 syscall holder */ | ||
737 | .long sys_ni_syscall /* getuid16 syscall holder */ | ||
738 | .long sys_stime /* 25 */ | ||
739 | .long sys_ptrace | ||
740 | .long sys_alarm | ||
741 | .long sys_ni_syscall /* old fstat syscall holder */ | ||
742 | .long sys_pause | ||
743 | .long sys_utime /* 30 */ | ||
744 | .long sys_ni_syscall /* old stty syscall holder */ | ||
745 | .long sys_cachectl /* for M32R */ /* old gtty syscall holder */ | ||
746 | .long sys_access | ||
747 | .long sys_ni_syscall /* nice syscall holder */ | ||
748 | .long sys_ni_syscall /* 35 - old ftime syscall holder */ | ||
749 | .long sys_sync | ||
750 | .long sys_kill | ||
751 | .long sys_rename | ||
752 | .long sys_mkdir | ||
753 | .long sys_rmdir /* 40 */ | ||
754 | .long sys_dup | ||
755 | .long sys_pipe | ||
756 | .long sys_times | ||
757 | .long sys_ni_syscall /* old prof syscall holder */ | ||
758 | .long sys_brk /* 45 */ | ||
759 | .long sys_ni_syscall /* setgid16 syscall holder */ | ||
760 | .long sys_getgid /* will be unused */ | ||
761 | .long sys_ni_syscall /* signal syscall holder */ | ||
762 | .long sys_ni_syscall /* geteuid16 syscall holder */ | ||
763 | .long sys_ni_syscall /* 50 - getegid16 syscall holder */ | ||
764 | .long sys_acct | ||
765 | .long sys_umount /* recycled never used phys() */ | ||
766 | .long sys_ni_syscall /* old lock syscall holder */ | ||
767 | .long sys_ioctl | ||
768 | .long sys_fcntl /* 55 - will be unused */ | ||
769 | .long sys_ni_syscall /* mpx syscall holder */ | ||
770 | .long sys_setpgid | ||
771 | .long sys_ni_syscall /* old ulimit syscall holder */ | ||
772 | .long sys_ni_syscall /* sys_olduname */ | ||
773 | .long sys_umask /* 60 */ | ||
774 | .long sys_chroot | ||
775 | .long sys_ustat | ||
776 | .long sys_dup2 | ||
777 | .long sys_getppid | ||
778 | .long sys_getpgrp /* 65 */ | ||
779 | .long sys_setsid | ||
780 | .long sys_ni_syscall /* sigaction syscall holder */ | ||
781 | .long sys_ni_syscall /* sgetmask syscall holder */ | ||
782 | .long sys_ni_syscall /* ssetmask syscall holder */ | ||
783 | .long sys_ni_syscall /* 70 - setreuid16 syscall holder */ | ||
784 | .long sys_ni_syscall /* setregid16 syscall holder */ | ||
785 | .long sys_ni_syscall /* sigsuspend syscall holder */ | ||
786 | .long sys_ni_syscall /* sigpending syscall holder */ | ||
787 | .long sys_sethostname | ||
788 | .long sys_setrlimit /* 75 */ | ||
789 | .long sys_getrlimit/*will be unused*/ | ||
790 | .long sys_getrusage | ||
791 | .long sys_gettimeofday | ||
792 | .long sys_settimeofday | ||
793 | .long sys_ni_syscall /* 80 - getgroups16 syscall holder */ | ||
794 | .long sys_ni_syscall /* setgroups16 syscall holder */ | ||
795 | .long sys_ni_syscall /* sys_oldselect */ | ||
796 | .long sys_symlink | ||
797 | .long sys_ni_syscall /* old lstat syscall holder */ | ||
798 | .long sys_readlink /* 85 */ | ||
799 | .long sys_uselib | ||
800 | .long sys_swapon | ||
801 | .long sys_reboot | ||
802 | .long sys_ni_syscall /* readdir syscall holder */ | ||
803 | .long sys_ni_syscall /* 90 - old_mmap syscall holder */ | ||
804 | .long sys_munmap | ||
805 | .long sys_truncate | ||
806 | .long sys_ftruncate | ||
807 | .long sys_fchmod | ||
808 | .long sys_ni_syscall /* 95 - fchwon16 syscall holder */ | ||
809 | .long sys_getpriority | ||
810 | .long sys_setpriority | ||
811 | .long sys_ni_syscall /* old profil syscall holder */ | ||
812 | .long sys_statfs | ||
813 | .long sys_fstatfs /* 100 */ | ||
814 | .long sys_ni_syscall /* ioperm syscall holder */ | ||
815 | .long sys_socketcall | ||
816 | .long sys_syslog | ||
817 | .long sys_setitimer | ||
818 | .long sys_getitimer /* 105 */ | ||
819 | .long sys_newstat | ||
820 | .long sys_newlstat | ||
821 | .long sys_newfstat | ||
822 | .long sys_ni_syscall /* old uname syscall holder */ | ||
823 | .long sys_ni_syscall /* 110 - iopl syscall holder */ | ||
824 | .long sys_vhangup | ||
825 | .long sys_ni_syscall /* idle syscall holder */ | ||
826 | .long sys_ni_syscall /* vm86old syscall holder */ | ||
827 | .long sys_wait4 | ||
828 | .long sys_swapoff /* 115 */ | ||
829 | .long sys_sysinfo | ||
830 | .long sys_ipc | ||
831 | .long sys_fsync | ||
832 | .long sys_ni_syscall /* sigreturn syscall holder */ | ||
833 | .long sys_clone /* 120 */ | ||
834 | .long sys_setdomainname | ||
835 | .long sys_newuname | ||
836 | .long sys_ni_syscall /* modify_ldt syscall holder */ | ||
837 | .long sys_adjtimex | ||
838 | .long sys_mprotect /* 125 */ | ||
839 | .long sys_ni_syscall /* sigprocmask syscall holder */ | ||
840 | .long sys_ni_syscall /* create_module syscall holder */ | ||
841 | .long sys_init_module | ||
842 | .long sys_delete_module | ||
843 | .long sys_ni_syscall /* 130 - get_kernel_syms */ | ||
844 | .long sys_quotactl | ||
845 | .long sys_getpgid | ||
846 | .long sys_fchdir | ||
847 | .long sys_bdflush | ||
848 | .long sys_sysfs /* 135 */ | ||
849 | .long sys_personality | ||
850 | .long sys_ni_syscall /* afs_syscall syscall holder */ | ||
851 | .long sys_ni_syscall /* setfsuid16 syscall holder */ | ||
852 | .long sys_ni_syscall /* setfsgid16 syscall holder */ | ||
853 | .long sys_llseek /* 140 */ | ||
854 | .long sys_getdents | ||
855 | .long sys_select | ||
856 | .long sys_flock | ||
857 | .long sys_msync | ||
858 | .long sys_readv /* 145 */ | ||
859 | .long sys_writev | ||
860 | .long sys_getsid | ||
861 | .long sys_fdatasync | ||
862 | .long sys_sysctl | ||
863 | .long sys_mlock /* 150 */ | ||
864 | .long sys_munlock | ||
865 | .long sys_mlockall | ||
866 | .long sys_munlockall | ||
867 | .long sys_sched_setparam | ||
868 | .long sys_sched_getparam /* 155 */ | ||
869 | .long sys_sched_setscheduler | ||
870 | .long sys_sched_getscheduler | ||
871 | .long sys_sched_yield | ||
872 | .long sys_sched_get_priority_max | ||
873 | .long sys_sched_get_priority_min /* 160 */ | ||
874 | .long sys_sched_rr_get_interval | ||
875 | .long sys_nanosleep | ||
876 | .long sys_mremap | ||
877 | .long sys_ni_syscall /* setresuid16 syscall holder */ | ||
878 | .long sys_ni_syscall /* 165 - getresuid16 syscall holder */ | ||
879 | .long sys_tas /* vm86 syscall holder */ | ||
880 | .long sys_ni_syscall /* query_module syscall holder */ | ||
881 | .long sys_poll | ||
882 | .long sys_nfsservctl | ||
883 | .long sys_setresgid /* 170 */ | ||
884 | .long sys_getresgid | ||
885 | .long sys_prctl | ||
886 | .long sys_rt_sigreturn | ||
887 | .long sys_rt_sigaction | ||
888 | .long sys_rt_sigprocmask /* 175 */ | ||
889 | .long sys_rt_sigpending | ||
890 | .long sys_rt_sigtimedwait | ||
891 | .long sys_rt_sigqueueinfo | ||
892 | .long sys_rt_sigsuspend | ||
893 | .long sys_pread64 /* 180 */ | ||
894 | .long sys_pwrite64 | ||
895 | .long sys_ni_syscall /* chown16 syscall holder */ | ||
896 | .long sys_getcwd | ||
897 | .long sys_capget | ||
898 | .long sys_capset /* 185 */ | ||
899 | .long sys_sigaltstack | ||
900 | .long sys_sendfile | ||
901 | .long sys_ni_syscall /* streams1 */ | ||
902 | .long sys_ni_syscall /* streams2 */ | ||
903 | .long sys_vfork /* 190 */ | ||
904 | .long sys_getrlimit | ||
905 | .long sys_mmap2 | ||
906 | .long sys_truncate64 | ||
907 | .long sys_ftruncate64 | ||
908 | .long sys_stat64 /* 195 */ | ||
909 | .long sys_lstat64 | ||
910 | .long sys_fstat64 | ||
911 | .long sys_lchown | ||
912 | .long sys_getuid | ||
913 | .long sys_getgid /* 200 */ | ||
914 | .long sys_geteuid | ||
915 | .long sys_getegid | ||
916 | .long sys_setreuid | ||
917 | .long sys_setregid | ||
918 | .long sys_getgroups /* 205 */ | ||
919 | .long sys_setgroups | ||
920 | .long sys_fchown | ||
921 | .long sys_setresuid | ||
922 | .long sys_getresuid | ||
923 | .long sys_setresgid /* 210 */ | ||
924 | .long sys_getresgid | ||
925 | .long sys_chown | ||
926 | .long sys_setuid | ||
927 | .long sys_setgid | ||
928 | .long sys_setfsuid /* 215 */ | ||
929 | .long sys_setfsgid | ||
930 | .long sys_pivot_root | ||
931 | .long sys_mincore | ||
932 | .long sys_madvise | ||
933 | .long sys_getdents64 /* 220 */ | ||
934 | .long sys_fcntl64 | ||
935 | .long sys_ni_syscall /* reserved for TUX */ | ||
936 | .long sys_ni_syscall /* Reserved for Security */ | ||
937 | .long sys_gettid | ||
938 | .long sys_readahead /* 225 */ | ||
939 | .long sys_setxattr | ||
940 | .long sys_lsetxattr | ||
941 | .long sys_fsetxattr | ||
942 | .long sys_getxattr | ||
943 | .long sys_lgetxattr /* 230 */ | ||
944 | .long sys_fgetxattr | ||
945 | .long sys_listxattr | ||
946 | .long sys_llistxattr | ||
947 | .long sys_flistxattr | ||
948 | .long sys_removexattr /* 235 */ | ||
949 | .long sys_lremovexattr | ||
950 | .long sys_fremovexattr | ||
951 | .long sys_tkill | ||
952 | .long sys_sendfile64 | ||
953 | .long sys_futex /* 240 */ | ||
954 | .long sys_sched_setaffinity | ||
955 | .long sys_sched_getaffinity | ||
956 | .long sys_ni_syscall /* reserved for "set_thread_area" system call */ | ||
957 | .long sys_ni_syscall /* reserved for "get_thread_area" system call */ | ||
958 | .long sys_io_setup /* 245 */ | ||
959 | .long sys_io_destroy | ||
960 | .long sys_io_getevents | ||
961 | .long sys_io_submit | ||
962 | .long sys_io_cancel | ||
963 | .long sys_fadvise64 /* 250 */ | ||
964 | .long sys_ni_syscall | ||
965 | .long sys_exit_group | ||
966 | .long sys_lookup_dcookie | ||
967 | .long sys_epoll_create | ||
968 | .long sys_epoll_ctl /* 255 */ | ||
969 | .long sys_epoll_wait | ||
970 | .long sys_remap_file_pages | ||
971 | .long sys_set_tid_address | ||
972 | .long sys_timer_create | ||
973 | .long sys_timer_settime /* 260 */ | ||
974 | .long sys_timer_gettime | ||
975 | .long sys_timer_getoverrun | ||
976 | .long sys_timer_delete | ||
977 | .long sys_clock_settime | ||
978 | .long sys_clock_gettime /* 265 */ | ||
979 | .long sys_clock_getres | ||
980 | .long sys_clock_nanosleep | ||
981 | .long sys_statfs64 | ||
982 | .long sys_fstatfs64 | ||
983 | .long sys_tgkill /* 270 */ | ||
984 | .long sys_utimes | ||
985 | .long sys_fadvise64_64 | ||
986 | .long sys_ni_syscall /* Reserved for sys_vserver */ | ||
987 | .long sys_ni_syscall /* Reserved for sys_mbind */ | ||
988 | .long sys_ni_syscall /* Reserved for sys_get_mempolicy */ | ||
989 | .long sys_ni_syscall /* Reserved for sys_set_mempolicy */ | ||
990 | .long sys_mq_open | ||
991 | .long sys_mq_unlink | ||
992 | .long sys_mq_timedsend | ||
993 | .long sys_mq_timedreceive /* 280 */ | ||
994 | .long sys_mq_notify | ||
995 | .long sys_mq_getsetattr | ||
996 | .long sys_ni_syscall /* reserved for kexec */ | ||
997 | .long sys_waitid | ||
998 | |||
999 | syscall_table_size=(.-sys_call_table) | ||
1000 | |||
diff --git a/arch/m32r/kernel/head.S b/arch/m32r/kernel/head.S new file mode 100644 index 000000000000..3e83173995cd --- /dev/null +++ b/arch/m32r/kernel/head.S | |||
@@ -0,0 +1,287 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/head.S | ||
3 | * | ||
4 | * M32R startup code. | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto | ||
8 | */ | ||
9 | |||
10 | /* $Id$ */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | __INIT | ||
14 | __INITDATA | ||
15 | |||
16 | .text | ||
17 | #include <linux/config.h> | ||
18 | #include <linux/linkage.h> | ||
19 | #include <asm/segment.h> | ||
20 | #include <asm/page.h> | ||
21 | #include <asm/pgtable.h> | ||
22 | #include <asm/assembler.h> | ||
23 | #include <asm/m32r.h> | ||
24 | #include <asm/mmu_context.h> | ||
25 | |||
26 | /* | ||
27 | * References to members of the boot_cpu_data structure. | ||
28 | */ | ||
29 | .text | ||
30 | .global start_kernel | ||
31 | .global __bss_start | ||
32 | .global _end | ||
33 | ENTRY(stext) | ||
34 | ENTRY(_stext) | ||
35 | ENTRY(startup_32) | ||
36 | /* Setup up the stack pointer */ | ||
37 | LDIMM (r0, spi_stack_top) | ||
38 | LDIMM (r1, spu_stack_top) | ||
39 | mvtc r0, spi | ||
40 | mvtc r1, spu | ||
41 | |||
42 | /* Initilalize PSW */ | ||
43 | ldi r0, #0x0000 /* use SPI, disable EI */ | ||
44 | mvtc r0, psw | ||
45 | |||
46 | /* Set up the stack pointer */ | ||
47 | LDIMM (r0, stack_start) | ||
48 | ld r0, @r0 | ||
49 | mvtc r0, spi | ||
50 | |||
51 | /* | ||
52 | * Clear BSS first so that there are no surprises... | ||
53 | */ | ||
54 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
55 | |||
56 | LDIMM (r2, __bss_start) | ||
57 | LDIMM (r3, _end) | ||
58 | sub r3, r2 ; BSS size in bytes | ||
59 | ; R4 = BSS size in longwords (rounded down) | ||
60 | mv r4, r3 || ldi r1, #0 | ||
61 | srli r4, #4 || addi r2, #-4 | ||
62 | beqz r4, .Lendloop1 | ||
63 | .Lloop1: | ||
64 | #ifndef CONFIG_CHIP_M32310 | ||
65 | ; Touch memory for the no-write-allocating cache. | ||
66 | ld r0, @(4,r2) | ||
67 | #endif | ||
68 | st r1, @+r2 || addi r4, #-1 | ||
69 | st r1, @+r2 | ||
70 | st r1, @+r2 | ||
71 | st r1, @+r2 || cmpeq r1, r4 ; R4 = 0? | ||
72 | bnc .Lloop1 | ||
73 | .Lendloop1: | ||
74 | and3 r4, r3, #15 | ||
75 | addi r2, #4 | ||
76 | beqz r4, .Lendloop2 | ||
77 | .Lloop2: | ||
78 | stb r1, @r2 || addi r4, #-1 | ||
79 | addi r2, #1 | ||
80 | bnez r4, .Lloop2 | ||
81 | .Lendloop2: | ||
82 | |||
83 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
84 | |||
85 | LDIMM (r2, __bss_start) | ||
86 | LDIMM (r3, _end) | ||
87 | sub r3, r2 ; BSS size in bytes | ||
88 | mv r4, r3 | ||
89 | srli r4, #2 ; R4 = BSS size in longwords (rounded down) | ||
90 | ldi r1, #0 ; clear R1 for longwords store | ||
91 | addi r2, #-4 ; account for pre-inc store | ||
92 | beqz r4, .Lendloop1 ; any more to go? | ||
93 | .Lloop1: | ||
94 | st r1, @+r2 ; yep, zero out another longword | ||
95 | addi r4, #-1 ; decrement count | ||
96 | bnez r4, .Lloop1 ; go do some more | ||
97 | .Lendloop1: | ||
98 | and3 r4, r3, #3 ; get no. of remaining BSS bytes to clear | ||
99 | addi r2, #4 ; account for pre-inc store | ||
100 | beqz r4, .Lendloop2 ; any more to go? | ||
101 | .Lloop2: | ||
102 | stb r1, @r2 ; yep, zero out another byte | ||
103 | addi r2, #1 ; bump address | ||
104 | addi r4, #-1 ; decrement count | ||
105 | bnez r4, .Lloop2 ; go do some more | ||
106 | .Lendloop2: | ||
107 | |||
108 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
109 | |||
110 | #if 0 /* M32R_FIXME */ | ||
111 | /* | ||
112 | * Copy data segment from ROM to RAM. | ||
113 | */ | ||
114 | .global ROM_D, TOP_DATA, END_DATA | ||
115 | |||
116 | LDIMM (r1, ROM_D) | ||
117 | LDIMM (r2, TOP_DATA) | ||
118 | LDIMM (r3, END_DATA) | ||
119 | addi r2, #-4 | ||
120 | addi r3, #-4 | ||
121 | loop1: | ||
122 | ld r0, @r1+ | ||
123 | st r0, @+r2 | ||
124 | cmp r2, r3 | ||
125 | bc loop1 | ||
126 | #endif /* 0 */ | ||
127 | |||
128 | /* Jump to kernel */ | ||
129 | LDIMM (r2, start_kernel) | ||
130 | jl r2 | ||
131 | .fillinsn | ||
132 | 1: | ||
133 | bra 1b ; main should never return here, but | ||
134 | ; just in case, we know what happens. | ||
135 | |||
136 | #ifdef CONFIG_SMP | ||
137 | /* | ||
138 | * AP startup routine | ||
139 | */ | ||
140 | .text | ||
141 | .global eit_vector | ||
142 | ENTRY(startup_AP) | ||
143 | ;; setup EVB | ||
144 | LDIMM (r4, eit_vector) | ||
145 | mvtc r4, cr5 | ||
146 | |||
147 | ;; enable MMU | ||
148 | LDIMM (r2, init_tlb) | ||
149 | jl r2 | ||
150 | seth r4, #high(MATM) | ||
151 | or3 r4, r4, #low(MATM) | ||
152 | ldi r5, #0x01 | ||
153 | st r5, @r4 ; Set MATM Reg(T bit ON) | ||
154 | ld r6, @r4 ; MATM Check | ||
155 | LDIMM (r5, 1f) | ||
156 | jmp r5 ; enable MMU | ||
157 | nop | ||
158 | .fillinsn | ||
159 | 1: | ||
160 | ;; ISN check | ||
161 | ld r6, @r4 ; MATM Check | ||
162 | seth r4, #high(M32R_ICU_ISTS_ADDR) | ||
163 | or3 r4, r4, #low(M32R_ICU_ISTS_ADDR) | ||
164 | ld r5, @r4 ; Read ISTSi reg. | ||
165 | mv r6, r5 | ||
166 | slli r5, #13 ; PIML check | ||
167 | srli r5, #13 ; | ||
168 | seth r4, #high(M32R_ICU_IMASK_ADDR) | ||
169 | or3 r4, r4, #low(M32R_ICU_IMASK_ADDR) | ||
170 | st r5, @r4 ; Write IMASKi reg. | ||
171 | slli r6, #4 ; ISN check | ||
172 | srli r6, #26 ; | ||
173 | seth r4, #high(M32R_IRQ_IPI5) | ||
174 | or3 r4, r4, #low(M32R_IRQ_IPI5) | ||
175 | bne r4, r6, 2f ; if (ISN != CPU_BOOT_IPI) goto sleep; | ||
176 | |||
177 | ;; check cpu_bootout_map and set cpu_bootin_map | ||
178 | LDIMM (r4, cpu_bootout_map) | ||
179 | ld r4, @r4 | ||
180 | seth r5, #high(M32R_CPUID_PORTL) | ||
181 | or3 r5, r5, #low(M32R_CPUID_PORTL) | ||
182 | ld r5, @r5 | ||
183 | ldi r6, #1 | ||
184 | sll r6, r5 | ||
185 | and r4, r6 | ||
186 | beqz r4, 2f | ||
187 | LDIMM (r4, cpu_bootin_map) | ||
188 | ld r5, @r4 | ||
189 | or r5, r6 | ||
190 | st r6, @r4 | ||
191 | |||
192 | ;; clear PSW | ||
193 | ldi r4, #0 | ||
194 | mvtc r4, psw | ||
195 | |||
196 | ;; setup SPI | ||
197 | LDIMM (r4, stack_start) | ||
198 | ld r4, @r4 | ||
199 | mvtc r4, spi | ||
200 | |||
201 | ;; setup BPC (start_secondary) | ||
202 | LDIMM (r4, start_secondary) | ||
203 | mvtc r4, bpc | ||
204 | |||
205 | rte ; goto startup_secondary | ||
206 | nop | ||
207 | nop | ||
208 | |||
209 | .fillinsn | ||
210 | 2: | ||
211 | ;; disable MMU | ||
212 | seth r4, #high(MATM) | ||
213 | or3 r4, r4, #low(MATM) | ||
214 | ldi r5, #0 | ||
215 | st r5, @r4 ; Set MATM Reg(T bit OFF) | ||
216 | ld r6, @r4 ; MATM Check | ||
217 | LDIMM (r4, 3f) | ||
218 | seth r5, #high(__PAGE_OFFSET) | ||
219 | or3 r5, r5, #low(__PAGE_OFFSET) | ||
220 | not r5, r5 | ||
221 | and r4, r5 | ||
222 | jmp r4 ; disable MMU | ||
223 | nop | ||
224 | .fillinsn | ||
225 | 3: | ||
226 | ;; SLEEP and wait IPI | ||
227 | LDIMM (r4, AP_loop) | ||
228 | seth r5, #high(__PAGE_OFFSET) | ||
229 | or3 r5, r5, #low(__PAGE_OFFSET) | ||
230 | not r5, r5 | ||
231 | and r4, r5 | ||
232 | jmp r4 | ||
233 | nop | ||
234 | nop | ||
235 | #endif /* CONFIG_SMP */ | ||
236 | |||
237 | ENTRY(stack_start) | ||
238 | .long init_thread_union+8192 | ||
239 | .long __KERNEL_DS | ||
240 | |||
241 | /* | ||
242 | * This is initialized to create a identity-mapping at 0-4M (for bootup | ||
243 | * purposes) and another mapping of the 0-4M area at virtual address | ||
244 | * PAGE_OFFSET. | ||
245 | */ | ||
246 | .text | ||
247 | |||
248 | #define MOUNT_ROOT_RDONLY 1 | ||
249 | #define RAMDISK_FLAGS 0 ; 1024KB | ||
250 | #define ORIG_ROOT_DEV 0x0100 ; /dev/ram0 (major:01, minor:00) | ||
251 | #define LOADER_TYPE 1 ; (??? - non-zero value seems | ||
252 | ; to be needed to boot from initrd) | ||
253 | |||
254 | #define COMMAND_LINE "" | ||
255 | |||
256 | .section .empty_zero_page, "aw" | ||
257 | ENTRY(empty_zero_page) | ||
258 | .long MOUNT_ROOT_RDONLY /* offset: +0x00 */ | ||
259 | .long RAMDISK_FLAGS | ||
260 | .long ORIG_ROOT_DEV | ||
261 | .long LOADER_TYPE | ||
262 | .long 0 /* INITRD_START */ /* +0x10 */ | ||
263 | .long 0 /* INITRD_SIZE */ | ||
264 | .long 0 /* CPU_CLOCK */ | ||
265 | .long 0 /* BUS_CLOCK */ | ||
266 | .long 0 /* TIMER_DIVIDE */ /* +0x20 */ | ||
267 | .balign 256,0 | ||
268 | .asciz COMMAND_LINE | ||
269 | .byte 0 | ||
270 | .balign 4096,0,4096 | ||
271 | |||
272 | /*------------------------------------------------------------------------ | ||
273 | * Stack area | ||
274 | */ | ||
275 | .section .spi | ||
276 | ALIGN | ||
277 | .global spi_stack_top | ||
278 | .zero 1024 | ||
279 | spi_stack_top: | ||
280 | |||
281 | .section .spu | ||
282 | ALIGN | ||
283 | .global spu_stack_top | ||
284 | .zero 1024 | ||
285 | spu_stack_top: | ||
286 | |||
287 | .end | ||
diff --git a/arch/m32r/kernel/init_task.c b/arch/m32r/kernel/init_task.c new file mode 100644 index 000000000000..9e508fd9d970 --- /dev/null +++ b/arch/m32r/kernel/init_task.c | |||
@@ -0,0 +1,41 @@ | |||
1 | /* orig : i386 init_task.c */ | ||
2 | |||
3 | #include <linux/mm.h> | ||
4 | #include <linux/module.h> | ||
5 | #include <linux/sched.h> | ||
6 | #include <linux/init.h> | ||
7 | #include <linux/init_task.h> | ||
8 | #include <linux/fs.h> | ||
9 | #include <linux/mqueue.h> | ||
10 | |||
11 | #include <asm/uaccess.h> | ||
12 | #include <asm/pgtable.h> | ||
13 | |||
14 | static struct fs_struct init_fs = INIT_FS; | ||
15 | static struct files_struct init_files = INIT_FILES; | ||
16 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | ||
17 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | ||
18 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
19 | |||
20 | EXPORT_SYMBOL(init_mm); | ||
21 | |||
22 | /* | ||
23 | * Initial thread structure. | ||
24 | * | ||
25 | * We need to make sure that this is 8192-byte aligned due to the | ||
26 | * way process stacks are handled. This is done by having a special | ||
27 | * "init_task" linker map entry.. | ||
28 | */ | ||
29 | union thread_union init_thread_union | ||
30 | __attribute__((__section__(".data.init_task"))) = | ||
31 | { INIT_THREAD_INFO(init_task) }; | ||
32 | |||
33 | /* | ||
34 | * Initial task structure. | ||
35 | * | ||
36 | * All other task structs will be allocated on slabs in fork.c | ||
37 | */ | ||
38 | struct task_struct init_task = INIT_TASK(init_task); | ||
39 | |||
40 | EXPORT_SYMBOL(init_task); | ||
41 | |||
diff --git a/arch/m32r/kernel/io_m32700ut.c b/arch/m32r/kernel/io_m32700ut.c new file mode 100644 index 000000000000..371ba904e968 --- /dev/null +++ b/arch/m32r/kernel/io_m32700ut.c | |||
@@ -0,0 +1,472 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/io_m32700ut.c | ||
3 | * | ||
4 | * Typical I/O routines for M32700UT board. | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Takeo Takahashi | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General | ||
10 | * Public License. See the file "COPYING" in the main directory of this | ||
11 | * archive for more details. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <asm/m32r.h> | ||
16 | #include <asm/page.h> | ||
17 | #include <asm/io.h> | ||
18 | #include <asm/byteorder.h> | ||
19 | |||
20 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
21 | #include <linux/types.h> | ||
22 | |||
23 | #define M32R_PCC_IOMAP_SIZE 0x1000 | ||
24 | |||
25 | #define M32R_PCC_IOSTART0 0x1000 | ||
26 | #define M32R_PCC_IOEND0 (M32R_PCC_IOSTART0 + M32R_PCC_IOMAP_SIZE - 1) | ||
27 | |||
28 | extern void pcc_ioread_byte(int, unsigned long, void *, size_t, size_t, int); | ||
29 | extern void pcc_ioread_word(int, unsigned long, void *, size_t, size_t, int); | ||
30 | extern void pcc_iowrite_byte(int, unsigned long, void *, size_t, size_t, int); | ||
31 | extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int); | ||
32 | #endif /* CONFIG_PCMCIA && CONFIG_M32R_CFC */ | ||
33 | |||
34 | #define PORT2ADDR(port) _port2addr(port) | ||
35 | #define PORT2ADDR_USB(port) _port2addr_usb(port) | ||
36 | |||
37 | static inline void *_port2addr(unsigned long port) | ||
38 | { | ||
39 | return (void *)(port + NONCACHE_OFFSET); | ||
40 | } | ||
41 | |||
42 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
43 | static inline void *__port2addr_ata(unsigned long port) | ||
44 | { | ||
45 | static int dummy_reg; | ||
46 | |||
47 | switch (port) { | ||
48 | case 0x1f0: return (void *)0xac002000; | ||
49 | case 0x1f1: return (void *)0xac012800; | ||
50 | case 0x1f2: return (void *)0xac012002; | ||
51 | case 0x1f3: return (void *)0xac012802; | ||
52 | case 0x1f4: return (void *)0xac012004; | ||
53 | case 0x1f5: return (void *)0xac012804; | ||
54 | case 0x1f6: return (void *)0xac012006; | ||
55 | case 0x1f7: return (void *)0xac012806; | ||
56 | case 0x3f6: return (void *)0xac01200e; | ||
57 | default: return (void *)&dummy_reg; | ||
58 | } | ||
59 | } | ||
60 | #endif | ||
61 | |||
62 | /* | ||
63 | * M32700UT-LAN is located in the extended bus space | ||
64 | * from 0x10000000 to 0x13ffffff on physical address. | ||
65 | * The base address of LAN controller(LAN91C111) is 0x300. | ||
66 | */ | ||
67 | #define LAN_IOSTART 0x300 | ||
68 | #define LAN_IOEND 0x320 | ||
69 | static inline void *_port2addr_ne(unsigned long port) | ||
70 | { | ||
71 | return (void *)(port + NONCACHE_OFFSET + 0x10000000); | ||
72 | } | ||
73 | static inline void *_port2addr_usb(unsigned long port) | ||
74 | { | ||
75 | return (void *)((port & 0x0f) + NONCACHE_OFFSET + 0x10303000); | ||
76 | } | ||
77 | |||
78 | static inline void delay(void) | ||
79 | { | ||
80 | __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory"); | ||
81 | } | ||
82 | |||
83 | /* | ||
84 | * NIC I/O function | ||
85 | */ | ||
86 | |||
87 | #define PORT2ADDR_NE(port) _port2addr_ne(port) | ||
88 | |||
89 | static inline unsigned char _ne_inb(void *portp) | ||
90 | { | ||
91 | return *(volatile unsigned char *)portp; | ||
92 | } | ||
93 | |||
94 | static inline unsigned short _ne_inw(void *portp) | ||
95 | { | ||
96 | return (unsigned short)le16_to_cpu(*(volatile unsigned short *)portp); | ||
97 | } | ||
98 | |||
99 | static inline void _ne_insb(void *portp, void *addr, unsigned long count) | ||
100 | { | ||
101 | unsigned char *buf = (unsigned char *)addr; | ||
102 | |||
103 | while (count--) | ||
104 | *buf++ = _ne_inb(portp); | ||
105 | } | ||
106 | |||
107 | static inline void _ne_outb(unsigned char b, void *portp) | ||
108 | { | ||
109 | *(volatile unsigned char *)portp = b; | ||
110 | } | ||
111 | |||
112 | static inline void _ne_outw(unsigned short w, void *portp) | ||
113 | { | ||
114 | *(volatile unsigned short *)portp = cpu_to_le16(w); | ||
115 | } | ||
116 | |||
117 | unsigned char _inb(unsigned long port) | ||
118 | { | ||
119 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
120 | return _ne_inb(PORT2ADDR_NE(port)); | ||
121 | |||
122 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
123 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
124 | return *(volatile unsigned char *)__port2addr_ata(port); | ||
125 | } | ||
126 | #endif | ||
127 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
128 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
129 | unsigned char b; | ||
130 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
131 | return b; | ||
132 | } else | ||
133 | #endif | ||
134 | |||
135 | return *(volatile unsigned char *)PORT2ADDR(port); | ||
136 | } | ||
137 | |||
138 | unsigned short _inw(unsigned long port) | ||
139 | { | ||
140 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
141 | return _ne_inw(PORT2ADDR_NE(port)); | ||
142 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
143 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
144 | return *(volatile unsigned short *)__port2addr_ata(port); | ||
145 | } | ||
146 | #endif | ||
147 | #if defined(CONFIG_USB) | ||
148 | else if(port >= 0x340 && port < 0x3a0) | ||
149 | return *(volatile unsigned short *)PORT2ADDR_USB(port); | ||
150 | #endif | ||
151 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
152 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
153 | unsigned short w; | ||
154 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
155 | return w; | ||
156 | } else | ||
157 | #endif | ||
158 | return *(volatile unsigned short *)PORT2ADDR(port); | ||
159 | } | ||
160 | |||
161 | unsigned long _inl(unsigned long port) | ||
162 | { | ||
163 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
164 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
165 | unsigned long l; | ||
166 | pcc_ioread_word(0, port, &l, sizeof(l), 1, 0); | ||
167 | return l; | ||
168 | } else | ||
169 | #endif | ||
170 | return *(volatile unsigned long *)PORT2ADDR(port); | ||
171 | } | ||
172 | |||
173 | unsigned char _inb_p(unsigned long port) | ||
174 | { | ||
175 | unsigned char v; | ||
176 | |||
177 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
178 | v = _ne_inb(PORT2ADDR_NE(port)); | ||
179 | else | ||
180 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
181 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
182 | return *(volatile unsigned char *)__port2addr_ata(port); | ||
183 | } else | ||
184 | #endif | ||
185 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
186 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
187 | unsigned char b; | ||
188 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
189 | return b; | ||
190 | } else | ||
191 | #endif | ||
192 | v = *(volatile unsigned char *)PORT2ADDR(port); | ||
193 | |||
194 | delay(); | ||
195 | return (v); | ||
196 | } | ||
197 | |||
198 | unsigned short _inw_p(unsigned long port) | ||
199 | { | ||
200 | unsigned short v; | ||
201 | |||
202 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
203 | v = _ne_inw(PORT2ADDR_NE(port)); | ||
204 | else | ||
205 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
206 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
207 | return *(volatile unsigned short *)__port2addr_ata(port); | ||
208 | } else | ||
209 | #endif | ||
210 | #if defined(CONFIG_USB) | ||
211 | if(port >= 0x340 && port < 0x3a0) | ||
212 | return *(volatile unsigned short *)PORT2ADDR_USB(port); | ||
213 | else | ||
214 | #endif | ||
215 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
216 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
217 | unsigned short w; | ||
218 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
219 | return w; | ||
220 | } else | ||
221 | #endif | ||
222 | v = *(volatile unsigned short *)PORT2ADDR(port); | ||
223 | |||
224 | delay(); | ||
225 | return (v); | ||
226 | } | ||
227 | |||
228 | unsigned long _inl_p(unsigned long port) | ||
229 | { | ||
230 | unsigned long v; | ||
231 | |||
232 | v = *(volatile unsigned long *)PORT2ADDR(port); | ||
233 | delay(); | ||
234 | return (v); | ||
235 | } | ||
236 | |||
237 | void _outb(unsigned char b, unsigned long port) | ||
238 | { | ||
239 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
240 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
241 | else | ||
242 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
243 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
244 | *(volatile unsigned char *)__port2addr_ata(port) = b; | ||
245 | } else | ||
246 | #endif | ||
247 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
248 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
249 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
250 | } else | ||
251 | #endif | ||
252 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
253 | } | ||
254 | |||
255 | void _outw(unsigned short w, unsigned long port) | ||
256 | { | ||
257 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
258 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
259 | else | ||
260 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
261 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
262 | *(volatile unsigned short *)__port2addr_ata(port) = w; | ||
263 | } else | ||
264 | #endif | ||
265 | #if defined(CONFIG_USB) | ||
266 | if(port >= 0x340 && port < 0x3a0) | ||
267 | *(volatile unsigned short *)PORT2ADDR_USB(port) = w; | ||
268 | else | ||
269 | #endif | ||
270 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
271 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
272 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
273 | } else | ||
274 | #endif | ||
275 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
276 | } | ||
277 | |||
278 | void _outl(unsigned long l, unsigned long port) | ||
279 | { | ||
280 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
281 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
282 | pcc_iowrite_word(0, port, &l, sizeof(l), 1, 0); | ||
283 | } else | ||
284 | #endif | ||
285 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
286 | } | ||
287 | |||
288 | void _outb_p(unsigned char b, unsigned long port) | ||
289 | { | ||
290 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
291 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
292 | else | ||
293 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
294 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
295 | *(volatile unsigned char *)__port2addr_ata(port) = b; | ||
296 | } else | ||
297 | #endif | ||
298 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
299 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
300 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
301 | } else | ||
302 | #endif | ||
303 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
304 | |||
305 | delay(); | ||
306 | } | ||
307 | |||
308 | void _outw_p(unsigned short w, unsigned long port) | ||
309 | { | ||
310 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
311 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
312 | else | ||
313 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
314 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
315 | *(volatile unsigned short *)__port2addr_ata(port) = w; | ||
316 | } else | ||
317 | #endif | ||
318 | #if defined(CONFIG_USB) | ||
319 | if(port >= 0x340 && port < 0x3a0) | ||
320 | *(volatile unsigned short *)PORT2ADDR_USB(port) = w; | ||
321 | else | ||
322 | #endif | ||
323 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
324 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
325 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
326 | } else | ||
327 | #endif | ||
328 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
329 | |||
330 | delay(); | ||
331 | } | ||
332 | |||
333 | void _outl_p(unsigned long l, unsigned long port) | ||
334 | { | ||
335 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
336 | delay(); | ||
337 | } | ||
338 | |||
339 | void _insb(unsigned int port, void *addr, unsigned long count) | ||
340 | { | ||
341 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
342 | _ne_insb(PORT2ADDR_NE(port), addr, count); | ||
343 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
344 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
345 | unsigned char *buf = addr; | ||
346 | unsigned char *portp = __port2addr_ata(port); | ||
347 | while (count--) | ||
348 | *buf++ = *(volatile unsigned char *)portp; | ||
349 | } | ||
350 | #endif | ||
351 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
352 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
353 | pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char), | ||
354 | count, 1); | ||
355 | } | ||
356 | #endif | ||
357 | else { | ||
358 | unsigned char *buf = addr; | ||
359 | unsigned char *portp = PORT2ADDR(port); | ||
360 | while (count--) | ||
361 | *buf++ = *(volatile unsigned char *)portp; | ||
362 | } | ||
363 | } | ||
364 | |||
365 | void _insw(unsigned int port, void *addr, unsigned long count) | ||
366 | { | ||
367 | unsigned short *buf = addr; | ||
368 | unsigned short *portp; | ||
369 | |||
370 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
371 | /* | ||
372 | * This portion is only used by smc91111.c to read data | ||
373 | * from the DATA_REG. Do not swap the data. | ||
374 | */ | ||
375 | portp = PORT2ADDR_NE(port); | ||
376 | while (count--) | ||
377 | *buf++ = *(volatile unsigned short *)portp; | ||
378 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
379 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
380 | pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short), | ||
381 | count, 1); | ||
382 | #endif | ||
383 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
384 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
385 | portp = __port2addr_ata(port); | ||
386 | while (count--) | ||
387 | *buf++ = *(volatile unsigned short *)portp; | ||
388 | #endif | ||
389 | } else { | ||
390 | portp = PORT2ADDR(port); | ||
391 | while (count--) | ||
392 | *buf++ = *(volatile unsigned short *)portp; | ||
393 | } | ||
394 | } | ||
395 | |||
396 | void _insl(unsigned int port, void *addr, unsigned long count) | ||
397 | { | ||
398 | unsigned long *buf = addr; | ||
399 | unsigned long *portp; | ||
400 | |||
401 | portp = PORT2ADDR(port); | ||
402 | while (count--) | ||
403 | *buf++ = *(volatile unsigned long *)portp; | ||
404 | } | ||
405 | |||
406 | void _outsb(unsigned int port, const void *addr, unsigned long count) | ||
407 | { | ||
408 | const unsigned char *buf = addr; | ||
409 | unsigned char *portp; | ||
410 | |||
411 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
412 | portp = PORT2ADDR_NE(port); | ||
413 | while (count--) | ||
414 | _ne_outb(*buf++, portp); | ||
415 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
416 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
417 | portp = __port2addr_ata(port); | ||
418 | while (count--) | ||
419 | *(volatile unsigned char *)portp = *buf++; | ||
420 | #endif | ||
421 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
422 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
423 | pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char), | ||
424 | count, 1); | ||
425 | #endif | ||
426 | } else { | ||
427 | portp = PORT2ADDR(port); | ||
428 | while (count--) | ||
429 | *(volatile unsigned char *)portp = *buf++; | ||
430 | } | ||
431 | } | ||
432 | |||
433 | void _outsw(unsigned int port, const void *addr, unsigned long count) | ||
434 | { | ||
435 | const unsigned short *buf = addr; | ||
436 | unsigned short *portp; | ||
437 | |||
438 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
439 | /* | ||
440 | * This portion is only used by smc91111.c to write data | ||
441 | * into the DATA_REG. Do not swap the data. | ||
442 | */ | ||
443 | portp = PORT2ADDR_NE(port); | ||
444 | while (count--) | ||
445 | *(volatile unsigned short *)portp = *buf++; | ||
446 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
447 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
448 | portp = __port2addr_ata(port); | ||
449 | while (count--) | ||
450 | *(volatile unsigned short *)portp = *buf++; | ||
451 | #endif | ||
452 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
453 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
454 | pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short), | ||
455 | count, 1); | ||
456 | #endif | ||
457 | } else { | ||
458 | portp = PORT2ADDR(port); | ||
459 | while (count--) | ||
460 | *(volatile unsigned short *)portp = *buf++; | ||
461 | } | ||
462 | } | ||
463 | |||
464 | void _outsl(unsigned int port, const void *addr, unsigned long count) | ||
465 | { | ||
466 | const unsigned long *buf = addr; | ||
467 | unsigned char *portp; | ||
468 | |||
469 | portp = PORT2ADDR(port); | ||
470 | while (count--) | ||
471 | *(volatile unsigned long *)portp = *buf++; | ||
472 | } | ||
diff --git a/arch/m32r/kernel/io_mappi.c b/arch/m32r/kernel/io_mappi.c new file mode 100644 index 000000000000..85688ffb52f9 --- /dev/null +++ b/arch/m32r/kernel/io_mappi.c | |||
@@ -0,0 +1,384 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/io_mappi.c | ||
3 | * | ||
4 | * Typical I/O routines for Mappi board. | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <asm/m32r.h> | ||
12 | #include <asm/page.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/byteorder.h> | ||
15 | |||
16 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
17 | #include <linux/types.h> | ||
18 | |||
19 | #define M32R_PCC_IOMAP_SIZE 0x1000 | ||
20 | |||
21 | #define M32R_PCC_IOSTART0 0x1000 | ||
22 | #define M32R_PCC_IOEND0 (M32R_PCC_IOSTART0 + M32R_PCC_IOMAP_SIZE - 1) | ||
23 | #define M32R_PCC_IOSTART1 0x2000 | ||
24 | #define M32R_PCC_IOEND1 (M32R_PCC_IOSTART1 + M32R_PCC_IOMAP_SIZE - 1) | ||
25 | |||
26 | extern void pcc_ioread(int, unsigned long, void *, size_t, size_t, int); | ||
27 | extern void pcc_iowrite(int, unsigned long, void *, size_t, size_t, int); | ||
28 | #endif /* CONFIG_PCMCIA && CONFIG_M32R_PCC */ | ||
29 | |||
30 | #define PORT2ADDR(port) _port2addr(port) | ||
31 | |||
32 | static inline void *_port2addr(unsigned long port) | ||
33 | { | ||
34 | return (void *)(port + NONCACHE_OFFSET); | ||
35 | } | ||
36 | |||
37 | static inline void *_port2addr_ne(unsigned long port) | ||
38 | { | ||
39 | return (void *)((port<<1) + NONCACHE_OFFSET + 0x0C000000); | ||
40 | } | ||
41 | |||
42 | static inline void delay(void) | ||
43 | { | ||
44 | __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory"); | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | * NIC I/O function | ||
49 | */ | ||
50 | |||
51 | #define PORT2ADDR_NE(port) _port2addr_ne(port) | ||
52 | |||
53 | static inline unsigned char _ne_inb(void *portp) | ||
54 | { | ||
55 | return (unsigned char) *(volatile unsigned short *)portp; | ||
56 | } | ||
57 | |||
58 | static inline unsigned short _ne_inw(void *portp) | ||
59 | { | ||
60 | unsigned short tmp; | ||
61 | |||
62 | tmp = *(volatile unsigned short *)portp; | ||
63 | return le16_to_cpu(tmp); | ||
64 | } | ||
65 | |||
66 | static inline void _ne_outb(unsigned char b, void *portp) | ||
67 | { | ||
68 | *(volatile unsigned short *)portp = (unsigned short)b; | ||
69 | } | ||
70 | |||
71 | static inline void _ne_outw(unsigned short w, void *portp) | ||
72 | { | ||
73 | *(volatile unsigned short *)portp = cpu_to_le16(w); | ||
74 | } | ||
75 | |||
76 | unsigned char _inb(unsigned long port) | ||
77 | { | ||
78 | if (port >= 0x300 && port < 0x320) | ||
79 | return _ne_inb(PORT2ADDR_NE(port)); | ||
80 | else | ||
81 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
82 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
83 | unsigned char b; | ||
84 | pcc_ioread(0, port, &b, sizeof(b), 1, 0); | ||
85 | return b; | ||
86 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
87 | unsigned char b; | ||
88 | pcc_ioread(1, port, &b, sizeof(b), 1, 0); | ||
89 | return b; | ||
90 | } else | ||
91 | #endif | ||
92 | |||
93 | return *(volatile unsigned char *)PORT2ADDR(port); | ||
94 | } | ||
95 | |||
96 | unsigned short _inw(unsigned long port) | ||
97 | { | ||
98 | if (port >= 0x300 && port < 0x320) | ||
99 | return _ne_inw(PORT2ADDR_NE(port)); | ||
100 | else | ||
101 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
102 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
103 | unsigned short w; | ||
104 | pcc_ioread(0, port, &w, sizeof(w), 1, 0); | ||
105 | return w; | ||
106 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
107 | unsigned short w; | ||
108 | pcc_ioread(1, port, &w, sizeof(w), 1, 0); | ||
109 | return w; | ||
110 | } else | ||
111 | #endif | ||
112 | return *(volatile unsigned short *)PORT2ADDR(port); | ||
113 | } | ||
114 | |||
115 | unsigned long _inl(unsigned long port) | ||
116 | { | ||
117 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
118 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
119 | unsigned long l; | ||
120 | pcc_ioread(0, port, &l, sizeof(l), 1, 0); | ||
121 | return l; | ||
122 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
123 | unsigned short l; | ||
124 | pcc_ioread(1, port, &l, sizeof(l), 1, 0); | ||
125 | return l; | ||
126 | } else | ||
127 | #endif | ||
128 | return *(volatile unsigned long *)PORT2ADDR(port); | ||
129 | } | ||
130 | |||
131 | unsigned char _inb_p(unsigned long port) | ||
132 | { | ||
133 | unsigned char v; | ||
134 | |||
135 | if (port >= 0x300 && port < 0x320) | ||
136 | v = _ne_inb(PORT2ADDR_NE(port)); | ||
137 | else | ||
138 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
139 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
140 | unsigned char b; | ||
141 | pcc_ioread(0, port, &b, sizeof(b), 1, 0); | ||
142 | return b; | ||
143 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
144 | unsigned char b; | ||
145 | pcc_ioread(1, port, &b, sizeof(b), 1, 0); | ||
146 | return b; | ||
147 | } else | ||
148 | #endif | ||
149 | v = *(volatile unsigned char *)PORT2ADDR(port); | ||
150 | |||
151 | delay(); | ||
152 | return (v); | ||
153 | } | ||
154 | |||
155 | unsigned short _inw_p(unsigned long port) | ||
156 | { | ||
157 | unsigned short v; | ||
158 | |||
159 | if (port >= 0x300 && port < 0x320) | ||
160 | v = _ne_inw(PORT2ADDR_NE(port)); | ||
161 | else | ||
162 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
163 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
164 | unsigned short w; | ||
165 | pcc_ioread(0, port, &w, sizeof(w), 1, 0); | ||
166 | return w; | ||
167 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
168 | unsigned short w; | ||
169 | pcc_ioread(1, port, &w, sizeof(w), 1, 0); | ||
170 | return w; | ||
171 | } else | ||
172 | #endif | ||
173 | v = *(volatile unsigned short *)PORT2ADDR(port); | ||
174 | |||
175 | delay(); | ||
176 | return (v); | ||
177 | } | ||
178 | |||
179 | unsigned long _inl_p(unsigned long port) | ||
180 | { | ||
181 | unsigned long v; | ||
182 | |||
183 | v = *(volatile unsigned long *)PORT2ADDR(port); | ||
184 | delay(); | ||
185 | return (v); | ||
186 | } | ||
187 | |||
188 | void _outb(unsigned char b, unsigned long port) | ||
189 | { | ||
190 | if (port >= 0x300 && port < 0x320) | ||
191 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
192 | else | ||
193 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
194 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
195 | pcc_iowrite(0, port, &b, sizeof(b), 1, 0); | ||
196 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
197 | pcc_iowrite(1, port, &b, sizeof(b), 1, 0); | ||
198 | } else | ||
199 | #endif | ||
200 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
201 | } | ||
202 | |||
203 | void _outw(unsigned short w, unsigned long port) | ||
204 | { | ||
205 | if (port >= 0x300 && port < 0x320) | ||
206 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
207 | else | ||
208 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
209 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
210 | pcc_iowrite(0, port, &w, sizeof(w), 1, 0); | ||
211 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
212 | pcc_iowrite(1, port, &w, sizeof(w), 1, 0); | ||
213 | } else | ||
214 | #endif | ||
215 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
216 | } | ||
217 | |||
218 | void _outl(unsigned long l, unsigned long port) | ||
219 | { | ||
220 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
221 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
222 | pcc_iowrite(0, port, &l, sizeof(l), 1, 0); | ||
223 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
224 | pcc_iowrite(1, port, &l, sizeof(l), 1, 0); | ||
225 | } else | ||
226 | #endif | ||
227 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
228 | } | ||
229 | |||
230 | void _outb_p(unsigned char b, unsigned long port) | ||
231 | { | ||
232 | if (port >= 0x300 && port < 0x320) | ||
233 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
234 | else | ||
235 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
236 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
237 | pcc_iowrite(0, port, &b, sizeof(b), 1, 0); | ||
238 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
239 | pcc_iowrite(1, port, &b, sizeof(b), 1, 0); | ||
240 | } else | ||
241 | #endif | ||
242 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
243 | |||
244 | delay(); | ||
245 | } | ||
246 | |||
247 | void _outw_p(unsigned short w, unsigned long port) | ||
248 | { | ||
249 | if (port >= 0x300 && port < 0x320) | ||
250 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
251 | else | ||
252 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
253 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
254 | pcc_iowrite(0, port, &w, sizeof(w), 1, 0); | ||
255 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
256 | pcc_iowrite(1, port, &w, sizeof(w), 1, 0); | ||
257 | } else | ||
258 | #endif | ||
259 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
260 | |||
261 | delay(); | ||
262 | } | ||
263 | |||
264 | void _outl_p(unsigned long l, unsigned long port) | ||
265 | { | ||
266 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
267 | delay(); | ||
268 | } | ||
269 | |||
270 | void _insb(unsigned int port, void *addr, unsigned long count) | ||
271 | { | ||
272 | unsigned short *buf = addr; | ||
273 | unsigned short *portp; | ||
274 | |||
275 | if (port >= 0x300 && port < 0x320){ | ||
276 | portp = PORT2ADDR_NE(port); | ||
277 | while (count--) | ||
278 | *buf++ = *(volatile unsigned char *)portp; | ||
279 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
280 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
281 | pcc_ioread(0, port, (void *)addr, sizeof(unsigned char), | ||
282 | count, 1); | ||
283 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
284 | pcc_ioread(1, port, (void *)addr, sizeof(unsigned char), | ||
285 | count, 1); | ||
286 | #endif | ||
287 | } else { | ||
288 | portp = PORT2ADDR(port); | ||
289 | while (count--) | ||
290 | *buf++ = *(volatile unsigned char *)portp; | ||
291 | } | ||
292 | } | ||
293 | |||
294 | void _insw(unsigned int port, void *addr, unsigned long count) | ||
295 | { | ||
296 | unsigned short *buf = addr; | ||
297 | unsigned short *portp; | ||
298 | |||
299 | if (port >= 0x300 && port < 0x320) { | ||
300 | portp = PORT2ADDR_NE(port); | ||
301 | while (count--) | ||
302 | *buf++ = _ne_inw(portp); | ||
303 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
304 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
305 | pcc_ioread(0, port, (void *)addr, sizeof(unsigned short), | ||
306 | count, 1); | ||
307 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
308 | pcc_ioread(1, port, (void *)addr, sizeof(unsigned short), | ||
309 | count, 1); | ||
310 | #endif | ||
311 | } else { | ||
312 | portp = PORT2ADDR(port); | ||
313 | while (count--) | ||
314 | *buf++ = *(volatile unsigned short *)portp; | ||
315 | } | ||
316 | } | ||
317 | |||
318 | void _insl(unsigned int port, void *addr, unsigned long count) | ||
319 | { | ||
320 | unsigned long *buf = addr; | ||
321 | unsigned long *portp; | ||
322 | |||
323 | portp = PORT2ADDR(port); | ||
324 | while (count--) | ||
325 | *buf++ = *(volatile unsigned long *)portp; | ||
326 | } | ||
327 | |||
328 | void _outsb(unsigned int port, const void *addr, unsigned long count) | ||
329 | { | ||
330 | const unsigned char *buf = addr; | ||
331 | unsigned char *portp; | ||
332 | |||
333 | if (port >= 0x300 && port < 0x320) { | ||
334 | portp = PORT2ADDR_NE(port); | ||
335 | while (count--) | ||
336 | _ne_outb(*buf++, portp); | ||
337 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
338 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
339 | pcc_iowrite(0, port, (void *)addr, sizeof(unsigned char), | ||
340 | count, 1); | ||
341 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
342 | pcc_iowrite(1, port, (void *)addr, sizeof(unsigned char), | ||
343 | count, 1); | ||
344 | #endif | ||
345 | } else { | ||
346 | portp = PORT2ADDR(port); | ||
347 | while (count--) | ||
348 | *(volatile unsigned char *)portp = *buf++; | ||
349 | } | ||
350 | } | ||
351 | |||
352 | void _outsw(unsigned int port, const void *addr, unsigned long count) | ||
353 | { | ||
354 | const unsigned short *buf = addr; | ||
355 | unsigned short *portp; | ||
356 | |||
357 | if (port >= 0x300 && port < 0x320) { | ||
358 | portp = PORT2ADDR_NE(port); | ||
359 | while (count--) | ||
360 | _ne_outw(*buf++, portp); | ||
361 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_PCC) | ||
362 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
363 | pcc_iowrite(0, port, (void *)addr, sizeof(unsigned short), | ||
364 | count, 1); | ||
365 | } else if (port >= M32R_PCC_IOSTART1 && port <= M32R_PCC_IOEND1) { | ||
366 | pcc_iowrite(1, port, (void *)addr, sizeof(unsigned short), | ||
367 | count, 1); | ||
368 | #endif | ||
369 | } else { | ||
370 | portp = PORT2ADDR(port); | ||
371 | while (count--) | ||
372 | *(volatile unsigned short *)portp = *buf++; | ||
373 | } | ||
374 | } | ||
375 | |||
376 | void _outsl(unsigned int port, const void *addr, unsigned long count) | ||
377 | { | ||
378 | const unsigned long *buf = addr; | ||
379 | unsigned char *portp; | ||
380 | |||
381 | portp = PORT2ADDR(port); | ||
382 | while (count--) | ||
383 | *(volatile unsigned long *)portp = *buf++; | ||
384 | } | ||
diff --git a/arch/m32r/kernel/io_mappi2.c b/arch/m32r/kernel/io_mappi2.c new file mode 100644 index 000000000000..4182cd4f97c8 --- /dev/null +++ b/arch/m32r/kernel/io_mappi2.c | |||
@@ -0,0 +1,461 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/io_mappi2.c | ||
3 | * | ||
4 | * Typical I/O routines for Mappi2 board. | ||
5 | * | ||
6 | * Copyright (c) 2001-2003 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Mamoru Sakugawa | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <asm/m32r.h> | ||
12 | #include <asm/page.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/byteorder.h> | ||
15 | |||
16 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
17 | #include <linux/types.h> | ||
18 | |||
19 | #define M32R_PCC_IOMAP_SIZE 0x1000 | ||
20 | |||
21 | #define M32R_PCC_IOSTART0 0x1000 | ||
22 | #define M32R_PCC_IOEND0 (M32R_PCC_IOSTART0 + M32R_PCC_IOMAP_SIZE - 1) | ||
23 | |||
24 | extern void pcc_ioread_byte(int, unsigned long, void *, size_t, size_t, int); | ||
25 | extern void pcc_ioread_word(int, unsigned long, void *, size_t, size_t, int); | ||
26 | extern void pcc_iowrite_byte(int, unsigned long, void *, size_t, size_t, int); | ||
27 | extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int); | ||
28 | #endif /* CONFIG_PCMCIA && CONFIG_MAPPI2_CFC */ | ||
29 | |||
30 | #define PORT2ADDR(port) _port2addr(port) | ||
31 | #define PORT2ADDR_NE(port) _port2addr_ne(port) | ||
32 | #define PORT2ADDR_USB(port) _port2addr_usb(port) | ||
33 | |||
34 | static inline void *_port2addr(unsigned long port) | ||
35 | { | ||
36 | return (void *)(port + NONCACHE_OFFSET); | ||
37 | } | ||
38 | |||
39 | #define LAN_IOSTART 0x300 | ||
40 | #define LAN_IOEND 0x320 | ||
41 | |||
42 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
43 | static inline void *__port2addr_ata(unsigned long port) | ||
44 | { | ||
45 | static int dummy_reg; | ||
46 | |||
47 | switch (port) { | ||
48 | case 0x1f0: return (void *)0xac002000; | ||
49 | case 0x1f1: return (void *)0xac012800; | ||
50 | case 0x1f2: return (void *)0xac012002; | ||
51 | case 0x1f3: return (void *)0xac012802; | ||
52 | case 0x1f4: return (void *)0xac012004; | ||
53 | case 0x1f5: return (void *)0xac012804; | ||
54 | case 0x1f6: return (void *)0xac012006; | ||
55 | case 0x1f7: return (void *)0xac012806; | ||
56 | case 0x3f6: return (void *)0xac01200e; | ||
57 | default: return (void *)&dummy_reg; | ||
58 | } | ||
59 | } | ||
60 | #endif | ||
61 | |||
62 | #ifdef CONFIG_CHIP_OPSP | ||
63 | static inline void *_port2addr_ne(unsigned long port) | ||
64 | { | ||
65 | return (void *)(port + NONCACHE_OFFSET + 0x10000000); | ||
66 | } | ||
67 | #else | ||
68 | static inline void *_port2addr_ne(unsigned long port) | ||
69 | { | ||
70 | return (void *)(port + NONCACHE_OFFSET + 0x04000000); | ||
71 | } | ||
72 | #endif | ||
73 | static inline void *_port2addr_usb(unsigned long port) | ||
74 | { | ||
75 | return (void *)(port + NONCACHE_OFFSET + 0x14000000); | ||
76 | } | ||
77 | static inline void delay(void) | ||
78 | { | ||
79 | __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory"); | ||
80 | } | ||
81 | |||
82 | /* | ||
83 | * NIC I/O function | ||
84 | */ | ||
85 | |||
86 | static inline unsigned char _ne_inb(void *portp) | ||
87 | { | ||
88 | return (unsigned char) *(volatile unsigned char *)portp; | ||
89 | } | ||
90 | |||
91 | static inline unsigned short _ne_inw(void *portp) | ||
92 | { | ||
93 | return (unsigned short)le16_to_cpu(*(volatile unsigned short *)portp); | ||
94 | } | ||
95 | |||
96 | static inline void _ne_insb(void *portp, void * addr, unsigned long count) | ||
97 | { | ||
98 | unsigned char *buf = addr; | ||
99 | |||
100 | while (count--) | ||
101 | *buf++ = *(volatile unsigned char *)portp; | ||
102 | } | ||
103 | |||
104 | static inline void _ne_outb(unsigned char b, void *portp) | ||
105 | { | ||
106 | *(volatile unsigned char *)portp = (unsigned char)b; | ||
107 | } | ||
108 | |||
109 | static inline void _ne_outw(unsigned short w, void *portp) | ||
110 | { | ||
111 | *(volatile unsigned short *)portp = cpu_to_le16(w); | ||
112 | } | ||
113 | |||
114 | unsigned char _inb(unsigned long port) | ||
115 | { | ||
116 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
117 | return _ne_inb(PORT2ADDR_NE(port)); | ||
118 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
119 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
120 | return *(volatile unsigned char *)__port2addr_ata(port); | ||
121 | } | ||
122 | #endif | ||
123 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
124 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
125 | unsigned char b; | ||
126 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
127 | return b; | ||
128 | } else | ||
129 | #endif | ||
130 | |||
131 | return *(volatile unsigned char *)PORT2ADDR(port); | ||
132 | } | ||
133 | |||
134 | unsigned short _inw(unsigned long port) | ||
135 | { | ||
136 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
137 | return _ne_inw(PORT2ADDR_NE(port)); | ||
138 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
139 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
140 | return *(volatile unsigned short *)__port2addr_ata(port); | ||
141 | } | ||
142 | #endif | ||
143 | #if defined(CONFIG_USB) | ||
144 | else if (port >= 0x340 && port < 0x3a0) | ||
145 | return *(volatile unsigned short *)PORT2ADDR_USB(port); | ||
146 | #endif | ||
147 | |||
148 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
149 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
150 | unsigned short w; | ||
151 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
152 | return w; | ||
153 | } else | ||
154 | #endif | ||
155 | return *(volatile unsigned short *)PORT2ADDR(port); | ||
156 | } | ||
157 | |||
158 | unsigned long _inl(unsigned long port) | ||
159 | { | ||
160 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
161 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
162 | unsigned long l; | ||
163 | pcc_ioread_word(0, port, &l, sizeof(l), 1, 0); | ||
164 | return l; | ||
165 | } else | ||
166 | #endif | ||
167 | return *(volatile unsigned long *)PORT2ADDR(port); | ||
168 | } | ||
169 | |||
170 | unsigned char _inb_p(unsigned long port) | ||
171 | { | ||
172 | unsigned char v; | ||
173 | |||
174 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
175 | v = _ne_inb(PORT2ADDR_NE(port)); | ||
176 | else | ||
177 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
178 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
179 | return *(volatile unsigned char *)__port2addr_ata(port); | ||
180 | } else | ||
181 | #endif | ||
182 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
183 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
184 | unsigned char b; | ||
185 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
186 | return b; | ||
187 | } else | ||
188 | #endif | ||
189 | v = *(volatile unsigned char *)PORT2ADDR(port); | ||
190 | |||
191 | delay(); | ||
192 | return (v); | ||
193 | } | ||
194 | |||
195 | unsigned short _inw_p(unsigned long port) | ||
196 | { | ||
197 | unsigned short v; | ||
198 | |||
199 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
200 | v = _ne_inw(PORT2ADDR_NE(port)); | ||
201 | else | ||
202 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
203 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
204 | return *(volatile unsigned short *)__port2addr_ata(port); | ||
205 | } else | ||
206 | #endif | ||
207 | #if defined(CONFIG_USB) | ||
208 | if (port >= 0x340 && port < 0x3a0) | ||
209 | v = *(volatile unsigned short *)PORT2ADDR_USB(port); | ||
210 | else | ||
211 | #endif | ||
212 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
213 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
214 | unsigned short w; | ||
215 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
216 | return w; | ||
217 | } else | ||
218 | #endif | ||
219 | v = *(volatile unsigned short *)PORT2ADDR(port); | ||
220 | |||
221 | delay(); | ||
222 | return (v); | ||
223 | } | ||
224 | |||
225 | unsigned long _inl_p(unsigned long port) | ||
226 | { | ||
227 | unsigned long v; | ||
228 | |||
229 | v = *(volatile unsigned long *)PORT2ADDR(port); | ||
230 | delay(); | ||
231 | return (v); | ||
232 | } | ||
233 | |||
234 | void _outb(unsigned char b, unsigned long port) | ||
235 | { | ||
236 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
237 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
238 | else | ||
239 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
240 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
241 | *(volatile unsigned char *)__port2addr_ata(port) = b; | ||
242 | } else | ||
243 | #endif | ||
244 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
245 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
246 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
247 | } else | ||
248 | #endif | ||
249 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
250 | } | ||
251 | |||
252 | void _outw(unsigned short w, unsigned long port) | ||
253 | { | ||
254 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
255 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
256 | else | ||
257 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
258 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
259 | *(volatile unsigned short *)__port2addr_ata(port) = w; | ||
260 | } else | ||
261 | #endif | ||
262 | #if defined(CONFIG_USB) | ||
263 | if (port >= 0x340 && port < 0x3a0) | ||
264 | *(volatile unsigned short *)PORT2ADDR_USB(port) = w; | ||
265 | else | ||
266 | #endif | ||
267 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
268 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
269 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
270 | } else | ||
271 | #endif | ||
272 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
273 | } | ||
274 | |||
275 | void _outl(unsigned long l, unsigned long port) | ||
276 | { | ||
277 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
278 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
279 | pcc_iowrite_word(0, port, &l, sizeof(l), 1, 0); | ||
280 | } else | ||
281 | #endif | ||
282 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
283 | } | ||
284 | |||
285 | void _outb_p(unsigned char b, unsigned long port) | ||
286 | { | ||
287 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
288 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
289 | else | ||
290 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
291 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
292 | *(volatile unsigned char *)__port2addr_ata(port) = b; | ||
293 | } else | ||
294 | #endif | ||
295 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
296 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
297 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
298 | } else | ||
299 | #endif | ||
300 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
301 | |||
302 | delay(); | ||
303 | } | ||
304 | |||
305 | void _outw_p(unsigned short w, unsigned long port) | ||
306 | { | ||
307 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
308 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
309 | else | ||
310 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
311 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
312 | *(volatile unsigned short *)__port2addr_ata(port) = w; | ||
313 | } else | ||
314 | #endif | ||
315 | #if defined(CONFIG_USB) | ||
316 | if (port >= 0x340 && port < 0x3a0) | ||
317 | *(volatile unsigned short *)PORT2ADDR_USB(port) = w; | ||
318 | else | ||
319 | #endif | ||
320 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
321 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
322 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
323 | } else | ||
324 | #endif | ||
325 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
326 | |||
327 | delay(); | ||
328 | } | ||
329 | |||
330 | void _outl_p(unsigned long l, unsigned long port) | ||
331 | { | ||
332 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
333 | delay(); | ||
334 | } | ||
335 | |||
336 | void _insb(unsigned int port, void * addr, unsigned long count) | ||
337 | { | ||
338 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
339 | _ne_insb(PORT2ADDR_NE(port), addr, count); | ||
340 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
341 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
342 | unsigned char *buf = addr; | ||
343 | unsigned char *portp = __port2addr_ata(port); | ||
344 | while (count--) | ||
345 | *buf++ = *(volatile unsigned char *)portp; | ||
346 | } | ||
347 | #endif | ||
348 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
349 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
350 | pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char), | ||
351 | count, 1); | ||
352 | } | ||
353 | #endif | ||
354 | else { | ||
355 | unsigned char *buf = addr; | ||
356 | unsigned char *portp = PORT2ADDR(port); | ||
357 | while (count--) | ||
358 | *buf++ = *(volatile unsigned char *)portp; | ||
359 | } | ||
360 | } | ||
361 | |||
362 | void _insw(unsigned int port, void * addr, unsigned long count) | ||
363 | { | ||
364 | unsigned short *buf = addr; | ||
365 | unsigned short *portp; | ||
366 | |||
367 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
368 | portp = PORT2ADDR_NE(port); | ||
369 | while (count--) | ||
370 | *buf++ = *(volatile unsigned short *)portp; | ||
371 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
372 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
373 | pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short), | ||
374 | count, 1); | ||
375 | #endif | ||
376 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
377 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
378 | portp = __port2addr_ata(port); | ||
379 | while (count--) | ||
380 | *buf++ = *(volatile unsigned short *)portp; | ||
381 | #endif | ||
382 | } else { | ||
383 | portp = PORT2ADDR(port); | ||
384 | while (count--) | ||
385 | *buf++ = *(volatile unsigned short *)portp; | ||
386 | } | ||
387 | } | ||
388 | |||
389 | void _insl(unsigned int port, void * addr, unsigned long count) | ||
390 | { | ||
391 | unsigned long *buf = addr; | ||
392 | unsigned long *portp; | ||
393 | |||
394 | portp = PORT2ADDR(port); | ||
395 | while (count--) | ||
396 | *buf++ = *(volatile unsigned long *)portp; | ||
397 | } | ||
398 | |||
399 | void _outsb(unsigned int port, const void * addr, unsigned long count) | ||
400 | { | ||
401 | const unsigned char *buf = addr; | ||
402 | unsigned char *portp; | ||
403 | |||
404 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
405 | portp = PORT2ADDR_NE(port); | ||
406 | while (count--) | ||
407 | _ne_outb(*buf++, portp); | ||
408 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
409 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
410 | portp = __port2addr_ata(port); | ||
411 | while (count--) | ||
412 | *(volatile unsigned char *)portp = *buf++; | ||
413 | #endif | ||
414 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
415 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
416 | pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char), | ||
417 | count, 1); | ||
418 | #endif | ||
419 | } else { | ||
420 | portp = PORT2ADDR(port); | ||
421 | while (count--) | ||
422 | *(volatile unsigned char *)portp = *buf++; | ||
423 | } | ||
424 | } | ||
425 | |||
426 | void _outsw(unsigned int port, const void * addr, unsigned long count) | ||
427 | { | ||
428 | const unsigned short *buf = addr; | ||
429 | unsigned short *portp; | ||
430 | |||
431 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
432 | portp = PORT2ADDR_NE(port); | ||
433 | while (count--) | ||
434 | *(volatile unsigned short *)portp = *buf++; | ||
435 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | ||
436 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | ||
437 | portp = __port2addr_ata(port); | ||
438 | while (count--) | ||
439 | *(volatile unsigned short *)portp = *buf++; | ||
440 | #endif | ||
441 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
442 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
443 | pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short), | ||
444 | count, 1); | ||
445 | #endif | ||
446 | } else { | ||
447 | portp = PORT2ADDR(port); | ||
448 | while (count--) | ||
449 | *(volatile unsigned short *)portp = *buf++; | ||
450 | } | ||
451 | } | ||
452 | |||
453 | void _outsl(unsigned int port, const void * addr, unsigned long count) | ||
454 | { | ||
455 | const unsigned long *buf = addr; | ||
456 | unsigned char *portp; | ||
457 | |||
458 | portp = PORT2ADDR(port); | ||
459 | while (count--) | ||
460 | *(volatile unsigned long *)portp = *buf++; | ||
461 | } | ||
diff --git a/arch/m32r/kernel/io_oaks32r.c b/arch/m32r/kernel/io_oaks32r.c new file mode 100644 index 000000000000..286964794d51 --- /dev/null +++ b/arch/m32r/kernel/io_oaks32r.c | |||
@@ -0,0 +1,251 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/io_oaks32r.c | ||
3 | * | ||
4 | * Typical I/O routines for OAKS32R board. | ||
5 | * | ||
6 | * Copyright (c) 2001-2004 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Mamoru Sakugawa | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <asm/m32r.h> | ||
12 | #include <asm/page.h> | ||
13 | #include <asm/io.h> | ||
14 | |||
15 | #define PORT2ADDR(port) _port2addr(port) | ||
16 | |||
17 | static inline void *_port2addr(unsigned long port) | ||
18 | { | ||
19 | return (void *)(port + NONCACHE_OFFSET); | ||
20 | } | ||
21 | |||
22 | static inline void *_port2addr_ne(unsigned long port) | ||
23 | { | ||
24 | return (void *)((port<<1) + NONCACHE_OFFSET + 0x02000000); | ||
25 | } | ||
26 | |||
27 | static inline void delay(void) | ||
28 | { | ||
29 | __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory"); | ||
30 | } | ||
31 | |||
32 | /* | ||
33 | * NIC I/O function | ||
34 | */ | ||
35 | |||
36 | #define PORT2ADDR_NE(port) _port2addr_ne(port) | ||
37 | |||
38 | static inline unsigned char _ne_inb(void *portp) | ||
39 | { | ||
40 | return *(volatile unsigned char *)(portp+1); | ||
41 | } | ||
42 | |||
43 | static inline unsigned short _ne_inw(void *portp) | ||
44 | { | ||
45 | unsigned short tmp; | ||
46 | |||
47 | tmp = *(unsigned short *)(portp) & 0xff; | ||
48 | tmp |= *(unsigned short *)(portp+2) << 8; | ||
49 | return tmp; | ||
50 | } | ||
51 | |||
52 | static inline void _ne_insb(void *portp, void *addr, unsigned long count) | ||
53 | { | ||
54 | unsigned char *buf = addr; | ||
55 | while (count--) | ||
56 | *buf++ = *(volatile unsigned char *)(portp+1); | ||
57 | } | ||
58 | |||
59 | static inline void _ne_outb(unsigned char b, void *portp) | ||
60 | { | ||
61 | *(volatile unsigned char *)(portp+1) = b; | ||
62 | } | ||
63 | |||
64 | static inline void _ne_outw(unsigned short w, void *portp) | ||
65 | { | ||
66 | *(volatile unsigned short *)portp = (w >> 8); | ||
67 | *(volatile unsigned short *)(portp+2) = (w & 0xff); | ||
68 | } | ||
69 | |||
70 | unsigned char _inb(unsigned long port) | ||
71 | { | ||
72 | if (port >= 0x300 && port < 0x320) | ||
73 | return _ne_inb(PORT2ADDR_NE(port)); | ||
74 | |||
75 | return *(volatile unsigned char *)PORT2ADDR(port); | ||
76 | } | ||
77 | |||
78 | unsigned short _inw(unsigned long port) | ||
79 | { | ||
80 | if (port >= 0x300 && port < 0x320) | ||
81 | return _ne_inw(PORT2ADDR_NE(port)); | ||
82 | |||
83 | return *(volatile unsigned short *)PORT2ADDR(port); | ||
84 | } | ||
85 | |||
86 | unsigned long _inl(unsigned long port) | ||
87 | { | ||
88 | return *(volatile unsigned long *)PORT2ADDR(port); | ||
89 | } | ||
90 | |||
91 | unsigned char _inb_p(unsigned long port) | ||
92 | { | ||
93 | unsigned char v; | ||
94 | |||
95 | if (port >= 0x300 && port < 0x320) | ||
96 | v = _ne_inb(PORT2ADDR_NE(port)); | ||
97 | else | ||
98 | v = *(volatile unsigned char *)PORT2ADDR(port); | ||
99 | |||
100 | delay(); | ||
101 | return (v); | ||
102 | } | ||
103 | |||
104 | unsigned short _inw_p(unsigned long port) | ||
105 | { | ||
106 | unsigned short v; | ||
107 | |||
108 | if (port >= 0x300 && port < 0x320) | ||
109 | v = _ne_inw(PORT2ADDR_NE(port)); | ||
110 | else | ||
111 | v = *(volatile unsigned short *)PORT2ADDR(port); | ||
112 | |||
113 | delay(); | ||
114 | return (v); | ||
115 | } | ||
116 | |||
117 | unsigned long _inl_p(unsigned long port) | ||
118 | { | ||
119 | unsigned long v; | ||
120 | |||
121 | v = *(volatile unsigned long *)PORT2ADDR(port); | ||
122 | delay(); | ||
123 | return (v); | ||
124 | } | ||
125 | |||
126 | void _outb(unsigned char b, unsigned long port) | ||
127 | { | ||
128 | if (port >= 0x300 && port < 0x320) | ||
129 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
130 | else | ||
131 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
132 | } | ||
133 | |||
134 | void _outw(unsigned short w, unsigned long port) | ||
135 | { | ||
136 | if (port >= 0x300 && port < 0x320) | ||
137 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
138 | else | ||
139 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
140 | } | ||
141 | |||
142 | void _outl(unsigned long l, unsigned long port) | ||
143 | { | ||
144 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
145 | } | ||
146 | |||
147 | void _outb_p(unsigned char b, unsigned long port) | ||
148 | { | ||
149 | if (port >= 0x300 && port < 0x320) | ||
150 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
151 | else | ||
152 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
153 | |||
154 | delay(); | ||
155 | } | ||
156 | |||
157 | void _outw_p(unsigned short w, unsigned long port) | ||
158 | { | ||
159 | if (port >= 0x300 && port < 0x320) | ||
160 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
161 | else | ||
162 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
163 | |||
164 | delay(); | ||
165 | } | ||
166 | |||
167 | void _outl_p(unsigned long l, unsigned long port) | ||
168 | { | ||
169 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
170 | delay(); | ||
171 | } | ||
172 | |||
173 | void _insb(unsigned int port, void *addr, unsigned long count) | ||
174 | { | ||
175 | if (port >= 0x300 && port < 0x320) | ||
176 | _ne_insb(PORT2ADDR_NE(port), addr, count); | ||
177 | else { | ||
178 | unsigned char *buf = addr; | ||
179 | unsigned char *portp = PORT2ADDR(port); | ||
180 | while (count--) | ||
181 | *buf++ = *(volatile unsigned char *)portp; | ||
182 | } | ||
183 | } | ||
184 | |||
185 | void _insw(unsigned int port, void *addr, unsigned long count) | ||
186 | { | ||
187 | unsigned short *buf = addr; | ||
188 | unsigned short *portp; | ||
189 | |||
190 | if (port >= 0x300 && port < 0x320) { | ||
191 | portp = PORT2ADDR_NE(port); | ||
192 | while (count--) | ||
193 | *buf++ = _ne_inw(portp); | ||
194 | } else { | ||
195 | portp = PORT2ADDR(port); | ||
196 | while (count--) | ||
197 | *buf++ = *(volatile unsigned short *)portp; | ||
198 | } | ||
199 | } | ||
200 | |||
201 | void _insl(unsigned int port, void *addr, unsigned long count) | ||
202 | { | ||
203 | unsigned long *buf = addr; | ||
204 | unsigned long *portp; | ||
205 | |||
206 | portp = PORT2ADDR(port); | ||
207 | while (count--) | ||
208 | *buf++ = *(volatile unsigned long *)portp; | ||
209 | } | ||
210 | |||
211 | void _outsb(unsigned int port, const void *addr, unsigned long count) | ||
212 | { | ||
213 | const unsigned char *buf = addr; | ||
214 | unsigned char *portp; | ||
215 | |||
216 | if (port >= 0x300 && port < 0x320) { | ||
217 | portp = PORT2ADDR_NE(port); | ||
218 | while (count--) | ||
219 | _ne_outb(*buf++, portp); | ||
220 | } else { | ||
221 | portp = PORT2ADDR(port); | ||
222 | while (count--) | ||
223 | *(volatile unsigned char *)portp = *buf++; | ||
224 | } | ||
225 | } | ||
226 | |||
227 | void _outsw(unsigned int port, const void *addr, unsigned long count) | ||
228 | { | ||
229 | const unsigned short *buf = addr; | ||
230 | unsigned short *portp; | ||
231 | |||
232 | if (port >= 0x300 && port < 0x320) { | ||
233 | portp = PORT2ADDR_NE(port); | ||
234 | while (count--) | ||
235 | _ne_outw(*buf++, portp); | ||
236 | } else { | ||
237 | portp = PORT2ADDR(port); | ||
238 | while (count--) | ||
239 | *(volatile unsigned short *)portp = *buf++; | ||
240 | } | ||
241 | } | ||
242 | |||
243 | void _outsl(unsigned int port, const void *addr, unsigned long count) | ||
244 | { | ||
245 | const unsigned long *buf = addr; | ||
246 | unsigned char *portp; | ||
247 | |||
248 | portp = PORT2ADDR(port); | ||
249 | while (count--) | ||
250 | *(volatile unsigned long *)portp = *buf++; | ||
251 | } | ||
diff --git a/arch/m32r/kernel/io_opsput.c b/arch/m32r/kernel/io_opsput.c new file mode 100644 index 000000000000..aaf42f9f76da --- /dev/null +++ b/arch/m32r/kernel/io_opsput.c | |||
@@ -0,0 +1,390 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/io_mappi.c | ||
3 | * | ||
4 | * Typical I/O routines for OPSPUT board. | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Takeo Takahashi | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General | ||
10 | * Public License. See the file "COPYING" in the main directory of this | ||
11 | * archive for more details. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <asm/m32r.h> | ||
16 | #include <asm/page.h> | ||
17 | #include <asm/io.h> | ||
18 | #include <asm/byteorder.h> | ||
19 | |||
20 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
21 | #include <linux/types.h> | ||
22 | |||
23 | #define M32R_PCC_IOMAP_SIZE 0x1000 | ||
24 | |||
25 | #define M32R_PCC_IOSTART0 0x1000 | ||
26 | #define M32R_PCC_IOEND0 (M32R_PCC_IOSTART0 + M32R_PCC_IOMAP_SIZE - 1) | ||
27 | |||
28 | extern void pcc_ioread_byte(int, unsigned long, void *, size_t, size_t, int); | ||
29 | extern void pcc_ioread_word(int, unsigned long, void *, size_t, size_t, int); | ||
30 | extern void pcc_iowrite_byte(int, unsigned long, void *, size_t, size_t, int); | ||
31 | extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int); | ||
32 | #endif /* CONFIG_PCMCIA && CONFIG_M32R_CFC */ | ||
33 | |||
34 | #define PORT2ADDR(port) _port2addr(port) | ||
35 | #define PORT2ADDR_USB(port) _port2addr_usb(port) | ||
36 | |||
37 | static inline void *_port2addr(unsigned long port) | ||
38 | { | ||
39 | return (void *)(port + NONCACHE_OFFSET); | ||
40 | } | ||
41 | |||
42 | /* | ||
43 | * OPSPUT-LAN is located in the extended bus space | ||
44 | * from 0x10000000 to 0x13ffffff on physical address. | ||
45 | * The base address of LAN controller(LAN91C111) is 0x300. | ||
46 | */ | ||
47 | #define LAN_IOSTART 0x300 | ||
48 | #define LAN_IOEND 0x320 | ||
49 | static inline void *_port2addr_ne(unsigned long port) | ||
50 | { | ||
51 | return (void *)(port + NONCACHE_OFFSET + 0x10000000); | ||
52 | } | ||
53 | static inline void *_port2addr_usb(unsigned long port) | ||
54 | { | ||
55 | return (void *)((port & 0x0f) + NONCACHE_OFFSET + 0x10303000); | ||
56 | } | ||
57 | |||
58 | static inline void delay(void) | ||
59 | { | ||
60 | __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory"); | ||
61 | } | ||
62 | |||
63 | /* | ||
64 | * NIC I/O function | ||
65 | */ | ||
66 | |||
67 | #define PORT2ADDR_NE(port) _port2addr_ne(port) | ||
68 | |||
69 | static inline unsigned char _ne_inb(void *portp) | ||
70 | { | ||
71 | return *(volatile unsigned char *)portp; | ||
72 | } | ||
73 | |||
74 | static inline unsigned short _ne_inw(void *portp) | ||
75 | { | ||
76 | return (unsigned short)le16_to_cpu(*(volatile unsigned short *)portp); | ||
77 | } | ||
78 | |||
79 | static inline void _ne_insb(void *portp, void *addr, unsigned long count) | ||
80 | { | ||
81 | unsigned char *buf = (unsigned char *)addr; | ||
82 | |||
83 | while (count--) | ||
84 | *buf++ = _ne_inb(portp); | ||
85 | } | ||
86 | |||
87 | static inline void _ne_outb(unsigned char b, void *portp) | ||
88 | { | ||
89 | *(volatile unsigned char *)portp = b; | ||
90 | } | ||
91 | |||
92 | static inline void _ne_outw(unsigned short w, void *portp) | ||
93 | { | ||
94 | *(volatile unsigned short *)portp = cpu_to_le16(w); | ||
95 | } | ||
96 | |||
97 | unsigned char _inb(unsigned long port) | ||
98 | { | ||
99 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
100 | return _ne_inb(PORT2ADDR_NE(port)); | ||
101 | |||
102 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
103 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
104 | unsigned char b; | ||
105 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
106 | return b; | ||
107 | } else | ||
108 | #endif | ||
109 | |||
110 | return *(volatile unsigned char *)PORT2ADDR(port); | ||
111 | } | ||
112 | |||
113 | unsigned short _inw(unsigned long port) | ||
114 | { | ||
115 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
116 | return _ne_inw(PORT2ADDR_NE(port)); | ||
117 | #if defined(CONFIG_USB) | ||
118 | else if(port >= 0x340 && port < 0x3a0) | ||
119 | return *(volatile unsigned short *)PORT2ADDR_USB(port); | ||
120 | #endif | ||
121 | |||
122 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
123 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
124 | unsigned short w; | ||
125 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
126 | return w; | ||
127 | } else | ||
128 | #endif | ||
129 | return *(volatile unsigned short *)PORT2ADDR(port); | ||
130 | } | ||
131 | |||
132 | unsigned long _inl(unsigned long port) | ||
133 | { | ||
134 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
135 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
136 | unsigned long l; | ||
137 | pcc_ioread_word(0, port, &l, sizeof(l), 1, 0); | ||
138 | return l; | ||
139 | } else | ||
140 | #endif | ||
141 | return *(volatile unsigned long *)PORT2ADDR(port); | ||
142 | } | ||
143 | |||
144 | unsigned char _inb_p(unsigned long port) | ||
145 | { | ||
146 | unsigned char v; | ||
147 | |||
148 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
149 | v = _ne_inb(PORT2ADDR_NE(port)); | ||
150 | else | ||
151 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
152 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
153 | unsigned char b; | ||
154 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
155 | return b; | ||
156 | } else | ||
157 | #endif | ||
158 | v = *(volatile unsigned char *)PORT2ADDR(port); | ||
159 | |||
160 | delay(); | ||
161 | return (v); | ||
162 | } | ||
163 | |||
164 | unsigned short _inw_p(unsigned long port) | ||
165 | { | ||
166 | unsigned short v; | ||
167 | |||
168 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
169 | v = _ne_inw(PORT2ADDR_NE(port)); | ||
170 | else | ||
171 | #if defined(CONFIG_USB) | ||
172 | if(port >= 0x340 && port < 0x3a0) | ||
173 | return *(volatile unsigned short *)PORT2ADDR_USB(port); | ||
174 | else | ||
175 | #endif | ||
176 | |||
177 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
178 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
179 | unsigned short w; | ||
180 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
181 | return w; | ||
182 | } else | ||
183 | #endif | ||
184 | v = *(volatile unsigned short *)PORT2ADDR(port); | ||
185 | |||
186 | delay(); | ||
187 | return (v); | ||
188 | } | ||
189 | |||
190 | unsigned long _inl_p(unsigned long port) | ||
191 | { | ||
192 | unsigned long v; | ||
193 | |||
194 | v = *(volatile unsigned long *)PORT2ADDR(port); | ||
195 | delay(); | ||
196 | return (v); | ||
197 | } | ||
198 | |||
199 | void _outb(unsigned char b, unsigned long port) | ||
200 | { | ||
201 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
202 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
203 | else | ||
204 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
205 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
206 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
207 | } else | ||
208 | #endif | ||
209 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
210 | } | ||
211 | |||
212 | void _outw(unsigned short w, unsigned long port) | ||
213 | { | ||
214 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
215 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
216 | else | ||
217 | #if defined(CONFIG_USB) | ||
218 | if(port >= 0x340 && port < 0x3a0) | ||
219 | *(volatile unsigned short *)PORT2ADDR_USB(port) = w; | ||
220 | else | ||
221 | #endif | ||
222 | |||
223 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
224 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
225 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
226 | } else | ||
227 | #endif | ||
228 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
229 | } | ||
230 | |||
231 | void _outl(unsigned long l, unsigned long port) | ||
232 | { | ||
233 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
234 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
235 | pcc_iowrite_word(0, port, &l, sizeof(l), 1, 0); | ||
236 | } else | ||
237 | #endif | ||
238 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
239 | } | ||
240 | |||
241 | void _outb_p(unsigned char b, unsigned long port) | ||
242 | { | ||
243 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
244 | _ne_outb(b, PORT2ADDR_NE(port)); | ||
245 | else | ||
246 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
247 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
248 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
249 | } else | ||
250 | #endif | ||
251 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
252 | |||
253 | delay(); | ||
254 | } | ||
255 | |||
256 | void _outw_p(unsigned short w, unsigned long port) | ||
257 | { | ||
258 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
259 | _ne_outw(w, PORT2ADDR_NE(port)); | ||
260 | else | ||
261 | #if defined(CONFIG_USB) | ||
262 | if(port >= 0x340 && port < 0x3a0) | ||
263 | *(volatile unsigned short *)PORT2ADDR_USB(port) = w; | ||
264 | else | ||
265 | #endif | ||
266 | |||
267 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
268 | if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
269 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
270 | } else | ||
271 | #endif | ||
272 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
273 | |||
274 | delay(); | ||
275 | } | ||
276 | |||
277 | void _outl_p(unsigned long l, unsigned long port) | ||
278 | { | ||
279 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
280 | delay(); | ||
281 | } | ||
282 | |||
283 | void _insb(unsigned int port, void *addr, unsigned long count) | ||
284 | { | ||
285 | if (port >= LAN_IOSTART && port < LAN_IOEND) | ||
286 | _ne_insb(PORT2ADDR_NE(port), addr, count); | ||
287 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
288 | else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
289 | pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char), | ||
290 | count, 1); | ||
291 | } | ||
292 | #endif | ||
293 | else { | ||
294 | unsigned char *buf = addr; | ||
295 | unsigned char *portp = PORT2ADDR(port); | ||
296 | while (count--) | ||
297 | *buf++ = *(volatile unsigned char *)portp; | ||
298 | } | ||
299 | } | ||
300 | |||
301 | void _insw(unsigned int port, void *addr, unsigned long count) | ||
302 | { | ||
303 | unsigned short *buf = addr; | ||
304 | unsigned short *portp; | ||
305 | |||
306 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
307 | /* | ||
308 | * This portion is only used by smc91111.c to read data | ||
309 | * from the DATA_REG. Do not swap the data. | ||
310 | */ | ||
311 | portp = PORT2ADDR_NE(port); | ||
312 | while (count--) | ||
313 | *buf++ = *(volatile unsigned short *)portp; | ||
314 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
315 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
316 | pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short), | ||
317 | count, 1); | ||
318 | #endif | ||
319 | } else { | ||
320 | portp = PORT2ADDR(port); | ||
321 | while (count--) | ||
322 | *buf++ = *(volatile unsigned short *)portp; | ||
323 | } | ||
324 | } | ||
325 | |||
326 | void _insl(unsigned int port, void *addr, unsigned long count) | ||
327 | { | ||
328 | unsigned long *buf = addr; | ||
329 | unsigned long *portp; | ||
330 | |||
331 | portp = PORT2ADDR(port); | ||
332 | while (count--) | ||
333 | *buf++ = *(volatile unsigned long *)portp; | ||
334 | } | ||
335 | |||
336 | void _outsb(unsigned int port, const void *addr, unsigned long count) | ||
337 | { | ||
338 | const unsigned char *buf = addr; | ||
339 | unsigned char *portp; | ||
340 | |||
341 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
342 | portp = PORT2ADDR_NE(port); | ||
343 | while (count--) | ||
344 | _ne_outb(*buf++, portp); | ||
345 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
346 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
347 | pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char), | ||
348 | count, 1); | ||
349 | #endif | ||
350 | } else { | ||
351 | portp = PORT2ADDR(port); | ||
352 | while (count--) | ||
353 | *(volatile unsigned char *)portp = *buf++; | ||
354 | } | ||
355 | } | ||
356 | |||
357 | void _outsw(unsigned int port, const void *addr, unsigned long count) | ||
358 | { | ||
359 | const unsigned short *buf = addr; | ||
360 | unsigned short *portp; | ||
361 | |||
362 | if (port >= LAN_IOSTART && port < LAN_IOEND) { | ||
363 | /* | ||
364 | * This portion is only used by smc91111.c to write data | ||
365 | * into the DATA_REG. Do not swap the data. | ||
366 | */ | ||
367 | portp = PORT2ADDR_NE(port); | ||
368 | while (count--) | ||
369 | *(volatile unsigned short *)portp = *buf++; | ||
370 | #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) | ||
371 | } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { | ||
372 | pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short), | ||
373 | count, 1); | ||
374 | #endif | ||
375 | } else { | ||
376 | portp = PORT2ADDR(port); | ||
377 | while (count--) | ||
378 | *(volatile unsigned short *)portp = *buf++; | ||
379 | } | ||
380 | } | ||
381 | |||
382 | void _outsl(unsigned int port, const void *addr, unsigned long count) | ||
383 | { | ||
384 | const unsigned long *buf = addr; | ||
385 | unsigned char *portp; | ||
386 | |||
387 | portp = PORT2ADDR(port); | ||
388 | while (count--) | ||
389 | *(volatile unsigned long *)portp = *buf++; | ||
390 | } | ||
diff --git a/arch/m32r/kernel/io_usrv.c b/arch/m32r/kernel/io_usrv.c new file mode 100644 index 000000000000..27928a0b99ed --- /dev/null +++ b/arch/m32r/kernel/io_usrv.c | |||
@@ -0,0 +1,249 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/io_usrv.c | ||
3 | * | ||
4 | * Typical I/O routines for uServer board. | ||
5 | * | ||
6 | * Copyright (c) 2001 - 2003 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Takeo Takahashi | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General | ||
10 | * Public License. See the file "COPYING" in the main directory of this | ||
11 | * archive for more details. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <asm/m32r.h> | ||
17 | #include <asm/page.h> | ||
18 | #include <asm/io.h> | ||
19 | |||
20 | #include <linux/types.h> | ||
21 | #include "../drivers/m32r_cfc.h" | ||
22 | |||
23 | extern void pcc_ioread_byte(int, unsigned long, void *, size_t, size_t, int); | ||
24 | extern void pcc_ioread_word(int, unsigned long, void *, size_t, size_t, int); | ||
25 | extern void pcc_iowrite_byte(int, unsigned long, void *, size_t, size_t, int); | ||
26 | extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int); | ||
27 | #define CFC_IOSTART CFC_IOPORT_BASE | ||
28 | #define CFC_IOEND (CFC_IOSTART + (M32R_PCC_MAPSIZE * M32R_MAX_PCC) - 1) | ||
29 | |||
30 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) | ||
31 | #define UART0_REGSTART 0x04c20000 | ||
32 | #define UART1_REGSTART 0x04c20100 | ||
33 | #define UART_IOMAP_SIZE 8 | ||
34 | #define UART0_IOSTART 0x3f8 | ||
35 | #define UART0_IOEND (UART0_IOSTART + UART_IOMAP_SIZE - 1) | ||
36 | #define UART1_IOSTART 0x2f8 | ||
37 | #define UART1_IOEND (UART1_IOSTART + UART_IOMAP_SIZE - 1) | ||
38 | #endif /* CONFIG_SERIAL_8250 || CONFIG_SERIAL_8250_MODULE */ | ||
39 | |||
40 | #define PORT2ADDR(port) _port2addr(port) | ||
41 | |||
42 | static __inline__ void *_port2addr(unsigned long port) | ||
43 | { | ||
44 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) | ||
45 | if (port >= UART0_IOSTART && port <= UART0_IOEND) | ||
46 | port = ((port - UART0_IOSTART) << 1) + UART0_REGSTART; | ||
47 | else if (port >= UART1_IOSTART && port <= UART1_IOEND) | ||
48 | port = ((port - UART1_IOSTART) << 1) + UART1_REGSTART; | ||
49 | #endif /* CONFIG_SERIAL_8250 || CONFIG_SERIAL_8250_MODULE */ | ||
50 | return (void *)(port + NONCACHE_OFFSET); | ||
51 | } | ||
52 | |||
53 | static __inline__ void delay(void) | ||
54 | { | ||
55 | __asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory"); | ||
56 | } | ||
57 | |||
58 | unsigned char _inb(unsigned long port) | ||
59 | { | ||
60 | if (port >= CFC_IOSTART && port <= CFC_IOEND) { | ||
61 | unsigned char b; | ||
62 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
63 | return b; | ||
64 | } else | ||
65 | return *(volatile unsigned char *)PORT2ADDR(port); | ||
66 | } | ||
67 | |||
68 | unsigned short _inw(unsigned long port) | ||
69 | { | ||
70 | if (port >= CFC_IOSTART && port <= CFC_IOEND) { | ||
71 | unsigned short w; | ||
72 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
73 | return w; | ||
74 | } else | ||
75 | return *(volatile unsigned short *)PORT2ADDR(port); | ||
76 | } | ||
77 | |||
78 | unsigned long _inl(unsigned long port) | ||
79 | { | ||
80 | if (port >= CFC_IOSTART && port <= CFC_IOEND) { | ||
81 | unsigned long l; | ||
82 | pcc_ioread_word(0, port, &l, sizeof(l), 1, 0); | ||
83 | return l; | ||
84 | } else | ||
85 | return *(volatile unsigned long *)PORT2ADDR(port); | ||
86 | } | ||
87 | |||
88 | unsigned char _inb_p(unsigned long port) | ||
89 | { | ||
90 | unsigned char b; | ||
91 | |||
92 | if (port >= CFC_IOSTART && port <= CFC_IOEND) { | ||
93 | pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0); | ||
94 | return b; | ||
95 | } else { | ||
96 | b = *(volatile unsigned char *)PORT2ADDR(port); | ||
97 | delay(); | ||
98 | return b; | ||
99 | } | ||
100 | } | ||
101 | |||
102 | unsigned short _inw_p(unsigned long port) | ||
103 | { | ||
104 | unsigned short w; | ||
105 | |||
106 | if (port >= CFC_IOSTART && port <= CFC_IOEND) { | ||
107 | pcc_ioread_word(0, port, &w, sizeof(w), 1, 0); | ||
108 | return w; | ||
109 | } else { | ||
110 | w = *(volatile unsigned short *)PORT2ADDR(port); | ||
111 | delay(); | ||
112 | return w; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | unsigned long _inl_p(unsigned long port) | ||
117 | { | ||
118 | unsigned long v; | ||
119 | |||
120 | v = *(volatile unsigned long *)PORT2ADDR(port); | ||
121 | delay(); | ||
122 | |||
123 | return v; | ||
124 | } | ||
125 | |||
126 | void _outb(unsigned char b, unsigned long port) | ||
127 | { | ||
128 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
129 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
130 | else | ||
131 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
132 | } | ||
133 | |||
134 | void _outw(unsigned short w, unsigned long port) | ||
135 | { | ||
136 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
137 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
138 | else | ||
139 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
140 | } | ||
141 | |||
142 | void _outl(unsigned long l, unsigned long port) | ||
143 | { | ||
144 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
145 | pcc_iowrite_word(0, port, &l, sizeof(l), 1, 0); | ||
146 | else | ||
147 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
148 | } | ||
149 | |||
150 | void _outb_p(unsigned char b, unsigned long port) | ||
151 | { | ||
152 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
153 | pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); | ||
154 | else | ||
155 | *(volatile unsigned char *)PORT2ADDR(port) = b; | ||
156 | delay(); | ||
157 | } | ||
158 | |||
159 | void _outw_p(unsigned short w, unsigned long port) | ||
160 | { | ||
161 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
162 | pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0); | ||
163 | else | ||
164 | *(volatile unsigned short *)PORT2ADDR(port) = w; | ||
165 | delay(); | ||
166 | } | ||
167 | |||
168 | void _outl_p(unsigned long l, unsigned long port) | ||
169 | { | ||
170 | *(volatile unsigned long *)PORT2ADDR(port) = l; | ||
171 | delay(); | ||
172 | } | ||
173 | |||
174 | void _insb(unsigned int port, void * addr, unsigned long count) | ||
175 | { | ||
176 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
177 | pcc_ioread_byte(0, port, addr, sizeof(unsigned char), count, 1); | ||
178 | else { | ||
179 | unsigned char *buf = addr; | ||
180 | unsigned char *portp = PORT2ADDR(port); | ||
181 | while (count--) | ||
182 | *buf++ = *(volatile unsigned char *)portp; | ||
183 | } | ||
184 | } | ||
185 | |||
186 | void _insw(unsigned int port, void * addr, unsigned long count) | ||
187 | { | ||
188 | unsigned short *buf = addr; | ||
189 | unsigned short *portp; | ||
190 | |||
191 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
192 | pcc_ioread_word(0, port, addr, sizeof(unsigned short), count, | ||
193 | 1); | ||
194 | else { | ||
195 | portp = PORT2ADDR(port); | ||
196 | while (count--) | ||
197 | *buf++ = *(volatile unsigned short *)portp; | ||
198 | } | ||
199 | } | ||
200 | |||
201 | void _insl(unsigned int port, void * addr, unsigned long count) | ||
202 | { | ||
203 | unsigned long *buf = addr; | ||
204 | unsigned long *portp; | ||
205 | |||
206 | portp = PORT2ADDR(port); | ||
207 | while (count--) | ||
208 | *buf++ = *(volatile unsigned long *)portp; | ||
209 | } | ||
210 | |||
211 | void _outsb(unsigned int port, const void * addr, unsigned long count) | ||
212 | { | ||
213 | const unsigned char *buf = addr; | ||
214 | unsigned char *portp; | ||
215 | |||
216 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
217 | pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char), | ||
218 | count, 1); | ||
219 | else { | ||
220 | portp = PORT2ADDR(port); | ||
221 | while (count--) | ||
222 | *(volatile unsigned char *)portp = *buf++; | ||
223 | } | ||
224 | } | ||
225 | |||
226 | void _outsw(unsigned int port, const void * addr, unsigned long count) | ||
227 | { | ||
228 | const unsigned short *buf = addr; | ||
229 | unsigned short *portp; | ||
230 | |||
231 | if (port >= CFC_IOSTART && port <= CFC_IOEND) | ||
232 | pcc_iowrite_word(0, port, (void *)addr, sizeof(unsigned short), | ||
233 | count, 1); | ||
234 | else { | ||
235 | portp = PORT2ADDR(port); | ||
236 | while (count--) | ||
237 | *(volatile unsigned short *)portp = *buf++; | ||
238 | } | ||
239 | } | ||
240 | |||
241 | void _outsl(unsigned int port, const void * addr, unsigned long count) | ||
242 | { | ||
243 | const unsigned long *buf = addr; | ||
244 | unsigned char *portp; | ||
245 | |||
246 | portp = PORT2ADDR(port); | ||
247 | while (count--) | ||
248 | *(volatile unsigned long *)portp = *buf++; | ||
249 | } | ||
diff --git a/arch/m32r/kernel/irq.c b/arch/m32r/kernel/irq.c new file mode 100644 index 000000000000..1ce63926a3c0 --- /dev/null +++ b/arch/m32r/kernel/irq.c | |||
@@ -0,0 +1,91 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/irq.c | ||
3 | * | ||
4 | * Copyright (c) 2003, 2004 Hitoshi Yamamoto | ||
5 | * Copyright (c) 2004 Hirokazu Takata <takata at linux-m32r.org> | ||
6 | */ | ||
7 | |||
8 | /* | ||
9 | * linux/arch/i386/kernel/irq.c | ||
10 | * | ||
11 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar | ||
12 | * | ||
13 | * This file contains the lowest level m32r-specific interrupt | ||
14 | * entry and irq statistics code. All the remaining irq logic is | ||
15 | * done by the generic kernel/irq/ code and in the | ||
16 | * m32r-specific irq controller code. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel_stat.h> | ||
20 | #include <linux/interrupt.h> | ||
21 | #include <linux/seq_file.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <asm/uaccess.h> | ||
24 | |||
25 | atomic_t irq_err_count; | ||
26 | atomic_t irq_mis_count; | ||
27 | |||
28 | /* | ||
29 | * Generic, controller-independent functions: | ||
30 | */ | ||
31 | |||
32 | int show_interrupts(struct seq_file *p, void *v) | ||
33 | { | ||
34 | int i = *(loff_t *) v, j; | ||
35 | struct irqaction * action; | ||
36 | unsigned long flags; | ||
37 | |||
38 | if (i == 0) { | ||
39 | seq_printf(p, " "); | ||
40 | for (j=0; j<NR_CPUS; j++) | ||
41 | if (cpu_online(j)) | ||
42 | seq_printf(p, "CPU%d ",j); | ||
43 | seq_putc(p, '\n'); | ||
44 | } | ||
45 | |||
46 | if (i < NR_IRQS) { | ||
47 | spin_lock_irqsave(&irq_desc[i].lock, flags); | ||
48 | action = irq_desc[i].action; | ||
49 | if (!action) | ||
50 | goto skip; | ||
51 | seq_printf(p, "%3d: ",i); | ||
52 | #ifndef CONFIG_SMP | ||
53 | seq_printf(p, "%10u ", kstat_irqs(i)); | ||
54 | #else | ||
55 | for (j = 0; j < NR_CPUS; j++) | ||
56 | if (cpu_online(j)) | ||
57 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | ||
58 | #endif | ||
59 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | ||
60 | seq_printf(p, " %s", action->name); | ||
61 | |||
62 | for (action=action->next; action; action = action->next) | ||
63 | seq_printf(p, ", %s", action->name); | ||
64 | |||
65 | seq_putc(p, '\n'); | ||
66 | skip: | ||
67 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | ||
68 | } else if (i == NR_IRQS) { | ||
69 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); | ||
70 | seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); | ||
71 | } | ||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | /* | ||
76 | * do_IRQ handles all normal device IRQ's (the special | ||
77 | * SMP cross-CPU interrupts have their own specific | ||
78 | * handlers). | ||
79 | */ | ||
80 | asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs) | ||
81 | { | ||
82 | irq_enter(); | ||
83 | |||
84 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | ||
85 | /* FIXME M32R */ | ||
86 | #endif | ||
87 | __do_IRQ(irq, regs); | ||
88 | irq_exit(); | ||
89 | |||
90 | return 1; | ||
91 | } | ||
diff --git a/arch/m32r/kernel/m32r_ksyms.c b/arch/m32r/kernel/m32r_ksyms.c new file mode 100644 index 000000000000..e5ec134d81d9 --- /dev/null +++ b/arch/m32r/kernel/m32r_ksyms.c | |||
@@ -0,0 +1,140 @@ | |||
1 | #include <linux/config.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/smp.h> | ||
4 | #include <linux/user.h> | ||
5 | #include <linux/elfcore.h> | ||
6 | #include <linux/sched.h> | ||
7 | #include <linux/in6.h> | ||
8 | #include <linux/interrupt.h> | ||
9 | #include <linux/smp_lock.h> | ||
10 | #include <linux/string.h> | ||
11 | |||
12 | #include <asm/semaphore.h> | ||
13 | #include <asm/processor.h> | ||
14 | #include <asm/uaccess.h> | ||
15 | #include <asm/checksum.h> | ||
16 | #include <asm/io.h> | ||
17 | #include <asm/delay.h> | ||
18 | #include <asm/irq.h> | ||
19 | #include <asm/tlbflush.h> | ||
20 | |||
21 | extern void dump_thread(struct pt_regs *, struct user *); | ||
22 | |||
23 | #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE) | ||
24 | extern struct drive_info_struct drive_info; | ||
25 | EXPORT_SYMBOL(drive_info); | ||
26 | #endif | ||
27 | |||
28 | /* platform dependent support */ | ||
29 | EXPORT_SYMBOL(boot_cpu_data); | ||
30 | EXPORT_SYMBOL(dump_thread); | ||
31 | EXPORT_SYMBOL(dump_fpu); | ||
32 | EXPORT_SYMBOL(__ioremap); | ||
33 | EXPORT_SYMBOL(iounmap); | ||
34 | EXPORT_SYMBOL(enable_irq); | ||
35 | EXPORT_SYMBOL(disable_irq); | ||
36 | EXPORT_SYMBOL(disable_irq_nosync); | ||
37 | EXPORT_SYMBOL(kernel_thread); | ||
38 | EXPORT_SYMBOL(__down); | ||
39 | EXPORT_SYMBOL(__down_interruptible); | ||
40 | EXPORT_SYMBOL(__up); | ||
41 | EXPORT_SYMBOL(__down_trylock); | ||
42 | |||
43 | /* Networking helper routines. */ | ||
44 | /* Delay loops */ | ||
45 | EXPORT_SYMBOL(__udelay); | ||
46 | EXPORT_SYMBOL(__delay); | ||
47 | EXPORT_SYMBOL(__const_udelay); | ||
48 | |||
49 | EXPORT_SYMBOL(__get_user_1); | ||
50 | EXPORT_SYMBOL(__get_user_2); | ||
51 | EXPORT_SYMBOL(__get_user_4); | ||
52 | |||
53 | EXPORT_SYMBOL(strpbrk); | ||
54 | EXPORT_SYMBOL(strstr); | ||
55 | |||
56 | EXPORT_SYMBOL(strncpy_from_user); | ||
57 | EXPORT_SYMBOL(__strncpy_from_user); | ||
58 | EXPORT_SYMBOL(clear_user); | ||
59 | EXPORT_SYMBOL(__clear_user); | ||
60 | EXPORT_SYMBOL(__generic_copy_from_user); | ||
61 | EXPORT_SYMBOL(__generic_copy_to_user); | ||
62 | EXPORT_SYMBOL(strnlen_user); | ||
63 | |||
64 | #ifdef CONFIG_SMP | ||
65 | #ifdef CONFIG_CHIP_M32700_TS1 | ||
66 | extern void *dcache_dummy; | ||
67 | EXPORT_SYMBOL(dcache_dummy); | ||
68 | #endif | ||
69 | EXPORT_SYMBOL(cpu_data); | ||
70 | EXPORT_SYMBOL(cpu_online_map); | ||
71 | EXPORT_SYMBOL(cpu_callout_map); | ||
72 | |||
73 | /* Global SMP stuff */ | ||
74 | EXPORT_SYMBOL(synchronize_irq); | ||
75 | EXPORT_SYMBOL(smp_call_function); | ||
76 | |||
77 | /* TLB flushing */ | ||
78 | EXPORT_SYMBOL(smp_flush_tlb_page); | ||
79 | #endif | ||
80 | |||
81 | /* compiler generated symbol */ | ||
82 | extern void __ashldi3(void); | ||
83 | extern void __ashrdi3(void); | ||
84 | extern void __lshldi3(void); | ||
85 | extern void __lshrdi3(void); | ||
86 | extern void __muldi3(void); | ||
87 | EXPORT_SYMBOL(__ashldi3); | ||
88 | EXPORT_SYMBOL(__ashrdi3); | ||
89 | EXPORT_SYMBOL(__lshldi3); | ||
90 | EXPORT_SYMBOL(__lshrdi3); | ||
91 | EXPORT_SYMBOL(__muldi3); | ||
92 | |||
93 | /* memory and string operations */ | ||
94 | EXPORT_SYMBOL(memchr); | ||
95 | EXPORT_SYMBOL(memcpy); | ||
96 | /* EXPORT_SYMBOL(memcpy_fromio); // not implement yet */ | ||
97 | /* EXPORT_SYMBOL(memcpy_toio); // not implement yet */ | ||
98 | EXPORT_SYMBOL(memset); | ||
99 | /* EXPORT_SYMBOL(memset_io); // not implement yet */ | ||
100 | EXPORT_SYMBOL(memmove); | ||
101 | EXPORT_SYMBOL(memcmp); | ||
102 | EXPORT_SYMBOL(memscan); | ||
103 | EXPORT_SYMBOL(copy_page); | ||
104 | EXPORT_SYMBOL(clear_page); | ||
105 | |||
106 | EXPORT_SYMBOL(strcat); | ||
107 | EXPORT_SYMBOL(strchr); | ||
108 | EXPORT_SYMBOL(strcmp); | ||
109 | EXPORT_SYMBOL(strcpy); | ||
110 | EXPORT_SYMBOL(strlen); | ||
111 | EXPORT_SYMBOL(strncat); | ||
112 | EXPORT_SYMBOL(strncmp); | ||
113 | EXPORT_SYMBOL(strnlen); | ||
114 | EXPORT_SYMBOL(strncpy); | ||
115 | |||
116 | EXPORT_SYMBOL(_inb); | ||
117 | EXPORT_SYMBOL(_inw); | ||
118 | EXPORT_SYMBOL(_inl); | ||
119 | EXPORT_SYMBOL(_outb); | ||
120 | EXPORT_SYMBOL(_outw); | ||
121 | EXPORT_SYMBOL(_outl); | ||
122 | EXPORT_SYMBOL(_inb_p); | ||
123 | EXPORT_SYMBOL(_inw_p); | ||
124 | EXPORT_SYMBOL(_inl_p); | ||
125 | EXPORT_SYMBOL(_outb_p); | ||
126 | EXPORT_SYMBOL(_outw_p); | ||
127 | EXPORT_SYMBOL(_outl_p); | ||
128 | EXPORT_SYMBOL(_insb); | ||
129 | EXPORT_SYMBOL(_insw); | ||
130 | EXPORT_SYMBOL(_insl); | ||
131 | EXPORT_SYMBOL(_outsb); | ||
132 | EXPORT_SYMBOL(_outsw); | ||
133 | EXPORT_SYMBOL(_outsl); | ||
134 | EXPORT_SYMBOL(_readb); | ||
135 | EXPORT_SYMBOL(_readw); | ||
136 | EXPORT_SYMBOL(_readl); | ||
137 | EXPORT_SYMBOL(_writeb); | ||
138 | EXPORT_SYMBOL(_writew); | ||
139 | EXPORT_SYMBOL(_writel); | ||
140 | |||
diff --git a/arch/m32r/kernel/module.c b/arch/m32r/kernel/module.c new file mode 100644 index 000000000000..f6a79a016ce0 --- /dev/null +++ b/arch/m32r/kernel/module.c | |||
@@ -0,0 +1,259 @@ | |||
1 | /* Kernel module help for M32R. | ||
2 | |||
3 | This program is free software; you can redistribute it and/or modify | ||
4 | it under the terms of the GNU General Public License as published by | ||
5 | the Free Software Foundation; either version 2 of the License, or | ||
6 | (at your option) any later version. | ||
7 | |||
8 | This program is distributed in the hope that it will be useful, | ||
9 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | GNU General Public License for more details. | ||
12 | |||
13 | You should have received a copy of the GNU General Public License | ||
14 | along with this program; if not, write to the Free Software | ||
15 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
16 | */ | ||
17 | |||
18 | #include <linux/config.h> | ||
19 | #include <linux/moduleloader.h> | ||
20 | #include <linux/elf.h> | ||
21 | #include <linux/vmalloc.h> | ||
22 | #include <linux/fs.h> | ||
23 | #include <linux/string.h> | ||
24 | #include <linux/kernel.h> | ||
25 | |||
26 | #if 0 | ||
27 | #define DEBUGP printk | ||
28 | #else | ||
29 | #define DEBUGP(fmt...) | ||
30 | #endif | ||
31 | |||
32 | void *module_alloc(unsigned long size) | ||
33 | { | ||
34 | if (size == 0) | ||
35 | return NULL; | ||
36 | #ifdef CONFIG_MMU | ||
37 | return vmalloc_exec(size); | ||
38 | #else | ||
39 | return vmalloc(size); | ||
40 | #endif | ||
41 | } | ||
42 | |||
43 | |||
44 | /* Free memory returned from module_alloc */ | ||
45 | void module_free(struct module *mod, void *module_region) | ||
46 | { | ||
47 | vfree(module_region); | ||
48 | /* FIXME: If module_region == mod->init_region, trim exception | ||
49 | table entries. */ | ||
50 | } | ||
51 | |||
52 | /* We don't need anything special. */ | ||
53 | int module_frob_arch_sections(Elf_Ehdr *hdr, | ||
54 | Elf_Shdr *sechdrs, | ||
55 | char *secstrings, | ||
56 | struct module *mod) | ||
57 | { | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | #define COPY_UNALIGNED_WORD(sw, tw, align) \ | ||
62 | { \ | ||
63 | void *__s = &(sw), *__t = &(tw); \ | ||
64 | unsigned short *__s2 = __s, *__t2 =__t; \ | ||
65 | unsigned char *__s1 = __s, *__t1 =__t; \ | ||
66 | switch ((align)) \ | ||
67 | { \ | ||
68 | case 0: \ | ||
69 | *(unsigned long *) __t = *(unsigned long *) __s; \ | ||
70 | break; \ | ||
71 | case 2: \ | ||
72 | *__t2++ = *__s2++; \ | ||
73 | *__t2 = *__s2; \ | ||
74 | break; \ | ||
75 | default: \ | ||
76 | *__t1++ = *__s1++; \ | ||
77 | *__t1++ = *__s1++; \ | ||
78 | *__t1++ = *__s1++; \ | ||
79 | *__t1 = *__s1; \ | ||
80 | break; \ | ||
81 | } \ | ||
82 | } | ||
83 | |||
84 | #define COPY_UNALIGNED_HWORD(sw, tw, align) \ | ||
85 | { \ | ||
86 | void *__s = &(sw), *__t = &(tw); \ | ||
87 | unsigned short *__s2 = __s, *__t2 =__t; \ | ||
88 | unsigned char *__s1 = __s, *__t1 =__t; \ | ||
89 | switch ((align)) \ | ||
90 | { \ | ||
91 | case 0: \ | ||
92 | *__t2 = *__s2; \ | ||
93 | break; \ | ||
94 | default: \ | ||
95 | *__t1++ = *__s1++; \ | ||
96 | *__t1 = *__s1; \ | ||
97 | break; \ | ||
98 | } \ | ||
99 | } | ||
100 | |||
101 | int apply_relocate_add(Elf32_Shdr *sechdrs, | ||
102 | const char *strtab, | ||
103 | unsigned int symindex, | ||
104 | unsigned int relsec, | ||
105 | struct module *me) | ||
106 | { | ||
107 | unsigned int i; | ||
108 | Elf32_Rela *rel = (void *)sechdrs[relsec].sh_addr; | ||
109 | Elf32_Sym *sym; | ||
110 | Elf32_Addr relocation; | ||
111 | uint32_t *location; | ||
112 | uint32_t value; | ||
113 | unsigned short *hlocation; | ||
114 | unsigned short hvalue; | ||
115 | int svalue; | ||
116 | int align; | ||
117 | |||
118 | DEBUGP("Applying relocate section %u to %u\n", relsec, | ||
119 | sechdrs[relsec].sh_info); | ||
120 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { | ||
121 | /* This is where to make the change */ | ||
122 | location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr | ||
123 | + rel[i].r_offset; | ||
124 | /* This is the symbol it is referring to. Note that all | ||
125 | undefined symbols have been resolved. */ | ||
126 | sym = (Elf32_Sym *)sechdrs[symindex].sh_addr | ||
127 | + ELF32_R_SYM(rel[i].r_info); | ||
128 | relocation = sym->st_value + rel[i].r_addend; | ||
129 | align = (int)location & 3; | ||
130 | |||
131 | switch (ELF32_R_TYPE(rel[i].r_info)) { | ||
132 | case R_M32R_32_RELA: | ||
133 | COPY_UNALIGNED_WORD (*location, value, align); | ||
134 | value += relocation; | ||
135 | COPY_UNALIGNED_WORD (value, *location, align); | ||
136 | break; | ||
137 | case R_M32R_HI16_ULO_RELA: | ||
138 | COPY_UNALIGNED_WORD (*location, value, align); | ||
139 | relocation = (relocation >>16) & 0xffff; | ||
140 | /* RELA must has 0 at relocation field. */ | ||
141 | value += relocation; | ||
142 | COPY_UNALIGNED_WORD (value, *location, align); | ||
143 | break; | ||
144 | case R_M32R_HI16_SLO_RELA: | ||
145 | COPY_UNALIGNED_WORD (*location, value, align); | ||
146 | if (relocation & 0x8000) relocation += 0x10000; | ||
147 | relocation = (relocation >>16) & 0xffff; | ||
148 | /* RELA must has 0 at relocation field. */ | ||
149 | value += relocation; | ||
150 | COPY_UNALIGNED_WORD (value, *location, align); | ||
151 | break; | ||
152 | case R_M32R_16_RELA: | ||
153 | hlocation = (unsigned short *)location; | ||
154 | relocation = relocation & 0xffff; | ||
155 | /* RELA must has 0 at relocation field. */ | ||
156 | hvalue = relocation; | ||
157 | COPY_UNALIGNED_WORD (hvalue, *hlocation, align); | ||
158 | break; | ||
159 | case R_M32R_SDA16_RELA: | ||
160 | case R_M32R_LO16_RELA: | ||
161 | COPY_UNALIGNED_WORD (*location, value, align); | ||
162 | relocation = relocation & 0xffff; | ||
163 | /* RELA must has 0 at relocation field. */ | ||
164 | value += relocation; | ||
165 | COPY_UNALIGNED_WORD (value, *location, align); | ||
166 | break; | ||
167 | case R_M32R_24_RELA: | ||
168 | COPY_UNALIGNED_WORD (*location, value, align); | ||
169 | relocation = relocation & 0xffffff; | ||
170 | /* RELA must has 0 at relocation field. */ | ||
171 | value += relocation; | ||
172 | COPY_UNALIGNED_WORD (value, *location, align); | ||
173 | break; | ||
174 | case R_M32R_18_PCREL_RELA: | ||
175 | relocation = (relocation - (Elf32_Addr) location); | ||
176 | if (relocation < -0x20000 || 0x1fffc < relocation) | ||
177 | { | ||
178 | printk(KERN_ERR "module %s: relocation overflow: %u\n", | ||
179 | me->name, relocation); | ||
180 | return -ENOEXEC; | ||
181 | } | ||
182 | COPY_UNALIGNED_WORD (*location, value, align); | ||
183 | if (value & 0xffff) | ||
184 | { | ||
185 | /* RELA must has 0 at relocation field. */ | ||
186 | printk(KERN_ERR "module %s: illegal relocation field: %u\n", | ||
187 | me->name, value); | ||
188 | return -ENOEXEC; | ||
189 | } | ||
190 | relocation = (relocation >> 2) & 0xffff; | ||
191 | value += relocation; | ||
192 | COPY_UNALIGNED_WORD (value, *location, align); | ||
193 | break; | ||
194 | case R_M32R_10_PCREL_RELA: | ||
195 | hlocation = (unsigned short *)location; | ||
196 | relocation = (relocation - (Elf32_Addr) location); | ||
197 | COPY_UNALIGNED_HWORD (*hlocation, hvalue, align); | ||
198 | svalue = (int)hvalue; | ||
199 | svalue = (signed char)svalue << 2; | ||
200 | relocation += svalue; | ||
201 | relocation = (relocation >> 2) & 0xff; | ||
202 | hvalue = hvalue & 0xff00; | ||
203 | hvalue += relocation; | ||
204 | COPY_UNALIGNED_HWORD (hvalue, *hlocation, align); | ||
205 | break; | ||
206 | case R_M32R_26_PCREL_RELA: | ||
207 | relocation = (relocation - (Elf32_Addr) location); | ||
208 | if (relocation < -0x2000000 || 0x1fffffc < relocation) | ||
209 | { | ||
210 | printk(KERN_ERR "module %s: relocation overflow: %u\n", | ||
211 | me->name, relocation); | ||
212 | return -ENOEXEC; | ||
213 | } | ||
214 | COPY_UNALIGNED_WORD (*location, value, align); | ||
215 | if (value & 0xffffff) | ||
216 | { | ||
217 | /* RELA must has 0 at relocation field. */ | ||
218 | printk(KERN_ERR "module %s: illegal relocation field: %u\n", | ||
219 | me->name, value); | ||
220 | return -ENOEXEC; | ||
221 | } | ||
222 | relocation = (relocation >> 2) & 0xffffff; | ||
223 | value += relocation; | ||
224 | COPY_UNALIGNED_WORD (value, *location, align); | ||
225 | break; | ||
226 | default: | ||
227 | printk(KERN_ERR "module %s: Unknown relocation: %u\n", | ||
228 | me->name, ELF32_R_TYPE(rel[i].r_info)); | ||
229 | return -ENOEXEC; | ||
230 | } | ||
231 | } | ||
232 | return 0; | ||
233 | } | ||
234 | |||
235 | int apply_relocate(Elf32_Shdr *sechdrs, | ||
236 | const char *strtab, | ||
237 | unsigned int symindex, | ||
238 | unsigned int relsec, | ||
239 | struct module *me) | ||
240 | { | ||
241 | #if 0 | ||
242 | printk(KERN_ERR "module %s: REL RELOCATION unsupported\n", | ||
243 | me->name); | ||
244 | return -ENOEXEC; | ||
245 | #endif | ||
246 | return 0; | ||
247 | |||
248 | } | ||
249 | |||
250 | int module_finalize(const Elf_Ehdr *hdr, | ||
251 | const Elf_Shdr *sechdrs, | ||
252 | struct module *me) | ||
253 | { | ||
254 | return 0; | ||
255 | } | ||
256 | |||
257 | void module_arch_cleanup(struct module *mod) | ||
258 | { | ||
259 | } | ||
diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c new file mode 100644 index 000000000000..b556c3cf6495 --- /dev/null +++ b/arch/m32r/kernel/process.c | |||
@@ -0,0 +1,359 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/process.c | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
5 | * Hitoshi Yamamoto | ||
6 | * Taken from sh version. | ||
7 | * Copyright (C) 1995 Linus Torvalds | ||
8 | * SuperH version: Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima | ||
9 | */ | ||
10 | |||
11 | #undef DEBUG_PROCESS | ||
12 | #ifdef DEBUG_PROCESS | ||
13 | #define DPRINTK(fmt, args...) printk("%s:%d:%s: " fmt, __FILE__, __LINE__, \ | ||
14 | __FUNCTION__, ##args) | ||
15 | #else | ||
16 | #define DPRINTK(fmt, args...) | ||
17 | #endif | ||
18 | |||
19 | /* | ||
20 | * This file handles the architecture-dependent parts of process handling.. | ||
21 | */ | ||
22 | |||
23 | #include <linux/fs.h> | ||
24 | #include <linux/config.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/ptrace.h> | ||
27 | #include <linux/unistd.h> | ||
28 | #include <linux/slab.h> | ||
29 | #include <linux/hardirq.h> | ||
30 | |||
31 | #include <asm/io.h> | ||
32 | #include <asm/uaccess.h> | ||
33 | #include <asm/mmu_context.h> | ||
34 | #include <asm/elf.h> | ||
35 | #include <asm/m32r.h> | ||
36 | |||
37 | #include <linux/err.h> | ||
38 | |||
39 | static int hlt_counter=0; | ||
40 | |||
41 | /* | ||
42 | * Return saved PC of a blocked thread. | ||
43 | */ | ||
44 | unsigned long thread_saved_pc(struct task_struct *tsk) | ||
45 | { | ||
46 | return tsk->thread.lr; | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | * Powermanagement idle function, if any.. | ||
51 | */ | ||
52 | void (*pm_idle)(void) = NULL; | ||
53 | |||
54 | void disable_hlt(void) | ||
55 | { | ||
56 | hlt_counter++; | ||
57 | } | ||
58 | |||
59 | EXPORT_SYMBOL(disable_hlt); | ||
60 | |||
61 | void enable_hlt(void) | ||
62 | { | ||
63 | hlt_counter--; | ||
64 | } | ||
65 | |||
66 | EXPORT_SYMBOL(enable_hlt); | ||
67 | |||
68 | /* | ||
69 | * We use this is we don't have any better | ||
70 | * idle routine.. | ||
71 | */ | ||
72 | void default_idle(void) | ||
73 | { | ||
74 | /* M32R_FIXME: Please use "cpu_sleep" mode. */ | ||
75 | cpu_relax(); | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * On SMP it's slightly faster (but much more power-consuming!) | ||
80 | * to poll the ->work.need_resched flag instead of waiting for the | ||
81 | * cross-CPU IPI to arrive. Use this option with caution. | ||
82 | */ | ||
83 | static void poll_idle (void) | ||
84 | { | ||
85 | /* M32R_FIXME */ | ||
86 | cpu_relax(); | ||
87 | } | ||
88 | |||
89 | /* | ||
90 | * The idle thread. There's no useful work to be | ||
91 | * done, so just try to conserve power and have a | ||
92 | * low exit latency (ie sit in a loop waiting for | ||
93 | * somebody to say that they'd like to reschedule) | ||
94 | */ | ||
95 | void cpu_idle (void) | ||
96 | { | ||
97 | /* endless idle loop with no priority at all */ | ||
98 | while (1) { | ||
99 | while (!need_resched()) { | ||
100 | void (*idle)(void) = pm_idle; | ||
101 | |||
102 | if (!idle) | ||
103 | idle = default_idle; | ||
104 | |||
105 | idle(); | ||
106 | } | ||
107 | schedule(); | ||
108 | } | ||
109 | } | ||
110 | |||
111 | void machine_restart(char *__unused) | ||
112 | { | ||
113 | printk("Please push reset button!\n"); | ||
114 | while (1) | ||
115 | cpu_relax(); | ||
116 | } | ||
117 | |||
118 | EXPORT_SYMBOL(machine_restart); | ||
119 | |||
120 | void machine_halt(void) | ||
121 | { | ||
122 | printk("Please push reset button!\n"); | ||
123 | while (1) | ||
124 | cpu_relax(); | ||
125 | } | ||
126 | |||
127 | EXPORT_SYMBOL(machine_halt); | ||
128 | |||
129 | void machine_power_off(void) | ||
130 | { | ||
131 | /* M32R_FIXME */ | ||
132 | } | ||
133 | |||
134 | EXPORT_SYMBOL(machine_power_off); | ||
135 | |||
136 | static int __init idle_setup (char *str) | ||
137 | { | ||
138 | if (!strncmp(str, "poll", 4)) { | ||
139 | printk("using poll in idle threads.\n"); | ||
140 | pm_idle = poll_idle; | ||
141 | } else if (!strncmp(str, "sleep", 4)) { | ||
142 | printk("using sleep in idle threads.\n"); | ||
143 | pm_idle = default_idle; | ||
144 | } | ||
145 | |||
146 | return 1; | ||
147 | } | ||
148 | |||
149 | __setup("idle=", idle_setup); | ||
150 | |||
151 | void show_regs(struct pt_regs * regs) | ||
152 | { | ||
153 | printk("\n"); | ||
154 | printk("BPC[%08lx]:PSW[%08lx]:LR [%08lx]:FP [%08lx]\n", \ | ||
155 | regs->bpc, regs->psw, regs->lr, regs->fp); | ||
156 | printk("BBPC[%08lx]:BBPSW[%08lx]:SPU[%08lx]:SPI[%08lx]\n", \ | ||
157 | regs->bbpc, regs->bbpsw, regs->spu, regs->spi); | ||
158 | printk("R0 [%08lx]:R1 [%08lx]:R2 [%08lx]:R3 [%08lx]\n", \ | ||
159 | regs->r0, regs->r1, regs->r2, regs->r3); | ||
160 | printk("R4 [%08lx]:R5 [%08lx]:R6 [%08lx]:R7 [%08lx]\n", \ | ||
161 | regs->r4, regs->r5, regs->r6, regs->r7); | ||
162 | printk("R8 [%08lx]:R9 [%08lx]:R10[%08lx]:R11[%08lx]\n", \ | ||
163 | regs->r8, regs->r9, regs->r10, regs->r11); | ||
164 | printk("R12[%08lx]\n", \ | ||
165 | regs->r12); | ||
166 | |||
167 | #if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) | ||
168 | printk("ACC0H[%08lx]:ACC0L[%08lx]\n", \ | ||
169 | regs->acc0h, regs->acc0l); | ||
170 | printk("ACC1H[%08lx]:ACC1L[%08lx]\n", \ | ||
171 | regs->acc1h, regs->acc1l); | ||
172 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||
173 | printk("ACCH[%08lx]:ACCL[%08lx]\n", \ | ||
174 | regs->acch, regs->accl); | ||
175 | #else | ||
176 | #error unknown isa configuration | ||
177 | #endif | ||
178 | } | ||
179 | |||
180 | /* | ||
181 | * Create a kernel thread | ||
182 | */ | ||
183 | |||
184 | /* | ||
185 | * This is the mechanism for creating a new kernel thread. | ||
186 | * | ||
187 | * NOTE! Only a kernel-only process(ie the swapper or direct descendants | ||
188 | * who haven't done an "execve()") should use this: it will work within | ||
189 | * a system call from a "real" process, but the process memory space will | ||
190 | * not be free'd until both the parent and the child have exited. | ||
191 | */ | ||
192 | static void kernel_thread_helper(void *nouse, int (*fn)(void *), void *arg) | ||
193 | { | ||
194 | fn(arg); | ||
195 | do_exit(-1); | ||
196 | } | ||
197 | |||
198 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
199 | { | ||
200 | struct pt_regs regs; | ||
201 | |||
202 | memset(®s, 0, sizeof (regs)); | ||
203 | regs.r1 = (unsigned long)fn; | ||
204 | regs.r2 = (unsigned long)arg; | ||
205 | |||
206 | regs.bpc = (unsigned long)kernel_thread_helper; | ||
207 | |||
208 | regs.psw = M32R_PSW_BIE; | ||
209 | |||
210 | /* Ok, create the new process. */ | ||
211 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, | ||
212 | NULL); | ||
213 | } | ||
214 | |||
215 | /* | ||
216 | * Free current thread data structures etc.. | ||
217 | */ | ||
218 | void exit_thread(void) | ||
219 | { | ||
220 | /* Nothing to do. */ | ||
221 | DPRINTK("pid = %d\n", current->pid); | ||
222 | } | ||
223 | |||
224 | void flush_thread(void) | ||
225 | { | ||
226 | DPRINTK("pid = %d\n", current->pid); | ||
227 | memset(¤t->thread.debug_trap, 0, sizeof(struct debug_trap)); | ||
228 | } | ||
229 | |||
230 | void release_thread(struct task_struct *dead_task) | ||
231 | { | ||
232 | /* do nothing */ | ||
233 | DPRINTK("pid = %d\n", dead_task->pid); | ||
234 | } | ||
235 | |||
236 | /* Fill in the fpu structure for a core dump.. */ | ||
237 | int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) | ||
238 | { | ||
239 | return 0; /* Task didn't use the fpu at all. */ | ||
240 | } | ||
241 | |||
242 | int copy_thread(int nr, unsigned long clone_flags, unsigned long spu, | ||
243 | unsigned long unused, struct task_struct *tsk, struct pt_regs *regs) | ||
244 | { | ||
245 | struct pt_regs *childregs; | ||
246 | unsigned long sp = (unsigned long)tsk->thread_info + THREAD_SIZE; | ||
247 | extern void ret_from_fork(void); | ||
248 | |||
249 | /* Copy registers */ | ||
250 | sp -= sizeof (struct pt_regs); | ||
251 | childregs = (struct pt_regs *)sp; | ||
252 | *childregs = *regs; | ||
253 | |||
254 | childregs->spu = spu; | ||
255 | childregs->r0 = 0; /* Child gets zero as return value */ | ||
256 | regs->r0 = tsk->pid; | ||
257 | tsk->thread.sp = (unsigned long)childregs; | ||
258 | tsk->thread.lr = (unsigned long)ret_from_fork; | ||
259 | |||
260 | return 0; | ||
261 | } | ||
262 | |||
263 | /* | ||
264 | * fill in the user structure for a core dump.. | ||
265 | */ | ||
266 | void dump_thread(struct pt_regs * regs, struct user * dump) | ||
267 | { | ||
268 | /* M32R_FIXME */ | ||
269 | } | ||
270 | |||
271 | /* | ||
272 | * Capture the user space registers if the task is not running (in user space) | ||
273 | */ | ||
274 | int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs) | ||
275 | { | ||
276 | /* M32R_FIXME */ | ||
277 | return 1; | ||
278 | } | ||
279 | |||
280 | asmlinkage int sys_fork(unsigned long r0, unsigned long r1, unsigned long r2, | ||
281 | unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, | ||
282 | struct pt_regs regs) | ||
283 | { | ||
284 | #ifdef CONFIG_MMU | ||
285 | return do_fork(SIGCHLD, regs.spu, ®s, 0, NULL, NULL); | ||
286 | #else | ||
287 | return -EINVAL; | ||
288 | #endif /* CONFIG_MMU */ | ||
289 | } | ||
290 | |||
291 | asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, | ||
292 | unsigned long parent_tidptr, | ||
293 | unsigned long child_tidptr, | ||
294 | unsigned long r4, unsigned long r5, unsigned long r6, | ||
295 | struct pt_regs regs) | ||
296 | { | ||
297 | if (!newsp) | ||
298 | newsp = regs.spu; | ||
299 | |||
300 | return do_fork(clone_flags, newsp, ®s, 0, | ||
301 | (int __user *)parent_tidptr, (int __user *)child_tidptr); | ||
302 | } | ||
303 | |||
304 | /* | ||
305 | * This is trivial, and on the face of it looks like it | ||
306 | * could equally well be done in user mode. | ||
307 | * | ||
308 | * Not so, for quite unobvious reasons - register pressure. | ||
309 | * In user mode vfork() cannot have a stack frame, and if | ||
310 | * done by calling the "clone()" system call directly, you | ||
311 | * do not have enough call-clobbered registers to hold all | ||
312 | * the information you need. | ||
313 | */ | ||
314 | asmlinkage int sys_vfork(unsigned long r0, unsigned long r1, unsigned long r2, | ||
315 | unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, | ||
316 | struct pt_regs regs) | ||
317 | { | ||
318 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.spu, ®s, 0, | ||
319 | NULL, NULL); | ||
320 | } | ||
321 | |||
322 | /* | ||
323 | * sys_execve() executes a new program. | ||
324 | */ | ||
325 | asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv, | ||
326 | char __user * __user *uenvp, | ||
327 | unsigned long r3, unsigned long r4, unsigned long r5, | ||
328 | unsigned long r6, struct pt_regs regs) | ||
329 | { | ||
330 | int error; | ||
331 | char *filename; | ||
332 | |||
333 | filename = getname(ufilename); | ||
334 | error = PTR_ERR(filename); | ||
335 | if (IS_ERR(filename)) | ||
336 | goto out; | ||
337 | |||
338 | error = do_execve(filename, uargv, uenvp, ®s); | ||
339 | if (error == 0) { | ||
340 | task_lock(current); | ||
341 | current->ptrace &= ~PT_DTRACE; | ||
342 | task_unlock(current); | ||
343 | } | ||
344 | putname(filename); | ||
345 | out: | ||
346 | return error; | ||
347 | } | ||
348 | |||
349 | /* | ||
350 | * These bracket the sleeping functions.. | ||
351 | */ | ||
352 | #define first_sched ((unsigned long) scheduling_functions_start_here) | ||
353 | #define last_sched ((unsigned long) scheduling_functions_end_here) | ||
354 | |||
355 | unsigned long get_wchan(struct task_struct *p) | ||
356 | { | ||
357 | /* M32R_FIXME */ | ||
358 | return (0); | ||
359 | } | ||
diff --git a/arch/m32r/kernel/ptrace.c b/arch/m32r/kernel/ptrace.c new file mode 100644 index 000000000000..8b40f362dd6f --- /dev/null +++ b/arch/m32r/kernel/ptrace.c | |||
@@ -0,0 +1,829 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/ptrace.c | ||
3 | * | ||
4 | * Copyright (C) 2002 Hirokazu Takata, Takeo Takahashi | ||
5 | * Copyright (C) 2004 Hirokazu Takata, Kei Sakamoto | ||
6 | * | ||
7 | * Original x86 implementation: | ||
8 | * By Ross Biro 1/23/92 | ||
9 | * edited by Linus Torvalds | ||
10 | * | ||
11 | * Some code taken from sh version: | ||
12 | * Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka | ||
13 | * Some code taken from arm version: | ||
14 | * Copyright (C) 2000 Russell King | ||
15 | */ | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/sched.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <linux/smp.h> | ||
22 | #include <linux/smp_lock.h> | ||
23 | #include <linux/errno.h> | ||
24 | #include <linux/ptrace.h> | ||
25 | #include <linux/user.h> | ||
26 | #include <linux/string.h> | ||
27 | |||
28 | #include <asm/cacheflush.h> | ||
29 | #include <asm/io.h> | ||
30 | #include <asm/uaccess.h> | ||
31 | #include <asm/pgtable.h> | ||
32 | #include <asm/system.h> | ||
33 | #include <asm/processor.h> | ||
34 | #include <asm/mmu_context.h> | ||
35 | |||
36 | /* | ||
37 | * Get the address of the live pt_regs for the specified task. | ||
38 | * These are saved onto the top kernel stack when the process | ||
39 | * is not running. | ||
40 | * | ||
41 | * Note: if a user thread is execve'd from kernel space, the | ||
42 | * kernel stack will not be empty on entry to the kernel, so | ||
43 | * ptracing these tasks will fail. | ||
44 | */ | ||
45 | static inline struct pt_regs * | ||
46 | get_user_regs(struct task_struct *task) | ||
47 | { | ||
48 | return (struct pt_regs *) | ||
49 | ((unsigned long)task->thread_info + THREAD_SIZE | ||
50 | - sizeof(struct pt_regs)); | ||
51 | } | ||
52 | |||
53 | /* | ||
54 | * This routine will get a word off of the process kernel stack. | ||
55 | */ | ||
56 | static inline unsigned long int | ||
57 | get_stack_long(struct task_struct *task, int offset) | ||
58 | { | ||
59 | unsigned long *stack; | ||
60 | |||
61 | stack = (unsigned long *)get_user_regs(task); | ||
62 | |||
63 | return stack[offset]; | ||
64 | } | ||
65 | |||
66 | /* | ||
67 | * This routine will put a word on the process kernel stack. | ||
68 | */ | ||
69 | static inline int | ||
70 | put_stack_long(struct task_struct *task, int offset, unsigned long data) | ||
71 | { | ||
72 | unsigned long *stack; | ||
73 | |||
74 | stack = (unsigned long *)get_user_regs(task); | ||
75 | stack[offset] = data; | ||
76 | |||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static int reg_offset[] = { | ||
81 | PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5, PT_R6, PT_R7, | ||
82 | PT_R8, PT_R9, PT_R10, PT_R11, PT_R12, PT_FP, PT_LR, PT_SPU, | ||
83 | }; | ||
84 | |||
85 | /* | ||
86 | * Read the word at offset "off" into the "struct user". We | ||
87 | * actually access the pt_regs stored on the kernel stack. | ||
88 | */ | ||
89 | static int ptrace_read_user(struct task_struct *tsk, unsigned long off, | ||
90 | unsigned long __user *data) | ||
91 | { | ||
92 | unsigned long tmp; | ||
93 | #ifndef NO_FPU | ||
94 | struct user * dummy = NULL; | ||
95 | #endif | ||
96 | |||
97 | if ((off & 3) || (off < 0) || (off > sizeof(struct user) - 3)) | ||
98 | return -EIO; | ||
99 | |||
100 | off >>= 2; | ||
101 | switch (off) { | ||
102 | case PT_EVB: | ||
103 | __asm__ __volatile__ ( | ||
104 | "mvfc %0, cr5 \n\t" | ||
105 | : "=r" (tmp) | ||
106 | ); | ||
107 | break; | ||
108 | case PT_CBR: { | ||
109 | unsigned long psw; | ||
110 | psw = get_stack_long(tsk, PT_PSW); | ||
111 | tmp = ((psw >> 8) & 1); | ||
112 | } | ||
113 | break; | ||
114 | case PT_PSW: { | ||
115 | unsigned long psw, bbpsw; | ||
116 | psw = get_stack_long(tsk, PT_PSW); | ||
117 | bbpsw = get_stack_long(tsk, PT_BBPSW); | ||
118 | tmp = ((psw >> 8) & 0xff) | ((bbpsw & 0xff) << 8); | ||
119 | } | ||
120 | break; | ||
121 | case PT_PC: | ||
122 | tmp = get_stack_long(tsk, PT_BPC); | ||
123 | break; | ||
124 | case PT_BPC: | ||
125 | off = PT_BBPC; | ||
126 | /* fall through */ | ||
127 | default: | ||
128 | if (off < (sizeof(struct pt_regs) >> 2)) | ||
129 | tmp = get_stack_long(tsk, off); | ||
130 | #ifndef NO_FPU | ||
131 | else if (off >= (long)(&dummy->fpu >> 2) && | ||
132 | off < (long)(&dummy->u_fpvalid >> 2)) { | ||
133 | if (!tsk_used_math(tsk)) { | ||
134 | if (off == (long)(&dummy->fpu.fpscr >> 2)) | ||
135 | tmp = FPSCR_INIT; | ||
136 | else | ||
137 | tmp = 0; | ||
138 | } else | ||
139 | tmp = ((long *)(&tsk->thread.fpu >> 2)) | ||
140 | [off - (long)&dummy->fpu]; | ||
141 | } else if (off == (long)(&dummy->u_fpvalid >> 2)) | ||
142 | tmp = !!tsk_used_math(tsk); | ||
143 | #endif /* not NO_FPU */ | ||
144 | else | ||
145 | tmp = 0; | ||
146 | } | ||
147 | |||
148 | return put_user(tmp, data); | ||
149 | } | ||
150 | |||
151 | static int ptrace_write_user(struct task_struct *tsk, unsigned long off, | ||
152 | unsigned long data) | ||
153 | { | ||
154 | int ret = -EIO; | ||
155 | #ifndef NO_FPU | ||
156 | struct user * dummy = NULL; | ||
157 | #endif | ||
158 | |||
159 | if ((off & 3) || off < 0 || | ||
160 | off > sizeof(struct user) - 3) | ||
161 | return -EIO; | ||
162 | |||
163 | off >>= 2; | ||
164 | switch (off) { | ||
165 | case PT_EVB: | ||
166 | case PT_BPC: | ||
167 | case PT_SPI: | ||
168 | /* We don't allow to modify evb. */ | ||
169 | ret = 0; | ||
170 | break; | ||
171 | case PT_PSW: | ||
172 | case PT_CBR: { | ||
173 | /* We allow to modify only cbr in psw */ | ||
174 | unsigned long psw; | ||
175 | psw = get_stack_long(tsk, PT_PSW); | ||
176 | psw = (psw & ~0x100) | ((data & 1) << 8); | ||
177 | ret = put_stack_long(tsk, PT_PSW, psw); | ||
178 | } | ||
179 | break; | ||
180 | case PT_PC: | ||
181 | off = PT_BPC; | ||
182 | data &= ~1; | ||
183 | /* fall through */ | ||
184 | default: | ||
185 | if (off < (sizeof(struct pt_regs) >> 2)) | ||
186 | ret = put_stack_long(tsk, off, data); | ||
187 | #ifndef NO_FPU | ||
188 | else if (off >= (long)(&dummy->fpu >> 2) && | ||
189 | off < (long)(&dummy->u_fpvalid >> 2)) { | ||
190 | set_stopped_child_used_math(tsk); | ||
191 | ((long *)&tsk->thread.fpu) | ||
192 | [off - (long)&dummy->fpu] = data; | ||
193 | ret = 0; | ||
194 | } else if (off == (long)(&dummy->u_fpvalid >> 2)) { | ||
195 | conditional_stopped_child_used_math(data, tsk); | ||
196 | ret = 0; | ||
197 | } | ||
198 | #endif /* not NO_FPU */ | ||
199 | break; | ||
200 | } | ||
201 | |||
202 | return ret; | ||
203 | } | ||
204 | |||
205 | /* | ||
206 | * Get all user integer registers. | ||
207 | */ | ||
208 | static int ptrace_getregs(struct task_struct *tsk, void __user *uregs) | ||
209 | { | ||
210 | struct pt_regs *regs = get_user_regs(tsk); | ||
211 | |||
212 | return copy_to_user(uregs, regs, sizeof(struct pt_regs)) ? -EFAULT : 0; | ||
213 | } | ||
214 | |||
215 | /* | ||
216 | * Set all user integer registers. | ||
217 | */ | ||
218 | static int ptrace_setregs(struct task_struct *tsk, void __user *uregs) | ||
219 | { | ||
220 | struct pt_regs newregs; | ||
221 | int ret; | ||
222 | |||
223 | ret = -EFAULT; | ||
224 | if (copy_from_user(&newregs, uregs, sizeof(struct pt_regs)) == 0) { | ||
225 | struct pt_regs *regs = get_user_regs(tsk); | ||
226 | *regs = newregs; | ||
227 | ret = 0; | ||
228 | } | ||
229 | |||
230 | return ret; | ||
231 | } | ||
232 | |||
233 | |||
234 | static inline int | ||
235 | check_condition_bit(struct task_struct *child) | ||
236 | { | ||
237 | return (int)((get_stack_long(child, PT_PSW) >> 8) & 1); | ||
238 | } | ||
239 | |||
240 | static int | ||
241 | check_condition_src(unsigned long op, unsigned long regno1, | ||
242 | unsigned long regno2, struct task_struct *child) | ||
243 | { | ||
244 | unsigned long reg1, reg2; | ||
245 | |||
246 | reg2 = get_stack_long(child, reg_offset[regno2]); | ||
247 | |||
248 | switch (op) { | ||
249 | case 0x0: /* BEQ */ | ||
250 | reg1 = get_stack_long(child, reg_offset[regno1]); | ||
251 | return reg1 == reg2; | ||
252 | case 0x1: /* BNE */ | ||
253 | reg1 = get_stack_long(child, reg_offset[regno1]); | ||
254 | return reg1 != reg2; | ||
255 | case 0x8: /* BEQZ */ | ||
256 | return reg2 == 0; | ||
257 | case 0x9: /* BNEZ */ | ||
258 | return reg2 != 0; | ||
259 | case 0xa: /* BLTZ */ | ||
260 | return (int)reg2 < 0; | ||
261 | case 0xb: /* BGEZ */ | ||
262 | return (int)reg2 >= 0; | ||
263 | case 0xc: /* BLEZ */ | ||
264 | return (int)reg2 <= 0; | ||
265 | case 0xd: /* BGTZ */ | ||
266 | return (int)reg2 > 0; | ||
267 | default: | ||
268 | /* never reached */ | ||
269 | return 0; | ||
270 | } | ||
271 | } | ||
272 | |||
273 | static void | ||
274 | compute_next_pc_for_16bit_insn(unsigned long insn, unsigned long pc, | ||
275 | unsigned long *next_pc, | ||
276 | struct task_struct *child) | ||
277 | { | ||
278 | unsigned long op, op2, op3; | ||
279 | unsigned long disp; | ||
280 | unsigned long regno; | ||
281 | int parallel = 0; | ||
282 | |||
283 | if (insn & 0x00008000) | ||
284 | parallel = 1; | ||
285 | if (pc & 3) | ||
286 | insn &= 0x7fff; /* right slot */ | ||
287 | else | ||
288 | insn >>= 16; /* left slot */ | ||
289 | |||
290 | op = (insn >> 12) & 0xf; | ||
291 | op2 = (insn >> 8) & 0xf; | ||
292 | op3 = (insn >> 4) & 0xf; | ||
293 | |||
294 | if (op == 0x7) { | ||
295 | switch (op2) { | ||
296 | case 0xd: /* BNC */ | ||
297 | case 0x9: /* BNCL */ | ||
298 | if (!check_condition_bit(child)) { | ||
299 | disp = (long)(insn << 24) >> 22; | ||
300 | *next_pc = (pc & ~0x3) + disp; | ||
301 | return; | ||
302 | } | ||
303 | break; | ||
304 | case 0x8: /* BCL */ | ||
305 | case 0xc: /* BC */ | ||
306 | if (check_condition_bit(child)) { | ||
307 | disp = (long)(insn << 24) >> 22; | ||
308 | *next_pc = (pc & ~0x3) + disp; | ||
309 | return; | ||
310 | } | ||
311 | break; | ||
312 | case 0xe: /* BL */ | ||
313 | case 0xf: /* BRA */ | ||
314 | disp = (long)(insn << 24) >> 22; | ||
315 | *next_pc = (pc & ~0x3) + disp; | ||
316 | return; | ||
317 | break; | ||
318 | } | ||
319 | } else if (op == 0x1) { | ||
320 | switch (op2) { | ||
321 | case 0x0: | ||
322 | if (op3 == 0xf) { /* TRAP */ | ||
323 | #if 1 | ||
324 | /* pass through */ | ||
325 | #else | ||
326 | /* kernel space is not allowed as next_pc */ | ||
327 | unsigned long evb; | ||
328 | unsigned long trapno; | ||
329 | trapno = insn & 0xf; | ||
330 | __asm__ __volatile__ ( | ||
331 | "mvfc %0, cr5\n" | ||
332 | :"=r"(evb) | ||
333 | : | ||
334 | ); | ||
335 | *next_pc = evb + (trapno << 2); | ||
336 | return; | ||
337 | #endif | ||
338 | } else if (op3 == 0xd) { /* RTE */ | ||
339 | *next_pc = get_stack_long(child, PT_BPC); | ||
340 | return; | ||
341 | } | ||
342 | break; | ||
343 | case 0xc: /* JC */ | ||
344 | if (op3 == 0xc && check_condition_bit(child)) { | ||
345 | regno = insn & 0xf; | ||
346 | *next_pc = get_stack_long(child, | ||
347 | reg_offset[regno]); | ||
348 | return; | ||
349 | } | ||
350 | break; | ||
351 | case 0xd: /* JNC */ | ||
352 | if (op3 == 0xc && !check_condition_bit(child)) { | ||
353 | regno = insn & 0xf; | ||
354 | *next_pc = get_stack_long(child, | ||
355 | reg_offset[regno]); | ||
356 | return; | ||
357 | } | ||
358 | break; | ||
359 | case 0xe: /* JL */ | ||
360 | case 0xf: /* JMP */ | ||
361 | if (op3 == 0xc) { /* JMP */ | ||
362 | regno = insn & 0xf; | ||
363 | *next_pc = get_stack_long(child, | ||
364 | reg_offset[regno]); | ||
365 | return; | ||
366 | } | ||
367 | break; | ||
368 | } | ||
369 | } | ||
370 | if (parallel) | ||
371 | *next_pc = pc + 4; | ||
372 | else | ||
373 | *next_pc = pc + 2; | ||
374 | } | ||
375 | |||
376 | static void | ||
377 | compute_next_pc_for_32bit_insn(unsigned long insn, unsigned long pc, | ||
378 | unsigned long *next_pc, | ||
379 | struct task_struct *child) | ||
380 | { | ||
381 | unsigned long op; | ||
382 | unsigned long op2; | ||
383 | unsigned long disp; | ||
384 | unsigned long regno1, regno2; | ||
385 | |||
386 | op = (insn >> 28) & 0xf; | ||
387 | if (op == 0xf) { /* branch 24-bit relative */ | ||
388 | op2 = (insn >> 24) & 0xf; | ||
389 | switch (op2) { | ||
390 | case 0xd: /* BNC */ | ||
391 | case 0x9: /* BNCL */ | ||
392 | if (!check_condition_bit(child)) { | ||
393 | disp = (long)(insn << 8) >> 6; | ||
394 | *next_pc = (pc & ~0x3) + disp; | ||
395 | return; | ||
396 | } | ||
397 | break; | ||
398 | case 0x8: /* BCL */ | ||
399 | case 0xc: /* BC */ | ||
400 | if (check_condition_bit(child)) { | ||
401 | disp = (long)(insn << 8) >> 6; | ||
402 | *next_pc = (pc & ~0x3) + disp; | ||
403 | return; | ||
404 | } | ||
405 | break; | ||
406 | case 0xe: /* BL */ | ||
407 | case 0xf: /* BRA */ | ||
408 | disp = (long)(insn << 8) >> 6; | ||
409 | *next_pc = (pc & ~0x3) + disp; | ||
410 | return; | ||
411 | } | ||
412 | } else if (op == 0xb) { /* branch 16-bit relative */ | ||
413 | op2 = (insn >> 20) & 0xf; | ||
414 | switch (op2) { | ||
415 | case 0x0: /* BEQ */ | ||
416 | case 0x1: /* BNE */ | ||
417 | case 0x8: /* BEQZ */ | ||
418 | case 0x9: /* BNEZ */ | ||
419 | case 0xa: /* BLTZ */ | ||
420 | case 0xb: /* BGEZ */ | ||
421 | case 0xc: /* BLEZ */ | ||
422 | case 0xd: /* BGTZ */ | ||
423 | regno1 = ((insn >> 24) & 0xf); | ||
424 | regno2 = ((insn >> 16) & 0xf); | ||
425 | if (check_condition_src(op2, regno1, regno2, child)) { | ||
426 | disp = (long)(insn << 16) >> 14; | ||
427 | *next_pc = (pc & ~0x3) + disp; | ||
428 | return; | ||
429 | } | ||
430 | break; | ||
431 | } | ||
432 | } | ||
433 | *next_pc = pc + 4; | ||
434 | } | ||
435 | |||
436 | static inline void | ||
437 | compute_next_pc(unsigned long insn, unsigned long pc, | ||
438 | unsigned long *next_pc, struct task_struct *child) | ||
439 | { | ||
440 | if (insn & 0x80000000) | ||
441 | compute_next_pc_for_32bit_insn(insn, pc, next_pc, child); | ||
442 | else | ||
443 | compute_next_pc_for_16bit_insn(insn, pc, next_pc, child); | ||
444 | } | ||
445 | |||
446 | static int | ||
447 | register_debug_trap(struct task_struct *child, unsigned long next_pc, | ||
448 | unsigned long next_insn, unsigned long *code) | ||
449 | { | ||
450 | struct debug_trap *p = &child->thread.debug_trap; | ||
451 | unsigned long addr = next_pc & ~3; | ||
452 | |||
453 | if (p->nr_trap == MAX_TRAPS) { | ||
454 | printk("kernel BUG at %s %d: p->nr_trap = %d\n", | ||
455 | __FILE__, __LINE__, p->nr_trap); | ||
456 | return -1; | ||
457 | } | ||
458 | p->addr[p->nr_trap] = addr; | ||
459 | p->insn[p->nr_trap] = next_insn; | ||
460 | p->nr_trap++; | ||
461 | if (next_pc & 3) { | ||
462 | *code = (next_insn & 0xffff0000) | 0x10f1; | ||
463 | /* xxx --> TRAP1 */ | ||
464 | } else { | ||
465 | if ((next_insn & 0x80000000) || (next_insn & 0x8000)) { | ||
466 | *code = 0x10f17000; | ||
467 | /* TRAP1 --> NOP */ | ||
468 | } else { | ||
469 | *code = (next_insn & 0xffff) | 0x10f10000; | ||
470 | /* TRAP1 --> xxx */ | ||
471 | } | ||
472 | } | ||
473 | return 0; | ||
474 | } | ||
475 | |||
476 | static int | ||
477 | unregister_debug_trap(struct task_struct *child, unsigned long addr, | ||
478 | unsigned long *code) | ||
479 | { | ||
480 | struct debug_trap *p = &child->thread.debug_trap; | ||
481 | int i; | ||
482 | |||
483 | /* Search debug trap entry. */ | ||
484 | for (i = 0; i < p->nr_trap; i++) { | ||
485 | if (p->addr[i] == addr) | ||
486 | break; | ||
487 | } | ||
488 | if (i >= p->nr_trap) { | ||
489 | /* The trap may be requested from debugger. | ||
490 | * ptrace should do nothing in this case. | ||
491 | */ | ||
492 | return 0; | ||
493 | } | ||
494 | |||
495 | /* Recover orignal instruction code. */ | ||
496 | *code = p->insn[i]; | ||
497 | |||
498 | /* Shift debug trap entries. */ | ||
499 | while (i < p->nr_trap - 1) { | ||
500 | p->insn[i] = p->insn[i + 1]; | ||
501 | p->addr[i] = p->addr[i + 1]; | ||
502 | i++; | ||
503 | } | ||
504 | p->nr_trap--; | ||
505 | return 1; | ||
506 | } | ||
507 | |||
508 | static void | ||
509 | unregister_all_debug_traps(struct task_struct *child) | ||
510 | { | ||
511 | struct debug_trap *p = &child->thread.debug_trap; | ||
512 | int i; | ||
513 | |||
514 | for (i = 0; i < p->nr_trap; i++) | ||
515 | access_process_vm(child, p->addr[i], &p->insn[i], sizeof(p->insn[i]), 1); | ||
516 | p->nr_trap = 0; | ||
517 | } | ||
518 | |||
519 | static inline void | ||
520 | invalidate_cache(void) | ||
521 | { | ||
522 | #if defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_OPSP) | ||
523 | |||
524 | _flush_cache_copyback_all(); | ||
525 | |||
526 | #else /* ! CONFIG_CHIP_M32700 */ | ||
527 | |||
528 | /* Invalidate cache */ | ||
529 | __asm__ __volatile__ ( | ||
530 | "ldi r0, #-1 \n\t" | ||
531 | "ldi r1, #0 \n\t" | ||
532 | "stb r1, @r0 ; cache off \n\t" | ||
533 | "; \n\t" | ||
534 | "ldi r0, #-2 \n\t" | ||
535 | "ldi r1, #1 \n\t" | ||
536 | "stb r1, @r0 ; cache invalidate \n\t" | ||
537 | ".fillinsn \n" | ||
538 | "0: \n\t" | ||
539 | "ldb r1, @r0 ; invalidate check \n\t" | ||
540 | "bnez r1, 0b \n\t" | ||
541 | "; \n\t" | ||
542 | "ldi r0, #-1 \n\t" | ||
543 | "ldi r1, #1 \n\t" | ||
544 | "stb r1, @r0 ; cache on \n\t" | ||
545 | : : : "r0", "r1", "memory" | ||
546 | ); | ||
547 | /* FIXME: copying-back d-cache and invalidating i-cache are needed. | ||
548 | */ | ||
549 | #endif /* CONFIG_CHIP_M32700 */ | ||
550 | } | ||
551 | |||
552 | /* Embed a debug trap (TRAP1) code */ | ||
553 | static int | ||
554 | embed_debug_trap(struct task_struct *child, unsigned long next_pc) | ||
555 | { | ||
556 | unsigned long next_insn, code; | ||
557 | unsigned long addr = next_pc & ~3; | ||
558 | |||
559 | if (access_process_vm(child, addr, &next_insn, sizeof(next_insn), 0) | ||
560 | != sizeof(next_insn)) { | ||
561 | return -1; /* error */ | ||
562 | } | ||
563 | |||
564 | /* Set a trap code. */ | ||
565 | if (register_debug_trap(child, next_pc, next_insn, &code)) { | ||
566 | return -1; /* error */ | ||
567 | } | ||
568 | if (access_process_vm(child, addr, &code, sizeof(code), 1) | ||
569 | != sizeof(code)) { | ||
570 | return -1; /* error */ | ||
571 | } | ||
572 | return 0; /* success */ | ||
573 | } | ||
574 | |||
575 | void | ||
576 | withdraw_debug_trap(struct pt_regs *regs) | ||
577 | { | ||
578 | unsigned long addr; | ||
579 | unsigned long code; | ||
580 | |||
581 | addr = (regs->bpc - 2) & ~3; | ||
582 | regs->bpc -= 2; | ||
583 | if (unregister_debug_trap(current, addr, &code)) { | ||
584 | access_process_vm(current, addr, &code, sizeof(code), 1); | ||
585 | invalidate_cache(); | ||
586 | } | ||
587 | } | ||
588 | |||
589 | static void | ||
590 | init_debug_traps(struct task_struct *child) | ||
591 | { | ||
592 | struct debug_trap *p = &child->thread.debug_trap; | ||
593 | int i; | ||
594 | p->nr_trap = 0; | ||
595 | for (i = 0; i < MAX_TRAPS; i++) { | ||
596 | p->addr[i] = 0; | ||
597 | p->insn[i] = 0; | ||
598 | } | ||
599 | } | ||
600 | |||
601 | |||
602 | /* | ||
603 | * Called by kernel/ptrace.c when detaching.. | ||
604 | * | ||
605 | * Make sure single step bits etc are not set. | ||
606 | */ | ||
607 | void ptrace_disable(struct task_struct *child) | ||
608 | { | ||
609 | /* nothing to do.. */ | ||
610 | } | ||
611 | |||
612 | static int | ||
613 | do_ptrace(long request, struct task_struct *child, long addr, long data) | ||
614 | { | ||
615 | unsigned long tmp; | ||
616 | int ret; | ||
617 | |||
618 | switch (request) { | ||
619 | /* | ||
620 | * read word at location "addr" in the child process. | ||
621 | */ | ||
622 | case PTRACE_PEEKTEXT: | ||
623 | case PTRACE_PEEKDATA: | ||
624 | ret = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); | ||
625 | if (ret == sizeof(tmp)) | ||
626 | ret = put_user(tmp,(unsigned long __user *) data); | ||
627 | else | ||
628 | ret = -EIO; | ||
629 | break; | ||
630 | |||
631 | /* | ||
632 | * read the word at location addr in the USER area. | ||
633 | */ | ||
634 | case PTRACE_PEEKUSR: | ||
635 | ret = ptrace_read_user(child, addr, | ||
636 | (unsigned long __user *)data); | ||
637 | break; | ||
638 | |||
639 | /* | ||
640 | * write the word at location addr. | ||
641 | */ | ||
642 | case PTRACE_POKETEXT: | ||
643 | case PTRACE_POKEDATA: | ||
644 | ret = access_process_vm(child, addr, &data, sizeof(data), 1); | ||
645 | if (ret == sizeof(data)) { | ||
646 | ret = 0; | ||
647 | if (request == PTRACE_POKETEXT) { | ||
648 | invalidate_cache(); | ||
649 | } | ||
650 | } else { | ||
651 | ret = -EIO; | ||
652 | } | ||
653 | break; | ||
654 | |||
655 | /* | ||
656 | * write the word at location addr in the USER area. | ||
657 | */ | ||
658 | case PTRACE_POKEUSR: | ||
659 | ret = ptrace_write_user(child, addr, data); | ||
660 | break; | ||
661 | |||
662 | /* | ||
663 | * continue/restart and stop at next (return from) syscall | ||
664 | */ | ||
665 | case PTRACE_SYSCALL: | ||
666 | case PTRACE_CONT: | ||
667 | ret = -EIO; | ||
668 | if ((unsigned long) data > _NSIG) | ||
669 | break; | ||
670 | if (request == PTRACE_SYSCALL) | ||
671 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
672 | else | ||
673 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
674 | child->exit_code = data; | ||
675 | wake_up_process(child); | ||
676 | ret = 0; | ||
677 | break; | ||
678 | |||
679 | /* | ||
680 | * make the child exit. Best I can do is send it a sigkill. | ||
681 | * perhaps it should be put in the status that it wants to | ||
682 | * exit. | ||
683 | */ | ||
684 | case PTRACE_KILL: { | ||
685 | ret = 0; | ||
686 | unregister_all_debug_traps(child); | ||
687 | invalidate_cache(); | ||
688 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ | ||
689 | break; | ||
690 | child->exit_code = SIGKILL; | ||
691 | wake_up_process(child); | ||
692 | break; | ||
693 | } | ||
694 | |||
695 | /* | ||
696 | * execute single instruction. | ||
697 | */ | ||
698 | case PTRACE_SINGLESTEP: { | ||
699 | unsigned long next_pc; | ||
700 | unsigned long pc, insn; | ||
701 | |||
702 | ret = -EIO; | ||
703 | if ((unsigned long) data > _NSIG) | ||
704 | break; | ||
705 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
706 | if ((child->ptrace & PT_DTRACE) == 0) { | ||
707 | /* Spurious delayed TF traps may occur */ | ||
708 | child->ptrace |= PT_DTRACE; | ||
709 | } | ||
710 | |||
711 | /* Compute next pc. */ | ||
712 | pc = get_stack_long(child, PT_BPC); | ||
713 | |||
714 | if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) | ||
715 | != sizeof(insn)) | ||
716 | break; | ||
717 | |||
718 | compute_next_pc(insn, pc, &next_pc, child); | ||
719 | if (next_pc & 0x80000000) | ||
720 | break; | ||
721 | |||
722 | if (embed_debug_trap(child, next_pc)) | ||
723 | break; | ||
724 | |||
725 | invalidate_cache(); | ||
726 | child->exit_code = data; | ||
727 | |||
728 | /* give it a chance to run. */ | ||
729 | wake_up_process(child); | ||
730 | ret = 0; | ||
731 | break; | ||
732 | } | ||
733 | |||
734 | /* | ||
735 | * detach a process that was attached. | ||
736 | */ | ||
737 | case PTRACE_DETACH: | ||
738 | ret = 0; | ||
739 | ret = ptrace_detach(child, data); | ||
740 | break; | ||
741 | |||
742 | case PTRACE_GETREGS: | ||
743 | ret = ptrace_getregs(child, (void __user *)data); | ||
744 | break; | ||
745 | |||
746 | case PTRACE_SETREGS: | ||
747 | ret = ptrace_setregs(child, (void __user *)data); | ||
748 | break; | ||
749 | |||
750 | default: | ||
751 | ret = ptrace_request(child, request, addr, data); | ||
752 | break; | ||
753 | } | ||
754 | |||
755 | return ret; | ||
756 | } | ||
757 | |||
758 | asmlinkage int sys_ptrace(long request, long pid, long addr, long data) | ||
759 | { | ||
760 | struct task_struct *child; | ||
761 | int ret; | ||
762 | |||
763 | lock_kernel(); | ||
764 | ret = -EPERM; | ||
765 | if (request == PTRACE_TRACEME) { | ||
766 | /* are we already being traced? */ | ||
767 | if (current->ptrace & PT_PTRACED) | ||
768 | goto out; | ||
769 | /* set the ptrace bit in the process flags. */ | ||
770 | current->ptrace |= PT_PTRACED; | ||
771 | ret = 0; | ||
772 | goto out; | ||
773 | } | ||
774 | ret = -ESRCH; | ||
775 | read_lock(&tasklist_lock); | ||
776 | child = find_task_by_pid(pid); | ||
777 | if (child) | ||
778 | get_task_struct(child); | ||
779 | read_unlock(&tasklist_lock); | ||
780 | if (!child) | ||
781 | goto out; | ||
782 | |||
783 | ret = -EPERM; | ||
784 | if (pid == 1) /* you may not mess with init */ | ||
785 | goto out; | ||
786 | |||
787 | if (request == PTRACE_ATTACH) { | ||
788 | ret = ptrace_attach(child); | ||
789 | if (ret == 0) | ||
790 | init_debug_traps(child); | ||
791 | goto out_tsk; | ||
792 | } | ||
793 | |||
794 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | ||
795 | if (ret == 0) | ||
796 | ret = do_ptrace(request, child, addr, data); | ||
797 | |||
798 | out_tsk: | ||
799 | put_task_struct(child); | ||
800 | out: | ||
801 | unlock_kernel(); | ||
802 | |||
803 | return ret; | ||
804 | } | ||
805 | |||
806 | /* notification of system call entry/exit | ||
807 | * - triggered by current->work.syscall_trace | ||
808 | */ | ||
809 | void do_syscall_trace(void) | ||
810 | { | ||
811 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | ||
812 | return; | ||
813 | if (!(current->ptrace & PT_PTRACED)) | ||
814 | return; | ||
815 | /* the 0x80 provides a way for the tracing parent to distinguish | ||
816 | between a syscall stop and SIGTRAP delivery */ | ||
817 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | ||
818 | ? 0x80 : 0)); | ||
819 | |||
820 | /* | ||
821 | * this isn't the same as continuing with a signal, but it will do | ||
822 | * for normal use. strace only continues with a signal if the | ||
823 | * stopping signal is not SIGTRAP. -brl | ||
824 | */ | ||
825 | if (current->exit_code) { | ||
826 | send_sig(current->exit_code, current, 1); | ||
827 | current->exit_code = 0; | ||
828 | } | ||
829 | } | ||
diff --git a/arch/m32r/kernel/semaphore.c b/arch/m32r/kernel/semaphore.c new file mode 100644 index 000000000000..9a6e6d754ddc --- /dev/null +++ b/arch/m32r/kernel/semaphore.c | |||
@@ -0,0 +1,186 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/semaphore.c | ||
3 | * orig : i386 2.6.4 | ||
4 | * | ||
5 | * M32R semaphore implementation. | ||
6 | * | ||
7 | * Copyright (c) 2002 - 2004 Hitoshi Yamamoto | ||
8 | */ | ||
9 | |||
10 | /* | ||
11 | * i386 semaphore implementation. | ||
12 | * | ||
13 | * (C) Copyright 1999 Linus Torvalds | ||
14 | * | ||
15 | * Portions Copyright 1999 Red Hat, Inc. | ||
16 | * | ||
17 | * This program is free software; you can redistribute it and/or | ||
18 | * modify it under the terms of the GNU General Public License | ||
19 | * as published by the Free Software Foundation; either version | ||
20 | * 2 of the License, or (at your option) any later version. | ||
21 | * | ||
22 | * rw semaphores implemented November 1999 by Benjamin LaHaise <bcrl@kvack.org> | ||
23 | */ | ||
24 | #include <linux/config.h> | ||
25 | #include <linux/sched.h> | ||
26 | #include <linux/err.h> | ||
27 | #include <linux/init.h> | ||
28 | #include <asm/semaphore.h> | ||
29 | |||
30 | /* | ||
31 | * Semaphores are implemented using a two-way counter: | ||
32 | * The "count" variable is decremented for each process | ||
33 | * that tries to acquire the semaphore, while the "sleeping" | ||
34 | * variable is a count of such acquires. | ||
35 | * | ||
36 | * Notably, the inline "up()" and "down()" functions can | ||
37 | * efficiently test if they need to do any extra work (up | ||
38 | * needs to do something only if count was negative before | ||
39 | * the increment operation. | ||
40 | * | ||
41 | * "sleeping" and the contention routine ordering is protected | ||
42 | * by the spinlock in the semaphore's waitqueue head. | ||
43 | * | ||
44 | * Note that these functions are only called when there is | ||
45 | * contention on the lock, and as such all this is the | ||
46 | * "non-critical" part of the whole semaphore business. The | ||
47 | * critical part is the inline stuff in <asm/semaphore.h> | ||
48 | * where we want to avoid any extra jumps and calls. | ||
49 | */ | ||
50 | |||
51 | /* | ||
52 | * Logic: | ||
53 | * - only on a boundary condition do we need to care. When we go | ||
54 | * from a negative count to a non-negative, we wake people up. | ||
55 | * - when we go from a non-negative count to a negative do we | ||
56 | * (a) synchronize with the "sleeper" count and (b) make sure | ||
57 | * that we're on the wakeup list before we synchronize so that | ||
58 | * we cannot lose wakeup events. | ||
59 | */ | ||
60 | |||
61 | asmlinkage void __up(struct semaphore *sem) | ||
62 | { | ||
63 | wake_up(&sem->wait); | ||
64 | } | ||
65 | |||
66 | asmlinkage void __sched __down(struct semaphore * sem) | ||
67 | { | ||
68 | struct task_struct *tsk = current; | ||
69 | DECLARE_WAITQUEUE(wait, tsk); | ||
70 | unsigned long flags; | ||
71 | |||
72 | tsk->state = TASK_UNINTERRUPTIBLE; | ||
73 | spin_lock_irqsave(&sem->wait.lock, flags); | ||
74 | add_wait_queue_exclusive_locked(&sem->wait, &wait); | ||
75 | |||
76 | sem->sleepers++; | ||
77 | for (;;) { | ||
78 | int sleepers = sem->sleepers; | ||
79 | |||
80 | /* | ||
81 | * Add "everybody else" into it. They aren't | ||
82 | * playing, because we own the spinlock in | ||
83 | * the wait_queue_head. | ||
84 | */ | ||
85 | if (!atomic_add_negative(sleepers - 1, &sem->count)) { | ||
86 | sem->sleepers = 0; | ||
87 | break; | ||
88 | } | ||
89 | sem->sleepers = 1; /* us - see -1 above */ | ||
90 | spin_unlock_irqrestore(&sem->wait.lock, flags); | ||
91 | |||
92 | schedule(); | ||
93 | |||
94 | spin_lock_irqsave(&sem->wait.lock, flags); | ||
95 | tsk->state = TASK_UNINTERRUPTIBLE; | ||
96 | } | ||
97 | remove_wait_queue_locked(&sem->wait, &wait); | ||
98 | wake_up_locked(&sem->wait); | ||
99 | spin_unlock_irqrestore(&sem->wait.lock, flags); | ||
100 | tsk->state = TASK_RUNNING; | ||
101 | } | ||
102 | |||
103 | asmlinkage int __sched __down_interruptible(struct semaphore * sem) | ||
104 | { | ||
105 | int retval = 0; | ||
106 | struct task_struct *tsk = current; | ||
107 | DECLARE_WAITQUEUE(wait, tsk); | ||
108 | unsigned long flags; | ||
109 | |||
110 | tsk->state = TASK_INTERRUPTIBLE; | ||
111 | spin_lock_irqsave(&sem->wait.lock, flags); | ||
112 | add_wait_queue_exclusive_locked(&sem->wait, &wait); | ||
113 | |||
114 | sem->sleepers++; | ||
115 | for (;;) { | ||
116 | int sleepers = sem->sleepers; | ||
117 | |||
118 | /* | ||
119 | * With signals pending, this turns into | ||
120 | * the trylock failure case - we won't be | ||
121 | * sleeping, and we* can't get the lock as | ||
122 | * it has contention. Just correct the count | ||
123 | * and exit. | ||
124 | */ | ||
125 | if (signal_pending(current)) { | ||
126 | retval = -EINTR; | ||
127 | sem->sleepers = 0; | ||
128 | atomic_add(sleepers, &sem->count); | ||
129 | break; | ||
130 | } | ||
131 | |||
132 | /* | ||
133 | * Add "everybody else" into it. They aren't | ||
134 | * playing, because we own the spinlock in | ||
135 | * wait_queue_head. The "-1" is because we're | ||
136 | * still hoping to get the semaphore. | ||
137 | */ | ||
138 | if (!atomic_add_negative(sleepers - 1, &sem->count)) { | ||
139 | sem->sleepers = 0; | ||
140 | break; | ||
141 | } | ||
142 | sem->sleepers = 1; /* us - see -1 above */ | ||
143 | spin_unlock_irqrestore(&sem->wait.lock, flags); | ||
144 | |||
145 | schedule(); | ||
146 | |||
147 | spin_lock_irqsave(&sem->wait.lock, flags); | ||
148 | tsk->state = TASK_INTERRUPTIBLE; | ||
149 | } | ||
150 | remove_wait_queue_locked(&sem->wait, &wait); | ||
151 | wake_up_locked(&sem->wait); | ||
152 | spin_unlock_irqrestore(&sem->wait.lock, flags); | ||
153 | |||
154 | tsk->state = TASK_RUNNING; | ||
155 | return retval; | ||
156 | } | ||
157 | |||
158 | /* | ||
159 | * Trylock failed - make sure we correct for | ||
160 | * having decremented the count. | ||
161 | * | ||
162 | * We could have done the trylock with a | ||
163 | * single "cmpxchg" without failure cases, | ||
164 | * but then it wouldn't work on a 386. | ||
165 | */ | ||
166 | asmlinkage int __down_trylock(struct semaphore * sem) | ||
167 | { | ||
168 | int sleepers; | ||
169 | unsigned long flags; | ||
170 | |||
171 | spin_lock_irqsave(&sem->wait.lock, flags); | ||
172 | sleepers = sem->sleepers + 1; | ||
173 | sem->sleepers = 0; | ||
174 | |||
175 | /* | ||
176 | * Add "everybody else" and us into it. They aren't | ||
177 | * playing, because we own the spinlock in the | ||
178 | * wait_queue_head. | ||
179 | */ | ||
180 | if (!atomic_add_negative(sleepers, &sem->count)) { | ||
181 | wake_up_locked(&sem->wait); | ||
182 | } | ||
183 | |||
184 | spin_unlock_irqrestore(&sem->wait.lock, flags); | ||
185 | return 1; | ||
186 | } | ||
diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c new file mode 100644 index 000000000000..4826cd6e40e8 --- /dev/null +++ b/arch/m32r/kernel/setup.c | |||
@@ -0,0 +1,420 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/setup.c | ||
3 | * | ||
4 | * Setup routines for Renesas M32R | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/stddef.h> | ||
13 | #include <linux/fs.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/ioport.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <linux/bootmem.h> | ||
18 | #include <linux/console.h> | ||
19 | #include <linux/initrd.h> | ||
20 | #include <linux/major.h> | ||
21 | #include <linux/root_dev.h> | ||
22 | #include <linux/seq_file.h> | ||
23 | #include <linux/timex.h> | ||
24 | #include <linux/tty.h> | ||
25 | #include <linux/cpu.h> | ||
26 | #include <linux/nodemask.h> | ||
27 | |||
28 | #include <asm/processor.h> | ||
29 | #include <asm/pgtable.h> | ||
30 | #include <asm/io.h> | ||
31 | #include <asm/mmu_context.h> | ||
32 | #include <asm/m32r.h> | ||
33 | #include <asm/setup.h> | ||
34 | #include <asm/sections.h> | ||
35 | |||
36 | #ifdef CONFIG_MMU | ||
37 | extern void init_mmu(void); | ||
38 | #endif | ||
39 | |||
40 | #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) \ | ||
41 | || defined(CONFIG_BLK_DEV_IDE_MODULE) \ | ||
42 | || defined(CONFIG_BLK_DEV_HD_MODULE) | ||
43 | struct drive_info_struct { char dummy[32]; } drive_info; | ||
44 | #endif | ||
45 | |||
46 | extern char _end[]; | ||
47 | |||
48 | /* | ||
49 | * Machine setup.. | ||
50 | */ | ||
51 | struct cpuinfo_m32r boot_cpu_data; | ||
52 | |||
53 | #ifdef CONFIG_BLK_DEV_RAM | ||
54 | extern int rd_doload; /* 1 = load ramdisk, 0 = don't load */ | ||
55 | extern int rd_prompt; /* 1 = prompt for ramdisk, 0 = don't prompt */ | ||
56 | extern int rd_image_start; /* starting block # of image */ | ||
57 | #endif | ||
58 | |||
59 | #if defined(CONFIG_VGA_CONSOLE) | ||
60 | struct screen_info screen_info = { | ||
61 | .orig_video_lines = 25, | ||
62 | .orig_video_cols = 80, | ||
63 | .orig_video_mode = 0, | ||
64 | .orig_video_ega_bx = 0, | ||
65 | .orig_video_isVGA = 1, | ||
66 | .orig_video_points = 8 | ||
67 | }; | ||
68 | #endif | ||
69 | |||
70 | extern int root_mountflags; | ||
71 | |||
72 | static char command_line[COMMAND_LINE_SIZE]; | ||
73 | |||
74 | static struct resource data_resource = { | ||
75 | .name = "Kernel data", | ||
76 | .start = 0, | ||
77 | .end = 0, | ||
78 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
79 | }; | ||
80 | |||
81 | static struct resource code_resource = { | ||
82 | .name = "Kernel code", | ||
83 | .start = 0, | ||
84 | .end = 0, | ||
85 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
86 | }; | ||
87 | |||
88 | unsigned long memory_start; | ||
89 | unsigned long memory_end; | ||
90 | |||
91 | void __init setup_arch(char **); | ||
92 | int get_cpuinfo(char *); | ||
93 | |||
94 | static __inline__ void parse_mem_cmdline(char ** cmdline_p) | ||
95 | { | ||
96 | char c = ' '; | ||
97 | char *to = command_line; | ||
98 | char *from = COMMAND_LINE; | ||
99 | int len = 0; | ||
100 | int usermem = 0; | ||
101 | |||
102 | /* Save unparsed command line copy for /proc/cmdline */ | ||
103 | memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE); | ||
104 | saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; | ||
105 | |||
106 | memory_start = (unsigned long)CONFIG_MEMORY_START+PAGE_OFFSET; | ||
107 | memory_end = memory_start+(unsigned long)CONFIG_MEMORY_SIZE; | ||
108 | |||
109 | for ( ; ; ) { | ||
110 | if (c == ' ' && !memcmp(from, "mem=", 4)) { | ||
111 | if (to != command_line) | ||
112 | to--; | ||
113 | |||
114 | { | ||
115 | unsigned long mem_size; | ||
116 | |||
117 | usermem = 1; | ||
118 | mem_size = memparse(from+4, &from); | ||
119 | memory_end = memory_start + mem_size; | ||
120 | } | ||
121 | } | ||
122 | c = *(from++); | ||
123 | if (!c) | ||
124 | break; | ||
125 | |||
126 | if (COMMAND_LINE_SIZE <= ++len) | ||
127 | break; | ||
128 | |||
129 | *(to++) = c; | ||
130 | } | ||
131 | *to = '\0'; | ||
132 | *cmdline_p = command_line; | ||
133 | if (usermem) | ||
134 | printk(KERN_INFO "user-defined physical RAM map:\n"); | ||
135 | } | ||
136 | |||
137 | #ifndef CONFIG_DISCONTIGMEM | ||
138 | static unsigned long __init setup_memory(void) | ||
139 | { | ||
140 | unsigned long start_pfn, max_low_pfn, bootmap_size; | ||
141 | |||
142 | start_pfn = PFN_UP( __pa(_end) ); | ||
143 | max_low_pfn = PFN_DOWN( __pa(memory_end) ); | ||
144 | |||
145 | /* | ||
146 | * Initialize the boot-time allocator (with low memory only): | ||
147 | */ | ||
148 | bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, | ||
149 | CONFIG_MEMORY_START>>PAGE_SHIFT, max_low_pfn); | ||
150 | |||
151 | /* | ||
152 | * Register fully available low RAM pages with the bootmem allocator. | ||
153 | */ | ||
154 | { | ||
155 | unsigned long curr_pfn; | ||
156 | unsigned long last_pfn; | ||
157 | unsigned long pages; | ||
158 | |||
159 | /* | ||
160 | * We are rounding up the start address of usable memory: | ||
161 | */ | ||
162 | curr_pfn = PFN_UP(__pa(memory_start)); | ||
163 | |||
164 | /* | ||
165 | * ... and at the end of the usable range downwards: | ||
166 | */ | ||
167 | last_pfn = PFN_DOWN(__pa(memory_end)); | ||
168 | |||
169 | if (last_pfn > max_low_pfn) | ||
170 | last_pfn = max_low_pfn; | ||
171 | |||
172 | pages = last_pfn - curr_pfn; | ||
173 | free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(pages)); | ||
174 | } | ||
175 | |||
176 | /* | ||
177 | * Reserve the kernel text and | ||
178 | * Reserve the bootmem bitmap. We do this in two steps (first step | ||
179 | * was init_bootmem()), because this catches the (definitely buggy) | ||
180 | * case of us accidentally initializing the bootmem allocator with | ||
181 | * an invalid RAM area. | ||
182 | */ | ||
183 | reserve_bootmem(CONFIG_MEMORY_START + PAGE_SIZE, | ||
184 | (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE - 1) | ||
185 | - CONFIG_MEMORY_START); | ||
186 | |||
187 | /* | ||
188 | * reserve physical page 0 - it's a special BIOS page on many boxes, | ||
189 | * enabling clean reboots, SMP operation, laptop functions. | ||
190 | */ | ||
191 | reserve_bootmem(CONFIG_MEMORY_START, PAGE_SIZE); | ||
192 | |||
193 | /* | ||
194 | * reserve memory hole | ||
195 | */ | ||
196 | #ifdef CONFIG_MEMHOLE | ||
197 | reserve_bootmem(CONFIG_MEMHOLE_START, CONFIG_MEMHOLE_SIZE); | ||
198 | #endif | ||
199 | |||
200 | #ifdef CONFIG_BLK_DEV_INITRD | ||
201 | if (LOADER_TYPE && INITRD_START) { | ||
202 | if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { | ||
203 | reserve_bootmem(INITRD_START, INITRD_SIZE); | ||
204 | initrd_start = INITRD_START ? | ||
205 | INITRD_START + PAGE_OFFSET : 0; | ||
206 | |||
207 | initrd_end = initrd_start + INITRD_SIZE; | ||
208 | printk("initrd:start[%08lx],size[%08lx]\n", | ||
209 | initrd_start, INITRD_SIZE); | ||
210 | } else { | ||
211 | printk("initrd extends beyond end of memory " | ||
212 | "(0x%08lx > 0x%08lx)\ndisabling initrd\n", | ||
213 | INITRD_START + INITRD_SIZE, | ||
214 | max_low_pfn << PAGE_SHIFT); | ||
215 | |||
216 | initrd_start = 0; | ||
217 | } | ||
218 | } | ||
219 | #endif | ||
220 | |||
221 | return max_low_pfn; | ||
222 | } | ||
223 | #else /* CONFIG_DISCONTIGMEM */ | ||
224 | extern unsigned long setup_memory(void); | ||
225 | #endif /* CONFIG_DISCONTIGMEM */ | ||
226 | |||
227 | #define M32R_PCC_PCATCR 0x00ef7014 /* will move to m32r.h */ | ||
228 | |||
229 | void __init setup_arch(char **cmdline_p) | ||
230 | { | ||
231 | ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); | ||
232 | |||
233 | boot_cpu_data.cpu_clock = M32R_CPUCLK; | ||
234 | boot_cpu_data.bus_clock = M32R_BUSCLK; | ||
235 | boot_cpu_data.timer_divide = M32R_TIMER_DIVIDE; | ||
236 | |||
237 | #ifdef CONFIG_BLK_DEV_RAM | ||
238 | rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; | ||
239 | rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); | ||
240 | rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); | ||
241 | #endif | ||
242 | |||
243 | if (!MOUNT_ROOT_RDONLY) | ||
244 | root_mountflags &= ~MS_RDONLY; | ||
245 | |||
246 | #ifdef CONFIG_VT | ||
247 | #if defined(CONFIG_VGA_CONSOLE) | ||
248 | conswitchp = &vga_con; | ||
249 | #elif defined(CONFIG_DUMMY_CONSOLE) | ||
250 | conswitchp = &dummy_con; | ||
251 | #endif | ||
252 | #endif | ||
253 | |||
254 | #ifdef CONFIG_DISCONTIGMEM | ||
255 | nodes_clear(node_online_map); | ||
256 | node_set_online(0); | ||
257 | node_set_online(1); | ||
258 | #endif /* CONFIG_DISCONTIGMEM */ | ||
259 | |||
260 | init_mm.start_code = (unsigned long) _text; | ||
261 | init_mm.end_code = (unsigned long) _etext; | ||
262 | init_mm.end_data = (unsigned long) _edata; | ||
263 | init_mm.brk = (unsigned long) _end; | ||
264 | |||
265 | code_resource.start = virt_to_phys(_text); | ||
266 | code_resource.end = virt_to_phys(_etext)-1; | ||
267 | data_resource.start = virt_to_phys(_etext); | ||
268 | data_resource.end = virt_to_phys(_edata)-1; | ||
269 | |||
270 | parse_mem_cmdline(cmdline_p); | ||
271 | |||
272 | setup_memory(); | ||
273 | |||
274 | paging_init(); | ||
275 | } | ||
276 | |||
277 | static struct cpu cpu[NR_CPUS]; | ||
278 | |||
279 | static int __init topology_init(void) | ||
280 | { | ||
281 | int cpu_id; | ||
282 | |||
283 | for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++) | ||
284 | if (cpu_possible(cpu_id)) | ||
285 | register_cpu(&cpu[cpu_id], cpu_id, NULL); | ||
286 | |||
287 | return 0; | ||
288 | } | ||
289 | |||
290 | subsys_initcall(topology_init); | ||
291 | |||
292 | #ifdef CONFIG_PROC_FS | ||
293 | /* | ||
294 | * Get CPU information for use by the procfs. | ||
295 | */ | ||
296 | static int show_cpuinfo(struct seq_file *m, void *v) | ||
297 | { | ||
298 | struct cpuinfo_m32r *c = v; | ||
299 | unsigned long cpu = c - cpu_data; | ||
300 | |||
301 | #ifdef CONFIG_SMP | ||
302 | if (!cpu_online(cpu)) | ||
303 | return 0; | ||
304 | #endif /* CONFIG_SMP */ | ||
305 | |||
306 | seq_printf(m, "processor\t: %ld\n", cpu); | ||
307 | |||
308 | #ifdef CONFIG_CHIP_VDEC2 | ||
309 | seq_printf(m, "cpu family\t: VDEC2\n" | ||
310 | "cache size\t: Unknown\n"); | ||
311 | #elif CONFIG_CHIP_M32700 | ||
312 | seq_printf(m,"cpu family\t: M32700\n" | ||
313 | "cache size\t: I-8KB/D-8KB\n"); | ||
314 | #elif CONFIG_CHIP_M32102 | ||
315 | seq_printf(m,"cpu family\t: M32102\n" | ||
316 | "cache size\t: I-8KB\n"); | ||
317 | #elif CONFIG_CHIP_OPSP | ||
318 | seq_printf(m,"cpu family\t: OPSP\n" | ||
319 | "cache size\t: I-8KB/D-8KB\n"); | ||
320 | #elif CONFIG_CHIP_MP | ||
321 | seq_printf(m, "cpu family\t: M32R-MP\n" | ||
322 | "cache size\t: I-xxKB/D-xxKB\n"); | ||
323 | #else | ||
324 | seq_printf(m, "cpu family\t: Unknown\n"); | ||
325 | #endif | ||
326 | seq_printf(m, "bogomips\t: %lu.%02lu\n", | ||
327 | c->loops_per_jiffy/(500000/HZ), | ||
328 | (c->loops_per_jiffy/(5000/HZ)) % 100); | ||
329 | #ifdef CONFIG_PLAT_MAPPI | ||
330 | seq_printf(m, "Machine\t\t: Mappi Evaluation board\n"); | ||
331 | #elif CONFIG_PLAT_MAPPI2 | ||
332 | seq_printf(m, "Machine\t\t: Mappi-II Evaluation board\n"); | ||
333 | #elif CONFIG_PLAT_M32700UT | ||
334 | seq_printf(m, "Machine\t\t: M32700UT Evaluation board\n"); | ||
335 | #elif CONFIG_PLAT_OPSPUT | ||
336 | seq_printf(m, "Machine\t\t: OPSPUT Evaluation board\n"); | ||
337 | #elif CONFIG_PLAT_USRV | ||
338 | seq_printf(m, "Machine\t\t: uServer\n"); | ||
339 | #elif CONFIG_PLAT_OAKS32R | ||
340 | seq_printf(m, "Machine\t\t: OAKS32R\n"); | ||
341 | #else | ||
342 | seq_printf(m, "Machine\t\t: Unknown\n"); | ||
343 | #endif | ||
344 | |||
345 | #define PRINT_CLOCK(name, value) \ | ||
346 | seq_printf(m, name " clock\t: %d.%02dMHz\n", \ | ||
347 | ((value) / 1000000), ((value) % 1000000)/10000) | ||
348 | |||
349 | PRINT_CLOCK("CPU", (int)c->cpu_clock); | ||
350 | PRINT_CLOCK("Bus", (int)c->bus_clock); | ||
351 | |||
352 | seq_printf(m, "\n"); | ||
353 | |||
354 | return 0; | ||
355 | } | ||
356 | |||
357 | static void *c_start(struct seq_file *m, loff_t *pos) | ||
358 | { | ||
359 | return *pos < NR_CPUS ? cpu_data + *pos : NULL; | ||
360 | } | ||
361 | |||
362 | static void *c_next(struct seq_file *m, void *v, loff_t *pos) | ||
363 | { | ||
364 | ++*pos; | ||
365 | return c_start(m, pos); | ||
366 | } | ||
367 | |||
368 | static void c_stop(struct seq_file *m, void *v) | ||
369 | { | ||
370 | } | ||
371 | |||
372 | struct seq_operations cpuinfo_op = { | ||
373 | start: c_start, | ||
374 | next: c_next, | ||
375 | stop: c_stop, | ||
376 | show: show_cpuinfo, | ||
377 | }; | ||
378 | #endif /* CONFIG_PROC_FS */ | ||
379 | |||
380 | unsigned long cpu_initialized __initdata = 0; | ||
381 | |||
382 | /* | ||
383 | * cpu_init() initializes state that is per-CPU. Some data is already | ||
384 | * initialized (naturally) in the bootstrap process. | ||
385 | * We reload them nevertheless, this function acts as a | ||
386 | * 'CPU state barrier', nothing should get across. | ||
387 | */ | ||
388 | #if defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_XNUX2) \ | ||
389 | || defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_M32102) \ | ||
390 | || defined(CONFIG_CHIP_OPSP) | ||
391 | void __init cpu_init (void) | ||
392 | { | ||
393 | int cpu_id = smp_processor_id(); | ||
394 | |||
395 | if (test_and_set_bit(cpu_id, &cpu_initialized)) { | ||
396 | printk(KERN_WARNING "CPU#%d already initialized!\n", cpu_id); | ||
397 | for ( ; ; ) | ||
398 | local_irq_enable(); | ||
399 | } | ||
400 | printk(KERN_INFO "Initializing CPU#%d\n", cpu_id); | ||
401 | |||
402 | /* Set up and load the per-CPU TSS and LDT */ | ||
403 | atomic_inc(&init_mm.mm_count); | ||
404 | current->active_mm = &init_mm; | ||
405 | if (current->mm) | ||
406 | BUG(); | ||
407 | |||
408 | /* Force FPU initialization */ | ||
409 | current_thread_info()->status = 0; | ||
410 | clear_used_math(); | ||
411 | |||
412 | #ifdef CONFIG_MMU | ||
413 | /* Set up MMU */ | ||
414 | init_mmu(); | ||
415 | #endif | ||
416 | |||
417 | /* Set up ICUIMASK */ | ||
418 | outl(0x00070000, M32R_ICU_IMASK_PORTL); /* imask=111 */ | ||
419 | } | ||
420 | #endif /* defined(CONFIG_CHIP_VDEC2) ... */ | ||
diff --git a/arch/m32r/kernel/setup_m32700ut.c b/arch/m32r/kernel/setup_m32700ut.c new file mode 100644 index 000000000000..488aa87bab76 --- /dev/null +++ b/arch/m32r/kernel/setup_m32700ut.c | |||
@@ -0,0 +1,478 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/setup_m32700ut.c | ||
3 | * | ||
4 | * Setup routines for Renesas M32700UT Board | ||
5 | * | ||
6 | * Copyright (c) 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Takeo Takahashi | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General | ||
10 | * Public License. See the file "COPYING" in the main directory of this | ||
11 | * archive for more details. | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <linux/irq.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/device.h> | ||
19 | |||
20 | #include <asm/system.h> | ||
21 | #include <asm/m32r.h> | ||
22 | #include <asm/io.h> | ||
23 | |||
24 | /* | ||
25 | * M32700 Interrupt Control Unit (Level 1) | ||
26 | */ | ||
27 | #define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long))) | ||
28 | |||
29 | #ifndef CONFIG_SMP | ||
30 | typedef struct { | ||
31 | unsigned long icucr; /* ICU Control Register */ | ||
32 | } icu_data_t; | ||
33 | #endif /* CONFIG_SMP */ | ||
34 | |||
35 | static icu_data_t icu_data[M32700UT_NUM_CPU_IRQ]; | ||
36 | |||
37 | static void disable_m32700ut_irq(unsigned int irq) | ||
38 | { | ||
39 | unsigned long port, data; | ||
40 | |||
41 | port = irq2port(irq); | ||
42 | data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7; | ||
43 | outl(data, port); | ||
44 | } | ||
45 | |||
46 | static void enable_m32700ut_irq(unsigned int irq) | ||
47 | { | ||
48 | unsigned long port, data; | ||
49 | |||
50 | port = irq2port(irq); | ||
51 | data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6; | ||
52 | outl(data, port); | ||
53 | } | ||
54 | |||
55 | static void mask_and_ack_m32700ut(unsigned int irq) | ||
56 | { | ||
57 | disable_m32700ut_irq(irq); | ||
58 | } | ||
59 | |||
60 | static void end_m32700ut_irq(unsigned int irq) | ||
61 | { | ||
62 | enable_m32700ut_irq(irq); | ||
63 | } | ||
64 | |||
65 | static unsigned int startup_m32700ut_irq(unsigned int irq) | ||
66 | { | ||
67 | enable_m32700ut_irq(irq); | ||
68 | return (0); | ||
69 | } | ||
70 | |||
71 | static void shutdown_m32700ut_irq(unsigned int irq) | ||
72 | { | ||
73 | unsigned long port; | ||
74 | |||
75 | port = irq2port(irq); | ||
76 | outl(M32R_ICUCR_ILEVEL7, port); | ||
77 | } | ||
78 | |||
79 | static struct hw_interrupt_type m32700ut_irq_type = | ||
80 | { | ||
81 | "M32700UT-IRQ", | ||
82 | startup_m32700ut_irq, | ||
83 | shutdown_m32700ut_irq, | ||
84 | enable_m32700ut_irq, | ||
85 | disable_m32700ut_irq, | ||
86 | mask_and_ack_m32700ut, | ||
87 | end_m32700ut_irq | ||
88 | }; | ||
89 | |||
90 | /* | ||
91 | * Interrupt Control Unit of PLD on M32700UT (Level 2) | ||
92 | */ | ||
93 | #define irq2pldirq(x) ((x) - M32700UT_PLD_IRQ_BASE) | ||
94 | #define pldirq2port(x) (unsigned long)((int)PLD_ICUCR1 + \ | ||
95 | (((x) - 1) * sizeof(unsigned short))) | ||
96 | |||
97 | typedef struct { | ||
98 | unsigned short icucr; /* ICU Control Register */ | ||
99 | } pld_icu_data_t; | ||
100 | |||
101 | static pld_icu_data_t pld_icu_data[M32700UT_NUM_PLD_IRQ]; | ||
102 | |||
103 | static void disable_m32700ut_pld_irq(unsigned int irq) | ||
104 | { | ||
105 | unsigned long port, data; | ||
106 | unsigned int pldirq; | ||
107 | |||
108 | pldirq = irq2pldirq(irq); | ||
109 | // disable_m32700ut_irq(M32R_IRQ_INT1); | ||
110 | port = pldirq2port(pldirq); | ||
111 | data = pld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; | ||
112 | outw(data, port); | ||
113 | } | ||
114 | |||
115 | static void enable_m32700ut_pld_irq(unsigned int irq) | ||
116 | { | ||
117 | unsigned long port, data; | ||
118 | unsigned int pldirq; | ||
119 | |||
120 | pldirq = irq2pldirq(irq); | ||
121 | // enable_m32700ut_irq(M32R_IRQ_INT1); | ||
122 | port = pldirq2port(pldirq); | ||
123 | data = pld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; | ||
124 | outw(data, port); | ||
125 | } | ||
126 | |||
127 | static void mask_and_ack_m32700ut_pld(unsigned int irq) | ||
128 | { | ||
129 | disable_m32700ut_pld_irq(irq); | ||
130 | // mask_and_ack_m32700ut(M32R_IRQ_INT1); | ||
131 | } | ||
132 | |||
133 | static void end_m32700ut_pld_irq(unsigned int irq) | ||
134 | { | ||
135 | enable_m32700ut_pld_irq(irq); | ||
136 | end_m32700ut_irq(M32R_IRQ_INT1); | ||
137 | } | ||
138 | |||
139 | static unsigned int startup_m32700ut_pld_irq(unsigned int irq) | ||
140 | { | ||
141 | enable_m32700ut_pld_irq(irq); | ||
142 | return (0); | ||
143 | } | ||
144 | |||
145 | static void shutdown_m32700ut_pld_irq(unsigned int irq) | ||
146 | { | ||
147 | unsigned long port; | ||
148 | unsigned int pldirq; | ||
149 | |||
150 | pldirq = irq2pldirq(irq); | ||
151 | // shutdown_m32700ut_irq(M32R_IRQ_INT1); | ||
152 | port = pldirq2port(pldirq); | ||
153 | outw(PLD_ICUCR_ILEVEL7, port); | ||
154 | } | ||
155 | |||
156 | static struct hw_interrupt_type m32700ut_pld_irq_type = | ||
157 | { | ||
158 | "M32700UT-PLD-IRQ", | ||
159 | startup_m32700ut_pld_irq, | ||
160 | shutdown_m32700ut_pld_irq, | ||
161 | enable_m32700ut_pld_irq, | ||
162 | disable_m32700ut_pld_irq, | ||
163 | mask_and_ack_m32700ut_pld, | ||
164 | end_m32700ut_pld_irq | ||
165 | }; | ||
166 | |||
167 | /* | ||
168 | * Interrupt Control Unit of PLD on M32700UT-LAN (Level 2) | ||
169 | */ | ||
170 | #define irq2lanpldirq(x) ((x) - M32700UT_LAN_PLD_IRQ_BASE) | ||
171 | #define lanpldirq2port(x) (unsigned long)((int)M32700UT_LAN_ICUCR1 + \ | ||
172 | (((x) - 1) * sizeof(unsigned short))) | ||
173 | |||
174 | static pld_icu_data_t lanpld_icu_data[M32700UT_NUM_LAN_PLD_IRQ]; | ||
175 | |||
176 | static void disable_m32700ut_lanpld_irq(unsigned int irq) | ||
177 | { | ||
178 | unsigned long port, data; | ||
179 | unsigned int pldirq; | ||
180 | |||
181 | pldirq = irq2lanpldirq(irq); | ||
182 | port = lanpldirq2port(pldirq); | ||
183 | data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; | ||
184 | outw(data, port); | ||
185 | } | ||
186 | |||
187 | static void enable_m32700ut_lanpld_irq(unsigned int irq) | ||
188 | { | ||
189 | unsigned long port, data; | ||
190 | unsigned int pldirq; | ||
191 | |||
192 | pldirq = irq2lanpldirq(irq); | ||
193 | port = lanpldirq2port(pldirq); | ||
194 | data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; | ||
195 | outw(data, port); | ||
196 | } | ||
197 | |||
198 | static void mask_and_ack_m32700ut_lanpld(unsigned int irq) | ||
199 | { | ||
200 | disable_m32700ut_lanpld_irq(irq); | ||
201 | } | ||
202 | |||
203 | static void end_m32700ut_lanpld_irq(unsigned int irq) | ||
204 | { | ||
205 | enable_m32700ut_lanpld_irq(irq); | ||
206 | end_m32700ut_irq(M32R_IRQ_INT0); | ||
207 | } | ||
208 | |||
209 | static unsigned int startup_m32700ut_lanpld_irq(unsigned int irq) | ||
210 | { | ||
211 | enable_m32700ut_lanpld_irq(irq); | ||
212 | return (0); | ||
213 | } | ||
214 | |||
215 | static void shutdown_m32700ut_lanpld_irq(unsigned int irq) | ||
216 | { | ||
217 | unsigned long port; | ||
218 | unsigned int pldirq; | ||
219 | |||
220 | pldirq = irq2lanpldirq(irq); | ||
221 | port = lanpldirq2port(pldirq); | ||
222 | outw(PLD_ICUCR_ILEVEL7, port); | ||
223 | } | ||
224 | |||
225 | static struct hw_interrupt_type m32700ut_lanpld_irq_type = | ||
226 | { | ||
227 | "M32700UT-PLD-LAN-IRQ", | ||
228 | startup_m32700ut_lanpld_irq, | ||
229 | shutdown_m32700ut_lanpld_irq, | ||
230 | enable_m32700ut_lanpld_irq, | ||
231 | disable_m32700ut_lanpld_irq, | ||
232 | mask_and_ack_m32700ut_lanpld, | ||
233 | end_m32700ut_lanpld_irq | ||
234 | }; | ||
235 | |||
236 | /* | ||
237 | * Interrupt Control Unit of PLD on M32700UT-LCD (Level 2) | ||
238 | */ | ||
239 | #define irq2lcdpldirq(x) ((x) - M32700UT_LCD_PLD_IRQ_BASE) | ||
240 | #define lcdpldirq2port(x) (unsigned long)((int)M32700UT_LCD_ICUCR1 + \ | ||
241 | (((x) - 1) * sizeof(unsigned short))) | ||
242 | |||
243 | static pld_icu_data_t lcdpld_icu_data[M32700UT_NUM_LCD_PLD_IRQ]; | ||
244 | |||
245 | static void disable_m32700ut_lcdpld_irq(unsigned int irq) | ||
246 | { | ||
247 | unsigned long port, data; | ||
248 | unsigned int pldirq; | ||
249 | |||
250 | pldirq = irq2lcdpldirq(irq); | ||
251 | port = lcdpldirq2port(pldirq); | ||
252 | data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; | ||
253 | outw(data, port); | ||
254 | } | ||
255 | |||
256 | static void enable_m32700ut_lcdpld_irq(unsigned int irq) | ||
257 | { | ||
258 | unsigned long port, data; | ||
259 | unsigned int pldirq; | ||
260 | |||
261 | pldirq = irq2lcdpldirq(irq); | ||
262 | port = lcdpldirq2port(pldirq); | ||
263 | data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; | ||
264 | outw(data, port); | ||
265 | } | ||
266 | |||
267 | static void mask_and_ack_m32700ut_lcdpld(unsigned int irq) | ||
268 | { | ||
269 | disable_m32700ut_lcdpld_irq(irq); | ||
270 | } | ||
271 | |||
272 | static void end_m32700ut_lcdpld_irq(unsigned int irq) | ||
273 | { | ||
274 | enable_m32700ut_lcdpld_irq(irq); | ||
275 | end_m32700ut_irq(M32R_IRQ_INT2); | ||
276 | } | ||
277 | |||
278 | static unsigned int startup_m32700ut_lcdpld_irq(unsigned int irq) | ||
279 | { | ||
280 | enable_m32700ut_lcdpld_irq(irq); | ||
281 | return (0); | ||
282 | } | ||
283 | |||
284 | static void shutdown_m32700ut_lcdpld_irq(unsigned int irq) | ||
285 | { | ||
286 | unsigned long port; | ||
287 | unsigned int pldirq; | ||
288 | |||
289 | pldirq = irq2lcdpldirq(irq); | ||
290 | port = lcdpldirq2port(pldirq); | ||
291 | outw(PLD_ICUCR_ILEVEL7, port); | ||
292 | } | ||
293 | |||
294 | static struct hw_interrupt_type m32700ut_lcdpld_irq_type = | ||
295 | { | ||
296 | "M32700UT-PLD-LCD-IRQ", | ||
297 | startup_m32700ut_lcdpld_irq, | ||
298 | shutdown_m32700ut_lcdpld_irq, | ||
299 | enable_m32700ut_lcdpld_irq, | ||
300 | disable_m32700ut_lcdpld_irq, | ||
301 | mask_and_ack_m32700ut_lcdpld, | ||
302 | end_m32700ut_lcdpld_irq | ||
303 | }; | ||
304 | |||
305 | void __init init_IRQ(void) | ||
306 | { | ||
307 | #if defined(CONFIG_SMC91X) | ||
308 | /* INT#0: LAN controller on M32700UT-LAN (SMC91C111)*/ | ||
309 | irq_desc[M32700UT_LAN_IRQ_LAN].status = IRQ_DISABLED; | ||
310 | irq_desc[M32700UT_LAN_IRQ_LAN].handler = &m32700ut_lanpld_irq_type; | ||
311 | irq_desc[M32700UT_LAN_IRQ_LAN].action = 0; | ||
312 | irq_desc[M32700UT_LAN_IRQ_LAN].depth = 1; /* disable nested irq */ | ||
313 | lanpld_icu_data[irq2lanpldirq(M32700UT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */ | ||
314 | disable_m32700ut_lanpld_irq(M32700UT_LAN_IRQ_LAN); | ||
315 | #endif /* CONFIG_SMC91X */ | ||
316 | |||
317 | /* MFT2 : system timer */ | ||
318 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | ||
319 | irq_desc[M32R_IRQ_MFT2].handler = &m32700ut_irq_type; | ||
320 | irq_desc[M32R_IRQ_MFT2].action = 0; | ||
321 | irq_desc[M32R_IRQ_MFT2].depth = 1; | ||
322 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | ||
323 | disable_m32700ut_irq(M32R_IRQ_MFT2); | ||
324 | |||
325 | /* SIO0 : receive */ | ||
326 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | ||
327 | irq_desc[M32R_IRQ_SIO0_R].handler = &m32700ut_irq_type; | ||
328 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | ||
329 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | ||
330 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | ||
331 | disable_m32700ut_irq(M32R_IRQ_SIO0_R); | ||
332 | |||
333 | /* SIO0 : send */ | ||
334 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | ||
335 | irq_desc[M32R_IRQ_SIO0_S].handler = &m32700ut_irq_type; | ||
336 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | ||
337 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | ||
338 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | ||
339 | disable_m32700ut_irq(M32R_IRQ_SIO0_S); | ||
340 | |||
341 | /* SIO1 : receive */ | ||
342 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | ||
343 | irq_desc[M32R_IRQ_SIO1_R].handler = &m32700ut_irq_type; | ||
344 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | ||
345 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | ||
346 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | ||
347 | disable_m32700ut_irq(M32R_IRQ_SIO1_R); | ||
348 | |||
349 | /* SIO1 : send */ | ||
350 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | ||
351 | irq_desc[M32R_IRQ_SIO1_S].handler = &m32700ut_irq_type; | ||
352 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | ||
353 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | ||
354 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | ||
355 | disable_m32700ut_irq(M32R_IRQ_SIO1_S); | ||
356 | |||
357 | /* DMA1 : */ | ||
358 | irq_desc[M32R_IRQ_DMA1].status = IRQ_DISABLED; | ||
359 | irq_desc[M32R_IRQ_DMA1].handler = &m32700ut_irq_type; | ||
360 | irq_desc[M32R_IRQ_DMA1].action = 0; | ||
361 | irq_desc[M32R_IRQ_DMA1].depth = 1; | ||
362 | icu_data[M32R_IRQ_DMA1].icucr = 0; | ||
363 | disable_m32700ut_irq(M32R_IRQ_DMA1); | ||
364 | |||
365 | #ifdef CONFIG_SERIAL_M32R_PLDSIO | ||
366 | /* INT#1: SIO0 Receive on PLD */ | ||
367 | irq_desc[PLD_IRQ_SIO0_RCV].status = IRQ_DISABLED; | ||
368 | irq_desc[PLD_IRQ_SIO0_RCV].handler = &m32700ut_pld_irq_type; | ||
369 | irq_desc[PLD_IRQ_SIO0_RCV].action = 0; | ||
370 | irq_desc[PLD_IRQ_SIO0_RCV].depth = 1; /* disable nested irq */ | ||
371 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | ||
372 | disable_m32700ut_pld_irq(PLD_IRQ_SIO0_RCV); | ||
373 | |||
374 | /* INT#1: SIO0 Send on PLD */ | ||
375 | irq_desc[PLD_IRQ_SIO0_SND].status = IRQ_DISABLED; | ||
376 | irq_desc[PLD_IRQ_SIO0_SND].handler = &m32700ut_pld_irq_type; | ||
377 | irq_desc[PLD_IRQ_SIO0_SND].action = 0; | ||
378 | irq_desc[PLD_IRQ_SIO0_SND].depth = 1; /* disable nested irq */ | ||
379 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | ||
380 | disable_m32700ut_pld_irq(PLD_IRQ_SIO0_SND); | ||
381 | #endif /* CONFIG_SERIAL_M32R_PLDSIO */ | ||
382 | |||
383 | /* INT#1: CFC IREQ on PLD */ | ||
384 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | ||
385 | irq_desc[PLD_IRQ_CFIREQ].handler = &m32700ut_pld_irq_type; | ||
386 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | ||
387 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ | ||
388 | pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */ | ||
389 | disable_m32700ut_pld_irq(PLD_IRQ_CFIREQ); | ||
390 | |||
391 | /* INT#1: CFC Insert on PLD */ | ||
392 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | ||
393 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &m32700ut_pld_irq_type; | ||
394 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | ||
395 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ | ||
396 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */ | ||
397 | disable_m32700ut_pld_irq(PLD_IRQ_CFC_INSERT); | ||
398 | |||
399 | /* INT#1: CFC Eject on PLD */ | ||
400 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; | ||
401 | irq_desc[PLD_IRQ_CFC_EJECT].handler = &m32700ut_pld_irq_type; | ||
402 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; | ||
403 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ | ||
404 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ | ||
405 | disable_m32700ut_pld_irq(PLD_IRQ_CFC_EJECT); | ||
406 | |||
407 | /* | ||
408 | * INT0# is used for LAN, DIO | ||
409 | * We enable it here. | ||
410 | */ | ||
411 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11; | ||
412 | enable_m32700ut_irq(M32R_IRQ_INT0); | ||
413 | |||
414 | /* | ||
415 | * INT1# is used for UART, MMC, CF Controller in FPGA. | ||
416 | * We enable it here. | ||
417 | */ | ||
418 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11; | ||
419 | enable_m32700ut_irq(M32R_IRQ_INT1); | ||
420 | |||
421 | #if defined(CONFIG_USB) | ||
422 | outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */ | ||
423 | |||
424 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].status = IRQ_DISABLED; | ||
425 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].handler = &m32700ut_lcdpld_irq_type; | ||
426 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].action = 0; | ||
427 | irq_desc[M32700UT_LCD_IRQ_USB_INT1].depth = 1; | ||
428 | lcdpld_icu_data[irq2lcdpldirq(M32700UT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */ | ||
429 | disable_m32700ut_lcdpld_irq(M32700UT_LCD_IRQ_USB_INT1); | ||
430 | #endif | ||
431 | /* | ||
432 | * INT2# is used for BAT, USB, AUDIO | ||
433 | * We enable it here. | ||
434 | */ | ||
435 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; | ||
436 | enable_m32700ut_irq(M32R_IRQ_INT2); | ||
437 | |||
438 | //#if defined(CONFIG_VIDEO_M32R_AR) | ||
439 | /* | ||
440 | * INT3# is used for AR | ||
441 | */ | ||
442 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; | ||
443 | irq_desc[M32R_IRQ_INT3].handler = &m32700ut_irq_type; | ||
444 | irq_desc[M32R_IRQ_INT3].action = 0; | ||
445 | irq_desc[M32R_IRQ_INT3].depth = 1; | ||
446 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
447 | disable_m32700ut_irq(M32R_IRQ_INT3); | ||
448 | //#endif /* CONFIG_VIDEO_M32R_AR */ | ||
449 | } | ||
450 | |||
451 | #define LAN_IOSTART 0x300 | ||
452 | #define LAN_IOEND 0x320 | ||
453 | static struct resource smc91x_resources[] = { | ||
454 | [0] = { | ||
455 | .start = (LAN_IOSTART), | ||
456 | .end = (LAN_IOEND), | ||
457 | .flags = IORESOURCE_MEM, | ||
458 | }, | ||
459 | [1] = { | ||
460 | .start = M32700UT_LAN_IRQ_LAN, | ||
461 | .end = M32700UT_LAN_IRQ_LAN, | ||
462 | .flags = IORESOURCE_IRQ, | ||
463 | } | ||
464 | }; | ||
465 | |||
466 | static struct platform_device smc91x_device = { | ||
467 | .name = "smc91x", | ||
468 | .id = 0, | ||
469 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
470 | .resource = smc91x_resources, | ||
471 | }; | ||
472 | |||
473 | static int __init platform_init(void) | ||
474 | { | ||
475 | platform_device_register(&smc91x_device); | ||
476 | return 0; | ||
477 | } | ||
478 | arch_initcall(platform_init); | ||
diff --git a/arch/m32r/kernel/setup_mappi.c b/arch/m32r/kernel/setup_mappi.c new file mode 100644 index 000000000000..1e74110f0670 --- /dev/null +++ b/arch/m32r/kernel/setup_mappi.c | |||
@@ -0,0 +1,160 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/setup_mappi.c | ||
3 | * | ||
4 | * Setup routines for Renesas MAPPI Board | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/irq.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | |||
15 | #include <asm/system.h> | ||
16 | #include <asm/m32r.h> | ||
17 | #include <asm/io.h> | ||
18 | |||
19 | #define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long))) | ||
20 | |||
21 | #ifndef CONFIG_SMP | ||
22 | typedef struct { | ||
23 | unsigned long icucr; /* ICU Control Register */ | ||
24 | } icu_data_t; | ||
25 | #endif /* CONFIG_SMP */ | ||
26 | |||
27 | icu_data_t icu_data[NR_IRQS]; | ||
28 | |||
29 | static void disable_mappi_irq(unsigned int irq) | ||
30 | { | ||
31 | unsigned long port, data; | ||
32 | |||
33 | port = irq2port(irq); | ||
34 | data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7; | ||
35 | outl(data, port); | ||
36 | } | ||
37 | |||
38 | static void enable_mappi_irq(unsigned int irq) | ||
39 | { | ||
40 | unsigned long port, data; | ||
41 | |||
42 | port = irq2port(irq); | ||
43 | data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6; | ||
44 | outl(data, port); | ||
45 | } | ||
46 | |||
47 | static void mask_and_ack_mappi(unsigned int irq) | ||
48 | { | ||
49 | disable_mappi_irq(irq); | ||
50 | } | ||
51 | |||
52 | static void end_mappi_irq(unsigned int irq) | ||
53 | { | ||
54 | enable_mappi_irq(irq); | ||
55 | } | ||
56 | |||
57 | static unsigned int startup_mappi_irq(unsigned int irq) | ||
58 | { | ||
59 | enable_mappi_irq(irq); | ||
60 | return (0); | ||
61 | } | ||
62 | |||
63 | static void shutdown_mappi_irq(unsigned int irq) | ||
64 | { | ||
65 | unsigned long port; | ||
66 | |||
67 | port = irq2port(irq); | ||
68 | outl(M32R_ICUCR_ILEVEL7, port); | ||
69 | } | ||
70 | |||
71 | static struct hw_interrupt_type mappi_irq_type = | ||
72 | { | ||
73 | "MAPPI-IRQ", | ||
74 | startup_mappi_irq, | ||
75 | shutdown_mappi_irq, | ||
76 | enable_mappi_irq, | ||
77 | disable_mappi_irq, | ||
78 | mask_and_ack_mappi, | ||
79 | end_mappi_irq | ||
80 | }; | ||
81 | |||
82 | void __init init_IRQ(void) | ||
83 | { | ||
84 | static int once = 0; | ||
85 | |||
86 | if (once) | ||
87 | return; | ||
88 | else | ||
89 | once++; | ||
90 | |||
91 | #ifdef CONFIG_NE2000 | ||
92 | /* INT0 : LAN controller (RTL8019AS) */ | ||
93 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; | ||
94 | irq_desc[M32R_IRQ_INT0].handler = &mappi_irq_type; | ||
95 | irq_desc[M32R_IRQ_INT0].action = 0; | ||
96 | irq_desc[M32R_IRQ_INT0].depth = 1; | ||
97 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
98 | disable_mappi_irq(M32R_IRQ_INT0); | ||
99 | #endif /* CONFIG_M32R_NE2000 */ | ||
100 | |||
101 | /* MFT2 : system timer */ | ||
102 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | ||
103 | irq_desc[M32R_IRQ_MFT2].handler = &mappi_irq_type; | ||
104 | irq_desc[M32R_IRQ_MFT2].action = 0; | ||
105 | irq_desc[M32R_IRQ_MFT2].depth = 1; | ||
106 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | ||
107 | disable_mappi_irq(M32R_IRQ_MFT2); | ||
108 | |||
109 | #ifdef CONFIG_SERIAL_M32R_SIO | ||
110 | /* SIO0_R : uart receive data */ | ||
111 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | ||
112 | irq_desc[M32R_IRQ_SIO0_R].handler = &mappi_irq_type; | ||
113 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | ||
114 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | ||
115 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | ||
116 | disable_mappi_irq(M32R_IRQ_SIO0_R); | ||
117 | |||
118 | /* SIO0_S : uart send data */ | ||
119 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | ||
120 | irq_desc[M32R_IRQ_SIO0_S].handler = &mappi_irq_type; | ||
121 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | ||
122 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | ||
123 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | ||
124 | disable_mappi_irq(M32R_IRQ_SIO0_S); | ||
125 | |||
126 | /* SIO1_R : uart receive data */ | ||
127 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | ||
128 | irq_desc[M32R_IRQ_SIO1_R].handler = &mappi_irq_type; | ||
129 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | ||
130 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | ||
131 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | ||
132 | disable_mappi_irq(M32R_IRQ_SIO1_R); | ||
133 | |||
134 | /* SIO1_S : uart send data */ | ||
135 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | ||
136 | irq_desc[M32R_IRQ_SIO1_S].handler = &mappi_irq_type; | ||
137 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | ||
138 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | ||
139 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | ||
140 | disable_mappi_irq(M32R_IRQ_SIO1_S); | ||
141 | #endif /* CONFIG_SERIAL_M32R_SIO */ | ||
142 | |||
143 | #if defined(CONFIG_M32R_PCC) | ||
144 | /* INT1 : pccard0 interrupt */ | ||
145 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; | ||
146 | irq_desc[M32R_IRQ_INT1].handler = &mappi_irq_type; | ||
147 | irq_desc[M32R_IRQ_INT1].action = 0; | ||
148 | irq_desc[M32R_IRQ_INT1].depth = 1; | ||
149 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00; | ||
150 | disable_mappi_irq(M32R_IRQ_INT1); | ||
151 | |||
152 | /* INT2 : pccard1 interrupt */ | ||
153 | irq_desc[M32R_IRQ_INT2].status = IRQ_DISABLED; | ||
154 | irq_desc[M32R_IRQ_INT2].handler = &mappi_irq_type; | ||
155 | irq_desc[M32R_IRQ_INT2].action = 0; | ||
156 | irq_desc[M32R_IRQ_INT2].depth = 1; | ||
157 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00; | ||
158 | disable_mappi_irq(M32R_IRQ_INT2); | ||
159 | #endif /* CONFIG_M32RPCC */ | ||
160 | } | ||
diff --git a/arch/m32r/kernel/setup_mappi2.c b/arch/m32r/kernel/setup_mappi2.c new file mode 100644 index 000000000000..1904d465a507 --- /dev/null +++ b/arch/m32r/kernel/setup_mappi2.c | |||
@@ -0,0 +1,212 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/setup_mappi.c | ||
3 | * | ||
4 | * Setup routines for Renesas MAPPI-II(M3A-ZA36) Board | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Mamoru Sakugawa | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/irq.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/device.h> | ||
15 | |||
16 | #include <asm/system.h> | ||
17 | #include <asm/m32r.h> | ||
18 | #include <asm/io.h> | ||
19 | |||
20 | #define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long))) | ||
21 | |||
22 | #ifndef CONFIG_SMP | ||
23 | typedef struct { | ||
24 | unsigned long icucr; /* ICU Control Register */ | ||
25 | } icu_data_t; | ||
26 | #endif /* CONFIG_SMP */ | ||
27 | |||
28 | icu_data_t icu_data[NR_IRQS]; | ||
29 | |||
30 | static void disable_mappi2_irq(unsigned int irq) | ||
31 | { | ||
32 | unsigned long port, data; | ||
33 | |||
34 | if ((irq == 0) ||(irq >= NR_IRQS)) { | ||
35 | printk("bad irq 0x%08x\n", irq); | ||
36 | return; | ||
37 | } | ||
38 | port = irq2port(irq); | ||
39 | data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7; | ||
40 | outl(data, port); | ||
41 | } | ||
42 | |||
43 | static void enable_mappi2_irq(unsigned int irq) | ||
44 | { | ||
45 | unsigned long port, data; | ||
46 | |||
47 | if ((irq == 0) ||(irq >= NR_IRQS)) { | ||
48 | printk("bad irq 0x%08x\n", irq); | ||
49 | return; | ||
50 | } | ||
51 | port = irq2port(irq); | ||
52 | data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6; | ||
53 | outl(data, port); | ||
54 | } | ||
55 | |||
56 | static void mask_and_ack_mappi2(unsigned int irq) | ||
57 | { | ||
58 | disable_mappi2_irq(irq); | ||
59 | } | ||
60 | |||
61 | static void end_mappi2_irq(unsigned int irq) | ||
62 | { | ||
63 | enable_mappi2_irq(irq); | ||
64 | } | ||
65 | |||
66 | static unsigned int startup_mappi2_irq(unsigned int irq) | ||
67 | { | ||
68 | enable_mappi2_irq(irq); | ||
69 | return (0); | ||
70 | } | ||
71 | |||
72 | static void shutdown_mappi2_irq(unsigned int irq) | ||
73 | { | ||
74 | unsigned long port; | ||
75 | |||
76 | port = irq2port(irq); | ||
77 | outl(M32R_ICUCR_ILEVEL7, port); | ||
78 | } | ||
79 | |||
80 | static struct hw_interrupt_type mappi2_irq_type = | ||
81 | { | ||
82 | "MAPPI2-IRQ", | ||
83 | startup_mappi2_irq, | ||
84 | shutdown_mappi2_irq, | ||
85 | enable_mappi2_irq, | ||
86 | disable_mappi2_irq, | ||
87 | mask_and_ack_mappi2, | ||
88 | end_mappi2_irq | ||
89 | }; | ||
90 | |||
91 | void __init init_IRQ(void) | ||
92 | { | ||
93 | #if defined(CONFIG_SMC91X) | ||
94 | /* INT0 : LAN controller (SMC91111) */ | ||
95 | irq_desc[M32R_IRQ_INT0].status = IRQ_DISABLED; | ||
96 | irq_desc[M32R_IRQ_INT0].handler = &mappi2_irq_type; | ||
97 | irq_desc[M32R_IRQ_INT0].action = 0; | ||
98 | irq_desc[M32R_IRQ_INT0].depth = 1; | ||
99 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
100 | disable_mappi2_irq(M32R_IRQ_INT0); | ||
101 | #endif /* CONFIG_SMC91X */ | ||
102 | |||
103 | /* MFT2 : system timer */ | ||
104 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | ||
105 | irq_desc[M32R_IRQ_MFT2].handler = &mappi2_irq_type; | ||
106 | irq_desc[M32R_IRQ_MFT2].action = 0; | ||
107 | irq_desc[M32R_IRQ_MFT2].depth = 1; | ||
108 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | ||
109 | disable_mappi2_irq(M32R_IRQ_MFT2); | ||
110 | |||
111 | #ifdef CONFIG_SERIAL_M32R_SIO | ||
112 | /* SIO0_R : uart receive data */ | ||
113 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | ||
114 | irq_desc[M32R_IRQ_SIO0_R].handler = &mappi2_irq_type; | ||
115 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | ||
116 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | ||
117 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | ||
118 | disable_mappi2_irq(M32R_IRQ_SIO0_R); | ||
119 | |||
120 | /* SIO0_S : uart send data */ | ||
121 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | ||
122 | irq_desc[M32R_IRQ_SIO0_S].handler = &mappi2_irq_type; | ||
123 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | ||
124 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | ||
125 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | ||
126 | disable_mappi2_irq(M32R_IRQ_SIO0_S); | ||
127 | /* SIO1_R : uart receive data */ | ||
128 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | ||
129 | irq_desc[M32R_IRQ_SIO1_R].handler = &mappi2_irq_type; | ||
130 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | ||
131 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | ||
132 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | ||
133 | disable_mappi2_irq(M32R_IRQ_SIO1_R); | ||
134 | |||
135 | /* SIO1_S : uart send data */ | ||
136 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | ||
137 | irq_desc[M32R_IRQ_SIO1_S].handler = &mappi2_irq_type; | ||
138 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | ||
139 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | ||
140 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | ||
141 | disable_mappi2_irq(M32R_IRQ_SIO1_S); | ||
142 | #endif /* CONFIG_M32R_USE_DBG_CONSOLE */ | ||
143 | |||
144 | #if defined(CONFIG_USB) | ||
145 | /* INT1 : USB Host controller interrupt */ | ||
146 | irq_desc[M32R_IRQ_INT1].status = IRQ_DISABLED; | ||
147 | irq_desc[M32R_IRQ_INT1].handler = &mappi2_irq_type; | ||
148 | irq_desc[M32R_IRQ_INT1].action = 0; | ||
149 | irq_desc[M32R_IRQ_INT1].depth = 1; | ||
150 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD01; | ||
151 | disable_mappi2_irq(M32R_IRQ_INT1); | ||
152 | #endif /* CONFIG_USB */ | ||
153 | |||
154 | /* ICUCR40: CFC IREQ */ | ||
155 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | ||
156 | irq_desc[PLD_IRQ_CFIREQ].handler = &mappi2_irq_type; | ||
157 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | ||
158 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ | ||
159 | // icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; | ||
160 | icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; | ||
161 | disable_mappi2_irq(PLD_IRQ_CFIREQ); | ||
162 | |||
163 | #if defined(CONFIG_M32R_CFC) | ||
164 | /* ICUCR41: CFC Insert */ | ||
165 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | ||
166 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi2_irq_type; | ||
167 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | ||
168 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ | ||
169 | icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; | ||
170 | // icu_data[PLD_IRQ_CFC_INSERT].icucr = 0; | ||
171 | disable_mappi2_irq(PLD_IRQ_CFC_INSERT); | ||
172 | |||
173 | /* ICUCR42: CFC Eject */ | ||
174 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; | ||
175 | irq_desc[PLD_IRQ_CFC_EJECT].handler = &mappi2_irq_type; | ||
176 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; | ||
177 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ | ||
178 | icu_data[PLD_IRQ_CFC_EJECT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
179 | // icu_data[PLD_IRQ_CFC_EJECT].icucr = 0; | ||
180 | disable_mappi2_irq(PLD_IRQ_CFC_EJECT); | ||
181 | |||
182 | #endif /* CONFIG_MAPPI2_CFC */ | ||
183 | } | ||
184 | |||
185 | #define LAN_IOSTART 0x300 | ||
186 | #define LAN_IOEND 0x320 | ||
187 | static struct resource smc91x_resources[] = { | ||
188 | [0] = { | ||
189 | .start = (LAN_IOSTART), | ||
190 | .end = (LAN_IOEND), | ||
191 | .flags = IORESOURCE_MEM, | ||
192 | }, | ||
193 | [1] = { | ||
194 | .start = M32R_IRQ_INT0, | ||
195 | .end = M32R_IRQ_INT0, | ||
196 | .flags = IORESOURCE_IRQ, | ||
197 | } | ||
198 | }; | ||
199 | |||
200 | static struct platform_device smc91x_device = { | ||
201 | .name = "smc91x", | ||
202 | .id = 0, | ||
203 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
204 | .resource = smc91x_resources, | ||
205 | }; | ||
206 | |||
207 | static int __init platform_init(void) | ||
208 | { | ||
209 | platform_device_register(&smc91x_device); | ||
210 | return 0; | ||
211 | } | ||
212 | arch_initcall(platform_init); | ||
diff --git a/arch/m32r/kernel/setup_oaks32r.c b/arch/m32r/kernel/setup_oaks32r.c new file mode 100644 index 000000000000..b04834526c9a --- /dev/null +++ b/arch/m32r/kernel/setup_oaks32r.c | |||
@@ -0,0 +1,143 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/setup_oaks32r.c | ||
3 | * | ||
4 | * Setup routines for OAKS32R Board | ||
5 | * | ||
6 | * Copyright (c) 2002-2004 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto, Mamoru Sakugawa | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/irq.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | |||
15 | #include <asm/system.h> | ||
16 | #include <asm/m32r.h> | ||
17 | #include <asm/io.h> | ||
18 | |||
19 | #define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long))) | ||
20 | |||
21 | #ifndef CONFIG_SMP | ||
22 | typedef struct { | ||
23 | unsigned long icucr; /* ICU Control Register */ | ||
24 | } icu_data_t; | ||
25 | #endif /* CONFIG_SMP */ | ||
26 | |||
27 | icu_data_t icu_data[NR_IRQS]; | ||
28 | |||
29 | static void disable_oaks32r_irq(unsigned int irq) | ||
30 | { | ||
31 | unsigned long port, data; | ||
32 | |||
33 | port = irq2port(irq); | ||
34 | data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7; | ||
35 | outl(data, port); | ||
36 | } | ||
37 | |||
38 | static void enable_oaks32r_irq(unsigned int irq) | ||
39 | { | ||
40 | unsigned long port, data; | ||
41 | |||
42 | port = irq2port(irq); | ||
43 | data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6; | ||
44 | outl(data, port); | ||
45 | } | ||
46 | |||
47 | static void mask_and_ack_mappi(unsigned int irq) | ||
48 | { | ||
49 | disable_oaks32r_irq(irq); | ||
50 | } | ||
51 | |||
52 | static void end_oaks32r_irq(unsigned int irq) | ||
53 | { | ||
54 | enable_oaks32r_irq(irq); | ||
55 | } | ||
56 | |||
57 | static unsigned int startup_oaks32r_irq(unsigned int irq) | ||
58 | { | ||
59 | enable_oaks32r_irq(irq); | ||
60 | return (0); | ||
61 | } | ||
62 | |||
63 | static void shutdown_oaks32r_irq(unsigned int irq) | ||
64 | { | ||
65 | unsigned long port; | ||
66 | |||
67 | port = irq2port(irq); | ||
68 | outl(M32R_ICUCR_ILEVEL7, port); | ||
69 | } | ||
70 | |||
71 | static struct hw_interrupt_type oaks32r_irq_type = | ||
72 | { | ||
73 | "OAKS32R-IRQ", | ||
74 | startup_oaks32r_irq, | ||
75 | shutdown_oaks32r_irq, | ||
76 | enable_oaks32r_irq, | ||
77 | disable_oaks32r_irq, | ||
78 | mask_and_ack_mappi, | ||
79 | end_oaks32r_irq | ||
80 | }; | ||
81 | |||
82 | void __init init_IRQ(void) | ||
83 | { | ||
84 | static int once = 0; | ||
85 | |||
86 | if (once) | ||
87 | return; | ||
88 | else | ||
89 | once++; | ||
90 | |||
91 | #ifdef CONFIG_NE2000 | ||
92 | /* INT3 : LAN controller (RTL8019AS) */ | ||
93 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; | ||
94 | irq_desc[M32R_IRQ_INT3].handler = &oaks32r_irq_type; | ||
95 | irq_desc[M32R_IRQ_INT3].action = 0; | ||
96 | irq_desc[M32R_IRQ_INT3].depth = 1; | ||
97 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
98 | disable_oaks32r_irq(M32R_IRQ_INT3); | ||
99 | #endif /* CONFIG_M32R_NE2000 */ | ||
100 | |||
101 | /* MFT2 : system timer */ | ||
102 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | ||
103 | irq_desc[M32R_IRQ_MFT2].handler = &oaks32r_irq_type; | ||
104 | irq_desc[M32R_IRQ_MFT2].action = 0; | ||
105 | irq_desc[M32R_IRQ_MFT2].depth = 1; | ||
106 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | ||
107 | disable_oaks32r_irq(M32R_IRQ_MFT2); | ||
108 | |||
109 | #ifdef CONFIG_SERIAL_M32R_SIO | ||
110 | /* SIO0_R : uart receive data */ | ||
111 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | ||
112 | irq_desc[M32R_IRQ_SIO0_R].handler = &oaks32r_irq_type; | ||
113 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | ||
114 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | ||
115 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | ||
116 | disable_oaks32r_irq(M32R_IRQ_SIO0_R); | ||
117 | |||
118 | /* SIO0_S : uart send data */ | ||
119 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | ||
120 | irq_desc[M32R_IRQ_SIO0_S].handler = &oaks32r_irq_type; | ||
121 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | ||
122 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | ||
123 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | ||
124 | disable_oaks32r_irq(M32R_IRQ_SIO0_S); | ||
125 | |||
126 | /* SIO1_R : uart receive data */ | ||
127 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | ||
128 | irq_desc[M32R_IRQ_SIO1_R].handler = &oaks32r_irq_type; | ||
129 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | ||
130 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | ||
131 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | ||
132 | disable_oaks32r_irq(M32R_IRQ_SIO1_R); | ||
133 | |||
134 | /* SIO1_S : uart send data */ | ||
135 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | ||
136 | irq_desc[M32R_IRQ_SIO1_S].handler = &oaks32r_irq_type; | ||
137 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | ||
138 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | ||
139 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | ||
140 | disable_oaks32r_irq(M32R_IRQ_SIO1_S); | ||
141 | #endif /* CONFIG_SERIAL_M32R_SIO */ | ||
142 | |||
143 | } | ||
diff --git a/arch/m32r/kernel/setup_opsput.c b/arch/m32r/kernel/setup_opsput.c new file mode 100644 index 000000000000..84315e344c58 --- /dev/null +++ b/arch/m32r/kernel/setup_opsput.c | |||
@@ -0,0 +1,482 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/setup_opsput.c | ||
3 | * | ||
4 | * Setup routines for Renesas OPSPUT Board | ||
5 | * | ||
6 | * Copyright (c) 2002-2004 | ||
7 | * Hiroyuki Kondo, Hirokazu Takata, | ||
8 | * Hitoshi Yamamoto, Takeo Takahashi, Mamoru Sakugawa | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General | ||
11 | * Public License. See the file "COPYING" in the main directory of this | ||
12 | * archive for more details. | ||
13 | */ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/device.h> | ||
20 | |||
21 | #include <asm/system.h> | ||
22 | #include <asm/m32r.h> | ||
23 | #include <asm/io.h> | ||
24 | |||
25 | /* | ||
26 | * OPSP Interrupt Control Unit (Level 1) | ||
27 | */ | ||
28 | #define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long))) | ||
29 | |||
30 | #ifndef CONFIG_SMP | ||
31 | typedef struct { | ||
32 | unsigned long icucr; /* ICU Control Register */ | ||
33 | } icu_data_t; | ||
34 | #endif /* CONFIG_SMP */ | ||
35 | |||
36 | static icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ]; | ||
37 | |||
38 | static void disable_opsput_irq(unsigned int irq) | ||
39 | { | ||
40 | unsigned long port, data; | ||
41 | |||
42 | port = irq2port(irq); | ||
43 | data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7; | ||
44 | outl(data, port); | ||
45 | } | ||
46 | |||
47 | static void enable_opsput_irq(unsigned int irq) | ||
48 | { | ||
49 | unsigned long port, data; | ||
50 | |||
51 | port = irq2port(irq); | ||
52 | data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6; | ||
53 | outl(data, port); | ||
54 | } | ||
55 | |||
56 | static void mask_and_ack_opsput(unsigned int irq) | ||
57 | { | ||
58 | disable_opsput_irq(irq); | ||
59 | } | ||
60 | |||
61 | static void end_opsput_irq(unsigned int irq) | ||
62 | { | ||
63 | enable_opsput_irq(irq); | ||
64 | } | ||
65 | |||
66 | static unsigned int startup_opsput_irq(unsigned int irq) | ||
67 | { | ||
68 | enable_opsput_irq(irq); | ||
69 | return (0); | ||
70 | } | ||
71 | |||
72 | static void shutdown_opsput_irq(unsigned int irq) | ||
73 | { | ||
74 | unsigned long port; | ||
75 | |||
76 | port = irq2port(irq); | ||
77 | outl(M32R_ICUCR_ILEVEL7, port); | ||
78 | } | ||
79 | |||
80 | static struct hw_interrupt_type opsput_irq_type = | ||
81 | { | ||
82 | "OPSPUT-IRQ", | ||
83 | startup_opsput_irq, | ||
84 | shutdown_opsput_irq, | ||
85 | enable_opsput_irq, | ||
86 | disable_opsput_irq, | ||
87 | mask_and_ack_opsput, | ||
88 | end_opsput_irq | ||
89 | }; | ||
90 | |||
91 | /* | ||
92 | * Interrupt Control Unit of PLD on OPSPUT (Level 2) | ||
93 | */ | ||
94 | #define irq2pldirq(x) ((x) - OPSPUT_PLD_IRQ_BASE) | ||
95 | #define pldirq2port(x) (unsigned long)((int)PLD_ICUCR1 + \ | ||
96 | (((x) - 1) * sizeof(unsigned short))) | ||
97 | |||
98 | typedef struct { | ||
99 | unsigned short icucr; /* ICU Control Register */ | ||
100 | } pld_icu_data_t; | ||
101 | |||
102 | static pld_icu_data_t pld_icu_data[OPSPUT_NUM_PLD_IRQ]; | ||
103 | |||
104 | static void disable_opsput_pld_irq(unsigned int irq) | ||
105 | { | ||
106 | unsigned long port, data; | ||
107 | unsigned int pldirq; | ||
108 | |||
109 | pldirq = irq2pldirq(irq); | ||
110 | // disable_opsput_irq(M32R_IRQ_INT1); | ||
111 | port = pldirq2port(pldirq); | ||
112 | data = pld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; | ||
113 | outw(data, port); | ||
114 | } | ||
115 | |||
116 | static void enable_opsput_pld_irq(unsigned int irq) | ||
117 | { | ||
118 | unsigned long port, data; | ||
119 | unsigned int pldirq; | ||
120 | |||
121 | pldirq = irq2pldirq(irq); | ||
122 | // enable_opsput_irq(M32R_IRQ_INT1); | ||
123 | port = pldirq2port(pldirq); | ||
124 | data = pld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; | ||
125 | outw(data, port); | ||
126 | } | ||
127 | |||
128 | static void mask_and_ack_opsput_pld(unsigned int irq) | ||
129 | { | ||
130 | disable_opsput_pld_irq(irq); | ||
131 | // mask_and_ack_opsput(M32R_IRQ_INT1); | ||
132 | } | ||
133 | |||
134 | static void end_opsput_pld_irq(unsigned int irq) | ||
135 | { | ||
136 | enable_opsput_pld_irq(irq); | ||
137 | end_opsput_irq(M32R_IRQ_INT1); | ||
138 | } | ||
139 | |||
140 | static unsigned int startup_opsput_pld_irq(unsigned int irq) | ||
141 | { | ||
142 | enable_opsput_pld_irq(irq); | ||
143 | return (0); | ||
144 | } | ||
145 | |||
146 | static void shutdown_opsput_pld_irq(unsigned int irq) | ||
147 | { | ||
148 | unsigned long port; | ||
149 | unsigned int pldirq; | ||
150 | |||
151 | pldirq = irq2pldirq(irq); | ||
152 | // shutdown_opsput_irq(M32R_IRQ_INT1); | ||
153 | port = pldirq2port(pldirq); | ||
154 | outw(PLD_ICUCR_ILEVEL7, port); | ||
155 | } | ||
156 | |||
157 | static struct hw_interrupt_type opsput_pld_irq_type = | ||
158 | { | ||
159 | "OPSPUT-PLD-IRQ", | ||
160 | startup_opsput_pld_irq, | ||
161 | shutdown_opsput_pld_irq, | ||
162 | enable_opsput_pld_irq, | ||
163 | disable_opsput_pld_irq, | ||
164 | mask_and_ack_opsput_pld, | ||
165 | end_opsput_pld_irq | ||
166 | }; | ||
167 | |||
168 | /* | ||
169 | * Interrupt Control Unit of PLD on OPSPUT-LAN (Level 2) | ||
170 | */ | ||
171 | #define irq2lanpldirq(x) ((x) - OPSPUT_LAN_PLD_IRQ_BASE) | ||
172 | #define lanpldirq2port(x) (unsigned long)((int)OPSPUT_LAN_ICUCR1 + \ | ||
173 | (((x) - 1) * sizeof(unsigned short))) | ||
174 | |||
175 | static pld_icu_data_t lanpld_icu_data[OPSPUT_NUM_LAN_PLD_IRQ]; | ||
176 | |||
177 | static void disable_opsput_lanpld_irq(unsigned int irq) | ||
178 | { | ||
179 | unsigned long port, data; | ||
180 | unsigned int pldirq; | ||
181 | |||
182 | pldirq = irq2lanpldirq(irq); | ||
183 | port = lanpldirq2port(pldirq); | ||
184 | data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; | ||
185 | outw(data, port); | ||
186 | } | ||
187 | |||
188 | static void enable_opsput_lanpld_irq(unsigned int irq) | ||
189 | { | ||
190 | unsigned long port, data; | ||
191 | unsigned int pldirq; | ||
192 | |||
193 | pldirq = irq2lanpldirq(irq); | ||
194 | port = lanpldirq2port(pldirq); | ||
195 | data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; | ||
196 | outw(data, port); | ||
197 | } | ||
198 | |||
199 | static void mask_and_ack_opsput_lanpld(unsigned int irq) | ||
200 | { | ||
201 | disable_opsput_lanpld_irq(irq); | ||
202 | } | ||
203 | |||
204 | static void end_opsput_lanpld_irq(unsigned int irq) | ||
205 | { | ||
206 | enable_opsput_lanpld_irq(irq); | ||
207 | end_opsput_irq(M32R_IRQ_INT0); | ||
208 | } | ||
209 | |||
210 | static unsigned int startup_opsput_lanpld_irq(unsigned int irq) | ||
211 | { | ||
212 | enable_opsput_lanpld_irq(irq); | ||
213 | return (0); | ||
214 | } | ||
215 | |||
216 | static void shutdown_opsput_lanpld_irq(unsigned int irq) | ||
217 | { | ||
218 | unsigned long port; | ||
219 | unsigned int pldirq; | ||
220 | |||
221 | pldirq = irq2lanpldirq(irq); | ||
222 | port = lanpldirq2port(pldirq); | ||
223 | outw(PLD_ICUCR_ILEVEL7, port); | ||
224 | } | ||
225 | |||
226 | static struct hw_interrupt_type opsput_lanpld_irq_type = | ||
227 | { | ||
228 | "OPSPUT-PLD-LAN-IRQ", | ||
229 | startup_opsput_lanpld_irq, | ||
230 | shutdown_opsput_lanpld_irq, | ||
231 | enable_opsput_lanpld_irq, | ||
232 | disable_opsput_lanpld_irq, | ||
233 | mask_and_ack_opsput_lanpld, | ||
234 | end_opsput_lanpld_irq | ||
235 | }; | ||
236 | |||
237 | /* | ||
238 | * Interrupt Control Unit of PLD on OPSPUT-LCD (Level 2) | ||
239 | */ | ||
240 | #define irq2lcdpldirq(x) ((x) - OPSPUT_LCD_PLD_IRQ_BASE) | ||
241 | #define lcdpldirq2port(x) (unsigned long)((int)OPSPUT_LCD_ICUCR1 + \ | ||
242 | (((x) - 1) * sizeof(unsigned short))) | ||
243 | |||
244 | static pld_icu_data_t lcdpld_icu_data[OPSPUT_NUM_LCD_PLD_IRQ]; | ||
245 | |||
246 | static void disable_opsput_lcdpld_irq(unsigned int irq) | ||
247 | { | ||
248 | unsigned long port, data; | ||
249 | unsigned int pldirq; | ||
250 | |||
251 | pldirq = irq2lcdpldirq(irq); | ||
252 | port = lcdpldirq2port(pldirq); | ||
253 | data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; | ||
254 | outw(data, port); | ||
255 | } | ||
256 | |||
257 | static void enable_opsput_lcdpld_irq(unsigned int irq) | ||
258 | { | ||
259 | unsigned long port, data; | ||
260 | unsigned int pldirq; | ||
261 | |||
262 | pldirq = irq2lcdpldirq(irq); | ||
263 | port = lcdpldirq2port(pldirq); | ||
264 | data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; | ||
265 | outw(data, port); | ||
266 | } | ||
267 | |||
268 | static void mask_and_ack_opsput_lcdpld(unsigned int irq) | ||
269 | { | ||
270 | disable_opsput_lcdpld_irq(irq); | ||
271 | } | ||
272 | |||
273 | static void end_opsput_lcdpld_irq(unsigned int irq) | ||
274 | { | ||
275 | enable_opsput_lcdpld_irq(irq); | ||
276 | end_opsput_irq(M32R_IRQ_INT2); | ||
277 | } | ||
278 | |||
279 | static unsigned int startup_opsput_lcdpld_irq(unsigned int irq) | ||
280 | { | ||
281 | enable_opsput_lcdpld_irq(irq); | ||
282 | return (0); | ||
283 | } | ||
284 | |||
285 | static void shutdown_opsput_lcdpld_irq(unsigned int irq) | ||
286 | { | ||
287 | unsigned long port; | ||
288 | unsigned int pldirq; | ||
289 | |||
290 | pldirq = irq2lcdpldirq(irq); | ||
291 | port = lcdpldirq2port(pldirq); | ||
292 | outw(PLD_ICUCR_ILEVEL7, port); | ||
293 | } | ||
294 | |||
295 | static struct hw_interrupt_type opsput_lcdpld_irq_type = | ||
296 | { | ||
297 | "OPSPUT-PLD-LCD-IRQ", | ||
298 | startup_opsput_lcdpld_irq, | ||
299 | shutdown_opsput_lcdpld_irq, | ||
300 | enable_opsput_lcdpld_irq, | ||
301 | disable_opsput_lcdpld_irq, | ||
302 | mask_and_ack_opsput_lcdpld, | ||
303 | end_opsput_lcdpld_irq | ||
304 | }; | ||
305 | |||
306 | void __init init_IRQ(void) | ||
307 | { | ||
308 | #if defined(CONFIG_SMC91X) | ||
309 | /* INT#0: LAN controller on OPSPUT-LAN (SMC91C111)*/ | ||
310 | irq_desc[OPSPUT_LAN_IRQ_LAN].status = IRQ_DISABLED; | ||
311 | irq_desc[OPSPUT_LAN_IRQ_LAN].handler = &opsput_lanpld_irq_type; | ||
312 | irq_desc[OPSPUT_LAN_IRQ_LAN].action = 0; | ||
313 | irq_desc[OPSPUT_LAN_IRQ_LAN].depth = 1; /* disable nested irq */ | ||
314 | lanpld_icu_data[irq2lanpldirq(OPSPUT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */ | ||
315 | disable_opsput_lanpld_irq(OPSPUT_LAN_IRQ_LAN); | ||
316 | #endif /* CONFIG_SMC91X */ | ||
317 | |||
318 | /* MFT2 : system timer */ | ||
319 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | ||
320 | irq_desc[M32R_IRQ_MFT2].handler = &opsput_irq_type; | ||
321 | irq_desc[M32R_IRQ_MFT2].action = 0; | ||
322 | irq_desc[M32R_IRQ_MFT2].depth = 1; | ||
323 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | ||
324 | disable_opsput_irq(M32R_IRQ_MFT2); | ||
325 | |||
326 | /* SIO0 : receive */ | ||
327 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | ||
328 | irq_desc[M32R_IRQ_SIO0_R].handler = &opsput_irq_type; | ||
329 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | ||
330 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | ||
331 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | ||
332 | disable_opsput_irq(M32R_IRQ_SIO0_R); | ||
333 | |||
334 | /* SIO0 : send */ | ||
335 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | ||
336 | irq_desc[M32R_IRQ_SIO0_S].handler = &opsput_irq_type; | ||
337 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | ||
338 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | ||
339 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | ||
340 | disable_opsput_irq(M32R_IRQ_SIO0_S); | ||
341 | |||
342 | /* SIO1 : receive */ | ||
343 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | ||
344 | irq_desc[M32R_IRQ_SIO1_R].handler = &opsput_irq_type; | ||
345 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | ||
346 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | ||
347 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | ||
348 | disable_opsput_irq(M32R_IRQ_SIO1_R); | ||
349 | |||
350 | /* SIO1 : send */ | ||
351 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | ||
352 | irq_desc[M32R_IRQ_SIO1_S].handler = &opsput_irq_type; | ||
353 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | ||
354 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | ||
355 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | ||
356 | disable_opsput_irq(M32R_IRQ_SIO1_S); | ||
357 | |||
358 | /* DMA1 : */ | ||
359 | irq_desc[M32R_IRQ_DMA1].status = IRQ_DISABLED; | ||
360 | irq_desc[M32R_IRQ_DMA1].handler = &opsput_irq_type; | ||
361 | irq_desc[M32R_IRQ_DMA1].action = 0; | ||
362 | irq_desc[M32R_IRQ_DMA1].depth = 1; | ||
363 | icu_data[M32R_IRQ_DMA1].icucr = 0; | ||
364 | disable_opsput_irq(M32R_IRQ_DMA1); | ||
365 | |||
366 | #ifdef CONFIG_SERIAL_M32R_PLDSIO | ||
367 | /* INT#1: SIO0 Receive on PLD */ | ||
368 | irq_desc[PLD_IRQ_SIO0_RCV].status = IRQ_DISABLED; | ||
369 | irq_desc[PLD_IRQ_SIO0_RCV].handler = &opsput_pld_irq_type; | ||
370 | irq_desc[PLD_IRQ_SIO0_RCV].action = 0; | ||
371 | irq_desc[PLD_IRQ_SIO0_RCV].depth = 1; /* disable nested irq */ | ||
372 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | ||
373 | disable_opsput_pld_irq(PLD_IRQ_SIO0_RCV); | ||
374 | |||
375 | /* INT#1: SIO0 Send on PLD */ | ||
376 | irq_desc[PLD_IRQ_SIO0_SND].status = IRQ_DISABLED; | ||
377 | irq_desc[PLD_IRQ_SIO0_SND].handler = &opsput_pld_irq_type; | ||
378 | irq_desc[PLD_IRQ_SIO0_SND].action = 0; | ||
379 | irq_desc[PLD_IRQ_SIO0_SND].depth = 1; /* disable nested irq */ | ||
380 | pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; | ||
381 | disable_opsput_pld_irq(PLD_IRQ_SIO0_SND); | ||
382 | #endif /* CONFIG_SERIAL_M32R_PLDSIO */ | ||
383 | |||
384 | #if defined(CONFIG_M32R_CFC) | ||
385 | /* INT#1: CFC IREQ on PLD */ | ||
386 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | ||
387 | irq_desc[PLD_IRQ_CFIREQ].handler = &opsput_pld_irq_type; | ||
388 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | ||
389 | irq_desc[PLD_IRQ_CFIREQ].depth = 1; /* disable nested irq */ | ||
390 | pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */ | ||
391 | disable_opsput_pld_irq(PLD_IRQ_CFIREQ); | ||
392 | |||
393 | /* INT#1: CFC Insert on PLD */ | ||
394 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | ||
395 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &opsput_pld_irq_type; | ||
396 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | ||
397 | irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */ | ||
398 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */ | ||
399 | disable_opsput_pld_irq(PLD_IRQ_CFC_INSERT); | ||
400 | |||
401 | /* INT#1: CFC Eject on PLD */ | ||
402 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; | ||
403 | irq_desc[PLD_IRQ_CFC_EJECT].handler = &opsput_pld_irq_type; | ||
404 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; | ||
405 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ | ||
406 | pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ | ||
407 | disable_opsput_pld_irq(PLD_IRQ_CFC_EJECT); | ||
408 | #endif /* CONFIG_M32R_CFC */ | ||
409 | |||
410 | |||
411 | /* | ||
412 | * INT0# is used for LAN, DIO | ||
413 | * We enable it here. | ||
414 | */ | ||
415 | icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11; | ||
416 | enable_opsput_irq(M32R_IRQ_INT0); | ||
417 | |||
418 | /* | ||
419 | * INT1# is used for UART, MMC, CF Controller in FPGA. | ||
420 | * We enable it here. | ||
421 | */ | ||
422 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11; | ||
423 | enable_opsput_irq(M32R_IRQ_INT1); | ||
424 | |||
425 | #if defined(CONFIG_USB) | ||
426 | outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */ | ||
427 | |||
428 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].status = IRQ_DISABLED; | ||
429 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].handler = &opsput_lcdpld_irq_type; | ||
430 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].action = 0; | ||
431 | irq_desc[OPSPUT_LCD_IRQ_USB_INT1].depth = 1; | ||
432 | lcdpld_icu_data[irq2lcdpldirq(OPSPUT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */ | ||
433 | disable_opsput_lcdpld_irq(OPSPUT_LCD_IRQ_USB_INT1); | ||
434 | #endif | ||
435 | /* | ||
436 | * INT2# is used for BAT, USB, AUDIO | ||
437 | * We enable it here. | ||
438 | */ | ||
439 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; | ||
440 | enable_opsput_irq(M32R_IRQ_INT2); | ||
441 | |||
442 | //#if defined(CONFIG_VIDEO_M32R_AR) | ||
443 | /* | ||
444 | * INT3# is used for AR | ||
445 | */ | ||
446 | irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED; | ||
447 | irq_desc[M32R_IRQ_INT3].handler = &opsput_irq_type; | ||
448 | irq_desc[M32R_IRQ_INT3].action = 0; | ||
449 | irq_desc[M32R_IRQ_INT3].depth = 1; | ||
450 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
451 | disable_opsput_irq(M32R_IRQ_INT3); | ||
452 | //#endif /* CONFIG_VIDEO_M32R_AR */ | ||
453 | } | ||
454 | |||
455 | #define LAN_IOSTART 0x300 | ||
456 | #define LAN_IOEND 0x320 | ||
457 | static struct resource smc91x_resources[] = { | ||
458 | [0] = { | ||
459 | .start = (LAN_IOSTART), | ||
460 | .end = (LAN_IOEND), | ||
461 | .flags = IORESOURCE_MEM, | ||
462 | }, | ||
463 | [1] = { | ||
464 | .start = OPSPUT_LAN_IRQ_LAN, | ||
465 | .end = OPSPUT_LAN_IRQ_LAN, | ||
466 | .flags = IORESOURCE_IRQ, | ||
467 | } | ||
468 | }; | ||
469 | |||
470 | static struct platform_device smc91x_device = { | ||
471 | .name = "smc91x", | ||
472 | .id = 0, | ||
473 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
474 | .resource = smc91x_resources, | ||
475 | }; | ||
476 | |||
477 | static int __init platform_init(void) | ||
478 | { | ||
479 | platform_device_register(&smc91x_device); | ||
480 | return 0; | ||
481 | } | ||
482 | arch_initcall(platform_init); | ||
diff --git a/arch/m32r/kernel/setup_usrv.c b/arch/m32r/kernel/setup_usrv.c new file mode 100644 index 000000000000..fe417be5e3e9 --- /dev/null +++ b/arch/m32r/kernel/setup_usrv.c | |||
@@ -0,0 +1,256 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/setup_usrv.c | ||
3 | * | ||
4 | * Setup routines for MITSUBISHI uServer | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002, 2003 Hiroyuki Kondo, Hirokazu Takata, | ||
7 | * Hitoshi Yamamoto | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/irq.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | |||
15 | #include <asm/system.h> | ||
16 | #include <asm/m32r.h> | ||
17 | #include <asm/io.h> | ||
18 | |||
19 | #define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long))) | ||
20 | |||
21 | #if !defined(CONFIG_SMP) | ||
22 | typedef struct { | ||
23 | unsigned long icucr; /* ICU Control Register */ | ||
24 | } icu_data_t; | ||
25 | #endif /* CONFIG_SMP */ | ||
26 | |||
27 | icu_data_t icu_data[M32700UT_NUM_CPU_IRQ]; | ||
28 | |||
29 | static void disable_mappi_irq(unsigned int irq) | ||
30 | { | ||
31 | unsigned long port, data; | ||
32 | |||
33 | port = irq2port(irq); | ||
34 | data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7; | ||
35 | outl(data, port); | ||
36 | } | ||
37 | |||
38 | static void enable_mappi_irq(unsigned int irq) | ||
39 | { | ||
40 | unsigned long port, data; | ||
41 | |||
42 | port = irq2port(irq); | ||
43 | data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6; | ||
44 | outl(data, port); | ||
45 | } | ||
46 | |||
47 | static void mask_and_ack_mappi(unsigned int irq) | ||
48 | { | ||
49 | disable_mappi_irq(irq); | ||
50 | } | ||
51 | |||
52 | static void end_mappi_irq(unsigned int irq) | ||
53 | { | ||
54 | enable_mappi_irq(irq); | ||
55 | } | ||
56 | |||
57 | static unsigned int startup_mappi_irq(unsigned int irq) | ||
58 | { | ||
59 | enable_mappi_irq(irq); | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | static void shutdown_mappi_irq(unsigned int irq) | ||
64 | { | ||
65 | unsigned long port; | ||
66 | |||
67 | port = irq2port(irq); | ||
68 | outl(M32R_ICUCR_ILEVEL7, port); | ||
69 | } | ||
70 | |||
71 | static struct hw_interrupt_type mappi_irq_type = | ||
72 | { | ||
73 | "M32700-IRQ", | ||
74 | startup_mappi_irq, | ||
75 | shutdown_mappi_irq, | ||
76 | enable_mappi_irq, | ||
77 | disable_mappi_irq, | ||
78 | mask_and_ack_mappi, | ||
79 | end_mappi_irq | ||
80 | }; | ||
81 | |||
82 | /* | ||
83 | * Interrupt Control Unit of PLD on M32700UT (Level 2) | ||
84 | */ | ||
85 | #define irq2pldirq(x) ((x) - M32700UT_PLD_IRQ_BASE) | ||
86 | #define pldirq2port(x) (unsigned long)((int)PLD_ICUCR1 + \ | ||
87 | (((x) - 1) * sizeof(unsigned short))) | ||
88 | |||
89 | typedef struct { | ||
90 | unsigned short icucr; /* ICU Control Register */ | ||
91 | } pld_icu_data_t; | ||
92 | |||
93 | static pld_icu_data_t pld_icu_data[M32700UT_NUM_PLD_IRQ]; | ||
94 | |||
95 | static void disable_m32700ut_pld_irq(unsigned int irq) | ||
96 | { | ||
97 | unsigned long port, data; | ||
98 | unsigned int pldirq; | ||
99 | |||
100 | pldirq = irq2pldirq(irq); | ||
101 | port = pldirq2port(pldirq); | ||
102 | data = pld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; | ||
103 | outw(data, port); | ||
104 | } | ||
105 | |||
106 | static void enable_m32700ut_pld_irq(unsigned int irq) | ||
107 | { | ||
108 | unsigned long port, data; | ||
109 | unsigned int pldirq; | ||
110 | |||
111 | pldirq = irq2pldirq(irq); | ||
112 | port = pldirq2port(pldirq); | ||
113 | data = pld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; | ||
114 | outw(data, port); | ||
115 | } | ||
116 | |||
117 | static void mask_and_ack_m32700ut_pld(unsigned int irq) | ||
118 | { | ||
119 | disable_m32700ut_pld_irq(irq); | ||
120 | } | ||
121 | |||
122 | static void end_m32700ut_pld_irq(unsigned int irq) | ||
123 | { | ||
124 | enable_m32700ut_pld_irq(irq); | ||
125 | end_mappi_irq(M32R_IRQ_INT1); | ||
126 | } | ||
127 | |||
128 | static unsigned int startup_m32700ut_pld_irq(unsigned int irq) | ||
129 | { | ||
130 | enable_m32700ut_pld_irq(irq); | ||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | static void shutdown_m32700ut_pld_irq(unsigned int irq) | ||
135 | { | ||
136 | unsigned long port; | ||
137 | unsigned int pldirq; | ||
138 | |||
139 | pldirq = irq2pldirq(irq); | ||
140 | port = pldirq2port(pldirq); | ||
141 | outw(PLD_ICUCR_ILEVEL7, port); | ||
142 | } | ||
143 | |||
144 | static struct hw_interrupt_type m32700ut_pld_irq_type = | ||
145 | { | ||
146 | "USRV-PLD-IRQ", | ||
147 | startup_m32700ut_pld_irq, | ||
148 | shutdown_m32700ut_pld_irq, | ||
149 | enable_m32700ut_pld_irq, | ||
150 | disable_m32700ut_pld_irq, | ||
151 | mask_and_ack_m32700ut_pld, | ||
152 | end_m32700ut_pld_irq | ||
153 | }; | ||
154 | |||
155 | void __init init_IRQ(void) | ||
156 | { | ||
157 | static int once = 0; | ||
158 | int i; | ||
159 | |||
160 | if (once) | ||
161 | return; | ||
162 | else | ||
163 | once++; | ||
164 | |||
165 | /* MFT2 : system timer */ | ||
166 | irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED; | ||
167 | irq_desc[M32R_IRQ_MFT2].handler = &mappi_irq_type; | ||
168 | irq_desc[M32R_IRQ_MFT2].action = 0; | ||
169 | irq_desc[M32R_IRQ_MFT2].depth = 1; | ||
170 | icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; | ||
171 | disable_mappi_irq(M32R_IRQ_MFT2); | ||
172 | |||
173 | #if defined(CONFIG_SERIAL_M32R_SIO) | ||
174 | /* SIO0_R : uart receive data */ | ||
175 | irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED; | ||
176 | irq_desc[M32R_IRQ_SIO0_R].handler = &mappi_irq_type; | ||
177 | irq_desc[M32R_IRQ_SIO0_R].action = 0; | ||
178 | irq_desc[M32R_IRQ_SIO0_R].depth = 1; | ||
179 | icu_data[M32R_IRQ_SIO0_R].icucr = 0; | ||
180 | disable_mappi_irq(M32R_IRQ_SIO0_R); | ||
181 | |||
182 | /* SIO0_S : uart send data */ | ||
183 | irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED; | ||
184 | irq_desc[M32R_IRQ_SIO0_S].handler = &mappi_irq_type; | ||
185 | irq_desc[M32R_IRQ_SIO0_S].action = 0; | ||
186 | irq_desc[M32R_IRQ_SIO0_S].depth = 1; | ||
187 | icu_data[M32R_IRQ_SIO0_S].icucr = 0; | ||
188 | disable_mappi_irq(M32R_IRQ_SIO0_S); | ||
189 | |||
190 | /* SIO1_R : uart receive data */ | ||
191 | irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED; | ||
192 | irq_desc[M32R_IRQ_SIO1_R].handler = &mappi_irq_type; | ||
193 | irq_desc[M32R_IRQ_SIO1_R].action = 0; | ||
194 | irq_desc[M32R_IRQ_SIO1_R].depth = 1; | ||
195 | icu_data[M32R_IRQ_SIO1_R].icucr = 0; | ||
196 | disable_mappi_irq(M32R_IRQ_SIO1_R); | ||
197 | |||
198 | /* SIO1_S : uart send data */ | ||
199 | irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED; | ||
200 | irq_desc[M32R_IRQ_SIO1_S].handler = &mappi_irq_type; | ||
201 | irq_desc[M32R_IRQ_SIO1_S].action = 0; | ||
202 | irq_desc[M32R_IRQ_SIO1_S].depth = 1; | ||
203 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | ||
204 | disable_mappi_irq(M32R_IRQ_SIO1_S); | ||
205 | #endif /* CONFIG_SERIAL_M32R_SIO */ | ||
206 | |||
207 | /* INT#67-#71: CFC#0 IREQ on PLD */ | ||
208 | for (i = 0 ; i < CONFIG_CFC_NUM ; i++ ) { | ||
209 | irq_desc[PLD_IRQ_CF0 + i].status = IRQ_DISABLED; | ||
210 | irq_desc[PLD_IRQ_CF0 + i].handler = &m32700ut_pld_irq_type; | ||
211 | irq_desc[PLD_IRQ_CF0 + i].action = 0; | ||
212 | irq_desc[PLD_IRQ_CF0 + i].depth = 1; /* disable nested irq */ | ||
213 | pld_icu_data[irq2pldirq(PLD_IRQ_CF0 + i)].icucr | ||
214 | = PLD_ICUCR_ISMOD01; /* 'L' level sense */ | ||
215 | disable_m32700ut_pld_irq(PLD_IRQ_CF0 + i); | ||
216 | } | ||
217 | |||
218 | #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE) | ||
219 | /* INT#76: 16552D#0 IREQ on PLD */ | ||
220 | irq_desc[PLD_IRQ_UART0].status = IRQ_DISABLED; | ||
221 | irq_desc[PLD_IRQ_UART0].handler = &m32700ut_pld_irq_type; | ||
222 | irq_desc[PLD_IRQ_UART0].action = 0; | ||
223 | irq_desc[PLD_IRQ_UART0].depth = 1; /* disable nested irq */ | ||
224 | pld_icu_data[irq2pldirq(PLD_IRQ_UART0)].icucr | ||
225 | = PLD_ICUCR_ISMOD03; /* 'H' level sense */ | ||
226 | disable_m32700ut_pld_irq(PLD_IRQ_UART0); | ||
227 | |||
228 | /* INT#77: 16552D#1 IREQ on PLD */ | ||
229 | irq_desc[PLD_IRQ_UART1].status = IRQ_DISABLED; | ||
230 | irq_desc[PLD_IRQ_UART1].handler = &m32700ut_pld_irq_type; | ||
231 | irq_desc[PLD_IRQ_UART1].action = 0; | ||
232 | irq_desc[PLD_IRQ_UART1].depth = 1; /* disable nested irq */ | ||
233 | pld_icu_data[irq2pldirq(PLD_IRQ_UART1)].icucr | ||
234 | = PLD_ICUCR_ISMOD03; /* 'H' level sense */ | ||
235 | disable_m32700ut_pld_irq(PLD_IRQ_UART1); | ||
236 | #endif /* CONFIG_SERIAL_8250 || CONFIG_SERIAL_8250_MODULE */ | ||
237 | |||
238 | #if defined(CONFIG_IDC_AK4524) || defined(CONFIG_IDC_AK4524_MODULE) | ||
239 | /* INT#80: AK4524 IREQ on PLD */ | ||
240 | irq_desc[PLD_IRQ_SNDINT].status = IRQ_DISABLED; | ||
241 | irq_desc[PLD_IRQ_SNDINT].handler = &m32700ut_pld_irq_type; | ||
242 | irq_desc[PLD_IRQ_SNDINT].action = 0; | ||
243 | irq_desc[PLD_IRQ_SNDINT].depth = 1; /* disable nested irq */ | ||
244 | pld_icu_data[irq2pldirq(PLD_IRQ_SNDINT)].icucr | ||
245 | = PLD_ICUCR_ISMOD01; /* 'L' level sense */ | ||
246 | disable_m32700ut_pld_irq(PLD_IRQ_SNDINT); | ||
247 | #endif /* CONFIG_IDC_AK4524 || CONFIG_IDC_AK4524_MODULE */ | ||
248 | |||
249 | /* | ||
250 | * INT1# is used for UART, MMC, CF Controller in FPGA. | ||
251 | * We enable it here. | ||
252 | */ | ||
253 | icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD11; | ||
254 | enable_mappi_irq(M32R_IRQ_INT1); | ||
255 | } | ||
256 | |||
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c new file mode 100644 index 000000000000..50311eb07a24 --- /dev/null +++ b/arch/m32r/kernel/signal.c | |||
@@ -0,0 +1,438 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/signal.c | ||
3 | * | ||
4 | * Copyright (c) 2003 Hitoshi Yamamoto | ||
5 | * | ||
6 | * Taken from i386 version. | ||
7 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
8 | * | ||
9 | * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson | ||
10 | * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes | ||
11 | */ | ||
12 | |||
13 | #include <linux/config.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/mm.h> | ||
16 | #include <linux/smp.h> | ||
17 | #include <linux/smp_lock.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/signal.h> | ||
20 | #include <linux/errno.h> | ||
21 | #include <linux/wait.h> | ||
22 | #include <linux/unistd.h> | ||
23 | #include <linux/stddef.h> | ||
24 | #include <linux/personality.h> | ||
25 | #include <linux/suspend.h> | ||
26 | #include <asm/cacheflush.h> | ||
27 | #include <asm/ucontext.h> | ||
28 | #include <asm/uaccess.h> | ||
29 | |||
30 | #define DEBUG_SIG 0 | ||
31 | |||
32 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | ||
33 | |||
34 | int do_signal(struct pt_regs *, sigset_t *); | ||
35 | |||
36 | asmlinkage int | ||
37 | sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, | ||
38 | unsigned long r2, unsigned long r3, unsigned long r4, | ||
39 | unsigned long r5, unsigned long r6, struct pt_regs regs) | ||
40 | { | ||
41 | sigset_t saveset, newset; | ||
42 | |||
43 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
44 | if (sigsetsize != sizeof(sigset_t)) | ||
45 | return -EINVAL; | ||
46 | |||
47 | if (copy_from_user(&newset, unewset, sizeof(newset))) | ||
48 | return -EFAULT; | ||
49 | sigdelsetmask(&newset, ~_BLOCKABLE); | ||
50 | |||
51 | spin_lock_irq(¤t->sighand->siglock); | ||
52 | saveset = current->blocked; | ||
53 | current->blocked = newset; | ||
54 | recalc_sigpending(); | ||
55 | spin_unlock_irq(¤t->sighand->siglock); | ||
56 | |||
57 | regs.r0 = -EINTR; | ||
58 | while (1) { | ||
59 | current->state = TASK_INTERRUPTIBLE; | ||
60 | schedule(); | ||
61 | if (do_signal(®s, &saveset)) | ||
62 | return regs.r0; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | asmlinkage int | ||
67 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
68 | unsigned long r2, unsigned long r3, unsigned long r4, | ||
69 | unsigned long r5, unsigned long r6, struct pt_regs regs) | ||
70 | { | ||
71 | return do_sigaltstack(uss, uoss, regs.spu); | ||
72 | } | ||
73 | |||
74 | |||
75 | /* | ||
76 | * Do a signal return; undo the signal stack. | ||
77 | */ | ||
78 | |||
79 | struct rt_sigframe | ||
80 | { | ||
81 | int sig; | ||
82 | struct siginfo *pinfo; | ||
83 | void *puc; | ||
84 | struct siginfo info; | ||
85 | struct ucontext uc; | ||
86 | // struct _fpstate fpstate; | ||
87 | }; | ||
88 | |||
89 | static int | ||
90 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | ||
91 | int *r0_p) | ||
92 | { | ||
93 | unsigned int err = 0; | ||
94 | |||
95 | /* Always make any pending restarted system calls return -EINTR */ | ||
96 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
97 | |||
98 | #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x) | ||
99 | COPY(r4); | ||
100 | COPY(r5); | ||
101 | COPY(r6); | ||
102 | COPY(pt_regs); | ||
103 | /* COPY(r0); Skip r0 */ | ||
104 | COPY(r1); | ||
105 | COPY(r2); | ||
106 | COPY(r3); | ||
107 | COPY(r7); | ||
108 | COPY(r8); | ||
109 | COPY(r9); | ||
110 | COPY(r10); | ||
111 | COPY(r11); | ||
112 | COPY(r12); | ||
113 | #if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) | ||
114 | COPY(acc0h); | ||
115 | COPY(acc0l); | ||
116 | COPY(acc1h); | ||
117 | COPY(acc1l); | ||
118 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||
119 | COPY(acch); | ||
120 | COPY(accl); | ||
121 | #else | ||
122 | #error unknown isa configuration | ||
123 | #endif | ||
124 | COPY(psw); | ||
125 | COPY(bpc); | ||
126 | COPY(bbpsw); | ||
127 | COPY(bbpc); | ||
128 | COPY(spu); | ||
129 | COPY(fp); | ||
130 | COPY(lr); | ||
131 | COPY(spi); | ||
132 | #undef COPY | ||
133 | |||
134 | regs->syscall_nr = -1; /* disable syscall checks */ | ||
135 | err |= __get_user(*r0_p, &sc->sc_r0); | ||
136 | |||
137 | return err; | ||
138 | } | ||
139 | |||
140 | asmlinkage int | ||
141 | sys_rt_sigreturn(unsigned long r0, unsigned long r1, | ||
142 | unsigned long r2, unsigned long r3, unsigned long r4, | ||
143 | unsigned long r5, unsigned long r6, struct pt_regs regs) | ||
144 | { | ||
145 | struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs.spu; | ||
146 | sigset_t set; | ||
147 | stack_t st; | ||
148 | int result; | ||
149 | |||
150 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | ||
151 | goto badframe; | ||
152 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) | ||
153 | goto badframe; | ||
154 | |||
155 | sigdelsetmask(&set, ~_BLOCKABLE); | ||
156 | spin_lock_irq(¤t->sighand->siglock); | ||
157 | current->blocked = set; | ||
158 | recalc_sigpending(); | ||
159 | spin_unlock_irq(¤t->sighand->siglock); | ||
160 | |||
161 | if (restore_sigcontext(®s, &frame->uc.uc_mcontext, &result)) | ||
162 | goto badframe; | ||
163 | |||
164 | if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) | ||
165 | goto badframe; | ||
166 | /* It is more difficult to avoid calling this function than to | ||
167 | call it and ignore errors. */ | ||
168 | do_sigaltstack(&st, NULL, regs.spu); | ||
169 | |||
170 | return result; | ||
171 | |||
172 | badframe: | ||
173 | force_sig(SIGSEGV, current); | ||
174 | return 0; | ||
175 | } | ||
176 | |||
177 | /* | ||
178 | * Set up a signal frame. | ||
179 | */ | ||
180 | |||
181 | static int | ||
182 | setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | ||
183 | unsigned long mask) | ||
184 | { | ||
185 | int err = 0; | ||
186 | |||
187 | #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x) | ||
188 | COPY(r4); | ||
189 | COPY(r5); | ||
190 | COPY(r6); | ||
191 | COPY(pt_regs); | ||
192 | COPY(r0); | ||
193 | COPY(r1); | ||
194 | COPY(r2); | ||
195 | COPY(r3); | ||
196 | COPY(r7); | ||
197 | COPY(r8); | ||
198 | COPY(r9); | ||
199 | COPY(r10); | ||
200 | COPY(r11); | ||
201 | COPY(r12); | ||
202 | #if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) | ||
203 | COPY(acc0h); | ||
204 | COPY(acc0l); | ||
205 | COPY(acc1h); | ||
206 | COPY(acc1l); | ||
207 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||
208 | COPY(acch); | ||
209 | COPY(accl); | ||
210 | #else | ||
211 | #error unknown isa configuration | ||
212 | #endif | ||
213 | COPY(psw); | ||
214 | COPY(bpc); | ||
215 | COPY(bbpsw); | ||
216 | COPY(bbpc); | ||
217 | COPY(spu); | ||
218 | COPY(fp); | ||
219 | COPY(lr); | ||
220 | COPY(spi); | ||
221 | #undef COPY | ||
222 | |||
223 | err |= __put_user(mask, &sc->oldmask); | ||
224 | |||
225 | return err; | ||
226 | } | ||
227 | |||
228 | /* | ||
229 | * Determine which stack to use.. | ||
230 | */ | ||
231 | static inline void __user * | ||
232 | get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) | ||
233 | { | ||
234 | /* This is the X/Open sanctioned signal stack switching. */ | ||
235 | if (ka->sa.sa_flags & SA_ONSTACK) { | ||
236 | if (sas_ss_flags(sp) == 0) | ||
237 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
238 | } | ||
239 | |||
240 | return (void __user *)((sp - frame_size) & -8ul); | ||
241 | } | ||
242 | |||
243 | static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | ||
244 | sigset_t *set, struct pt_regs *regs) | ||
245 | { | ||
246 | struct rt_sigframe __user *frame; | ||
247 | int err = 0; | ||
248 | int signal; | ||
249 | |||
250 | frame = get_sigframe(ka, regs->spu, sizeof(*frame)); | ||
251 | |||
252 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | ||
253 | goto give_sigsegv; | ||
254 | |||
255 | signal = current_thread_info()->exec_domain | ||
256 | && current_thread_info()->exec_domain->signal_invmap | ||
257 | && sig < 32 | ||
258 | ? current_thread_info()->exec_domain->signal_invmap[sig] | ||
259 | : sig; | ||
260 | |||
261 | err |= __put_user(signal, &frame->sig); | ||
262 | if (err) | ||
263 | goto give_sigsegv; | ||
264 | |||
265 | err |= __put_user(&frame->info, &frame->pinfo); | ||
266 | err |= __put_user(&frame->uc, &frame->puc); | ||
267 | err |= copy_siginfo_to_user(&frame->info, info); | ||
268 | if (err) | ||
269 | goto give_sigsegv; | ||
270 | |||
271 | /* Create the ucontext. */ | ||
272 | err |= __put_user(0, &frame->uc.uc_flags); | ||
273 | err |= __put_user(0, &frame->uc.uc_link); | ||
274 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | ||
275 | err |= __put_user(sas_ss_flags(regs->spu), | ||
276 | &frame->uc.uc_stack.ss_flags); | ||
277 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
278 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); | ||
279 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | ||
280 | if (err) | ||
281 | goto give_sigsegv; | ||
282 | |||
283 | /* Set up to return from userspace. */ | ||
284 | regs->lr = (unsigned long)ka->sa.sa_restorer; | ||
285 | |||
286 | /* Set up registers for signal handler */ | ||
287 | regs->spu = (unsigned long)frame; | ||
288 | regs->r0 = signal; /* Arg for signal handler */ | ||
289 | regs->r1 = (unsigned long)&frame->info; | ||
290 | regs->r2 = (unsigned long)&frame->uc; | ||
291 | regs->bpc = (unsigned long)ka->sa.sa_handler; | ||
292 | |||
293 | set_fs(USER_DS); | ||
294 | |||
295 | #if DEBUG_SIG | ||
296 | printk("SIG deliver (%s:%d): sp=%p pc=%p\n", | ||
297 | current->comm, current->pid, frame, regs->pc); | ||
298 | #endif | ||
299 | |||
300 | return; | ||
301 | |||
302 | give_sigsegv: | ||
303 | force_sigsegv(sig, current); | ||
304 | } | ||
305 | |||
306 | /* | ||
307 | * OK, we're invoking a handler | ||
308 | */ | ||
309 | |||
310 | static void | ||
311 | handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | ||
312 | sigset_t *oldset, struct pt_regs *regs) | ||
313 | { | ||
314 | unsigned short inst; | ||
315 | |||
316 | /* Are we from a system call? */ | ||
317 | if (regs->syscall_nr >= 0) { | ||
318 | /* If so, check system call restarting.. */ | ||
319 | switch (regs->r0) { | ||
320 | case -ERESTART_RESTARTBLOCK: | ||
321 | case -ERESTARTNOHAND: | ||
322 | regs->r0 = -EINTR; | ||
323 | break; | ||
324 | |||
325 | case -ERESTARTSYS: | ||
326 | if (!(ka->sa.sa_flags & SA_RESTART)) { | ||
327 | regs->r0 = -EINTR; | ||
328 | break; | ||
329 | } | ||
330 | /* fallthrough */ | ||
331 | case -ERESTARTNOINTR: | ||
332 | regs->r0 = regs->orig_r0; | ||
333 | inst = *(unsigned short *)(regs->bpc - 2); | ||
334 | if ((inst & 0xfff0) == 0x10f0) /* trap ? */ | ||
335 | regs->bpc -= 2; | ||
336 | else | ||
337 | regs->bpc -= 4; | ||
338 | } | ||
339 | } | ||
340 | |||
341 | /* Set up the stack frame */ | ||
342 | setup_rt_frame(sig, ka, info, oldset, regs); | ||
343 | |||
344 | if (!(ka->sa.sa_flags & SA_NODEFER)) { | ||
345 | spin_lock_irq(¤t->sighand->siglock); | ||
346 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
347 | sigaddset(¤t->blocked,sig); | ||
348 | recalc_sigpending(); | ||
349 | spin_unlock_irq(¤t->sighand->siglock); | ||
350 | } | ||
351 | } | ||
352 | |||
353 | /* | ||
354 | * Note that 'init' is a special process: it doesn't get signals it doesn't | ||
355 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | ||
356 | * mistake. | ||
357 | */ | ||
358 | int do_signal(struct pt_regs *regs, sigset_t *oldset) | ||
359 | { | ||
360 | siginfo_t info; | ||
361 | int signr; | ||
362 | struct k_sigaction ka; | ||
363 | unsigned short inst; | ||
364 | |||
365 | /* | ||
366 | * We want the common case to go fast, which | ||
367 | * is why we may in certain cases get here from | ||
368 | * kernel mode. Just return without doing anything | ||
369 | * if so. | ||
370 | */ | ||
371 | if (!user_mode(regs)) | ||
372 | return 1; | ||
373 | |||
374 | if (current->flags & PF_FREEZE) { | ||
375 | refrigerator(0); | ||
376 | goto no_signal; | ||
377 | } | ||
378 | |||
379 | if (!oldset) | ||
380 | oldset = ¤t->blocked; | ||
381 | |||
382 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | ||
383 | if (signr > 0) { | ||
384 | /* Reenable any watchpoints before delivering the | ||
385 | * signal to user space. The processor register will | ||
386 | * have been cleared if the watchpoint triggered | ||
387 | * inside the kernel. | ||
388 | */ | ||
389 | |||
390 | /* Whee! Actually deliver the signal. */ | ||
391 | handle_signal(signr, &ka, &info, oldset, regs); | ||
392 | return 1; | ||
393 | } | ||
394 | |||
395 | no_signal: | ||
396 | /* Did we come from a system call? */ | ||
397 | if (regs->syscall_nr >= 0) { | ||
398 | /* Restart the system call - no handlers present */ | ||
399 | if (regs->r0 == -ERESTARTNOHAND || | ||
400 | regs->r0 == -ERESTARTSYS || | ||
401 | regs->r0 == -ERESTARTNOINTR) { | ||
402 | regs->r0 = regs->orig_r0; | ||
403 | inst = *(unsigned short *)(regs->bpc - 2); | ||
404 | if ((inst & 0xfff0) == 0x10f0) /* trap ? */ | ||
405 | regs->bpc -= 2; | ||
406 | else | ||
407 | regs->bpc -= 4; | ||
408 | } | ||
409 | if (regs->r0 == -ERESTART_RESTARTBLOCK){ | ||
410 | regs->r0 = regs->orig_r0; | ||
411 | regs->r7 = __NR_restart_syscall; | ||
412 | inst = *(unsigned short *)(regs->bpc - 2); | ||
413 | if ((inst & 0xfff0) == 0x10f0) /* trap ? */ | ||
414 | regs->bpc -= 2; | ||
415 | else | ||
416 | regs->bpc -= 4; | ||
417 | } | ||
418 | } | ||
419 | return 0; | ||
420 | } | ||
421 | |||
422 | /* | ||
423 | * notification of userspace execution resumption | ||
424 | * - triggered by current->work.notify_resume | ||
425 | */ | ||
426 | void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, | ||
427 | __u32 thread_info_flags) | ||
428 | { | ||
429 | /* Pending single-step? */ | ||
430 | if (thread_info_flags & _TIF_SINGLESTEP) | ||
431 | clear_thread_flag(TIF_SINGLESTEP); | ||
432 | |||
433 | /* deal with pending signal delivery */ | ||
434 | if (thread_info_flags & _TIF_SIGPENDING) | ||
435 | do_signal(regs,oldset); | ||
436 | |||
437 | clear_thread_flag(TIF_IRET); | ||
438 | } | ||
diff --git a/arch/m32r/kernel/smp.c b/arch/m32r/kernel/smp.c new file mode 100644 index 000000000000..48b187f2d2b3 --- /dev/null +++ b/arch/m32r/kernel/smp.c | |||
@@ -0,0 +1,965 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/smp.c | ||
3 | * | ||
4 | * M32R SMP support routines. | ||
5 | * | ||
6 | * Copyright (c) 2001, 2002 Hitoshi Yamamoto | ||
7 | * | ||
8 | * Taken from i386 version. | ||
9 | * (c) 1995 Alan Cox, Building #3 <alan@redhat.com> | ||
10 | * (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com> | ||
11 | * | ||
12 | * This code is released under the GNU General Public License version 2 or | ||
13 | * later. | ||
14 | */ | ||
15 | |||
16 | #undef DEBUG_SMP | ||
17 | |||
18 | #include <linux/irq.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/spinlock.h> | ||
21 | #include <linux/mm.h> | ||
22 | #include <linux/smp.h> | ||
23 | #include <linux/profile.h> | ||
24 | #include <linux/cpu.h> | ||
25 | |||
26 | #include <asm/cacheflush.h> | ||
27 | #include <asm/pgalloc.h> | ||
28 | #include <asm/atomic.h> | ||
29 | #include <asm/io.h> | ||
30 | #include <asm/mmu_context.h> | ||
31 | #include <asm/m32r.h> | ||
32 | |||
33 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
34 | /* Data structures and variables */ | ||
35 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
36 | |||
37 | /* | ||
38 | * Structure and data for smp_call_function(). This is designed to minimise | ||
39 | * static memory requirements. It also looks cleaner. | ||
40 | */ | ||
41 | static DEFINE_SPINLOCK(call_lock); | ||
42 | |||
43 | struct call_data_struct { | ||
44 | void (*func) (void *info); | ||
45 | void *info; | ||
46 | atomic_t started; | ||
47 | atomic_t finished; | ||
48 | int wait; | ||
49 | } __attribute__ ((__aligned__(SMP_CACHE_BYTES))); | ||
50 | |||
51 | static struct call_data_struct *call_data; | ||
52 | |||
53 | /* | ||
54 | * For flush_cache_all() | ||
55 | */ | ||
56 | static DEFINE_SPINLOCK(flushcache_lock); | ||
57 | static volatile unsigned long flushcache_cpumask = 0; | ||
58 | |||
59 | /* | ||
60 | * For flush_tlb_others() | ||
61 | */ | ||
62 | static volatile cpumask_t flush_cpumask; | ||
63 | static struct mm_struct *flush_mm; | ||
64 | static struct vm_area_struct *flush_vma; | ||
65 | static volatile unsigned long flush_va; | ||
66 | static DEFINE_SPINLOCK(tlbstate_lock); | ||
67 | #define FLUSH_ALL 0xffffffff | ||
68 | |||
69 | DECLARE_PER_CPU(int, prof_multiplier); | ||
70 | DECLARE_PER_CPU(int, prof_old_multiplier); | ||
71 | DECLARE_PER_CPU(int, prof_counter); | ||
72 | |||
73 | extern spinlock_t ipi_lock[]; | ||
74 | |||
75 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
76 | /* Function Prototypes */ | ||
77 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
78 | |||
79 | void smp_send_reschedule(int); | ||
80 | void smp_reschedule_interrupt(void); | ||
81 | |||
82 | void smp_flush_cache_all(void); | ||
83 | void smp_flush_cache_all_interrupt(void); | ||
84 | |||
85 | void smp_flush_tlb_all(void); | ||
86 | static void flush_tlb_all_ipi(void *); | ||
87 | |||
88 | void smp_flush_tlb_mm(struct mm_struct *); | ||
89 | void smp_flush_tlb_range(struct vm_area_struct *, unsigned long, \ | ||
90 | unsigned long); | ||
91 | void smp_flush_tlb_page(struct vm_area_struct *, unsigned long); | ||
92 | static void flush_tlb_others(cpumask_t, struct mm_struct *, | ||
93 | struct vm_area_struct *, unsigned long); | ||
94 | void smp_invalidate_interrupt(void); | ||
95 | |||
96 | void smp_send_stop(void); | ||
97 | static void stop_this_cpu(void *); | ||
98 | |||
99 | int smp_call_function(void (*) (void *), void *, int, int); | ||
100 | void smp_call_function_interrupt(void); | ||
101 | |||
102 | void smp_send_timer(void); | ||
103 | void smp_ipi_timer_interrupt(struct pt_regs *); | ||
104 | void smp_local_timer_interrupt(struct pt_regs *); | ||
105 | |||
106 | void send_IPI_allbutself(int, int); | ||
107 | static void send_IPI_mask(cpumask_t, int, int); | ||
108 | unsigned long send_IPI_mask_phys(cpumask_t, int, int); | ||
109 | |||
110 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
111 | /* Rescheduling request Routines */ | ||
112 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
113 | |||
114 | /*==========================================================================* | ||
115 | * Name: smp_send_reschedule | ||
116 | * | ||
117 | * Description: This routine requests other CPU to execute rescheduling. | ||
118 | * 1.Send 'RESCHEDULE_IPI' to other CPU. | ||
119 | * Request other CPU to execute 'smp_reschedule_interrupt()'. | ||
120 | * | ||
121 | * Born on Date: 2002.02.05 | ||
122 | * | ||
123 | * Arguments: cpu_id - Target CPU ID | ||
124 | * | ||
125 | * Returns: void (cannot fail) | ||
126 | * | ||
127 | * Modification log: | ||
128 | * Date Who Description | ||
129 | * ---------- --- -------------------------------------------------------- | ||
130 | * | ||
131 | *==========================================================================*/ | ||
132 | void smp_send_reschedule(int cpu_id) | ||
133 | { | ||
134 | WARN_ON(cpu_is_offline(cpu_id)); | ||
135 | send_IPI_mask(cpumask_of_cpu(cpu_id), RESCHEDULE_IPI, 1); | ||
136 | } | ||
137 | |||
138 | /*==========================================================================* | ||
139 | * Name: smp_reschedule_interrupt | ||
140 | * | ||
141 | * Description: This routine executes on CPU which received | ||
142 | * 'RESCHEDULE_IPI'. | ||
143 | * Rescheduling is processed at the exit of interrupt | ||
144 | * operation. | ||
145 | * | ||
146 | * Born on Date: 2002.02.05 | ||
147 | * | ||
148 | * Arguments: NONE | ||
149 | * | ||
150 | * Returns: void (cannot fail) | ||
151 | * | ||
152 | * Modification log: | ||
153 | * Date Who Description | ||
154 | * ---------- --- -------------------------------------------------------- | ||
155 | * | ||
156 | *==========================================================================*/ | ||
157 | void smp_reschedule_interrupt(void) | ||
158 | { | ||
159 | /* nothing to do */ | ||
160 | } | ||
161 | |||
162 | /*==========================================================================* | ||
163 | * Name: smp_flush_cache_all | ||
164 | * | ||
165 | * Description: This routine sends a 'INVALIDATE_CACHE_IPI' to all other | ||
166 | * CPUs in the system. | ||
167 | * | ||
168 | * Born on Date: 2003-05-28 | ||
169 | * | ||
170 | * Arguments: NONE | ||
171 | * | ||
172 | * Returns: void (cannot fail) | ||
173 | * | ||
174 | * Modification log: | ||
175 | * Date Who Description | ||
176 | * ---------- --- -------------------------------------------------------- | ||
177 | * | ||
178 | *==========================================================================*/ | ||
179 | void smp_flush_cache_all(void) | ||
180 | { | ||
181 | cpumask_t cpumask; | ||
182 | unsigned long *mask; | ||
183 | |||
184 | preempt_disable(); | ||
185 | cpumask = cpu_online_map; | ||
186 | cpu_clear(smp_processor_id(), cpumask); | ||
187 | spin_lock(&flushcache_lock); | ||
188 | mask=cpus_addr(cpumask); | ||
189 | atomic_set_mask(*mask, (atomic_t *)&flushcache_cpumask); | ||
190 | send_IPI_mask(cpumask, INVALIDATE_CACHE_IPI, 0); | ||
191 | _flush_cache_copyback_all(); | ||
192 | while (flushcache_cpumask) | ||
193 | mb(); | ||
194 | spin_unlock(&flushcache_lock); | ||
195 | preempt_enable(); | ||
196 | } | ||
197 | |||
198 | void smp_flush_cache_all_interrupt(void) | ||
199 | { | ||
200 | _flush_cache_copyback_all(); | ||
201 | clear_bit(smp_processor_id(), &flushcache_cpumask); | ||
202 | } | ||
203 | |||
204 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
205 | /* TLB flush request Routins */ | ||
206 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
207 | |||
208 | /*==========================================================================* | ||
209 | * Name: smp_flush_tlb_all | ||
210 | * | ||
211 | * Description: This routine flushes all processes TLBs. | ||
212 | * 1.Request other CPU to execute 'flush_tlb_all_ipi()'. | ||
213 | * 2.Execute 'do_flush_tlb_all_local()'. | ||
214 | * | ||
215 | * Born on Date: 2002.02.05 | ||
216 | * | ||
217 | * Arguments: NONE | ||
218 | * | ||
219 | * Returns: void (cannot fail) | ||
220 | * | ||
221 | * Modification log: | ||
222 | * Date Who Description | ||
223 | * ---------- --- -------------------------------------------------------- | ||
224 | * | ||
225 | *==========================================================================*/ | ||
226 | void smp_flush_tlb_all(void) | ||
227 | { | ||
228 | unsigned long flags; | ||
229 | |||
230 | preempt_disable(); | ||
231 | local_irq_save(flags); | ||
232 | __flush_tlb_all(); | ||
233 | local_irq_restore(flags); | ||
234 | smp_call_function(flush_tlb_all_ipi, 0, 1, 1); | ||
235 | preempt_enable(); | ||
236 | } | ||
237 | |||
238 | /*==========================================================================* | ||
239 | * Name: flush_tlb_all_ipi | ||
240 | * | ||
241 | * Description: This routine flushes all local TLBs. | ||
242 | * 1.Execute 'do_flush_tlb_all_local()'. | ||
243 | * | ||
244 | * Born on Date: 2002.02.05 | ||
245 | * | ||
246 | * Arguments: *info - not used | ||
247 | * | ||
248 | * Returns: void (cannot fail) | ||
249 | * | ||
250 | * Modification log: | ||
251 | * Date Who Description | ||
252 | * ---------- --- -------------------------------------------------------- | ||
253 | * | ||
254 | *==========================================================================*/ | ||
255 | static void flush_tlb_all_ipi(void *info) | ||
256 | { | ||
257 | __flush_tlb_all(); | ||
258 | } | ||
259 | |||
260 | /*==========================================================================* | ||
261 | * Name: smp_flush_tlb_mm | ||
262 | * | ||
263 | * Description: This routine flushes the specified mm context TLB's. | ||
264 | * | ||
265 | * Born on Date: 2002.02.05 | ||
266 | * | ||
267 | * Arguments: *mm - a pointer to the mm struct for flush TLB | ||
268 | * | ||
269 | * Returns: void (cannot fail) | ||
270 | * | ||
271 | * Modification log: | ||
272 | * Date Who Description | ||
273 | * ---------- --- -------------------------------------------------------- | ||
274 | * | ||
275 | *==========================================================================*/ | ||
276 | void smp_flush_tlb_mm(struct mm_struct *mm) | ||
277 | { | ||
278 | int cpu_id = smp_processor_id(); | ||
279 | cpumask_t cpu_mask; | ||
280 | unsigned long *mmc = &mm->context[cpu_id]; | ||
281 | unsigned long flags; | ||
282 | |||
283 | preempt_disable(); | ||
284 | cpu_mask = mm->cpu_vm_mask; | ||
285 | cpu_clear(cpu_id, cpu_mask); | ||
286 | |||
287 | if (*mmc != NO_CONTEXT) { | ||
288 | local_irq_save(flags); | ||
289 | *mmc = NO_CONTEXT; | ||
290 | if (mm == current->mm) | ||
291 | activate_context(mm); | ||
292 | else | ||
293 | cpu_clear(cpu_id, mm->cpu_vm_mask); | ||
294 | local_irq_restore(flags); | ||
295 | } | ||
296 | if (!cpus_empty(cpu_mask)) | ||
297 | flush_tlb_others(cpu_mask, mm, NULL, FLUSH_ALL); | ||
298 | |||
299 | preempt_enable(); | ||
300 | } | ||
301 | |||
302 | /*==========================================================================* | ||
303 | * Name: smp_flush_tlb_range | ||
304 | * | ||
305 | * Description: This routine flushes a range of pages. | ||
306 | * | ||
307 | * Born on Date: 2002.02.05 | ||
308 | * | ||
309 | * Arguments: *mm - a pointer to the mm struct for flush TLB | ||
310 | * start - not used | ||
311 | * end - not used | ||
312 | * | ||
313 | * Returns: void (cannot fail) | ||
314 | * | ||
315 | * Modification log: | ||
316 | * Date Who Description | ||
317 | * ---------- --- -------------------------------------------------------- | ||
318 | * | ||
319 | *==========================================================================*/ | ||
320 | void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | ||
321 | unsigned long end) | ||
322 | { | ||
323 | smp_flush_tlb_mm(vma->vm_mm); | ||
324 | } | ||
325 | |||
326 | /*==========================================================================* | ||
327 | * Name: smp_flush_tlb_page | ||
328 | * | ||
329 | * Description: This routine flushes one page. | ||
330 | * | ||
331 | * Born on Date: 2002.02.05 | ||
332 | * | ||
333 | * Arguments: *vma - a pointer to the vma struct include va | ||
334 | * va - virtual address for flush TLB | ||
335 | * | ||
336 | * Returns: void (cannot fail) | ||
337 | * | ||
338 | * Modification log: | ||
339 | * Date Who Description | ||
340 | * ---------- --- -------------------------------------------------------- | ||
341 | * | ||
342 | *==========================================================================*/ | ||
343 | void smp_flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | ||
344 | { | ||
345 | struct mm_struct *mm = vma->vm_mm; | ||
346 | int cpu_id = smp_processor_id(); | ||
347 | cpumask_t cpu_mask; | ||
348 | unsigned long *mmc = &mm->context[cpu_id]; | ||
349 | unsigned long flags; | ||
350 | |||
351 | preempt_disable(); | ||
352 | cpu_mask = mm->cpu_vm_mask; | ||
353 | cpu_clear(cpu_id, cpu_mask); | ||
354 | |||
355 | #ifdef DEBUG_SMP | ||
356 | if (!mm) | ||
357 | BUG(); | ||
358 | #endif | ||
359 | |||
360 | if (*mmc != NO_CONTEXT) { | ||
361 | local_irq_save(flags); | ||
362 | va &= PAGE_MASK; | ||
363 | va |= (*mmc & MMU_CONTEXT_ASID_MASK); | ||
364 | __flush_tlb_page(va); | ||
365 | local_irq_restore(flags); | ||
366 | } | ||
367 | if (!cpus_empty(cpu_mask)) | ||
368 | flush_tlb_others(cpu_mask, mm, vma, va); | ||
369 | |||
370 | preempt_enable(); | ||
371 | } | ||
372 | |||
373 | /*==========================================================================* | ||
374 | * Name: flush_tlb_others | ||
375 | * | ||
376 | * Description: This routine requests other CPU to execute flush TLB. | ||
377 | * 1.Setup parmeters. | ||
378 | * 2.Send 'INVALIDATE_TLB_IPI' to other CPU. | ||
379 | * Request other CPU to execute 'smp_invalidate_interrupt()'. | ||
380 | * 3.Wait for other CPUs operation finished. | ||
381 | * | ||
382 | * Born on Date: 2002.02.05 | ||
383 | * | ||
384 | * Arguments: cpumask - bitmap of target CPUs | ||
385 | * *mm - a pointer to the mm struct for flush TLB | ||
386 | * *vma - a pointer to the vma struct include va | ||
387 | * va - virtual address for flush TLB | ||
388 | * | ||
389 | * Returns: void (cannot fail) | ||
390 | * | ||
391 | * Modification log: | ||
392 | * Date Who Description | ||
393 | * ---------- --- -------------------------------------------------------- | ||
394 | * | ||
395 | *==========================================================================*/ | ||
396 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | ||
397 | struct vm_area_struct *vma, unsigned long va) | ||
398 | { | ||
399 | unsigned long *mask; | ||
400 | #ifdef DEBUG_SMP | ||
401 | unsigned long flags; | ||
402 | __save_flags(flags); | ||
403 | if (!(flags & 0x0040)) /* Interrupt Disable NONONO */ | ||
404 | BUG(); | ||
405 | #endif /* DEBUG_SMP */ | ||
406 | |||
407 | /* | ||
408 | * A couple of (to be removed) sanity checks: | ||
409 | * | ||
410 | * - we do not send IPIs to not-yet booted CPUs. | ||
411 | * - current CPU must not be in mask | ||
412 | * - mask must exist :) | ||
413 | */ | ||
414 | BUG_ON(cpus_empty(cpumask)); | ||
415 | |||
416 | BUG_ON(cpu_isset(smp_processor_id(), cpumask)); | ||
417 | BUG_ON(!mm); | ||
418 | |||
419 | /* If a CPU which we ran on has gone down, OK. */ | ||
420 | cpus_and(cpumask, cpumask, cpu_online_map); | ||
421 | if (cpus_empty(cpumask)) | ||
422 | return; | ||
423 | |||
424 | /* | ||
425 | * i'm not happy about this global shared spinlock in the | ||
426 | * MM hot path, but we'll see how contended it is. | ||
427 | * Temporarily this turns IRQs off, so that lockups are | ||
428 | * detected by the NMI watchdog. | ||
429 | */ | ||
430 | spin_lock(&tlbstate_lock); | ||
431 | |||
432 | flush_mm = mm; | ||
433 | flush_vma = vma; | ||
434 | flush_va = va; | ||
435 | mask=cpus_addr(cpumask); | ||
436 | atomic_set_mask(*mask, (atomic_t *)&flush_cpumask); | ||
437 | |||
438 | /* | ||
439 | * We have to send the IPI only to | ||
440 | * CPUs affected. | ||
441 | */ | ||
442 | send_IPI_mask(cpumask, INVALIDATE_TLB_IPI, 0); | ||
443 | |||
444 | while (!cpus_empty(flush_cpumask)) { | ||
445 | /* nothing. lockup detection does not belong here */ | ||
446 | mb(); | ||
447 | } | ||
448 | |||
449 | flush_mm = NULL; | ||
450 | flush_vma = NULL; | ||
451 | flush_va = 0; | ||
452 | spin_unlock(&tlbstate_lock); | ||
453 | } | ||
454 | |||
455 | /*==========================================================================* | ||
456 | * Name: smp_invalidate_interrupt | ||
457 | * | ||
458 | * Description: This routine executes on CPU which received | ||
459 | * 'INVALIDATE_TLB_IPI'. | ||
460 | * 1.Flush local TLB. | ||
461 | * 2.Report flush TLB process was finished. | ||
462 | * | ||
463 | * Born on Date: 2002.02.05 | ||
464 | * | ||
465 | * Arguments: NONE | ||
466 | * | ||
467 | * Returns: void (cannot fail) | ||
468 | * | ||
469 | * Modification log: | ||
470 | * Date Who Description | ||
471 | * ---------- --- -------------------------------------------------------- | ||
472 | * | ||
473 | *==========================================================================*/ | ||
474 | void smp_invalidate_interrupt(void) | ||
475 | { | ||
476 | int cpu_id = smp_processor_id(); | ||
477 | unsigned long *mmc = &flush_mm->context[cpu_id]; | ||
478 | |||
479 | if (!cpu_isset(cpu_id, flush_cpumask)) | ||
480 | return; | ||
481 | |||
482 | if (flush_va == FLUSH_ALL) { | ||
483 | *mmc = NO_CONTEXT; | ||
484 | if (flush_mm == current->active_mm) | ||
485 | activate_context(flush_mm); | ||
486 | else | ||
487 | cpu_clear(cpu_id, flush_mm->cpu_vm_mask); | ||
488 | } else { | ||
489 | unsigned long va = flush_va; | ||
490 | |||
491 | if (*mmc != NO_CONTEXT) { | ||
492 | va &= PAGE_MASK; | ||
493 | va |= (*mmc & MMU_CONTEXT_ASID_MASK); | ||
494 | __flush_tlb_page(va); | ||
495 | } | ||
496 | } | ||
497 | cpu_clear(cpu_id, flush_cpumask); | ||
498 | } | ||
499 | |||
500 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
501 | /* Stop CPU request Routins */ | ||
502 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
503 | |||
504 | /*==========================================================================* | ||
505 | * Name: smp_send_stop | ||
506 | * | ||
507 | * Description: This routine requests stop all CPUs. | ||
508 | * 1.Request other CPU to execute 'stop_this_cpu()'. | ||
509 | * | ||
510 | * Born on Date: 2002.02.05 | ||
511 | * | ||
512 | * Arguments: NONE | ||
513 | * | ||
514 | * Returns: void (cannot fail) | ||
515 | * | ||
516 | * Modification log: | ||
517 | * Date Who Description | ||
518 | * ---------- --- -------------------------------------------------------- | ||
519 | * | ||
520 | *==========================================================================*/ | ||
521 | void smp_send_stop(void) | ||
522 | { | ||
523 | smp_call_function(stop_this_cpu, NULL, 1, 0); | ||
524 | } | ||
525 | |||
526 | /*==========================================================================* | ||
527 | * Name: stop_this_cpu | ||
528 | * | ||
529 | * Description: This routine halt CPU. | ||
530 | * | ||
531 | * Born on Date: 2002.02.05 | ||
532 | * | ||
533 | * Arguments: NONE | ||
534 | * | ||
535 | * Returns: void (cannot fail) | ||
536 | * | ||
537 | * Modification log: | ||
538 | * Date Who Description | ||
539 | * ---------- --- -------------------------------------------------------- | ||
540 | * | ||
541 | *==========================================================================*/ | ||
542 | static void stop_this_cpu(void *dummy) | ||
543 | { | ||
544 | int cpu_id = smp_processor_id(); | ||
545 | |||
546 | /* | ||
547 | * Remove this CPU: | ||
548 | */ | ||
549 | cpu_clear(cpu_id, cpu_online_map); | ||
550 | |||
551 | /* | ||
552 | * PSW IE = 1; | ||
553 | * IMASK = 0; | ||
554 | * goto SLEEP | ||
555 | */ | ||
556 | local_irq_disable(); | ||
557 | outl(0, M32R_ICU_IMASK_PORTL); | ||
558 | inl(M32R_ICU_IMASK_PORTL); /* dummy read */ | ||
559 | local_irq_enable(); | ||
560 | |||
561 | for ( ; ; ); | ||
562 | } | ||
563 | |||
564 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
565 | /* Call function Routins */ | ||
566 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
567 | |||
568 | /*==========================================================================* | ||
569 | * Name: smp_call_function | ||
570 | * | ||
571 | * Description: This routine sends a 'CALL_FUNCTION_IPI' to all other CPUs | ||
572 | * in the system. | ||
573 | * | ||
574 | * Born on Date: 2002.02.05 | ||
575 | * | ||
576 | * Arguments: *func - The function to run. This must be fast and | ||
577 | * non-blocking. | ||
578 | * *info - An arbitrary pointer to pass to the function. | ||
579 | * nonatomic - currently unused. | ||
580 | * wait - If true, wait (atomically) until function has | ||
581 | * completed on other CPUs. | ||
582 | * | ||
583 | * Returns: 0 on success, else a negative status code. Does not return | ||
584 | * until remote CPUs are nearly ready to execute <<func>> or | ||
585 | * are or have executed. | ||
586 | * | ||
587 | * Cautions: You must not call this function with disabled interrupts or | ||
588 | * from a hardware interrupt handler, you may call it from a | ||
589 | * bottom half handler. | ||
590 | * | ||
591 | * Modification log: | ||
592 | * Date Who Description | ||
593 | * ---------- --- -------------------------------------------------------- | ||
594 | * | ||
595 | *==========================================================================*/ | ||
596 | int smp_call_function(void (*func) (void *info), void *info, int nonatomic, | ||
597 | int wait) | ||
598 | { | ||
599 | struct call_data_struct data; | ||
600 | int cpus; | ||
601 | |||
602 | #ifdef DEBUG_SMP | ||
603 | unsigned long flags; | ||
604 | __save_flags(flags); | ||
605 | if (!(flags & 0x0040)) /* Interrupt Disable NONONO */ | ||
606 | BUG(); | ||
607 | #endif /* DEBUG_SMP */ | ||
608 | |||
609 | /* Holding any lock stops cpus from going down. */ | ||
610 | spin_lock(&call_lock); | ||
611 | cpus = num_online_cpus() - 1; | ||
612 | |||
613 | if (!cpus) { | ||
614 | spin_unlock(&call_lock); | ||
615 | return 0; | ||
616 | } | ||
617 | |||
618 | /* Can deadlock when called with interrupts disabled */ | ||
619 | WARN_ON(irqs_disabled()); | ||
620 | |||
621 | data.func = func; | ||
622 | data.info = info; | ||
623 | atomic_set(&data.started, 0); | ||
624 | data.wait = wait; | ||
625 | if (wait) | ||
626 | atomic_set(&data.finished, 0); | ||
627 | |||
628 | call_data = &data; | ||
629 | mb(); | ||
630 | |||
631 | /* Send a message to all other CPUs and wait for them to respond */ | ||
632 | send_IPI_allbutself(CALL_FUNCTION_IPI, 0); | ||
633 | |||
634 | /* Wait for response */ | ||
635 | while (atomic_read(&data.started) != cpus) | ||
636 | barrier(); | ||
637 | |||
638 | if (wait) | ||
639 | while (atomic_read(&data.finished) != cpus) | ||
640 | barrier(); | ||
641 | spin_unlock(&call_lock); | ||
642 | |||
643 | return 0; | ||
644 | } | ||
645 | |||
646 | /*==========================================================================* | ||
647 | * Name: smp_call_function_interrupt | ||
648 | * | ||
649 | * Description: This routine executes on CPU which received | ||
650 | * 'CALL_FUNCTION_IPI'. | ||
651 | * | ||
652 | * Born on Date: 2002.02.05 | ||
653 | * | ||
654 | * Arguments: NONE | ||
655 | * | ||
656 | * Returns: void (cannot fail) | ||
657 | * | ||
658 | * Modification log: | ||
659 | * Date Who Description | ||
660 | * ---------- --- -------------------------------------------------------- | ||
661 | * | ||
662 | *==========================================================================*/ | ||
663 | void smp_call_function_interrupt(void) | ||
664 | { | ||
665 | void (*func) (void *info) = call_data->func; | ||
666 | void *info = call_data->info; | ||
667 | int wait = call_data->wait; | ||
668 | |||
669 | /* | ||
670 | * Notify initiating CPU that I've grabbed the data and am | ||
671 | * about to execute the function | ||
672 | */ | ||
673 | mb(); | ||
674 | atomic_inc(&call_data->started); | ||
675 | /* | ||
676 | * At this point the info structure may be out of scope unless wait==1 | ||
677 | */ | ||
678 | irq_enter(); | ||
679 | (*func)(info); | ||
680 | irq_exit(); | ||
681 | |||
682 | if (wait) { | ||
683 | mb(); | ||
684 | atomic_inc(&call_data->finished); | ||
685 | } | ||
686 | } | ||
687 | |||
688 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
689 | /* Timer Routins */ | ||
690 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
691 | |||
692 | /*==========================================================================* | ||
693 | * Name: smp_send_timer | ||
694 | * | ||
695 | * Description: This routine sends a 'LOCAL_TIMER_IPI' to all other CPUs | ||
696 | * in the system. | ||
697 | * | ||
698 | * Born on Date: 2002.02.05 | ||
699 | * | ||
700 | * Arguments: NONE | ||
701 | * | ||
702 | * Returns: void (cannot fail) | ||
703 | * | ||
704 | * Modification log: | ||
705 | * Date Who Description | ||
706 | * ---------- --- -------------------------------------------------------- | ||
707 | * | ||
708 | *==========================================================================*/ | ||
709 | void smp_send_timer(void) | ||
710 | { | ||
711 | send_IPI_allbutself(LOCAL_TIMER_IPI, 1); | ||
712 | } | ||
713 | |||
714 | /*==========================================================================* | ||
715 | * Name: smp_send_timer | ||
716 | * | ||
717 | * Description: This routine executes on CPU which received | ||
718 | * 'LOCAL_TIMER_IPI'. | ||
719 | * | ||
720 | * Born on Date: 2002.02.05 | ||
721 | * | ||
722 | * Arguments: *regs - a pointer to the saved regster info | ||
723 | * | ||
724 | * Returns: void (cannot fail) | ||
725 | * | ||
726 | * Modification log: | ||
727 | * Date Who Description | ||
728 | * ---------- --- -------------------------------------------------------- | ||
729 | * | ||
730 | *==========================================================================*/ | ||
731 | void smp_ipi_timer_interrupt(struct pt_regs *regs) | ||
732 | { | ||
733 | irq_enter(); | ||
734 | smp_local_timer_interrupt(regs); | ||
735 | irq_exit(); | ||
736 | } | ||
737 | |||
738 | /*==========================================================================* | ||
739 | * Name: smp_local_timer_interrupt | ||
740 | * | ||
741 | * Description: Local timer interrupt handler. It does both profiling and | ||
742 | * process statistics/rescheduling. | ||
743 | * We do profiling in every local tick, statistics/rescheduling | ||
744 | * happen only every 'profiling multiplier' ticks. The default | ||
745 | * multiplier is 1 and it can be changed by writing the new | ||
746 | * multiplier value into /proc/profile. | ||
747 | * | ||
748 | * Born on Date: 2002.02.05 | ||
749 | * | ||
750 | * Arguments: *regs - a pointer to the saved regster info | ||
751 | * | ||
752 | * Returns: void (cannot fail) | ||
753 | * | ||
754 | * Original: arch/i386/kernel/apic.c | ||
755 | * | ||
756 | * Modification log: | ||
757 | * Date Who Description | ||
758 | * ---------- --- -------------------------------------------------------- | ||
759 | * 2003-06-24 hy use per_cpu structure. | ||
760 | *==========================================================================*/ | ||
761 | void smp_local_timer_interrupt(struct pt_regs *regs) | ||
762 | { | ||
763 | int user = user_mode(regs); | ||
764 | int cpu_id = smp_processor_id(); | ||
765 | |||
766 | /* | ||
767 | * The profiling function is SMP safe. (nothing can mess | ||
768 | * around with "current", and the profiling counters are | ||
769 | * updated with atomic operations). This is especially | ||
770 | * useful with a profiling multiplier != 1 | ||
771 | */ | ||
772 | |||
773 | profile_tick(CPU_PROFILING, regs); | ||
774 | |||
775 | if (--per_cpu(prof_counter, cpu_id) <= 0) { | ||
776 | /* | ||
777 | * The multiplier may have changed since the last time we got | ||
778 | * to this point as a result of the user writing to | ||
779 | * /proc/profile. In this case we need to adjust the APIC | ||
780 | * timer accordingly. | ||
781 | * | ||
782 | * Interrupts are already masked off at this point. | ||
783 | */ | ||
784 | per_cpu(prof_counter, cpu_id) | ||
785 | = per_cpu(prof_multiplier, cpu_id); | ||
786 | if (per_cpu(prof_counter, cpu_id) | ||
787 | != per_cpu(prof_old_multiplier, cpu_id)) | ||
788 | { | ||
789 | per_cpu(prof_old_multiplier, cpu_id) | ||
790 | = per_cpu(prof_counter, cpu_id); | ||
791 | } | ||
792 | |||
793 | update_process_times(user); | ||
794 | } | ||
795 | } | ||
796 | |||
797 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
798 | /* Send IPI Routins */ | ||
799 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
800 | |||
801 | /*==========================================================================* | ||
802 | * Name: send_IPI_allbutself | ||
803 | * | ||
804 | * Description: This routine sends a IPI to all other CPUs in the system. | ||
805 | * | ||
806 | * Born on Date: 2002.02.05 | ||
807 | * | ||
808 | * Arguments: ipi_num - Number of IPI | ||
809 | * try - 0 : Send IPI certainly. | ||
810 | * !0 : The following IPI is not sended when Target CPU | ||
811 | * has not received the before IPI. | ||
812 | * | ||
813 | * Returns: void (cannot fail) | ||
814 | * | ||
815 | * Modification log: | ||
816 | * Date Who Description | ||
817 | * ---------- --- -------------------------------------------------------- | ||
818 | * | ||
819 | *==========================================================================*/ | ||
820 | void send_IPI_allbutself(int ipi_num, int try) | ||
821 | { | ||
822 | cpumask_t cpumask; | ||
823 | |||
824 | cpumask = cpu_online_map; | ||
825 | cpu_clear(smp_processor_id(), cpumask); | ||
826 | |||
827 | send_IPI_mask(cpumask, ipi_num, try); | ||
828 | } | ||
829 | |||
830 | /*==========================================================================* | ||
831 | * Name: send_IPI_mask | ||
832 | * | ||
833 | * Description: This routine sends a IPI to CPUs in the system. | ||
834 | * | ||
835 | * Born on Date: 2002.02.05 | ||
836 | * | ||
837 | * Arguments: cpu_mask - Bitmap of target CPUs logical ID | ||
838 | * ipi_num - Number of IPI | ||
839 | * try - 0 : Send IPI certainly. | ||
840 | * !0 : The following IPI is not sended when Target CPU | ||
841 | * has not received the before IPI. | ||
842 | * | ||
843 | * Returns: void (cannot fail) | ||
844 | * | ||
845 | * Modification log: | ||
846 | * Date Who Description | ||
847 | * ---------- --- -------------------------------------------------------- | ||
848 | * | ||
849 | *==========================================================================*/ | ||
850 | static void send_IPI_mask(cpumask_t cpumask, int ipi_num, int try) | ||
851 | { | ||
852 | cpumask_t physid_mask, tmp; | ||
853 | int cpu_id, phys_id; | ||
854 | int num_cpus = num_online_cpus(); | ||
855 | |||
856 | if (num_cpus <= 1) /* NO MP */ | ||
857 | return; | ||
858 | |||
859 | cpus_and(tmp, cpumask, cpu_online_map); | ||
860 | BUG_ON(!cpus_equal(cpumask, tmp)); | ||
861 | |||
862 | physid_mask = CPU_MASK_NONE; | ||
863 | for_each_cpu_mask(cpu_id, cpumask){ | ||
864 | if ((phys_id = cpu_to_physid(cpu_id)) != -1) | ||
865 | cpu_set(phys_id, physid_mask); | ||
866 | } | ||
867 | |||
868 | send_IPI_mask_phys(physid_mask, ipi_num, try); | ||
869 | } | ||
870 | |||
871 | /*==========================================================================* | ||
872 | * Name: send_IPI_mask_phys | ||
873 | * | ||
874 | * Description: This routine sends a IPI to other CPUs in the system. | ||
875 | * | ||
876 | * Born on Date: 2002.02.05 | ||
877 | * | ||
878 | * Arguments: cpu_mask - Bitmap of target CPUs physical ID | ||
879 | * ipi_num - Number of IPI | ||
880 | * try - 0 : Send IPI certainly. | ||
881 | * !0 : The following IPI is not sended when Target CPU | ||
882 | * has not received the before IPI. | ||
883 | * | ||
884 | * Returns: IPICRi regster value. | ||
885 | * | ||
886 | * Modification log: | ||
887 | * Date Who Description | ||
888 | * ---------- --- -------------------------------------------------------- | ||
889 | * | ||
890 | *==========================================================================*/ | ||
891 | unsigned long send_IPI_mask_phys(cpumask_t physid_mask, int ipi_num, | ||
892 | int try) | ||
893 | { | ||
894 | spinlock_t *ipilock; | ||
895 | unsigned long flags = 0; | ||
896 | volatile unsigned long *ipicr_addr; | ||
897 | unsigned long ipicr_val; | ||
898 | unsigned long my_physid_mask; | ||
899 | unsigned long mask = cpus_addr(physid_mask)[0]; | ||
900 | |||
901 | |||
902 | if (mask & ~physids_coerce(phys_cpu_present_map)) | ||
903 | BUG(); | ||
904 | if (ipi_num >= NR_IPIS) | ||
905 | BUG(); | ||
906 | |||
907 | mask <<= IPI_SHIFT; | ||
908 | ipilock = &ipi_lock[ipi_num]; | ||
909 | ipicr_addr = (volatile unsigned long *)(M32R_ICU_IPICR_ADDR | ||
910 | + (ipi_num << 2)); | ||
911 | my_physid_mask = ~(1 << smp_processor_id()); | ||
912 | |||
913 | /* | ||
914 | * lock ipi_lock[i] | ||
915 | * check IPICRi == 0 | ||
916 | * write IPICRi (send IPIi) | ||
917 | * unlock ipi_lock[i] | ||
918 | */ | ||
919 | __asm__ __volatile__ ( | ||
920 | ";; LOCK ipi_lock[i] \n\t" | ||
921 | ".fillinsn \n" | ||
922 | "1: \n\t" | ||
923 | "mvfc %1, psw \n\t" | ||
924 | "clrpsw #0x40 -> nop \n\t" | ||
925 | DCACHE_CLEAR("r4", "r5", "%2") | ||
926 | "lock r4, @%2 \n\t" | ||
927 | "addi r4, #-1 \n\t" | ||
928 | "unlock r4, @%2 \n\t" | ||
929 | "mvtc %1, psw \n\t" | ||
930 | "bnez r4, 2f \n\t" | ||
931 | LOCK_SECTION_START(".balign 4 \n\t") | ||
932 | ".fillinsn \n" | ||
933 | "2: \n\t" | ||
934 | "ld r4, @%2 \n\t" | ||
935 | "blez r4, 2b \n\t" | ||
936 | "bra 1b \n\t" | ||
937 | LOCK_SECTION_END | ||
938 | ";; CHECK IPICRi == 0 \n\t" | ||
939 | ".fillinsn \n" | ||
940 | "3: \n\t" | ||
941 | "ld %0, @%3 \n\t" | ||
942 | "and %0, %6 \n\t" | ||
943 | "beqz %0, 4f \n\t" | ||
944 | "bnez %5, 5f \n\t" | ||
945 | "bra 3b \n\t" | ||
946 | ";; WRITE IPICRi (send IPIi) \n\t" | ||
947 | ".fillinsn \n" | ||
948 | "4: \n\t" | ||
949 | "st %4, @%3 \n\t" | ||
950 | ";; UNLOCK ipi_lock[i] \n\t" | ||
951 | ".fillinsn \n" | ||
952 | "5: \n\t" | ||
953 | "ldi r4, #1 \n\t" | ||
954 | "st r4, @%2 \n\t" | ||
955 | : "=&r"(ipicr_val) | ||
956 | : "r"(flags), "r"(&ipilock->slock), "r"(ipicr_addr), | ||
957 | "r"(mask), "r"(try), "r"(my_physid_mask) | ||
958 | : "memory", "r4" | ||
959 | #ifdef CONFIG_CHIP_M32700_TS1 | ||
960 | , "r5" | ||
961 | #endif /* CONFIG_CHIP_M32700_TS1 */ | ||
962 | ); | ||
963 | |||
964 | return ipicr_val; | ||
965 | } | ||
diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c new file mode 100644 index 000000000000..f9a0e723478d --- /dev/null +++ b/arch/m32r/kernel/smpboot.c | |||
@@ -0,0 +1,630 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/smpboot.c | ||
3 | * orig : i386 2.4.10 | ||
4 | * | ||
5 | * M32R SMP booting functions | ||
6 | * | ||
7 | * Copyright (c) 2001, 2002, 2003 Hitoshi Yamamoto | ||
8 | * | ||
9 | * Taken from i386 version. | ||
10 | * (c) 1995 Alan Cox, Building #3 <alan@redhat.com> | ||
11 | * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> | ||
12 | * | ||
13 | * Much of the core SMP work is based on previous work by Thomas Radke, to | ||
14 | * whom a great many thanks are extended. | ||
15 | * | ||
16 | * Thanks to Intel for making available several different Pentium, | ||
17 | * Pentium Pro and Pentium-II/Xeon MP machines. | ||
18 | * Original development of Linux SMP code supported by Caldera. | ||
19 | * | ||
20 | * This code is released under the GNU General Public License version 2 or | ||
21 | * later. | ||
22 | * | ||
23 | * Fixes | ||
24 | * Felix Koop : NR_CPUS used properly | ||
25 | * Jose Renau : Handle single CPU case. | ||
26 | * Alan Cox : By repeated request | ||
27 | * 8) - Total BogoMIP report. | ||
28 | * Greg Wright : Fix for kernel stacks panic. | ||
29 | * Erich Boleyn : MP v1.4 and additional changes. | ||
30 | * Matthias Sattler : Changes for 2.1 kernel map. | ||
31 | * Michel Lespinasse : Changes for 2.1 kernel map. | ||
32 | * Michael Chastain : Change trampoline.S to gnu as. | ||
33 | * Alan Cox : Dumb bug: 'B' step PPro's are fine | ||
34 | * Ingo Molnar : Added APIC timers, based on code | ||
35 | * from Jose Renau | ||
36 | * Ingo Molnar : various cleanups and rewrites | ||
37 | * Tigran Aivazian : fixed "0.00 in /proc/uptime on SMP" bug. | ||
38 | * Maciej W. Rozycki : Bits for genuine 82489DX APICs | ||
39 | * Martin J. Bligh : Added support for multi-quad systems | ||
40 | */ | ||
41 | |||
42 | #include <linux/config.h> | ||
43 | #include <linux/init.h> | ||
44 | #include <linux/mm.h> | ||
45 | #include <linux/smp_lock.h> | ||
46 | #include <linux/irq.h> | ||
47 | #include <linux/bootmem.h> | ||
48 | #include <linux/delay.h> | ||
49 | |||
50 | #include <asm/io.h> | ||
51 | #include <asm/pgalloc.h> | ||
52 | #include <asm/tlbflush.h> | ||
53 | |||
54 | #define DEBUG_SMP | ||
55 | #ifdef DEBUG_SMP | ||
56 | #define Dprintk(x...) printk(x) | ||
57 | #else | ||
58 | #define Dprintk(x...) | ||
59 | #endif | ||
60 | |||
61 | extern cpumask_t cpu_initialized; | ||
62 | |||
63 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
64 | /* Data structures and variables */ | ||
65 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
66 | |||
67 | /* Processor that is doing the boot up */ | ||
68 | static unsigned int bsp_phys_id = -1; | ||
69 | |||
70 | /* Bitmask of physically existing CPUs */ | ||
71 | physid_mask_t phys_cpu_present_map; | ||
72 | |||
73 | /* Bitmask of currently online CPUs */ | ||
74 | cpumask_t cpu_online_map; | ||
75 | |||
76 | cpumask_t cpu_bootout_map; | ||
77 | cpumask_t cpu_bootin_map; | ||
78 | cpumask_t cpu_callout_map; | ||
79 | static cpumask_t cpu_callin_map; | ||
80 | |||
81 | /* Per CPU bogomips and other parameters */ | ||
82 | struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned; | ||
83 | |||
84 | static int cpucount; | ||
85 | static cpumask_t smp_commenced_mask; | ||
86 | |||
87 | extern struct { | ||
88 | void * spi; | ||
89 | unsigned short ss; | ||
90 | } stack_start; | ||
91 | |||
92 | /* which physical physical ID maps to which logical CPU number */ | ||
93 | static volatile int physid_2_cpu[NR_CPUS]; | ||
94 | |||
95 | /* which logical CPU number maps to which physical ID */ | ||
96 | volatile int cpu_2_physid[NR_CPUS]; | ||
97 | |||
98 | DEFINE_PER_CPU(int, prof_multiplier) = 1; | ||
99 | DEFINE_PER_CPU(int, prof_old_multiplier) = 1; | ||
100 | DEFINE_PER_CPU(int, prof_counter) = 1; | ||
101 | |||
102 | spinlock_t ipi_lock[NR_IPIS]; | ||
103 | |||
104 | static unsigned int calibration_result; | ||
105 | |||
106 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
107 | /* Function Prototypes */ | ||
108 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
109 | |||
110 | void smp_prepare_boot_cpu(void); | ||
111 | void smp_prepare_cpus(unsigned int); | ||
112 | static void smp_tune_scheduling(void); | ||
113 | static void init_ipi_lock(void); | ||
114 | static void do_boot_cpu(int); | ||
115 | int __cpu_up(unsigned int); | ||
116 | void smp_cpus_done(unsigned int); | ||
117 | |||
118 | int start_secondary(void *); | ||
119 | static void smp_callin(void); | ||
120 | static void smp_online(void); | ||
121 | |||
122 | static void show_mp_info(int); | ||
123 | static void smp_store_cpu_info(int); | ||
124 | static void show_cpu_info(int); | ||
125 | int setup_profiling_timer(unsigned int); | ||
126 | static void init_cpu_to_physid(void); | ||
127 | static void map_cpu_to_physid(int, int); | ||
128 | static void unmap_cpu_to_physid(int, int); | ||
129 | |||
130 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
131 | /* Boot up APs Routins : BSP */ | ||
132 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
133 | void __devinit smp_prepare_boot_cpu(void) | ||
134 | { | ||
135 | bsp_phys_id = hard_smp_processor_id(); | ||
136 | physid_set(bsp_phys_id, phys_cpu_present_map); | ||
137 | cpu_set(0, cpu_online_map); /* BSP's cpu_id == 0 */ | ||
138 | cpu_set(0, cpu_callout_map); | ||
139 | cpu_set(0, cpu_callin_map); | ||
140 | |||
141 | /* | ||
142 | * Initialize the logical to physical CPU number mapping | ||
143 | */ | ||
144 | init_cpu_to_physid(); | ||
145 | map_cpu_to_physid(0, bsp_phys_id); | ||
146 | current_thread_info()->cpu = 0; | ||
147 | } | ||
148 | |||
149 | /*==========================================================================* | ||
150 | * Name: smp_prepare_cpus (old smp_boot_cpus) | ||
151 | * | ||
152 | * Description: This routine boot up APs. | ||
153 | * | ||
154 | * Born on Date: 2002.02.05 | ||
155 | * | ||
156 | * Arguments: NONE | ||
157 | * | ||
158 | * Returns: void (cannot fail) | ||
159 | * | ||
160 | * Modification log: | ||
161 | * Date Who Description | ||
162 | * ---------- --- -------------------------------------------------------- | ||
163 | * 2003-06-24 hy modify for linux-2.5.69 | ||
164 | * | ||
165 | *==========================================================================*/ | ||
166 | void __init smp_prepare_cpus(unsigned int max_cpus) | ||
167 | { | ||
168 | int phys_id; | ||
169 | unsigned long nr_cpu; | ||
170 | |||
171 | nr_cpu = inl(M32R_FPGA_NUM_OF_CPUS_PORTL); | ||
172 | if (nr_cpu > NR_CPUS) { | ||
173 | printk(KERN_INFO "NUM_OF_CPUS reg. value [%ld] > NR_CPU [%d]", | ||
174 | nr_cpu, NR_CPUS); | ||
175 | goto smp_done; | ||
176 | } | ||
177 | for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++) | ||
178 | physid_set(phys_id, phys_cpu_present_map); | ||
179 | |||
180 | show_mp_info(nr_cpu); | ||
181 | |||
182 | init_ipi_lock(); | ||
183 | |||
184 | /* | ||
185 | * Setup boot CPU information | ||
186 | */ | ||
187 | smp_store_cpu_info(0); /* Final full version of the data */ | ||
188 | smp_tune_scheduling(); | ||
189 | |||
190 | /* | ||
191 | * If SMP should be disabled, then really disable it! | ||
192 | */ | ||
193 | if (!max_cpus) { | ||
194 | printk(KERN_INFO "SMP mode deactivated by commandline.\n"); | ||
195 | goto smp_done; | ||
196 | } | ||
197 | |||
198 | /* | ||
199 | * Now scan the CPU present map and fire up the other CPUs. | ||
200 | */ | ||
201 | Dprintk("CPU present map : %lx\n", physids_coerce(phys_cpu_present_map)); | ||
202 | |||
203 | for (phys_id = 0 ; phys_id < NR_CPUS ; phys_id++) { | ||
204 | /* | ||
205 | * Don't even attempt to start the boot CPU! | ||
206 | */ | ||
207 | if (phys_id == bsp_phys_id) | ||
208 | continue; | ||
209 | |||
210 | if (!physid_isset(phys_id, phys_cpu_present_map)) | ||
211 | continue; | ||
212 | |||
213 | if ((max_cpus >= 0) && (max_cpus <= cpucount + 1)) | ||
214 | continue; | ||
215 | |||
216 | do_boot_cpu(phys_id); | ||
217 | |||
218 | /* | ||
219 | * Make sure we unmap all failed CPUs | ||
220 | */ | ||
221 | if (physid_to_cpu(phys_id) == -1) { | ||
222 | physid_clear(phys_id, phys_cpu_present_map); | ||
223 | printk("phys CPU#%d not responding - " \ | ||
224 | "cannot use it.\n", phys_id); | ||
225 | } | ||
226 | } | ||
227 | |||
228 | smp_done: | ||
229 | Dprintk("Boot done.\n"); | ||
230 | } | ||
231 | |||
232 | static void __init smp_tune_scheduling(void) | ||
233 | { | ||
234 | /* Nothing to do. */ | ||
235 | } | ||
236 | |||
237 | /* | ||
238 | * init_ipi_lock : Initialize IPI locks. | ||
239 | */ | ||
240 | static void __init init_ipi_lock(void) | ||
241 | { | ||
242 | int ipi; | ||
243 | |||
244 | for (ipi = 0 ; ipi < NR_IPIS ; ipi++) | ||
245 | spin_lock_init(&ipi_lock[ipi]); | ||
246 | } | ||
247 | |||
248 | /*==========================================================================* | ||
249 | * Name: do_boot_cpu | ||
250 | * | ||
251 | * Description: This routine boot up one AP. | ||
252 | * | ||
253 | * Born on Date: 2002.02.05 | ||
254 | * | ||
255 | * Arguments: phys_id - Target CPU physical ID | ||
256 | * | ||
257 | * Returns: void (cannot fail) | ||
258 | * | ||
259 | * Modification log: | ||
260 | * Date Who Description | ||
261 | * ---------- --- -------------------------------------------------------- | ||
262 | * 2003-06-24 hy modify for linux-2.5.69 | ||
263 | * | ||
264 | *==========================================================================*/ | ||
265 | static void __init do_boot_cpu(int phys_id) | ||
266 | { | ||
267 | struct task_struct *idle; | ||
268 | unsigned long send_status, boot_status; | ||
269 | int timeout, cpu_id; | ||
270 | |||
271 | cpu_id = ++cpucount; | ||
272 | |||
273 | /* | ||
274 | * We can't use kernel_thread since we must avoid to | ||
275 | * reschedule the child. | ||
276 | */ | ||
277 | idle = fork_idle(cpu_id); | ||
278 | if (IS_ERR(idle)) | ||
279 | panic("failed fork for CPU#%d.", cpu_id); | ||
280 | |||
281 | idle->thread.lr = (unsigned long)start_secondary; | ||
282 | |||
283 | map_cpu_to_physid(cpu_id, phys_id); | ||
284 | |||
285 | /* So we see what's up */ | ||
286 | printk("Booting processor %d/%d\n", phys_id, cpu_id); | ||
287 | stack_start.spi = (void *)idle->thread.sp; | ||
288 | idle->thread_info->cpu = cpu_id; | ||
289 | |||
290 | /* | ||
291 | * Send Startup IPI | ||
292 | * 1.IPI received by CPU#(phys_id). | ||
293 | * 2.CPU#(phys_id) enter startup_AP (arch/m32r/kernel/head.S) | ||
294 | * 3.CPU#(phys_id) enter start_secondary() | ||
295 | */ | ||
296 | send_status = 0; | ||
297 | boot_status = 0; | ||
298 | |||
299 | cpu_set(phys_id, cpu_bootout_map); | ||
300 | |||
301 | /* Send Startup IPI */ | ||
302 | send_IPI_mask_phys(cpumask_of_cpu(phys_id), CPU_BOOT_IPI, 0); | ||
303 | |||
304 | Dprintk("Waiting for send to finish...\n"); | ||
305 | timeout = 0; | ||
306 | |||
307 | /* Wait 100[ms] */ | ||
308 | do { | ||
309 | Dprintk("+"); | ||
310 | udelay(1000); | ||
311 | send_status = !cpu_isset(phys_id, cpu_bootin_map); | ||
312 | } while (send_status && (timeout++ < 100)); | ||
313 | |||
314 | Dprintk("After Startup.\n"); | ||
315 | |||
316 | if (!send_status) { | ||
317 | /* | ||
318 | * allow APs to start initializing. | ||
319 | */ | ||
320 | Dprintk("Before Callout %d.\n", cpu_id); | ||
321 | cpu_set(cpu_id, cpu_callout_map); | ||
322 | Dprintk("After Callout %d.\n", cpu_id); | ||
323 | |||
324 | /* | ||
325 | * Wait 5s total for a response | ||
326 | */ | ||
327 | for (timeout = 0; timeout < 5000; timeout++) { | ||
328 | if (cpu_isset(cpu_id, cpu_callin_map)) | ||
329 | break; /* It has booted */ | ||
330 | udelay(1000); | ||
331 | } | ||
332 | |||
333 | if (cpu_isset(cpu_id, cpu_callin_map)) { | ||
334 | /* number CPUs logically, starting from 1 (BSP is 0) */ | ||
335 | Dprintk("OK.\n"); | ||
336 | } else { | ||
337 | boot_status = 1; | ||
338 | printk("Not responding.\n"); | ||
339 | } | ||
340 | } else | ||
341 | printk("IPI never delivered???\n"); | ||
342 | |||
343 | if (send_status || boot_status) { | ||
344 | unmap_cpu_to_physid(cpu_id, phys_id); | ||
345 | cpu_clear(cpu_id, cpu_callout_map); | ||
346 | cpu_clear(cpu_id, cpu_callin_map); | ||
347 | cpu_clear(cpu_id, cpu_initialized); | ||
348 | cpucount--; | ||
349 | } | ||
350 | } | ||
351 | |||
352 | int __devinit __cpu_up(unsigned int cpu_id) | ||
353 | { | ||
354 | int timeout; | ||
355 | |||
356 | cpu_set(cpu_id, smp_commenced_mask); | ||
357 | |||
358 | /* | ||
359 | * Wait 5s total for a response | ||
360 | */ | ||
361 | for (timeout = 0; timeout < 5000; timeout++) { | ||
362 | if (cpu_isset(cpu_id, cpu_online_map)) | ||
363 | break; | ||
364 | udelay(1000); | ||
365 | } | ||
366 | if (!cpu_isset(cpu_id, cpu_online_map)) | ||
367 | BUG(); | ||
368 | |||
369 | return 0; | ||
370 | } | ||
371 | |||
372 | void __init smp_cpus_done(unsigned int max_cpus) | ||
373 | { | ||
374 | int cpu_id, timeout; | ||
375 | unsigned long bogosum = 0; | ||
376 | |||
377 | for (timeout = 0; timeout < 5000; timeout++) { | ||
378 | if (cpus_equal(cpu_callin_map, cpu_online_map)) | ||
379 | break; | ||
380 | udelay(1000); | ||
381 | } | ||
382 | if (!cpus_equal(cpu_callin_map, cpu_online_map)) | ||
383 | BUG(); | ||
384 | |||
385 | for (cpu_id = 0 ; cpu_id < num_online_cpus() ; cpu_id++) | ||
386 | show_cpu_info(cpu_id); | ||
387 | |||
388 | /* | ||
389 | * Allow the user to impress friends. | ||
390 | */ | ||
391 | Dprintk("Before bogomips.\n"); | ||
392 | if (cpucount) { | ||
393 | for_each_cpu_mask(cpu_id, cpu_online_map) | ||
394 | bogosum += cpu_data[cpu_id].loops_per_jiffy; | ||
395 | |||
396 | printk(KERN_INFO "Total of %d processors activated " \ | ||
397 | "(%lu.%02lu BogoMIPS).\n", cpucount + 1, | ||
398 | bogosum / (500000 / HZ), | ||
399 | (bogosum / (5000 / HZ)) % 100); | ||
400 | Dprintk("Before bogocount - setting activated=1.\n"); | ||
401 | } | ||
402 | } | ||
403 | |||
404 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
405 | /* Activate a secondary processor Routins */ | ||
406 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
407 | |||
408 | /*==========================================================================* | ||
409 | * Name: start_secondary | ||
410 | * | ||
411 | * Description: This routine activate a secondary processor. | ||
412 | * | ||
413 | * Born on Date: 2002.02.05 | ||
414 | * | ||
415 | * Arguments: *unused - currently unused. | ||
416 | * | ||
417 | * Returns: void (cannot fail) | ||
418 | * | ||
419 | * Modification log: | ||
420 | * Date Who Description | ||
421 | * ---------- --- -------------------------------------------------------- | ||
422 | * 2003-06-24 hy modify for linux-2.5.69 | ||
423 | * | ||
424 | *==========================================================================*/ | ||
425 | int __init start_secondary(void *unused) | ||
426 | { | ||
427 | cpu_init(); | ||
428 | smp_callin(); | ||
429 | while (!cpu_isset(smp_processor_id(), smp_commenced_mask)) | ||
430 | cpu_relax(); | ||
431 | |||
432 | smp_online(); | ||
433 | |||
434 | /* | ||
435 | * low-memory mappings have been cleared, flush them from | ||
436 | * the local TLBs too. | ||
437 | */ | ||
438 | local_flush_tlb_all(); | ||
439 | |||
440 | cpu_idle(); | ||
441 | return 0; | ||
442 | } | ||
443 | |||
444 | /*==========================================================================* | ||
445 | * Name: smp_callin | ||
446 | * | ||
447 | * Description: This routine activate a secondary processor. | ||
448 | * | ||
449 | * Born on Date: 2002.02.05 | ||
450 | * | ||
451 | * Arguments: NONE | ||
452 | * | ||
453 | * Returns: void (cannot fail) | ||
454 | * | ||
455 | * Modification log: | ||
456 | * Date Who Description | ||
457 | * ---------- --- -------------------------------------------------------- | ||
458 | * 2003-06-24 hy modify for linux-2.5.69 | ||
459 | * | ||
460 | *==========================================================================*/ | ||
461 | static void __init smp_callin(void) | ||
462 | { | ||
463 | int phys_id = hard_smp_processor_id(); | ||
464 | int cpu_id = smp_processor_id(); | ||
465 | unsigned long timeout; | ||
466 | |||
467 | if (cpu_isset(cpu_id, cpu_callin_map)) { | ||
468 | printk("huh, phys CPU#%d, CPU#%d already present??\n", | ||
469 | phys_id, cpu_id); | ||
470 | BUG(); | ||
471 | } | ||
472 | Dprintk("CPU#%d (phys ID: %d) waiting for CALLOUT\n", cpu_id, phys_id); | ||
473 | |||
474 | /* Waiting 2s total for startup (udelay is not yet working) */ | ||
475 | timeout = jiffies + (2 * HZ); | ||
476 | while (time_before(jiffies, timeout)) { | ||
477 | /* Has the boot CPU finished it's STARTUP sequence ? */ | ||
478 | if (cpu_isset(cpu_id, cpu_callout_map)) | ||
479 | break; | ||
480 | cpu_relax(); | ||
481 | } | ||
482 | |||
483 | if (!time_before(jiffies, timeout)) { | ||
484 | printk("BUG: CPU#%d started up but did not get a callout!\n", | ||
485 | cpu_id); | ||
486 | BUG(); | ||
487 | } | ||
488 | |||
489 | /* Allow the master to continue. */ | ||
490 | cpu_set(cpu_id, cpu_callin_map); | ||
491 | } | ||
492 | |||
493 | static void __init smp_online(void) | ||
494 | { | ||
495 | int cpu_id = smp_processor_id(); | ||
496 | |||
497 | local_irq_enable(); | ||
498 | |||
499 | /* Get our bogomips. */ | ||
500 | calibrate_delay(); | ||
501 | |||
502 | /* Save our processor parameters */ | ||
503 | smp_store_cpu_info(cpu_id); | ||
504 | |||
505 | cpu_set(cpu_id, cpu_online_map); | ||
506 | } | ||
507 | |||
508 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
509 | /* Boot up CPUs common Routins */ | ||
510 | /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ | ||
511 | static void __init show_mp_info(int nr_cpu) | ||
512 | { | ||
513 | int i; | ||
514 | char cpu_model0[17], cpu_model1[17], cpu_ver[9]; | ||
515 | |||
516 | strncpy(cpu_model0, (char *)M32R_FPGA_CPU_NAME_ADDR, 16); | ||
517 | strncpy(cpu_model1, (char *)M32R_FPGA_MODEL_ID_ADDR, 16); | ||
518 | strncpy(cpu_ver, (char *)M32R_FPGA_VERSION_ADDR, 8); | ||
519 | |||
520 | cpu_model0[16] = '\0'; | ||
521 | for (i = 15 ; i >= 0 ; i--) { | ||
522 | if (cpu_model0[i] != ' ') | ||
523 | break; | ||
524 | cpu_model0[i] = '\0'; | ||
525 | } | ||
526 | cpu_model1[16] = '\0'; | ||
527 | for (i = 15 ; i >= 0 ; i--) { | ||
528 | if (cpu_model1[i] != ' ') | ||
529 | break; | ||
530 | cpu_model1[i] = '\0'; | ||
531 | } | ||
532 | cpu_ver[8] = '\0'; | ||
533 | for (i = 7 ; i >= 0 ; i--) { | ||
534 | if (cpu_ver[i] != ' ') | ||
535 | break; | ||
536 | cpu_ver[i] = '\0'; | ||
537 | } | ||
538 | |||
539 | printk(KERN_INFO "M32R-mp information\n"); | ||
540 | printk(KERN_INFO " On-chip CPUs : %d\n", nr_cpu); | ||
541 | printk(KERN_INFO " CPU model : %s/%s(%s)\n", cpu_model0, | ||
542 | cpu_model1, cpu_ver); | ||
543 | } | ||
544 | |||
545 | /* | ||
546 | * The bootstrap kernel entry code has set these up. Save them for | ||
547 | * a given CPU | ||
548 | */ | ||
549 | static void __init smp_store_cpu_info(int cpu_id) | ||
550 | { | ||
551 | struct cpuinfo_m32r *ci = cpu_data + cpu_id; | ||
552 | |||
553 | *ci = boot_cpu_data; | ||
554 | ci->loops_per_jiffy = loops_per_jiffy; | ||
555 | } | ||
556 | |||
557 | static void __init show_cpu_info(int cpu_id) | ||
558 | { | ||
559 | struct cpuinfo_m32r *ci = &cpu_data[cpu_id]; | ||
560 | |||
561 | printk("CPU#%d : ", cpu_id); | ||
562 | |||
563 | #define PRINT_CLOCK(name, value) \ | ||
564 | printk(name " clock %d.%02dMHz", \ | ||
565 | ((value) / 1000000), ((value) % 1000000) / 10000) | ||
566 | |||
567 | PRINT_CLOCK("CPU", (int)ci->cpu_clock); | ||
568 | PRINT_CLOCK(", Bus", (int)ci->bus_clock); | ||
569 | printk(", loops_per_jiffy[%ld]\n", ci->loops_per_jiffy); | ||
570 | } | ||
571 | |||
572 | /* | ||
573 | * the frequency of the profiling timer can be changed | ||
574 | * by writing a multiplier value into /proc/profile. | ||
575 | */ | ||
576 | int setup_profiling_timer(unsigned int multiplier) | ||
577 | { | ||
578 | int i; | ||
579 | |||
580 | /* | ||
581 | * Sanity check. [at least 500 APIC cycles should be | ||
582 | * between APIC interrupts as a rule of thumb, to avoid | ||
583 | * irqs flooding us] | ||
584 | */ | ||
585 | if ( (!multiplier) || (calibration_result / multiplier < 500)) | ||
586 | return -EINVAL; | ||
587 | |||
588 | /* | ||
589 | * Set the new multiplier for each CPU. CPUs don't start using the | ||
590 | * new values until the next timer interrupt in which they do process | ||
591 | * accounting. At that time they also adjust their APIC timers | ||
592 | * accordingly. | ||
593 | */ | ||
594 | for (i = 0; i < NR_CPUS; ++i) | ||
595 | per_cpu(prof_multiplier, i) = multiplier; | ||
596 | |||
597 | return 0; | ||
598 | } | ||
599 | |||
600 | /* Initialize all maps between cpu number and apicids */ | ||
601 | static void __init init_cpu_to_physid(void) | ||
602 | { | ||
603 | int i; | ||
604 | |||
605 | for (i = 0 ; i < NR_CPUS ; i++) { | ||
606 | cpu_2_physid[i] = -1; | ||
607 | physid_2_cpu[i] = -1; | ||
608 | } | ||
609 | } | ||
610 | |||
611 | /* | ||
612 | * set up a mapping between cpu and apicid. Uses logical apicids for multiquad, | ||
613 | * else physical apic ids | ||
614 | */ | ||
615 | static void __init map_cpu_to_physid(int cpu_id, int phys_id) | ||
616 | { | ||
617 | physid_2_cpu[phys_id] = cpu_id; | ||
618 | cpu_2_physid[cpu_id] = phys_id; | ||
619 | } | ||
620 | |||
621 | /* | ||
622 | * undo a mapping between cpu and apicid. Uses logical apicids for multiquad, | ||
623 | * else physical apic ids | ||
624 | */ | ||
625 | static void __init unmap_cpu_to_physid(int cpu_id, int phys_id) | ||
626 | { | ||
627 | physid_2_cpu[phys_id] = -1; | ||
628 | cpu_2_physid[cpu_id] = -1; | ||
629 | } | ||
630 | |||
diff --git a/arch/m32r/kernel/sys_m32r.c b/arch/m32r/kernel/sys_m32r.c new file mode 100644 index 000000000000..e0500e12c5fb --- /dev/null +++ b/arch/m32r/kernel/sys_m32r.c | |||
@@ -0,0 +1,217 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/sys_m32r.c | ||
3 | * | ||
4 | * This file contains various random system calls that | ||
5 | * have a non-standard calling sequence on the Linux/M32R platform. | ||
6 | * | ||
7 | * Taken from i386 version. | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/errno.h> | ||
12 | #include <linux/sched.h> | ||
13 | #include <linux/mm.h> | ||
14 | #include <linux/smp.h> | ||
15 | #include <linux/smp_lock.h> | ||
16 | #include <linux/sem.h> | ||
17 | #include <linux/msg.h> | ||
18 | #include <linux/shm.h> | ||
19 | #include <linux/stat.h> | ||
20 | #include <linux/syscalls.h> | ||
21 | #include <linux/mman.h> | ||
22 | #include <linux/file.h> | ||
23 | #include <linux/utsname.h> | ||
24 | |||
25 | #include <asm/uaccess.h> | ||
26 | #include <asm/cachectl.h> | ||
27 | #include <asm/cacheflush.h> | ||
28 | #include <asm/ipc.h> | ||
29 | |||
30 | /* | ||
31 | * sys_tas() - test-and-set | ||
32 | * linuxthreads testing version | ||
33 | */ | ||
34 | #ifndef CONFIG_SMP | ||
35 | asmlinkage int sys_tas(int *addr) | ||
36 | { | ||
37 | int oldval; | ||
38 | unsigned long flags; | ||
39 | |||
40 | if (!access_ok(VERIFY_WRITE, addr, sizeof (int))) | ||
41 | return -EFAULT; | ||
42 | local_irq_save(flags); | ||
43 | oldval = *addr; | ||
44 | *addr = 1; | ||
45 | local_irq_restore(flags); | ||
46 | return oldval; | ||
47 | } | ||
48 | #else /* CONFIG_SMP */ | ||
49 | #include <linux/spinlock.h> | ||
50 | |||
51 | static DEFINE_SPINLOCK(tas_lock); | ||
52 | |||
53 | asmlinkage int sys_tas(int *addr) | ||
54 | { | ||
55 | int oldval; | ||
56 | |||
57 | if (!access_ok(VERIFY_WRITE, addr, sizeof (int))) | ||
58 | return -EFAULT; | ||
59 | |||
60 | _raw_spin_lock(&tas_lock); | ||
61 | oldval = *addr; | ||
62 | *addr = 1; | ||
63 | _raw_spin_unlock(&tas_lock); | ||
64 | |||
65 | return oldval; | ||
66 | } | ||
67 | #endif /* CONFIG_SMP */ | ||
68 | |||
69 | /* | ||
70 | * sys_pipe() is the normal C calling standard for creating | ||
71 | * a pipe. It's not the way Unix traditionally does this, though. | ||
72 | */ | ||
73 | asmlinkage int | ||
74 | sys_pipe(unsigned long r0, unsigned long r1, unsigned long r2, | ||
75 | unsigned long r3, unsigned long r4, unsigned long r5, | ||
76 | unsigned long r6, struct pt_regs regs) | ||
77 | { | ||
78 | int fd[2]; | ||
79 | int error; | ||
80 | |||
81 | error = do_pipe(fd); | ||
82 | if (!error) { | ||
83 | if (copy_to_user((void *)r0, (void *)fd, 2*sizeof(int))) | ||
84 | error = -EFAULT; | ||
85 | } | ||
86 | return error; | ||
87 | } | ||
88 | |||
89 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, | ||
90 | unsigned long prot, unsigned long flags, | ||
91 | unsigned long fd, unsigned long pgoff) | ||
92 | { | ||
93 | int error = -EBADF; | ||
94 | struct file *file = NULL; | ||
95 | |||
96 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | ||
97 | if (!(flags & MAP_ANONYMOUS)) { | ||
98 | file = fget(fd); | ||
99 | if (!file) | ||
100 | goto out; | ||
101 | } | ||
102 | |||
103 | down_write(¤t->mm->mmap_sem); | ||
104 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | ||
105 | up_write(¤t->mm->mmap_sem); | ||
106 | |||
107 | if (file) | ||
108 | fput(file); | ||
109 | out: | ||
110 | return error; | ||
111 | } | ||
112 | |||
113 | /* | ||
114 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. | ||
115 | * | ||
116 | * This is really horribly ugly. | ||
117 | */ | ||
118 | asmlinkage int sys_ipc(uint call, int first, int second, | ||
119 | int third, void __user *ptr, long fifth) | ||
120 | { | ||
121 | int version, ret; | ||
122 | |||
123 | version = call >> 16; /* hack for backward compatibility */ | ||
124 | call &= 0xffff; | ||
125 | |||
126 | switch (call) { | ||
127 | case SEMOP: | ||
128 | return sys_semtimedop(first, (struct sembuf __user *)ptr, | ||
129 | second, NULL); | ||
130 | case SEMTIMEDOP: | ||
131 | return sys_semtimedop(first, (struct sembuf __user *)ptr, | ||
132 | second, (const struct timespec __user *)fifth); | ||
133 | case SEMGET: | ||
134 | return sys_semget (first, second, third); | ||
135 | case SEMCTL: { | ||
136 | union semun fourth; | ||
137 | if (!ptr) | ||
138 | return -EINVAL; | ||
139 | if (get_user(fourth.__pad, (void __user * __user *) ptr)) | ||
140 | return -EFAULT; | ||
141 | return sys_semctl (first, second, third, fourth); | ||
142 | } | ||
143 | |||
144 | case MSGSND: | ||
145 | return sys_msgsnd (first, (struct msgbuf __user *) ptr, | ||
146 | second, third); | ||
147 | case MSGRCV: | ||
148 | switch (version) { | ||
149 | case 0: { | ||
150 | struct ipc_kludge tmp; | ||
151 | if (!ptr) | ||
152 | return -EINVAL; | ||
153 | |||
154 | if (copy_from_user(&tmp, | ||
155 | (struct ipc_kludge __user *) ptr, | ||
156 | sizeof (tmp))) | ||
157 | return -EFAULT; | ||
158 | return sys_msgrcv (first, tmp.msgp, second, | ||
159 | tmp.msgtyp, third); | ||
160 | } | ||
161 | default: | ||
162 | return sys_msgrcv (first, | ||
163 | (struct msgbuf __user *) ptr, | ||
164 | second, fifth, third); | ||
165 | } | ||
166 | case MSGGET: | ||
167 | return sys_msgget ((key_t) first, second); | ||
168 | case MSGCTL: | ||
169 | return sys_msgctl (first, second, | ||
170 | (struct msqid_ds __user *) ptr); | ||
171 | case SHMAT: { | ||
172 | ulong raddr; | ||
173 | |||
174 | if (!access_ok(VERIFY_WRITE, (ulong __user *) third, | ||
175 | sizeof(ulong))) | ||
176 | return -EFAULT; | ||
177 | ret = do_shmat (first, (char __user *) ptr, second, &raddr); | ||
178 | if (ret) | ||
179 | return ret; | ||
180 | return put_user (raddr, (ulong __user *) third); | ||
181 | } | ||
182 | case SHMDT: | ||
183 | return sys_shmdt ((char __user *)ptr); | ||
184 | case SHMGET: | ||
185 | return sys_shmget (first, second, third); | ||
186 | case SHMCTL: | ||
187 | return sys_shmctl (first, second, | ||
188 | (struct shmid_ds __user *) ptr); | ||
189 | default: | ||
190 | return -ENOSYS; | ||
191 | } | ||
192 | } | ||
193 | |||
194 | asmlinkage int sys_uname(struct old_utsname * name) | ||
195 | { | ||
196 | int err; | ||
197 | if (!name) | ||
198 | return -EFAULT; | ||
199 | down_read(&uts_sem); | ||
200 | err=copy_to_user(name, &system_utsname, sizeof (*name)); | ||
201 | up_read(&uts_sem); | ||
202 | return err?-EFAULT:0; | ||
203 | } | ||
204 | |||
205 | asmlinkage int sys_cacheflush(void *addr, int bytes, int cache) | ||
206 | { | ||
207 | /* This should flush more selectivly ... */ | ||
208 | _flush_cache_all(); | ||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | asmlinkage int sys_cachectl(char *addr, int nbytes, int op) | ||
213 | { | ||
214 | /* Not implemented yet. */ | ||
215 | return -ENOSYS; | ||
216 | } | ||
217 | |||
diff --git a/arch/m32r/kernel/time.c b/arch/m32r/kernel/time.c new file mode 100644 index 000000000000..3c4707280a52 --- /dev/null +++ b/arch/m32r/kernel/time.c | |||
@@ -0,0 +1,318 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/time.c | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | ||
5 | * Hitoshi Yamamoto | ||
6 | * Taken from i386 version. | ||
7 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | ||
8 | * Copyright (C) 1996, 1997, 1998 Ralf Baechle | ||
9 | * | ||
10 | * This file contains the time handling details for PC-style clocks as | ||
11 | * found in some MIPS systems. | ||
12 | * | ||
13 | * Some code taken from sh version. | ||
14 | * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka | ||
15 | * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> | ||
16 | */ | ||
17 | |||
18 | #undef DEBUG_TIMER | ||
19 | |||
20 | #include <linux/config.h> | ||
21 | #include <linux/errno.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/sched.h> | ||
25 | #include <linux/kernel.h> | ||
26 | #include <linux/param.h> | ||
27 | #include <linux/string.h> | ||
28 | #include <linux/mm.h> | ||
29 | #include <linux/interrupt.h> | ||
30 | #include <linux/profile.h> | ||
31 | |||
32 | #include <asm/io.h> | ||
33 | #include <asm/m32r.h> | ||
34 | |||
35 | #include <asm/hw_irq.h> | ||
36 | |||
37 | #ifdef CONFIG_SMP | ||
38 | extern void send_IPI_allbutself(int, int); | ||
39 | extern void smp_local_timer_interrupt(struct pt_regs *); | ||
40 | #endif | ||
41 | |||
42 | u64 jiffies_64 = INITIAL_JIFFIES; | ||
43 | |||
44 | EXPORT_SYMBOL(jiffies_64); | ||
45 | |||
46 | extern unsigned long wall_jiffies; | ||
47 | #define TICK_SIZE (tick_nsec / 1000) | ||
48 | |||
49 | /* | ||
50 | * Change this if you have some constant time drift | ||
51 | */ | ||
52 | |||
53 | /* This is for machines which generate the exact clock. */ | ||
54 | #define USECS_PER_JIFFY (1000000/HZ) | ||
55 | |||
56 | static unsigned long latch; | ||
57 | |||
58 | static unsigned long do_gettimeoffset(void) | ||
59 | { | ||
60 | unsigned long elapsed_time = 0; /* [us] */ | ||
61 | |||
62 | #if defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_XNUX2) \ | ||
63 | || defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_M32700) \ | ||
64 | || defined(CONFIG_CHIP_OPSP) | ||
65 | #ifndef CONFIG_SMP | ||
66 | |||
67 | unsigned long count; | ||
68 | |||
69 | /* timer count may underflow right here */ | ||
70 | count = inl(M32R_MFT2CUT_PORTL); | ||
71 | |||
72 | if (inl(M32R_ICU_CR18_PORTL) & 0x00000100) /* underflow check */ | ||
73 | count = 0; | ||
74 | |||
75 | count = (latch - count) * TICK_SIZE; | ||
76 | elapsed_time = (count + latch / 2) / latch; | ||
77 | /* NOTE: LATCH is equal to the "interval" value (= reload count). */ | ||
78 | |||
79 | #else /* CONFIG_SMP */ | ||
80 | unsigned long count; | ||
81 | static unsigned long p_jiffies = -1; | ||
82 | static unsigned long p_count = 0; | ||
83 | |||
84 | /* timer count may underflow right here */ | ||
85 | count = inl(M32R_MFT2CUT_PORTL); | ||
86 | |||
87 | if (jiffies == p_jiffies && count > p_count) | ||
88 | count = 0; | ||
89 | |||
90 | p_jiffies = jiffies; | ||
91 | p_count = count; | ||
92 | |||
93 | count = (latch - count) * TICK_SIZE; | ||
94 | elapsed_time = (count + latch / 2) / latch; | ||
95 | /* NOTE: LATCH is equal to the "interval" value (= reload count). */ | ||
96 | #endif /* CONFIG_SMP */ | ||
97 | #elif defined(CONFIG_CHIP_M32310) | ||
98 | #warning do_gettimeoffse not implemented | ||
99 | #else | ||
100 | #error no chip configuration | ||
101 | #endif | ||
102 | |||
103 | return elapsed_time; | ||
104 | } | ||
105 | |||
106 | /* | ||
107 | * This version of gettimeofday has near microsecond resolution. | ||
108 | */ | ||
109 | void do_gettimeofday(struct timeval *tv) | ||
110 | { | ||
111 | unsigned long seq; | ||
112 | unsigned long usec, sec; | ||
113 | unsigned long max_ntp_tick = tick_usec - tickadj; | ||
114 | |||
115 | do { | ||
116 | unsigned long lost; | ||
117 | |||
118 | seq = read_seqbegin(&xtime_lock); | ||
119 | |||
120 | usec = do_gettimeoffset(); | ||
121 | lost = jiffies - wall_jiffies; | ||
122 | |||
123 | /* | ||
124 | * If time_adjust is negative then NTP is slowing the clock | ||
125 | * so make sure not to go into next possible interval. | ||
126 | * Better to lose some accuracy than have time go backwards.. | ||
127 | */ | ||
128 | if (unlikely(time_adjust < 0)) { | ||
129 | usec = min(usec, max_ntp_tick); | ||
130 | if (lost) | ||
131 | usec += lost * max_ntp_tick; | ||
132 | } else if (unlikely(lost)) | ||
133 | usec += lost * tick_usec; | ||
134 | |||
135 | sec = xtime.tv_sec; | ||
136 | usec += (xtime.tv_nsec / 1000); | ||
137 | } while (read_seqretry(&xtime_lock, seq)); | ||
138 | |||
139 | while (usec >= 1000000) { | ||
140 | usec -= 1000000; | ||
141 | sec++; | ||
142 | } | ||
143 | |||
144 | tv->tv_sec = sec; | ||
145 | tv->tv_usec = usec; | ||
146 | } | ||
147 | |||
148 | EXPORT_SYMBOL(do_gettimeofday); | ||
149 | |||
150 | int do_settimeofday(struct timespec *tv) | ||
151 | { | ||
152 | time_t wtm_sec, sec = tv->tv_sec; | ||
153 | long wtm_nsec, nsec = tv->tv_nsec; | ||
154 | |||
155 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | ||
156 | return -EINVAL; | ||
157 | |||
158 | write_seqlock_irq(&xtime_lock); | ||
159 | /* | ||
160 | * This is revolting. We need to set "xtime" correctly. However, the | ||
161 | * value in this location is the value at the most recent update of | ||
162 | * wall time. Discover what correction gettimeofday() would have | ||
163 | * made, and then undo it! | ||
164 | */ | ||
165 | nsec -= do_gettimeoffset() * NSEC_PER_USEC; | ||
166 | nsec -= (jiffies - wall_jiffies) * TICK_NSEC; | ||
167 | |||
168 | wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); | ||
169 | wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); | ||
170 | |||
171 | set_normalized_timespec(&xtime, sec, nsec); | ||
172 | set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); | ||
173 | |||
174 | time_adjust = 0; /* stop active adjtime() */ | ||
175 | time_status |= STA_UNSYNC; | ||
176 | time_maxerror = NTP_PHASE_LIMIT; | ||
177 | time_esterror = NTP_PHASE_LIMIT; | ||
178 | write_sequnlock_irq(&xtime_lock); | ||
179 | clock_was_set(); | ||
180 | |||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | EXPORT_SYMBOL(do_settimeofday); | ||
185 | |||
186 | /* | ||
187 | * In order to set the CMOS clock precisely, set_rtc_mmss has to be | ||
188 | * called 500 ms after the second nowtime has started, because when | ||
189 | * nowtime is written into the registers of the CMOS clock, it will | ||
190 | * jump to the next second precisely 500 ms later. Check the Motorola | ||
191 | * MC146818A or Dallas DS12887 data sheet for details. | ||
192 | * | ||
193 | * BUG: This routine does not handle hour overflow properly; it just | ||
194 | * sets the minutes. Usually you won't notice until after reboot! | ||
195 | */ | ||
196 | static inline int set_rtc_mmss(unsigned long nowtime) | ||
197 | { | ||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | /* last time the cmos clock got updated */ | ||
202 | static long last_rtc_update = 0; | ||
203 | |||
204 | /* | ||
205 | * timer_interrupt() needs to keep up the real-time clock, | ||
206 | * as well as call the "do_timer()" routine every clocktick | ||
207 | */ | ||
208 | static inline void | ||
209 | do_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) | ||
210 | { | ||
211 | #ifndef CONFIG_SMP | ||
212 | profile_tick(CPU_PROFILING, regs); | ||
213 | #endif | ||
214 | do_timer(regs); | ||
215 | |||
216 | #ifndef CONFIG_SMP | ||
217 | update_process_times(user_mode(regs)); | ||
218 | #endif | ||
219 | /* | ||
220 | * If we have an externally synchronized Linux clock, then update | ||
221 | * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be | ||
222 | * called as close as possible to 500 ms before the new second starts. | ||
223 | */ | ||
224 | if ((time_status & STA_UNSYNC) == 0 | ||
225 | && xtime.tv_sec > last_rtc_update + 660 | ||
226 | && (xtime.tv_nsec / 1000) >= 500000 - ((unsigned)TICK_SIZE) / 2 | ||
227 | && (xtime.tv_nsec / 1000) <= 500000 + ((unsigned)TICK_SIZE) / 2) | ||
228 | { | ||
229 | if (set_rtc_mmss(xtime.tv_sec) == 0) | ||
230 | last_rtc_update = xtime.tv_sec; | ||
231 | else /* do it again in 60 s */ | ||
232 | last_rtc_update = xtime.tv_sec - 600; | ||
233 | } | ||
234 | /* As we return to user mode fire off the other CPU schedulers.. | ||
235 | this is basically because we don't yet share IRQ's around. | ||
236 | This message is rigged to be safe on the 386 - basically it's | ||
237 | a hack, so don't look closely for now.. */ | ||
238 | |||
239 | #ifdef CONFIG_SMP | ||
240 | smp_local_timer_interrupt(regs); | ||
241 | #endif | ||
242 | } | ||
243 | |||
244 | irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
245 | { | ||
246 | write_seqlock(&xtime_lock); | ||
247 | do_timer_interrupt(irq, NULL, regs); | ||
248 | write_sequnlock(&xtime_lock); | ||
249 | |||
250 | return IRQ_HANDLED; | ||
251 | } | ||
252 | |||
253 | struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, | ||
254 | "MFT2", NULL, NULL }; | ||
255 | |||
256 | void __init time_init(void) | ||
257 | { | ||
258 | unsigned int epoch, year, mon, day, hour, min, sec; | ||
259 | |||
260 | sec = min = hour = day = mon = year = 0; | ||
261 | epoch = 0; | ||
262 | |||
263 | year = 23; | ||
264 | mon = 4; | ||
265 | day = 17; | ||
266 | |||
267 | /* Attempt to guess the epoch. This is the same heuristic as in rtc.c | ||
268 | so no stupid things will happen to timekeeping. Who knows, maybe | ||
269 | Ultrix also uses 1952 as epoch ... */ | ||
270 | if (year > 10 && year < 44) | ||
271 | epoch = 1980; | ||
272 | else if (year < 96) | ||
273 | epoch = 1952; | ||
274 | year += epoch; | ||
275 | |||
276 | xtime.tv_sec = mktime(year, mon, day, hour, min, sec); | ||
277 | xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); | ||
278 | set_normalized_timespec(&wall_to_monotonic, | ||
279 | -xtime.tv_sec, -xtime.tv_nsec); | ||
280 | |||
281 | #if defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_XNUX2) \ | ||
282 | || defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_M32700) \ | ||
283 | || defined(CONFIG_CHIP_OPSP) | ||
284 | |||
285 | /* M32102 MFT setup */ | ||
286 | setup_irq(M32R_IRQ_MFT2, &irq0); | ||
287 | { | ||
288 | unsigned long bus_clock; | ||
289 | unsigned short divide; | ||
290 | |||
291 | bus_clock = boot_cpu_data.bus_clock; | ||
292 | divide = boot_cpu_data.timer_divide; | ||
293 | latch = (bus_clock/divide + HZ / 2) / HZ; | ||
294 | |||
295 | printk("Timer start : latch = %ld\n", latch); | ||
296 | |||
297 | outl((M32R_MFTMOD_CC_MASK | M32R_MFTMOD_TCCR \ | ||
298 | |M32R_MFTMOD_CSSEL011), M32R_MFT2MOD_PORTL); | ||
299 | outl(latch, M32R_MFT2RLD_PORTL); | ||
300 | outl(latch, M32R_MFT2CUT_PORTL); | ||
301 | outl(0, M32R_MFT2CMPRLD_PORTL); | ||
302 | outl((M32R_MFTCR_MFT2MSK|M32R_MFTCR_MFT2EN), M32R_MFTCR_PORTL); | ||
303 | } | ||
304 | |||
305 | #elif defined(CONFIG_CHIP_M32310) | ||
306 | #warning time_init not implemented | ||
307 | #else | ||
308 | #error no chip configuration | ||
309 | #endif | ||
310 | } | ||
311 | |||
312 | /* | ||
313 | * Scheduler clock - returns current time in nanosec units. | ||
314 | */ | ||
315 | unsigned long long sched_clock(void) | ||
316 | { | ||
317 | return (unsigned long long)jiffies * (1000000000 / HZ); | ||
318 | } | ||
diff --git a/arch/m32r/kernel/traps.c b/arch/m32r/kernel/traps.c new file mode 100644 index 000000000000..01922271d17e --- /dev/null +++ b/arch/m32r/kernel/traps.c | |||
@@ -0,0 +1,332 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/kernel/traps.c | ||
3 | * | ||
4 | * Copyright (C) 2001, 2002 Hirokazu Takata, Hiroyuki Kondo, | ||
5 | * Hitoshi Yamamoto | ||
6 | */ | ||
7 | |||
8 | /* $Id$ */ | ||
9 | |||
10 | /* | ||
11 | * 'traps.c' handles hardware traps and faults after we have saved some | ||
12 | * state in 'entry.S'. | ||
13 | */ | ||
14 | #include <linux/config.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/kallsyms.h> | ||
18 | #include <linux/stddef.h> | ||
19 | #include <linux/ptrace.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <asm/page.h> | ||
22 | #include <asm/processor.h> | ||
23 | |||
24 | #include <asm/system.h> | ||
25 | #include <asm/uaccess.h> | ||
26 | #include <asm/io.h> | ||
27 | #include <asm/atomic.h> | ||
28 | |||
29 | #include <asm/smp.h> | ||
30 | |||
31 | #include <linux/module.h> | ||
32 | |||
33 | asmlinkage void alignment_check(void); | ||
34 | asmlinkage void ei_handler(void); | ||
35 | asmlinkage void rie_handler(void); | ||
36 | asmlinkage void debug_trap(void); | ||
37 | asmlinkage void cache_flushing_handler(void); | ||
38 | |||
39 | #ifdef CONFIG_SMP | ||
40 | extern void smp_reschedule_interrupt(void); | ||
41 | extern void smp_invalidate_interrupt(void); | ||
42 | extern void smp_call_function_interrupt(void); | ||
43 | extern void smp_ipi_timer_interrupt(void); | ||
44 | extern void smp_flush_cache_all_interrupt(void); | ||
45 | |||
46 | /* | ||
47 | * for Boot AP function | ||
48 | */ | ||
49 | asm ( | ||
50 | " .section .eit_vector4,\"ax\" \n" | ||
51 | " .global _AP_RE \n" | ||
52 | " .global startup_AP \n" | ||
53 | "_AP_RE: \n" | ||
54 | " .fill 32, 4, 0 \n" | ||
55 | "_AP_EI: bra startup_AP \n" | ||
56 | " .previous \n" | ||
57 | ); | ||
58 | #endif /* CONFIG_SMP */ | ||
59 | |||
60 | extern unsigned long eit_vector[]; | ||
61 | #define BRA_INSN(func, entry) \ | ||
62 | ((unsigned long)func - (unsigned long)eit_vector - entry*4)/4 \ | ||
63 | + 0xff000000UL | ||
64 | |||
65 | void set_eit_vector_entries(void) | ||
66 | { | ||
67 | extern void default_eit_handler(void); | ||
68 | extern void system_call(void); | ||
69 | extern void pie_handler(void); | ||
70 | extern void ace_handler(void); | ||
71 | extern void tme_handler(void); | ||
72 | extern void _flush_cache_copyback_all(void); | ||
73 | |||
74 | eit_vector[0] = 0xd0c00001; /* seth r0, 0x01 */ | ||
75 | eit_vector[1] = BRA_INSN(default_eit_handler, 1); | ||
76 | eit_vector[4] = 0xd0c00010; /* seth r0, 0x10 */ | ||
77 | eit_vector[5] = BRA_INSN(default_eit_handler, 5); | ||
78 | eit_vector[8] = BRA_INSN(rie_handler, 8); | ||
79 | eit_vector[12] = BRA_INSN(alignment_check, 12); | ||
80 | eit_vector[16] = 0xff000000UL; | ||
81 | eit_vector[17] = BRA_INSN(debug_trap, 17); | ||
82 | eit_vector[18] = BRA_INSN(system_call, 18); | ||
83 | eit_vector[19] = 0xff000000UL; | ||
84 | eit_vector[20] = 0xff000000UL; | ||
85 | eit_vector[21] = 0xff000000UL; | ||
86 | eit_vector[22] = 0xff000000UL; | ||
87 | eit_vector[23] = 0xff000000UL; | ||
88 | eit_vector[24] = 0xff000000UL; | ||
89 | eit_vector[25] = 0xff000000UL; | ||
90 | eit_vector[26] = 0xff000000UL; | ||
91 | eit_vector[27] = 0xff000000UL; | ||
92 | eit_vector[28] = BRA_INSN(cache_flushing_handler, 28); | ||
93 | eit_vector[29] = 0xff000000UL; | ||
94 | eit_vector[30] = 0xff000000UL; | ||
95 | eit_vector[31] = 0xff000000UL; | ||
96 | eit_vector[32] = BRA_INSN(ei_handler, 32); | ||
97 | eit_vector[64] = BRA_INSN(pie_handler, 64); | ||
98 | #ifdef CONFIG_MMU | ||
99 | eit_vector[68] = BRA_INSN(ace_handler, 68); | ||
100 | eit_vector[72] = BRA_INSN(tme_handler, 72); | ||
101 | #endif /* CONFIG_MMU */ | ||
102 | #ifdef CONFIG_SMP | ||
103 | eit_vector[184] = (unsigned long)smp_reschedule_interrupt; | ||
104 | eit_vector[185] = (unsigned long)smp_invalidate_interrupt; | ||
105 | eit_vector[186] = (unsigned long)smp_call_function_interrupt; | ||
106 | eit_vector[187] = (unsigned long)smp_ipi_timer_interrupt; | ||
107 | eit_vector[188] = (unsigned long)smp_flush_cache_all_interrupt; | ||
108 | eit_vector[189] = 0; | ||
109 | eit_vector[190] = 0; | ||
110 | eit_vector[191] = 0; | ||
111 | #endif | ||
112 | _flush_cache_copyback_all(); | ||
113 | } | ||
114 | |||
115 | void __init trap_init(void) | ||
116 | { | ||
117 | set_eit_vector_entries(); | ||
118 | |||
119 | /* | ||
120 | * Should be a barrier for any external CPU state. | ||
121 | */ | ||
122 | cpu_init(); | ||
123 | } | ||
124 | |||
125 | int kstack_depth_to_print = 24; | ||
126 | |||
127 | void show_trace(struct task_struct *task, unsigned long *stack) | ||
128 | { | ||
129 | unsigned long addr; | ||
130 | |||
131 | if (!stack) | ||
132 | stack = (unsigned long*)&stack; | ||
133 | |||
134 | printk("Call Trace: "); | ||
135 | while (!kstack_end(stack)) { | ||
136 | addr = *stack++; | ||
137 | if (__kernel_text_address(addr)) { | ||
138 | printk("[<%08lx>] ", addr); | ||
139 | print_symbol("%s\n", addr); | ||
140 | } | ||
141 | } | ||
142 | printk("\n"); | ||
143 | } | ||
144 | |||
145 | void show_stack(struct task_struct *task, unsigned long *sp) | ||
146 | { | ||
147 | unsigned long *stack; | ||
148 | int i; | ||
149 | |||
150 | /* | ||
151 | * debugging aid: "show_stack(NULL);" prints the | ||
152 | * back trace for this cpu. | ||
153 | */ | ||
154 | |||
155 | if(sp==NULL) { | ||
156 | if (task) | ||
157 | sp = (unsigned long *)task->thread.sp; | ||
158 | else | ||
159 | sp=(unsigned long*)&sp; | ||
160 | } | ||
161 | |||
162 | stack = sp; | ||
163 | for(i=0; i < kstack_depth_to_print; i++) { | ||
164 | if (kstack_end(stack)) | ||
165 | break; | ||
166 | if (i && ((i % 4) == 0)) | ||
167 | printk("\n "); | ||
168 | printk("%08lx ", *stack++); | ||
169 | } | ||
170 | printk("\n"); | ||
171 | show_trace(task, sp); | ||
172 | } | ||
173 | |||
174 | void dump_stack(void) | ||
175 | { | ||
176 | unsigned long stack; | ||
177 | |||
178 | show_trace(current, &stack); | ||
179 | } | ||
180 | |||
181 | EXPORT_SYMBOL(dump_stack); | ||
182 | |||
183 | static void show_registers(struct pt_regs *regs) | ||
184 | { | ||
185 | int i = 0; | ||
186 | int in_kernel = 1; | ||
187 | unsigned long sp; | ||
188 | |||
189 | printk("CPU: %d\n", smp_processor_id()); | ||
190 | show_regs(regs); | ||
191 | |||
192 | sp = (unsigned long) (1+regs); | ||
193 | if (user_mode(regs)) { | ||
194 | in_kernel = 0; | ||
195 | sp = regs->spu; | ||
196 | printk("SPU: %08lx\n", sp); | ||
197 | } else { | ||
198 | printk("SPI: %08lx\n", sp); | ||
199 | } | ||
200 | printk("Process %s (pid: %d, process nr: %d, stackpage=%08lx)", | ||
201 | current->comm, current->pid, 0xffff & i, 4096+(unsigned long)current); | ||
202 | |||
203 | /* | ||
204 | * When in-kernel, we also print out the stack and code at the | ||
205 | * time of the fault.. | ||
206 | */ | ||
207 | if (in_kernel) { | ||
208 | printk("\nStack: "); | ||
209 | show_stack(current, (unsigned long*) sp); | ||
210 | |||
211 | printk("\nCode: "); | ||
212 | if (regs->bpc < PAGE_OFFSET) | ||
213 | goto bad; | ||
214 | |||
215 | for(i=0;i<20;i++) { | ||
216 | unsigned char c; | ||
217 | if (__get_user(c, &((unsigned char*)regs->bpc)[i])) { | ||
218 | bad: | ||
219 | printk(" Bad PC value."); | ||
220 | break; | ||
221 | } | ||
222 | printk("%02x ", c); | ||
223 | } | ||
224 | } | ||
225 | printk("\n"); | ||
226 | } | ||
227 | |||
228 | DEFINE_SPINLOCK(die_lock); | ||
229 | |||
230 | void die(const char * str, struct pt_regs * regs, long err) | ||
231 | { | ||
232 | console_verbose(); | ||
233 | spin_lock_irq(&die_lock); | ||
234 | bust_spinlocks(1); | ||
235 | printk("%s: %04lx\n", str, err & 0xffff); | ||
236 | show_registers(regs); | ||
237 | bust_spinlocks(0); | ||
238 | spin_unlock_irq(&die_lock); | ||
239 | do_exit(SIGSEGV); | ||
240 | } | ||
241 | |||
242 | static __inline__ void die_if_kernel(const char * str, | ||
243 | struct pt_regs * regs, long err) | ||
244 | { | ||
245 | if (!user_mode(regs)) | ||
246 | die(str, regs, err); | ||
247 | } | ||
248 | |||
249 | static __inline__ void do_trap(int trapnr, int signr, const char * str, | ||
250 | struct pt_regs * regs, long error_code, siginfo_t *info) | ||
251 | { | ||
252 | if (user_mode(regs)) { | ||
253 | /* trap_signal */ | ||
254 | struct task_struct *tsk = current; | ||
255 | tsk->thread.error_code = error_code; | ||
256 | tsk->thread.trap_no = trapnr; | ||
257 | if (info) | ||
258 | force_sig_info(signr, info, tsk); | ||
259 | else | ||
260 | force_sig(signr, tsk); | ||
261 | return; | ||
262 | } else { | ||
263 | /* kernel_trap */ | ||
264 | if (!fixup_exception(regs)) | ||
265 | die(str, regs, error_code); | ||
266 | return; | ||
267 | } | ||
268 | } | ||
269 | |||
270 | #define DO_ERROR(trapnr, signr, str, name) \ | ||
271 | asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ | ||
272 | { \ | ||
273 | do_trap(trapnr, signr, 0, regs, error_code, NULL); \ | ||
274 | } | ||
275 | |||
276 | #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ | ||
277 | asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ | ||
278 | { \ | ||
279 | siginfo_t info; \ | ||
280 | info.si_signo = signr; \ | ||
281 | info.si_errno = 0; \ | ||
282 | info.si_code = sicode; \ | ||
283 | info.si_addr = (void __user *)siaddr; \ | ||
284 | do_trap(trapnr, signr, str, regs, error_code, &info); \ | ||
285 | } | ||
286 | |||
287 | DO_ERROR( 1, SIGTRAP, "debug trap", debug_trap) | ||
288 | DO_ERROR_INFO(0x20, SIGILL, "reserved instruction ", rie_handler, ILL_ILLOPC, regs->bpc) | ||
289 | DO_ERROR_INFO(0x100, SIGILL, "privilege instruction", pie_handler, ILL_PRVOPC, regs->bpc) | ||
290 | |||
291 | extern int handle_unaligned_access(unsigned long, struct pt_regs *); | ||
292 | |||
293 | /* This code taken from arch/sh/kernel/traps.c */ | ||
294 | asmlinkage void do_alignment_check(struct pt_regs *regs, long error_code) | ||
295 | { | ||
296 | mm_segment_t oldfs; | ||
297 | unsigned long insn; | ||
298 | int tmp; | ||
299 | |||
300 | oldfs = get_fs(); | ||
301 | |||
302 | if (user_mode(regs)) { | ||
303 | local_irq_enable(); | ||
304 | current->thread.error_code = error_code; | ||
305 | current->thread.trap_no = 0x17; | ||
306 | |||
307 | set_fs(USER_DS); | ||
308 | if (copy_from_user(&insn, (void *)regs->bpc, 4)) { | ||
309 | set_fs(oldfs); | ||
310 | goto uspace_segv; | ||
311 | } | ||
312 | tmp = handle_unaligned_access(insn, regs); | ||
313 | set_fs(oldfs); | ||
314 | |||
315 | if (!tmp) | ||
316 | return; | ||
317 | |||
318 | uspace_segv: | ||
319 | printk(KERN_NOTICE "Killing process \"%s\" due to unaligned " | ||
320 | "access\n", current->comm); | ||
321 | force_sig(SIGSEGV, current); | ||
322 | } else { | ||
323 | set_fs(KERNEL_DS); | ||
324 | if (copy_from_user(&insn, (void *)regs->bpc, 4)) { | ||
325 | set_fs(oldfs); | ||
326 | die("insn faulting in do_address_error", regs, 0); | ||
327 | } | ||
328 | handle_unaligned_access(insn, regs); | ||
329 | set_fs(oldfs); | ||
330 | } | ||
331 | } | ||
332 | |||
diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S new file mode 100644 index 000000000000..729a2645a03f --- /dev/null +++ b/arch/m32r/kernel/vmlinux.lds.S | |||
@@ -0,0 +1,143 @@ | |||
1 | /* ld script to make M32R Linux kernel | ||
2 | */ | ||
3 | |||
4 | #include <linux/config.h> | ||
5 | #include <asm-generic/vmlinux.lds.h> | ||
6 | #include <asm/addrspace.h> | ||
7 | #include <asm/page.h> | ||
8 | |||
9 | OUTPUT_ARCH(m32r) | ||
10 | ENTRY(startup_32) | ||
11 | #if defined(__LITTLE_ENDIAN__) | ||
12 | jiffies = jiffies_64; | ||
13 | #else | ||
14 | jiffies = jiffies_64 + 4; | ||
15 | #endif | ||
16 | SECTIONS | ||
17 | { | ||
18 | . = CONFIG_MEMORY_START + __PAGE_OFFSET; | ||
19 | eit_vector = .; | ||
20 | |||
21 | . = . + 0x1000; | ||
22 | .empty_zero_page : { *(.empty_zero_page) } = 0 | ||
23 | |||
24 | /* read-only */ | ||
25 | _text = .; /* Text and read-only data */ | ||
26 | .boot : { *(.boot) } = 0 | ||
27 | .text : { | ||
28 | *(.text) | ||
29 | SCHED_TEXT | ||
30 | LOCK_TEXT | ||
31 | *(.fixup) | ||
32 | *(.gnu.warning) | ||
33 | } = 0x9090 | ||
34 | #ifdef CONFIG_SMP | ||
35 | . = ALIGN(65536); | ||
36 | .eit_vector4 : { *(.eit_vector4) } | ||
37 | #endif | ||
38 | _etext = .; /* End of text section */ | ||
39 | |||
40 | . = ALIGN(16); /* Exception table */ | ||
41 | __start___ex_table = .; | ||
42 | __ex_table : { *(__ex_table) } | ||
43 | __stop___ex_table = .; | ||
44 | |||
45 | RODATA | ||
46 | |||
47 | /* writeable */ | ||
48 | .data : { /* Data */ | ||
49 | *(.spu) | ||
50 | *(.spi) | ||
51 | *(.data) | ||
52 | CONSTRUCTORS | ||
53 | } | ||
54 | |||
55 | . = ALIGN(4096); | ||
56 | __nosave_begin = .; | ||
57 | .data_nosave : { *(.data.nosave) } | ||
58 | . = ALIGN(4096); | ||
59 | __nosave_end = .; | ||
60 | |||
61 | . = ALIGN(4096); | ||
62 | .data.page_aligned : { *(.data.idt) } | ||
63 | |||
64 | . = ALIGN(32); | ||
65 | .data.cacheline_aligned : { *(.data.cacheline_aligned) } | ||
66 | |||
67 | _edata = .; /* End of data section */ | ||
68 | |||
69 | . = ALIGN(8192); /* init_task */ | ||
70 | .data.init_task : { *(.data.init_task) } | ||
71 | |||
72 | /* will be freed after init */ | ||
73 | . = ALIGN(4096); /* Init code and data */ | ||
74 | __init_begin = .; | ||
75 | .init.text : { | ||
76 | _sinittext = .; | ||
77 | *(.init.text) | ||
78 | _einittext = .; | ||
79 | } | ||
80 | .init.data : { *(.init.data) } | ||
81 | . = ALIGN(16); | ||
82 | __setup_start = .; | ||
83 | .init.setup : { *(.init.setup) } | ||
84 | __setup_end = .; | ||
85 | __initcall_start = .; | ||
86 | .initcall.init : { | ||
87 | *(.initcall1.init) | ||
88 | *(.initcall2.init) | ||
89 | *(.initcall3.init) | ||
90 | *(.initcall4.init) | ||
91 | *(.initcall5.init) | ||
92 | *(.initcall6.init) | ||
93 | *(.initcall7.init) | ||
94 | } | ||
95 | __initcall_end = .; | ||
96 | __con_initcall_start = .; | ||
97 | .con_initcall.init : { *(.con_initcall.init) } | ||
98 | __con_initcall_end = .; | ||
99 | SECURITY_INIT | ||
100 | . = ALIGN(4); | ||
101 | __alt_instructions = .; | ||
102 | .altinstructions : { *(.altinstructions) } | ||
103 | __alt_instructions_end = .; | ||
104 | .altinstr_replacement : { *(.altinstr_replacement) } | ||
105 | /* .exit.text is discard at runtime, not link time, to deal with references | ||
106 | from .altinstructions and .eh_frame */ | ||
107 | .exit.text : { *(.exit.text) } | ||
108 | .exit.data : { *(.exit.data) } | ||
109 | . = ALIGN(4096); | ||
110 | __initramfs_start = .; | ||
111 | .init.ramfs : { *(.init.ramfs) } | ||
112 | __initramfs_end = .; | ||
113 | . = ALIGN(32); | ||
114 | __per_cpu_start = .; | ||
115 | .data.percpu : { *(.data.percpu) } | ||
116 | __per_cpu_end = .; | ||
117 | . = ALIGN(4096); | ||
118 | __init_end = .; | ||
119 | /* freed after init ends here */ | ||
120 | |||
121 | __bss_start = .; /* BSS */ | ||
122 | .bss : { *(.bss) } | ||
123 | . = ALIGN(4); | ||
124 | __bss_stop = .; | ||
125 | |||
126 | _end = . ; | ||
127 | |||
128 | /* Sections to be discarded */ | ||
129 | /DISCARD/ : { | ||
130 | *(.exit.text) | ||
131 | *(.exit.data) | ||
132 | *(.exitcall.exit) | ||
133 | } | ||
134 | |||
135 | /* Stabs debugging sections. */ | ||
136 | .stab 0 : { *(.stab) } | ||
137 | .stabstr 0 : { *(.stabstr) } | ||
138 | .stab.excl 0 : { *(.stab.excl) } | ||
139 | .stab.exclstr 0 : { *(.stab.exclstr) } | ||
140 | .stab.index 0 : { *(.stab.index) } | ||
141 | .stab.indexstr 0 : { *(.stab.indexstr) } | ||
142 | .comment 0 : { *(.comment) } | ||
143 | } | ||
diff --git a/arch/m32r/lib/Makefile b/arch/m32r/lib/Makefile new file mode 100644 index 000000000000..e632d10c7d78 --- /dev/null +++ b/arch/m32r/lib/Makefile | |||
@@ -0,0 +1,7 @@ | |||
1 | # | ||
2 | # Makefile for M32R-specific library files.. | ||
3 | # | ||
4 | |||
5 | lib-y := checksum.o ashxdi3.o memset.o memcpy.o getuser.o \ | ||
6 | putuser.o delay.o strlen.o usercopy.o csum_partial_copy.o | ||
7 | |||
diff --git a/arch/m32r/lib/ashxdi3.S b/arch/m32r/lib/ashxdi3.S new file mode 100644 index 000000000000..78effca9d97a --- /dev/null +++ b/arch/m32r/lib/ashxdi3.S | |||
@@ -0,0 +1,297 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/lib/ashxdi3.S | ||
3 | * | ||
4 | * Copyright (C) 2001,2002 Hiroyuki Kondo, and Hirokazu Takata | ||
5 | * | ||
6 | */ | ||
7 | /* $Id$ */ | ||
8 | |||
9 | #include <linux/config.h> | ||
10 | |||
11 | ; | ||
12 | ; input (r0,r1) src | ||
13 | ; input r2 shift val | ||
14 | ; r3 scratch | ||
15 | ; output (r0,r1) | ||
16 | ; | ||
17 | |||
18 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
19 | |||
20 | #ifndef __LITTLE_ENDIAN__ | ||
21 | |||
22 | .text | ||
23 | .align 4 | ||
24 | .globl __ashrdi3 | ||
25 | __ashrdi3: | ||
26 | cmpz r2 || ldi r3, #32 | ||
27 | jc r14 || cmpu r2, r3 | ||
28 | bc 1f | ||
29 | ; case 32 =< shift | ||
30 | mv r1, r0 || srai r0, #31 | ||
31 | addi r2, #-32 | ||
32 | sra r1, r2 | ||
33 | jmp r14 | ||
34 | .fillinsn | ||
35 | 1: ; case shift <32 | ||
36 | mv r3, r0 || srl r1, r2 | ||
37 | sra r0, r2 || neg r2, r2 | ||
38 | sll r3, r2 | ||
39 | or r1, r3 || jmp r14 | ||
40 | |||
41 | .align 4 | ||
42 | .globl __ashldi3 | ||
43 | .globl __lshldi3 | ||
44 | __ashldi3: | ||
45 | __lshldi3: | ||
46 | cmpz r2 || ldi r3, #32 | ||
47 | jc r14 || cmpu r2, r3 | ||
48 | bc 1f | ||
49 | ; case 32 =< shift | ||
50 | mv r0, r1 || addi r2, #-32 | ||
51 | sll r0, r2 || ldi r1, #0 | ||
52 | jmp r14 | ||
53 | .fillinsn | ||
54 | 1: ; case shift <32 | ||
55 | mv r3, r1 || sll r0, r2 | ||
56 | sll r1, r2 || neg r2, r2 | ||
57 | srl r3, r2 | ||
58 | or r0, r3 || jmp r14 | ||
59 | |||
60 | .align 4 | ||
61 | .globl __lshrdi3 | ||
62 | __lshrdi3: | ||
63 | cmpz r2 || ldi r3, #32 | ||
64 | jc r14 || cmpu r2, r3 | ||
65 | bc 1f | ||
66 | ; case 32 =< shift | ||
67 | mv r1, r0 || addi r2, #-32 | ||
68 | ldi r0, #0 || srl r1, r2 | ||
69 | jmp r14 | ||
70 | .fillinsn | ||
71 | 1: ; case shift <32 | ||
72 | mv r3, r0 || srl r1, r2 | ||
73 | srl r0, r2 || neg r2, r2 | ||
74 | sll r3, r2 | ||
75 | or r1, r3 || jmp r14 | ||
76 | |||
77 | #else /* LITTLE_ENDIAN */ | ||
78 | |||
79 | .text | ||
80 | .align 4 | ||
81 | .globl __ashrdi3 | ||
82 | __ashrdi3: | ||
83 | cmpz r2 || ldi r3, #32 | ||
84 | jc r14 || cmpu r2, r3 | ||
85 | bc 1f | ||
86 | ; case 32 =< shift | ||
87 | mv r0, r1 || srai r1, #31 | ||
88 | addi r2, #-32 | ||
89 | sra r0, r2 | ||
90 | jmp r14 | ||
91 | .fillinsn | ||
92 | 1: ; case shift <32 | ||
93 | mv r3, r1 || srl r0, r2 | ||
94 | sra r1, r2 || neg r2, r2 | ||
95 | sll r3, r2 | ||
96 | or r0, r3 || jmp r14 | ||
97 | |||
98 | .align 4 | ||
99 | .globl __ashldi3 | ||
100 | .globl __lshldi3 | ||
101 | __ashldi3: | ||
102 | __lshldi3: | ||
103 | cmpz r2 || ldi r3, #32 | ||
104 | jc r14 || cmpu r2, r3 | ||
105 | bc 1f | ||
106 | ; case 32 =< shift | ||
107 | mv r1, r0 || addi r2, #-32 | ||
108 | sll r1, r2 || ldi r0, #0 | ||
109 | jmp r14 | ||
110 | .fillinsn | ||
111 | 1: ; case shift <32 | ||
112 | mv r3, r0 || sll r1, r2 | ||
113 | sll r0, r2 || neg r2, r2 | ||
114 | srl r3, r2 | ||
115 | or r1, r3 || jmp r14 | ||
116 | |||
117 | .align 4 | ||
118 | .globl __lshrdi3 | ||
119 | __lshrdi3: | ||
120 | cmpz r2 || ldi r3, #32 | ||
121 | jc r14 || cmpu r2, r3 | ||
122 | bc 1f | ||
123 | ; case 32 =< shift | ||
124 | mv r0, r1 || addi r2, #-32 | ||
125 | ldi r1, #0 || srl r0, r2 | ||
126 | jmp r14 | ||
127 | .fillinsn | ||
128 | 1: ; case shift <32 | ||
129 | mv r3, r1 || srl r0, r2 | ||
130 | srl r1, r2 || neg r2, r2 | ||
131 | sll r3, r2 | ||
132 | or r0, r3 || jmp r14 | ||
133 | |||
134 | #endif | ||
135 | |||
136 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
137 | |||
138 | #ifndef __LITTLE_ENDIAN__ | ||
139 | |||
140 | .text | ||
141 | .align 4 | ||
142 | .globl __ashrdi3 | ||
143 | __ashrdi3: | ||
144 | beqz r2, 2f | ||
145 | cmpui r2, #32 | ||
146 | bc 1f | ||
147 | ; case 32 =< shift | ||
148 | mv r1, r0 | ||
149 | srai r0, #31 | ||
150 | addi r2, #-32 | ||
151 | sra r1, r2 | ||
152 | jmp r14 | ||
153 | .fillinsn | ||
154 | 1: ; case shift <32 | ||
155 | mv r3, r0 | ||
156 | srl r1, r2 | ||
157 | sra r0, r2 | ||
158 | neg r2, r2 | ||
159 | sll r3, r2 | ||
160 | or r1, r3 | ||
161 | .fillinsn | ||
162 | 2: | ||
163 | jmp r14 | ||
164 | |||
165 | .align 4 | ||
166 | .globl __ashldi3 | ||
167 | .globl __lshldi3 | ||
168 | __ashldi3: | ||
169 | __lshldi3: | ||
170 | beqz r2, 2f | ||
171 | cmpui r2, #32 | ||
172 | bc 1f | ||
173 | ; case 32 =< shift | ||
174 | mv r0, r1 | ||
175 | addi r2, #-32 | ||
176 | sll r0, r2 | ||
177 | ldi r1, #0 | ||
178 | jmp r14 | ||
179 | .fillinsn | ||
180 | 1: ; case shift <32 | ||
181 | mv r3, r1 | ||
182 | sll r0, r2 | ||
183 | sll r1, r2 | ||
184 | neg r2, r2 | ||
185 | srl r3, r2 | ||
186 | or r0, r3 | ||
187 | .fillinsn | ||
188 | 2: | ||
189 | jmp r14 | ||
190 | |||
191 | .align 4 | ||
192 | .globl __lshrdi3 | ||
193 | __lshrdi3: | ||
194 | beqz r2, 2f | ||
195 | cmpui r2, #32 | ||
196 | bc 1f | ||
197 | ; case 32 =< shift | ||
198 | mv r1, r0 | ||
199 | ldi r0, #0 | ||
200 | addi r2, #-32 | ||
201 | srl r1, r2 | ||
202 | jmp r14 | ||
203 | .fillinsn | ||
204 | 1: ; case shift <32 | ||
205 | mv r3, r0 | ||
206 | srl r1, r2 | ||
207 | srl r0, r2 | ||
208 | neg r2, r2 | ||
209 | sll r3, r2 | ||
210 | or r1, r3 | ||
211 | .fillinsn | ||
212 | 2: | ||
213 | jmp r14 | ||
214 | |||
215 | #else | ||
216 | |||
217 | .text | ||
218 | .align 4 | ||
219 | .globl __ashrdi3 | ||
220 | __ashrdi3: | ||
221 | beqz r2, 2f | ||
222 | cmpui r2, #32 | ||
223 | bc 1f | ||
224 | ; case 32 =< shift | ||
225 | mv r0, r1 | ||
226 | srai r1, #31 | ||
227 | addi r2, #-32 | ||
228 | sra r0, r2 | ||
229 | jmp r14 | ||
230 | .fillinsn | ||
231 | 1: ; case shift <32 | ||
232 | mv r3, r1 | ||
233 | srl r0, r2 | ||
234 | sra r1, r2 | ||
235 | neg r2, r2 | ||
236 | sll r3, r2 | ||
237 | or r0, r3 | ||
238 | .fillinsn | ||
239 | 2: | ||
240 | jmp r14 | ||
241 | |||
242 | .align 4 | ||
243 | .globl __ashldi3 | ||
244 | .globl __lshldi3 | ||
245 | __ashldi3: | ||
246 | __lshldi3: | ||
247 | beqz r2, 2f | ||
248 | cmpui r2, #32 | ||
249 | bc 1f | ||
250 | ; case 32 =< shift | ||
251 | mv r1, r0 | ||
252 | addi r2, #-32 | ||
253 | sll r1, r2 | ||
254 | ldi r0, #0 | ||
255 | jmp r14 | ||
256 | .fillinsn | ||
257 | 1: ; case shift <32 | ||
258 | mv r3, r0 | ||
259 | sll r1, r2 | ||
260 | sll r0, r2 | ||
261 | neg r2, r2 | ||
262 | srl r3, r2 | ||
263 | or r1, r3 | ||
264 | .fillinsn | ||
265 | 2: | ||
266 | jmp r14 | ||
267 | |||
268 | .align 4 | ||
269 | .globl __lshrdi3 | ||
270 | __lshrdi3: | ||
271 | beqz r2, 2f | ||
272 | cmpui r2, #32 | ||
273 | bc 1f | ||
274 | ; case 32 =< shift | ||
275 | mv r0, r1 | ||
276 | ldi r1, #0 | ||
277 | addi r2, #-32 | ||
278 | srl r0, r2 | ||
279 | jmp r14 | ||
280 | .fillinsn | ||
281 | 1: ; case shift <32 | ||
282 | mv r3, r1 | ||
283 | srl r0, r2 | ||
284 | srl r1, r2 | ||
285 | neg r2, r2 | ||
286 | sll r3, r2 | ||
287 | or r0, r3 | ||
288 | .fillinsn | ||
289 | 2: | ||
290 | jmp r14 | ||
291 | |||
292 | #endif | ||
293 | |||
294 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
295 | |||
296 | .end | ||
297 | |||
diff --git a/arch/m32r/lib/checksum.S b/arch/m32r/lib/checksum.S new file mode 100644 index 000000000000..f6fc1bdb87e4 --- /dev/null +++ b/arch/m32r/lib/checksum.S | |||
@@ -0,0 +1,322 @@ | |||
1 | /* | ||
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | ||
3 | * operating system. INET is implemented using the BSD Socket | ||
4 | * interface as the means of communication with the user level. | ||
5 | * | ||
6 | * IP/TCP/UDP checksumming routines | ||
7 | * | ||
8 | * Authors: Jorge Cwik, <jorge@laser.satlink.net> | ||
9 | * Arnt Gulbrandsen, <agulbra@nvg.unit.no> | ||
10 | * Tom May, <ftom@netcom.com> | ||
11 | * Pentium Pro/II routines: | ||
12 | * Alexander Kjeldaas <astor@guardian.no> | ||
13 | * Finn Arne Gangstad <finnag@guardian.no> | ||
14 | * Lots of code moved from tcp.c and ip.c; see those files | ||
15 | * for more names. | ||
16 | * | ||
17 | * Changes: Ingo Molnar, converted csum_partial_copy() to 2.1 exception | ||
18 | * handling. | ||
19 | * Andi Kleen, add zeroing on error | ||
20 | * converted to pure assembler | ||
21 | * Hirokazu Takata,Hiroyuki Kondo rewrite for the m32r architecture. | ||
22 | * | ||
23 | * This program is free software; you can redistribute it and/or | ||
24 | * modify it under the terms of the GNU General Public License | ||
25 | * as published by the Free Software Foundation; either version | ||
26 | * 2 of the License, or (at your option) any later version. | ||
27 | */ | ||
28 | /* $Id$ */ | ||
29 | |||
30 | |||
31 | #include <linux/config.h> | ||
32 | #include <linux/linkage.h> | ||
33 | #include <asm/assembler.h> | ||
34 | #include <asm/errno.h> | ||
35 | |||
36 | /* | ||
37 | * computes a partial checksum, e.g. for TCP/UDP fragments | ||
38 | */ | ||
39 | |||
40 | /* | ||
41 | unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) | ||
42 | */ | ||
43 | |||
44 | |||
45 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
46 | |||
47 | /* | ||
48 | * Experiments with Ethernet and SLIP connections show that buff | ||
49 | * is aligned on either a 2-byte or 4-byte boundary. We get at | ||
50 | * least a twofold speedup on 486 and Pentium if it is 4-byte aligned. | ||
51 | * Fortunately, it is easy to convert 2-byte alignment to 4-byte | ||
52 | * alignment for the unrolled loop. | ||
53 | */ | ||
54 | |||
55 | .text | ||
56 | ENTRY(csum_partial) | ||
57 | ; Function args | ||
58 | ; r0: unsigned char *buff | ||
59 | ; r1: int len | ||
60 | ; r2: unsigned int sum | ||
61 | |||
62 | push r2 || ldi r2, #0 | ||
63 | and3 r7, r0, #1 ; Check alignment. | ||
64 | beqz r7, 1f ; Jump if alignment is ok. | ||
65 | ; 1-byte mis aligned | ||
66 | ldub r4, @r0 || addi r0, #1 | ||
67 | ; clear c-bit || Alignment uses up bytes. | ||
68 | cmp r0, r0 || addi r1, #-1 | ||
69 | ldi r3, #0 || addx r2, r4 | ||
70 | addx r2, r3 | ||
71 | .fillinsn | ||
72 | 1: | ||
73 | and3 r4, r0, #2 ; Check alignment. | ||
74 | beqz r4, 2f ; Jump if alignment is ok. | ||
75 | ; clear c-bit || Alignment uses up two bytes. | ||
76 | cmp r0, r0 || addi r1, #-2 | ||
77 | bgtz r1, 1f ; Jump if we had at least two bytes. | ||
78 | bra 4f || addi r1, #2 | ||
79 | .fillinsn ; len(r1) was < 2. Deal with it. | ||
80 | 1: | ||
81 | ; 2-byte aligned | ||
82 | lduh r4, @r0 || ldi r3, #0 | ||
83 | addx r2, r4 || addi r0, #2 | ||
84 | addx r2, r3 | ||
85 | .fillinsn | ||
86 | 2: | ||
87 | ; 4-byte aligned | ||
88 | cmp r0, r0 ; clear c-bit | ||
89 | srl3 r6, r1, #5 | ||
90 | beqz r6, 2f | ||
91 | .fillinsn | ||
92 | |||
93 | 1: ld r3, @r0+ | ||
94 | ld r4, @r0+ ; +4 | ||
95 | ld r5, @r0+ ; +8 | ||
96 | ld r3, @r0+ || addx r2, r3 ; +12 | ||
97 | ld r4, @r0+ || addx r2, r4 ; +16 | ||
98 | ld r5, @r0+ || addx r2, r5 ; +20 | ||
99 | ld r3, @r0+ || addx r2, r3 ; +24 | ||
100 | ld r4, @r0+ || addx r2, r4 ; +28 | ||
101 | addx r2, r5 || addi r6, #-1 | ||
102 | addx r2, r3 | ||
103 | addx r2, r4 | ||
104 | bnez r6, 1b | ||
105 | |||
106 | addx r2, r6 ; r6=0 | ||
107 | cmp r0, r0 ; This clears c-bit | ||
108 | .fillinsn | ||
109 | 2: and3 r6, r1, #0x1c ; withdraw len | ||
110 | beqz r6, 4f | ||
111 | srli r6, #2 | ||
112 | .fillinsn | ||
113 | |||
114 | 3: ld r4, @r0+ || addi r6, #-1 | ||
115 | addx r2, r4 | ||
116 | bnez r6, 3b | ||
117 | |||
118 | addx r2, r6 ; r6=0 | ||
119 | cmp r0, r0 ; This clears c-bit | ||
120 | .fillinsn | ||
121 | 4: and3 r1, r1, #3 | ||
122 | beqz r1, 7f ; if len == 0 goto end | ||
123 | and3 r6, r1, #2 | ||
124 | beqz r6, 5f ; if len < 2 goto 5f(1byte) | ||
125 | lduh r4, @r0 || addi r0, #2 | ||
126 | addi r1, #-2 || slli r4, #16 | ||
127 | addx r2, r4 | ||
128 | beqz r1, 6f | ||
129 | .fillinsn | ||
130 | 5: ldub r4, @r0 || ldi r1, #0 | ||
131 | #ifndef __LITTLE_ENDIAN__ | ||
132 | slli r4, #8 | ||
133 | #endif | ||
134 | addx r2, r4 | ||
135 | .fillinsn | ||
136 | 6: addx r2, r1 | ||
137 | .fillinsn | ||
138 | 7: | ||
139 | and3 r0, r2, #0xffff | ||
140 | srli r2, #16 | ||
141 | add r0, r2 | ||
142 | srl3 r2, r0, #16 | ||
143 | beqz r2, 1f | ||
144 | addi r0, #1 | ||
145 | and3 r0, r0, #0xffff | ||
146 | .fillinsn | ||
147 | 1: | ||
148 | beqz r7, 1f ; swap the upper byte for the lower | ||
149 | and3 r2, r0, #0xff | ||
150 | srl3 r0, r0, #8 | ||
151 | slli r2, #8 | ||
152 | or r0, r2 | ||
153 | .fillinsn | ||
154 | 1: | ||
155 | pop r2 || cmp r0, r0 | ||
156 | addx r0, r2 || ldi r2, #0 | ||
157 | addx r0, r2 | ||
158 | jmp r14 | ||
159 | |||
160 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
161 | |||
162 | /* | ||
163 | * Experiments with Ethernet and SLIP connections show that buff | ||
164 | * is aligned on either a 2-byte or 4-byte boundary. We get at | ||
165 | * least a twofold speedup on 486 and Pentium if it is 4-byte aligned. | ||
166 | * Fortunately, it is easy to convert 2-byte alignment to 4-byte | ||
167 | * alignment for the unrolled loop. | ||
168 | */ | ||
169 | |||
170 | .text | ||
171 | ENTRY(csum_partial) | ||
172 | ; Function args | ||
173 | ; r0: unsigned char *buff | ||
174 | ; r1: int len | ||
175 | ; r2: unsigned int sum | ||
176 | |||
177 | push r2 | ||
178 | ldi r2, #0 | ||
179 | and3 r7, r0, #1 ; Check alignment. | ||
180 | beqz r7, 1f ; Jump if alignment is ok. | ||
181 | ; 1-byte mis aligned | ||
182 | ldub r4, @r0 | ||
183 | addi r0, #1 | ||
184 | addi r1, #-1 ; Alignment uses up bytes. | ||
185 | cmp r0, r0 ; clear c-bit | ||
186 | ldi r3, #0 | ||
187 | addx r2, r4 | ||
188 | addx r2, r3 | ||
189 | .fillinsn | ||
190 | 1: | ||
191 | and3 r4, r0, #2 ; Check alignment. | ||
192 | beqz r4, 2f ; Jump if alignment is ok. | ||
193 | addi r1, #-2 ; Alignment uses up two bytes. | ||
194 | cmp r0, r0 ; clear c-bit | ||
195 | bgtz r1, 1f ; Jump if we had at least two bytes. | ||
196 | addi r1, #2 ; len(r1) was < 2. Deal with it. | ||
197 | bra 4f | ||
198 | .fillinsn | ||
199 | 1: | ||
200 | ; 2-byte aligned | ||
201 | lduh r4, @r0 | ||
202 | addi r0, #2 | ||
203 | ldi r3, #0 | ||
204 | addx r2, r4 | ||
205 | addx r2, r3 | ||
206 | .fillinsn | ||
207 | 2: | ||
208 | ; 4-byte aligned | ||
209 | cmp r0, r0 ; clear c-bit | ||
210 | srl3 r6, r1, #5 | ||
211 | beqz r6, 2f | ||
212 | .fillinsn | ||
213 | |||
214 | 1: ld r3, @r0+ | ||
215 | ld r4, @r0+ ; +4 | ||
216 | ld r5, @r0+ ; +8 | ||
217 | addx r2, r3 | ||
218 | addx r2, r4 | ||
219 | addx r2, r5 | ||
220 | ld r3, @r0+ ; +12 | ||
221 | ld r4, @r0+ ; +16 | ||
222 | ld r5, @r0+ ; +20 | ||
223 | addx r2, r3 | ||
224 | addx r2, r4 | ||
225 | addx r2, r5 | ||
226 | ld r3, @r0+ ; +24 | ||
227 | ld r4, @r0+ ; +28 | ||
228 | addi r6, #-1 | ||
229 | addx r2, r3 | ||
230 | addx r2, r4 | ||
231 | bnez r6, 1b | ||
232 | addx r2, r6 ; r6=0 | ||
233 | cmp r0, r0 ; This clears c-bit | ||
234 | .fillinsn | ||
235 | |||
236 | 2: and3 r6, r1, #0x1c ; withdraw len | ||
237 | beqz r6, 4f | ||
238 | srli r6, #2 | ||
239 | .fillinsn | ||
240 | |||
241 | 3: ld r4, @r0+ | ||
242 | addi r6, #-1 | ||
243 | addx r2, r4 | ||
244 | bnez r6, 3b | ||
245 | addx r2, r6 ; r6=0 | ||
246 | cmp r0, r0 ; This clears c-bit | ||
247 | .fillinsn | ||
248 | |||
249 | 4: and3 r1, r1, #3 | ||
250 | beqz r1, 7f ; if len == 0 goto end | ||
251 | and3 r6, r1, #2 | ||
252 | beqz r6, 5f ; if len < 2 goto 5f(1byte) | ||
253 | |||
254 | lduh r4, @r0 | ||
255 | addi r0, #2 | ||
256 | addi r1, #-2 | ||
257 | slli r4, #16 | ||
258 | addx r2, r4 | ||
259 | beqz r1, 6f | ||
260 | .fillinsn | ||
261 | 5: ldub r4, @r0 | ||
262 | #ifndef __LITTLE_ENDIAN__ | ||
263 | slli r4, #8 | ||
264 | #endif | ||
265 | addx r2, r4 | ||
266 | .fillinsn | ||
267 | 6: ldi r5, #0 | ||
268 | addx r2, r5 | ||
269 | .fillinsn | ||
270 | 7: | ||
271 | and3 r0, r2, #0xffff | ||
272 | srli r2, #16 | ||
273 | add r0, r2 | ||
274 | srl3 r2, r0, #16 | ||
275 | beqz r2, 1f | ||
276 | addi r0, #1 | ||
277 | and3 r0, r0, #0xffff | ||
278 | .fillinsn | ||
279 | 1: | ||
280 | beqz r7, 1f | ||
281 | mv r2, r0 | ||
282 | srl3 r0, r2, #8 | ||
283 | and3 r2, r2, #0xff | ||
284 | slli r2, #8 | ||
285 | or r0, r2 | ||
286 | .fillinsn | ||
287 | 1: | ||
288 | pop r2 | ||
289 | cmp r0, r0 | ||
290 | addx r0, r2 | ||
291 | ldi r2, #0 | ||
292 | addx r0, r2 | ||
293 | jmp r14 | ||
294 | |||
295 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
296 | |||
297 | /* | ||
298 | unsigned int csum_partial_copy_generic (const char *src, char *dst, | ||
299 | int len, int sum, int *src_err_ptr, int *dst_err_ptr) | ||
300 | */ | ||
301 | |||
302 | /* | ||
303 | * Copy from ds while checksumming, otherwise like csum_partial | ||
304 | * | ||
305 | * The macros SRC and DST specify the type of access for the instruction. | ||
306 | * thus we can call a custom exception handler for all access types. | ||
307 | * | ||
308 | * FIXME: could someone double-check whether I haven't mixed up some SRC and | ||
309 | * DST definitions? It's damn hard to trigger all cases. I hope I got | ||
310 | * them all but there's no guarantee. | ||
311 | */ | ||
312 | |||
313 | ENTRY(csum_partial_copy_generic) | ||
314 | nop | ||
315 | nop | ||
316 | nop | ||
317 | nop | ||
318 | jmp r14 | ||
319 | nop | ||
320 | nop | ||
321 | nop | ||
322 | |||
diff --git a/arch/m32r/lib/csum_partial_copy.c b/arch/m32r/lib/csum_partial_copy.c new file mode 100644 index 000000000000..c871b4606b07 --- /dev/null +++ b/arch/m32r/lib/csum_partial_copy.c | |||
@@ -0,0 +1,60 @@ | |||
1 | /* | ||
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | ||
3 | * operating system. INET is implemented using the BSD Socket | ||
4 | * interface as the means of communication with the user level. | ||
5 | * | ||
6 | * M32R specific IP/TCP/UDP checksumming routines | ||
7 | * (Some code taken from MIPS architecture) | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | * | ||
13 | * Copyright (C) 1994, 1995 Waldorf Electronics GmbH | ||
14 | * Copyright (C) 1998, 1999 Ralf Baechle | ||
15 | * Copyright (C) 2001-2005 Hiroyuki Kondo, Hirokazu Takata | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #include <linux/module.h> | ||
20 | #include <linux/types.h> | ||
21 | |||
22 | #include <net/checksum.h> | ||
23 | #include <asm/byteorder.h> | ||
24 | #include <asm/string.h> | ||
25 | #include <asm/uaccess.h> | ||
26 | |||
27 | /* | ||
28 | * Copy while checksumming, otherwise like csum_partial | ||
29 | */ | ||
30 | unsigned int | ||
31 | csum_partial_copy_nocheck (const unsigned char *src, unsigned char *dst, | ||
32 | int len, unsigned int sum) | ||
33 | { | ||
34 | sum = csum_partial(src, len, sum); | ||
35 | memcpy(dst, src, len); | ||
36 | |||
37 | return sum; | ||
38 | } | ||
39 | EXPORT_SYMBOL(csum_partial_copy_nocheck); | ||
40 | |||
41 | /* | ||
42 | * Copy from userspace and compute checksum. If we catch an exception | ||
43 | * then zero the rest of the buffer. | ||
44 | */ | ||
45 | unsigned int | ||
46 | csum_partial_copy_from_user (const unsigned char __user *src, | ||
47 | unsigned char *dst, | ||
48 | int len, unsigned int sum, int *err_ptr) | ||
49 | { | ||
50 | int missing; | ||
51 | |||
52 | missing = copy_from_user(dst, src, len); | ||
53 | if (missing) { | ||
54 | memset(dst + len - missing, 0, missing); | ||
55 | *err_ptr = -EFAULT; | ||
56 | } | ||
57 | |||
58 | return csum_partial(dst, len-missing, sum); | ||
59 | } | ||
60 | EXPORT_SYMBOL(csum_partial_copy_from_user); | ||
diff --git a/arch/m32r/lib/delay.c b/arch/m32r/lib/delay.c new file mode 100644 index 000000000000..fb29632c7eaa --- /dev/null +++ b/arch/m32r/lib/delay.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/lib/delay.c | ||
3 | * | ||
4 | * Copyright (c) 2002 Hitoshi Yamamoto, Hirokazu Takata | ||
5 | * Copyright (c) 2004 Hirokazu Takata | ||
6 | */ | ||
7 | |||
8 | /* $Id$ */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/param.h> | ||
12 | #ifdef CONFIG_SMP | ||
13 | #include <linux/sched.h> | ||
14 | #include <asm/current.h> | ||
15 | #include <asm/smp.h> | ||
16 | #endif /* CONFIG_SMP */ | ||
17 | #include <asm/processor.h> | ||
18 | |||
19 | void __delay(unsigned long loops) | ||
20 | { | ||
21 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
22 | __asm__ __volatile__ ( | ||
23 | "beqz %0, 2f \n\t" | ||
24 | "addi %0, #-1 \n\t" | ||
25 | |||
26 | " .fillinsn \n\t" | ||
27 | "1: \n\t" | ||
28 | "cmpz %0 || addi %0, #-1 \n\t" | ||
29 | "bc 2f || cmpz %0 \n\t" | ||
30 | "bc 2f || addi %0, #-1 \n\t" | ||
31 | "cmpz %0 || addi %0, #-1 \n\t" | ||
32 | "bc 2f || cmpz %0 \n\t" | ||
33 | "bnc 1b || addi %0, #-1 \n\t" | ||
34 | " .fillinsn \n\t" | ||
35 | "2: \n\t" | ||
36 | : "+r" (loops) | ||
37 | : "r" (0) | ||
38 | : "cbit" | ||
39 | ); | ||
40 | #else | ||
41 | __asm__ __volatile__ ( | ||
42 | "beqz %0, 2f \n\t" | ||
43 | " .fillinsn \n\t" | ||
44 | "1: \n\t" | ||
45 | "addi %0, #-1 \n\t" | ||
46 | "blez %0, 2f \n\t" | ||
47 | "addi %0, #-1 \n\t" | ||
48 | "blez %0, 2f \n\t" | ||
49 | "addi %0, #-1 \n\t" | ||
50 | "blez %0, 2f \n\t" | ||
51 | "addi %0, #-1 \n\t" | ||
52 | "bgtz %0, 1b \n\t" | ||
53 | " .fillinsn \n\t" | ||
54 | "2: \n\t" | ||
55 | : "+r" (loops) | ||
56 | : "r" (0) | ||
57 | ); | ||
58 | #endif | ||
59 | } | ||
60 | |||
61 | void __const_udelay(unsigned long xloops) | ||
62 | { | ||
63 | #if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2) | ||
64 | /* | ||
65 | * loops [1] = (xloops >> 32) [sec] * loops_per_jiffy [1/jiffy] | ||
66 | * * HZ [jiffy/sec] | ||
67 | * = (xloops >> 32) [sec] * (loops_per_jiffy * HZ) [1/sec] | ||
68 | * = (((xloops * loops_per_jiffy) >> 32) * HZ) [1] | ||
69 | * | ||
70 | * NOTE: | ||
71 | * - '[]' depicts variable's dimension in the above equation. | ||
72 | * - "rac" instruction rounds the accumulator in word size. | ||
73 | */ | ||
74 | __asm__ __volatile__ ( | ||
75 | "srli %0, #1 \n\t" | ||
76 | "mulwhi %0, %1 ; a0 \n\t" | ||
77 | "mulwu1 %0, %1 ; a1 \n\t" | ||
78 | "sadd ; a0 += (a1 >> 16) \n\t" | ||
79 | "rac a0, a0, #1 \n\t" | ||
80 | "mvfacmi %0, a0 \n\t" | ||
81 | : "+r" (xloops) | ||
82 | : "r" (current_cpu_data.loops_per_jiffy) | ||
83 | : "a0", "a1" | ||
84 | ); | ||
85 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||
86 | /* | ||
87 | * u64 ull; | ||
88 | * ull = (u64)xloops * (u64)current_cpu_data.loops_per_jiffy; | ||
89 | * xloops = (ull >> 32); | ||
90 | */ | ||
91 | __asm__ __volatile__ ( | ||
92 | "and3 r4, %0, #0xffff \n\t" | ||
93 | "and3 r5, %1, #0xffff \n\t" | ||
94 | "mul r4, r5 \n\t" | ||
95 | "srl3 r6, %0, #16 \n\t" | ||
96 | "srli r4, #16 \n\t" | ||
97 | "mul r5, r6 \n\t" | ||
98 | "add r4, r5 \n\t" | ||
99 | "and3 r5, %0, #0xffff \n\t" | ||
100 | "srl3 r6, %1, #16 \n\t" | ||
101 | "mul r5, r6 \n\t" | ||
102 | "add r4, r5 \n\t" | ||
103 | "srl3 r5, %0, #16 \n\t" | ||
104 | "srli r4, #16 \n\t" | ||
105 | "mul r5, r6 \n\t" | ||
106 | "add r4, r5 \n\t" | ||
107 | "mv %0, r4 \n\t" | ||
108 | : "+r" (xloops) | ||
109 | : "r" (current_cpu_data.loops_per_jiffy) | ||
110 | : "r4", "r5", "r6" | ||
111 | ); | ||
112 | #else | ||
113 | #error unknown isa configuration | ||
114 | #endif | ||
115 | __delay(xloops * HZ); | ||
116 | } | ||
117 | |||
118 | void __udelay(unsigned long usecs) | ||
119 | { | ||
120 | __const_udelay(usecs * 0x000010c7); /* 2**32 / 1000000 (rounded up) */ | ||
121 | } | ||
122 | |||
123 | void __ndelay(unsigned long nsecs) | ||
124 | { | ||
125 | __const_udelay(nsecs * 0x00005); /* 2**32 / 1000000000 (rounded up) */ | ||
126 | } | ||
diff --git a/arch/m32r/lib/getuser.S b/arch/m32r/lib/getuser.S new file mode 100644 index 000000000000..58a0db055c5c --- /dev/null +++ b/arch/m32r/lib/getuser.S | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * __get_user functions. | ||
3 | * | ||
4 | * (C) Copyright 2001 Hirokazu Takata | ||
5 | * | ||
6 | * These functions have a non-standard call interface | ||
7 | * to make them more efficient, especially as they | ||
8 | * return an error value in addition to the "real" | ||
9 | * return value. | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | |||
14 | /* | ||
15 | * __get_user_X | ||
16 | * | ||
17 | * Inputs: r0 contains the address | ||
18 | * | ||
19 | * Outputs: r0 is error code (0 or -EFAULT) | ||
20 | * r1 contains zero-extended value | ||
21 | * | ||
22 | * These functions should not modify any other registers, | ||
23 | * as they get called from within inline assembly. | ||
24 | */ | ||
25 | |||
26 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
27 | |||
28 | .text | ||
29 | .balign 4 | ||
30 | .globl __get_user_1 | ||
31 | __get_user_1: | ||
32 | 1: ldub r1, @r0 || ldi r0, #0 | ||
33 | jmp r14 | ||
34 | |||
35 | .balign 4 | ||
36 | .globl __get_user_2 | ||
37 | __get_user_2: | ||
38 | 2: lduh r1, @r0 || ldi r0, #0 | ||
39 | jmp r14 | ||
40 | |||
41 | .balign 4 | ||
42 | .globl __get_user_4 | ||
43 | __get_user_4: | ||
44 | 3: ld r1, @r0 || ldi r0, #0 | ||
45 | jmp r14 | ||
46 | |||
47 | bad_get_user: | ||
48 | ldi r1, #0 || ldi r0, #-14 | ||
49 | jmp r14 | ||
50 | |||
51 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
52 | |||
53 | .text | ||
54 | .balign 4 | ||
55 | .globl __get_user_1 | ||
56 | __get_user_1: | ||
57 | 1: ldub r1, @r0 | ||
58 | ldi r0, #0 | ||
59 | jmp r14 | ||
60 | |||
61 | .balign 4 | ||
62 | .globl __get_user_2 | ||
63 | __get_user_2: | ||
64 | 2: lduh r1, @r0 | ||
65 | ldi r0, #0 | ||
66 | jmp r14 | ||
67 | |||
68 | .balign 4 | ||
69 | .globl __get_user_4 | ||
70 | __get_user_4: | ||
71 | 3: ld r1, @r0 | ||
72 | ldi r0, #0 | ||
73 | jmp r14 | ||
74 | |||
75 | bad_get_user: | ||
76 | ldi r1, #0 | ||
77 | ldi r0, #-14 | ||
78 | jmp r14 | ||
79 | |||
80 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
81 | |||
82 | .section __ex_table,"a" | ||
83 | .long 1b,bad_get_user | ||
84 | .long 2b,bad_get_user | ||
85 | .long 3b,bad_get_user | ||
86 | .previous | ||
87 | |||
88 | .end | ||
diff --git a/arch/m32r/lib/memcpy.S b/arch/m32r/lib/memcpy.S new file mode 100644 index 000000000000..800898a2d2e3 --- /dev/null +++ b/arch/m32r/lib/memcpy.S | |||
@@ -0,0 +1,95 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/lib/memcpy.S | ||
3 | * | ||
4 | * Copyright (C) 2001 Hiroyuki Kondo, and Hirokazu Takata | ||
5 | * Copyright (C) 2004 Hirokazu Takata | ||
6 | * | ||
7 | * void *memcopy(void *dst, const void *src, int n); | ||
8 | * | ||
9 | * dst: r0 | ||
10 | * src: r1 | ||
11 | * n : r2 | ||
12 | */ | ||
13 | /* $Id$ */ | ||
14 | |||
15 | |||
16 | .text | ||
17 | #include <linux/config.h> | ||
18 | #include <linux/linkage.h> | ||
19 | #include <asm/assembler.h> | ||
20 | |||
21 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
22 | |||
23 | .text | ||
24 | ENTRY(memcpy) | ||
25 | memcopy: | ||
26 | mv r4, r0 || mv r7, r0 | ||
27 | or r7, r1 || cmpz r2 | ||
28 | jc r14 || cmpeq r0, r1 ; return if r2=0 | ||
29 | jc r14 ; return if r0=r1 | ||
30 | |||
31 | and3 r7, r7, #3 | ||
32 | bnez r7, byte_copy | ||
33 | srl3 r3, r2, #2 | ||
34 | and3 r2, r2, #3 | ||
35 | beqz r3, byte_copy | ||
36 | addi r4, #-4 | ||
37 | word_copy: | ||
38 | ld r7, @r1+ || addi r3, #-1 | ||
39 | st r7, @+r4 || cmpz r2 | ||
40 | bnez r3, word_copy | ||
41 | addi r4, #4 || jc r14 ; return if r2=0 | ||
42 | #if defined(CONFIG_ISA_M32R2) | ||
43 | byte_copy: | ||
44 | ldb r7, @r1 || addi r1, #1 | ||
45 | addi r2, #-1 || stb r7, @r4+ | ||
46 | bnez r2, byte_copy | ||
47 | #elif defined(CONFIG_ISA_M32R) | ||
48 | byte_copy: | ||
49 | ldb r7, @r1 || addi r1, #1 | ||
50 | addi r2, #-1 || stb r7, @r4 | ||
51 | addi r4, #1 | ||
52 | bnez r2, byte_copy | ||
53 | #else | ||
54 | #error unknown isa configuration | ||
55 | #endif | ||
56 | end_memcopy: | ||
57 | jmp r14 | ||
58 | |||
59 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
60 | |||
61 | .text | ||
62 | ENTRY(memcpy) | ||
63 | memcopy: | ||
64 | mv r4, r0 | ||
65 | mv r7, r0 | ||
66 | or r7, r1 | ||
67 | beq r0, r1, end_memcopy | ||
68 | beqz r2, end_memcopy | ||
69 | |||
70 | and3 r7, r7, #3 | ||
71 | bnez r7, byte_copy | ||
72 | srl3 r3, r2, #2 | ||
73 | and3 r2, r2, #3 | ||
74 | beqz r3, byte_copy | ||
75 | addi r4, #-4 | ||
76 | word_copy: | ||
77 | ld r7, @r1+ | ||
78 | addi r3, #-1 | ||
79 | st r7, @+r4 | ||
80 | bnez r3, word_copy | ||
81 | beqz r2, end_memcopy | ||
82 | addi r4, #4 | ||
83 | byte_copy: | ||
84 | ldb r7, @r1 | ||
85 | addi r1, #1 | ||
86 | addi r2, #-1 | ||
87 | stb r7, @r4 | ||
88 | addi r4, #1 | ||
89 | bnez r2, byte_copy | ||
90 | end_memcopy: | ||
91 | jmp r14 | ||
92 | |||
93 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
94 | |||
95 | .end | ||
diff --git a/arch/m32r/lib/memset.S b/arch/m32r/lib/memset.S new file mode 100644 index 000000000000..6e26df120acb --- /dev/null +++ b/arch/m32r/lib/memset.S | |||
@@ -0,0 +1,181 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/lib/memset.S | ||
3 | * | ||
4 | * Copyright (C) 2001,2002 Hiroyuki Kondo, and Hirokazu Takata | ||
5 | * Copyright (C) 2004 Hirokazu Takata | ||
6 | * | ||
7 | * void *memset(void *dst, int val, int len); | ||
8 | * | ||
9 | * dst: r0 | ||
10 | * val: r1 | ||
11 | * len: r2 | ||
12 | * ret: r0 | ||
13 | * | ||
14 | */ | ||
15 | /* $Id$ */ | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | |||
19 | .text | ||
20 | .global memset | ||
21 | |||
22 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
23 | |||
24 | .align 4 | ||
25 | memset: | ||
26 | mv r4, r0 || cmpz r2 | ||
27 | jc r14 | ||
28 | cmpui r2, #16 | ||
29 | bnc qword_align_check | ||
30 | cmpui r2, #4 | ||
31 | bc byte_set | ||
32 | word_align_check: /* len >= 4 */ | ||
33 | and3 r3, r4, #3 | ||
34 | beqz r3, word_set | ||
35 | addi r3, #-4 | ||
36 | neg r3, r3 /* r3 = -(r3 - 4) */ | ||
37 | align_word: | ||
38 | stb r1, @r4 || addi r4, #1 | ||
39 | addi r2, #-1 || addi r3, #-1 | ||
40 | bnez r3, align_word | ||
41 | cmpui r2, #4 | ||
42 | bc byte_set | ||
43 | word_set: | ||
44 | and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ | ||
45 | sll3 r3, r1, #8 | ||
46 | or r1, r3 || addi r4, #-4 | ||
47 | sll3 r3, r1, #16 | ||
48 | or r1, r3 || addi r2, #-4 | ||
49 | word_set_loop: | ||
50 | st r1, @+r4 || addi r2, #-4 | ||
51 | bgtz r2, word_set_loop | ||
52 | bnez r2, byte_set_wrap | ||
53 | st r1, @+r4 | ||
54 | jmp r14 | ||
55 | |||
56 | qword_align_check: /* len >= 16 */ | ||
57 | and3 r3, r4, #15 | ||
58 | bnez r3, word_align_check | ||
59 | qword_set: | ||
60 | and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ | ||
61 | sll3 r3, r1, #8 | ||
62 | or r1, r3 || addi r4, #-4 | ||
63 | sll3 r3, r1, #16 | ||
64 | or r1, r3 || ldi r5, #16 | ||
65 | qword_set_loop: | ||
66 | ld r3, @(4,r4) /* cache line allocate */ | ||
67 | st r1, @+r4 || addi r2, #-16 | ||
68 | st r1, @+r4 || cmpu r2, r5 | ||
69 | st r1, @+r4 | ||
70 | st r1, @+r4 | ||
71 | bnc qword_set_loop || cmpz r2 | ||
72 | jc r14 | ||
73 | set_remainder: | ||
74 | cmpui r2, #4 | ||
75 | bc byte_set_wrap1 | ||
76 | addi r2, #-4 | ||
77 | bra word_set_loop | ||
78 | |||
79 | byte_set_wrap: | ||
80 | addi r2, #4 | ||
81 | cmpz r2 | ||
82 | jc r14 | ||
83 | byte_set_wrap1: | ||
84 | addi r4, #4 | ||
85 | #if defined(CONFIG_ISA_M32R2) | ||
86 | byte_set: | ||
87 | addi r2, #-1 || stb r1, @r4+ | ||
88 | bnez r2, byte_set | ||
89 | #elif defined(CONFIG_ISA_M32R) | ||
90 | byte_set: | ||
91 | addi r2, #-1 || stb r1, @r4 | ||
92 | addi r4, #1 | ||
93 | bnez r2, byte_set | ||
94 | #else | ||
95 | #error unknown isa configuration | ||
96 | #endif | ||
97 | end_memset: | ||
98 | jmp r14 | ||
99 | |||
100 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
101 | |||
102 | .align 4 | ||
103 | memset: | ||
104 | mv r4, r0 | ||
105 | beqz r2, end_memset | ||
106 | cmpui r2, #16 | ||
107 | bnc qword_align_check | ||
108 | cmpui r2, #4 | ||
109 | bc byte_set | ||
110 | word_align_check: /* len >= 4 */ | ||
111 | and3 r3, r4, #3 | ||
112 | beqz r3, word_set | ||
113 | addi r3, #-4 | ||
114 | neg r3, r3 /* r3 = -(r3 - 4) */ | ||
115 | align_word: | ||
116 | stb r1, @r4 | ||
117 | addi r4, #1 | ||
118 | addi r2, #-1 | ||
119 | addi r3, #-1 | ||
120 | bnez r3, align_word | ||
121 | cmpui r2, #4 | ||
122 | bc byte_set | ||
123 | word_set: | ||
124 | and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ | ||
125 | sll3 r3, r1, #8 | ||
126 | or r1, r3 | ||
127 | sll3 r3, r1, #16 | ||
128 | or r1, r3 | ||
129 | addi r2, #-4 | ||
130 | addi r4, #-4 | ||
131 | word_set_loop: | ||
132 | st r1, @+r4 | ||
133 | addi r2, #-4 | ||
134 | bgtz r2, word_set_loop | ||
135 | bnez r2, byte_set_wrap | ||
136 | st r1, @+r4 | ||
137 | jmp r14 | ||
138 | |||
139 | qword_align_check: /* len >= 16 */ | ||
140 | and3 r3, r4, #15 | ||
141 | bnez r3, word_align_check | ||
142 | qword_set: | ||
143 | and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */ | ||
144 | sll3 r3, r1, #8 | ||
145 | or r1, r3 | ||
146 | sll3 r3, r1, #16 | ||
147 | or r1, r3 | ||
148 | addi r4, #-4 | ||
149 | qword_set_loop: | ||
150 | ld r3, @(4,r4) /* cache line allocate */ | ||
151 | addi r2, #-16 | ||
152 | st r1, @+r4 | ||
153 | st r1, @+r4 | ||
154 | cmpui r2, #16 | ||
155 | st r1, @+r4 | ||
156 | st r1, @+r4 | ||
157 | bnc qword_set_loop | ||
158 | bnez r2, set_remainder | ||
159 | jmp r14 | ||
160 | set_remainder: | ||
161 | cmpui r2, #4 | ||
162 | bc byte_set_wrap1 | ||
163 | addi r2, #-4 | ||
164 | bra word_set_loop | ||
165 | |||
166 | byte_set_wrap: | ||
167 | addi r2, #4 | ||
168 | beqz r2, end_memset | ||
169 | byte_set_wrap1: | ||
170 | addi r4, #4 | ||
171 | byte_set: | ||
172 | addi r2, #-1 | ||
173 | stb r1, @r4 | ||
174 | addi r4, #1 | ||
175 | bnez r2, byte_set | ||
176 | end_memset: | ||
177 | jmp r14 | ||
178 | |||
179 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
180 | |||
181 | .end | ||
diff --git a/arch/m32r/lib/putuser.S b/arch/m32r/lib/putuser.S new file mode 100644 index 000000000000..218154cc3890 --- /dev/null +++ b/arch/m32r/lib/putuser.S | |||
@@ -0,0 +1,84 @@ | |||
1 | /* | ||
2 | * __put_user functions. | ||
3 | * | ||
4 | * (C) Copyright 1998 Linus Torvalds | ||
5 | * (C) Copyright 2001 Hirokazu Takata | ||
6 | * | ||
7 | * These functions have a non-standard call interface | ||
8 | * to make them more efficient. | ||
9 | */ | ||
10 | |||
11 | #include <linux/config.h> | ||
12 | |||
13 | /* | ||
14 | * __put_user_X | ||
15 | * | ||
16 | * Inputs: r0 contains the address | ||
17 | * r1 contains the value | ||
18 | * | ||
19 | * Outputs: r0 is error code (0 or -EFAULT) | ||
20 | * r1 is corrupted (will contain "current_task"). | ||
21 | * | ||
22 | * These functions should not modify any other registers, | ||
23 | * as they get called from within inline assembly. | ||
24 | */ | ||
25 | |||
26 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
27 | |||
28 | .text | ||
29 | .balign 4 | ||
30 | .globl __put_user_1 | ||
31 | __put_user_1: | ||
32 | 1: stb r1, @r0 || ldi r0, #0 | ||
33 | jmp r14 | ||
34 | |||
35 | .balign 4 | ||
36 | .globl __put_user_2 | ||
37 | __put_user_2: | ||
38 | 2: sth r1, @r0 || ldi r0, #0 | ||
39 | jmp r14 | ||
40 | |||
41 | .balign 4 | ||
42 | .globl __put_user_4 | ||
43 | __put_user_4: | ||
44 | 3: st r1, @r0 || ldi r0, #0 | ||
45 | jmp r14 | ||
46 | |||
47 | bad_put_user: | ||
48 | ldi r0, #-14 || jmp r14 | ||
49 | |||
50 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
51 | |||
52 | .text | ||
53 | .balign 4 | ||
54 | .globl __put_user_1 | ||
55 | __put_user_1: | ||
56 | 1: stb r1, @r0 | ||
57 | ldi r0, #0 | ||
58 | jmp r14 | ||
59 | |||
60 | .balign 4 | ||
61 | .globl __put_user_2 | ||
62 | __put_user_2: | ||
63 | 2: sth r1, @r0 | ||
64 | ldi r0, #0 | ||
65 | jmp r14 | ||
66 | |||
67 | .balign 4 | ||
68 | .globl __put_user_4 | ||
69 | __put_user_4: | ||
70 | 3: st r1, @r0 | ||
71 | ldi r0, #0 | ||
72 | jmp r14 | ||
73 | |||
74 | bad_put_user: | ||
75 | ldi r0, #-14 | ||
76 | jmp r14 | ||
77 | |||
78 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
79 | |||
80 | .section __ex_table,"a" | ||
81 | .long 1b,bad_put_user | ||
82 | .long 2b,bad_put_user | ||
83 | .long 3b,bad_put_user | ||
84 | .previous | ||
diff --git a/arch/m32r/lib/strlen.S b/arch/m32r/lib/strlen.S new file mode 100644 index 000000000000..8d23cfbd600c --- /dev/null +++ b/arch/m32r/lib/strlen.S | |||
@@ -0,0 +1,120 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/strlen.S -- strlen code. | ||
3 | * | ||
4 | * Copyright (C) 2001 Hirokazu Takata | ||
5 | * | ||
6 | * size_t strlen(const char *s); | ||
7 | * | ||
8 | */ | ||
9 | /* $Id$ */ | ||
10 | |||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/linkage.h> | ||
14 | #include <asm/assembler.h> | ||
15 | |||
16 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
17 | |||
18 | .text | ||
19 | ENTRY(strlen) | ||
20 | mv r6, r0 || ldi r2, #0 | ||
21 | and3 r0, r0, #3 | ||
22 | bnez r0, strlen_byte | ||
23 | ; | ||
24 | strlen_word: | ||
25 | ld r0, @r6+ | ||
26 | ; | ||
27 | seth r5, #high(0x01010101) | ||
28 | or3 r5, r5, #low(0x01010101) | ||
29 | sll3 r7, r5, #7 | ||
30 | strlen_word_loop: | ||
31 | ld r1, @r6+ || not r4, r0 | ||
32 | sub r0, r5 || and r4, r7 | ||
33 | and r4, r0 | ||
34 | bnez r4, strlen_last_bytes | ||
35 | ld r0, @r6+ || not r4, r1 | ||
36 | sub r1, r5 || and r4, r7 | ||
37 | and r4, r1 || addi r2, #4 | ||
38 | bnez r4, strlen_last_bytes | ||
39 | addi r2, #4 || bra.s strlen_word_loop | ||
40 | |||
41 | ; NOTE: If a null char. exists, return 0. | ||
42 | ; if ((x - 0x01010101) & ~x & 0x80808080) | ||
43 | ; return 0; | ||
44 | ; | ||
45 | strlen_byte: | ||
46 | ldb r1, @r6 || addi r6, #1 | ||
47 | beqz r1, strlen_exit | ||
48 | addi r2, #1 || bra.s strlen_byte | ||
49 | ; | ||
50 | strlen_last_bytes: | ||
51 | ldi r0, #4 || addi r6, #-8 | ||
52 | ; | ||
53 | strlen_byte_loop: | ||
54 | ldb r1, @r6 || addi r6, #1 | ||
55 | addi r0, #-1 || cmpz r1 | ||
56 | bc.s strlen_exit || cmpz r0 | ||
57 | addi r2, #1 || bnc.s strlen_byte_loop | ||
58 | ; | ||
59 | strlen_exit: | ||
60 | mv r0, r2 || jmp r14 | ||
61 | |||
62 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
63 | |||
64 | .text | ||
65 | ENTRY(strlen) | ||
66 | mv r6, r0 | ||
67 | ldi r2, #0 | ||
68 | and3 r0, r0, #3 | ||
69 | bnez r0, strlen_byte | ||
70 | ; | ||
71 | strlen_word: | ||
72 | ld r0, @r6+ | ||
73 | ; | ||
74 | seth r5, #high(0x01010101) | ||
75 | or3 r5, r5, #low(0x01010101) | ||
76 | sll3 r7, r5, #7 | ||
77 | strlen_word_loop: | ||
78 | ld r1, @r6+ | ||
79 | not r4, r0 ; NOTE: If a null char. exists, return 0. | ||
80 | sub r0, r5 ; if ((x - 0x01010101) & ~x & 0x80808080) | ||
81 | and r4, r7 ; return 0; | ||
82 | and r4, r0 | ||
83 | bnez r4, strlen_last_bytes | ||
84 | addi r2, #4 | ||
85 | ; | ||
86 | ld r0, @r6+ | ||
87 | not r4, r1 ; NOTE: If a null char. exists, return 0. | ||
88 | sub r1, r5 ; if ((x - 0x01010101) & ~x & 0x80808080) | ||
89 | and r4, r7 ; return 0; | ||
90 | and r4, r1 | ||
91 | bnez r4, strlen_last_bytes | ||
92 | addi r2, #4 | ||
93 | bra strlen_word_loop | ||
94 | ; | ||
95 | strlen_byte: | ||
96 | ldb r1, @r6 | ||
97 | addi r6, #1 | ||
98 | beqz r1, strlen_exit | ||
99 | addi r2, #1 | ||
100 | bra strlen_byte | ||
101 | ; | ||
102 | strlen_last_bytes: | ||
103 | ldi r0, #4 | ||
104 | addi r6, #-8 | ||
105 | ; | ||
106 | strlen_byte_loop: | ||
107 | ldb r1, @r6 | ||
108 | addi r6, #1 | ||
109 | addi r0, #-1 | ||
110 | beqz r1, strlen_exit | ||
111 | addi r2, #1 | ||
112 | bnez r0, strlen_byte_loop | ||
113 | ; | ||
114 | strlen_exit: | ||
115 | mv r0, r2 | ||
116 | jmp r14 | ||
117 | |||
118 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
119 | |||
120 | .end | ||
diff --git a/arch/m32r/lib/usercopy.c b/arch/m32r/lib/usercopy.c new file mode 100644 index 000000000000..6c6855f1aa05 --- /dev/null +++ b/arch/m32r/lib/usercopy.c | |||
@@ -0,0 +1,391 @@ | |||
1 | /* | ||
2 | * User address space access functions. | ||
3 | * The non inlined parts of asm-m32r/uaccess.h are here. | ||
4 | * | ||
5 | * Copyright 1997 Andi Kleen <ak@muc.de> | ||
6 | * Copyright 1997 Linus Torvalds | ||
7 | * Copyright 2001, 2002, 2004 Hirokazu Takata | ||
8 | */ | ||
9 | #include <linux/config.h> | ||
10 | #include <linux/prefetch.h> | ||
11 | #include <linux/string.h> | ||
12 | #include <linux/thread_info.h> | ||
13 | #include <asm/uaccess.h> | ||
14 | |||
15 | unsigned long | ||
16 | __generic_copy_to_user(void *to, const void *from, unsigned long n) | ||
17 | { | ||
18 | prefetch(from); | ||
19 | if (access_ok(VERIFY_WRITE, to, n)) | ||
20 | __copy_user(to,from,n); | ||
21 | return n; | ||
22 | } | ||
23 | |||
24 | unsigned long | ||
25 | __generic_copy_from_user(void *to, const void *from, unsigned long n) | ||
26 | { | ||
27 | prefetchw(to); | ||
28 | if (access_ok(VERIFY_READ, from, n)) | ||
29 | __copy_user_zeroing(to,from,n); | ||
30 | else | ||
31 | memset(to, 0, n); | ||
32 | return n; | ||
33 | } | ||
34 | |||
35 | |||
36 | /* | ||
37 | * Copy a null terminated string from userspace. | ||
38 | */ | ||
39 | |||
40 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
41 | |||
42 | #define __do_strncpy_from_user(dst,src,count,res) \ | ||
43 | do { \ | ||
44 | int __d0, __d1, __d2; \ | ||
45 | __asm__ __volatile__( \ | ||
46 | " beqz %1, 2f\n" \ | ||
47 | " .fillinsn\n" \ | ||
48 | "0: ldb r14, @%3 || addi %3, #1\n" \ | ||
49 | " stb r14, @%4 || addi %4, #1\n" \ | ||
50 | " beqz r14, 1f\n" \ | ||
51 | " addi %1, #-1\n" \ | ||
52 | " bnez %1, 0b\n" \ | ||
53 | " .fillinsn\n" \ | ||
54 | "1: sub %0, %1\n" \ | ||
55 | " .fillinsn\n" \ | ||
56 | "2:\n" \ | ||
57 | ".section .fixup,\"ax\"\n" \ | ||
58 | " .balign 4\n" \ | ||
59 | "3: seth r14, #high(2b)\n" \ | ||
60 | " or3 r14, r14, #low(2b)\n" \ | ||
61 | " jmp r14 || ldi %0, #%5\n" \ | ||
62 | ".previous\n" \ | ||
63 | ".section __ex_table,\"a\"\n" \ | ||
64 | " .balign 4\n" \ | ||
65 | " .long 0b,3b\n" \ | ||
66 | ".previous" \ | ||
67 | : "=r"(res), "=r"(count), "=&r" (__d0), "=&r" (__d1), \ | ||
68 | "=&r" (__d2) \ | ||
69 | : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ | ||
70 | "4"(dst) \ | ||
71 | : "r14", "cbit", "memory"); \ | ||
72 | } while (0) | ||
73 | |||
74 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
75 | |||
76 | #define __do_strncpy_from_user(dst,src,count,res) \ | ||
77 | do { \ | ||
78 | int __d0, __d1, __d2; \ | ||
79 | __asm__ __volatile__( \ | ||
80 | " beqz %1, 2f\n" \ | ||
81 | " .fillinsn\n" \ | ||
82 | "0: ldb r14, @%3\n" \ | ||
83 | " stb r14, @%4\n" \ | ||
84 | " addi %3, #1\n" \ | ||
85 | " addi %4, #1\n" \ | ||
86 | " beqz r14, 1f\n" \ | ||
87 | " addi %1, #-1\n" \ | ||
88 | " bnez %1, 0b\n" \ | ||
89 | " .fillinsn\n" \ | ||
90 | "1: sub %0, %1\n" \ | ||
91 | " .fillinsn\n" \ | ||
92 | "2:\n" \ | ||
93 | ".section .fixup,\"ax\"\n" \ | ||
94 | " .balign 4\n" \ | ||
95 | "3: ldi %0, #%5\n" \ | ||
96 | " seth r14, #high(2b)\n" \ | ||
97 | " or3 r14, r14, #low(2b)\n" \ | ||
98 | " jmp r14\n" \ | ||
99 | ".previous\n" \ | ||
100 | ".section __ex_table,\"a\"\n" \ | ||
101 | " .balign 4\n" \ | ||
102 | " .long 0b,3b\n" \ | ||
103 | ".previous" \ | ||
104 | : "=r"(res), "=r"(count), "=&r" (__d0), "=&r" (__d1), \ | ||
105 | "=&r" (__d2) \ | ||
106 | : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), \ | ||
107 | "4"(dst) \ | ||
108 | : "r14", "cbit", "memory"); \ | ||
109 | } while (0) | ||
110 | |||
111 | #endif /* CONFIG_ISA_DUAL_ISSUE */ | ||
112 | |||
113 | long | ||
114 | __strncpy_from_user(char *dst, const char *src, long count) | ||
115 | { | ||
116 | long res; | ||
117 | __do_strncpy_from_user(dst, src, count, res); | ||
118 | return res; | ||
119 | } | ||
120 | |||
121 | long | ||
122 | strncpy_from_user(char *dst, const char *src, long count) | ||
123 | { | ||
124 | long res = -EFAULT; | ||
125 | if (access_ok(VERIFY_READ, src, 1)) | ||
126 | __do_strncpy_from_user(dst, src, count, res); | ||
127 | return res; | ||
128 | } | ||
129 | |||
130 | |||
131 | /* | ||
132 | * Zero Userspace | ||
133 | */ | ||
134 | |||
135 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
136 | |||
137 | #define __do_clear_user(addr,size) \ | ||
138 | do { \ | ||
139 | int __dst, __c; \ | ||
140 | __asm__ __volatile__( \ | ||
141 | " beqz %1, 9f\n" \ | ||
142 | " and3 r14, %0, #3\n" \ | ||
143 | " bnez r14, 2f\n" \ | ||
144 | " and3 r14, %1, #3\n" \ | ||
145 | " bnez r14, 2f\n" \ | ||
146 | " and3 %1, %1, #3\n" \ | ||
147 | " beqz %2, 2f\n" \ | ||
148 | " addi %0, #-4\n" \ | ||
149 | " .fillinsn\n" \ | ||
150 | "0: ; word clear \n" \ | ||
151 | " st %6, @+%0 || addi %2, #-1\n" \ | ||
152 | " bnez %2, 0b\n" \ | ||
153 | " beqz %1, 9f\n" \ | ||
154 | " .fillinsn\n" \ | ||
155 | "2: ; byte clear \n" \ | ||
156 | " stb %6, @%0 || addi %1, #-1\n" \ | ||
157 | " addi %0, #1\n" \ | ||
158 | " bnez %1, 2b\n" \ | ||
159 | " .fillinsn\n" \ | ||
160 | "9:\n" \ | ||
161 | ".section .fixup,\"ax\"\n" \ | ||
162 | " .balign 4\n" \ | ||
163 | "4: slli %2, #2\n" \ | ||
164 | " seth r14, #high(9b)\n" \ | ||
165 | " or3 r14, r14, #low(9b)\n" \ | ||
166 | " jmp r14 || add %1, %2\n" \ | ||
167 | ".previous\n" \ | ||
168 | ".section __ex_table,\"a\"\n" \ | ||
169 | " .balign 4\n" \ | ||
170 | " .long 0b,4b\n" \ | ||
171 | " .long 2b,9b\n" \ | ||
172 | ".previous\n" \ | ||
173 | : "=&r"(__dst), "=&r"(size), "=&r"(__c) \ | ||
174 | : "0"(addr), "1"(size), "2"(size / 4), "r"(0) \ | ||
175 | : "r14", "cbit", "memory"); \ | ||
176 | } while (0) | ||
177 | |||
178 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
179 | |||
180 | #define __do_clear_user(addr,size) \ | ||
181 | do { \ | ||
182 | int __dst, __c; \ | ||
183 | __asm__ __volatile__( \ | ||
184 | " beqz %1, 9f\n" \ | ||
185 | " and3 r14, %0, #3\n" \ | ||
186 | " bnez r14, 2f\n" \ | ||
187 | " and3 r14, %1, #3\n" \ | ||
188 | " bnez r14, 2f\n" \ | ||
189 | " and3 %1, %1, #3\n" \ | ||
190 | " beqz %2, 2f\n" \ | ||
191 | " addi %0, #-4\n" \ | ||
192 | " .fillinsn\n" \ | ||
193 | "0: st %6, @+%0 ; word clear \n" \ | ||
194 | " addi %2, #-1\n" \ | ||
195 | " bnez %2, 0b\n" \ | ||
196 | " beqz %1, 9f\n" \ | ||
197 | " .fillinsn\n" \ | ||
198 | "2: stb %6, @%0 ; byte clear \n" \ | ||
199 | " addi %1, #-1\n" \ | ||
200 | " addi %0, #1\n" \ | ||
201 | " bnez %1, 2b\n" \ | ||
202 | " .fillinsn\n" \ | ||
203 | "9:\n" \ | ||
204 | ".section .fixup,\"ax\"\n" \ | ||
205 | " .balign 4\n" \ | ||
206 | "4: slli %2, #2\n" \ | ||
207 | " add %1, %2\n" \ | ||
208 | " seth r14, #high(9b)\n" \ | ||
209 | " or3 r14, r14, #low(9b)\n" \ | ||
210 | " jmp r14\n" \ | ||
211 | ".previous\n" \ | ||
212 | ".section __ex_table,\"a\"\n" \ | ||
213 | " .balign 4\n" \ | ||
214 | " .long 0b,4b\n" \ | ||
215 | " .long 2b,9b\n" \ | ||
216 | ".previous\n" \ | ||
217 | : "=&r"(__dst), "=&r"(size), "=&r"(__c) \ | ||
218 | : "0"(addr), "1"(size), "2"(size / 4), "r"(0) \ | ||
219 | : "r14", "cbit", "memory"); \ | ||
220 | } while (0) | ||
221 | |||
222 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
223 | |||
224 | unsigned long | ||
225 | clear_user(void *to, unsigned long n) | ||
226 | { | ||
227 | if (access_ok(VERIFY_WRITE, to, n)) | ||
228 | __do_clear_user(to, n); | ||
229 | return n; | ||
230 | } | ||
231 | |||
232 | unsigned long | ||
233 | __clear_user(void *to, unsigned long n) | ||
234 | { | ||
235 | __do_clear_user(to, n); | ||
236 | return n; | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * Return the size of a string (including the ending 0) | ||
241 | * | ||
242 | * Return 0 on exception, a value greater than N if too long | ||
243 | */ | ||
244 | |||
245 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
246 | |||
247 | long strnlen_user(const char *s, long n) | ||
248 | { | ||
249 | unsigned long mask = -__addr_ok(s); | ||
250 | unsigned long res; | ||
251 | |||
252 | __asm__ __volatile__( | ||
253 | " and %0, %5 || mv r1, %1\n" | ||
254 | " beqz %0, strnlen_exit\n" | ||
255 | " and3 r0, %1, #3\n" | ||
256 | " bnez r0, strnlen_byte_loop\n" | ||
257 | " cmpui %0, #4\n" | ||
258 | " bc strnlen_byte_loop\n" | ||
259 | "strnlen_word_loop:\n" | ||
260 | "0: ld r0, @%1+\n" | ||
261 | " pcmpbz r0\n" | ||
262 | " bc strnlen_last_bytes_fixup\n" | ||
263 | " addi %0, #-4\n" | ||
264 | " beqz %0, strnlen_exit\n" | ||
265 | " bgtz %0, strnlen_word_loop\n" | ||
266 | "strnlen_last_bytes:\n" | ||
267 | " mv %0, %4\n" | ||
268 | "strnlen_last_bytes_fixup:\n" | ||
269 | " addi %1, #-4\n" | ||
270 | "strnlen_byte_loop:\n" | ||
271 | "1: ldb r0, @%1 || addi %0, #-1\n" | ||
272 | " beqz r0, strnlen_exit\n" | ||
273 | " addi %1, #1\n" | ||
274 | " bnez %0, strnlen_byte_loop\n" | ||
275 | "strnlen_exit:\n" | ||
276 | " sub %1, r1\n" | ||
277 | " add3 %0, %1, #1\n" | ||
278 | " .fillinsn\n" | ||
279 | "9:\n" | ||
280 | ".section .fixup,\"ax\"\n" | ||
281 | " .balign 4\n" | ||
282 | "4: addi %1, #-4\n" | ||
283 | " .fillinsn\n" | ||
284 | "5: seth r1, #high(9b)\n" | ||
285 | " or3 r1, r1, #low(9b)\n" | ||
286 | " jmp r1 || ldi %0, #0\n" | ||
287 | ".previous\n" | ||
288 | ".section __ex_table,\"a\"\n" | ||
289 | " .balign 4\n" | ||
290 | " .long 0b,4b\n" | ||
291 | " .long 1b,5b\n" | ||
292 | ".previous" | ||
293 | : "=&r" (res), "=r" (s) | ||
294 | : "0" (n), "1" (s), "r" (n & 3), "r" (mask), "r"(0x01010101) | ||
295 | : "r0", "r1", "cbit"); | ||
296 | |||
297 | /* NOTE: strnlen_user() algorism: | ||
298 | * { | ||
299 | * char *p; | ||
300 | * for (p = s; n-- && *p != '\0'; ++p) | ||
301 | * ; | ||
302 | * return p - s + 1; | ||
303 | * } | ||
304 | */ | ||
305 | |||
306 | /* NOTE: If a null char. exists, return 0. | ||
307 | * if ((x - 0x01010101) & ~x & 0x80808080)\n" | ||
308 | * return 0;\n" | ||
309 | */ | ||
310 | |||
311 | return res & mask; | ||
312 | } | ||
313 | |||
314 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
315 | |||
316 | long strnlen_user(const char *s, long n) | ||
317 | { | ||
318 | unsigned long mask = -__addr_ok(s); | ||
319 | unsigned long res; | ||
320 | |||
321 | __asm__ __volatile__( | ||
322 | " and %0, %5\n" | ||
323 | " mv r1, %1\n" | ||
324 | " beqz %0, strnlen_exit\n" | ||
325 | " and3 r0, %1, #3\n" | ||
326 | " bnez r0, strnlen_byte_loop\n" | ||
327 | " cmpui %0, #4\n" | ||
328 | " bc strnlen_byte_loop\n" | ||
329 | " sll3 r3, %6, #7\n" | ||
330 | "strnlen_word_loop:\n" | ||
331 | "0: ld r0, @%1+\n" | ||
332 | " not r2, r0\n" | ||
333 | " sub r0, %6\n" | ||
334 | " and r2, r3\n" | ||
335 | " and r2, r0\n" | ||
336 | " bnez r2, strnlen_last_bytes_fixup\n" | ||
337 | " addi %0, #-4\n" | ||
338 | " beqz %0, strnlen_exit\n" | ||
339 | " bgtz %0, strnlen_word_loop\n" | ||
340 | "strnlen_last_bytes:\n" | ||
341 | " mv %0, %4\n" | ||
342 | "strnlen_last_bytes_fixup:\n" | ||
343 | " addi %1, #-4\n" | ||
344 | "strnlen_byte_loop:\n" | ||
345 | "1: ldb r0, @%1\n" | ||
346 | " addi %0, #-1\n" | ||
347 | " beqz r0, strnlen_exit\n" | ||
348 | " addi %1, #1\n" | ||
349 | " bnez %0, strnlen_byte_loop\n" | ||
350 | "strnlen_exit:\n" | ||
351 | " sub %1, r1\n" | ||
352 | " add3 %0, %1, #1\n" | ||
353 | " .fillinsn\n" | ||
354 | "9:\n" | ||
355 | ".section .fixup,\"ax\"\n" | ||
356 | " .balign 4\n" | ||
357 | "4: addi %1, #-4\n" | ||
358 | " .fillinsn\n" | ||
359 | "5: ldi %0, #0\n" | ||
360 | " seth r1, #high(9b)\n" | ||
361 | " or3 r1, r1, #low(9b)\n" | ||
362 | " jmp r1\n" | ||
363 | ".previous\n" | ||
364 | ".section __ex_table,\"a\"\n" | ||
365 | " .balign 4\n" | ||
366 | " .long 0b,4b\n" | ||
367 | " .long 1b,5b\n" | ||
368 | ".previous" | ||
369 | : "=&r" (res), "=r" (s) | ||
370 | : "0" (n), "1" (s), "r" (n & 3), "r" (mask), "r"(0x01010101) | ||
371 | : "r0", "r1", "r2", "r3", "cbit"); | ||
372 | |||
373 | /* NOTE: strnlen_user() algorism: | ||
374 | * { | ||
375 | * char *p; | ||
376 | * for (p = s; n-- && *p != '\0'; ++p) | ||
377 | * ; | ||
378 | * return p - s + 1; | ||
379 | * } | ||
380 | */ | ||
381 | |||
382 | /* NOTE: If a null char. exists, return 0. | ||
383 | * if ((x - 0x01010101) & ~x & 0x80808080)\n" | ||
384 | * return 0;\n" | ||
385 | */ | ||
386 | |||
387 | return res & mask; | ||
388 | } | ||
389 | |||
390 | #endif /* CONFIG_ISA_DUAL_ISSUE */ | ||
391 | |||
diff --git a/arch/m32r/m32700ut/defconfig.m32700ut.smp b/arch/m32r/m32700ut/defconfig.m32700ut.smp new file mode 100644 index 000000000000..1c002181df7f --- /dev/null +++ b/arch/m32r/m32700ut/defconfig.m32700ut.smp | |||
@@ -0,0 +1,750 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:10:50 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | CONFIG_CLEAN_COMPILE=y | ||
17 | CONFIG_LOCK_KERNEL=y | ||
18 | |||
19 | # | ||
20 | # General setup | ||
21 | # | ||
22 | CONFIG_LOCALVERSION="" | ||
23 | CONFIG_SWAP=y | ||
24 | CONFIG_SYSVIPC=y | ||
25 | # CONFIG_POSIX_MQUEUE is not set | ||
26 | CONFIG_BSD_PROCESS_ACCT=y | ||
27 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
28 | CONFIG_SYSCTL=y | ||
29 | # CONFIG_AUDIT is not set | ||
30 | CONFIG_LOG_BUF_SHIFT=15 | ||
31 | CONFIG_HOTPLUG=y | ||
32 | CONFIG_KOBJECT_UEVENT=y | ||
33 | CONFIG_IKCONFIG=y | ||
34 | # CONFIG_IKCONFIG_PROC is not set | ||
35 | CONFIG_EMBEDDED=y | ||
36 | # CONFIG_KALLSYMS is not set | ||
37 | # CONFIG_FUTEX is not set | ||
38 | # CONFIG_EPOLL is not set | ||
39 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
40 | CONFIG_SHMEM=y | ||
41 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
42 | CONFIG_CC_ALIGN_LABELS=0 | ||
43 | CONFIG_CC_ALIGN_LOOPS=0 | ||
44 | CONFIG_CC_ALIGN_JUMPS=0 | ||
45 | # CONFIG_TINY_SHMEM is not set | ||
46 | |||
47 | # | ||
48 | # Loadable module support | ||
49 | # | ||
50 | CONFIG_MODULES=y | ||
51 | CONFIG_MODULE_UNLOAD=y | ||
52 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
53 | CONFIG_OBSOLETE_MODPARM=y | ||
54 | # CONFIG_MODVERSIONS is not set | ||
55 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
56 | CONFIG_KMOD=y | ||
57 | CONFIG_STOP_MACHINE=y | ||
58 | |||
59 | # | ||
60 | # Processor type and features | ||
61 | # | ||
62 | # CONFIG_PLAT_MAPPI is not set | ||
63 | # CONFIG_PLAT_USRV is not set | ||
64 | CONFIG_PLAT_M32700UT=y | ||
65 | # CONFIG_PLAT_OPSPUT is not set | ||
66 | # CONFIG_PLAT_OAKS32R is not set | ||
67 | # CONFIG_PLAT_MAPPI2 is not set | ||
68 | CONFIG_CHIP_M32700=y | ||
69 | # CONFIG_CHIP_M32102 is not set | ||
70 | # CONFIG_CHIP_VDEC2 is not set | ||
71 | # CONFIG_CHIP_OPSP is not set | ||
72 | CONFIG_MMU=y | ||
73 | CONFIG_TLB_ENTRIES=32 | ||
74 | CONFIG_ISA_M32R2=y | ||
75 | CONFIG_ISA_DSP_LEVEL2=y | ||
76 | CONFIG_ISA_DUAL_ISSUE=y | ||
77 | CONFIG_BUS_CLOCK=50000000 | ||
78 | CONFIG_TIMER_DIVIDE=128 | ||
79 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
80 | CONFIG_MEMORY_START=0x08000000 | ||
81 | CONFIG_MEMORY_SIZE=0x01000000 | ||
82 | CONFIG_NOHIGHMEM=y | ||
83 | # CONFIG_DISCONTIGMEM is not set | ||
84 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
85 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
86 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
87 | CONFIG_PREEMPT=y | ||
88 | # CONFIG_HAVE_DEC_LOCK is not set | ||
89 | CONFIG_SMP=y | ||
90 | CONFIG_CHIP_M32700_TS1=y | ||
91 | CONFIG_NR_CPUS=2 | ||
92 | # CONFIG_NUMA is not set | ||
93 | |||
94 | # | ||
95 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
96 | # | ||
97 | # CONFIG_PCI is not set | ||
98 | # CONFIG_ISA is not set | ||
99 | |||
100 | # | ||
101 | # PCCARD (PCMCIA/CardBus) support | ||
102 | # | ||
103 | CONFIG_PCCARD=y | ||
104 | # CONFIG_PCMCIA_DEBUG is not set | ||
105 | CONFIG_PCMCIA=y | ||
106 | |||
107 | # | ||
108 | # PC-card bridges | ||
109 | # | ||
110 | # CONFIG_TCIC is not set | ||
111 | # CONFIG_M32R_PCC is not set | ||
112 | CONFIG_M32R_CFC=y | ||
113 | CONFIG_M32R_CFC_NUM=1 | ||
114 | |||
115 | # | ||
116 | # PCI Hotplug Support | ||
117 | # | ||
118 | |||
119 | # | ||
120 | # Executable file formats | ||
121 | # | ||
122 | CONFIG_BINFMT_ELF=y | ||
123 | # CONFIG_BINFMT_MISC is not set | ||
124 | |||
125 | # | ||
126 | # Device Drivers | ||
127 | # | ||
128 | |||
129 | # | ||
130 | # Generic Driver Options | ||
131 | # | ||
132 | CONFIG_STANDALONE=y | ||
133 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
134 | # CONFIG_FW_LOADER is not set | ||
135 | |||
136 | # | ||
137 | # Memory Technology Devices (MTD) | ||
138 | # | ||
139 | # CONFIG_MTD is not set | ||
140 | |||
141 | # | ||
142 | # Parallel port support | ||
143 | # | ||
144 | # CONFIG_PARPORT is not set | ||
145 | |||
146 | # | ||
147 | # Plug and Play support | ||
148 | # | ||
149 | |||
150 | # | ||
151 | # Block devices | ||
152 | # | ||
153 | # CONFIG_BLK_DEV_FD is not set | ||
154 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
155 | CONFIG_BLK_DEV_LOOP=y | ||
156 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
157 | CONFIG_BLK_DEV_NBD=y | ||
158 | CONFIG_BLK_DEV_RAM=y | ||
159 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
160 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
161 | # CONFIG_BLK_DEV_INITRD is not set | ||
162 | CONFIG_INITRAMFS_SOURCE="" | ||
163 | # CONFIG_CDROM_PKTCDVD is not set | ||
164 | |||
165 | # | ||
166 | # IO Schedulers | ||
167 | # | ||
168 | CONFIG_IOSCHED_NOOP=y | ||
169 | # CONFIG_IOSCHED_AS is not set | ||
170 | CONFIG_IOSCHED_DEADLINE=y | ||
171 | CONFIG_IOSCHED_CFQ=y | ||
172 | # CONFIG_ATA_OVER_ETH is not set | ||
173 | |||
174 | # | ||
175 | # ATA/ATAPI/MFM/RLL support | ||
176 | # | ||
177 | CONFIG_IDE=y | ||
178 | CONFIG_BLK_DEV_IDE=y | ||
179 | |||
180 | # | ||
181 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
182 | # | ||
183 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
184 | CONFIG_BLK_DEV_IDEDISK=y | ||
185 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
186 | CONFIG_BLK_DEV_IDECS=y | ||
187 | CONFIG_BLK_DEV_IDECD=m | ||
188 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
189 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
190 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
191 | # CONFIG_IDE_TASK_IOCTL is not set | ||
192 | |||
193 | # | ||
194 | # IDE chipset support/bugfixes | ||
195 | # | ||
196 | CONFIG_IDE_GENERIC=y | ||
197 | # CONFIG_IDE_ARM is not set | ||
198 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
199 | # CONFIG_IDEDMA_AUTO is not set | ||
200 | # CONFIG_BLK_DEV_HD is not set | ||
201 | |||
202 | # | ||
203 | # SCSI device support | ||
204 | # | ||
205 | CONFIG_SCSI=m | ||
206 | CONFIG_SCSI_PROC_FS=y | ||
207 | |||
208 | # | ||
209 | # SCSI support type (disk, tape, CD-ROM) | ||
210 | # | ||
211 | CONFIG_BLK_DEV_SD=m | ||
212 | # CONFIG_CHR_DEV_ST is not set | ||
213 | # CONFIG_CHR_DEV_OSST is not set | ||
214 | CONFIG_BLK_DEV_SR=m | ||
215 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
216 | CONFIG_CHR_DEV_SG=m | ||
217 | |||
218 | # | ||
219 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
220 | # | ||
221 | CONFIG_SCSI_MULTI_LUN=y | ||
222 | # CONFIG_SCSI_CONSTANTS is not set | ||
223 | # CONFIG_SCSI_LOGGING is not set | ||
224 | |||
225 | # | ||
226 | # SCSI Transport Attributes | ||
227 | # | ||
228 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
229 | # CONFIG_SCSI_FC_ATTRS is not set | ||
230 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
231 | |||
232 | # | ||
233 | # SCSI low-level drivers | ||
234 | # | ||
235 | # CONFIG_SCSI_SATA is not set | ||
236 | # CONFIG_SCSI_DEBUG is not set | ||
237 | |||
238 | # | ||
239 | # PCMCIA SCSI adapter support | ||
240 | # | ||
241 | # CONFIG_PCMCIA_AHA152X is not set | ||
242 | # CONFIG_PCMCIA_FDOMAIN is not set | ||
243 | # CONFIG_PCMCIA_NINJA_SCSI is not set | ||
244 | # CONFIG_PCMCIA_QLOGIC is not set | ||
245 | # CONFIG_PCMCIA_SYM53C500 is not set | ||
246 | |||
247 | # | ||
248 | # Multi-device support (RAID and LVM) | ||
249 | # | ||
250 | # CONFIG_MD is not set | ||
251 | |||
252 | # | ||
253 | # Fusion MPT device support | ||
254 | # | ||
255 | |||
256 | # | ||
257 | # IEEE 1394 (FireWire) support | ||
258 | # | ||
259 | |||
260 | # | ||
261 | # I2O device support | ||
262 | # | ||
263 | |||
264 | # | ||
265 | # Networking support | ||
266 | # | ||
267 | CONFIG_NET=y | ||
268 | |||
269 | # | ||
270 | # Networking options | ||
271 | # | ||
272 | CONFIG_PACKET=y | ||
273 | # CONFIG_PACKET_MMAP is not set | ||
274 | # CONFIG_NETLINK_DEV is not set | ||
275 | CONFIG_UNIX=y | ||
276 | # CONFIG_NET_KEY is not set | ||
277 | CONFIG_INET=y | ||
278 | # CONFIG_IP_MULTICAST is not set | ||
279 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
280 | CONFIG_IP_PNP=y | ||
281 | CONFIG_IP_PNP_DHCP=y | ||
282 | # CONFIG_IP_PNP_BOOTP is not set | ||
283 | # CONFIG_IP_PNP_RARP is not set | ||
284 | # CONFIG_NET_IPIP is not set | ||
285 | # CONFIG_NET_IPGRE is not set | ||
286 | # CONFIG_ARPD is not set | ||
287 | # CONFIG_SYN_COOKIES is not set | ||
288 | # CONFIG_INET_AH is not set | ||
289 | # CONFIG_INET_ESP is not set | ||
290 | # CONFIG_INET_IPCOMP is not set | ||
291 | # CONFIG_INET_TUNNEL is not set | ||
292 | CONFIG_IP_TCPDIAG=y | ||
293 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
294 | # CONFIG_IPV6 is not set | ||
295 | # CONFIG_NETFILTER is not set | ||
296 | |||
297 | # | ||
298 | # SCTP Configuration (EXPERIMENTAL) | ||
299 | # | ||
300 | # CONFIG_IP_SCTP is not set | ||
301 | # CONFIG_ATM is not set | ||
302 | # CONFIG_BRIDGE is not set | ||
303 | # CONFIG_VLAN_8021Q is not set | ||
304 | # CONFIG_DECNET is not set | ||
305 | # CONFIG_LLC2 is not set | ||
306 | # CONFIG_IPX is not set | ||
307 | # CONFIG_ATALK is not set | ||
308 | # CONFIG_X25 is not set | ||
309 | # CONFIG_LAPB is not set | ||
310 | # CONFIG_NET_DIVERT is not set | ||
311 | # CONFIG_ECONET is not set | ||
312 | # CONFIG_WAN_ROUTER is not set | ||
313 | |||
314 | # | ||
315 | # QoS and/or fair queueing | ||
316 | # | ||
317 | # CONFIG_NET_SCHED is not set | ||
318 | # CONFIG_NET_CLS_ROUTE is not set | ||
319 | |||
320 | # | ||
321 | # Network testing | ||
322 | # | ||
323 | # CONFIG_NET_PKTGEN is not set | ||
324 | # CONFIG_NETPOLL is not set | ||
325 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
326 | # CONFIG_HAMRADIO is not set | ||
327 | # CONFIG_IRDA is not set | ||
328 | # CONFIG_BT is not set | ||
329 | CONFIG_NETDEVICES=y | ||
330 | # CONFIG_DUMMY is not set | ||
331 | # CONFIG_BONDING is not set | ||
332 | # CONFIG_EQUALIZER is not set | ||
333 | # CONFIG_TUN is not set | ||
334 | |||
335 | # | ||
336 | # Ethernet (10 or 100Mbit) | ||
337 | # | ||
338 | CONFIG_NET_ETHERNET=y | ||
339 | CONFIG_MII=y | ||
340 | CONFIG_SMC91X=y | ||
341 | # CONFIG_NE2000 is not set | ||
342 | |||
343 | # | ||
344 | # Ethernet (1000 Mbit) | ||
345 | # | ||
346 | |||
347 | # | ||
348 | # Ethernet (10000 Mbit) | ||
349 | # | ||
350 | |||
351 | # | ||
352 | # Token Ring devices | ||
353 | # | ||
354 | |||
355 | # | ||
356 | # Wireless LAN (non-hamradio) | ||
357 | # | ||
358 | # CONFIG_NET_RADIO is not set | ||
359 | |||
360 | # | ||
361 | # PCMCIA network device support | ||
362 | # | ||
363 | # CONFIG_NET_PCMCIA is not set | ||
364 | |||
365 | # | ||
366 | # Wan interfaces | ||
367 | # | ||
368 | # CONFIG_WAN is not set | ||
369 | # CONFIG_PPP is not set | ||
370 | # CONFIG_SLIP is not set | ||
371 | # CONFIG_SHAPER is not set | ||
372 | # CONFIG_NETCONSOLE is not set | ||
373 | |||
374 | # | ||
375 | # ISDN subsystem | ||
376 | # | ||
377 | # CONFIG_ISDN is not set | ||
378 | |||
379 | # | ||
380 | # Telephony Support | ||
381 | # | ||
382 | # CONFIG_PHONE is not set | ||
383 | |||
384 | # | ||
385 | # Input device support | ||
386 | # | ||
387 | CONFIG_INPUT=y | ||
388 | |||
389 | # | ||
390 | # Userland interfaces | ||
391 | # | ||
392 | # CONFIG_INPUT_MOUSEDEV is not set | ||
393 | # CONFIG_INPUT_JOYDEV is not set | ||
394 | # CONFIG_INPUT_TSDEV is not set | ||
395 | # CONFIG_INPUT_EVDEV is not set | ||
396 | # CONFIG_INPUT_EVBUG is not set | ||
397 | |||
398 | # | ||
399 | # Input I/O drivers | ||
400 | # | ||
401 | # CONFIG_GAMEPORT is not set | ||
402 | CONFIG_SOUND_GAMEPORT=y | ||
403 | CONFIG_SERIO=y | ||
404 | # CONFIG_SERIO_I8042 is not set | ||
405 | CONFIG_SERIO_SERPORT=y | ||
406 | # CONFIG_SERIO_CT82C710 is not set | ||
407 | # CONFIG_SERIO_LIBPS2 is not set | ||
408 | # CONFIG_SERIO_RAW is not set | ||
409 | |||
410 | # | ||
411 | # Input Device Drivers | ||
412 | # | ||
413 | # CONFIG_INPUT_KEYBOARD is not set | ||
414 | # CONFIG_INPUT_MOUSE is not set | ||
415 | # CONFIG_INPUT_JOYSTICK is not set | ||
416 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
417 | # CONFIG_INPUT_MISC is not set | ||
418 | |||
419 | # | ||
420 | # Character devices | ||
421 | # | ||
422 | CONFIG_VT=y | ||
423 | CONFIG_VT_CONSOLE=y | ||
424 | CONFIG_HW_CONSOLE=y | ||
425 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
426 | |||
427 | # | ||
428 | # Serial drivers | ||
429 | # | ||
430 | # CONFIG_SERIAL_8250 is not set | ||
431 | |||
432 | # | ||
433 | # Non-8250 serial port support | ||
434 | # | ||
435 | CONFIG_SERIAL_CORE=y | ||
436 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
437 | CONFIG_SERIAL_M32R_SIO=y | ||
438 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
439 | CONFIG_SERIAL_M32R_PLDSIO=y | ||
440 | CONFIG_UNIX98_PTYS=y | ||
441 | CONFIG_LEGACY_PTYS=y | ||
442 | CONFIG_LEGACY_PTY_COUNT=256 | ||
443 | |||
444 | # | ||
445 | # IPMI | ||
446 | # | ||
447 | # CONFIG_IPMI_HANDLER is not set | ||
448 | |||
449 | # | ||
450 | # Watchdog Cards | ||
451 | # | ||
452 | # CONFIG_WATCHDOG is not set | ||
453 | # CONFIG_RTC is not set | ||
454 | # CONFIG_GEN_RTC is not set | ||
455 | CONFIG_DS1302=y | ||
456 | # CONFIG_DTLK is not set | ||
457 | # CONFIG_R3964 is not set | ||
458 | |||
459 | # | ||
460 | # Ftape, the floppy tape device driver | ||
461 | # | ||
462 | # CONFIG_DRM is not set | ||
463 | |||
464 | # | ||
465 | # PCMCIA character devices | ||
466 | # | ||
467 | # CONFIG_SYNCLINK_CS is not set | ||
468 | # CONFIG_RAW_DRIVER is not set | ||
469 | |||
470 | # | ||
471 | # I2C support | ||
472 | # | ||
473 | # CONFIG_I2C is not set | ||
474 | |||
475 | # | ||
476 | # Dallas's 1-wire bus | ||
477 | # | ||
478 | # CONFIG_W1 is not set | ||
479 | |||
480 | # | ||
481 | # Misc devices | ||
482 | # | ||
483 | |||
484 | # | ||
485 | # Multimedia devices | ||
486 | # | ||
487 | CONFIG_VIDEO_DEV=y | ||
488 | |||
489 | # | ||
490 | # Video For Linux | ||
491 | # | ||
492 | |||
493 | # | ||
494 | # Video Adapters | ||
495 | # | ||
496 | # CONFIG_VIDEO_CPIA is not set | ||
497 | CONFIG_VIDEO_M32R_AR=y | ||
498 | CONFIG_VIDEO_M32R_AR_M64278=y | ||
499 | |||
500 | # | ||
501 | # Radio Adapters | ||
502 | # | ||
503 | # CONFIG_RADIO_MAESTRO is not set | ||
504 | |||
505 | # | ||
506 | # Digital Video Broadcasting Devices | ||
507 | # | ||
508 | # CONFIG_DVB is not set | ||
509 | |||
510 | # | ||
511 | # Graphics support | ||
512 | # | ||
513 | CONFIG_FB=y | ||
514 | # CONFIG_FB_MODE_HELPERS is not set | ||
515 | # CONFIG_FB_TILEBLITTING is not set | ||
516 | # CONFIG_FB_VIRTUAL is not set | ||
517 | |||
518 | # | ||
519 | # Console display driver support | ||
520 | # | ||
521 | # CONFIG_VGA_CONSOLE is not set | ||
522 | CONFIG_DUMMY_CONSOLE=y | ||
523 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
524 | # CONFIG_FONTS is not set | ||
525 | CONFIG_FONT_8x8=y | ||
526 | CONFIG_FONT_8x16=y | ||
527 | |||
528 | # | ||
529 | # Logo configuration | ||
530 | # | ||
531 | CONFIG_LOGO=y | ||
532 | CONFIG_LOGO_LINUX_MONO=y | ||
533 | CONFIG_LOGO_LINUX_VGA16=y | ||
534 | CONFIG_LOGO_LINUX_CLUT224=y | ||
535 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
536 | |||
537 | # | ||
538 | # Sound | ||
539 | # | ||
540 | # CONFIG_SOUND is not set | ||
541 | |||
542 | # | ||
543 | # USB support | ||
544 | # | ||
545 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
546 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
547 | |||
548 | # | ||
549 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
550 | # | ||
551 | |||
552 | # | ||
553 | # USB Gadget Support | ||
554 | # | ||
555 | # CONFIG_USB_GADGET is not set | ||
556 | |||
557 | # | ||
558 | # MMC/SD Card support | ||
559 | # | ||
560 | # CONFIG_MMC is not set | ||
561 | |||
562 | # | ||
563 | # InfiniBand support | ||
564 | # | ||
565 | # CONFIG_INFINIBAND is not set | ||
566 | |||
567 | # | ||
568 | # File systems | ||
569 | # | ||
570 | CONFIG_EXT2_FS=y | ||
571 | # CONFIG_EXT2_FS_XATTR is not set | ||
572 | CONFIG_EXT3_FS=m | ||
573 | CONFIG_EXT3_FS_XATTR=y | ||
574 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
575 | # CONFIG_EXT3_FS_SECURITY is not set | ||
576 | CONFIG_JBD=m | ||
577 | CONFIG_JBD_DEBUG=y | ||
578 | CONFIG_FS_MBCACHE=y | ||
579 | CONFIG_REISERFS_FS=m | ||
580 | # CONFIG_REISERFS_CHECK is not set | ||
581 | # CONFIG_REISERFS_PROC_INFO is not set | ||
582 | # CONFIG_REISERFS_FS_XATTR is not set | ||
583 | # CONFIG_JFS_FS is not set | ||
584 | |||
585 | # | ||
586 | # XFS support | ||
587 | # | ||
588 | # CONFIG_XFS_FS is not set | ||
589 | # CONFIG_MINIX_FS is not set | ||
590 | # CONFIG_ROMFS_FS is not set | ||
591 | # CONFIG_QUOTA is not set | ||
592 | CONFIG_DNOTIFY=y | ||
593 | # CONFIG_AUTOFS_FS is not set | ||
594 | # CONFIG_AUTOFS4_FS is not set | ||
595 | |||
596 | # | ||
597 | # CD-ROM/DVD Filesystems | ||
598 | # | ||
599 | CONFIG_ISO9660_FS=m | ||
600 | CONFIG_JOLIET=y | ||
601 | # CONFIG_ZISOFS is not set | ||
602 | CONFIG_UDF_FS=m | ||
603 | CONFIG_UDF_NLS=y | ||
604 | |||
605 | # | ||
606 | # DOS/FAT/NT Filesystems | ||
607 | # | ||
608 | CONFIG_FAT_FS=m | ||
609 | CONFIG_MSDOS_FS=m | ||
610 | CONFIG_VFAT_FS=m | ||
611 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
612 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
613 | # CONFIG_NTFS_FS is not set | ||
614 | |||
615 | # | ||
616 | # Pseudo filesystems | ||
617 | # | ||
618 | CONFIG_PROC_FS=y | ||
619 | CONFIG_PROC_KCORE=y | ||
620 | CONFIG_SYSFS=y | ||
621 | CONFIG_DEVFS_FS=y | ||
622 | CONFIG_DEVFS_MOUNT=y | ||
623 | # CONFIG_DEVFS_DEBUG is not set | ||
624 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
625 | CONFIG_TMPFS=y | ||
626 | # CONFIG_TMPFS_XATTR is not set | ||
627 | # CONFIG_HUGETLB_PAGE is not set | ||
628 | CONFIG_RAMFS=y | ||
629 | |||
630 | # | ||
631 | # Miscellaneous filesystems | ||
632 | # | ||
633 | # CONFIG_ADFS_FS is not set | ||
634 | # CONFIG_AFFS_FS is not set | ||
635 | # CONFIG_HFS_FS is not set | ||
636 | # CONFIG_HFSPLUS_FS is not set | ||
637 | # CONFIG_BEFS_FS is not set | ||
638 | # CONFIG_BFS_FS is not set | ||
639 | # CONFIG_EFS_FS is not set | ||
640 | # CONFIG_CRAMFS is not set | ||
641 | # CONFIG_VXFS_FS is not set | ||
642 | # CONFIG_HPFS_FS is not set | ||
643 | # CONFIG_QNX4FS_FS is not set | ||
644 | # CONFIG_SYSV_FS is not set | ||
645 | # CONFIG_UFS_FS is not set | ||
646 | |||
647 | # | ||
648 | # Network File Systems | ||
649 | # | ||
650 | CONFIG_NFS_FS=y | ||
651 | CONFIG_NFS_V3=y | ||
652 | # CONFIG_NFS_V4 is not set | ||
653 | # CONFIG_NFS_DIRECTIO is not set | ||
654 | # CONFIG_NFSD is not set | ||
655 | CONFIG_ROOT_NFS=y | ||
656 | CONFIG_LOCKD=y | ||
657 | CONFIG_LOCKD_V4=y | ||
658 | CONFIG_SUNRPC=y | ||
659 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
660 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
661 | # CONFIG_SMB_FS is not set | ||
662 | # CONFIG_CIFS is not set | ||
663 | # CONFIG_NCP_FS is not set | ||
664 | # CONFIG_CODA_FS is not set | ||
665 | # CONFIG_AFS_FS is not set | ||
666 | |||
667 | # | ||
668 | # Partition Types | ||
669 | # | ||
670 | # CONFIG_PARTITION_ADVANCED is not set | ||
671 | CONFIG_MSDOS_PARTITION=y | ||
672 | |||
673 | # | ||
674 | # Native Language Support | ||
675 | # | ||
676 | CONFIG_NLS=y | ||
677 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
678 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
679 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
680 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
681 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
682 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
683 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
684 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
685 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
686 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
687 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
688 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
689 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
690 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
691 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
692 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
693 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
694 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
695 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
696 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
697 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
698 | # CONFIG_NLS_ISO8859_8 is not set | ||
699 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
700 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
701 | # CONFIG_NLS_ASCII is not set | ||
702 | # CONFIG_NLS_ISO8859_1 is not set | ||
703 | # CONFIG_NLS_ISO8859_2 is not set | ||
704 | # CONFIG_NLS_ISO8859_3 is not set | ||
705 | # CONFIG_NLS_ISO8859_4 is not set | ||
706 | # CONFIG_NLS_ISO8859_5 is not set | ||
707 | # CONFIG_NLS_ISO8859_6 is not set | ||
708 | # CONFIG_NLS_ISO8859_7 is not set | ||
709 | # CONFIG_NLS_ISO8859_9 is not set | ||
710 | # CONFIG_NLS_ISO8859_13 is not set | ||
711 | # CONFIG_NLS_ISO8859_14 is not set | ||
712 | # CONFIG_NLS_ISO8859_15 is not set | ||
713 | # CONFIG_NLS_KOI8_R is not set | ||
714 | # CONFIG_NLS_KOI8_U is not set | ||
715 | # CONFIG_NLS_UTF8 is not set | ||
716 | |||
717 | # | ||
718 | # Profiling support | ||
719 | # | ||
720 | # CONFIG_PROFILING is not set | ||
721 | |||
722 | # | ||
723 | # Kernel hacking | ||
724 | # | ||
725 | # CONFIG_DEBUG_KERNEL is not set | ||
726 | CONFIG_DEBUG_PREEMPT=y | ||
727 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
728 | # CONFIG_FRAME_POINTER is not set | ||
729 | |||
730 | # | ||
731 | # Security options | ||
732 | # | ||
733 | # CONFIG_KEYS is not set | ||
734 | # CONFIG_SECURITY is not set | ||
735 | |||
736 | # | ||
737 | # Cryptographic options | ||
738 | # | ||
739 | # CONFIG_CRYPTO is not set | ||
740 | |||
741 | # | ||
742 | # Hardware crypto devices | ||
743 | # | ||
744 | |||
745 | # | ||
746 | # Library routines | ||
747 | # | ||
748 | # CONFIG_CRC_CCITT is not set | ||
749 | CONFIG_CRC32=y | ||
750 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/m32r/m32700ut/defconfig.m32700ut.up b/arch/m32r/m32700ut/defconfig.m32700ut.up new file mode 100644 index 000000000000..805357f7bda1 --- /dev/null +++ b/arch/m32r/m32700ut/defconfig.m32700ut.up | |||
@@ -0,0 +1,747 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:10:54 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | CONFIG_CLEAN_COMPILE=y | ||
17 | CONFIG_BROKEN_ON_SMP=y | ||
18 | CONFIG_LOCK_KERNEL=y | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_LOCALVERSION="" | ||
24 | CONFIG_SWAP=y | ||
25 | CONFIG_SYSVIPC=y | ||
26 | # CONFIG_POSIX_MQUEUE is not set | ||
27 | CONFIG_BSD_PROCESS_ACCT=y | ||
28 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
29 | CONFIG_SYSCTL=y | ||
30 | # CONFIG_AUDIT is not set | ||
31 | CONFIG_LOG_BUF_SHIFT=14 | ||
32 | CONFIG_HOTPLUG=y | ||
33 | CONFIG_KOBJECT_UEVENT=y | ||
34 | CONFIG_IKCONFIG=y | ||
35 | # CONFIG_IKCONFIG_PROC is not set | ||
36 | CONFIG_EMBEDDED=y | ||
37 | # CONFIG_KALLSYMS is not set | ||
38 | # CONFIG_FUTEX is not set | ||
39 | # CONFIG_EPOLL is not set | ||
40 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
41 | CONFIG_SHMEM=y | ||
42 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
43 | CONFIG_CC_ALIGN_LABELS=0 | ||
44 | CONFIG_CC_ALIGN_LOOPS=0 | ||
45 | CONFIG_CC_ALIGN_JUMPS=0 | ||
46 | # CONFIG_TINY_SHMEM is not set | ||
47 | |||
48 | # | ||
49 | # Loadable module support | ||
50 | # | ||
51 | CONFIG_MODULES=y | ||
52 | CONFIG_MODULE_UNLOAD=y | ||
53 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
54 | CONFIG_OBSOLETE_MODPARM=y | ||
55 | # CONFIG_MODVERSIONS is not set | ||
56 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
57 | CONFIG_KMOD=y | ||
58 | |||
59 | # | ||
60 | # Processor type and features | ||
61 | # | ||
62 | # CONFIG_PLAT_MAPPI is not set | ||
63 | # CONFIG_PLAT_USRV is not set | ||
64 | CONFIG_PLAT_M32700UT=y | ||
65 | # CONFIG_PLAT_OPSPUT is not set | ||
66 | # CONFIG_PLAT_OAKS32R is not set | ||
67 | # CONFIG_PLAT_MAPPI2 is not set | ||
68 | CONFIG_CHIP_M32700=y | ||
69 | # CONFIG_CHIP_M32102 is not set | ||
70 | # CONFIG_CHIP_VDEC2 is not set | ||
71 | # CONFIG_CHIP_OPSP is not set | ||
72 | CONFIG_MMU=y | ||
73 | CONFIG_TLB_ENTRIES=32 | ||
74 | CONFIG_ISA_M32R2=y | ||
75 | CONFIG_ISA_DSP_LEVEL2=y | ||
76 | CONFIG_ISA_DUAL_ISSUE=y | ||
77 | CONFIG_BUS_CLOCK=50000000 | ||
78 | CONFIG_TIMER_DIVIDE=128 | ||
79 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
80 | CONFIG_MEMORY_START=0x08000000 | ||
81 | CONFIG_MEMORY_SIZE=0x01000000 | ||
82 | CONFIG_NOHIGHMEM=y | ||
83 | # CONFIG_DISCONTIGMEM is not set | ||
84 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
85 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
86 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
87 | CONFIG_PREEMPT=y | ||
88 | # CONFIG_HAVE_DEC_LOCK is not set | ||
89 | # CONFIG_SMP is not set | ||
90 | |||
91 | # | ||
92 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
93 | # | ||
94 | # CONFIG_PCI is not set | ||
95 | # CONFIG_ISA is not set | ||
96 | |||
97 | # | ||
98 | # PCCARD (PCMCIA/CardBus) support | ||
99 | # | ||
100 | CONFIG_PCCARD=y | ||
101 | # CONFIG_PCMCIA_DEBUG is not set | ||
102 | CONFIG_PCMCIA=y | ||
103 | |||
104 | # | ||
105 | # PC-card bridges | ||
106 | # | ||
107 | # CONFIG_TCIC is not set | ||
108 | # CONFIG_M32R_PCC is not set | ||
109 | CONFIG_M32R_CFC=y | ||
110 | CONFIG_M32R_CFC_NUM=1 | ||
111 | |||
112 | # | ||
113 | # PCI Hotplug Support | ||
114 | # | ||
115 | |||
116 | # | ||
117 | # Executable file formats | ||
118 | # | ||
119 | CONFIG_BINFMT_ELF=y | ||
120 | # CONFIG_BINFMT_MISC is not set | ||
121 | |||
122 | # | ||
123 | # Device Drivers | ||
124 | # | ||
125 | |||
126 | # | ||
127 | # Generic Driver Options | ||
128 | # | ||
129 | CONFIG_STANDALONE=y | ||
130 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
131 | # CONFIG_FW_LOADER is not set | ||
132 | |||
133 | # | ||
134 | # Memory Technology Devices (MTD) | ||
135 | # | ||
136 | # CONFIG_MTD is not set | ||
137 | |||
138 | # | ||
139 | # Parallel port support | ||
140 | # | ||
141 | # CONFIG_PARPORT is not set | ||
142 | |||
143 | # | ||
144 | # Plug and Play support | ||
145 | # | ||
146 | |||
147 | # | ||
148 | # Block devices | ||
149 | # | ||
150 | # CONFIG_BLK_DEV_FD is not set | ||
151 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
152 | CONFIG_BLK_DEV_LOOP=y | ||
153 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
154 | CONFIG_BLK_DEV_NBD=y | ||
155 | CONFIG_BLK_DEV_RAM=y | ||
156 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
157 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
158 | # CONFIG_BLK_DEV_INITRD is not set | ||
159 | CONFIG_INITRAMFS_SOURCE="" | ||
160 | # CONFIG_CDROM_PKTCDVD is not set | ||
161 | |||
162 | # | ||
163 | # IO Schedulers | ||
164 | # | ||
165 | CONFIG_IOSCHED_NOOP=y | ||
166 | # CONFIG_IOSCHED_AS is not set | ||
167 | CONFIG_IOSCHED_DEADLINE=y | ||
168 | CONFIG_IOSCHED_CFQ=y | ||
169 | # CONFIG_ATA_OVER_ETH is not set | ||
170 | |||
171 | # | ||
172 | # ATA/ATAPI/MFM/RLL support | ||
173 | # | ||
174 | CONFIG_IDE=y | ||
175 | CONFIG_BLK_DEV_IDE=y | ||
176 | |||
177 | # | ||
178 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
179 | # | ||
180 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
181 | CONFIG_BLK_DEV_IDEDISK=y | ||
182 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
183 | CONFIG_BLK_DEV_IDECS=y | ||
184 | CONFIG_BLK_DEV_IDECD=m | ||
185 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
186 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
187 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
188 | # CONFIG_IDE_TASK_IOCTL is not set | ||
189 | |||
190 | # | ||
191 | # IDE chipset support/bugfixes | ||
192 | # | ||
193 | CONFIG_IDE_GENERIC=y | ||
194 | # CONFIG_IDE_ARM is not set | ||
195 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
196 | # CONFIG_IDEDMA_AUTO is not set | ||
197 | # CONFIG_BLK_DEV_HD is not set | ||
198 | |||
199 | # | ||
200 | # SCSI device support | ||
201 | # | ||
202 | CONFIG_SCSI=m | ||
203 | CONFIG_SCSI_PROC_FS=y | ||
204 | |||
205 | # | ||
206 | # SCSI support type (disk, tape, CD-ROM) | ||
207 | # | ||
208 | CONFIG_BLK_DEV_SD=m | ||
209 | # CONFIG_CHR_DEV_ST is not set | ||
210 | # CONFIG_CHR_DEV_OSST is not set | ||
211 | CONFIG_BLK_DEV_SR=m | ||
212 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
213 | CONFIG_CHR_DEV_SG=m | ||
214 | |||
215 | # | ||
216 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
217 | # | ||
218 | CONFIG_SCSI_MULTI_LUN=y | ||
219 | # CONFIG_SCSI_CONSTANTS is not set | ||
220 | # CONFIG_SCSI_LOGGING is not set | ||
221 | |||
222 | # | ||
223 | # SCSI Transport Attributes | ||
224 | # | ||
225 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
226 | # CONFIG_SCSI_FC_ATTRS is not set | ||
227 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
228 | |||
229 | # | ||
230 | # SCSI low-level drivers | ||
231 | # | ||
232 | # CONFIG_SCSI_SATA is not set | ||
233 | # CONFIG_SCSI_DEBUG is not set | ||
234 | |||
235 | # | ||
236 | # PCMCIA SCSI adapter support | ||
237 | # | ||
238 | # CONFIG_PCMCIA_AHA152X is not set | ||
239 | # CONFIG_PCMCIA_FDOMAIN is not set | ||
240 | # CONFIG_PCMCIA_NINJA_SCSI is not set | ||
241 | # CONFIG_PCMCIA_QLOGIC is not set | ||
242 | # CONFIG_PCMCIA_SYM53C500 is not set | ||
243 | |||
244 | # | ||
245 | # Multi-device support (RAID and LVM) | ||
246 | # | ||
247 | # CONFIG_MD is not set | ||
248 | |||
249 | # | ||
250 | # Fusion MPT device support | ||
251 | # | ||
252 | |||
253 | # | ||
254 | # IEEE 1394 (FireWire) support | ||
255 | # | ||
256 | |||
257 | # | ||
258 | # I2O device support | ||
259 | # | ||
260 | |||
261 | # | ||
262 | # Networking support | ||
263 | # | ||
264 | CONFIG_NET=y | ||
265 | |||
266 | # | ||
267 | # Networking options | ||
268 | # | ||
269 | CONFIG_PACKET=y | ||
270 | # CONFIG_PACKET_MMAP is not set | ||
271 | # CONFIG_NETLINK_DEV is not set | ||
272 | CONFIG_UNIX=y | ||
273 | # CONFIG_NET_KEY is not set | ||
274 | CONFIG_INET=y | ||
275 | # CONFIG_IP_MULTICAST is not set | ||
276 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
277 | CONFIG_IP_PNP=y | ||
278 | CONFIG_IP_PNP_DHCP=y | ||
279 | # CONFIG_IP_PNP_BOOTP is not set | ||
280 | # CONFIG_IP_PNP_RARP is not set | ||
281 | # CONFIG_NET_IPIP is not set | ||
282 | # CONFIG_NET_IPGRE is not set | ||
283 | # CONFIG_ARPD is not set | ||
284 | # CONFIG_SYN_COOKIES is not set | ||
285 | # CONFIG_INET_AH is not set | ||
286 | # CONFIG_INET_ESP is not set | ||
287 | # CONFIG_INET_IPCOMP is not set | ||
288 | # CONFIG_INET_TUNNEL is not set | ||
289 | CONFIG_IP_TCPDIAG=y | ||
290 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
291 | # CONFIG_IPV6 is not set | ||
292 | # CONFIG_NETFILTER is not set | ||
293 | |||
294 | # | ||
295 | # SCTP Configuration (EXPERIMENTAL) | ||
296 | # | ||
297 | # CONFIG_IP_SCTP is not set | ||
298 | # CONFIG_ATM is not set | ||
299 | # CONFIG_BRIDGE is not set | ||
300 | # CONFIG_VLAN_8021Q is not set | ||
301 | # CONFIG_DECNET is not set | ||
302 | # CONFIG_LLC2 is not set | ||
303 | # CONFIG_IPX is not set | ||
304 | # CONFIG_ATALK is not set | ||
305 | # CONFIG_X25 is not set | ||
306 | # CONFIG_LAPB is not set | ||
307 | # CONFIG_NET_DIVERT is not set | ||
308 | # CONFIG_ECONET is not set | ||
309 | # CONFIG_WAN_ROUTER is not set | ||
310 | |||
311 | # | ||
312 | # QoS and/or fair queueing | ||
313 | # | ||
314 | # CONFIG_NET_SCHED is not set | ||
315 | # CONFIG_NET_CLS_ROUTE is not set | ||
316 | |||
317 | # | ||
318 | # Network testing | ||
319 | # | ||
320 | # CONFIG_NET_PKTGEN is not set | ||
321 | # CONFIG_NETPOLL is not set | ||
322 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
323 | # CONFIG_HAMRADIO is not set | ||
324 | # CONFIG_IRDA is not set | ||
325 | # CONFIG_BT is not set | ||
326 | CONFIG_NETDEVICES=y | ||
327 | # CONFIG_DUMMY is not set | ||
328 | # CONFIG_BONDING is not set | ||
329 | # CONFIG_EQUALIZER is not set | ||
330 | # CONFIG_TUN is not set | ||
331 | |||
332 | # | ||
333 | # Ethernet (10 or 100Mbit) | ||
334 | # | ||
335 | CONFIG_NET_ETHERNET=y | ||
336 | CONFIG_MII=y | ||
337 | CONFIG_SMC91X=y | ||
338 | # CONFIG_NE2000 is not set | ||
339 | |||
340 | # | ||
341 | # Ethernet (1000 Mbit) | ||
342 | # | ||
343 | |||
344 | # | ||
345 | # Ethernet (10000 Mbit) | ||
346 | # | ||
347 | |||
348 | # | ||
349 | # Token Ring devices | ||
350 | # | ||
351 | |||
352 | # | ||
353 | # Wireless LAN (non-hamradio) | ||
354 | # | ||
355 | # CONFIG_NET_RADIO is not set | ||
356 | |||
357 | # | ||
358 | # PCMCIA network device support | ||
359 | # | ||
360 | # CONFIG_NET_PCMCIA is not set | ||
361 | |||
362 | # | ||
363 | # Wan interfaces | ||
364 | # | ||
365 | # CONFIG_WAN is not set | ||
366 | # CONFIG_PPP is not set | ||
367 | # CONFIG_SLIP is not set | ||
368 | # CONFIG_SHAPER is not set | ||
369 | # CONFIG_NETCONSOLE is not set | ||
370 | |||
371 | # | ||
372 | # ISDN subsystem | ||
373 | # | ||
374 | # CONFIG_ISDN is not set | ||
375 | |||
376 | # | ||
377 | # Telephony Support | ||
378 | # | ||
379 | # CONFIG_PHONE is not set | ||
380 | |||
381 | # | ||
382 | # Input device support | ||
383 | # | ||
384 | CONFIG_INPUT=y | ||
385 | |||
386 | # | ||
387 | # Userland interfaces | ||
388 | # | ||
389 | # CONFIG_INPUT_MOUSEDEV is not set | ||
390 | # CONFIG_INPUT_JOYDEV is not set | ||
391 | # CONFIG_INPUT_TSDEV is not set | ||
392 | # CONFIG_INPUT_EVDEV is not set | ||
393 | # CONFIG_INPUT_EVBUG is not set | ||
394 | |||
395 | # | ||
396 | # Input I/O drivers | ||
397 | # | ||
398 | # CONFIG_GAMEPORT is not set | ||
399 | CONFIG_SOUND_GAMEPORT=y | ||
400 | CONFIG_SERIO=y | ||
401 | # CONFIG_SERIO_I8042 is not set | ||
402 | CONFIG_SERIO_SERPORT=y | ||
403 | # CONFIG_SERIO_CT82C710 is not set | ||
404 | # CONFIG_SERIO_LIBPS2 is not set | ||
405 | # CONFIG_SERIO_RAW is not set | ||
406 | |||
407 | # | ||
408 | # Input Device Drivers | ||
409 | # | ||
410 | # CONFIG_INPUT_KEYBOARD is not set | ||
411 | # CONFIG_INPUT_MOUSE is not set | ||
412 | # CONFIG_INPUT_JOYSTICK is not set | ||
413 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
414 | # CONFIG_INPUT_MISC is not set | ||
415 | |||
416 | # | ||
417 | # Character devices | ||
418 | # | ||
419 | CONFIG_VT=y | ||
420 | CONFIG_VT_CONSOLE=y | ||
421 | CONFIG_HW_CONSOLE=y | ||
422 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
423 | |||
424 | # | ||
425 | # Serial drivers | ||
426 | # | ||
427 | # CONFIG_SERIAL_8250 is not set | ||
428 | |||
429 | # | ||
430 | # Non-8250 serial port support | ||
431 | # | ||
432 | CONFIG_SERIAL_CORE=y | ||
433 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
434 | CONFIG_SERIAL_M32R_SIO=y | ||
435 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
436 | CONFIG_SERIAL_M32R_PLDSIO=y | ||
437 | CONFIG_UNIX98_PTYS=y | ||
438 | CONFIG_LEGACY_PTYS=y | ||
439 | CONFIG_LEGACY_PTY_COUNT=256 | ||
440 | |||
441 | # | ||
442 | # IPMI | ||
443 | # | ||
444 | # CONFIG_IPMI_HANDLER is not set | ||
445 | |||
446 | # | ||
447 | # Watchdog Cards | ||
448 | # | ||
449 | # CONFIG_WATCHDOG is not set | ||
450 | # CONFIG_RTC is not set | ||
451 | # CONFIG_GEN_RTC is not set | ||
452 | CONFIG_DS1302=y | ||
453 | # CONFIG_DTLK is not set | ||
454 | # CONFIG_R3964 is not set | ||
455 | |||
456 | # | ||
457 | # Ftape, the floppy tape device driver | ||
458 | # | ||
459 | # CONFIG_DRM is not set | ||
460 | |||
461 | # | ||
462 | # PCMCIA character devices | ||
463 | # | ||
464 | # CONFIG_SYNCLINK_CS is not set | ||
465 | # CONFIG_RAW_DRIVER is not set | ||
466 | |||
467 | # | ||
468 | # I2C support | ||
469 | # | ||
470 | # CONFIG_I2C is not set | ||
471 | |||
472 | # | ||
473 | # Dallas's 1-wire bus | ||
474 | # | ||
475 | # CONFIG_W1 is not set | ||
476 | |||
477 | # | ||
478 | # Misc devices | ||
479 | # | ||
480 | |||
481 | # | ||
482 | # Multimedia devices | ||
483 | # | ||
484 | CONFIG_VIDEO_DEV=y | ||
485 | |||
486 | # | ||
487 | # Video For Linux | ||
488 | # | ||
489 | |||
490 | # | ||
491 | # Video Adapters | ||
492 | # | ||
493 | # CONFIG_VIDEO_CPIA is not set | ||
494 | CONFIG_VIDEO_M32R_AR=y | ||
495 | CONFIG_VIDEO_M32R_AR_M64278=y | ||
496 | |||
497 | # | ||
498 | # Radio Adapters | ||
499 | # | ||
500 | # CONFIG_RADIO_MAESTRO is not set | ||
501 | |||
502 | # | ||
503 | # Digital Video Broadcasting Devices | ||
504 | # | ||
505 | # CONFIG_DVB is not set | ||
506 | |||
507 | # | ||
508 | # Graphics support | ||
509 | # | ||
510 | CONFIG_FB=y | ||
511 | # CONFIG_FB_MODE_HELPERS is not set | ||
512 | # CONFIG_FB_TILEBLITTING is not set | ||
513 | # CONFIG_FB_VIRTUAL is not set | ||
514 | |||
515 | # | ||
516 | # Console display driver support | ||
517 | # | ||
518 | # CONFIG_VGA_CONSOLE is not set | ||
519 | CONFIG_DUMMY_CONSOLE=y | ||
520 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
521 | # CONFIG_FONTS is not set | ||
522 | CONFIG_FONT_8x8=y | ||
523 | CONFIG_FONT_8x16=y | ||
524 | |||
525 | # | ||
526 | # Logo configuration | ||
527 | # | ||
528 | CONFIG_LOGO=y | ||
529 | CONFIG_LOGO_LINUX_MONO=y | ||
530 | CONFIG_LOGO_LINUX_VGA16=y | ||
531 | CONFIG_LOGO_LINUX_CLUT224=y | ||
532 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
533 | |||
534 | # | ||
535 | # Sound | ||
536 | # | ||
537 | # CONFIG_SOUND is not set | ||
538 | |||
539 | # | ||
540 | # USB support | ||
541 | # | ||
542 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
543 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
544 | |||
545 | # | ||
546 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
547 | # | ||
548 | |||
549 | # | ||
550 | # USB Gadget Support | ||
551 | # | ||
552 | # CONFIG_USB_GADGET is not set | ||
553 | |||
554 | # | ||
555 | # MMC/SD Card support | ||
556 | # | ||
557 | # CONFIG_MMC is not set | ||
558 | |||
559 | # | ||
560 | # InfiniBand support | ||
561 | # | ||
562 | # CONFIG_INFINIBAND is not set | ||
563 | |||
564 | # | ||
565 | # File systems | ||
566 | # | ||
567 | CONFIG_EXT2_FS=y | ||
568 | # CONFIG_EXT2_FS_XATTR is not set | ||
569 | CONFIG_EXT3_FS=m | ||
570 | CONFIG_EXT3_FS_XATTR=y | ||
571 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
572 | # CONFIG_EXT3_FS_SECURITY is not set | ||
573 | CONFIG_JBD=m | ||
574 | CONFIG_JBD_DEBUG=y | ||
575 | CONFIG_FS_MBCACHE=y | ||
576 | CONFIG_REISERFS_FS=m | ||
577 | # CONFIG_REISERFS_CHECK is not set | ||
578 | # CONFIG_REISERFS_PROC_INFO is not set | ||
579 | # CONFIG_REISERFS_FS_XATTR is not set | ||
580 | # CONFIG_JFS_FS is not set | ||
581 | |||
582 | # | ||
583 | # XFS support | ||
584 | # | ||
585 | # CONFIG_XFS_FS is not set | ||
586 | # CONFIG_MINIX_FS is not set | ||
587 | # CONFIG_ROMFS_FS is not set | ||
588 | # CONFIG_QUOTA is not set | ||
589 | CONFIG_DNOTIFY=y | ||
590 | # CONFIG_AUTOFS_FS is not set | ||
591 | # CONFIG_AUTOFS4_FS is not set | ||
592 | |||
593 | # | ||
594 | # CD-ROM/DVD Filesystems | ||
595 | # | ||
596 | CONFIG_ISO9660_FS=m | ||
597 | CONFIG_JOLIET=y | ||
598 | # CONFIG_ZISOFS is not set | ||
599 | CONFIG_UDF_FS=m | ||
600 | CONFIG_UDF_NLS=y | ||
601 | |||
602 | # | ||
603 | # DOS/FAT/NT Filesystems | ||
604 | # | ||
605 | CONFIG_FAT_FS=m | ||
606 | CONFIG_MSDOS_FS=m | ||
607 | CONFIG_VFAT_FS=m | ||
608 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
609 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
610 | # CONFIG_NTFS_FS is not set | ||
611 | |||
612 | # | ||
613 | # Pseudo filesystems | ||
614 | # | ||
615 | CONFIG_PROC_FS=y | ||
616 | CONFIG_PROC_KCORE=y | ||
617 | CONFIG_SYSFS=y | ||
618 | CONFIG_DEVFS_FS=y | ||
619 | CONFIG_DEVFS_MOUNT=y | ||
620 | # CONFIG_DEVFS_DEBUG is not set | ||
621 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
622 | CONFIG_TMPFS=y | ||
623 | # CONFIG_TMPFS_XATTR is not set | ||
624 | # CONFIG_HUGETLB_PAGE is not set | ||
625 | CONFIG_RAMFS=y | ||
626 | |||
627 | # | ||
628 | # Miscellaneous filesystems | ||
629 | # | ||
630 | # CONFIG_ADFS_FS is not set | ||
631 | # CONFIG_AFFS_FS is not set | ||
632 | # CONFIG_HFS_FS is not set | ||
633 | # CONFIG_HFSPLUS_FS is not set | ||
634 | # CONFIG_BEFS_FS is not set | ||
635 | # CONFIG_BFS_FS is not set | ||
636 | # CONFIG_EFS_FS is not set | ||
637 | # CONFIG_CRAMFS is not set | ||
638 | # CONFIG_VXFS_FS is not set | ||
639 | # CONFIG_HPFS_FS is not set | ||
640 | # CONFIG_QNX4FS_FS is not set | ||
641 | # CONFIG_SYSV_FS is not set | ||
642 | # CONFIG_UFS_FS is not set | ||
643 | |||
644 | # | ||
645 | # Network File Systems | ||
646 | # | ||
647 | CONFIG_NFS_FS=y | ||
648 | CONFIG_NFS_V3=y | ||
649 | # CONFIG_NFS_V4 is not set | ||
650 | # CONFIG_NFS_DIRECTIO is not set | ||
651 | # CONFIG_NFSD is not set | ||
652 | CONFIG_ROOT_NFS=y | ||
653 | CONFIG_LOCKD=y | ||
654 | CONFIG_LOCKD_V4=y | ||
655 | CONFIG_SUNRPC=y | ||
656 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
657 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
658 | # CONFIG_SMB_FS is not set | ||
659 | # CONFIG_CIFS is not set | ||
660 | # CONFIG_NCP_FS is not set | ||
661 | # CONFIG_CODA_FS is not set | ||
662 | # CONFIG_AFS_FS is not set | ||
663 | |||
664 | # | ||
665 | # Partition Types | ||
666 | # | ||
667 | # CONFIG_PARTITION_ADVANCED is not set | ||
668 | CONFIG_MSDOS_PARTITION=y | ||
669 | |||
670 | # | ||
671 | # Native Language Support | ||
672 | # | ||
673 | CONFIG_NLS=y | ||
674 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
675 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
676 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
677 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
678 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
679 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
680 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
681 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
682 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
683 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
684 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
685 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
686 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
687 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
688 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
689 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
690 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
691 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
692 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
693 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
694 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
695 | # CONFIG_NLS_ISO8859_8 is not set | ||
696 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
697 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
698 | # CONFIG_NLS_ASCII is not set | ||
699 | # CONFIG_NLS_ISO8859_1 is not set | ||
700 | # CONFIG_NLS_ISO8859_2 is not set | ||
701 | # CONFIG_NLS_ISO8859_3 is not set | ||
702 | # CONFIG_NLS_ISO8859_4 is not set | ||
703 | # CONFIG_NLS_ISO8859_5 is not set | ||
704 | # CONFIG_NLS_ISO8859_6 is not set | ||
705 | # CONFIG_NLS_ISO8859_7 is not set | ||
706 | # CONFIG_NLS_ISO8859_9 is not set | ||
707 | # CONFIG_NLS_ISO8859_13 is not set | ||
708 | # CONFIG_NLS_ISO8859_14 is not set | ||
709 | # CONFIG_NLS_ISO8859_15 is not set | ||
710 | # CONFIG_NLS_KOI8_R is not set | ||
711 | # CONFIG_NLS_KOI8_U is not set | ||
712 | # CONFIG_NLS_UTF8 is not set | ||
713 | |||
714 | # | ||
715 | # Profiling support | ||
716 | # | ||
717 | # CONFIG_PROFILING is not set | ||
718 | |||
719 | # | ||
720 | # Kernel hacking | ||
721 | # | ||
722 | # CONFIG_DEBUG_KERNEL is not set | ||
723 | CONFIG_DEBUG_PREEMPT=y | ||
724 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
725 | # CONFIG_FRAME_POINTER is not set | ||
726 | |||
727 | # | ||
728 | # Security options | ||
729 | # | ||
730 | # CONFIG_KEYS is not set | ||
731 | # CONFIG_SECURITY is not set | ||
732 | |||
733 | # | ||
734 | # Cryptographic options | ||
735 | # | ||
736 | # CONFIG_CRYPTO is not set | ||
737 | |||
738 | # | ||
739 | # Hardware crypto devices | ||
740 | # | ||
741 | |||
742 | # | ||
743 | # Library routines | ||
744 | # | ||
745 | # CONFIG_CRC_CCITT is not set | ||
746 | CONFIG_CRC32=y | ||
747 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/m32r/m32700ut/dot.gdbinit_200MHz_16MB b/arch/m32r/m32700ut/dot.gdbinit_200MHz_16MB new file mode 100644 index 000000000000..525dab46982b --- /dev/null +++ b/arch/m32r/m32700ut/dot.gdbinit_200MHz_16MB | |||
@@ -0,0 +1,249 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id: dot.gdbinit_200MHz_16MB,v 1.2 2004/10/20 03:02:27 fujiwara Exp $ | ||
3 | #----- | ||
4 | # NOTE: this file is generated by a script, "gen_gdbinit.pl". | ||
5 | # (Please type "gen_gdbinit.pl --help" and check the help message). | ||
6 | # $ Id: gen_gdbinit.pl,v 1.12 2004/07/26 09:56:10 takata Exp $ | ||
7 | #----- | ||
8 | # target platform: m32700ut | ||
9 | |||
10 | # setting | ||
11 | set width 0d70 | ||
12 | set radix 0d16 | ||
13 | |||
14 | debug_chaos | ||
15 | |||
16 | # clk xin:cpu:bif:bus=25:200:50:50 | ||
17 | define clock_init | ||
18 | set *(unsigned long *)0x00ef4008 = 0x00000000 | ||
19 | set *(unsigned long *)0x00ef4004 = 0 | ||
20 | shell sleep 0.1 | ||
21 | # NOTE: Please change the master clock source from PLL-clock to Xin-clock | ||
22 | # and switch off PLL, before resetting the clock gear ratio. | ||
23 | |||
24 | set *(unsigned long *)0x00ef4024 = 2 | ||
25 | set *(unsigned long *)0x00ef4020 = 2 | ||
26 | set *(unsigned long *)0x00ef4010 = 0 | ||
27 | set *(unsigned long *)0x00ef4014 = 0 | ||
28 | set *(unsigned long *)0x00ef4004 = 3 | ||
29 | shell sleep 0.1 | ||
30 | set *(unsigned long *)0x00ef4008 = 0x00000200 | ||
31 | end | ||
32 | |||
33 | # Initialize SDRAM controller | ||
34 | define sdram_init | ||
35 | # SDIR0 | ||
36 | set *(unsigned long *)0x00ef6008 = 0x00000182 | ||
37 | # SDIR1 | ||
38 | set *(unsigned long *)0x00ef600c = 0x00000001 | ||
39 | # Initialize wait | ||
40 | shell sleep 0.1 | ||
41 | # Ch0-MOD | ||
42 | set *(unsigned long *)0x00ef602c = 0x00000020 | ||
43 | # Ch0-TR | ||
44 | set *(unsigned long *)0x00ef6028 = 0x00041302 | ||
45 | # Ch0-ADR (size:16MB) | ||
46 | set *(unsigned long *)0x00ef6020 = 0x08000002 | ||
47 | # AutoRef On | ||
48 | set *(unsigned long *)0x00ef6004 = 0x00010517 | ||
49 | # Access enable | ||
50 | set *(unsigned long *)0x00ef6024 = 0x00000001 | ||
51 | end | ||
52 | document sdram_init | ||
53 | SDRAM controller initialization | ||
54 | 0x08000000 - 0x08ffffff (16MB) | ||
55 | end | ||
56 | |||
57 | # Initialize BSEL3 for UT-CFC | ||
58 | define cfc_init | ||
59 | set $sfrbase = 0xa0ef0000 | ||
60 | # too fast | ||
61 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x0b0b8000 | ||
62 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x00102204 | ||
63 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x1f1f8000 | ||
64 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x1f1f1fdf | ||
65 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x0013220f | ||
66 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x0013330f | ||
67 | end | ||
68 | document cfc_init | ||
69 | CF controller initialization | ||
70 | end | ||
71 | |||
72 | # MMU enable | ||
73 | define mmu_enable | ||
74 | set $evb=0x88000000 | ||
75 | set *(unsigned long *)0xffff0024=1 | ||
76 | end | ||
77 | |||
78 | # MMU disable | ||
79 | define mmu_disable | ||
80 | set $evb=0 | ||
81 | set *(unsigned long *)0xffff0024=0 | ||
82 | end | ||
83 | |||
84 | # Show TLB entries | ||
85 | define show_tlb_entries | ||
86 | set $i = 0 | ||
87 | set $addr = $arg0 | ||
88 | set $nr_entries = $arg1 | ||
89 | use_mon_code | ||
90 | while ($i < $nr_entries) | ||
91 | set $tlb_tag = *(unsigned long*)$addr | ||
92 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
93 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
94 | set $i = $i + 1 | ||
95 | set $addr = $addr + 8 | ||
96 | end | ||
97 | use_debug_dma | ||
98 | end | ||
99 | define itlb | ||
100 | set $itlb=0xfe000000 | ||
101 | show_tlb_entries $itlb 0d32 | ||
102 | end | ||
103 | define dtlb | ||
104 | set $dtlb=0xfe000800 | ||
105 | show_tlb_entries $dtlb 0d32 | ||
106 | end | ||
107 | |||
108 | # Initialize TLB entries | ||
109 | define init_tlb_entries | ||
110 | set $i = 0 | ||
111 | set $addr = $arg0 | ||
112 | set $nr_entries = $arg1 | ||
113 | use_mon_code | ||
114 | while ($i < $nr_entries) | ||
115 | set *(unsigned long *)($addr + 0x4) = 0 | ||
116 | set $i = $i + 1 | ||
117 | set $addr = $addr + 8 | ||
118 | end | ||
119 | use_debug_dma | ||
120 | end | ||
121 | define tlb_init | ||
122 | set $itlb=0xfe000000 | ||
123 | init_tlb_entries $itlb 0d32 | ||
124 | set $dtlb=0xfe000800 | ||
125 | init_tlb_entries $dtlb 0d32 | ||
126 | end | ||
127 | |||
128 | # Show current task structure | ||
129 | define show_current | ||
130 | set $current = $spi & 0xffffe000 | ||
131 | printf "$current=0x%08lX\n",$current | ||
132 | print *(struct task_struct *)$current | ||
133 | end | ||
134 | |||
135 | # Show user assigned task structure | ||
136 | define show_task | ||
137 | set = $arg0 & 0xffffe000 | ||
138 | printf "$task=0x%08lX\n",$task | ||
139 | print *(struct task_struct *)$task | ||
140 | end | ||
141 | document show_task | ||
142 | Show user assigned task structure | ||
143 | arg0 : task structure address | ||
144 | end | ||
145 | |||
146 | # Show M32R registers | ||
147 | define show_regs | ||
148 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
149 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
150 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
151 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$sp | ||
152 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
153 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
154 | printf "EVB[0x%08lX]\n",$evb | ||
155 | end | ||
156 | |||
157 | # Setup all | ||
158 | define setup | ||
159 | use_mon_code | ||
160 | set *(unsigned int)0xfffffffc=0x60 | ||
161 | shell sleep 0.1 | ||
162 | clock_init | ||
163 | shell sleep 0.1 | ||
164 | # SDRAM: 16MB | ||
165 | set *(unsigned long *)0x00ef6020 = 0x08000002 | ||
166 | cfc_init | ||
167 | # USB | ||
168 | set *(unsigned short *)0xb0301000 = 0x100 | ||
169 | |||
170 | set $evb=0x08000000 | ||
171 | end | ||
172 | |||
173 | # Load modules | ||
174 | define load_modules | ||
175 | use_debug_dma | ||
176 | load | ||
177 | end | ||
178 | |||
179 | # Set kernel parameters | ||
180 | define set_kernel_parameters | ||
181 | set $param = (void*)0x08001000 | ||
182 | # INITRD_START | ||
183 | # set *(unsigned long *)($param + 0x0010) = 0x08300000 | ||
184 | # INITRD_SIZE | ||
185 | # set *(unsigned long *)($param + 0x0014) = 0x00000000 | ||
186 | # M32R_CPUCLK | ||
187 | set *(unsigned long *)($param + 0x0018) = 0d200000000 | ||
188 | # M32R_BUSCLK | ||
189 | set *(unsigned long *)($param + 0x001c) = 0d50000000 | ||
190 | |||
191 | # M32R_TIMER_DIVIDE | ||
192 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
193 | |||
194 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x console=tty1 root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/rootfs,rsize=1024,wsize=1024 nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 mem=16M \0" | ||
195 | end | ||
196 | |||
197 | # Boot | ||
198 | define boot | ||
199 | set_kernel_parameters | ||
200 | set $fp = 0 | ||
201 | set $pc = 0x08002000 | ||
202 | # set *(unsigned char *)0xffffffff = 0x03 | ||
203 | si | ||
204 | c | ||
205 | end | ||
206 | |||
207 | # Set breakpoints | ||
208 | define set_breakpoints | ||
209 | b *0x08000030 | ||
210 | end | ||
211 | |||
212 | # Restart | ||
213 | define restart | ||
214 | sdireset | ||
215 | sdireset | ||
216 | set $pc = 0 | ||
217 | b *0x04001000 | ||
218 | b *0x08001000 | ||
219 | b *0x08002000 | ||
220 | si | ||
221 | c | ||
222 | tlb_init | ||
223 | del | ||
224 | setup | ||
225 | load_modules | ||
226 | boot | ||
227 | end | ||
228 | |||
229 | define si | ||
230 | stepi | ||
231 | x/i $pc | ||
232 | show_reg | ||
233 | end | ||
234 | |||
235 | sdireset | ||
236 | sdireset | ||
237 | file vmlinux | ||
238 | target m32rsdi | ||
239 | set $pc = 0 | ||
240 | b *0x04001000 | ||
241 | b *0x08001000 | ||
242 | b *0x08002000 | ||
243 | c | ||
244 | tlb_init | ||
245 | del | ||
246 | setup | ||
247 | load_modules | ||
248 | boot | ||
249 | |||
diff --git a/arch/m32r/m32700ut/dot.gdbinit_300MHz_32MB b/arch/m32r/m32700ut/dot.gdbinit_300MHz_32MB new file mode 100644 index 000000000000..aa503657a49b --- /dev/null +++ b/arch/m32r/m32700ut/dot.gdbinit_300MHz_32MB | |||
@@ -0,0 +1,249 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id: dot.gdbinit_300MHz_32MB,v 1.2 2004/10/20 03:02:27 fujiwara Exp $ | ||
3 | #----- | ||
4 | # NOTE: this file is generated by a script, "gen_gdbinit.pl". | ||
5 | # (Please type "gen_gdbinit.pl --help" and check the help message). | ||
6 | # $ Id: gen_gdbinit.pl,v 1.12 2004/07/26 09:56:10 takata Exp $ | ||
7 | #----- | ||
8 | # target platform: m32700ut | ||
9 | |||
10 | # setting | ||
11 | set width 0d70 | ||
12 | set radix 0d16 | ||
13 | |||
14 | debug_chaos | ||
15 | |||
16 | # clk xin:cpu:bif:bus=25:300:75:75 | ||
17 | define clock_init | ||
18 | set *(unsigned long *)0x00ef4008 = 0x00000000 | ||
19 | set *(unsigned long *)0x00ef4004 = 0 | ||
20 | shell sleep 0.1 | ||
21 | # NOTE: Please change the master clock source from PLL-clock to Xin-clock | ||
22 | # and switch off PLL, before resetting the clock gear ratio. | ||
23 | |||
24 | set *(unsigned long *)0x00ef4024 = 2 | ||
25 | set *(unsigned long *)0x00ef4020 = 2 | ||
26 | set *(unsigned long *)0x00ef4010 = 0 | ||
27 | set *(unsigned long *)0x00ef4014 = 0 | ||
28 | set *(unsigned long *)0x00ef4004 = 5 | ||
29 | shell sleep 0.1 | ||
30 | set *(unsigned long *)0x00ef4008 = 0x00000200 | ||
31 | end | ||
32 | |||
33 | # Initialize SDRAM controller | ||
34 | define sdram_init | ||
35 | # SDIR0 | ||
36 | set *(unsigned long *)0x00ef6008 = 0x00000182 | ||
37 | # SDIR1 | ||
38 | set *(unsigned long *)0x00ef600c = 0x00000001 | ||
39 | # Initialize wait | ||
40 | shell sleep 0.1 | ||
41 | # Ch0-MOD | ||
42 | set *(unsigned long *)0x00ef602c = 0x00000020 | ||
43 | # Ch0-TR | ||
44 | set *(unsigned long *)0x00ef6028 = 0x00051502 | ||
45 | # Ch0-ADR (size:32MB) | ||
46 | set *(unsigned long *)0x00ef6020 = 0x08000003 | ||
47 | # AutoRef On | ||
48 | set *(unsigned long *)0x00ef6004 = 0x00010e24 | ||
49 | # Access enable | ||
50 | set *(unsigned long *)0x00ef6024 = 0x00000001 | ||
51 | end | ||
52 | document sdram_init | ||
53 | SDRAM controller initialization | ||
54 | 0x08000000 - 0x09ffffff (32MB) | ||
55 | end | ||
56 | |||
57 | # Initialize BSEL3 for UT-CFC | ||
58 | define cfc_init | ||
59 | set $sfrbase = 0xa0ef0000 | ||
60 | # too fast | ||
61 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x0b0b8000 | ||
62 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x00102204 | ||
63 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x1f1f8000 | ||
64 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x1f1f1fdf | ||
65 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x0013220f | ||
66 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x0013330f | ||
67 | end | ||
68 | document cfc_init | ||
69 | CF controller initialization | ||
70 | end | ||
71 | |||
72 | # MMU enable | ||
73 | define mmu_enable | ||
74 | set $evb=0x88000000 | ||
75 | set *(unsigned long *)0xffff0024=1 | ||
76 | end | ||
77 | |||
78 | # MMU disable | ||
79 | define mmu_disable | ||
80 | set $evb=0 | ||
81 | set *(unsigned long *)0xffff0024=0 | ||
82 | end | ||
83 | |||
84 | # Show TLB entries | ||
85 | define show_tlb_entries | ||
86 | set $i = 0 | ||
87 | set $addr = $arg0 | ||
88 | set $nr_entries = $arg1 | ||
89 | use_mon_code | ||
90 | while ($i < $nr_entries) | ||
91 | set $tlb_tag = *(unsigned long*)$addr | ||
92 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
93 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
94 | set $i = $i + 1 | ||
95 | set $addr = $addr + 8 | ||
96 | end | ||
97 | use_debug_dma | ||
98 | end | ||
99 | define itlb | ||
100 | set $itlb=0xfe000000 | ||
101 | show_tlb_entries $itlb 0d32 | ||
102 | end | ||
103 | define dtlb | ||
104 | set $dtlb=0xfe000800 | ||
105 | show_tlb_entries $dtlb 0d32 | ||
106 | end | ||
107 | |||
108 | # Initialize TLB entries | ||
109 | define init_tlb_entries | ||
110 | set $i = 0 | ||
111 | set $addr = $arg0 | ||
112 | set $nr_entries = $arg1 | ||
113 | use_mon_code | ||
114 | while ($i < $nr_entries) | ||
115 | set *(unsigned long *)($addr + 0x4) = 0 | ||
116 | set $i = $i + 1 | ||
117 | set $addr = $addr + 8 | ||
118 | end | ||
119 | use_debug_dma | ||
120 | end | ||
121 | define tlb_init | ||
122 | set $itlb=0xfe000000 | ||
123 | init_tlb_entries $itlb 0d32 | ||
124 | set $dtlb=0xfe000800 | ||
125 | init_tlb_entries $dtlb 0d32 | ||
126 | end | ||
127 | |||
128 | # Show current task structure | ||
129 | define show_current | ||
130 | set $current = $spi & 0xffffe000 | ||
131 | printf "$current=0x%08lX\n",$current | ||
132 | print *(struct task_struct *)$current | ||
133 | end | ||
134 | |||
135 | # Show user assigned task structure | ||
136 | define show_task | ||
137 | set = $arg0 & 0xffffe000 | ||
138 | printf "$task=0x%08lX\n",$task | ||
139 | print *(struct task_struct *)$task | ||
140 | end | ||
141 | document show_task | ||
142 | Show user assigned task structure | ||
143 | arg0 : task structure address | ||
144 | end | ||
145 | |||
146 | # Show M32R registers | ||
147 | define show_regs | ||
148 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
149 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
150 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
151 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$sp | ||
152 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
153 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
154 | printf "EVB[0x%08lX]\n",$evb | ||
155 | end | ||
156 | |||
157 | # Setup all | ||
158 | define setup | ||
159 | use_mon_code | ||
160 | set *(unsigned int)0xfffffffc=0x60 | ||
161 | shell sleep 0.1 | ||
162 | clock_init | ||
163 | shell sleep 0.1 | ||
164 | # SDRAM: 32MB | ||
165 | set *(unsigned long *)0x00ef6020 = 0x08000003 | ||
166 | cfc_init | ||
167 | # USB | ||
168 | set *(unsigned short *)0xb0301000 = 0x100 | ||
169 | |||
170 | set $evb=0x08000000 | ||
171 | end | ||
172 | |||
173 | # Load modules | ||
174 | define load_modules | ||
175 | use_debug_dma | ||
176 | load | ||
177 | end | ||
178 | |||
179 | # Set kernel parameters | ||
180 | define set_kernel_parameters | ||
181 | set $param = (void*)0x08001000 | ||
182 | # INITRD_START | ||
183 | # set *(unsigned long *)($param + 0x0010) = 0x08300000 | ||
184 | # INITRD_SIZE | ||
185 | # set *(unsigned long *)($param + 0x0014) = 0x00000000 | ||
186 | # M32R_CPUCLK | ||
187 | set *(unsigned long *)($param + 0x0018) = 0d300000000 | ||
188 | # M32R_BUSCLK | ||
189 | set *(unsigned long *)($param + 0x001c) = 0d75000000 | ||
190 | |||
191 | # M32R_TIMER_DIVIDE | ||
192 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
193 | |||
194 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x console=tty1 root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/rootfs,rsize=1024,wsize=1024 nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 mem=32M \0" | ||
195 | end | ||
196 | |||
197 | # Boot | ||
198 | define boot | ||
199 | set_kernel_parameters | ||
200 | set $fp = 0 | ||
201 | set $pc = 0x08002000 | ||
202 | # set *(unsigned char *)0xffffffff = 0x03 | ||
203 | si | ||
204 | c | ||
205 | end | ||
206 | |||
207 | # Set breakpoints | ||
208 | define set_breakpoints | ||
209 | b *0x08000030 | ||
210 | end | ||
211 | |||
212 | # Restart | ||
213 | define restart | ||
214 | sdireset | ||
215 | sdireset | ||
216 | set $pc = 0 | ||
217 | b *0x04001000 | ||
218 | b *0x08001000 | ||
219 | b *0x08002000 | ||
220 | si | ||
221 | c | ||
222 | tlb_init | ||
223 | del | ||
224 | setup | ||
225 | load_modules | ||
226 | boot | ||
227 | end | ||
228 | |||
229 | define si | ||
230 | stepi | ||
231 | x/i $pc | ||
232 | show_reg | ||
233 | end | ||
234 | |||
235 | sdireset | ||
236 | sdireset | ||
237 | file vmlinux | ||
238 | target m32rsdi | ||
239 | set $pc = 0 | ||
240 | b *0x04001000 | ||
241 | b *0x08001000 | ||
242 | b *0x08002000 | ||
243 | c | ||
244 | tlb_init | ||
245 | del | ||
246 | setup | ||
247 | load_modules | ||
248 | boot | ||
249 | |||
diff --git a/arch/m32r/m32700ut/dot.gdbinit_400MHz_32MB b/arch/m32r/m32700ut/dot.gdbinit_400MHz_32MB new file mode 100644 index 000000000000..adc608aab2fe --- /dev/null +++ b/arch/m32r/m32700ut/dot.gdbinit_400MHz_32MB | |||
@@ -0,0 +1,249 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id: dot.gdbinit_400MHz_32MB,v 1.1 2004/10/21 01:41:27 fujiwara Exp $ | ||
3 | #----- | ||
4 | # NOTE: this file is generated by a script, "gen_gdbinit.pl". | ||
5 | # (Please type "gen_gdbinit.pl --help" and check the help message). | ||
6 | # $ Id: gen_gdbinit.pl,v 1.12 2004/07/26 09:56:10 takata Exp $ | ||
7 | #----- | ||
8 | # target platform: m32700ut | ||
9 | |||
10 | # setting | ||
11 | set width 0d70 | ||
12 | set radix 0d16 | ||
13 | |||
14 | debug_chaos | ||
15 | |||
16 | # clk xin:cpu:bif:bus=25:400:100:50 | ||
17 | define clock_init | ||
18 | set *(unsigned long *)0x00ef4008 = 0x00000000 | ||
19 | set *(unsigned long *)0x00ef4004 = 0 | ||
20 | shell sleep 0.1 | ||
21 | # NOTE: Please change the master clock source from PLL-clock to Xin-clock | ||
22 | # and switch off PLL, before resetting the clock gear ratio. | ||
23 | |||
24 | set *(unsigned long *)0x00ef4024 = 3 | ||
25 | set *(unsigned long *)0x00ef4020 = 2 | ||
26 | set *(unsigned long *)0x00ef4010 = 0 | ||
27 | set *(unsigned long *)0x00ef4014 = 0 | ||
28 | set *(unsigned long *)0x00ef4004 = 7 | ||
29 | shell sleep 0.1 | ||
30 | set *(unsigned long *)0x00ef4008 = 0x00000200 | ||
31 | end | ||
32 | |||
33 | # Initialize SDRAM controller | ||
34 | define sdram_init | ||
35 | # SDIR0 | ||
36 | set *(unsigned long *)0x00ef6008 = 0x00000182 | ||
37 | # SDIR1 | ||
38 | set *(unsigned long *)0x00ef600c = 0x00000001 | ||
39 | # Initialize wait | ||
40 | shell sleep 0.1 | ||
41 | # Ch0-MOD | ||
42 | set *(unsigned long *)0x00ef602c = 0x00000020 | ||
43 | # Ch0-TR | ||
44 | set *(unsigned long *)0x00ef6028 = 0x00041302 | ||
45 | # Ch0-ADR (size:32MB) | ||
46 | set *(unsigned long *)0x00ef6020 = 0x08000003 | ||
47 | # AutoRef On | ||
48 | set *(unsigned long *)0x00ef6004 = 0x00010517 | ||
49 | # Access enable | ||
50 | set *(unsigned long *)0x00ef6024 = 0x00000001 | ||
51 | end | ||
52 | document sdram_init | ||
53 | SDRAM controller initialization | ||
54 | 0x08000000 - 0x09ffffff (32MB) | ||
55 | end | ||
56 | |||
57 | # Initialize BSEL3 for UT-CFC | ||
58 | define cfc_init | ||
59 | set $sfrbase = 0xa0ef0000 | ||
60 | # too fast | ||
61 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x0b0b8000 | ||
62 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x00102204 | ||
63 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x1f1f8000 | ||
64 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x1f1f1fdf | ||
65 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x0013220f | ||
66 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x0013330f | ||
67 | end | ||
68 | document cfc_init | ||
69 | CF controller initialization | ||
70 | end | ||
71 | |||
72 | # MMU enable | ||
73 | define mmu_enable | ||
74 | set $evb=0x88000000 | ||
75 | set *(unsigned long *)0xffff0024=1 | ||
76 | end | ||
77 | |||
78 | # MMU disable | ||
79 | define mmu_disable | ||
80 | set $evb=0 | ||
81 | set *(unsigned long *)0xffff0024=0 | ||
82 | end | ||
83 | |||
84 | # Show TLB entries | ||
85 | define show_tlb_entries | ||
86 | set $i = 0 | ||
87 | set $addr = $arg0 | ||
88 | set $nr_entries = $arg1 | ||
89 | use_mon_code | ||
90 | while ($i < $nr_entries) | ||
91 | set $tlb_tag = *(unsigned long*)$addr | ||
92 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
93 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
94 | set $i = $i + 1 | ||
95 | set $addr = $addr + 8 | ||
96 | end | ||
97 | use_debug_dma | ||
98 | end | ||
99 | define itlb | ||
100 | set $itlb=0xfe000000 | ||
101 | show_tlb_entries $itlb 0d32 | ||
102 | end | ||
103 | define dtlb | ||
104 | set $dtlb=0xfe000800 | ||
105 | show_tlb_entries $dtlb 0d32 | ||
106 | end | ||
107 | |||
108 | # Initialize TLB entries | ||
109 | define init_tlb_entries | ||
110 | set $i = 0 | ||
111 | set $addr = $arg0 | ||
112 | set $nr_entries = $arg1 | ||
113 | use_mon_code | ||
114 | while ($i < $nr_entries) | ||
115 | set *(unsigned long *)($addr + 0x4) = 0 | ||
116 | set $i = $i + 1 | ||
117 | set $addr = $addr + 8 | ||
118 | end | ||
119 | use_debug_dma | ||
120 | end | ||
121 | define tlb_init | ||
122 | set $itlb=0xfe000000 | ||
123 | init_tlb_entries $itlb 0d32 | ||
124 | set $dtlb=0xfe000800 | ||
125 | init_tlb_entries $dtlb 0d32 | ||
126 | end | ||
127 | |||
128 | # Show current task structure | ||
129 | define show_current | ||
130 | set $current = $spi & 0xffffe000 | ||
131 | printf "$current=0x%08lX\n",$current | ||
132 | print *(struct task_struct *)$current | ||
133 | end | ||
134 | |||
135 | # Show user assigned task structure | ||
136 | define show_task | ||
137 | set = $arg0 & 0xffffe000 | ||
138 | printf "$task=0x%08lX\n",$task | ||
139 | print *(struct task_struct *)$task | ||
140 | end | ||
141 | document show_task | ||
142 | Show user assigned task structure | ||
143 | arg0 : task structure address | ||
144 | end | ||
145 | |||
146 | # Show M32R registers | ||
147 | define show_regs | ||
148 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
149 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
150 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
151 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$sp | ||
152 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
153 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
154 | printf "EVB[0x%08lX]\n",$evb | ||
155 | end | ||
156 | |||
157 | # Setup all | ||
158 | define setup | ||
159 | use_mon_code | ||
160 | set *(unsigned int)0xfffffffc=0x60 | ||
161 | shell sleep 0.1 | ||
162 | clock_init | ||
163 | shell sleep 0.1 | ||
164 | # SDRAM: 32MB | ||
165 | set *(unsigned long *)0x00ef6020 = 0x08000003 | ||
166 | cfc_init | ||
167 | # USB | ||
168 | set *(unsigned short *)0xb0301000 = 0x100 | ||
169 | |||
170 | set $evb=0x08000000 | ||
171 | end | ||
172 | |||
173 | # Load modules | ||
174 | define load_modules | ||
175 | use_debug_dma | ||
176 | load | ||
177 | end | ||
178 | |||
179 | # Set kernel parameters | ||
180 | define set_kernel_parameters | ||
181 | set $param = (void*)0x08001000 | ||
182 | # INITRD_START | ||
183 | # set *(unsigned long *)($param + 0x0010) = 0x08300000 | ||
184 | # INITRD_SIZE | ||
185 | # set *(unsigned long *)($param + 0x0014) = 0x00000000 | ||
186 | # M32R_CPUCLK | ||
187 | set *(unsigned long *)($param + 0x0018) = 0d400000000 | ||
188 | # M32R_BUSCLK | ||
189 | set *(unsigned long *)($param + 0x001c) = 0d50000000 | ||
190 | |||
191 | # M32R_TIMER_DIVIDE | ||
192 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
193 | |||
194 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x console=tty1 root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/rootfs,rsize=1024,wsize=1024 nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 mem=32M \0" | ||
195 | end | ||
196 | |||
197 | # Boot | ||
198 | define boot | ||
199 | set_kernel_parameters | ||
200 | set $fp = 0 | ||
201 | set $pc = 0x08002000 | ||
202 | # set *(unsigned char *)0xffffffff = 0x03 | ||
203 | si | ||
204 | c | ||
205 | end | ||
206 | |||
207 | # Set breakpoints | ||
208 | define set_breakpoints | ||
209 | b *0x08000030 | ||
210 | end | ||
211 | |||
212 | # Restart | ||
213 | define restart | ||
214 | sdireset | ||
215 | sdireset | ||
216 | set $pc = 0 | ||
217 | b *0x04001000 | ||
218 | b *0x08001000 | ||
219 | b *0x08002000 | ||
220 | si | ||
221 | c | ||
222 | tlb_init | ||
223 | del | ||
224 | setup | ||
225 | load_modules | ||
226 | boot | ||
227 | end | ||
228 | |||
229 | define si | ||
230 | stepi | ||
231 | x/i $pc | ||
232 | show_reg | ||
233 | end | ||
234 | |||
235 | sdireset | ||
236 | sdireset | ||
237 | file vmlinux | ||
238 | target m32rsdi | ||
239 | set $pc = 0 | ||
240 | b *0x04001000 | ||
241 | b *0x08001000 | ||
242 | b *0x08002000 | ||
243 | c | ||
244 | tlb_init | ||
245 | del | ||
246 | setup | ||
247 | load_modules | ||
248 | boot | ||
249 | |||
diff --git a/arch/m32r/mappi/defconfig.nommu b/arch/m32r/mappi/defconfig.nommu new file mode 100644 index 000000000000..714aa6e7034c --- /dev/null +++ b/arch/m32r/mappi/defconfig.nommu | |||
@@ -0,0 +1,623 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:10:57 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | CONFIG_CLEAN_COMPILE=y | ||
17 | CONFIG_BROKEN_ON_SMP=y | ||
18 | CONFIG_LOCK_KERNEL=y | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_LOCALVERSION="" | ||
24 | # CONFIG_POSIX_MQUEUE is not set | ||
25 | CONFIG_BSD_PROCESS_ACCT=y | ||
26 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
27 | CONFIG_SYSCTL=y | ||
28 | # CONFIG_AUDIT is not set | ||
29 | CONFIG_LOG_BUF_SHIFT=14 | ||
30 | CONFIG_HOTPLUG=y | ||
31 | CONFIG_KOBJECT_UEVENT=y | ||
32 | CONFIG_IKCONFIG=y | ||
33 | # CONFIG_IKCONFIG_PROC is not set | ||
34 | CONFIG_EMBEDDED=y | ||
35 | # CONFIG_KALLSYMS is not set | ||
36 | # CONFIG_FUTEX is not set | ||
37 | # CONFIG_EPOLL is not set | ||
38 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
39 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
40 | CONFIG_CC_ALIGN_LABELS=0 | ||
41 | CONFIG_CC_ALIGN_LOOPS=0 | ||
42 | CONFIG_CC_ALIGN_JUMPS=0 | ||
43 | CONFIG_TINY_SHMEM=y | ||
44 | |||
45 | # | ||
46 | # Loadable module support | ||
47 | # | ||
48 | CONFIG_MODULES=y | ||
49 | CONFIG_MODULE_UNLOAD=y | ||
50 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
51 | CONFIG_OBSOLETE_MODPARM=y | ||
52 | # CONFIG_MODVERSIONS is not set | ||
53 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
54 | CONFIG_KMOD=y | ||
55 | |||
56 | # | ||
57 | # Processor type and features | ||
58 | # | ||
59 | CONFIG_PLAT_MAPPI=y | ||
60 | # CONFIG_PLAT_USRV is not set | ||
61 | # CONFIG_PLAT_M32700UT is not set | ||
62 | # CONFIG_PLAT_OPSPUT is not set | ||
63 | # CONFIG_PLAT_OAKS32R is not set | ||
64 | # CONFIG_PLAT_MAPPI2 is not set | ||
65 | CONFIG_CHIP_M32700=y | ||
66 | # CONFIG_CHIP_M32102 is not set | ||
67 | # CONFIG_CHIP_VDEC2 is not set | ||
68 | # CONFIG_CHIP_OPSP is not set | ||
69 | # CONFIG_MMU is not set | ||
70 | CONFIG_TLB_ENTRIES=32 | ||
71 | CONFIG_ISA_M32R2=y | ||
72 | CONFIG_ISA_DSP_LEVEL2=y | ||
73 | CONFIG_ISA_DUAL_ISSUE=y | ||
74 | CONFIG_BUS_CLOCK=50000000 | ||
75 | CONFIG_TIMER_DIVIDE=128 | ||
76 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
77 | CONFIG_MEMORY_START=0x00000000 | ||
78 | CONFIG_MEMORY_SIZE=0x00E00000 | ||
79 | CONFIG_NOHIGHMEM=y | ||
80 | # CONFIG_DISCONTIGMEM is not set | ||
81 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
82 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
83 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
84 | CONFIG_PREEMPT=y | ||
85 | # CONFIG_HAVE_DEC_LOCK is not set | ||
86 | # CONFIG_SMP is not set | ||
87 | |||
88 | # | ||
89 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
90 | # | ||
91 | # CONFIG_PCI is not set | ||
92 | # CONFIG_ISA is not set | ||
93 | |||
94 | # | ||
95 | # PCCARD (PCMCIA/CardBus) support | ||
96 | # | ||
97 | CONFIG_PCCARD=y | ||
98 | # CONFIG_PCMCIA_DEBUG is not set | ||
99 | CONFIG_PCMCIA=y | ||
100 | |||
101 | # | ||
102 | # PC-card bridges | ||
103 | # | ||
104 | # CONFIG_TCIC is not set | ||
105 | CONFIG_M32R_PCC=y | ||
106 | |||
107 | # | ||
108 | # PCI Hotplug Support | ||
109 | # | ||
110 | |||
111 | # | ||
112 | # Executable file formats | ||
113 | # | ||
114 | CONFIG_BINFMT_FLAT=y | ||
115 | # CONFIG_BINFMT_ZFLAT is not set | ||
116 | # CONFIG_BINFMT_SHARED_FLAT is not set | ||
117 | # CONFIG_BINFMT_MISC is not set | ||
118 | |||
119 | # | ||
120 | # Device Drivers | ||
121 | # | ||
122 | |||
123 | # | ||
124 | # Generic Driver Options | ||
125 | # | ||
126 | CONFIG_STANDALONE=y | ||
127 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
128 | # CONFIG_FW_LOADER is not set | ||
129 | |||
130 | # | ||
131 | # Memory Technology Devices (MTD) | ||
132 | # | ||
133 | # CONFIG_MTD is not set | ||
134 | |||
135 | # | ||
136 | # Parallel port support | ||
137 | # | ||
138 | # CONFIG_PARPORT is not set | ||
139 | |||
140 | # | ||
141 | # Plug and Play support | ||
142 | # | ||
143 | |||
144 | # | ||
145 | # Block devices | ||
146 | # | ||
147 | # CONFIG_BLK_DEV_FD is not set | ||
148 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
149 | CONFIG_BLK_DEV_LOOP=y | ||
150 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
151 | CONFIG_BLK_DEV_NBD=y | ||
152 | CONFIG_BLK_DEV_RAM=y | ||
153 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
154 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
155 | # CONFIG_BLK_DEV_INITRD is not set | ||
156 | CONFIG_INITRAMFS_SOURCE="" | ||
157 | # CONFIG_CDROM_PKTCDVD is not set | ||
158 | |||
159 | # | ||
160 | # IO Schedulers | ||
161 | # | ||
162 | CONFIG_IOSCHED_NOOP=y | ||
163 | # CONFIG_IOSCHED_AS is not set | ||
164 | CONFIG_IOSCHED_DEADLINE=y | ||
165 | CONFIG_IOSCHED_CFQ=y | ||
166 | # CONFIG_ATA_OVER_ETH is not set | ||
167 | |||
168 | # | ||
169 | # ATA/ATAPI/MFM/RLL support | ||
170 | # | ||
171 | # CONFIG_IDE is not set | ||
172 | |||
173 | # | ||
174 | # SCSI device support | ||
175 | # | ||
176 | # CONFIG_SCSI is not set | ||
177 | |||
178 | # | ||
179 | # Multi-device support (RAID and LVM) | ||
180 | # | ||
181 | # CONFIG_MD is not set | ||
182 | |||
183 | # | ||
184 | # Fusion MPT device support | ||
185 | # | ||
186 | |||
187 | # | ||
188 | # IEEE 1394 (FireWire) support | ||
189 | # | ||
190 | |||
191 | # | ||
192 | # I2O device support | ||
193 | # | ||
194 | |||
195 | # | ||
196 | # Networking support | ||
197 | # | ||
198 | CONFIG_NET=y | ||
199 | |||
200 | # | ||
201 | # Networking options | ||
202 | # | ||
203 | CONFIG_PACKET=y | ||
204 | # CONFIG_PACKET_MMAP is not set | ||
205 | # CONFIG_NETLINK_DEV is not set | ||
206 | CONFIG_UNIX=y | ||
207 | # CONFIG_NET_KEY is not set | ||
208 | CONFIG_INET=y | ||
209 | # CONFIG_IP_MULTICAST is not set | ||
210 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
211 | CONFIG_IP_PNP=y | ||
212 | CONFIG_IP_PNP_DHCP=y | ||
213 | # CONFIG_IP_PNP_BOOTP is not set | ||
214 | # CONFIG_IP_PNP_RARP is not set | ||
215 | # CONFIG_NET_IPIP is not set | ||
216 | # CONFIG_NET_IPGRE is not set | ||
217 | # CONFIG_ARPD is not set | ||
218 | # CONFIG_SYN_COOKIES is not set | ||
219 | # CONFIG_INET_AH is not set | ||
220 | # CONFIG_INET_ESP is not set | ||
221 | # CONFIG_INET_IPCOMP is not set | ||
222 | # CONFIG_INET_TUNNEL is not set | ||
223 | CONFIG_IP_TCPDIAG=y | ||
224 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
225 | # CONFIG_IPV6 is not set | ||
226 | # CONFIG_NETFILTER is not set | ||
227 | |||
228 | # | ||
229 | # SCTP Configuration (EXPERIMENTAL) | ||
230 | # | ||
231 | # CONFIG_IP_SCTP is not set | ||
232 | # CONFIG_ATM is not set | ||
233 | # CONFIG_BRIDGE is not set | ||
234 | # CONFIG_VLAN_8021Q is not set | ||
235 | # CONFIG_DECNET is not set | ||
236 | # CONFIG_LLC2 is not set | ||
237 | # CONFIG_IPX is not set | ||
238 | # CONFIG_ATALK is not set | ||
239 | # CONFIG_X25 is not set | ||
240 | # CONFIG_LAPB is not set | ||
241 | # CONFIG_NET_DIVERT is not set | ||
242 | # CONFIG_ECONET is not set | ||
243 | # CONFIG_WAN_ROUTER is not set | ||
244 | |||
245 | # | ||
246 | # QoS and/or fair queueing | ||
247 | # | ||
248 | # CONFIG_NET_SCHED is not set | ||
249 | # CONFIG_NET_CLS_ROUTE is not set | ||
250 | |||
251 | # | ||
252 | # Network testing | ||
253 | # | ||
254 | # CONFIG_NET_PKTGEN is not set | ||
255 | # CONFIG_NETPOLL is not set | ||
256 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
257 | # CONFIG_HAMRADIO is not set | ||
258 | # CONFIG_IRDA is not set | ||
259 | # CONFIG_BT is not set | ||
260 | CONFIG_NETDEVICES=y | ||
261 | # CONFIG_DUMMY is not set | ||
262 | # CONFIG_BONDING is not set | ||
263 | # CONFIG_EQUALIZER is not set | ||
264 | # CONFIG_TUN is not set | ||
265 | |||
266 | # | ||
267 | # Ethernet (10 or 100Mbit) | ||
268 | # | ||
269 | # CONFIG_NET_ETHERNET is not set | ||
270 | CONFIG_NE2000=y | ||
271 | |||
272 | # | ||
273 | # Ethernet (1000 Mbit) | ||
274 | # | ||
275 | |||
276 | # | ||
277 | # Ethernet (10000 Mbit) | ||
278 | # | ||
279 | |||
280 | # | ||
281 | # Token Ring devices | ||
282 | # | ||
283 | |||
284 | # | ||
285 | # Wireless LAN (non-hamradio) | ||
286 | # | ||
287 | # CONFIG_NET_RADIO is not set | ||
288 | |||
289 | # | ||
290 | # PCMCIA network device support | ||
291 | # | ||
292 | # CONFIG_NET_PCMCIA is not set | ||
293 | |||
294 | # | ||
295 | # Wan interfaces | ||
296 | # | ||
297 | # CONFIG_WAN is not set | ||
298 | # CONFIG_PPP is not set | ||
299 | # CONFIG_SLIP is not set | ||
300 | # CONFIG_SHAPER is not set | ||
301 | # CONFIG_NETCONSOLE is not set | ||
302 | |||
303 | # | ||
304 | # ISDN subsystem | ||
305 | # | ||
306 | # CONFIG_ISDN is not set | ||
307 | |||
308 | # | ||
309 | # Telephony Support | ||
310 | # | ||
311 | # CONFIG_PHONE is not set | ||
312 | |||
313 | # | ||
314 | # Input device support | ||
315 | # | ||
316 | CONFIG_INPUT=y | ||
317 | |||
318 | # | ||
319 | # Userland interfaces | ||
320 | # | ||
321 | # CONFIG_INPUT_MOUSEDEV is not set | ||
322 | # CONFIG_INPUT_JOYDEV is not set | ||
323 | # CONFIG_INPUT_TSDEV is not set | ||
324 | # CONFIG_INPUT_EVDEV is not set | ||
325 | # CONFIG_INPUT_EVBUG is not set | ||
326 | |||
327 | # | ||
328 | # Input I/O drivers | ||
329 | # | ||
330 | # CONFIG_GAMEPORT is not set | ||
331 | CONFIG_SOUND_GAMEPORT=y | ||
332 | CONFIG_SERIO=y | ||
333 | # CONFIG_SERIO_I8042 is not set | ||
334 | CONFIG_SERIO_SERPORT=y | ||
335 | # CONFIG_SERIO_CT82C710 is not set | ||
336 | # CONFIG_SERIO_LIBPS2 is not set | ||
337 | # CONFIG_SERIO_RAW is not set | ||
338 | |||
339 | # | ||
340 | # Input Device Drivers | ||
341 | # | ||
342 | # CONFIG_INPUT_KEYBOARD is not set | ||
343 | # CONFIG_INPUT_MOUSE is not set | ||
344 | # CONFIG_INPUT_JOYSTICK is not set | ||
345 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
346 | # CONFIG_INPUT_MISC is not set | ||
347 | |||
348 | # | ||
349 | # Character devices | ||
350 | # | ||
351 | # CONFIG_VT is not set | ||
352 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
353 | |||
354 | # | ||
355 | # Serial drivers | ||
356 | # | ||
357 | # CONFIG_SERIAL_8250 is not set | ||
358 | |||
359 | # | ||
360 | # Non-8250 serial port support | ||
361 | # | ||
362 | CONFIG_SERIAL_CORE=y | ||
363 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
364 | CONFIG_SERIAL_M32R_SIO=y | ||
365 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
366 | # CONFIG_SERIAL_M32R_PLDSIO is not set | ||
367 | CONFIG_UNIX98_PTYS=y | ||
368 | CONFIG_LEGACY_PTYS=y | ||
369 | CONFIG_LEGACY_PTY_COUNT=256 | ||
370 | |||
371 | # | ||
372 | # IPMI | ||
373 | # | ||
374 | # CONFIG_IPMI_HANDLER is not set | ||
375 | |||
376 | # | ||
377 | # Watchdog Cards | ||
378 | # | ||
379 | # CONFIG_WATCHDOG is not set | ||
380 | # CONFIG_RTC is not set | ||
381 | # CONFIG_GEN_RTC is not set | ||
382 | # CONFIG_DTLK is not set | ||
383 | # CONFIG_R3964 is not set | ||
384 | |||
385 | # | ||
386 | # Ftape, the floppy tape device driver | ||
387 | # | ||
388 | # CONFIG_DRM is not set | ||
389 | |||
390 | # | ||
391 | # PCMCIA character devices | ||
392 | # | ||
393 | # CONFIG_SYNCLINK_CS is not set | ||
394 | # CONFIG_RAW_DRIVER is not set | ||
395 | |||
396 | # | ||
397 | # I2C support | ||
398 | # | ||
399 | # CONFIG_I2C is not set | ||
400 | |||
401 | # | ||
402 | # Dallas's 1-wire bus | ||
403 | # | ||
404 | # CONFIG_W1 is not set | ||
405 | |||
406 | # | ||
407 | # Misc devices | ||
408 | # | ||
409 | |||
410 | # | ||
411 | # Multimedia devices | ||
412 | # | ||
413 | # CONFIG_VIDEO_DEV is not set | ||
414 | |||
415 | # | ||
416 | # Digital Video Broadcasting Devices | ||
417 | # | ||
418 | # CONFIG_DVB is not set | ||
419 | |||
420 | # | ||
421 | # Graphics support | ||
422 | # | ||
423 | # CONFIG_FB is not set | ||
424 | |||
425 | # | ||
426 | # Sound | ||
427 | # | ||
428 | # CONFIG_SOUND is not set | ||
429 | |||
430 | # | ||
431 | # USB support | ||
432 | # | ||
433 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
434 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
435 | |||
436 | # | ||
437 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
438 | # | ||
439 | |||
440 | # | ||
441 | # USB Gadget Support | ||
442 | # | ||
443 | # CONFIG_USB_GADGET is not set | ||
444 | |||
445 | # | ||
446 | # MMC/SD Card support | ||
447 | # | ||
448 | # CONFIG_MMC is not set | ||
449 | |||
450 | # | ||
451 | # InfiniBand support | ||
452 | # | ||
453 | # CONFIG_INFINIBAND is not set | ||
454 | |||
455 | # | ||
456 | # File systems | ||
457 | # | ||
458 | CONFIG_EXT2_FS=y | ||
459 | # CONFIG_EXT2_FS_XATTR is not set | ||
460 | # CONFIG_EXT3_FS is not set | ||
461 | # CONFIG_JBD is not set | ||
462 | # CONFIG_REISERFS_FS is not set | ||
463 | # CONFIG_JFS_FS is not set | ||
464 | |||
465 | # | ||
466 | # XFS support | ||
467 | # | ||
468 | # CONFIG_XFS_FS is not set | ||
469 | # CONFIG_MINIX_FS is not set | ||
470 | # CONFIG_ROMFS_FS is not set | ||
471 | # CONFIG_QUOTA is not set | ||
472 | CONFIG_DNOTIFY=y | ||
473 | # CONFIG_AUTOFS_FS is not set | ||
474 | # CONFIG_AUTOFS4_FS is not set | ||
475 | |||
476 | # | ||
477 | # CD-ROM/DVD Filesystems | ||
478 | # | ||
479 | # CONFIG_ISO9660_FS is not set | ||
480 | # CONFIG_UDF_FS is not set | ||
481 | |||
482 | # | ||
483 | # DOS/FAT/NT Filesystems | ||
484 | # | ||
485 | # CONFIG_MSDOS_FS is not set | ||
486 | # CONFIG_VFAT_FS is not set | ||
487 | # CONFIG_NTFS_FS is not set | ||
488 | |||
489 | # | ||
490 | # Pseudo filesystems | ||
491 | # | ||
492 | CONFIG_PROC_FS=y | ||
493 | CONFIG_SYSFS=y | ||
494 | CONFIG_DEVFS_FS=y | ||
495 | CONFIG_DEVFS_MOUNT=y | ||
496 | # CONFIG_DEVFS_DEBUG is not set | ||
497 | CONFIG_DEVPTS_FS_XATTR=y | ||
498 | CONFIG_DEVPTS_FS_SECURITY=y | ||
499 | # CONFIG_TMPFS is not set | ||
500 | # CONFIG_HUGETLB_PAGE is not set | ||
501 | CONFIG_RAMFS=y | ||
502 | |||
503 | # | ||
504 | # Miscellaneous filesystems | ||
505 | # | ||
506 | # CONFIG_ADFS_FS is not set | ||
507 | # CONFIG_AFFS_FS is not set | ||
508 | # CONFIG_HFS_FS is not set | ||
509 | # CONFIG_HFSPLUS_FS is not set | ||
510 | # CONFIG_BEFS_FS is not set | ||
511 | # CONFIG_BFS_FS is not set | ||
512 | # CONFIG_EFS_FS is not set | ||
513 | # CONFIG_CRAMFS is not set | ||
514 | # CONFIG_VXFS_FS is not set | ||
515 | # CONFIG_HPFS_FS is not set | ||
516 | # CONFIG_QNX4FS_FS is not set | ||
517 | # CONFIG_SYSV_FS is not set | ||
518 | # CONFIG_UFS_FS is not set | ||
519 | |||
520 | # | ||
521 | # Network File Systems | ||
522 | # | ||
523 | CONFIG_NFS_FS=y | ||
524 | CONFIG_NFS_V3=y | ||
525 | # CONFIG_NFS_V4 is not set | ||
526 | # CONFIG_NFS_DIRECTIO is not set | ||
527 | # CONFIG_NFSD is not set | ||
528 | CONFIG_ROOT_NFS=y | ||
529 | CONFIG_LOCKD=y | ||
530 | CONFIG_LOCKD_V4=y | ||
531 | CONFIG_SUNRPC=y | ||
532 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
533 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
534 | # CONFIG_SMB_FS is not set | ||
535 | # CONFIG_CIFS is not set | ||
536 | # CONFIG_NCP_FS is not set | ||
537 | # CONFIG_CODA_FS is not set | ||
538 | # CONFIG_AFS_FS is not set | ||
539 | |||
540 | # | ||
541 | # Partition Types | ||
542 | # | ||
543 | # CONFIG_PARTITION_ADVANCED is not set | ||
544 | CONFIG_MSDOS_PARTITION=y | ||
545 | |||
546 | # | ||
547 | # Native Language Support | ||
548 | # | ||
549 | CONFIG_NLS=y | ||
550 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
551 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
552 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
553 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
554 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
555 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
556 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
557 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
558 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
559 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
560 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
561 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
562 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
563 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
564 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
565 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
566 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
567 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
568 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
569 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
570 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
571 | # CONFIG_NLS_ISO8859_8 is not set | ||
572 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
573 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
574 | # CONFIG_NLS_ASCII is not set | ||
575 | # CONFIG_NLS_ISO8859_1 is not set | ||
576 | # CONFIG_NLS_ISO8859_2 is not set | ||
577 | # CONFIG_NLS_ISO8859_3 is not set | ||
578 | # CONFIG_NLS_ISO8859_4 is not set | ||
579 | # CONFIG_NLS_ISO8859_5 is not set | ||
580 | # CONFIG_NLS_ISO8859_6 is not set | ||
581 | # CONFIG_NLS_ISO8859_7 is not set | ||
582 | # CONFIG_NLS_ISO8859_9 is not set | ||
583 | # CONFIG_NLS_ISO8859_13 is not set | ||
584 | # CONFIG_NLS_ISO8859_14 is not set | ||
585 | # CONFIG_NLS_ISO8859_15 is not set | ||
586 | # CONFIG_NLS_KOI8_R is not set | ||
587 | # CONFIG_NLS_KOI8_U is not set | ||
588 | # CONFIG_NLS_UTF8 is not set | ||
589 | |||
590 | # | ||
591 | # Profiling support | ||
592 | # | ||
593 | # CONFIG_PROFILING is not set | ||
594 | |||
595 | # | ||
596 | # Kernel hacking | ||
597 | # | ||
598 | # CONFIG_DEBUG_KERNEL is not set | ||
599 | CONFIG_DEBUG_PREEMPT=y | ||
600 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
601 | # CONFIG_FRAME_POINTER is not set | ||
602 | |||
603 | # | ||
604 | # Security options | ||
605 | # | ||
606 | # CONFIG_KEYS is not set | ||
607 | # CONFIG_SECURITY is not set | ||
608 | |||
609 | # | ||
610 | # Cryptographic options | ||
611 | # | ||
612 | # CONFIG_CRYPTO is not set | ||
613 | |||
614 | # | ||
615 | # Hardware crypto devices | ||
616 | # | ||
617 | |||
618 | # | ||
619 | # Library routines | ||
620 | # | ||
621 | # CONFIG_CRC_CCITT is not set | ||
622 | CONFIG_CRC32=y | ||
623 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/m32r/mappi/defconfig.smp b/arch/m32r/mappi/defconfig.smp new file mode 100644 index 000000000000..956a8e2f98d6 --- /dev/null +++ b/arch/m32r/mappi/defconfig.smp | |||
@@ -0,0 +1,738 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:11:02 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | # CONFIG_CLEAN_COMPILE is not set | ||
17 | CONFIG_BROKEN=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | CONFIG_LOCK_KERNEL=y | ||
20 | |||
21 | # | ||
22 | # General setup | ||
23 | # | ||
24 | CONFIG_LOCALVERSION="" | ||
25 | CONFIG_SWAP=y | ||
26 | CONFIG_SYSVIPC=y | ||
27 | # CONFIG_POSIX_MQUEUE is not set | ||
28 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
29 | CONFIG_SYSCTL=y | ||
30 | # CONFIG_AUDIT is not set | ||
31 | CONFIG_LOG_BUF_SHIFT=15 | ||
32 | CONFIG_HOTPLUG=y | ||
33 | CONFIG_KOBJECT_UEVENT=y | ||
34 | CONFIG_IKCONFIG=y | ||
35 | CONFIG_IKCONFIG_PROC=y | ||
36 | CONFIG_EMBEDDED=y | ||
37 | # CONFIG_KALLSYMS is not set | ||
38 | # CONFIG_FUTEX is not set | ||
39 | # CONFIG_EPOLL is not set | ||
40 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
41 | CONFIG_SHMEM=y | ||
42 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
43 | CONFIG_CC_ALIGN_LABELS=0 | ||
44 | CONFIG_CC_ALIGN_LOOPS=0 | ||
45 | CONFIG_CC_ALIGN_JUMPS=0 | ||
46 | # CONFIG_TINY_SHMEM is not set | ||
47 | |||
48 | # | ||
49 | # Loadable module support | ||
50 | # | ||
51 | CONFIG_MODULES=y | ||
52 | CONFIG_MODULE_UNLOAD=y | ||
53 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
54 | CONFIG_OBSOLETE_MODPARM=y | ||
55 | # CONFIG_MODVERSIONS is not set | ||
56 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
57 | CONFIG_KMOD=y | ||
58 | CONFIG_STOP_MACHINE=y | ||
59 | |||
60 | # | ||
61 | # Processor type and features | ||
62 | # | ||
63 | CONFIG_PLAT_MAPPI=y | ||
64 | # CONFIG_PLAT_USRV is not set | ||
65 | # CONFIG_PLAT_M32700UT is not set | ||
66 | # CONFIG_PLAT_OPSPUT is not set | ||
67 | # CONFIG_PLAT_OAKS32R is not set | ||
68 | # CONFIG_PLAT_MAPPI2 is not set | ||
69 | CONFIG_CHIP_M32700=y | ||
70 | # CONFIG_CHIP_M32102 is not set | ||
71 | # CONFIG_CHIP_VDEC2 is not set | ||
72 | # CONFIG_CHIP_OPSP is not set | ||
73 | CONFIG_MMU=y | ||
74 | CONFIG_TLB_ENTRIES=32 | ||
75 | CONFIG_ISA_M32R2=y | ||
76 | CONFIG_ISA_DSP_LEVEL2=y | ||
77 | CONFIG_ISA_DUAL_ISSUE=y | ||
78 | CONFIG_BUS_CLOCK=10000000 | ||
79 | CONFIG_TIMER_DIVIDE=128 | ||
80 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
81 | CONFIG_MEMORY_START=0x08000000 | ||
82 | CONFIG_MEMORY_SIZE=0x04000000 | ||
83 | CONFIG_NOHIGHMEM=y | ||
84 | CONFIG_DISCONTIGMEM=y | ||
85 | CONFIG_IRAM_START=0x00f00000 | ||
86 | CONFIG_IRAM_SIZE=0x00080000 | ||
87 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
88 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
89 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
90 | CONFIG_PREEMPT=y | ||
91 | # CONFIG_HAVE_DEC_LOCK is not set | ||
92 | CONFIG_SMP=y | ||
93 | CONFIG_CHIP_M32700_TS1=y | ||
94 | CONFIG_NR_CPUS=2 | ||
95 | # CONFIG_NUMA is not set | ||
96 | |||
97 | # | ||
98 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
99 | # | ||
100 | # CONFIG_PCI is not set | ||
101 | # CONFIG_ISA is not set | ||
102 | |||
103 | # | ||
104 | # PCCARD (PCMCIA/CardBus) support | ||
105 | # | ||
106 | CONFIG_PCCARD=y | ||
107 | # CONFIG_PCMCIA_DEBUG is not set | ||
108 | CONFIG_PCMCIA=y | ||
109 | |||
110 | # | ||
111 | # PC-card bridges | ||
112 | # | ||
113 | # CONFIG_TCIC is not set | ||
114 | CONFIG_M32R_PCC=y | ||
115 | |||
116 | # | ||
117 | # PCI Hotplug Support | ||
118 | # | ||
119 | |||
120 | # | ||
121 | # Executable file formats | ||
122 | # | ||
123 | CONFIG_BINFMT_ELF=y | ||
124 | # CONFIG_BINFMT_MISC is not set | ||
125 | |||
126 | # | ||
127 | # Device Drivers | ||
128 | # | ||
129 | |||
130 | # | ||
131 | # Generic Driver Options | ||
132 | # | ||
133 | # CONFIG_STANDALONE is not set | ||
134 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
135 | # CONFIG_FW_LOADER is not set | ||
136 | |||
137 | # | ||
138 | # Memory Technology Devices (MTD) | ||
139 | # | ||
140 | CONFIG_MTD=y | ||
141 | # CONFIG_MTD_DEBUG is not set | ||
142 | CONFIG_MTD_PARTITIONS=y | ||
143 | # CONFIG_MTD_CONCAT is not set | ||
144 | CONFIG_MTD_REDBOOT_PARTS=y | ||
145 | CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 | ||
146 | # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set | ||
147 | # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set | ||
148 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
149 | |||
150 | # | ||
151 | # User Modules And Translation Layers | ||
152 | # | ||
153 | CONFIG_MTD_CHAR=y | ||
154 | CONFIG_MTD_BLOCK=y | ||
155 | # CONFIG_FTL is not set | ||
156 | # CONFIG_NFTL is not set | ||
157 | # CONFIG_INFTL is not set | ||
158 | |||
159 | # | ||
160 | # RAM/ROM/Flash chip drivers | ||
161 | # | ||
162 | # CONFIG_MTD_CFI is not set | ||
163 | # CONFIG_MTD_JEDECPROBE is not set | ||
164 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
165 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
166 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
167 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
168 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
169 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
170 | CONFIG_MTD_CFI_I1=y | ||
171 | CONFIG_MTD_CFI_I2=y | ||
172 | # CONFIG_MTD_CFI_I4 is not set | ||
173 | # CONFIG_MTD_CFI_I8 is not set | ||
174 | # CONFIG_MTD_RAM is not set | ||
175 | # CONFIG_MTD_ROM is not set | ||
176 | # CONFIG_MTD_ABSENT is not set | ||
177 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
178 | |||
179 | # | ||
180 | # Mapping drivers for chip access | ||
181 | # | ||
182 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
183 | |||
184 | # | ||
185 | # Self-contained MTD device drivers | ||
186 | # | ||
187 | # CONFIG_MTD_SLRAM is not set | ||
188 | # CONFIG_MTD_PHRAM is not set | ||
189 | # CONFIG_MTD_MTDRAM is not set | ||
190 | # CONFIG_MTD_BLKMTD is not set | ||
191 | # CONFIG_MTD_BLOCK2MTD is not set | ||
192 | |||
193 | # | ||
194 | # Disk-On-Chip Device Drivers | ||
195 | # | ||
196 | # CONFIG_MTD_DOC2000 is not set | ||
197 | # CONFIG_MTD_DOC2001 is not set | ||
198 | # CONFIG_MTD_DOC2001PLUS is not set | ||
199 | |||
200 | # | ||
201 | # NAND Flash Device Drivers | ||
202 | # | ||
203 | # CONFIG_MTD_NAND is not set | ||
204 | |||
205 | # | ||
206 | # Parallel port support | ||
207 | # | ||
208 | # CONFIG_PARPORT is not set | ||
209 | |||
210 | # | ||
211 | # Plug and Play support | ||
212 | # | ||
213 | |||
214 | # | ||
215 | # Block devices | ||
216 | # | ||
217 | # CONFIG_BLK_DEV_FD is not set | ||
218 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
219 | CONFIG_BLK_DEV_LOOP=y | ||
220 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
221 | CONFIG_BLK_DEV_NBD=m | ||
222 | CONFIG_BLK_DEV_RAM=y | ||
223 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
224 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
225 | CONFIG_BLK_DEV_INITRD=y | ||
226 | CONFIG_INITRAMFS_SOURCE="" | ||
227 | # CONFIG_CDROM_PKTCDVD is not set | ||
228 | |||
229 | # | ||
230 | # IO Schedulers | ||
231 | # | ||
232 | CONFIG_IOSCHED_NOOP=y | ||
233 | # CONFIG_IOSCHED_AS is not set | ||
234 | CONFIG_IOSCHED_DEADLINE=y | ||
235 | CONFIG_IOSCHED_CFQ=y | ||
236 | # CONFIG_ATA_OVER_ETH is not set | ||
237 | |||
238 | # | ||
239 | # ATA/ATAPI/MFM/RLL support | ||
240 | # | ||
241 | CONFIG_IDE=m | ||
242 | CONFIG_BLK_DEV_IDE=m | ||
243 | |||
244 | # | ||
245 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
246 | # | ||
247 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
248 | CONFIG_BLK_DEV_IDEDISK=m | ||
249 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
250 | CONFIG_BLK_DEV_IDECS=m | ||
251 | CONFIG_BLK_DEV_IDECD=m | ||
252 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
253 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
254 | # CONFIG_IDE_TASK_IOCTL is not set | ||
255 | |||
256 | # | ||
257 | # IDE chipset support/bugfixes | ||
258 | # | ||
259 | CONFIG_IDE_GENERIC=m | ||
260 | # CONFIG_IDE_ARM is not set | ||
261 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
262 | # CONFIG_IDEDMA_AUTO is not set | ||
263 | # CONFIG_BLK_DEV_HD is not set | ||
264 | |||
265 | # | ||
266 | # SCSI device support | ||
267 | # | ||
268 | # CONFIG_SCSI is not set | ||
269 | |||
270 | # | ||
271 | # Multi-device support (RAID and LVM) | ||
272 | # | ||
273 | # CONFIG_MD is not set | ||
274 | |||
275 | # | ||
276 | # Fusion MPT device support | ||
277 | # | ||
278 | |||
279 | # | ||
280 | # IEEE 1394 (FireWire) support | ||
281 | # | ||
282 | # CONFIG_IEEE1394 is not set | ||
283 | |||
284 | # | ||
285 | # I2O device support | ||
286 | # | ||
287 | |||
288 | # | ||
289 | # Networking support | ||
290 | # | ||
291 | CONFIG_NET=y | ||
292 | |||
293 | # | ||
294 | # Networking options | ||
295 | # | ||
296 | # CONFIG_PACKET is not set | ||
297 | # CONFIG_NETLINK_DEV is not set | ||
298 | CONFIG_UNIX=y | ||
299 | # CONFIG_NET_KEY is not set | ||
300 | CONFIG_INET=y | ||
301 | # CONFIG_IP_MULTICAST is not set | ||
302 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
303 | CONFIG_IP_PNP=y | ||
304 | CONFIG_IP_PNP_DHCP=y | ||
305 | # CONFIG_IP_PNP_BOOTP is not set | ||
306 | # CONFIG_IP_PNP_RARP is not set | ||
307 | # CONFIG_NET_IPIP is not set | ||
308 | # CONFIG_NET_IPGRE is not set | ||
309 | # CONFIG_ARPD is not set | ||
310 | # CONFIG_SYN_COOKIES is not set | ||
311 | # CONFIG_INET_AH is not set | ||
312 | # CONFIG_INET_ESP is not set | ||
313 | # CONFIG_INET_IPCOMP is not set | ||
314 | # CONFIG_INET_TUNNEL is not set | ||
315 | CONFIG_IP_TCPDIAG=y | ||
316 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
317 | # CONFIG_IPV6 is not set | ||
318 | # CONFIG_NETFILTER is not set | ||
319 | |||
320 | # | ||
321 | # SCTP Configuration (EXPERIMENTAL) | ||
322 | # | ||
323 | # CONFIG_IP_SCTP is not set | ||
324 | # CONFIG_ATM is not set | ||
325 | # CONFIG_BRIDGE is not set | ||
326 | # CONFIG_VLAN_8021Q is not set | ||
327 | # CONFIG_DECNET is not set | ||
328 | # CONFIG_LLC2 is not set | ||
329 | # CONFIG_IPX is not set | ||
330 | # CONFIG_ATALK is not set | ||
331 | # CONFIG_X25 is not set | ||
332 | # CONFIG_LAPB is not set | ||
333 | # CONFIG_NET_DIVERT is not set | ||
334 | # CONFIG_ECONET is not set | ||
335 | # CONFIG_WAN_ROUTER is not set | ||
336 | |||
337 | # | ||
338 | # QoS and/or fair queueing | ||
339 | # | ||
340 | # CONFIG_NET_SCHED is not set | ||
341 | # CONFIG_NET_CLS_ROUTE is not set | ||
342 | |||
343 | # | ||
344 | # Network testing | ||
345 | # | ||
346 | # CONFIG_NET_PKTGEN is not set | ||
347 | # CONFIG_NETPOLL is not set | ||
348 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
349 | # CONFIG_HAMRADIO is not set | ||
350 | # CONFIG_IRDA is not set | ||
351 | # CONFIG_BT is not set | ||
352 | CONFIG_NETDEVICES=y | ||
353 | # CONFIG_DUMMY is not set | ||
354 | # CONFIG_BONDING is not set | ||
355 | # CONFIG_EQUALIZER is not set | ||
356 | # CONFIG_TUN is not set | ||
357 | |||
358 | # | ||
359 | # Ethernet (10 or 100Mbit) | ||
360 | # | ||
361 | # CONFIG_NET_ETHERNET is not set | ||
362 | CONFIG_NE2000=y | ||
363 | |||
364 | # | ||
365 | # Ethernet (1000 Mbit) | ||
366 | # | ||
367 | |||
368 | # | ||
369 | # Ethernet (10000 Mbit) | ||
370 | # | ||
371 | |||
372 | # | ||
373 | # Token Ring devices | ||
374 | # | ||
375 | |||
376 | # | ||
377 | # Wireless LAN (non-hamradio) | ||
378 | # | ||
379 | # CONFIG_NET_RADIO is not set | ||
380 | |||
381 | # | ||
382 | # PCMCIA network device support | ||
383 | # | ||
384 | # CONFIG_NET_PCMCIA is not set | ||
385 | |||
386 | # | ||
387 | # Wan interfaces | ||
388 | # | ||
389 | # CONFIG_WAN is not set | ||
390 | # CONFIG_PPP is not set | ||
391 | # CONFIG_SLIP is not set | ||
392 | # CONFIG_SHAPER is not set | ||
393 | # CONFIG_NETCONSOLE is not set | ||
394 | |||
395 | # | ||
396 | # ISDN subsystem | ||
397 | # | ||
398 | # CONFIG_ISDN is not set | ||
399 | |||
400 | # | ||
401 | # Telephony Support | ||
402 | # | ||
403 | # CONFIG_PHONE is not set | ||
404 | |||
405 | # | ||
406 | # Input device support | ||
407 | # | ||
408 | CONFIG_INPUT=y | ||
409 | |||
410 | # | ||
411 | # Userland interfaces | ||
412 | # | ||
413 | CONFIG_INPUT_MOUSEDEV=y | ||
414 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
415 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
416 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
417 | # CONFIG_INPUT_JOYDEV is not set | ||
418 | # CONFIG_INPUT_TSDEV is not set | ||
419 | # CONFIG_INPUT_EVDEV is not set | ||
420 | # CONFIG_INPUT_EVBUG is not set | ||
421 | |||
422 | # | ||
423 | # Input I/O drivers | ||
424 | # | ||
425 | # CONFIG_GAMEPORT is not set | ||
426 | CONFIG_SOUND_GAMEPORT=y | ||
427 | CONFIG_SERIO=y | ||
428 | # CONFIG_SERIO_I8042 is not set | ||
429 | # CONFIG_SERIO_SERPORT is not set | ||
430 | # CONFIG_SERIO_CT82C710 is not set | ||
431 | # CONFIG_SERIO_LIBPS2 is not set | ||
432 | # CONFIG_SERIO_RAW is not set | ||
433 | |||
434 | # | ||
435 | # Input Device Drivers | ||
436 | # | ||
437 | # CONFIG_INPUT_KEYBOARD is not set | ||
438 | # CONFIG_INPUT_MOUSE is not set | ||
439 | # CONFIG_INPUT_JOYSTICK is not set | ||
440 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
441 | # CONFIG_INPUT_MISC is not set | ||
442 | |||
443 | # | ||
444 | # Character devices | ||
445 | # | ||
446 | # CONFIG_VT is not set | ||
447 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
448 | |||
449 | # | ||
450 | # Serial drivers | ||
451 | # | ||
452 | # CONFIG_SERIAL_8250 is not set | ||
453 | |||
454 | # | ||
455 | # Non-8250 serial port support | ||
456 | # | ||
457 | CONFIG_SERIAL_CORE=y | ||
458 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
459 | CONFIG_SERIAL_M32R_SIO=y | ||
460 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
461 | # CONFIG_SERIAL_M32R_PLDSIO is not set | ||
462 | CONFIG_UNIX98_PTYS=y | ||
463 | CONFIG_LEGACY_PTYS=y | ||
464 | CONFIG_LEGACY_PTY_COUNT=256 | ||
465 | |||
466 | # | ||
467 | # IPMI | ||
468 | # | ||
469 | # CONFIG_IPMI_HANDLER is not set | ||
470 | |||
471 | # | ||
472 | # Watchdog Cards | ||
473 | # | ||
474 | # CONFIG_WATCHDOG is not set | ||
475 | # CONFIG_RTC is not set | ||
476 | # CONFIG_GEN_RTC is not set | ||
477 | # CONFIG_DTLK is not set | ||
478 | # CONFIG_R3964 is not set | ||
479 | |||
480 | # | ||
481 | # Ftape, the floppy tape device driver | ||
482 | # | ||
483 | # CONFIG_DRM is not set | ||
484 | |||
485 | # | ||
486 | # PCMCIA character devices | ||
487 | # | ||
488 | # CONFIG_SYNCLINK_CS is not set | ||
489 | # CONFIG_RAW_DRIVER is not set | ||
490 | |||
491 | # | ||
492 | # I2C support | ||
493 | # | ||
494 | # CONFIG_I2C is not set | ||
495 | |||
496 | # | ||
497 | # Dallas's 1-wire bus | ||
498 | # | ||
499 | # CONFIG_W1 is not set | ||
500 | |||
501 | # | ||
502 | # Misc devices | ||
503 | # | ||
504 | |||
505 | # | ||
506 | # Multimedia devices | ||
507 | # | ||
508 | # CONFIG_VIDEO_DEV is not set | ||
509 | |||
510 | # | ||
511 | # Digital Video Broadcasting Devices | ||
512 | # | ||
513 | # CONFIG_DVB is not set | ||
514 | |||
515 | # | ||
516 | # Graphics support | ||
517 | # | ||
518 | # CONFIG_FB is not set | ||
519 | |||
520 | # | ||
521 | # Sound | ||
522 | # | ||
523 | # CONFIG_SOUND is not set | ||
524 | |||
525 | # | ||
526 | # USB support | ||
527 | # | ||
528 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
529 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
530 | |||
531 | # | ||
532 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
533 | # | ||
534 | |||
535 | # | ||
536 | # USB Gadget Support | ||
537 | # | ||
538 | # CONFIG_USB_GADGET is not set | ||
539 | |||
540 | # | ||
541 | # MMC/SD Card support | ||
542 | # | ||
543 | # CONFIG_MMC is not set | ||
544 | |||
545 | # | ||
546 | # InfiniBand support | ||
547 | # | ||
548 | # CONFIG_INFINIBAND is not set | ||
549 | |||
550 | # | ||
551 | # File systems | ||
552 | # | ||
553 | CONFIG_EXT2_FS=y | ||
554 | # CONFIG_EXT2_FS_XATTR is not set | ||
555 | # CONFIG_EXT3_FS is not set | ||
556 | # CONFIG_JBD is not set | ||
557 | # CONFIG_REISERFS_FS is not set | ||
558 | # CONFIG_JFS_FS is not set | ||
559 | |||
560 | # | ||
561 | # XFS support | ||
562 | # | ||
563 | # CONFIG_XFS_FS is not set | ||
564 | # CONFIG_MINIX_FS is not set | ||
565 | CONFIG_ROMFS_FS=y | ||
566 | # CONFIG_QUOTA is not set | ||
567 | CONFIG_DNOTIFY=y | ||
568 | # CONFIG_AUTOFS_FS is not set | ||
569 | # CONFIG_AUTOFS4_FS is not set | ||
570 | |||
571 | # | ||
572 | # CD-ROM/DVD Filesystems | ||
573 | # | ||
574 | CONFIG_ISO9660_FS=y | ||
575 | # CONFIG_JOLIET is not set | ||
576 | # CONFIG_ZISOFS is not set | ||
577 | # CONFIG_UDF_FS is not set | ||
578 | |||
579 | # | ||
580 | # DOS/FAT/NT Filesystems | ||
581 | # | ||
582 | CONFIG_FAT_FS=m | ||
583 | CONFIG_MSDOS_FS=m | ||
584 | CONFIG_VFAT_FS=m | ||
585 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
586 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
587 | # CONFIG_NTFS_FS is not set | ||
588 | |||
589 | # | ||
590 | # Pseudo filesystems | ||
591 | # | ||
592 | CONFIG_PROC_FS=y | ||
593 | CONFIG_PROC_KCORE=y | ||
594 | CONFIG_SYSFS=y | ||
595 | CONFIG_DEVFS_FS=y | ||
596 | CONFIG_DEVFS_MOUNT=y | ||
597 | # CONFIG_DEVFS_DEBUG is not set | ||
598 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
599 | CONFIG_TMPFS=y | ||
600 | # CONFIG_TMPFS_XATTR is not set | ||
601 | # CONFIG_HUGETLBFS is not set | ||
602 | # CONFIG_HUGETLB_PAGE is not set | ||
603 | CONFIG_RAMFS=y | ||
604 | |||
605 | # | ||
606 | # Miscellaneous filesystems | ||
607 | # | ||
608 | # CONFIG_ADFS_FS is not set | ||
609 | # CONFIG_AFFS_FS is not set | ||
610 | # CONFIG_HFS_FS is not set | ||
611 | # CONFIG_HFSPLUS_FS is not set | ||
612 | # CONFIG_BEFS_FS is not set | ||
613 | # CONFIG_BFS_FS is not set | ||
614 | # CONFIG_EFS_FS is not set | ||
615 | CONFIG_JFFS_FS=y | ||
616 | CONFIG_JFFS_FS_VERBOSE=0 | ||
617 | CONFIG_JFFS_PROC_FS=y | ||
618 | CONFIG_JFFS2_FS=y | ||
619 | CONFIG_JFFS2_FS_DEBUG=0 | ||
620 | # CONFIG_JFFS2_FS_NAND is not set | ||
621 | # CONFIG_JFFS2_FS_NOR_ECC is not set | ||
622 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
623 | CONFIG_JFFS2_ZLIB=y | ||
624 | CONFIG_JFFS2_RTIME=y | ||
625 | # CONFIG_JFFS2_RUBIN is not set | ||
626 | # CONFIG_CRAMFS is not set | ||
627 | # CONFIG_VXFS_FS is not set | ||
628 | # CONFIG_HPFS_FS is not set | ||
629 | # CONFIG_QNX4FS_FS is not set | ||
630 | # CONFIG_SYSV_FS is not set | ||
631 | # CONFIG_UFS_FS is not set | ||
632 | |||
633 | # | ||
634 | # Network File Systems | ||
635 | # | ||
636 | CONFIG_NFS_FS=y | ||
637 | CONFIG_NFS_V3=y | ||
638 | # CONFIG_NFS_V4 is not set | ||
639 | # CONFIG_NFS_DIRECTIO is not set | ||
640 | # CONFIG_NFSD is not set | ||
641 | CONFIG_ROOT_NFS=y | ||
642 | CONFIG_LOCKD=y | ||
643 | CONFIG_LOCKD_V4=y | ||
644 | CONFIG_SUNRPC=y | ||
645 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
646 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
647 | # CONFIG_SMB_FS is not set | ||
648 | # CONFIG_CIFS is not set | ||
649 | # CONFIG_NCP_FS is not set | ||
650 | # CONFIG_CODA_FS is not set | ||
651 | # CONFIG_AFS_FS is not set | ||
652 | |||
653 | # | ||
654 | # Partition Types | ||
655 | # | ||
656 | # CONFIG_PARTITION_ADVANCED is not set | ||
657 | CONFIG_MSDOS_PARTITION=y | ||
658 | |||
659 | # | ||
660 | # Native Language Support | ||
661 | # | ||
662 | CONFIG_NLS=y | ||
663 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
664 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
665 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
666 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
667 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
668 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
669 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
670 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
671 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
672 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
673 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
674 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
675 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
676 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
677 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
678 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
679 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
680 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
681 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
682 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
683 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
684 | # CONFIG_NLS_ISO8859_8 is not set | ||
685 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
686 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
687 | # CONFIG_NLS_ASCII is not set | ||
688 | # CONFIG_NLS_ISO8859_1 is not set | ||
689 | # CONFIG_NLS_ISO8859_2 is not set | ||
690 | # CONFIG_NLS_ISO8859_3 is not set | ||
691 | # CONFIG_NLS_ISO8859_4 is not set | ||
692 | # CONFIG_NLS_ISO8859_5 is not set | ||
693 | # CONFIG_NLS_ISO8859_6 is not set | ||
694 | # CONFIG_NLS_ISO8859_7 is not set | ||
695 | # CONFIG_NLS_ISO8859_9 is not set | ||
696 | # CONFIG_NLS_ISO8859_13 is not set | ||
697 | # CONFIG_NLS_ISO8859_14 is not set | ||
698 | # CONFIG_NLS_ISO8859_15 is not set | ||
699 | # CONFIG_NLS_KOI8_R is not set | ||
700 | # CONFIG_NLS_KOI8_U is not set | ||
701 | # CONFIG_NLS_UTF8 is not set | ||
702 | |||
703 | # | ||
704 | # Profiling support | ||
705 | # | ||
706 | # CONFIG_PROFILING is not set | ||
707 | |||
708 | # | ||
709 | # Kernel hacking | ||
710 | # | ||
711 | # CONFIG_DEBUG_KERNEL is not set | ||
712 | CONFIG_DEBUG_PREEMPT=y | ||
713 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
714 | # CONFIG_FRAME_POINTER is not set | ||
715 | |||
716 | # | ||
717 | # Security options | ||
718 | # | ||
719 | # CONFIG_KEYS is not set | ||
720 | # CONFIG_SECURITY is not set | ||
721 | |||
722 | # | ||
723 | # Cryptographic options | ||
724 | # | ||
725 | # CONFIG_CRYPTO is not set | ||
726 | |||
727 | # | ||
728 | # Hardware crypto devices | ||
729 | # | ||
730 | |||
731 | # | ||
732 | # Library routines | ||
733 | # | ||
734 | # CONFIG_CRC_CCITT is not set | ||
735 | CONFIG_CRC32=y | ||
736 | # CONFIG_LIBCRC32C is not set | ||
737 | CONFIG_ZLIB_INFLATE=y | ||
738 | CONFIG_ZLIB_DEFLATE=y | ||
diff --git a/arch/m32r/mappi/defconfig.up b/arch/m32r/mappi/defconfig.up new file mode 100644 index 000000000000..c9253e94efbd --- /dev/null +++ b/arch/m32r/mappi/defconfig.up | |||
@@ -0,0 +1,734 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:11:07 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | # CONFIG_CLEAN_COMPILE is not set | ||
17 | CONFIG_BROKEN=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | CONFIG_LOCK_KERNEL=y | ||
20 | |||
21 | # | ||
22 | # General setup | ||
23 | # | ||
24 | CONFIG_LOCALVERSION="" | ||
25 | CONFIG_SWAP=y | ||
26 | CONFIG_SYSVIPC=y | ||
27 | # CONFIG_POSIX_MQUEUE is not set | ||
28 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
29 | CONFIG_SYSCTL=y | ||
30 | # CONFIG_AUDIT is not set | ||
31 | CONFIG_LOG_BUF_SHIFT=14 | ||
32 | CONFIG_HOTPLUG=y | ||
33 | CONFIG_KOBJECT_UEVENT=y | ||
34 | CONFIG_IKCONFIG=y | ||
35 | CONFIG_IKCONFIG_PROC=y | ||
36 | CONFIG_EMBEDDED=y | ||
37 | # CONFIG_KALLSYMS is not set | ||
38 | # CONFIG_FUTEX is not set | ||
39 | # CONFIG_EPOLL is not set | ||
40 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
41 | CONFIG_SHMEM=y | ||
42 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
43 | CONFIG_CC_ALIGN_LABELS=0 | ||
44 | CONFIG_CC_ALIGN_LOOPS=0 | ||
45 | CONFIG_CC_ALIGN_JUMPS=0 | ||
46 | # CONFIG_TINY_SHMEM is not set | ||
47 | |||
48 | # | ||
49 | # Loadable module support | ||
50 | # | ||
51 | CONFIG_MODULES=y | ||
52 | CONFIG_MODULE_UNLOAD=y | ||
53 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
54 | CONFIG_OBSOLETE_MODPARM=y | ||
55 | # CONFIG_MODVERSIONS is not set | ||
56 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
57 | CONFIG_KMOD=y | ||
58 | |||
59 | # | ||
60 | # Processor type and features | ||
61 | # | ||
62 | CONFIG_PLAT_MAPPI=y | ||
63 | # CONFIG_PLAT_USRV is not set | ||
64 | # CONFIG_PLAT_M32700UT is not set | ||
65 | # CONFIG_PLAT_OPSPUT is not set | ||
66 | # CONFIG_PLAT_OAKS32R is not set | ||
67 | # CONFIG_PLAT_MAPPI2 is not set | ||
68 | CONFIG_CHIP_M32700=y | ||
69 | # CONFIG_CHIP_M32102 is not set | ||
70 | # CONFIG_CHIP_VDEC2 is not set | ||
71 | # CONFIG_CHIP_OPSP is not set | ||
72 | CONFIG_MMU=y | ||
73 | CONFIG_TLB_ENTRIES=32 | ||
74 | CONFIG_ISA_M32R2=y | ||
75 | CONFIG_ISA_DSP_LEVEL2=y | ||
76 | CONFIG_ISA_DUAL_ISSUE=y | ||
77 | CONFIG_BUS_CLOCK=10000000 | ||
78 | CONFIG_TIMER_DIVIDE=128 | ||
79 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
80 | CONFIG_MEMORY_START=0x08000000 | ||
81 | CONFIG_MEMORY_SIZE=0x04000000 | ||
82 | CONFIG_NOHIGHMEM=y | ||
83 | CONFIG_DISCONTIGMEM=y | ||
84 | CONFIG_IRAM_START=0x00f00000 | ||
85 | CONFIG_IRAM_SIZE=0x00080000 | ||
86 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
87 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
88 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
89 | CONFIG_PREEMPT=y | ||
90 | # CONFIG_HAVE_DEC_LOCK is not set | ||
91 | # CONFIG_SMP is not set | ||
92 | |||
93 | # | ||
94 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
95 | # | ||
96 | # CONFIG_PCI is not set | ||
97 | # CONFIG_ISA is not set | ||
98 | |||
99 | # | ||
100 | # PCCARD (PCMCIA/CardBus) support | ||
101 | # | ||
102 | CONFIG_PCCARD=y | ||
103 | # CONFIG_PCMCIA_DEBUG is not set | ||
104 | CONFIG_PCMCIA=y | ||
105 | |||
106 | # | ||
107 | # PC-card bridges | ||
108 | # | ||
109 | # CONFIG_TCIC is not set | ||
110 | CONFIG_M32R_PCC=y | ||
111 | |||
112 | # | ||
113 | # PCI Hotplug Support | ||
114 | # | ||
115 | |||
116 | # | ||
117 | # Executable file formats | ||
118 | # | ||
119 | CONFIG_BINFMT_ELF=y | ||
120 | # CONFIG_BINFMT_MISC is not set | ||
121 | |||
122 | # | ||
123 | # Device Drivers | ||
124 | # | ||
125 | |||
126 | # | ||
127 | # Generic Driver Options | ||
128 | # | ||
129 | # CONFIG_STANDALONE is not set | ||
130 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
131 | # CONFIG_FW_LOADER is not set | ||
132 | |||
133 | # | ||
134 | # Memory Technology Devices (MTD) | ||
135 | # | ||
136 | CONFIG_MTD=y | ||
137 | # CONFIG_MTD_DEBUG is not set | ||
138 | CONFIG_MTD_PARTITIONS=y | ||
139 | # CONFIG_MTD_CONCAT is not set | ||
140 | CONFIG_MTD_REDBOOT_PARTS=y | ||
141 | CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 | ||
142 | # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set | ||
143 | # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set | ||
144 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
145 | |||
146 | # | ||
147 | # User Modules And Translation Layers | ||
148 | # | ||
149 | CONFIG_MTD_CHAR=y | ||
150 | CONFIG_MTD_BLOCK=y | ||
151 | # CONFIG_FTL is not set | ||
152 | # CONFIG_NFTL is not set | ||
153 | # CONFIG_INFTL is not set | ||
154 | |||
155 | # | ||
156 | # RAM/ROM/Flash chip drivers | ||
157 | # | ||
158 | # CONFIG_MTD_CFI is not set | ||
159 | # CONFIG_MTD_JEDECPROBE is not set | ||
160 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
161 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
162 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
163 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
164 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
165 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
166 | CONFIG_MTD_CFI_I1=y | ||
167 | CONFIG_MTD_CFI_I2=y | ||
168 | # CONFIG_MTD_CFI_I4 is not set | ||
169 | # CONFIG_MTD_CFI_I8 is not set | ||
170 | # CONFIG_MTD_RAM is not set | ||
171 | # CONFIG_MTD_ROM is not set | ||
172 | # CONFIG_MTD_ABSENT is not set | ||
173 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
174 | |||
175 | # | ||
176 | # Mapping drivers for chip access | ||
177 | # | ||
178 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
179 | |||
180 | # | ||
181 | # Self-contained MTD device drivers | ||
182 | # | ||
183 | # CONFIG_MTD_SLRAM is not set | ||
184 | # CONFIG_MTD_PHRAM is not set | ||
185 | # CONFIG_MTD_MTDRAM is not set | ||
186 | # CONFIG_MTD_BLKMTD is not set | ||
187 | # CONFIG_MTD_BLOCK2MTD is not set | ||
188 | |||
189 | # | ||
190 | # Disk-On-Chip Device Drivers | ||
191 | # | ||
192 | # CONFIG_MTD_DOC2000 is not set | ||
193 | # CONFIG_MTD_DOC2001 is not set | ||
194 | # CONFIG_MTD_DOC2001PLUS is not set | ||
195 | |||
196 | # | ||
197 | # NAND Flash Device Drivers | ||
198 | # | ||
199 | # CONFIG_MTD_NAND is not set | ||
200 | |||
201 | # | ||
202 | # Parallel port support | ||
203 | # | ||
204 | # CONFIG_PARPORT is not set | ||
205 | |||
206 | # | ||
207 | # Plug and Play support | ||
208 | # | ||
209 | |||
210 | # | ||
211 | # Block devices | ||
212 | # | ||
213 | # CONFIG_BLK_DEV_FD is not set | ||
214 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
215 | CONFIG_BLK_DEV_LOOP=y | ||
216 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
217 | CONFIG_BLK_DEV_NBD=m | ||
218 | CONFIG_BLK_DEV_RAM=y | ||
219 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
220 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
221 | CONFIG_BLK_DEV_INITRD=y | ||
222 | CONFIG_INITRAMFS_SOURCE="" | ||
223 | # CONFIG_CDROM_PKTCDVD is not set | ||
224 | |||
225 | # | ||
226 | # IO Schedulers | ||
227 | # | ||
228 | CONFIG_IOSCHED_NOOP=y | ||
229 | # CONFIG_IOSCHED_AS is not set | ||
230 | CONFIG_IOSCHED_DEADLINE=y | ||
231 | CONFIG_IOSCHED_CFQ=y | ||
232 | # CONFIG_ATA_OVER_ETH is not set | ||
233 | |||
234 | # | ||
235 | # ATA/ATAPI/MFM/RLL support | ||
236 | # | ||
237 | CONFIG_IDE=m | ||
238 | CONFIG_BLK_DEV_IDE=m | ||
239 | |||
240 | # | ||
241 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
242 | # | ||
243 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
244 | CONFIG_BLK_DEV_IDEDISK=m | ||
245 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
246 | CONFIG_BLK_DEV_IDECS=m | ||
247 | CONFIG_BLK_DEV_IDECD=m | ||
248 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
249 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
250 | # CONFIG_IDE_TASK_IOCTL is not set | ||
251 | |||
252 | # | ||
253 | # IDE chipset support/bugfixes | ||
254 | # | ||
255 | CONFIG_IDE_GENERIC=m | ||
256 | # CONFIG_IDE_ARM is not set | ||
257 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
258 | # CONFIG_IDEDMA_AUTO is not set | ||
259 | # CONFIG_BLK_DEV_HD is not set | ||
260 | |||
261 | # | ||
262 | # SCSI device support | ||
263 | # | ||
264 | # CONFIG_SCSI is not set | ||
265 | |||
266 | # | ||
267 | # Multi-device support (RAID and LVM) | ||
268 | # | ||
269 | # CONFIG_MD is not set | ||
270 | |||
271 | # | ||
272 | # Fusion MPT device support | ||
273 | # | ||
274 | |||
275 | # | ||
276 | # IEEE 1394 (FireWire) support | ||
277 | # | ||
278 | # CONFIG_IEEE1394 is not set | ||
279 | |||
280 | # | ||
281 | # I2O device support | ||
282 | # | ||
283 | |||
284 | # | ||
285 | # Networking support | ||
286 | # | ||
287 | CONFIG_NET=y | ||
288 | |||
289 | # | ||
290 | # Networking options | ||
291 | # | ||
292 | # CONFIG_PACKET is not set | ||
293 | # CONFIG_NETLINK_DEV is not set | ||
294 | CONFIG_UNIX=y | ||
295 | # CONFIG_NET_KEY is not set | ||
296 | CONFIG_INET=y | ||
297 | # CONFIG_IP_MULTICAST is not set | ||
298 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
299 | CONFIG_IP_PNP=y | ||
300 | CONFIG_IP_PNP_DHCP=y | ||
301 | # CONFIG_IP_PNP_BOOTP is not set | ||
302 | # CONFIG_IP_PNP_RARP is not set | ||
303 | # CONFIG_NET_IPIP is not set | ||
304 | # CONFIG_NET_IPGRE is not set | ||
305 | # CONFIG_ARPD is not set | ||
306 | # CONFIG_SYN_COOKIES is not set | ||
307 | # CONFIG_INET_AH is not set | ||
308 | # CONFIG_INET_ESP is not set | ||
309 | # CONFIG_INET_IPCOMP is not set | ||
310 | # CONFIG_INET_TUNNEL is not set | ||
311 | CONFIG_IP_TCPDIAG=y | ||
312 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
313 | # CONFIG_IPV6 is not set | ||
314 | # CONFIG_NETFILTER is not set | ||
315 | |||
316 | # | ||
317 | # SCTP Configuration (EXPERIMENTAL) | ||
318 | # | ||
319 | # CONFIG_IP_SCTP is not set | ||
320 | # CONFIG_ATM is not set | ||
321 | # CONFIG_BRIDGE is not set | ||
322 | # CONFIG_VLAN_8021Q is not set | ||
323 | # CONFIG_DECNET is not set | ||
324 | # CONFIG_LLC2 is not set | ||
325 | # CONFIG_IPX is not set | ||
326 | # CONFIG_ATALK is not set | ||
327 | # CONFIG_X25 is not set | ||
328 | # CONFIG_LAPB is not set | ||
329 | # CONFIG_NET_DIVERT is not set | ||
330 | # CONFIG_ECONET is not set | ||
331 | # CONFIG_WAN_ROUTER is not set | ||
332 | |||
333 | # | ||
334 | # QoS and/or fair queueing | ||
335 | # | ||
336 | # CONFIG_NET_SCHED is not set | ||
337 | # CONFIG_NET_CLS_ROUTE is not set | ||
338 | |||
339 | # | ||
340 | # Network testing | ||
341 | # | ||
342 | # CONFIG_NET_PKTGEN is not set | ||
343 | # CONFIG_NETPOLL is not set | ||
344 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
345 | # CONFIG_HAMRADIO is not set | ||
346 | # CONFIG_IRDA is not set | ||
347 | # CONFIG_BT is not set | ||
348 | CONFIG_NETDEVICES=y | ||
349 | # CONFIG_DUMMY is not set | ||
350 | # CONFIG_BONDING is not set | ||
351 | # CONFIG_EQUALIZER is not set | ||
352 | # CONFIG_TUN is not set | ||
353 | |||
354 | # | ||
355 | # Ethernet (10 or 100Mbit) | ||
356 | # | ||
357 | # CONFIG_NET_ETHERNET is not set | ||
358 | CONFIG_NE2000=y | ||
359 | |||
360 | # | ||
361 | # Ethernet (1000 Mbit) | ||
362 | # | ||
363 | |||
364 | # | ||
365 | # Ethernet (10000 Mbit) | ||
366 | # | ||
367 | |||
368 | # | ||
369 | # Token Ring devices | ||
370 | # | ||
371 | |||
372 | # | ||
373 | # Wireless LAN (non-hamradio) | ||
374 | # | ||
375 | # CONFIG_NET_RADIO is not set | ||
376 | |||
377 | # | ||
378 | # PCMCIA network device support | ||
379 | # | ||
380 | # CONFIG_NET_PCMCIA is not set | ||
381 | |||
382 | # | ||
383 | # Wan interfaces | ||
384 | # | ||
385 | # CONFIG_WAN is not set | ||
386 | # CONFIG_PPP is not set | ||
387 | # CONFIG_SLIP is not set | ||
388 | # CONFIG_SHAPER is not set | ||
389 | # CONFIG_NETCONSOLE is not set | ||
390 | |||
391 | # | ||
392 | # ISDN subsystem | ||
393 | # | ||
394 | # CONFIG_ISDN is not set | ||
395 | |||
396 | # | ||
397 | # Telephony Support | ||
398 | # | ||
399 | # CONFIG_PHONE is not set | ||
400 | |||
401 | # | ||
402 | # Input device support | ||
403 | # | ||
404 | CONFIG_INPUT=y | ||
405 | |||
406 | # | ||
407 | # Userland interfaces | ||
408 | # | ||
409 | CONFIG_INPUT_MOUSEDEV=y | ||
410 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
411 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
412 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
413 | # CONFIG_INPUT_JOYDEV is not set | ||
414 | # CONFIG_INPUT_TSDEV is not set | ||
415 | # CONFIG_INPUT_EVDEV is not set | ||
416 | # CONFIG_INPUT_EVBUG is not set | ||
417 | |||
418 | # | ||
419 | # Input I/O drivers | ||
420 | # | ||
421 | # CONFIG_GAMEPORT is not set | ||
422 | CONFIG_SOUND_GAMEPORT=y | ||
423 | CONFIG_SERIO=y | ||
424 | # CONFIG_SERIO_I8042 is not set | ||
425 | # CONFIG_SERIO_SERPORT is not set | ||
426 | # CONFIG_SERIO_CT82C710 is not set | ||
427 | # CONFIG_SERIO_LIBPS2 is not set | ||
428 | # CONFIG_SERIO_RAW is not set | ||
429 | |||
430 | # | ||
431 | # Input Device Drivers | ||
432 | # | ||
433 | # CONFIG_INPUT_KEYBOARD is not set | ||
434 | # CONFIG_INPUT_MOUSE is not set | ||
435 | # CONFIG_INPUT_JOYSTICK is not set | ||
436 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
437 | # CONFIG_INPUT_MISC is not set | ||
438 | |||
439 | # | ||
440 | # Character devices | ||
441 | # | ||
442 | # CONFIG_VT is not set | ||
443 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
444 | |||
445 | # | ||
446 | # Serial drivers | ||
447 | # | ||
448 | # CONFIG_SERIAL_8250 is not set | ||
449 | |||
450 | # | ||
451 | # Non-8250 serial port support | ||
452 | # | ||
453 | CONFIG_SERIAL_CORE=y | ||
454 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
455 | CONFIG_SERIAL_M32R_SIO=y | ||
456 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
457 | # CONFIG_SERIAL_M32R_PLDSIO is not set | ||
458 | CONFIG_UNIX98_PTYS=y | ||
459 | CONFIG_LEGACY_PTYS=y | ||
460 | CONFIG_LEGACY_PTY_COUNT=256 | ||
461 | |||
462 | # | ||
463 | # IPMI | ||
464 | # | ||
465 | # CONFIG_IPMI_HANDLER is not set | ||
466 | |||
467 | # | ||
468 | # Watchdog Cards | ||
469 | # | ||
470 | # CONFIG_WATCHDOG is not set | ||
471 | # CONFIG_RTC is not set | ||
472 | # CONFIG_GEN_RTC is not set | ||
473 | # CONFIG_DTLK is not set | ||
474 | # CONFIG_R3964 is not set | ||
475 | |||
476 | # | ||
477 | # Ftape, the floppy tape device driver | ||
478 | # | ||
479 | # CONFIG_DRM is not set | ||
480 | |||
481 | # | ||
482 | # PCMCIA character devices | ||
483 | # | ||
484 | # CONFIG_SYNCLINK_CS is not set | ||
485 | # CONFIG_RAW_DRIVER is not set | ||
486 | |||
487 | # | ||
488 | # I2C support | ||
489 | # | ||
490 | # CONFIG_I2C is not set | ||
491 | |||
492 | # | ||
493 | # Dallas's 1-wire bus | ||
494 | # | ||
495 | # CONFIG_W1 is not set | ||
496 | |||
497 | # | ||
498 | # Misc devices | ||
499 | # | ||
500 | |||
501 | # | ||
502 | # Multimedia devices | ||
503 | # | ||
504 | # CONFIG_VIDEO_DEV is not set | ||
505 | |||
506 | # | ||
507 | # Digital Video Broadcasting Devices | ||
508 | # | ||
509 | # CONFIG_DVB is not set | ||
510 | |||
511 | # | ||
512 | # Graphics support | ||
513 | # | ||
514 | # CONFIG_FB is not set | ||
515 | |||
516 | # | ||
517 | # Sound | ||
518 | # | ||
519 | # CONFIG_SOUND is not set | ||
520 | |||
521 | # | ||
522 | # USB support | ||
523 | # | ||
524 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
525 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
526 | |||
527 | # | ||
528 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
529 | # | ||
530 | |||
531 | # | ||
532 | # USB Gadget Support | ||
533 | # | ||
534 | # CONFIG_USB_GADGET is not set | ||
535 | |||
536 | # | ||
537 | # MMC/SD Card support | ||
538 | # | ||
539 | # CONFIG_MMC is not set | ||
540 | |||
541 | # | ||
542 | # InfiniBand support | ||
543 | # | ||
544 | # CONFIG_INFINIBAND is not set | ||
545 | |||
546 | # | ||
547 | # File systems | ||
548 | # | ||
549 | CONFIG_EXT2_FS=y | ||
550 | # CONFIG_EXT2_FS_XATTR is not set | ||
551 | # CONFIG_EXT3_FS is not set | ||
552 | # CONFIG_JBD is not set | ||
553 | # CONFIG_REISERFS_FS is not set | ||
554 | # CONFIG_JFS_FS is not set | ||
555 | |||
556 | # | ||
557 | # XFS support | ||
558 | # | ||
559 | # CONFIG_XFS_FS is not set | ||
560 | # CONFIG_MINIX_FS is not set | ||
561 | CONFIG_ROMFS_FS=y | ||
562 | # CONFIG_QUOTA is not set | ||
563 | CONFIG_DNOTIFY=y | ||
564 | # CONFIG_AUTOFS_FS is not set | ||
565 | # CONFIG_AUTOFS4_FS is not set | ||
566 | |||
567 | # | ||
568 | # CD-ROM/DVD Filesystems | ||
569 | # | ||
570 | CONFIG_ISO9660_FS=y | ||
571 | # CONFIG_JOLIET is not set | ||
572 | # CONFIG_ZISOFS is not set | ||
573 | # CONFIG_UDF_FS is not set | ||
574 | |||
575 | # | ||
576 | # DOS/FAT/NT Filesystems | ||
577 | # | ||
578 | CONFIG_FAT_FS=m | ||
579 | CONFIG_MSDOS_FS=m | ||
580 | CONFIG_VFAT_FS=m | ||
581 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
582 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
583 | # CONFIG_NTFS_FS is not set | ||
584 | |||
585 | # | ||
586 | # Pseudo filesystems | ||
587 | # | ||
588 | CONFIG_PROC_FS=y | ||
589 | CONFIG_PROC_KCORE=y | ||
590 | CONFIG_SYSFS=y | ||
591 | CONFIG_DEVFS_FS=y | ||
592 | CONFIG_DEVFS_MOUNT=y | ||
593 | # CONFIG_DEVFS_DEBUG is not set | ||
594 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
595 | CONFIG_TMPFS=y | ||
596 | # CONFIG_TMPFS_XATTR is not set | ||
597 | # CONFIG_HUGETLBFS is not set | ||
598 | # CONFIG_HUGETLB_PAGE is not set | ||
599 | CONFIG_RAMFS=y | ||
600 | |||
601 | # | ||
602 | # Miscellaneous filesystems | ||
603 | # | ||
604 | # CONFIG_ADFS_FS is not set | ||
605 | # CONFIG_AFFS_FS is not set | ||
606 | # CONFIG_HFS_FS is not set | ||
607 | # CONFIG_HFSPLUS_FS is not set | ||
608 | # CONFIG_BEFS_FS is not set | ||
609 | # CONFIG_BFS_FS is not set | ||
610 | # CONFIG_EFS_FS is not set | ||
611 | CONFIG_JFFS_FS=y | ||
612 | CONFIG_JFFS_FS_VERBOSE=0 | ||
613 | CONFIG_JFFS_PROC_FS=y | ||
614 | CONFIG_JFFS2_FS=y | ||
615 | CONFIG_JFFS2_FS_DEBUG=0 | ||
616 | # CONFIG_JFFS2_FS_NAND is not set | ||
617 | # CONFIG_JFFS2_FS_NOR_ECC is not set | ||
618 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
619 | CONFIG_JFFS2_ZLIB=y | ||
620 | CONFIG_JFFS2_RTIME=y | ||
621 | # CONFIG_JFFS2_RUBIN is not set | ||
622 | # CONFIG_CRAMFS is not set | ||
623 | # CONFIG_VXFS_FS is not set | ||
624 | # CONFIG_HPFS_FS is not set | ||
625 | # CONFIG_QNX4FS_FS is not set | ||
626 | # CONFIG_SYSV_FS is not set | ||
627 | # CONFIG_UFS_FS is not set | ||
628 | |||
629 | # | ||
630 | # Network File Systems | ||
631 | # | ||
632 | CONFIG_NFS_FS=y | ||
633 | CONFIG_NFS_V3=y | ||
634 | # CONFIG_NFS_V4 is not set | ||
635 | # CONFIG_NFS_DIRECTIO is not set | ||
636 | # CONFIG_NFSD is not set | ||
637 | CONFIG_ROOT_NFS=y | ||
638 | CONFIG_LOCKD=y | ||
639 | CONFIG_LOCKD_V4=y | ||
640 | CONFIG_SUNRPC=y | ||
641 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
642 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
643 | # CONFIG_SMB_FS is not set | ||
644 | # CONFIG_CIFS is not set | ||
645 | # CONFIG_NCP_FS is not set | ||
646 | # CONFIG_CODA_FS is not set | ||
647 | # CONFIG_AFS_FS is not set | ||
648 | |||
649 | # | ||
650 | # Partition Types | ||
651 | # | ||
652 | # CONFIG_PARTITION_ADVANCED is not set | ||
653 | CONFIG_MSDOS_PARTITION=y | ||
654 | |||
655 | # | ||
656 | # Native Language Support | ||
657 | # | ||
658 | CONFIG_NLS=y | ||
659 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
660 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
661 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
662 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
663 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
664 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
665 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
666 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
667 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
668 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
669 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
670 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
671 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
672 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
673 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
674 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
675 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
676 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
677 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
678 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
679 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
680 | # CONFIG_NLS_ISO8859_8 is not set | ||
681 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
682 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
683 | # CONFIG_NLS_ASCII is not set | ||
684 | # CONFIG_NLS_ISO8859_1 is not set | ||
685 | # CONFIG_NLS_ISO8859_2 is not set | ||
686 | # CONFIG_NLS_ISO8859_3 is not set | ||
687 | # CONFIG_NLS_ISO8859_4 is not set | ||
688 | # CONFIG_NLS_ISO8859_5 is not set | ||
689 | # CONFIG_NLS_ISO8859_6 is not set | ||
690 | # CONFIG_NLS_ISO8859_7 is not set | ||
691 | # CONFIG_NLS_ISO8859_9 is not set | ||
692 | # CONFIG_NLS_ISO8859_13 is not set | ||
693 | # CONFIG_NLS_ISO8859_14 is not set | ||
694 | # CONFIG_NLS_ISO8859_15 is not set | ||
695 | # CONFIG_NLS_KOI8_R is not set | ||
696 | # CONFIG_NLS_KOI8_U is not set | ||
697 | # CONFIG_NLS_UTF8 is not set | ||
698 | |||
699 | # | ||
700 | # Profiling support | ||
701 | # | ||
702 | # CONFIG_PROFILING is not set | ||
703 | |||
704 | # | ||
705 | # Kernel hacking | ||
706 | # | ||
707 | # CONFIG_DEBUG_KERNEL is not set | ||
708 | CONFIG_DEBUG_PREEMPT=y | ||
709 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
710 | # CONFIG_FRAME_POINTER is not set | ||
711 | |||
712 | # | ||
713 | # Security options | ||
714 | # | ||
715 | # CONFIG_KEYS is not set | ||
716 | # CONFIG_SECURITY is not set | ||
717 | |||
718 | # | ||
719 | # Cryptographic options | ||
720 | # | ||
721 | # CONFIG_CRYPTO is not set | ||
722 | |||
723 | # | ||
724 | # Hardware crypto devices | ||
725 | # | ||
726 | |||
727 | # | ||
728 | # Library routines | ||
729 | # | ||
730 | # CONFIG_CRC_CCITT is not set | ||
731 | CONFIG_CRC32=y | ||
732 | # CONFIG_LIBCRC32C is not set | ||
733 | CONFIG_ZLIB_INFLATE=y | ||
734 | CONFIG_ZLIB_DEFLATE=y | ||
diff --git a/arch/m32r/mappi/dot.gdbinit b/arch/m32r/mappi/dot.gdbinit new file mode 100644 index 000000000000..7a1d293863eb --- /dev/null +++ b/arch/m32r/mappi/dot.gdbinit | |||
@@ -0,0 +1,242 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id: dot.gdbinit.mappi,v 1.4 2004/10/20 02:24:37 takata Exp $ | ||
3 | #----- | ||
4 | # NOTE: this file is generated by a script, "gen_gdbinit.pl". | ||
5 | # (Please type "gen_gdbinit.pl --help" and check the help message). | ||
6 | # $ Id: gen_gdbinit.pl,v 1.12 2004/07/26 09:56:10 takata Exp $ | ||
7 | #----- | ||
8 | # target platform: mappi | ||
9 | |||
10 | # setting | ||
11 | set width 0d70 | ||
12 | set radix 0d16 | ||
13 | debug_chaos | ||
14 | |||
15 | # clk xin:cpu:bif:bus=30:360:180:90 | ||
16 | define clock_init | ||
17 | set *(unsigned long *)0x00ef4024 = 2 | ||
18 | set *(unsigned long *)0x00ef4020 = 1 | ||
19 | set *(unsigned long *)0x00ef4010 = 0 | ||
20 | set *(unsigned long *)0x00ef4014 = 0 | ||
21 | set *(unsigned long *)0x00ef4004 = 5 | ||
22 | shell sleep 0.1 | ||
23 | set *(unsigned long *)0x00ef4008 = 0x00000200 | ||
24 | end | ||
25 | |||
26 | # Initialize programmable ports | ||
27 | define port_init | ||
28 | set $sfrbase = 0x00ef0000 | ||
29 | set *(unsigned short *)0x00ef1060 = 0x5555 | ||
30 | set *(unsigned short *)0x00ef1062 = 0x5555 | ||
31 | set *(unsigned short *)0x00ef1064 = 0x5555 | ||
32 | set *(unsigned short *)0x00ef1066 = 0x5555 | ||
33 | set *(unsigned short *)0x00ef1068 = 0x5555 | ||
34 | set *(unsigned short *)0x00ef106a = 0x0000 | ||
35 | set *(unsigned short *)0x00ef106e = 0x5555 | ||
36 | set *(unsigned short *)0x00ef1070 = 0x5555 | ||
37 | # LED ON | ||
38 | set *(unsigned char *)($sfrbase + 0x1015) = 0xff | ||
39 | set *(unsigned char *)($sfrbase + 0x1085) = 0xff | ||
40 | shell sleep 0.1 | ||
41 | # LED OFF | ||
42 | set *(unsigned char *)($sfrbase + 0x1085) = 0x00 | ||
43 | end | ||
44 | document port_init | ||
45 | P5=LED(output), P6.b4=LAN_RESET(output) | ||
46 | end | ||
47 | |||
48 | # Initialize SDRAM controller | ||
49 | define sdram_init | ||
50 | # SDIR0 | ||
51 | set *(unsigned long *)0x00ef6008 = 0x00000182 | ||
52 | # SDIR1 | ||
53 | set *(unsigned long *)0x00ef600c = 0x00000001 | ||
54 | # Initialize wait | ||
55 | shell sleep 0.1 | ||
56 | # Ch0-MOD | ||
57 | set *(unsigned long *)0x00ef602c = 0x00000020 | ||
58 | # Ch0-TR | ||
59 | set *(unsigned long *)0x00ef6028 = 0x00051502 | ||
60 | # Ch0-ADR (size:64MB) | ||
61 | set *(unsigned long *)0x00ef6020 = 0x08000004 | ||
62 | # AutoRef On | ||
63 | set *(unsigned long *)0x00ef6004 = 0x00010e2b | ||
64 | # Access enable | ||
65 | set *(unsigned long *)0x00ef6024 = 0x00000001 | ||
66 | end | ||
67 | document sdram_init | ||
68 | SDRAM controller initialization | ||
69 | 0x08000000 - 0x0bffffff (64MB) | ||
70 | end | ||
71 | |||
72 | # Initialize LAN controller | ||
73 | define lanc_init | ||
74 | set $sfrbase = 0x00ef0000 | ||
75 | # Set BSEL3 (BSEL3 for the Chaos's bselc) | ||
76 | set *(unsigned long *)($sfrbase + 0x5300) = 0x0a0a8040 | ||
77 | set *(unsigned long *)($sfrbase + 0x5304) = 0x01120203 | ||
78 | set *(unsigned long *)($sfrbase + 0x5308) = 0x00000001 | ||
79 | # Reset (P5=LED,P6.b4=LAN_RESET) | ||
80 | set *(unsigned short *)($sfrbase + 0x106c) = 0x0000 | ||
81 | set *(unsigned char *)($sfrbase + 0x1016) = 0xff | ||
82 | set *(unsigned char *)($sfrbase + 0x1086) = 0xff | ||
83 | shell sleep 0.1 | ||
84 | # swivel: 0=normal, 4=reverse | ||
85 | # set *(unsigned char *)($sfrbase + 0x1086) = 0x00 | ||
86 | set *(unsigned char *)($sfrbase + 0x1086) = 0x04 | ||
87 | set *(unsigned long *)(0x0c000330) = 0xffffffff | ||
88 | # Set mac address | ||
89 | set $lanc = (void*)0x0c000300 | ||
90 | set *(unsigned long *)($lanc + 0x0000) = 0x00610010 | ||
91 | set *(unsigned long *)($lanc + 0x0004) = 0x00200030 | ||
92 | set *(unsigned long *)($lanc + 0x0008) = 0x00400050 | ||
93 | set *(unsigned long *)($lanc + 0x000c) = 0x00600007 | ||
94 | end | ||
95 | document lanc_init | ||
96 | LAN controller initialization | ||
97 | ex.) MAC address: 10 20 30 40 50 60 | ||
98 | end | ||
99 | |||
100 | # LCD & CRT dual-head setting (8bpp) | ||
101 | define dispc_init | ||
102 | set $sfrbase = 0x00ef0000 | ||
103 | # BSEL4 Dispc | ||
104 | set *(unsigned long *)($sfrbase + 0x5400) = 0x0e0e8000 | ||
105 | set *(unsigned long *)($sfrbase + 0x5404) = 0x0012220a | ||
106 | end | ||
107 | |||
108 | # MMU enable | ||
109 | define mmu_enable | ||
110 | set $evb=0x88000000 | ||
111 | set *(unsigned long *)0xffff0024=1 | ||
112 | end | ||
113 | |||
114 | # MMU disable | ||
115 | define mmu_disable | ||
116 | set $evb=0 | ||
117 | set *(unsigned long *)0xffff0024=0 | ||
118 | end | ||
119 | |||
120 | # Show TLB entries | ||
121 | define show_tlb_entries | ||
122 | set $i = 0 | ||
123 | set $addr = $arg0 | ||
124 | set $nr_entries = $arg1 | ||
125 | use_mon_code | ||
126 | while ($i < $nr_entries) | ||
127 | set $tlb_tag = *(unsigned long*)$addr | ||
128 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
129 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
130 | set $i = $i + 1 | ||
131 | set $addr = $addr + 8 | ||
132 | end | ||
133 | use_debug_dma | ||
134 | end | ||
135 | define itlb | ||
136 | set $itlb=0xfe000000 | ||
137 | show_tlb_entries $itlb 0d32 | ||
138 | end | ||
139 | define dtlb | ||
140 | set $dtlb=0xfe000800 | ||
141 | show_tlb_entries $dtlb 0d32 | ||
142 | end | ||
143 | |||
144 | # Show current task structure | ||
145 | define show_current | ||
146 | set $current = $spi & 0xffffe000 | ||
147 | printf "$current=0x%08lX\n",$current | ||
148 | print *(struct task_struct *)$current | ||
149 | end | ||
150 | |||
151 | # Show user assigned task structure | ||
152 | define show_task | ||
153 | set = $arg0 & 0xffffe000 | ||
154 | printf "$task=0x%08lX\n",$task | ||
155 | print *(struct task_struct *)$task | ||
156 | end | ||
157 | document show_task | ||
158 | Show user assigned task structure | ||
159 | arg0 : task structure address | ||
160 | end | ||
161 | |||
162 | # Show M32R registers | ||
163 | define show_regs | ||
164 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
165 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
166 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
167 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$sp | ||
168 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
169 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
170 | printf "EVB[0x%08lX]\n",$evb | ||
171 | end | ||
172 | |||
173 | # Setup all | ||
174 | define setup | ||
175 | use_mon_code | ||
176 | set *(unsigned int)0xfffffffc=0x60 | ||
177 | shell sleep 0.1 | ||
178 | clock_init | ||
179 | shell sleep 0.1 | ||
180 | port_init | ||
181 | sdram_init | ||
182 | lanc_init | ||
183 | dispc_init | ||
184 | set $evb=0x08000000 | ||
185 | end | ||
186 | |||
187 | # Load modules | ||
188 | define load_modules | ||
189 | use_debug_dma | ||
190 | load | ||
191 | end | ||
192 | |||
193 | # Set kernel parameters | ||
194 | define set_kernel_parameters | ||
195 | set $param = (void*)0x08001000 | ||
196 | # INITRD_START | ||
197 | # set *(unsigned long *)($param + 0x0010) = 0x08300000 | ||
198 | # INITRD_SIZE | ||
199 | # set *(unsigned long *)($param + 0x0014) = 0x00000000 | ||
200 | # M32R_CPUCLK | ||
201 | set *(unsigned long *)($param + 0x0018) = 0d360000000 | ||
202 | # M32R_BUSCLK | ||
203 | set *(unsigned long *)($param + 0x001c) = 0d90000000 | ||
204 | |||
205 | # M32R_TIMER_DIVIDE | ||
206 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
207 | |||
208 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x console=tty1 root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/rootfs nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 \0" | ||
209 | end | ||
210 | |||
211 | # Boot | ||
212 | define boot | ||
213 | set_kernel_parameters | ||
214 | set $fp = 0 | ||
215 | set $pc = 0x08002000 | ||
216 | si | ||
217 | c | ||
218 | end | ||
219 | |||
220 | # Set breakpoints | ||
221 | define set_breakpoints | ||
222 | b *0x08000030 | ||
223 | end | ||
224 | |||
225 | # Restart | ||
226 | define restart | ||
227 | sdireset | ||
228 | sdireset | ||
229 | setup | ||
230 | load_modules | ||
231 | boot | ||
232 | end | ||
233 | |||
234 | sdireset | ||
235 | sdireset | ||
236 | file vmlinux | ||
237 | target m32rsdi | ||
238 | setup | ||
239 | #load_modules | ||
240 | #set_breakpoints | ||
241 | #boot | ||
242 | |||
diff --git a/arch/m32r/mappi/dot.gdbinit.nommu b/arch/m32r/mappi/dot.gdbinit.nommu new file mode 100644 index 000000000000..297536cf67cf --- /dev/null +++ b/arch/m32r/mappi/dot.gdbinit.nommu | |||
@@ -0,0 +1,245 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id$ | ||
3 | #----- | ||
4 | # NOTE: this file is generated by a script, "gen_gdbinit.pl". | ||
5 | # (Please type "gen_gdbinit.pl --help" and check the help message). | ||
6 | # $ Id: gen_gdbinit.pl,v 1.5 2004/01/23 08:23:25 takata Exp $ | ||
7 | #----- | ||
8 | # target platform: mappi | ||
9 | |||
10 | # setting | ||
11 | set width 0d70 | ||
12 | set radix 0d16 | ||
13 | debug_chaos | ||
14 | |||
15 | # clk xin:cpu:bif:bus=25:200:50:50 | ||
16 | define clock_init | ||
17 | set *(unsigned long *)0x00ef4024 = 2 | ||
18 | set *(unsigned long *)0x00ef4020 = 2 | ||
19 | set *(unsigned long *)0x00ef4010 = 0 | ||
20 | set *(unsigned long *)0x00ef4014 = 0 | ||
21 | set *(unsigned long *)0x00ef4004 = 3 | ||
22 | shell sleep 0.1 | ||
23 | set *(unsigned long *)0x00ef4008 = 0x00000200 | ||
24 | end | ||
25 | |||
26 | # Initialize programmable ports | ||
27 | define port_init | ||
28 | set $sfrbase = 0x00ef0000 | ||
29 | set *(unsigned short *)0x00ef1060 = 0x5555 | ||
30 | set *(unsigned short *)0x00ef1062 = 0x5555 | ||
31 | set *(unsigned short *)0x00ef1064 = 0x5555 | ||
32 | set *(unsigned short *)0x00ef1066 = 0x5555 | ||
33 | set *(unsigned short *)0x00ef1068 = 0x5555 | ||
34 | set *(unsigned short *)0x00ef106a = 0x0000 | ||
35 | set *(unsigned short *)0x00ef106e = 0x5555 | ||
36 | set *(unsigned short *)0x00ef1070 = 0x5555 | ||
37 | # LED ON | ||
38 | set *(unsigned char *)($sfrbase + 0x1015) = 0xff | ||
39 | set *(unsigned char *)($sfrbase + 0x1085) = 0xff | ||
40 | shell sleep 0.1 | ||
41 | # LED OFF | ||
42 | set *(unsigned char *)($sfrbase + 0x1085) = 0x00 | ||
43 | end | ||
44 | document port_init | ||
45 | P5=LED(output), P6.b4=LAN_RESET(output) | ||
46 | end | ||
47 | |||
48 | # Initialize SDRAM controller | ||
49 | define sdram_init | ||
50 | # SDIR0 | ||
51 | set *(unsigned long *)0x00ef6008 = 0x00000182 | ||
52 | # SDIR1 | ||
53 | set *(unsigned long *)0x00ef600c = 0x00000001 | ||
54 | # Initialize wait | ||
55 | shell sleep 0.1 | ||
56 | # Ch0-MOD | ||
57 | set *(unsigned long *)0x00ef602c = 0x00000020 | ||
58 | # Ch0-TR | ||
59 | set *(unsigned long *)0x00ef6028 = 0x00051502 | ||
60 | # Ch0-ADR (size:64MB) | ||
61 | set *(unsigned long *)0x00ef6020 = 0x00000004 | ||
62 | # AutoRef On | ||
63 | set *(unsigned long *)0x00ef6004 = 0x00010f05 | ||
64 | # Access enable | ||
65 | set *(unsigned long *)0x00ef6024 = 0x00000001 | ||
66 | end | ||
67 | document sdram_init | ||
68 | SDRAM controller initialization | ||
69 | 0x08000000 - 0x0bffffff (64MB) | ||
70 | end | ||
71 | |||
72 | # Initialize LAN controller | ||
73 | define lanc_init | ||
74 | set $sfrbase = 0x00ef0000 | ||
75 | # Set BSEL3 (BSEL3 for the Chaos's bselc) | ||
76 | set *(unsigned long *)($sfrbase + 0x5300) = 0x07078040 | ||
77 | set *(unsigned long *)($sfrbase + 0x5304) = 0x01110102 | ||
78 | set *(unsigned long *)($sfrbase + 0x5308) = 0x00000001 | ||
79 | # Reset (P5=LED,P6.b4=LAN_RESET) | ||
80 | set *(unsigned short *)($sfrbase + 0x106c) = 0x0000 | ||
81 | set *(unsigned char *)($sfrbase + 0x1016) = 0xff | ||
82 | set *(unsigned char *)($sfrbase + 0x1086) = 0xff | ||
83 | shell sleep 0.1 | ||
84 | # swivel: 0=normal, 4=reverse | ||
85 | # set *(unsigned char *)($sfrbase + 0x1086) = 0x00 | ||
86 | set *(unsigned char *)($sfrbase + 0x1086) = 0x04 | ||
87 | set *(unsigned long *)(0x0c000330) = 0xffffffff | ||
88 | # Set mac address | ||
89 | set $lanc = (void*)0x0c000300 | ||
90 | set *(unsigned long *)($lanc + 0x0000) = 0x00610010 | ||
91 | set *(unsigned long *)($lanc + 0x0004) = 0x00200030 | ||
92 | set *(unsigned long *)($lanc + 0x0008) = 0x00400050 | ||
93 | set *(unsigned long *)($lanc + 0x000c) = 0x00600007 | ||
94 | end | ||
95 | document lanc_init | ||
96 | LAN controller initialization | ||
97 | ex.) MAC address: 10 20 30 40 50 60 | ||
98 | end | ||
99 | |||
100 | # LCD & CRT dual-head setting (8bpp) | ||
101 | define dispc_init | ||
102 | set $sfrbase = 0x00ef0000 | ||
103 | # BSEL4 Dispc | ||
104 | set *(unsigned long *)($sfrbase + 0x5400) = 0x06078000 | ||
105 | set *(unsigned long *)($sfrbase + 0x5404) = 0x00101101 | ||
106 | end | ||
107 | |||
108 | # MMU enable | ||
109 | define mmu_enable | ||
110 | set $evb=0x88000000 | ||
111 | set *(unsigned long *)0xffff0024=1 | ||
112 | end | ||
113 | |||
114 | # MMU disable | ||
115 | define mmu_disable | ||
116 | set $evb=0 | ||
117 | set *(unsigned long *)0xffff0024=0 | ||
118 | end | ||
119 | |||
120 | # Show TLB entries | ||
121 | define show_tlb_entries | ||
122 | set $i = 0 | ||
123 | set $addr = $arg0 | ||
124 | set $nr_entries = $arg1 | ||
125 | use_mon_code | ||
126 | while ($i < $nr_entries) | ||
127 | set $tlb_tag = *(unsigned long*)$addr | ||
128 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
129 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
130 | set $i = $i + 1 | ||
131 | set $addr = $addr + 8 | ||
132 | end | ||
133 | use_debug_dma | ||
134 | end | ||
135 | define itlb | ||
136 | set $itlb=0xfe000000 | ||
137 | show_tlb_entries $itlb 0d32 | ||
138 | end | ||
139 | define dtlb | ||
140 | set $dtlb=0xfe000800 | ||
141 | show_tlb_entries $dtlb 0d32 | ||
142 | end | ||
143 | |||
144 | # Show current task structure | ||
145 | define show_current | ||
146 | set $current = $spi & 0xffffe000 | ||
147 | printf "$current=0x%08lX\n",$current | ||
148 | print *(struct task_struct *)$current | ||
149 | end | ||
150 | |||
151 | # Show user assigned task structure | ||
152 | define show_task | ||
153 | set = $arg0 & 0xffffe000 | ||
154 | printf "$task=0x%08lX\n",$task | ||
155 | print *(struct task_struct *)$task | ||
156 | end | ||
157 | document show_task | ||
158 | Show user assigned task structure | ||
159 | arg0 : task structure address | ||
160 | end | ||
161 | |||
162 | # Show M32R registers | ||
163 | define show_regs | ||
164 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
165 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
166 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
167 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$sp | ||
168 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
169 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
170 | printf "EVB[0x%08lX]\n",$evb | ||
171 | end | ||
172 | |||
173 | # Setup all | ||
174 | define setup | ||
175 | use_mon_code | ||
176 | set *(unsigned int)0xfffffffc=0x60 | ||
177 | shell sleep 0.1 | ||
178 | clock_init | ||
179 | shell sleep 0.1 | ||
180 | port_init | ||
181 | sdram_init | ||
182 | lanc_init | ||
183 | dispc_init | ||
184 | set $evb=0x00000000 | ||
185 | end | ||
186 | |||
187 | # Load modules | ||
188 | define load_modules | ||
189 | use_debug_dma | ||
190 | load | ||
191 | end | ||
192 | |||
193 | # Set kernel parameters | ||
194 | define set_kernel_parameters | ||
195 | set $param = (void*)0x00001000 | ||
196 | # INITRD_START | ||
197 | #set *(unsigned long *)($param + 0x0010) = 0x082a0000 | ||
198 | # INITRD_SIZE | ||
199 | #set *(unsigned long *)($param + 0x0014) = 0x00000000 | ||
200 | # M32R_CPUCLK | ||
201 | set *(unsigned long *)($param + 0x0018) = 0d200000000 | ||
202 | # M32R_BUSCLK | ||
203 | set *(unsigned long *)($param + 0x001c) = 0d50000000 | ||
204 | |||
205 | # M32R_TIMER_DIVIDE | ||
206 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
207 | |||
208 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/root.bbox-httpd nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 \0" | ||
209 | end | ||
210 | |||
211 | # Boot | ||
212 | define boot | ||
213 | set_kernel_parameters | ||
214 | set $fp = 0 | ||
215 | set $pc=0x00002000 | ||
216 | set *(long *)0xfffffff4=0x8080 | ||
217 | # b load_flat_binary | ||
218 | # set *(unsigned char *)0x08001003=0x63 | ||
219 | # set *(unsigned char *)0x08001003=0x02 | ||
220 | si | ||
221 | # c | ||
222 | end | ||
223 | |||
224 | # Set breakpoints | ||
225 | define set_breakpoints | ||
226 | b *0x08000030 | ||
227 | end | ||
228 | |||
229 | # Restart | ||
230 | define restart | ||
231 | sdireset | ||
232 | sdireset | ||
233 | setup | ||
234 | load_modules | ||
235 | boot | ||
236 | end | ||
237 | |||
238 | sdireset | ||
239 | sdireset | ||
240 | file vmlinux | ||
241 | target m32rsdi | ||
242 | setup | ||
243 | load_modules | ||
244 | boot | ||
245 | |||
diff --git a/arch/m32r/mappi/dot.gdbinit.smp b/arch/m32r/mappi/dot.gdbinit.smp new file mode 100644 index 000000000000..171489a440d9 --- /dev/null +++ b/arch/m32r/mappi/dot.gdbinit.smp | |||
@@ -0,0 +1,344 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id$ | ||
3 | |||
4 | # setting | ||
5 | set width 0d70 | ||
6 | set radix 0d16 | ||
7 | debug_chaos | ||
8 | |||
9 | # clk xin:cpu:bif:bus=1:4:2:1 | ||
10 | define clock_init_on | ||
11 | set *(unsigned long *)0x00ef4024 = 2 | ||
12 | set *(unsigned long *)0x00ef4020 = 1 | ||
13 | set *(unsigned long *)0x00ef4010 = 0 | ||
14 | set *(unsigned long *)0x00ef4014 = 0 | ||
15 | set *(unsigned long *)0x00ef4004 = 0x1 | ||
16 | shell sleep 0.1 | ||
17 | set *(unsigned long *)0x00ef4008 = 0x0200 | ||
18 | # set *(unsigned long *)0x00ef4008 = 0x0201 | ||
19 | end | ||
20 | |||
21 | # clk xin:cpu:bif:bus=1:4:1:1 | ||
22 | define clock_init_on_1411 | ||
23 | set *(unsigned long *)0x00ef4024 = 2 | ||
24 | set *(unsigned long *)0x00ef4020 = 2 | ||
25 | set *(unsigned long *)0x00ef4010 = 0 | ||
26 | set *(unsigned long *)0x00ef4014 = 0 | ||
27 | set *(unsigned long *)0x00ef4004 = 0x1 | ||
28 | shell sleep 0.1 | ||
29 | set *(unsigned long *)0x00ef4008 = 0x0200 | ||
30 | end | ||
31 | |||
32 | # clk xin:cpu:bif:bus=1:4:2:1 | ||
33 | define clock_init_on_1421 | ||
34 | set *(unsigned long *)0x00ef4024 = 2 | ||
35 | set *(unsigned long *)0x00ef4020 = 1 | ||
36 | set *(unsigned long *)0x00ef4010 = 0 | ||
37 | set *(unsigned long *)0x00ef4014 = 0 | ||
38 | set *(unsigned long *)0x00ef4004 = 0x1 | ||
39 | shell sleep 0.1 | ||
40 | set *(unsigned long *)0x00ef4008 = 0x0200 | ||
41 | end | ||
42 | |||
43 | # clk xin:cpu:bif:bus=1:8:2:1 | ||
44 | define clock_init_on_1821 | ||
45 | set *(unsigned long *)0x00ef4024 = 3 | ||
46 | set *(unsigned long *)0x00ef4020 = 2 | ||
47 | set *(unsigned long *)0x00ef4010 = 0 | ||
48 | set *(unsigned long *)0x00ef4014 = 0 | ||
49 | set *(unsigned long *)0x00ef4004 = 0x3 | ||
50 | shell sleep 0.1 | ||
51 | set *(unsigned long *)0x00ef4008 = 0x0200 | ||
52 | end | ||
53 | |||
54 | # clk xin:cpu:bif:bus=1:8:4:1 | ||
55 | define clock_init_on_1841 | ||
56 | set *(unsigned long *)0x00ef4024 = 3 | ||
57 | set *(unsigned long *)0x00ef4020 = 1 | ||
58 | set *(unsigned long *)0x00ef4010 = 0 | ||
59 | set *(unsigned long *)0x00ef4014 = 0 | ||
60 | set *(unsigned long *)0x00ef4004 = 0x3 | ||
61 | shell sleep 0.1 | ||
62 | set *(unsigned long *)0x00ef4008 = 0x0200 | ||
63 | end | ||
64 | |||
65 | # clk xin:cpu:bif:bus=1:16:8:1 | ||
66 | define clock_init_on_11681 | ||
67 | set *(unsigned long *)0x00ef4024 = 4 | ||
68 | set *(unsigned long *)0x00ef4020 = 2 | ||
69 | set *(unsigned long *)0x00ef4010 = 0 | ||
70 | set *(unsigned long *)0x00ef4014 = 0 | ||
71 | set *(unsigned long *)0x00ef4004 = 0x7 | ||
72 | shell sleep 0.1 | ||
73 | set *(unsigned long *)0x00ef4008 = 0x0200 | ||
74 | end | ||
75 | |||
76 | # clk xin:cpu:bif:bus=1:1:1:1 | ||
77 | define clock_init_off | ||
78 | # CPU | ||
79 | set *(unsigned long *)0x00ef4010 = 0 | ||
80 | set *(unsigned long *)0x00ef4014 = 0 | ||
81 | # BIF | ||
82 | set *(unsigned long *)0x00ef4020 = 0 | ||
83 | # BUS | ||
84 | set *(unsigned long *)0x00ef4024 = 0 | ||
85 | # PLL | ||
86 | set *(unsigned long *)0x00ef4008 = 0x0000 | ||
87 | end | ||
88 | |||
89 | # Initialize programmable ports | ||
90 | define port_init | ||
91 | set $sfrbase = 0x00ef0000 | ||
92 | set *(unsigned short *)0x00ef1060 = 0x5555 | ||
93 | set *(unsigned short *)0x00ef1062 = 0x5555 | ||
94 | set *(unsigned short *)0x00ef1064 = 0x5555 | ||
95 | set *(unsigned short *)0x00ef1066 = 0x5555 | ||
96 | set *(unsigned short *)0x00ef1068 = 0x5555 | ||
97 | set *(unsigned short *)0x00ef106a = 0x0000 | ||
98 | set *(unsigned short *)0x00ef106e = 0x5555 | ||
99 | set *(unsigned short *)0x00ef1070 = 0x5555 | ||
100 | # LED ON | ||
101 | set *(unsigned char *)($sfrbase + 0x1015) = 0xff | ||
102 | set *(unsigned char *)($sfrbase + 0x1085) = 0xff | ||
103 | shell sleep 0.1 | ||
104 | # LED OFF | ||
105 | set *(unsigned char *)($sfrbase + 0x1085) = 0x00 | ||
106 | end | ||
107 | document port_init | ||
108 | P5=LED(output), P6.b4=LAN_RESET(output) | ||
109 | end | ||
110 | |||
111 | # Initialize SDRAM controller for Mappi | ||
112 | define sdram_init | ||
113 | # SDIR0 | ||
114 | set *(unsigned long *)0x00ef6008 = 0x00000182 | ||
115 | # SDIR1 | ||
116 | set *(unsigned long *)0x00ef600c = 0x00000001 | ||
117 | # Initialize wait | ||
118 | shell sleep 0.1 | ||
119 | # Ch0-MOD | ||
120 | set *(unsigned long *)0x00ef602c = 0x00000020 | ||
121 | # Ch0-TR | ||
122 | set *(unsigned long *)0x00ef6028 = 0x00010002 | ||
123 | # Ch0-ADR | ||
124 | set *(unsigned long *)0x00ef6020 = 0x08000004 | ||
125 | # AutoRef On | ||
126 | set *(unsigned long *)0x00ef6004 = 0x00010107 | ||
127 | # Access enable | ||
128 | set *(unsigned long *)0x00ef6024 = 0x00000001 | ||
129 | end | ||
130 | document sdram_init | ||
131 | Mappi SDRAM controller initialization | ||
132 | 0x08000000 - 0x0bffffff (64MB) | ||
133 | end | ||
134 | |||
135 | # Initialize LAN controller for Mappi | ||
136 | define lanc_init | ||
137 | set $sfrbase = 0x00ef0000 | ||
138 | # Set BSEL3 (BSEL3 for the Chaos's bselc) | ||
139 | # set *(unsigned long *)($sfrbase + 0x5300) = 0x01018040 | ||
140 | # set *(unsigned long *)($sfrbase + 0x5304) = 0x01011101 | ||
141 | set *(unsigned long *)($sfrbase + 0x5300) = 0x04048000 | ||
142 | set *(unsigned long *)($sfrbase + 0x5304) = 0x01011103 | ||
143 | set *(unsigned long *)($sfrbase + 0x5308) = 0x00000001 | ||
144 | # Reset (P5=LED,P6.b4=LAN_RESET) | ||
145 | set *(unsigned short *)($sfrbase + 0x106c) = 0x0000 | ||
146 | set *(unsigned char *)($sfrbase + 0x1016) = 0xff | ||
147 | set *(unsigned char *)($sfrbase + 0x1086) = 0xff | ||
148 | shell sleep 0.1 | ||
149 | # set *(unsigned char *)($sfrbase + 0x1086) = 0x00 | ||
150 | set *(unsigned char *)($sfrbase + 0x1086) = 0x04 | ||
151 | set *(unsigned long *)(0x0c000330) = 0xffffffff | ||
152 | # Set mac address | ||
153 | set $lanc = (void*)0x0c000300 | ||
154 | set *(unsigned long *)($lanc + 0x0000) = 0x00610010 | ||
155 | set *(unsigned long *)($lanc + 0x0004) = 0x00200030 | ||
156 | set *(unsigned long *)($lanc + 0x0008) = 0x00400050 | ||
157 | set *(unsigned long *)($lanc + 0x000c) = 0x00600007 | ||
158 | end | ||
159 | document lanc_init | ||
160 | Mappi LAN controller initialization | ||
161 | ex.) MAC address: 10 20 30 40 50 60 | ||
162 | end | ||
163 | |||
164 | # LCD & CRT dual-head setting (8bpp) | ||
165 | define dispc_init | ||
166 | set $sfrbase = 0x00ef0000 | ||
167 | # BSEL4 Dispc | ||
168 | # 20MHz | ||
169 | # set *(unsigned long *)($sfrbase + 0x5400) = 0x02028282 | ||
170 | # set *(unsigned long *)($sfrbase + 0x5404) = 0x00122202 | ||
171 | # 40MHz | ||
172 | set *(unsigned long *)($sfrbase + 0x5400) = 0x04048000 | ||
173 | set *(unsigned long *)($sfrbase + 0x5404) = 0x00101103 | ||
174 | end | ||
175 | |||
176 | # MMU enable | ||
177 | define mmu_enable | ||
178 | set $evb=0x88000000 | ||
179 | set *(unsigned long *)0xffff0024=1 | ||
180 | end | ||
181 | |||
182 | # MMU disable | ||
183 | define mmu_disable | ||
184 | set $evb=0 | ||
185 | set *(unsigned long *)0xffff0024=0 | ||
186 | end | ||
187 | |||
188 | # Show TLB entries | ||
189 | define show_tlb_entries | ||
190 | set $i = 0 | ||
191 | set $addr = $arg0 | ||
192 | use_mon_code | ||
193 | while ($i < 0d32 ) | ||
194 | set $tlb_tag = *(unsigned long*)$addr | ||
195 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
196 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
197 | set $i = $i + 1 | ||
198 | set $addr = $addr + 8 | ||
199 | end | ||
200 | use_debug_dma | ||
201 | end | ||
202 | define itlb | ||
203 | set $itlb=0xfe000000 | ||
204 | show_tlb_entries $itlb | ||
205 | end | ||
206 | define dtlb | ||
207 | set $dtlb=0xfe000800 | ||
208 | show_tlb_entries $dtlb | ||
209 | end | ||
210 | |||
211 | |||
212 | # Show current task structure | ||
213 | define show_current | ||
214 | set $current = $spi & 0xffffe000 | ||
215 | printf "$current=0x%08lX\n",$current | ||
216 | print *(struct task_struct *)$current | ||
217 | end | ||
218 | |||
219 | # Show user assigned task structure | ||
220 | define show_task | ||
221 | set $task = $arg0 & 0xffffe000 | ||
222 | printf "$task=0x%08lX\n",$task | ||
223 | print *(struct task_struct *)$task | ||
224 | end | ||
225 | document show_task | ||
226 | Show user assigned task structure | ||
227 | arg0 : task structure address | ||
228 | end | ||
229 | |||
230 | # Show M32R registers | ||
231 | define show_regs | ||
232 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
233 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
234 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
235 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$fp | ||
236 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
237 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
238 | printf "EVB[0x%08lX]\n",$evb | ||
239 | end | ||
240 | |||
241 | |||
242 | # Setup all | ||
243 | define setup | ||
244 | use_mon_code | ||
245 | set *(unsigned int)0xfffffffc=0x60 | ||
246 | shell sleep 0.1 | ||
247 | # clock_init_on_1411 | ||
248 | clock_init_on_1421 | ||
249 | # clock_init_on_1821 | ||
250 | # clock_init_on_1841 | ||
251 | # clock_init_on_11681 | ||
252 | # clock_init_off | ||
253 | shell sleep 0.1 | ||
254 | port_init | ||
255 | sdram_init | ||
256 | lanc_init | ||
257 | dispc_init | ||
258 | set $evb=0x08000000 | ||
259 | end | ||
260 | |||
261 | # Load modules | ||
262 | define load_modules | ||
263 | use_debug_dma | ||
264 | load | ||
265 | # load ramdisk_082a0000.mot | ||
266 | # load romfs_082a0000.mot | ||
267 | # use_mon_code | ||
268 | end | ||
269 | |||
270 | # Set kernel parameters | ||
271 | define set_kernel_parameters | ||
272 | set $param = (void*)0x08001000 | ||
273 | # INITRD_START | ||
274 | # set *(unsigned long *)($param + 0x0010) = 0x082a0000 | ||
275 | # INITRD_SIZE | ||
276 | # set *(unsigned long *)($param + 0x0014) = 0x00000000 | ||
277 | # M32R_CPUCLK | ||
278 | set *(unsigned long *)($param + 0x0018) = 0d160000000 | ||
279 | # set *(unsigned long *)($param + 0x0018) = 0d80000000 | ||
280 | # set *(unsigned long *)($param + 0x0018) = 0d40000000 | ||
281 | # M32R_BUSCLK | ||
282 | set *(unsigned long *)($param + 0x001c) = 0d40000000 | ||
283 | |||
284 | # M32R_TIMER_DIVIDE | ||
285 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
286 | |||
287 | set {char[0x200]}($param + 0x100) = "console=tty1 console=ttyS0,115200n8x root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/root.x nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 \0" | ||
288 | # set {char[0x200]}($param + 0x100) = "console=tty1 root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/root.x nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 \0" | ||
289 | end | ||
290 | |||
291 | # Boot | ||
292 | define boot | ||
293 | set_kernel_parameters | ||
294 | set $pc=0x08002000 | ||
295 | set *(unsigned char *)0x08001003=0x03 | ||
296 | si | ||
297 | c | ||
298 | end | ||
299 | |||
300 | # Set breakpoints | ||
301 | define set_breakpoints | ||
302 | b *0x08000030 | ||
303 | end | ||
304 | |||
305 | ## Boot MP | ||
306 | define boot_mp | ||
307 | set_kernel_parameters | ||
308 | set *(unsigned long *)0x00f00000 = boot - 0x80000000 | ||
309 | set *(unsigned long *)0x00eff2f8 = 0x2 | ||
310 | x 0x00eff2f8 | ||
311 | |||
312 | set $pc=0x08002000 | ||
313 | si | ||
314 | c | ||
315 | end | ||
316 | document boot_mp | ||
317 | Boot BSP | ||
318 | end | ||
319 | |||
320 | ## Boot UP | ||
321 | define boot_up | ||
322 | set_kernel_parameters | ||
323 | set $pc=0x08002000 | ||
324 | si | ||
325 | c | ||
326 | end | ||
327 | document boot_up | ||
328 | Boot BSP | ||
329 | end | ||
330 | |||
331 | # Restart | ||
332 | define restart | ||
333 | sdireset | ||
334 | sdireset | ||
335 | setup | ||
336 | load_modules | ||
337 | boot_mp | ||
338 | end | ||
339 | |||
340 | sdireset | ||
341 | sdireset | ||
342 | file vmlinux | ||
343 | target m32rsdi | ||
344 | setup | ||
diff --git a/arch/m32r/mappi2/defconfig.vdec2 b/arch/m32r/mappi2/defconfig.vdec2 new file mode 100644 index 000000000000..c14791d27300 --- /dev/null +++ b/arch/m32r/mappi2/defconfig.vdec2 | |||
@@ -0,0 +1,725 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:11:10 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | CONFIG_CLEAN_COMPILE=y | ||
17 | CONFIG_BROKEN_ON_SMP=y | ||
18 | CONFIG_LOCK_KERNEL=y | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_LOCALVERSION="" | ||
24 | CONFIG_SWAP=y | ||
25 | CONFIG_SYSVIPC=y | ||
26 | # CONFIG_POSIX_MQUEUE is not set | ||
27 | CONFIG_BSD_PROCESS_ACCT=y | ||
28 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
29 | CONFIG_SYSCTL=y | ||
30 | # CONFIG_AUDIT is not set | ||
31 | CONFIG_LOG_BUF_SHIFT=14 | ||
32 | CONFIG_HOTPLUG=y | ||
33 | CONFIG_KOBJECT_UEVENT=y | ||
34 | CONFIG_IKCONFIG=y | ||
35 | # CONFIG_IKCONFIG_PROC is not set | ||
36 | CONFIG_EMBEDDED=y | ||
37 | # CONFIG_KALLSYMS is not set | ||
38 | # CONFIG_FUTEX is not set | ||
39 | # CONFIG_EPOLL is not set | ||
40 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
41 | CONFIG_SHMEM=y | ||
42 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
43 | CONFIG_CC_ALIGN_LABELS=0 | ||
44 | CONFIG_CC_ALIGN_LOOPS=0 | ||
45 | CONFIG_CC_ALIGN_JUMPS=0 | ||
46 | # CONFIG_TINY_SHMEM is not set | ||
47 | |||
48 | # | ||
49 | # Loadable module support | ||
50 | # | ||
51 | CONFIG_MODULES=y | ||
52 | CONFIG_MODULE_UNLOAD=y | ||
53 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
54 | CONFIG_OBSOLETE_MODPARM=y | ||
55 | # CONFIG_MODVERSIONS is not set | ||
56 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
57 | CONFIG_KMOD=y | ||
58 | |||
59 | # | ||
60 | # Processor type and features | ||
61 | # | ||
62 | # CONFIG_PLAT_MAPPI is not set | ||
63 | # CONFIG_PLAT_USRV is not set | ||
64 | # CONFIG_PLAT_M32700UT is not set | ||
65 | # CONFIG_PLAT_OPSPUT is not set | ||
66 | # CONFIG_PLAT_OAKS32R is not set | ||
67 | CONFIG_PLAT_MAPPI2=y | ||
68 | # CONFIG_CHIP_M32700 is not set | ||
69 | # CONFIG_CHIP_M32102 is not set | ||
70 | CONFIG_CHIP_VDEC2=y | ||
71 | # CONFIG_CHIP_OPSP is not set | ||
72 | CONFIG_MMU=y | ||
73 | CONFIG_TLB_ENTRIES=16 | ||
74 | CONFIG_ISA_M32R2=y | ||
75 | CONFIG_BUS_CLOCK=50000000 | ||
76 | CONFIG_TIMER_DIVIDE=128 | ||
77 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
78 | CONFIG_MEMORY_START=0x08000000 | ||
79 | CONFIG_MEMORY_SIZE=0x01000000 | ||
80 | CONFIG_NOHIGHMEM=y | ||
81 | # CONFIG_DISCONTIGMEM is not set | ||
82 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
83 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
84 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
85 | CONFIG_PREEMPT=y | ||
86 | # CONFIG_HAVE_DEC_LOCK is not set | ||
87 | # CONFIG_SMP is not set | ||
88 | |||
89 | # | ||
90 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
91 | # | ||
92 | # CONFIG_PCI is not set | ||
93 | # CONFIG_ISA is not set | ||
94 | |||
95 | # | ||
96 | # PCCARD (PCMCIA/CardBus) support | ||
97 | # | ||
98 | CONFIG_PCCARD=y | ||
99 | # CONFIG_PCMCIA_DEBUG is not set | ||
100 | CONFIG_PCMCIA=y | ||
101 | |||
102 | # | ||
103 | # PC-card bridges | ||
104 | # | ||
105 | # CONFIG_TCIC is not set | ||
106 | # CONFIG_M32R_CFC is not set | ||
107 | |||
108 | # | ||
109 | # PCI Hotplug Support | ||
110 | # | ||
111 | |||
112 | # | ||
113 | # Executable file formats | ||
114 | # | ||
115 | CONFIG_BINFMT_ELF=y | ||
116 | # CONFIG_BINFMT_MISC is not set | ||
117 | |||
118 | # | ||
119 | # Device Drivers | ||
120 | # | ||
121 | |||
122 | # | ||
123 | # Generic Driver Options | ||
124 | # | ||
125 | CONFIG_STANDALONE=y | ||
126 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
127 | # CONFIG_FW_LOADER is not set | ||
128 | |||
129 | # | ||
130 | # Memory Technology Devices (MTD) | ||
131 | # | ||
132 | # CONFIG_MTD is not set | ||
133 | |||
134 | # | ||
135 | # Parallel port support | ||
136 | # | ||
137 | # CONFIG_PARPORT is not set | ||
138 | |||
139 | # | ||
140 | # Plug and Play support | ||
141 | # | ||
142 | |||
143 | # | ||
144 | # Block devices | ||
145 | # | ||
146 | # CONFIG_BLK_DEV_FD is not set | ||
147 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
148 | CONFIG_BLK_DEV_LOOP=y | ||
149 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
150 | CONFIG_BLK_DEV_NBD=y | ||
151 | CONFIG_BLK_DEV_RAM=y | ||
152 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
153 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
154 | # CONFIG_BLK_DEV_INITRD is not set | ||
155 | CONFIG_INITRAMFS_SOURCE="" | ||
156 | # CONFIG_CDROM_PKTCDVD is not set | ||
157 | |||
158 | # | ||
159 | # IO Schedulers | ||
160 | # | ||
161 | CONFIG_IOSCHED_NOOP=y | ||
162 | # CONFIG_IOSCHED_AS is not set | ||
163 | CONFIG_IOSCHED_DEADLINE=y | ||
164 | CONFIG_IOSCHED_CFQ=y | ||
165 | # CONFIG_ATA_OVER_ETH is not set | ||
166 | |||
167 | # | ||
168 | # ATA/ATAPI/MFM/RLL support | ||
169 | # | ||
170 | CONFIG_IDE=y | ||
171 | CONFIG_BLK_DEV_IDE=y | ||
172 | |||
173 | # | ||
174 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
175 | # | ||
176 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
177 | CONFIG_BLK_DEV_IDEDISK=y | ||
178 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
179 | CONFIG_BLK_DEV_IDECS=y | ||
180 | CONFIG_BLK_DEV_IDECD=m | ||
181 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
182 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
183 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
184 | # CONFIG_IDE_TASK_IOCTL is not set | ||
185 | |||
186 | # | ||
187 | # IDE chipset support/bugfixes | ||
188 | # | ||
189 | CONFIG_IDE_GENERIC=y | ||
190 | # CONFIG_IDE_ARM is not set | ||
191 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
192 | # CONFIG_IDEDMA_AUTO is not set | ||
193 | # CONFIG_BLK_DEV_HD is not set | ||
194 | |||
195 | # | ||
196 | # SCSI device support | ||
197 | # | ||
198 | CONFIG_SCSI=m | ||
199 | CONFIG_SCSI_PROC_FS=y | ||
200 | |||
201 | # | ||
202 | # SCSI support type (disk, tape, CD-ROM) | ||
203 | # | ||
204 | CONFIG_BLK_DEV_SD=m | ||
205 | # CONFIG_CHR_DEV_ST is not set | ||
206 | # CONFIG_CHR_DEV_OSST is not set | ||
207 | CONFIG_BLK_DEV_SR=m | ||
208 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
209 | CONFIG_CHR_DEV_SG=m | ||
210 | |||
211 | # | ||
212 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
213 | # | ||
214 | CONFIG_SCSI_MULTI_LUN=y | ||
215 | # CONFIG_SCSI_CONSTANTS is not set | ||
216 | # CONFIG_SCSI_LOGGING is not set | ||
217 | |||
218 | # | ||
219 | # SCSI Transport Attributes | ||
220 | # | ||
221 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
222 | # CONFIG_SCSI_FC_ATTRS is not set | ||
223 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
224 | |||
225 | # | ||
226 | # SCSI low-level drivers | ||
227 | # | ||
228 | # CONFIG_SCSI_SATA is not set | ||
229 | # CONFIG_SCSI_DEBUG is not set | ||
230 | |||
231 | # | ||
232 | # PCMCIA SCSI adapter support | ||
233 | # | ||
234 | # CONFIG_PCMCIA_AHA152X is not set | ||
235 | # CONFIG_PCMCIA_FDOMAIN is not set | ||
236 | # CONFIG_PCMCIA_NINJA_SCSI is not set | ||
237 | # CONFIG_PCMCIA_QLOGIC is not set | ||
238 | # CONFIG_PCMCIA_SYM53C500 is not set | ||
239 | |||
240 | # | ||
241 | # Multi-device support (RAID and LVM) | ||
242 | # | ||
243 | # CONFIG_MD is not set | ||
244 | |||
245 | # | ||
246 | # Fusion MPT device support | ||
247 | # | ||
248 | |||
249 | # | ||
250 | # IEEE 1394 (FireWire) support | ||
251 | # | ||
252 | |||
253 | # | ||
254 | # I2O device support | ||
255 | # | ||
256 | |||
257 | # | ||
258 | # Networking support | ||
259 | # | ||
260 | CONFIG_NET=y | ||
261 | |||
262 | # | ||
263 | # Networking options | ||
264 | # | ||
265 | CONFIG_PACKET=y | ||
266 | # CONFIG_PACKET_MMAP is not set | ||
267 | # CONFIG_NETLINK_DEV is not set | ||
268 | CONFIG_UNIX=y | ||
269 | # CONFIG_NET_KEY is not set | ||
270 | CONFIG_INET=y | ||
271 | # CONFIG_IP_MULTICAST is not set | ||
272 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
273 | CONFIG_IP_PNP=y | ||
274 | CONFIG_IP_PNP_DHCP=y | ||
275 | # CONFIG_IP_PNP_BOOTP is not set | ||
276 | # CONFIG_IP_PNP_RARP is not set | ||
277 | # CONFIG_NET_IPIP is not set | ||
278 | # CONFIG_NET_IPGRE is not set | ||
279 | # CONFIG_ARPD is not set | ||
280 | # CONFIG_SYN_COOKIES is not set | ||
281 | # CONFIG_INET_AH is not set | ||
282 | # CONFIG_INET_ESP is not set | ||
283 | # CONFIG_INET_IPCOMP is not set | ||
284 | # CONFIG_INET_TUNNEL is not set | ||
285 | CONFIG_IP_TCPDIAG=y | ||
286 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
287 | # CONFIG_IPV6 is not set | ||
288 | # CONFIG_NETFILTER is not set | ||
289 | |||
290 | # | ||
291 | # SCTP Configuration (EXPERIMENTAL) | ||
292 | # | ||
293 | # CONFIG_IP_SCTP is not set | ||
294 | # CONFIG_ATM is not set | ||
295 | # CONFIG_BRIDGE is not set | ||
296 | # CONFIG_VLAN_8021Q is not set | ||
297 | # CONFIG_DECNET is not set | ||
298 | # CONFIG_LLC2 is not set | ||
299 | # CONFIG_IPX is not set | ||
300 | # CONFIG_ATALK is not set | ||
301 | # CONFIG_X25 is not set | ||
302 | # CONFIG_LAPB is not set | ||
303 | # CONFIG_NET_DIVERT is not set | ||
304 | # CONFIG_ECONET is not set | ||
305 | # CONFIG_WAN_ROUTER is not set | ||
306 | |||
307 | # | ||
308 | # QoS and/or fair queueing | ||
309 | # | ||
310 | # CONFIG_NET_SCHED is not set | ||
311 | # CONFIG_NET_CLS_ROUTE is not set | ||
312 | |||
313 | # | ||
314 | # Network testing | ||
315 | # | ||
316 | # CONFIG_NET_PKTGEN is not set | ||
317 | # CONFIG_NETPOLL is not set | ||
318 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
319 | # CONFIG_HAMRADIO is not set | ||
320 | # CONFIG_IRDA is not set | ||
321 | # CONFIG_BT is not set | ||
322 | CONFIG_NETDEVICES=y | ||
323 | # CONFIG_DUMMY is not set | ||
324 | # CONFIG_BONDING is not set | ||
325 | # CONFIG_EQUALIZER is not set | ||
326 | # CONFIG_TUN is not set | ||
327 | |||
328 | # | ||
329 | # Ethernet (10 or 100Mbit) | ||
330 | # | ||
331 | CONFIG_NET_ETHERNET=y | ||
332 | CONFIG_MII=y | ||
333 | CONFIG_SMC91X=y | ||
334 | # CONFIG_NE2000 is not set | ||
335 | |||
336 | # | ||
337 | # Ethernet (1000 Mbit) | ||
338 | # | ||
339 | |||
340 | # | ||
341 | # Ethernet (10000 Mbit) | ||
342 | # | ||
343 | |||
344 | # | ||
345 | # Token Ring devices | ||
346 | # | ||
347 | |||
348 | # | ||
349 | # Wireless LAN (non-hamradio) | ||
350 | # | ||
351 | # CONFIG_NET_RADIO is not set | ||
352 | |||
353 | # | ||
354 | # PCMCIA network device support | ||
355 | # | ||
356 | # CONFIG_NET_PCMCIA is not set | ||
357 | |||
358 | # | ||
359 | # Wan interfaces | ||
360 | # | ||
361 | # CONFIG_WAN is not set | ||
362 | # CONFIG_PPP is not set | ||
363 | # CONFIG_SLIP is not set | ||
364 | # CONFIG_SHAPER is not set | ||
365 | # CONFIG_NETCONSOLE is not set | ||
366 | |||
367 | # | ||
368 | # ISDN subsystem | ||
369 | # | ||
370 | # CONFIG_ISDN is not set | ||
371 | |||
372 | # | ||
373 | # Telephony Support | ||
374 | # | ||
375 | # CONFIG_PHONE is not set | ||
376 | |||
377 | # | ||
378 | # Input device support | ||
379 | # | ||
380 | CONFIG_INPUT=y | ||
381 | |||
382 | # | ||
383 | # Userland interfaces | ||
384 | # | ||
385 | # CONFIG_INPUT_MOUSEDEV is not set | ||
386 | # CONFIG_INPUT_JOYDEV is not set | ||
387 | # CONFIG_INPUT_TSDEV is not set | ||
388 | # CONFIG_INPUT_EVDEV is not set | ||
389 | # CONFIG_INPUT_EVBUG is not set | ||
390 | |||
391 | # | ||
392 | # Input I/O drivers | ||
393 | # | ||
394 | # CONFIG_GAMEPORT is not set | ||
395 | CONFIG_SOUND_GAMEPORT=y | ||
396 | CONFIG_SERIO=y | ||
397 | # CONFIG_SERIO_I8042 is not set | ||
398 | CONFIG_SERIO_SERPORT=y | ||
399 | # CONFIG_SERIO_CT82C710 is not set | ||
400 | # CONFIG_SERIO_LIBPS2 is not set | ||
401 | # CONFIG_SERIO_RAW is not set | ||
402 | |||
403 | # | ||
404 | # Input Device Drivers | ||
405 | # | ||
406 | # CONFIG_INPUT_KEYBOARD is not set | ||
407 | # CONFIG_INPUT_MOUSE is not set | ||
408 | # CONFIG_INPUT_JOYSTICK is not set | ||
409 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
410 | # CONFIG_INPUT_MISC is not set | ||
411 | |||
412 | # | ||
413 | # Character devices | ||
414 | # | ||
415 | CONFIG_VT=y | ||
416 | CONFIG_VT_CONSOLE=y | ||
417 | CONFIG_HW_CONSOLE=y | ||
418 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
419 | |||
420 | # | ||
421 | # Serial drivers | ||
422 | # | ||
423 | # CONFIG_SERIAL_8250 is not set | ||
424 | |||
425 | # | ||
426 | # Non-8250 serial port support | ||
427 | # | ||
428 | CONFIG_SERIAL_CORE=y | ||
429 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
430 | CONFIG_SERIAL_M32R_SIO=y | ||
431 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
432 | # CONFIG_SERIAL_M32R_PLDSIO is not set | ||
433 | CONFIG_UNIX98_PTYS=y | ||
434 | CONFIG_LEGACY_PTYS=y | ||
435 | CONFIG_LEGACY_PTY_COUNT=256 | ||
436 | |||
437 | # | ||
438 | # IPMI | ||
439 | # | ||
440 | # CONFIG_IPMI_HANDLER is not set | ||
441 | |||
442 | # | ||
443 | # Watchdog Cards | ||
444 | # | ||
445 | # CONFIG_WATCHDOG is not set | ||
446 | # CONFIG_RTC is not set | ||
447 | # CONFIG_GEN_RTC is not set | ||
448 | # CONFIG_DTLK is not set | ||
449 | # CONFIG_R3964 is not set | ||
450 | |||
451 | # | ||
452 | # Ftape, the floppy tape device driver | ||
453 | # | ||
454 | # CONFIG_DRM is not set | ||
455 | |||
456 | # | ||
457 | # PCMCIA character devices | ||
458 | # | ||
459 | # CONFIG_SYNCLINK_CS is not set | ||
460 | # CONFIG_RAW_DRIVER is not set | ||
461 | |||
462 | # | ||
463 | # I2C support | ||
464 | # | ||
465 | # CONFIG_I2C is not set | ||
466 | |||
467 | # | ||
468 | # Dallas's 1-wire bus | ||
469 | # | ||
470 | # CONFIG_W1 is not set | ||
471 | |||
472 | # | ||
473 | # Misc devices | ||
474 | # | ||
475 | |||
476 | # | ||
477 | # Multimedia devices | ||
478 | # | ||
479 | CONFIG_VIDEO_DEV=y | ||
480 | |||
481 | # | ||
482 | # Video For Linux | ||
483 | # | ||
484 | |||
485 | # | ||
486 | # Video Adapters | ||
487 | # | ||
488 | # CONFIG_VIDEO_CPIA is not set | ||
489 | # CONFIG_VIDEO_M32R_AR is not set | ||
490 | |||
491 | # | ||
492 | # Radio Adapters | ||
493 | # | ||
494 | # CONFIG_RADIO_MAESTRO is not set | ||
495 | |||
496 | # | ||
497 | # Digital Video Broadcasting Devices | ||
498 | # | ||
499 | # CONFIG_DVB is not set | ||
500 | |||
501 | # | ||
502 | # Graphics support | ||
503 | # | ||
504 | # CONFIG_FB is not set | ||
505 | |||
506 | # | ||
507 | # Console display driver support | ||
508 | # | ||
509 | # CONFIG_VGA_CONSOLE is not set | ||
510 | CONFIG_DUMMY_CONSOLE=y | ||
511 | |||
512 | # | ||
513 | # Sound | ||
514 | # | ||
515 | # CONFIG_SOUND is not set | ||
516 | |||
517 | # | ||
518 | # USB support | ||
519 | # | ||
520 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
521 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
522 | |||
523 | # | ||
524 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
525 | # | ||
526 | |||
527 | # | ||
528 | # USB Gadget Support | ||
529 | # | ||
530 | # CONFIG_USB_GADGET is not set | ||
531 | |||
532 | # | ||
533 | # MMC/SD Card support | ||
534 | # | ||
535 | # CONFIG_MMC is not set | ||
536 | |||
537 | # | ||
538 | # InfiniBand support | ||
539 | # | ||
540 | # CONFIG_INFINIBAND is not set | ||
541 | |||
542 | # | ||
543 | # File systems | ||
544 | # | ||
545 | CONFIG_EXT2_FS=y | ||
546 | # CONFIG_EXT2_FS_XATTR is not set | ||
547 | CONFIG_EXT3_FS=m | ||
548 | CONFIG_EXT3_FS_XATTR=y | ||
549 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
550 | # CONFIG_EXT3_FS_SECURITY is not set | ||
551 | CONFIG_JBD=m | ||
552 | CONFIG_JBD_DEBUG=y | ||
553 | CONFIG_FS_MBCACHE=y | ||
554 | CONFIG_REISERFS_FS=m | ||
555 | # CONFIG_REISERFS_CHECK is not set | ||
556 | # CONFIG_REISERFS_PROC_INFO is not set | ||
557 | # CONFIG_REISERFS_FS_XATTR is not set | ||
558 | # CONFIG_JFS_FS is not set | ||
559 | |||
560 | # | ||
561 | # XFS support | ||
562 | # | ||
563 | # CONFIG_XFS_FS is not set | ||
564 | # CONFIG_MINIX_FS is not set | ||
565 | # CONFIG_ROMFS_FS is not set | ||
566 | # CONFIG_QUOTA is not set | ||
567 | CONFIG_DNOTIFY=y | ||
568 | # CONFIG_AUTOFS_FS is not set | ||
569 | # CONFIG_AUTOFS4_FS is not set | ||
570 | |||
571 | # | ||
572 | # CD-ROM/DVD Filesystems | ||
573 | # | ||
574 | CONFIG_ISO9660_FS=m | ||
575 | CONFIG_JOLIET=y | ||
576 | # CONFIG_ZISOFS is not set | ||
577 | CONFIG_UDF_FS=m | ||
578 | CONFIG_UDF_NLS=y | ||
579 | |||
580 | # | ||
581 | # DOS/FAT/NT Filesystems | ||
582 | # | ||
583 | CONFIG_FAT_FS=m | ||
584 | CONFIG_MSDOS_FS=m | ||
585 | CONFIG_VFAT_FS=m | ||
586 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
587 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
588 | # CONFIG_NTFS_FS is not set | ||
589 | |||
590 | # | ||
591 | # Pseudo filesystems | ||
592 | # | ||
593 | CONFIG_PROC_FS=y | ||
594 | CONFIG_PROC_KCORE=y | ||
595 | CONFIG_SYSFS=y | ||
596 | CONFIG_DEVFS_FS=y | ||
597 | CONFIG_DEVFS_MOUNT=y | ||
598 | # CONFIG_DEVFS_DEBUG is not set | ||
599 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
600 | CONFIG_TMPFS=y | ||
601 | # CONFIG_TMPFS_XATTR is not set | ||
602 | # CONFIG_HUGETLB_PAGE is not set | ||
603 | CONFIG_RAMFS=y | ||
604 | |||
605 | # | ||
606 | # Miscellaneous filesystems | ||
607 | # | ||
608 | # CONFIG_ADFS_FS is not set | ||
609 | # CONFIG_AFFS_FS is not set | ||
610 | # CONFIG_HFS_FS is not set | ||
611 | # CONFIG_HFSPLUS_FS is not set | ||
612 | # CONFIG_BEFS_FS is not set | ||
613 | # CONFIG_BFS_FS is not set | ||
614 | # CONFIG_EFS_FS is not set | ||
615 | # CONFIG_CRAMFS is not set | ||
616 | # CONFIG_VXFS_FS is not set | ||
617 | # CONFIG_HPFS_FS is not set | ||
618 | # CONFIG_QNX4FS_FS is not set | ||
619 | # CONFIG_SYSV_FS is not set | ||
620 | # CONFIG_UFS_FS is not set | ||
621 | |||
622 | # | ||
623 | # Network File Systems | ||
624 | # | ||
625 | CONFIG_NFS_FS=y | ||
626 | CONFIG_NFS_V3=y | ||
627 | # CONFIG_NFS_V4 is not set | ||
628 | # CONFIG_NFS_DIRECTIO is not set | ||
629 | # CONFIG_NFSD is not set | ||
630 | CONFIG_ROOT_NFS=y | ||
631 | CONFIG_LOCKD=y | ||
632 | CONFIG_LOCKD_V4=y | ||
633 | CONFIG_SUNRPC=y | ||
634 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
635 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
636 | # CONFIG_SMB_FS is not set | ||
637 | # CONFIG_CIFS is not set | ||
638 | # CONFIG_NCP_FS is not set | ||
639 | # CONFIG_CODA_FS is not set | ||
640 | # CONFIG_AFS_FS is not set | ||
641 | |||
642 | # | ||
643 | # Partition Types | ||
644 | # | ||
645 | # CONFIG_PARTITION_ADVANCED is not set | ||
646 | CONFIG_MSDOS_PARTITION=y | ||
647 | |||
648 | # | ||
649 | # Native Language Support | ||
650 | # | ||
651 | CONFIG_NLS=y | ||
652 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
653 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
654 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
655 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
656 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
657 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
658 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
659 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
660 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
661 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
662 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
663 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
664 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
665 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
666 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
667 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
668 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
669 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
670 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
671 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
672 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
673 | # CONFIG_NLS_ISO8859_8 is not set | ||
674 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
675 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
676 | # CONFIG_NLS_ASCII is not set | ||
677 | # CONFIG_NLS_ISO8859_1 is not set | ||
678 | # CONFIG_NLS_ISO8859_2 is not set | ||
679 | # CONFIG_NLS_ISO8859_3 is not set | ||
680 | # CONFIG_NLS_ISO8859_4 is not set | ||
681 | # CONFIG_NLS_ISO8859_5 is not set | ||
682 | # CONFIG_NLS_ISO8859_6 is not set | ||
683 | # CONFIG_NLS_ISO8859_7 is not set | ||
684 | # CONFIG_NLS_ISO8859_9 is not set | ||
685 | # CONFIG_NLS_ISO8859_13 is not set | ||
686 | # CONFIG_NLS_ISO8859_14 is not set | ||
687 | # CONFIG_NLS_ISO8859_15 is not set | ||
688 | # CONFIG_NLS_KOI8_R is not set | ||
689 | # CONFIG_NLS_KOI8_U is not set | ||
690 | # CONFIG_NLS_UTF8 is not set | ||
691 | |||
692 | # | ||
693 | # Profiling support | ||
694 | # | ||
695 | # CONFIG_PROFILING is not set | ||
696 | |||
697 | # | ||
698 | # Kernel hacking | ||
699 | # | ||
700 | # CONFIG_DEBUG_KERNEL is not set | ||
701 | CONFIG_DEBUG_PREEMPT=y | ||
702 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
703 | # CONFIG_FRAME_POINTER is not set | ||
704 | |||
705 | # | ||
706 | # Security options | ||
707 | # | ||
708 | # CONFIG_KEYS is not set | ||
709 | # CONFIG_SECURITY is not set | ||
710 | |||
711 | # | ||
712 | # Cryptographic options | ||
713 | # | ||
714 | # CONFIG_CRYPTO is not set | ||
715 | |||
716 | # | ||
717 | # Hardware crypto devices | ||
718 | # | ||
719 | |||
720 | # | ||
721 | # Library routines | ||
722 | # | ||
723 | # CONFIG_CRC_CCITT is not set | ||
724 | CONFIG_CRC32=y | ||
725 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/m32r/mappi2/dot.gdbinit.vdec2 b/arch/m32r/mappi2/dot.gdbinit.vdec2 new file mode 100644 index 000000000000..797a830bd4b7 --- /dev/null +++ b/arch/m32r/mappi2/dot.gdbinit.vdec2 | |||
@@ -0,0 +1,233 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id: dot.gdbinit.vdec2,v 1.2 2004/11/11 02:03:15 takata Exp $ | ||
3 | |||
4 | # setting | ||
5 | set width 0d70 | ||
6 | set radix 0d16 | ||
7 | use_debug_dma | ||
8 | |||
9 | # Initialize SDRAM controller for Mappi | ||
10 | define sdram_init | ||
11 | # SDIR0 | ||
12 | set *(unsigned long *)0x00ef6008=0x00000182 | ||
13 | # SDIR1 | ||
14 | set *(unsigned long *)0x00ef600c=0x00000001 | ||
15 | # Initialize wait | ||
16 | shell sleep 1 | ||
17 | # Ch0-MOD | ||
18 | set *(unsigned long *)0x00ef602c=0x00000020 | ||
19 | # Ch0-TR | ||
20 | set *(unsigned long *)0x00ef6028=0x00041302 | ||
21 | # Ch0-ADR | ||
22 | set *(unsigned long *)0x00ef6020=0x08000004 | ||
23 | # AutoRef On | ||
24 | set *(unsigned long *)0x00ef6004=0x00010705 | ||
25 | # Access enable | ||
26 | set *(unsigned long *)0x00ef6024=0x00000001 | ||
27 | end | ||
28 | document sdram_init | ||
29 | Mappi SDRAM controller initialization | ||
30 | 0x08000000 - 0x0bffffff (64MB) | ||
31 | end | ||
32 | |||
33 | # Initialize SDRAM controller for Mappi | ||
34 | define sdram_init2 | ||
35 | # SDIR0 | ||
36 | set *(unsigned long *)0x00ef6008=0x00000182 | ||
37 | # Ch0-MOD | ||
38 | set *(unsigned long *)0x00ef602c=0x00000020 | ||
39 | # Ch0-TR | ||
40 | set *(unsigned long *)0x00ef6028=0x00010002 | ||
41 | # Ch0-ADR | ||
42 | set *(unsigned long *)0x00ef6020=0x08000004 | ||
43 | # AutoRef On | ||
44 | set *(unsigned long *)0x00ef6004=0x00010107 | ||
45 | # SDIR1 | ||
46 | set *(unsigned long *)0x00ef600c=0x00000001 | ||
47 | # Initialize wait | ||
48 | shell sleep 1 | ||
49 | # Access enable | ||
50 | set *(unsigned long *)0x00ef6024=0x00000001 | ||
51 | shell sleep 1 | ||
52 | end | ||
53 | document sdram_init | ||
54 | Mappi SDRAM controller initialization | ||
55 | 0x08000000 - 0x0bffffff (64MB) | ||
56 | end | ||
57 | |||
58 | # Initialize LAN controller for Mappi | ||
59 | define lanc_init | ||
60 | # Set BSEL1 (BSEL3 for the Chaos's bselc) | ||
61 | #set *(unsigned long *)0x00ef5004 = 0x0fff330f | ||
62 | #set *(unsigned long *)0x00ef5004 = 0x01113301 | ||
63 | |||
64 | # set *(unsigned long *)0x00ef5004 = 0x02011101 | ||
65 | # set *(unsigned long *)0x00ef5004 = 0x04441104 | ||
66 | |||
67 | # BSEL5 | ||
68 | # set *(unsigned long *)0x00ef5014 = 0x0ccc310c | ||
69 | # set *(unsigned long *)0x00ef5014 = 0x0303310f | ||
70 | # set *(unsigned long *)0x00ef5014 = 0x01011102 -> NG | ||
71 | # set *(unsigned long *)0x00ef5014 = 0x03033103 | ||
72 | |||
73 | set *(unsigned long *)0x00ef500c = 0x0b0b1304 | ||
74 | set *(unsigned long *)0x00ef5010 = 0x03033302 | ||
75 | # set *(unsigned long *)0x00ef5018 = 0x02223302 | ||
76 | end | ||
77 | |||
78 | # MMU enable | ||
79 | define mmu_enable | ||
80 | set $evb=0x88000000 | ||
81 | set *(unsigned long *)0xffff0024=1 | ||
82 | end | ||
83 | |||
84 | # MMU disable | ||
85 | define mmu_disable | ||
86 | set $evb=0 | ||
87 | set *(unsigned long *)0xffff0024=0 | ||
88 | end | ||
89 | |||
90 | # Show TLB entries | ||
91 | define show_tlb_entries | ||
92 | set $i = 0 | ||
93 | set $addr = $arg0 | ||
94 | while ($i < 0d16 ) | ||
95 | set $tlb_tag = *(unsigned long*)$addr | ||
96 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
97 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
98 | set $i = $i + 1 | ||
99 | set $addr = $addr + 8 | ||
100 | end | ||
101 | end | ||
102 | define itlb | ||
103 | set $itlb=0xfe000000 | ||
104 | show_tlb_entries $itlb | ||
105 | end | ||
106 | define dtlb | ||
107 | set $dtlb=0xfe000800 | ||
108 | show_tlb_entries $dtlb | ||
109 | end | ||
110 | |||
111 | # Cache ON | ||
112 | define set_cache_type | ||
113 | set $mctype = (void*)0xfffffff8 | ||
114 | # chaos | ||
115 | # set *(unsigned long *)($mctype) = 0x0000c000 | ||
116 | # m32102 i-cache only | ||
117 | set *(unsigned long *)($mctype) = 0x00008000 | ||
118 | # m32102 d-cache only | ||
119 | # set *(unsigned long *)($mctype) = 0x00004000 | ||
120 | end | ||
121 | define cache_on | ||
122 | set $param = (void*)0x08001000 | ||
123 | set *(unsigned long *)($param) = 0x60ff6102 | ||
124 | end | ||
125 | |||
126 | |||
127 | # Show current task structure | ||
128 | define show_current | ||
129 | set $current = $spi & 0xffffe000 | ||
130 | printf "$current=0x%08lX\n",$current | ||
131 | print *(struct task_struct *)$current | ||
132 | end | ||
133 | |||
134 | # Show user assigned task structure | ||
135 | define show_task | ||
136 | set $task = $arg0 & 0xffffe000 | ||
137 | printf "$task=0x%08lX\n",$task | ||
138 | print *(struct task_struct *)$task | ||
139 | end | ||
140 | document show_task | ||
141 | Show user assigned task structure | ||
142 | arg0 : task structure address | ||
143 | end | ||
144 | |||
145 | # Show M32R registers | ||
146 | define show_regs | ||
147 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
148 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
149 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
150 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$sp | ||
151 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
152 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
153 | printf "EVB[0x%08lX]\n",$evb | ||
154 | |||
155 | set $mests = *(unsigned long *)0xffff000c | ||
156 | set $mdeva = *(unsigned long *)0xffff0010 | ||
157 | printf "MESTS[0x%08lX] MDEVA[0x%08lX]\n",$mests,$mdeva | ||
158 | end | ||
159 | |||
160 | |||
161 | # Setup all | ||
162 | define setup | ||
163 | sdram_init | ||
164 | # lanc_init | ||
165 | # dispc_init | ||
166 | # set $evb=0x08000000 | ||
167 | end | ||
168 | |||
169 | # Load modules | ||
170 | define load_modules | ||
171 | use_debug_dma | ||
172 | load | ||
173 | # load busybox.mot | ||
174 | end | ||
175 | |||
176 | # Set kernel parameters | ||
177 | define set_kernel_parameters | ||
178 | set $param = (void*)0x08001000 | ||
179 | |||
180 | ## MOUNT_ROOT_RDONLY | ||
181 | set {long}($param+0x00)=0 | ||
182 | ## RAMDISK_FLAGS | ||
183 | #set {long}($param+0x04)=0 | ||
184 | ## ORIG_ROOT_DEV | ||
185 | #set {long}($param+0x08)=0x00000100 | ||
186 | ## LOADER_TYPE | ||
187 | #set {long}($param+0x0C)=0 | ||
188 | ## INITRD_START | ||
189 | set {long}($param+0x10)=0x082a0000 | ||
190 | ## INITRD_SIZE | ||
191 | set {long}($param+0x14)=0d6200000 | ||
192 | |||
193 | # M32R_CPUCLK | ||
194 | set *(unsigned long *)($param + 0x0018) = 0d25000000 | ||
195 | # M32R_BUSCLK | ||
196 | set *(unsigned long *)($param + 0x001c) = 0d25000000 | ||
197 | # M32R_TIMER_DIVIDE | ||
198 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
199 | |||
200 | |||
201 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/root.2.6 nfsaddrs=192.168.0.102:192.168.0.1:192.168.0.1:255.255.255.0:mappi: \0" | ||
202 | |||
203 | |||
204 | end | ||
205 | |||
206 | # Boot | ||
207 | define boot | ||
208 | set_kernel_parameters | ||
209 | debug_chaos | ||
210 | set $pc=0x08002000 | ||
211 | set $fp=0 | ||
212 | del b | ||
213 | si | ||
214 | end | ||
215 | |||
216 | # Restart | ||
217 | define restart | ||
218 | sdireset | ||
219 | sdireset | ||
220 | setup | ||
221 | load_modules | ||
222 | boot | ||
223 | end | ||
224 | |||
225 | sdireset | ||
226 | sdireset | ||
227 | file vmlinux | ||
228 | target m32rsdi | ||
229 | |||
230 | restart | ||
231 | boot | ||
232 | |||
233 | |||
diff --git a/arch/m32r/mm/Makefile b/arch/m32r/mm/Makefile new file mode 100644 index 000000000000..c51c1c3b4a5f --- /dev/null +++ b/arch/m32r/mm/Makefile | |||
@@ -0,0 +1,12 @@ | |||
1 | # | ||
2 | # Makefile for the Linux M32R-specific parts of the memory manager. | ||
3 | # | ||
4 | |||
5 | ifdef CONFIG_MMU | ||
6 | obj-y := init.o fault.o mmu.o extable.o ioremap.o cache.o page.o | ||
7 | else | ||
8 | obj-y := init.o fault-nommu.o mmu.o extable.o ioremap-nommu.o cache.o page.o | ||
9 | endif | ||
10 | |||
11 | obj-$(CONFIG_DISCONTIGMEM) += discontig.o | ||
12 | |||
diff --git a/arch/m32r/mm/cache.c b/arch/m32r/mm/cache.c new file mode 100644 index 000000000000..31b0789c1992 --- /dev/null +++ b/arch/m32r/mm/cache.c | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/cache.c | ||
3 | * | ||
4 | * Copyright (C) 2002 Hirokazu Takata | ||
5 | */ | ||
6 | |||
7 | #include <linux/config.h> | ||
8 | #include <asm/pgtable.h> | ||
9 | |||
10 | #undef MCCR | ||
11 | |||
12 | #if defined(CONFIG_CHIP_XNUX2) || defined(CONFIG_CHIP_M32700) || defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_OPSP) | ||
13 | /* Cache Control Register */ | ||
14 | #define MCCR ((volatile unsigned long*)0xfffffffc) | ||
15 | #define MCCR_CC (1UL << 7) /* Cache mode modify bit */ | ||
16 | #define MCCR_IIV (1UL << 6) /* I-cache invalidate */ | ||
17 | #define MCCR_DIV (1UL << 5) /* D-cache invalidate */ | ||
18 | #define MCCR_DCB (1UL << 4) /* D-cache copy back */ | ||
19 | #define MCCR_ICM (1UL << 1) /* I-cache mode [0:off,1:on] */ | ||
20 | #define MCCR_DCM (1UL << 0) /* D-cache mode [0:off,1:on] */ | ||
21 | #define MCCR_ICACHE_INV (MCCR_CC|MCCR_IIV) | ||
22 | #define MCCR_DCACHE_CB (MCCR_CC|MCCR_DCB) | ||
23 | #define MCCR_DCACHE_CBINV (MCCR_CC|MCCR_DIV|MCCR_DCB) | ||
24 | #define CHECK_MCCR(mccr) (mccr = *MCCR) | ||
25 | #elif defined(CONFIG_CHIP_M32102) | ||
26 | #define MCCR ((volatile unsigned char*)0xfffffffe) | ||
27 | #define MCCR_IIV (1UL << 0) /* I-cache invalidate */ | ||
28 | #define MCCR_ICACHE_INV MCCR_IIV | ||
29 | #endif /* CONFIG_CHIP_XNUX2 || CONFIG_CHIP_M32700 */ | ||
30 | |||
31 | #ifndef MCCR | ||
32 | #error Unknown cache type. | ||
33 | #endif | ||
34 | |||
35 | |||
36 | /* Copy back and invalidate D-cache and invalidate I-cache all */ | ||
37 | void _flush_cache_all(void) | ||
38 | { | ||
39 | #if defined(CONFIG_CHIP_M32102) | ||
40 | *MCCR = MCCR_ICACHE_INV; | ||
41 | #else | ||
42 | unsigned long mccr; | ||
43 | |||
44 | /* Copyback and invalidate D-cache */ | ||
45 | /* Invalidate I-cache */ | ||
46 | *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CBINV; | ||
47 | while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */ | ||
48 | #endif | ||
49 | } | ||
50 | |||
51 | /* Copy back D-cache and invalidate I-cache all */ | ||
52 | void _flush_cache_copyback_all(void) | ||
53 | { | ||
54 | #if defined(CONFIG_CHIP_M32102) | ||
55 | *MCCR = MCCR_ICACHE_INV; | ||
56 | #else | ||
57 | unsigned long mccr; | ||
58 | |||
59 | /* Copyback D-cache */ | ||
60 | /* Invalidate I-cache */ | ||
61 | *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CB; | ||
62 | while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */ | ||
63 | |||
64 | #endif | ||
65 | } | ||
diff --git a/arch/m32r/mm/discontig.c b/arch/m32r/mm/discontig.c new file mode 100644 index 000000000000..1d1a01e54b3f --- /dev/null +++ b/arch/m32r/mm/discontig.c | |||
@@ -0,0 +1,171 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/discontig.c | ||
3 | * | ||
4 | * Discontig memory support | ||
5 | * | ||
6 | * Copyright (c) 2003 Hitoshi Yamamoto | ||
7 | */ | ||
8 | |||
9 | #include <linux/config.h> | ||
10 | #include <linux/mm.h> | ||
11 | #include <linux/bootmem.h> | ||
12 | #include <linux/mmzone.h> | ||
13 | #include <linux/initrd.h> | ||
14 | #include <linux/nodemask.h> | ||
15 | |||
16 | #include <asm/setup.h> | ||
17 | |||
18 | extern char _end[]; | ||
19 | |||
20 | struct pglist_data *node_data[MAX_NUMNODES]; | ||
21 | static bootmem_data_t node_bdata[MAX_NUMNODES] __initdata; | ||
22 | |||
23 | pg_data_t m32r_node_data[MAX_NUMNODES]; | ||
24 | |||
25 | /* Memory profile */ | ||
26 | typedef struct { | ||
27 | unsigned long start_pfn; | ||
28 | unsigned long pages; | ||
29 | unsigned long holes; | ||
30 | unsigned long free_pfn; | ||
31 | } mem_prof_t; | ||
32 | static mem_prof_t mem_prof[MAX_NUMNODES]; | ||
33 | |||
34 | static void __init mem_prof_init(void) | ||
35 | { | ||
36 | unsigned long start_pfn, holes, free_pfn; | ||
37 | const unsigned long zone_alignment = 1UL << (MAX_ORDER - 1); | ||
38 | unsigned long ul; | ||
39 | mem_prof_t *mp; | ||
40 | |||
41 | /* Node#0 SDRAM */ | ||
42 | mp = &mem_prof[0]; | ||
43 | mp->start_pfn = PFN_UP(CONFIG_MEMORY_START); | ||
44 | mp->pages = PFN_DOWN(CONFIG_MEMORY_SIZE); | ||
45 | mp->holes = 0; | ||
46 | mp->free_pfn = PFN_UP(__pa(_end)); | ||
47 | |||
48 | /* Node#1 internal SRAM */ | ||
49 | mp = &mem_prof[1]; | ||
50 | start_pfn = free_pfn = PFN_UP(CONFIG_IRAM_START); | ||
51 | holes = 0; | ||
52 | if (start_pfn & (zone_alignment - 1)) { | ||
53 | ul = zone_alignment; | ||
54 | while (start_pfn >= ul) | ||
55 | ul += zone_alignment; | ||
56 | |||
57 | start_pfn = ul - zone_alignment; | ||
58 | holes = free_pfn - start_pfn; | ||
59 | } | ||
60 | |||
61 | mp->start_pfn = start_pfn; | ||
62 | mp->pages = PFN_DOWN(CONFIG_IRAM_SIZE) + holes; | ||
63 | mp->holes = holes; | ||
64 | mp->free_pfn = PFN_UP(CONFIG_IRAM_START); | ||
65 | } | ||
66 | |||
67 | unsigned long __init setup_memory(void) | ||
68 | { | ||
69 | unsigned long bootmap_size; | ||
70 | unsigned long min_pfn; | ||
71 | int nid; | ||
72 | mem_prof_t *mp; | ||
73 | |||
74 | max_low_pfn = 0; | ||
75 | min_low_pfn = -1; | ||
76 | |||
77 | mem_prof_init(); | ||
78 | |||
79 | for_each_online_node(nid) { | ||
80 | mp = &mem_prof[nid]; | ||
81 | NODE_DATA(nid)=(pg_data_t *)&m32r_node_data[nid]; | ||
82 | NODE_DATA(nid)->bdata = &node_bdata[nid]; | ||
83 | min_pfn = mp->start_pfn; | ||
84 | max_pfn = mp->start_pfn + mp->pages; | ||
85 | bootmap_size = init_bootmem_node(NODE_DATA(nid), mp->free_pfn, | ||
86 | mp->start_pfn, max_pfn); | ||
87 | |||
88 | free_bootmem_node(NODE_DATA(nid), PFN_PHYS(mp->start_pfn), | ||
89 | PFN_PHYS(mp->pages)); | ||
90 | |||
91 | reserve_bootmem_node(NODE_DATA(nid), PFN_PHYS(mp->start_pfn), | ||
92 | PFN_PHYS(mp->free_pfn - mp->start_pfn) + bootmap_size); | ||
93 | |||
94 | if (max_low_pfn < max_pfn) | ||
95 | max_low_pfn = max_pfn; | ||
96 | |||
97 | if (min_low_pfn > min_pfn) | ||
98 | min_low_pfn = min_pfn; | ||
99 | } | ||
100 | |||
101 | #ifdef CONFIG_BLK_DEV_INITRD | ||
102 | if (LOADER_TYPE && INITRD_START) { | ||
103 | if (INITRD_START + INITRD_SIZE <= PFN_PHYS(max_low_pfn)) { | ||
104 | reserve_bootmem_node(NODE_DATA(0), INITRD_START, | ||
105 | INITRD_SIZE); | ||
106 | initrd_start = INITRD_START ? | ||
107 | INITRD_START + PAGE_OFFSET : 0; | ||
108 | |||
109 | initrd_end = initrd_start + INITRD_SIZE; | ||
110 | printk("initrd:start[%08lx],size[%08lx]\n", | ||
111 | initrd_start, INITRD_SIZE); | ||
112 | } else { | ||
113 | printk("initrd extends beyond end of memory " | ||
114 | "(0x%08lx > 0x%08lx)\ndisabling initrd\n", | ||
115 | INITRD_START + INITRD_SIZE, | ||
116 | PFN_PHYS(max_low_pfn)); | ||
117 | |||
118 | initrd_start = 0; | ||
119 | } | ||
120 | } | ||
121 | #endif /* CONFIG_BLK_DEV_INITRD */ | ||
122 | |||
123 | return max_low_pfn; | ||
124 | } | ||
125 | |||
126 | #define START_PFN(nid) \ | ||
127 | (NODE_DATA(nid)->bdata->node_boot_start >> PAGE_SHIFT) | ||
128 | #define MAX_LOW_PFN(nid) (NODE_DATA(nid)->bdata->node_low_pfn) | ||
129 | |||
130 | unsigned long __init zone_sizes_init(void) | ||
131 | { | ||
132 | unsigned long zones_size[MAX_NR_ZONES], zholes_size[MAX_NR_ZONES]; | ||
133 | unsigned long low, start_pfn; | ||
134 | unsigned long holes = 0; | ||
135 | int nid, i; | ||
136 | mem_prof_t *mp; | ||
137 | |||
138 | pgdat_list = NULL; | ||
139 | for (nid = num_online_nodes() - 1 ; nid >= 0 ; nid--) { | ||
140 | NODE_DATA(nid)->pgdat_next = pgdat_list; | ||
141 | pgdat_list = NODE_DATA(nid); | ||
142 | } | ||
143 | |||
144 | for_each_online_node(nid) { | ||
145 | mp = &mem_prof[nid]; | ||
146 | for (i = 0 ; i < MAX_NR_ZONES ; i++) { | ||
147 | zones_size[i] = 0; | ||
148 | zholes_size[i] = 0; | ||
149 | } | ||
150 | start_pfn = START_PFN(nid); | ||
151 | low = MAX_LOW_PFN(nid); | ||
152 | zones_size[ZONE_DMA] = low - start_pfn; | ||
153 | zholes_size[ZONE_DMA] = mp->holes; | ||
154 | holes += zholes_size[ZONE_DMA]; | ||
155 | |||
156 | free_area_init_node(nid, NODE_DATA(nid), zones_size, | ||
157 | start_pfn, zholes_size); | ||
158 | } | ||
159 | |||
160 | /* | ||
161 | * For test | ||
162 | * Use all area of internal RAM. | ||
163 | * see __alloc_pages() | ||
164 | */ | ||
165 | NODE_DATA(1)->node_zones->pages_min = 0; | ||
166 | NODE_DATA(1)->node_zones->pages_low = 0; | ||
167 | NODE_DATA(1)->node_zones->pages_high = 0; | ||
168 | |||
169 | return holes; | ||
170 | } | ||
171 | |||
diff --git a/arch/m32r/mm/extable.c b/arch/m32r/mm/extable.c new file mode 100644 index 000000000000..9a97363b6524 --- /dev/null +++ b/arch/m32r/mm/extable.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /* | ||
2 | * linux/arch/i386/mm/extable.c | ||
3 | */ | ||
4 | |||
5 | #include <linux/config.h> | ||
6 | #include <linux/module.h> | ||
7 | #include <linux/spinlock.h> | ||
8 | #include <asm/uaccess.h> | ||
9 | |||
10 | int fixup_exception(struct pt_regs *regs) | ||
11 | { | ||
12 | const struct exception_table_entry *fixup; | ||
13 | |||
14 | fixup = search_exception_tables(regs->bpc); | ||
15 | if (fixup) { | ||
16 | regs->bpc = fixup->fixup; | ||
17 | return 1; | ||
18 | } | ||
19 | |||
20 | return 0; | ||
21 | } | ||
22 | |||
diff --git a/arch/m32r/mm/fault-nommu.c b/arch/m32r/mm/fault-nommu.c new file mode 100644 index 000000000000..d9d488d782e8 --- /dev/null +++ b/arch/m32r/mm/fault-nommu.c | |||
@@ -0,0 +1,165 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/fault.c | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hitoshi Yamamoto, and H. Kondo | ||
5 | * | ||
6 | * Some code taken from i386 version. | ||
7 | * Copyright (C) 1995 Linus Torvalds | ||
8 | */ | ||
9 | |||
10 | /* $Id: fault-nommu.c,v 1.1 2004/03/30 06:40:59 sakugawa Exp $ */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <linux/signal.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/string.h> | ||
18 | #include <linux/types.h> | ||
19 | #include <linux/ptrace.h> | ||
20 | #include <linux/mman.h> | ||
21 | #include <linux/mm.h> | ||
22 | #include <linux/smp.h> | ||
23 | #include <linux/smp_lock.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/init.h> | ||
26 | #include <linux/vt_kern.h> /* For unblank_screen() */ | ||
27 | |||
28 | #include <asm/m32r.h> | ||
29 | #include <asm/system.h> | ||
30 | #include <asm/uaccess.h> | ||
31 | #include <asm/pgalloc.h> | ||
32 | #include <asm/pgtable.h> | ||
33 | #include <asm/hardirq.h> | ||
34 | #include <asm/mmu_context.h> | ||
35 | |||
36 | extern void die(const char *, struct pt_regs *, long); | ||
37 | |||
38 | #ifndef CONFIG_SMP | ||
39 | asmlinkage unsigned int tlb_entry_i_dat; | ||
40 | asmlinkage unsigned int tlb_entry_d_dat; | ||
41 | #define tlb_entry_i tlb_entry_i_dat | ||
42 | #define tlb_entry_d tlb_entry_d_dat | ||
43 | #else | ||
44 | unsigned int tlb_entry_i_dat[NR_CPUS]; | ||
45 | unsigned int tlb_entry_d_dat[NR_CPUS]; | ||
46 | #define tlb_entry_i tlb_entry_i_dat[smp_processor_id()] | ||
47 | #define tlb_entry_d tlb_entry_d_dat[smp_processor_id()] | ||
48 | #endif | ||
49 | |||
50 | /* | ||
51 | * Unlock any spinlocks which will prevent us from getting the | ||
52 | * message out | ||
53 | */ | ||
54 | void bust_spinlocks(int yes) | ||
55 | { | ||
56 | int loglevel_save = console_loglevel; | ||
57 | |||
58 | if (yes) { | ||
59 | oops_in_progress = 1; | ||
60 | return; | ||
61 | } | ||
62 | #ifdef CONFIG_VT | ||
63 | unblank_screen(); | ||
64 | #endif | ||
65 | oops_in_progress = 0; | ||
66 | /* | ||
67 | * OK, the message is on the console. Now we call printk() | ||
68 | * without oops_in_progress set so that printk will give klogd | ||
69 | * a poke. Hold onto your hats... | ||
70 | */ | ||
71 | console_loglevel = 15; /* NMI oopser may have shut the console up */ | ||
72 | printk(" "); | ||
73 | console_loglevel = loglevel_save; | ||
74 | } | ||
75 | |||
76 | void do_BUG(const char *file, int line) | ||
77 | { | ||
78 | bust_spinlocks(1); | ||
79 | printk("kernel BUG at %s:%d!\n", file, line); | ||
80 | } | ||
81 | |||
82 | /*======================================================================* | ||
83 | * do_page_fault() | ||
84 | *======================================================================* | ||
85 | * This routine handles page faults. It determines the address, | ||
86 | * and the problem, and then passes it off to one of the appropriate | ||
87 | * routines. | ||
88 | * | ||
89 | * ARGUMENT: | ||
90 | * regs : M32R SP reg. | ||
91 | * error_code : See below | ||
92 | * address : M32R MMU MDEVA reg. (Operand ACE) | ||
93 | * : M32R BPC reg. (Instruction ACE) | ||
94 | * | ||
95 | * error_code : | ||
96 | * bit 0 == 0 means no page found, 1 means protection fault | ||
97 | * bit 1 == 0 means read, 1 means write | ||
98 | * bit 2 == 0 means kernel, 1 means user-mode | ||
99 | *======================================================================*/ | ||
100 | asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, | ||
101 | unsigned long address) | ||
102 | { | ||
103 | |||
104 | /* | ||
105 | * Oops. The kernel tried to access some bad page. We'll have to | ||
106 | * terminate things with extreme prejudice. | ||
107 | */ | ||
108 | |||
109 | bust_spinlocks(1); | ||
110 | |||
111 | if (address < PAGE_SIZE) | ||
112 | printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); | ||
113 | else | ||
114 | printk(KERN_ALERT "Unable to handle kernel paging request"); | ||
115 | printk(" at virtual address %08lx\n",address); | ||
116 | printk(" printing bpc:\n"); | ||
117 | printk(KERN_ALERT "bpc = %08lx\n", regs->bpc); | ||
118 | |||
119 | die("Oops", regs, error_code); | ||
120 | bust_spinlocks(0); | ||
121 | do_exit(SIGKILL); | ||
122 | } | ||
123 | |||
124 | /*======================================================================* | ||
125 | * update_mmu_cache() | ||
126 | *======================================================================*/ | ||
127 | void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, | ||
128 | pte_t pte) | ||
129 | { | ||
130 | BUG(); | ||
131 | } | ||
132 | |||
133 | /*======================================================================* | ||
134 | * flush_tlb_page() : flushes one page | ||
135 | *======================================================================*/ | ||
136 | void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) | ||
137 | { | ||
138 | BUG(); | ||
139 | } | ||
140 | |||
141 | /*======================================================================* | ||
142 | * flush_tlb_range() : flushes a range of pages | ||
143 | *======================================================================*/ | ||
144 | void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | ||
145 | unsigned long end) | ||
146 | { | ||
147 | BUG(); | ||
148 | } | ||
149 | |||
150 | /*======================================================================* | ||
151 | * flush_tlb_mm() : flushes the specified mm context TLB's | ||
152 | *======================================================================*/ | ||
153 | void local_flush_tlb_mm(struct mm_struct *mm) | ||
154 | { | ||
155 | BUG(); | ||
156 | } | ||
157 | |||
158 | /*======================================================================* | ||
159 | * flush_tlb_all() : flushes all processes TLBs | ||
160 | *======================================================================*/ | ||
161 | void local_flush_tlb_all(void) | ||
162 | { | ||
163 | BUG(); | ||
164 | } | ||
165 | |||
diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c new file mode 100644 index 000000000000..bf7fb58ef02c --- /dev/null +++ b/arch/m32r/mm/fault.c | |||
@@ -0,0 +1,583 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/fault.c | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hitoshi Yamamoto, and H. Kondo | ||
5 | * Copyright (c) 2004 Naoto Sugai, NIIBE Yutaka | ||
6 | * | ||
7 | * Some code taken from i386 version. | ||
8 | * Copyright (C) 1995 Linus Torvalds | ||
9 | */ | ||
10 | |||
11 | #include <linux/config.h> | ||
12 | #include <linux/signal.h> | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/errno.h> | ||
16 | #include <linux/string.h> | ||
17 | #include <linux/types.h> | ||
18 | #include <linux/ptrace.h> | ||
19 | #include <linux/mman.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <linux/smp.h> | ||
22 | #include <linux/smp_lock.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/tty.h> | ||
26 | #include <linux/vt_kern.h> /* For unblank_screen() */ | ||
27 | #include <linux/highmem.h> | ||
28 | #include <linux/module.h> | ||
29 | |||
30 | #include <asm/m32r.h> | ||
31 | #include <asm/system.h> | ||
32 | #include <asm/uaccess.h> | ||
33 | #include <asm/hardirq.h> | ||
34 | #include <asm/mmu_context.h> | ||
35 | #include <asm/tlbflush.h> | ||
36 | |||
37 | extern void die(const char *, struct pt_regs *, long); | ||
38 | |||
39 | #ifndef CONFIG_SMP | ||
40 | asmlinkage unsigned int tlb_entry_i_dat; | ||
41 | asmlinkage unsigned int tlb_entry_d_dat; | ||
42 | #define tlb_entry_i tlb_entry_i_dat | ||
43 | #define tlb_entry_d tlb_entry_d_dat | ||
44 | #else | ||
45 | unsigned int tlb_entry_i_dat[NR_CPUS]; | ||
46 | unsigned int tlb_entry_d_dat[NR_CPUS]; | ||
47 | #define tlb_entry_i tlb_entry_i_dat[smp_processor_id()] | ||
48 | #define tlb_entry_d tlb_entry_d_dat[smp_processor_id()] | ||
49 | #endif | ||
50 | |||
51 | extern void init_tlb(void); | ||
52 | |||
53 | /* | ||
54 | * Unlock any spinlocks which will prevent us from getting the | ||
55 | * message out | ||
56 | */ | ||
57 | void bust_spinlocks(int yes) | ||
58 | { | ||
59 | int loglevel_save = console_loglevel; | ||
60 | |||
61 | if (yes) { | ||
62 | oops_in_progress = 1; | ||
63 | return; | ||
64 | } | ||
65 | #ifdef CONFIG_VT | ||
66 | unblank_screen(); | ||
67 | #endif | ||
68 | oops_in_progress = 0; | ||
69 | /* | ||
70 | * OK, the message is on the console. Now we call printk() | ||
71 | * without oops_in_progress set so that printk will give klogd | ||
72 | * a poke. Hold onto your hats... | ||
73 | */ | ||
74 | console_loglevel = 15; /* NMI oopser may have shut the console up */ | ||
75 | printk(" "); | ||
76 | console_loglevel = loglevel_save; | ||
77 | } | ||
78 | |||
79 | /*======================================================================* | ||
80 | * do_page_fault() | ||
81 | *======================================================================* | ||
82 | * This routine handles page faults. It determines the address, | ||
83 | * and the problem, and then passes it off to one of the appropriate | ||
84 | * routines. | ||
85 | * | ||
86 | * ARGUMENT: | ||
87 | * regs : M32R SP reg. | ||
88 | * error_code : See below | ||
89 | * address : M32R MMU MDEVA reg. (Operand ACE) | ||
90 | * : M32R BPC reg. (Instruction ACE) | ||
91 | * | ||
92 | * error_code : | ||
93 | * bit 0 == 0 means no page found, 1 means protection fault | ||
94 | * bit 1 == 0 means read, 1 means write | ||
95 | * bit 2 == 0 means kernel, 1 means user-mode | ||
96 | * bit 3 == 0 means data, 1 means instruction | ||
97 | *======================================================================*/ | ||
98 | #define ACE_PROTECTION 1 | ||
99 | #define ACE_WRITE 2 | ||
100 | #define ACE_USERMODE 4 | ||
101 | #define ACE_INSTRUCTION 8 | ||
102 | |||
103 | asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, | ||
104 | unsigned long address) | ||
105 | { | ||
106 | struct task_struct *tsk; | ||
107 | struct mm_struct *mm; | ||
108 | struct vm_area_struct * vma; | ||
109 | unsigned long page, addr; | ||
110 | int write; | ||
111 | siginfo_t info; | ||
112 | |||
113 | /* | ||
114 | * If BPSW IE bit enable --> set PSW IE bit | ||
115 | */ | ||
116 | if (regs->psw & M32R_PSW_BIE) | ||
117 | local_irq_enable(); | ||
118 | |||
119 | tsk = current; | ||
120 | |||
121 | info.si_code = SEGV_MAPERR; | ||
122 | |||
123 | /* | ||
124 | * We fault-in kernel-space virtual memory on-demand. The | ||
125 | * 'reference' page table is init_mm.pgd. | ||
126 | * | ||
127 | * NOTE! We MUST NOT take any locks for this case. We may | ||
128 | * be in an interrupt or a critical region, and should | ||
129 | * only copy the information from the master page table, | ||
130 | * nothing more. | ||
131 | * | ||
132 | * This verifies that the fault happens in kernel space | ||
133 | * (error_code & ACE_USERMODE) == 0, and that the fault was not a | ||
134 | * protection error (error_code & ACE_PROTECTION) == 0. | ||
135 | */ | ||
136 | if (address >= TASK_SIZE && !(error_code & ACE_USERMODE)) | ||
137 | goto vmalloc_fault; | ||
138 | |||
139 | mm = tsk->mm; | ||
140 | |||
141 | /* | ||
142 | * If we're in an interrupt or have no user context or are running in an | ||
143 | * atomic region then we must not take the fault.. | ||
144 | */ | ||
145 | if (in_atomic() || !mm) | ||
146 | goto bad_area_nosemaphore; | ||
147 | |||
148 | /* When running in the kernel we expect faults to occur only to | ||
149 | * addresses in user space. All other faults represent errors in the | ||
150 | * kernel and should generate an OOPS. Unfortunatly, in the case of an | ||
151 | * erroneous fault occuring in a code path which already holds mmap_sem | ||
152 | * we will deadlock attempting to validate the fault against the | ||
153 | * address space. Luckily the kernel only validly references user | ||
154 | * space from well defined areas of code, which are listed in the | ||
155 | * exceptions table. | ||
156 | * | ||
157 | * As the vast majority of faults will be valid we will only perform | ||
158 | * the source reference check when there is a possibilty of a deadlock. | ||
159 | * Attempt to lock the address space, if we cannot we then validate the | ||
160 | * source. If this is invalid we can skip the address space check, | ||
161 | * thus avoiding the deadlock. | ||
162 | */ | ||
163 | if (!down_read_trylock(&mm->mmap_sem)) { | ||
164 | if ((error_code & ACE_USERMODE) == 0 && | ||
165 | !search_exception_tables(regs->psw)) | ||
166 | goto bad_area_nosemaphore; | ||
167 | down_read(&mm->mmap_sem); | ||
168 | } | ||
169 | |||
170 | vma = find_vma(mm, address); | ||
171 | if (!vma) | ||
172 | goto bad_area; | ||
173 | if (vma->vm_start <= address) | ||
174 | goto good_area; | ||
175 | if (!(vma->vm_flags & VM_GROWSDOWN)) | ||
176 | goto bad_area; | ||
177 | #if 0 | ||
178 | if (error_code & ACE_USERMODE) { | ||
179 | /* | ||
180 | * accessing the stack below "spu" is always a bug. | ||
181 | * The "+ 4" is there due to the push instruction | ||
182 | * doing pre-decrement on the stack and that | ||
183 | * doesn't show up until later.. | ||
184 | */ | ||
185 | if (address + 4 < regs->spu) | ||
186 | goto bad_area; | ||
187 | } | ||
188 | #endif | ||
189 | if (expand_stack(vma, address)) | ||
190 | goto bad_area; | ||
191 | /* | ||
192 | * Ok, we have a good vm_area for this memory access, so | ||
193 | * we can handle it.. | ||
194 | */ | ||
195 | good_area: | ||
196 | info.si_code = SEGV_ACCERR; | ||
197 | write = 0; | ||
198 | switch (error_code & (ACE_WRITE|ACE_PROTECTION)) { | ||
199 | default: /* 3: write, present */ | ||
200 | /* fall through */ | ||
201 | case ACE_WRITE: /* write, not present */ | ||
202 | if (!(vma->vm_flags & VM_WRITE)) | ||
203 | goto bad_area; | ||
204 | write++; | ||
205 | break; | ||
206 | case ACE_PROTECTION: /* read, present */ | ||
207 | case 0: /* read, not present */ | ||
208 | if (!(vma->vm_flags & (VM_READ | VM_EXEC))) | ||
209 | goto bad_area; | ||
210 | } | ||
211 | |||
212 | /* | ||
213 | * For instruction access exception, check if the area is executable | ||
214 | */ | ||
215 | if ((error_code & ACE_INSTRUCTION) && !(vma->vm_flags & VM_EXEC)) | ||
216 | goto bad_area; | ||
217 | |||
218 | survive: | ||
219 | /* | ||
220 | * If for any reason at all we couldn't handle the fault, | ||
221 | * make sure we exit gracefully rather than endlessly redo | ||
222 | * the fault. | ||
223 | */ | ||
224 | addr = (address & PAGE_MASK); | ||
225 | set_thread_fault_code(error_code); | ||
226 | switch (handle_mm_fault(mm, vma, addr, write)) { | ||
227 | case VM_FAULT_MINOR: | ||
228 | tsk->min_flt++; | ||
229 | break; | ||
230 | case VM_FAULT_MAJOR: | ||
231 | tsk->maj_flt++; | ||
232 | break; | ||
233 | case VM_FAULT_SIGBUS: | ||
234 | goto do_sigbus; | ||
235 | case VM_FAULT_OOM: | ||
236 | goto out_of_memory; | ||
237 | default: | ||
238 | BUG(); | ||
239 | } | ||
240 | set_thread_fault_code(0); | ||
241 | up_read(&mm->mmap_sem); | ||
242 | return; | ||
243 | |||
244 | /* | ||
245 | * Something tried to access memory that isn't in our memory map.. | ||
246 | * Fix it, but check if it's kernel or user first.. | ||
247 | */ | ||
248 | bad_area: | ||
249 | up_read(&mm->mmap_sem); | ||
250 | |||
251 | bad_area_nosemaphore: | ||
252 | /* User mode accesses just cause a SIGSEGV */ | ||
253 | if (error_code & ACE_USERMODE) { | ||
254 | tsk->thread.address = address; | ||
255 | tsk->thread.error_code = error_code | (address >= TASK_SIZE); | ||
256 | tsk->thread.trap_no = 14; | ||
257 | info.si_signo = SIGSEGV; | ||
258 | info.si_errno = 0; | ||
259 | /* info.si_code has been set above */ | ||
260 | info.si_addr = (void __user *)address; | ||
261 | force_sig_info(SIGSEGV, &info, tsk); | ||
262 | return; | ||
263 | } | ||
264 | |||
265 | no_context: | ||
266 | /* Are we prepared to handle this kernel fault? */ | ||
267 | if (fixup_exception(regs)) | ||
268 | return; | ||
269 | |||
270 | /* | ||
271 | * Oops. The kernel tried to access some bad page. We'll have to | ||
272 | * terminate things with extreme prejudice. | ||
273 | */ | ||
274 | |||
275 | bust_spinlocks(1); | ||
276 | |||
277 | if (address < PAGE_SIZE) | ||
278 | printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); | ||
279 | else | ||
280 | printk(KERN_ALERT "Unable to handle kernel paging request"); | ||
281 | printk(" at virtual address %08lx\n",address); | ||
282 | printk(KERN_ALERT " printing bpc:\n"); | ||
283 | printk("%08lx\n", regs->bpc); | ||
284 | page = *(unsigned long *)MPTB; | ||
285 | page = ((unsigned long *) page)[address >> PGDIR_SHIFT]; | ||
286 | printk(KERN_ALERT "*pde = %08lx\n", page); | ||
287 | if (page & _PAGE_PRESENT) { | ||
288 | page &= PAGE_MASK; | ||
289 | address &= 0x003ff000; | ||
290 | page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; | ||
291 | printk(KERN_ALERT "*pte = %08lx\n", page); | ||
292 | } | ||
293 | die("Oops", regs, error_code); | ||
294 | bust_spinlocks(0); | ||
295 | do_exit(SIGKILL); | ||
296 | |||
297 | /* | ||
298 | * We ran out of memory, or some other thing happened to us that made | ||
299 | * us unable to handle the page fault gracefully. | ||
300 | */ | ||
301 | out_of_memory: | ||
302 | up_read(&mm->mmap_sem); | ||
303 | if (tsk->pid == 1) { | ||
304 | yield(); | ||
305 | down_read(&mm->mmap_sem); | ||
306 | goto survive; | ||
307 | } | ||
308 | printk("VM: killing process %s\n", tsk->comm); | ||
309 | if (error_code & ACE_USERMODE) | ||
310 | do_exit(SIGKILL); | ||
311 | goto no_context; | ||
312 | |||
313 | do_sigbus: | ||
314 | up_read(&mm->mmap_sem); | ||
315 | |||
316 | /* Kernel mode? Handle exception or die */ | ||
317 | if (!(error_code & ACE_USERMODE)) | ||
318 | goto no_context; | ||
319 | |||
320 | tsk->thread.address = address; | ||
321 | tsk->thread.error_code = error_code; | ||
322 | tsk->thread.trap_no = 14; | ||
323 | info.si_signo = SIGBUS; | ||
324 | info.si_errno = 0; | ||
325 | info.si_code = BUS_ADRERR; | ||
326 | info.si_addr = (void __user *)address; | ||
327 | force_sig_info(SIGBUS, &info, tsk); | ||
328 | return; | ||
329 | |||
330 | vmalloc_fault: | ||
331 | { | ||
332 | /* | ||
333 | * Synchronize this task's top level page-table | ||
334 | * with the 'reference' page table. | ||
335 | * | ||
336 | * Do _not_ use "tsk" here. We might be inside | ||
337 | * an interrupt in the middle of a task switch.. | ||
338 | */ | ||
339 | int offset = pgd_index(address); | ||
340 | pgd_t *pgd, *pgd_k; | ||
341 | pmd_t *pmd, *pmd_k; | ||
342 | pte_t *pte_k; | ||
343 | |||
344 | pgd = (pgd_t *)*(unsigned long *)MPTB; | ||
345 | pgd = offset + (pgd_t *)pgd; | ||
346 | pgd_k = init_mm.pgd + offset; | ||
347 | |||
348 | if (!pgd_present(*pgd_k)) | ||
349 | goto no_context; | ||
350 | |||
351 | /* | ||
352 | * set_pgd(pgd, *pgd_k); here would be useless on PAE | ||
353 | * and redundant with the set_pmd() on non-PAE. | ||
354 | */ | ||
355 | |||
356 | pmd = pmd_offset(pgd, address); | ||
357 | pmd_k = pmd_offset(pgd_k, address); | ||
358 | if (!pmd_present(*pmd_k)) | ||
359 | goto no_context; | ||
360 | set_pmd(pmd, *pmd_k); | ||
361 | |||
362 | pte_k = pte_offset_kernel(pmd_k, address); | ||
363 | if (!pte_present(*pte_k)) | ||
364 | goto no_context; | ||
365 | |||
366 | addr = (address & PAGE_MASK) | (error_code & ACE_INSTRUCTION); | ||
367 | update_mmu_cache(NULL, addr, *pte_k); | ||
368 | return; | ||
369 | } | ||
370 | } | ||
371 | |||
372 | /*======================================================================* | ||
373 | * update_mmu_cache() | ||
374 | *======================================================================*/ | ||
375 | #define TLB_MASK (NR_TLB_ENTRIES - 1) | ||
376 | #define ITLB_END (unsigned long *)(ITLB_BASE + (NR_TLB_ENTRIES * 8)) | ||
377 | #define DTLB_END (unsigned long *)(DTLB_BASE + (NR_TLB_ENTRIES * 8)) | ||
378 | void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr, | ||
379 | pte_t pte) | ||
380 | { | ||
381 | unsigned long *entry1, *entry2; | ||
382 | unsigned long pte_data, flags; | ||
383 | unsigned int *entry_dat; | ||
384 | int inst = get_thread_fault_code() & ACE_INSTRUCTION; | ||
385 | int i; | ||
386 | |||
387 | /* Ptrace may call this routine. */ | ||
388 | if (vma && current->active_mm != vma->vm_mm) | ||
389 | return; | ||
390 | |||
391 | local_irq_save(flags); | ||
392 | |||
393 | vaddr = (vaddr & PAGE_MASK) | get_asid(); | ||
394 | |||
395 | #ifdef CONFIG_CHIP_OPSP | ||
396 | entry1 = (unsigned long *)ITLB_BASE; | ||
397 | for(i = 0 ; i < NR_TLB_ENTRIES; i++) { | ||
398 | if(*entry1++ == vaddr) { | ||
399 | pte_data = pte_val(pte); | ||
400 | set_tlb_data(entry1, pte_data); | ||
401 | break; | ||
402 | } | ||
403 | entry1++; | ||
404 | } | ||
405 | entry2 = (unsigned long *)DTLB_BASE; | ||
406 | for(i = 0 ; i < NR_TLB_ENTRIES ; i++) { | ||
407 | if(*entry2++ == vaddr) { | ||
408 | pte_data = pte_val(pte); | ||
409 | set_tlb_data(entry2, pte_data); | ||
410 | break; | ||
411 | } | ||
412 | entry2++; | ||
413 | } | ||
414 | local_irq_restore(flags); | ||
415 | return; | ||
416 | #else | ||
417 | pte_data = pte_val(pte); | ||
418 | |||
419 | /* | ||
420 | * Update TLB entries | ||
421 | * entry1: ITLB entry address | ||
422 | * entry2: DTLB entry address | ||
423 | */ | ||
424 | __asm__ __volatile__ ( | ||
425 | "seth %0, #high(%4) \n\t" | ||
426 | "st %2, @(%5, %0) \n\t" | ||
427 | "ldi %1, #1 \n\t" | ||
428 | "st %1, @(%6, %0) \n\t" | ||
429 | "add3 r4, %0, %7 \n\t" | ||
430 | ".fillinsn \n" | ||
431 | "1: \n\t" | ||
432 | "ld %1, @(%6, %0) \n\t" | ||
433 | "bnez %1, 1b \n\t" | ||
434 | "ld %0, @r4+ \n\t" | ||
435 | "ld %1, @r4 \n\t" | ||
436 | "st %3, @+%0 \n\t" | ||
437 | "st %3, @+%1 \n\t" | ||
438 | : "=&r" (entry1), "=&r" (entry2) | ||
439 | : "r" (vaddr), "r" (pte_data), "i" (MMU_REG_BASE), | ||
440 | "i" (MSVA_offset), "i" (MTOP_offset), "i" (MIDXI_offset) | ||
441 | : "r4", "memory" | ||
442 | ); | ||
443 | |||
444 | if ((!inst && entry2 >= DTLB_END) || (inst && entry1 >= ITLB_END)) | ||
445 | goto notfound; | ||
446 | |||
447 | found: | ||
448 | local_irq_restore(flags); | ||
449 | |||
450 | return; | ||
451 | |||
452 | /* Valid entry not found */ | ||
453 | notfound: | ||
454 | /* | ||
455 | * Update ITLB or DTLB entry | ||
456 | * entry1: TLB entry address | ||
457 | * entry2: TLB base address | ||
458 | */ | ||
459 | if (!inst) { | ||
460 | entry2 = (unsigned long *)DTLB_BASE; | ||
461 | entry_dat = &tlb_entry_d; | ||
462 | } else { | ||
463 | entry2 = (unsigned long *)ITLB_BASE; | ||
464 | entry_dat = &tlb_entry_i; | ||
465 | } | ||
466 | entry1 = entry2 + (((*entry_dat - 1) & TLB_MASK) << 1); | ||
467 | |||
468 | for (i = 0 ; i < NR_TLB_ENTRIES ; i++) { | ||
469 | if (!(entry1[1] & 2)) /* Valid bit check */ | ||
470 | break; | ||
471 | |||
472 | if (entry1 != entry2) | ||
473 | entry1 -= 2; | ||
474 | else | ||
475 | entry1 += TLB_MASK << 1; | ||
476 | } | ||
477 | |||
478 | if (i >= NR_TLB_ENTRIES) { /* Empty entry not found */ | ||
479 | entry1 = entry2 + (*entry_dat << 1); | ||
480 | *entry_dat = (*entry_dat + 1) & TLB_MASK; | ||
481 | } | ||
482 | *entry1++ = vaddr; /* Set TLB tag */ | ||
483 | set_tlb_data(entry1, pte_data); | ||
484 | |||
485 | goto found; | ||
486 | #endif | ||
487 | } | ||
488 | |||
489 | /*======================================================================* | ||
490 | * flush_tlb_page() : flushes one page | ||
491 | *======================================================================*/ | ||
492 | void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) | ||
493 | { | ||
494 | if (vma->vm_mm && mm_context(vma->vm_mm) != NO_CONTEXT) { | ||
495 | unsigned long flags; | ||
496 | |||
497 | local_irq_save(flags); | ||
498 | page &= PAGE_MASK; | ||
499 | page |= (mm_context(vma->vm_mm) & MMU_CONTEXT_ASID_MASK); | ||
500 | __flush_tlb_page(page); | ||
501 | local_irq_restore(flags); | ||
502 | } | ||
503 | } | ||
504 | |||
505 | /*======================================================================* | ||
506 | * flush_tlb_range() : flushes a range of pages | ||
507 | *======================================================================*/ | ||
508 | void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | ||
509 | unsigned long end) | ||
510 | { | ||
511 | struct mm_struct *mm; | ||
512 | |||
513 | mm = vma->vm_mm; | ||
514 | if (mm_context(mm) != NO_CONTEXT) { | ||
515 | unsigned long flags; | ||
516 | int size; | ||
517 | |||
518 | local_irq_save(flags); | ||
519 | size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
520 | if (size > (NR_TLB_ENTRIES / 4)) { /* Too many TLB to flush */ | ||
521 | mm_context(mm) = NO_CONTEXT; | ||
522 | if (mm == current->mm) | ||
523 | activate_context(mm); | ||
524 | } else { | ||
525 | unsigned long asid; | ||
526 | |||
527 | asid = mm_context(mm) & MMU_CONTEXT_ASID_MASK; | ||
528 | start &= PAGE_MASK; | ||
529 | end += (PAGE_SIZE - 1); | ||
530 | end &= PAGE_MASK; | ||
531 | |||
532 | start |= asid; | ||
533 | end |= asid; | ||
534 | while (start < end) { | ||
535 | __flush_tlb_page(start); | ||
536 | start += PAGE_SIZE; | ||
537 | } | ||
538 | } | ||
539 | local_irq_restore(flags); | ||
540 | } | ||
541 | } | ||
542 | |||
543 | /*======================================================================* | ||
544 | * flush_tlb_mm() : flushes the specified mm context TLB's | ||
545 | *======================================================================*/ | ||
546 | void local_flush_tlb_mm(struct mm_struct *mm) | ||
547 | { | ||
548 | /* Invalidate all TLB of this process. */ | ||
549 | /* Instead of invalidating each TLB, we get new MMU context. */ | ||
550 | if (mm_context(mm) != NO_CONTEXT) { | ||
551 | unsigned long flags; | ||
552 | |||
553 | local_irq_save(flags); | ||
554 | mm_context(mm) = NO_CONTEXT; | ||
555 | if (mm == current->mm) | ||
556 | activate_context(mm); | ||
557 | local_irq_restore(flags); | ||
558 | } | ||
559 | } | ||
560 | |||
561 | /*======================================================================* | ||
562 | * flush_tlb_all() : flushes all processes TLBs | ||
563 | *======================================================================*/ | ||
564 | void local_flush_tlb_all(void) | ||
565 | { | ||
566 | unsigned long flags; | ||
567 | |||
568 | local_irq_save(flags); | ||
569 | __flush_tlb_all(); | ||
570 | local_irq_restore(flags); | ||
571 | } | ||
572 | |||
573 | /*======================================================================* | ||
574 | * init_mmu() | ||
575 | *======================================================================*/ | ||
576 | void __init init_mmu(void) | ||
577 | { | ||
578 | tlb_entry_i = 0; | ||
579 | tlb_entry_d = 0; | ||
580 | mmu_context_cache = MMU_CONTEXT_FIRST_VERSION; | ||
581 | set_asid(mmu_context_cache & MMU_CONTEXT_ASID_MASK); | ||
582 | *(volatile unsigned long *)MPTB = (unsigned long)swapper_pg_dir; | ||
583 | } | ||
diff --git a/arch/m32r/mm/init.c b/arch/m32r/mm/init.c new file mode 100644 index 000000000000..bc423d838fb8 --- /dev/null +++ b/arch/m32r/mm/init.c | |||
@@ -0,0 +1,247 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/init.c | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hitoshi Yamamoto | ||
5 | * | ||
6 | * Some code taken from sh version. | ||
7 | * Copyright (C) 1999 Niibe Yutaka | ||
8 | * Based on linux/arch/i386/mm/init.c: | ||
9 | * Copyright (C) 1995 Linus Torvalds | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/mm.h> | ||
15 | #include <linux/pagemap.h> | ||
16 | #include <linux/bootmem.h> | ||
17 | #include <linux/swap.h> | ||
18 | #include <linux/highmem.h> | ||
19 | #include <linux/bitops.h> | ||
20 | #include <linux/nodemask.h> | ||
21 | #include <asm/types.h> | ||
22 | #include <asm/processor.h> | ||
23 | #include <asm/page.h> | ||
24 | #include <asm/pgtable.h> | ||
25 | #include <asm/pgalloc.h> | ||
26 | #include <asm/mmu_context.h> | ||
27 | #include <asm/setup.h> | ||
28 | #include <asm/tlb.h> | ||
29 | |||
30 | /* References to section boundaries */ | ||
31 | extern char _text, _etext, _edata; | ||
32 | extern char __init_begin, __init_end; | ||
33 | |||
34 | pgd_t swapper_pg_dir[1024]; | ||
35 | |||
36 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
37 | |||
38 | void show_mem(void) | ||
39 | { | ||
40 | int total = 0, reserved = 0; | ||
41 | int shared = 0, cached = 0; | ||
42 | int highmem = 0; | ||
43 | struct page *page; | ||
44 | pg_data_t *pgdat; | ||
45 | unsigned long i; | ||
46 | |||
47 | printk("Mem-info:\n"); | ||
48 | show_free_areas(); | ||
49 | printk("Free swap: %6ldkB\n",nr_swap_pages<<(PAGE_SHIFT-10)); | ||
50 | for_each_pgdat(pgdat) { | ||
51 | for (i = 0; i < pgdat->node_spanned_pages; ++i) { | ||
52 | page = pgdat->node_mem_map + i; | ||
53 | total++; | ||
54 | if (PageHighMem(page)) | ||
55 | highmem++; | ||
56 | if (PageReserved(page)) | ||
57 | reserved++; | ||
58 | else if (PageSwapCache(page)) | ||
59 | cached++; | ||
60 | else if (page_count(page)) | ||
61 | shared += page_count(page) - 1; | ||
62 | } | ||
63 | } | ||
64 | printk("%d pages of RAM\n", total); | ||
65 | printk("%d pages of HIGHMEM\n",highmem); | ||
66 | printk("%d reserved pages\n",reserved); | ||
67 | printk("%d pages shared\n",shared); | ||
68 | printk("%d pages swap cached\n",cached); | ||
69 | } | ||
70 | |||
71 | /* | ||
72 | * Cache of MMU context last used. | ||
73 | */ | ||
74 | #ifndef CONFIG_SMP | ||
75 | unsigned long mmu_context_cache_dat; | ||
76 | #else | ||
77 | unsigned long mmu_context_cache_dat[NR_CPUS]; | ||
78 | #endif | ||
79 | static unsigned long hole_pages; | ||
80 | |||
81 | /* | ||
82 | * function prototype | ||
83 | */ | ||
84 | void __init paging_init(void); | ||
85 | void __init mem_init(void); | ||
86 | void free_initmem(void); | ||
87 | #ifdef CONFIG_BLK_DEV_INITRD | ||
88 | void free_initrd_mem(unsigned long, unsigned long); | ||
89 | #endif | ||
90 | |||
91 | /* It'd be good if these lines were in the standard header file. */ | ||
92 | #define START_PFN(nid) \ | ||
93 | (NODE_DATA(nid)->bdata->node_boot_start >> PAGE_SHIFT) | ||
94 | #define MAX_LOW_PFN(nid) (NODE_DATA(nid)->bdata->node_low_pfn) | ||
95 | |||
96 | #ifndef CONFIG_DISCONTIGMEM | ||
97 | unsigned long __init zone_sizes_init(void) | ||
98 | { | ||
99 | unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; | ||
100 | unsigned long max_dma; | ||
101 | unsigned long low; | ||
102 | unsigned long start_pfn; | ||
103 | |||
104 | #ifdef CONFIG_MMU | ||
105 | start_pfn = START_PFN(0); | ||
106 | max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; | ||
107 | low = MAX_LOW_PFN(0); | ||
108 | |||
109 | if (low < max_dma){ | ||
110 | zones_size[ZONE_DMA] = low - start_pfn; | ||
111 | zones_size[ZONE_NORMAL] = 0; | ||
112 | } else { | ||
113 | zones_size[ZONE_DMA] = low - start_pfn; | ||
114 | zones_size[ZONE_NORMAL] = low - max_dma; | ||
115 | } | ||
116 | #else | ||
117 | zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT; | ||
118 | zones_size[ZONE_NORMAL] = __MEMORY_SIZE >> PAGE_SHIFT; | ||
119 | start_pfn = __MEMORY_START >> PAGE_SHIFT; | ||
120 | #endif /* CONFIG_MMU */ | ||
121 | |||
122 | free_area_init_node(0, NODE_DATA(0), zones_size, start_pfn, 0); | ||
123 | |||
124 | return 0; | ||
125 | } | ||
126 | #else /* CONFIG_DISCONTIGMEM */ | ||
127 | extern unsigned long zone_sizes_init(void); | ||
128 | #endif /* CONFIG_DISCONTIGMEM */ | ||
129 | |||
130 | /*======================================================================* | ||
131 | * paging_init() : sets up the page tables | ||
132 | *======================================================================*/ | ||
133 | void __init paging_init(void) | ||
134 | { | ||
135 | #ifdef CONFIG_MMU | ||
136 | int i; | ||
137 | pgd_t *pg_dir; | ||
138 | |||
139 | /* We don't need kernel mapping as hardware support that. */ | ||
140 | pg_dir = swapper_pg_dir; | ||
141 | |||
142 | for (i = 0 ; i < USER_PTRS_PER_PGD * 2 ; i++) | ||
143 | pgd_val(pg_dir[i]) = 0; | ||
144 | #endif /* CONFIG_MMU */ | ||
145 | hole_pages = zone_sizes_init(); | ||
146 | } | ||
147 | |||
148 | int __init reservedpages_count(void) | ||
149 | { | ||
150 | int reservedpages, nid, i; | ||
151 | |||
152 | reservedpages = 0; | ||
153 | for_each_online_node(nid) | ||
154 | for (i = 0 ; i < MAX_LOW_PFN(nid) - START_PFN(nid) ; i++) | ||
155 | if (PageReserved(NODE_DATA(nid)->node_mem_map + i)) | ||
156 | reservedpages++; | ||
157 | |||
158 | return reservedpages; | ||
159 | } | ||
160 | |||
161 | /*======================================================================* | ||
162 | * mem_init() : | ||
163 | * orig : arch/sh/mm/init.c | ||
164 | *======================================================================*/ | ||
165 | void __init mem_init(void) | ||
166 | { | ||
167 | int codesize, reservedpages, datasize, initsize; | ||
168 | int nid; | ||
169 | #ifndef CONFIG_MMU | ||
170 | extern unsigned long memory_end; | ||
171 | #endif | ||
172 | |||
173 | num_physpages = 0; | ||
174 | for_each_online_node(nid) | ||
175 | num_physpages += MAX_LOW_PFN(nid) - START_PFN(nid) + 1; | ||
176 | |||
177 | num_physpages -= hole_pages; | ||
178 | |||
179 | #ifndef CONFIG_DISCONTIGMEM | ||
180 | max_mapnr = num_physpages; | ||
181 | #endif /* CONFIG_DISCONTIGMEM */ | ||
182 | |||
183 | #ifdef CONFIG_MMU | ||
184 | high_memory = (void *)__va(PFN_PHYS(MAX_LOW_PFN(0))); | ||
185 | #else | ||
186 | high_memory = (void *)(memory_end & PAGE_MASK); | ||
187 | #endif /* CONFIG_MMU */ | ||
188 | |||
189 | /* clear the zero-page */ | ||
190 | memset(empty_zero_page, 0, PAGE_SIZE); | ||
191 | |||
192 | /* this will put all low memory onto the freelists */ | ||
193 | for_each_online_node(nid) | ||
194 | totalram_pages += free_all_bootmem_node(NODE_DATA(nid)); | ||
195 | |||
196 | reservedpages = reservedpages_count() - hole_pages; | ||
197 | codesize = (unsigned long) &_etext - (unsigned long)&_text; | ||
198 | datasize = (unsigned long) &_edata - (unsigned long)&_etext; | ||
199 | initsize = (unsigned long) &__init_end - (unsigned long)&__init_begin; | ||
200 | |||
201 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, " | ||
202 | "%dk reserved, %dk data, %dk init)\n", | ||
203 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | ||
204 | num_physpages << (PAGE_SHIFT-10), | ||
205 | codesize >> 10, | ||
206 | reservedpages << (PAGE_SHIFT-10), | ||
207 | datasize >> 10, | ||
208 | initsize >> 10); | ||
209 | } | ||
210 | |||
211 | /*======================================================================* | ||
212 | * free_initmem() : | ||
213 | * orig : arch/sh/mm/init.c | ||
214 | *======================================================================*/ | ||
215 | void free_initmem(void) | ||
216 | { | ||
217 | unsigned long addr; | ||
218 | |||
219 | addr = (unsigned long)(&__init_begin); | ||
220 | for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { | ||
221 | ClearPageReserved(virt_to_page(addr)); | ||
222 | set_page_count(virt_to_page(addr), 1); | ||
223 | free_page(addr); | ||
224 | totalram_pages++; | ||
225 | } | ||
226 | printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", \ | ||
227 | (int)(&__init_end - &__init_begin) >> 10); | ||
228 | } | ||
229 | |||
230 | #ifdef CONFIG_BLK_DEV_INITRD | ||
231 | /*======================================================================* | ||
232 | * free_initrd_mem() : | ||
233 | * orig : arch/sh/mm/init.c | ||
234 | *======================================================================*/ | ||
235 | void free_initrd_mem(unsigned long start, unsigned long end) | ||
236 | { | ||
237 | unsigned long p; | ||
238 | for (p = start; p < end; p += PAGE_SIZE) { | ||
239 | ClearPageReserved(virt_to_page(p)); | ||
240 | set_page_count(virt_to_page(p), 1); | ||
241 | free_page(p); | ||
242 | totalram_pages++; | ||
243 | } | ||
244 | printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
245 | } | ||
246 | #endif | ||
247 | |||
diff --git a/arch/m32r/mm/ioremap-nommu.c b/arch/m32r/mm/ioremap-nommu.c new file mode 100644 index 000000000000..2759f2d48384 --- /dev/null +++ b/arch/m32r/mm/ioremap-nommu.c | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/ioremap-nommu.c | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hiroyuki Kondo | ||
5 | * | ||
6 | * Taken from mips version. | ||
7 | * (C) Copyright 1995 1996 Linus Torvalds | ||
8 | * (C) Copyright 2001 Ralf Baechle | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * This file is subject to the terms and conditions of the GNU General Public | ||
13 | * License. See the file "COPYING" in the main directory of this archive | ||
14 | * for more details. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <asm/addrspace.h> | ||
20 | #include <asm/byteorder.h> | ||
21 | |||
22 | #include <linux/vmalloc.h> | ||
23 | #include <asm/io.h> | ||
24 | #include <asm/pgalloc.h> | ||
25 | #include <asm/cacheflush.h> | ||
26 | #include <asm/tlbflush.h> | ||
27 | |||
28 | |||
29 | /* | ||
30 | * Remap an arbitrary physical address space into the kernel virtual | ||
31 | * address space. Needed when the kernel wants to access high addresses | ||
32 | * directly. | ||
33 | * | ||
34 | * NOTE! We need to allow non-page-aligned mappings too: we will obviously | ||
35 | * have to convert them into an offset in a page-aligned mapping, but the | ||
36 | * caller shouldn't need to know that small detail. | ||
37 | */ | ||
38 | |||
39 | #define IS_LOW512(addr) (!((unsigned long)(addr) & ~0x1fffffffUL)) | ||
40 | |||
41 | void __iomem * | ||
42 | __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) | ||
43 | { | ||
44 | return (void *)phys_addr; | ||
45 | } | ||
46 | |||
47 | #define IS_KSEG1(addr) (((unsigned long)(addr) & ~0x1fffffffUL) == KSEG1) | ||
48 | |||
49 | void iounmap(volatile void __iomem *addr) | ||
50 | { | ||
51 | } | ||
52 | |||
diff --git a/arch/m32r/mm/ioremap.c b/arch/m32r/mm/ioremap.c new file mode 100644 index 000000000000..70c59055c19c --- /dev/null +++ b/arch/m32r/mm/ioremap.c | |||
@@ -0,0 +1,192 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/ioremap.c | ||
3 | * | ||
4 | * Copyright (c) 2001, 2002 Hiroyuki Kondo | ||
5 | * | ||
6 | * Taken from mips version. | ||
7 | * (C) Copyright 1995 1996 Linus Torvalds | ||
8 | * (C) Copyright 2001 Ralf Baechle | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * This file is subject to the terms and conditions of the GNU General Public | ||
13 | * License. See the file "COPYING" in the main directory of this archive | ||
14 | * for more details. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <asm/addrspace.h> | ||
20 | #include <asm/byteorder.h> | ||
21 | |||
22 | #include <linux/vmalloc.h> | ||
23 | #include <asm/io.h> | ||
24 | #include <asm/pgalloc.h> | ||
25 | #include <asm/cacheflush.h> | ||
26 | #include <asm/tlbflush.h> | ||
27 | |||
28 | static inline void | ||
29 | remap_area_pte(pte_t * pte, unsigned long address, unsigned long size, | ||
30 | unsigned long phys_addr, unsigned long flags) | ||
31 | { | ||
32 | unsigned long end; | ||
33 | unsigned long pfn; | ||
34 | pgprot_t pgprot = __pgprot(_PAGE_GLOBAL | _PAGE_PRESENT | _PAGE_READ | ||
35 | | _PAGE_WRITE | flags); | ||
36 | |||
37 | address &= ~PMD_MASK; | ||
38 | end = address + size; | ||
39 | if (end > PMD_SIZE) | ||
40 | end = PMD_SIZE; | ||
41 | if (address >= end) | ||
42 | BUG(); | ||
43 | pfn = phys_addr >> PAGE_SHIFT; | ||
44 | do { | ||
45 | if (!pte_none(*pte)) { | ||
46 | printk("remap_area_pte: page already exists\n"); | ||
47 | BUG(); | ||
48 | } | ||
49 | set_pte(pte, pfn_pte(pfn, pgprot)); | ||
50 | address += PAGE_SIZE; | ||
51 | pfn++; | ||
52 | pte++; | ||
53 | } while (address && (address < end)); | ||
54 | } | ||
55 | |||
56 | static inline int | ||
57 | remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, | ||
58 | unsigned long phys_addr, unsigned long flags) | ||
59 | { | ||
60 | unsigned long end; | ||
61 | |||
62 | address &= ~PGDIR_MASK; | ||
63 | end = address + size; | ||
64 | if (end > PGDIR_SIZE) | ||
65 | end = PGDIR_SIZE; | ||
66 | phys_addr -= address; | ||
67 | if (address >= end) | ||
68 | BUG(); | ||
69 | do { | ||
70 | pte_t * pte = pte_alloc_kernel(&init_mm, pmd, address); | ||
71 | if (!pte) | ||
72 | return -ENOMEM; | ||
73 | remap_area_pte(pte, address, end - address, address + phys_addr, flags); | ||
74 | address = (address + PMD_SIZE) & PMD_MASK; | ||
75 | pmd++; | ||
76 | } while (address && (address < end)); | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static int | ||
81 | remap_area_pages(unsigned long address, unsigned long phys_addr, | ||
82 | unsigned long size, unsigned long flags) | ||
83 | { | ||
84 | int error; | ||
85 | pgd_t * dir; | ||
86 | unsigned long end = address + size; | ||
87 | |||
88 | phys_addr -= address; | ||
89 | dir = pgd_offset(&init_mm, address); | ||
90 | flush_cache_all(); | ||
91 | if (address >= end) | ||
92 | BUG(); | ||
93 | spin_lock(&init_mm.page_table_lock); | ||
94 | do { | ||
95 | pmd_t *pmd; | ||
96 | pmd = pmd_alloc(&init_mm, dir, address); | ||
97 | error = -ENOMEM; | ||
98 | if (!pmd) | ||
99 | break; | ||
100 | if (remap_area_pmd(pmd, address, end - address, | ||
101 | phys_addr + address, flags)) | ||
102 | break; | ||
103 | error = 0; | ||
104 | address = (address + PGDIR_SIZE) & PGDIR_MASK; | ||
105 | dir++; | ||
106 | } while (address && (address < end)); | ||
107 | spin_unlock(&init_mm.page_table_lock); | ||
108 | flush_tlb_all(); | ||
109 | return error; | ||
110 | } | ||
111 | |||
112 | /* | ||
113 | * Generic mapping function (not visible outside): | ||
114 | */ | ||
115 | |||
116 | /* | ||
117 | * Remap an arbitrary physical address space into the kernel virtual | ||
118 | * address space. Needed when the kernel wants to access high addresses | ||
119 | * directly. | ||
120 | * | ||
121 | * NOTE! We need to allow non-page-aligned mappings too: we will obviously | ||
122 | * have to convert them into an offset in a page-aligned mapping, but the | ||
123 | * caller shouldn't need to know that small detail. | ||
124 | */ | ||
125 | |||
126 | #define IS_LOW512(addr) (!((unsigned long)(addr) & ~0x1fffffffUL)) | ||
127 | |||
128 | void __iomem * | ||
129 | __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) | ||
130 | { | ||
131 | void __iomem * addr; | ||
132 | struct vm_struct * area; | ||
133 | unsigned long offset, last_addr; | ||
134 | |||
135 | /* Don't allow wraparound or zero size */ | ||
136 | last_addr = phys_addr + size - 1; | ||
137 | if (!size || last_addr < phys_addr) | ||
138 | return NULL; | ||
139 | |||
140 | /* | ||
141 | * Map objects in the low 512mb of address space using KSEG1, otherwise | ||
142 | * map using page tables. | ||
143 | */ | ||
144 | if (IS_LOW512(phys_addr) && IS_LOW512(phys_addr + size - 1)) | ||
145 | return (void *) KSEG1ADDR(phys_addr); | ||
146 | |||
147 | /* | ||
148 | * Don't allow anybody to remap normal RAM that we're using.. | ||
149 | */ | ||
150 | if (phys_addr < virt_to_phys(high_memory)) { | ||
151 | char *t_addr, *t_end; | ||
152 | struct page *page; | ||
153 | |||
154 | t_addr = __va(phys_addr); | ||
155 | t_end = t_addr + (size - 1); | ||
156 | |||
157 | for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++) | ||
158 | if(!PageReserved(page)) | ||
159 | return NULL; | ||
160 | } | ||
161 | |||
162 | /* | ||
163 | * Mappings have to be page-aligned | ||
164 | */ | ||
165 | offset = phys_addr & ~PAGE_MASK; | ||
166 | phys_addr &= PAGE_MASK; | ||
167 | size = PAGE_ALIGN(last_addr + 1) - phys_addr; | ||
168 | |||
169 | /* | ||
170 | * Ok, go for it.. | ||
171 | */ | ||
172 | area = get_vm_area(size, VM_IOREMAP); | ||
173 | if (!area) | ||
174 | return NULL; | ||
175 | area->phys_addr = phys_addr; | ||
176 | addr = (void __iomem *) area->addr; | ||
177 | if (remap_area_pages((unsigned long)addr, phys_addr, size, flags)) { | ||
178 | vunmap((void __force *) addr); | ||
179 | return NULL; | ||
180 | } | ||
181 | |||
182 | return (void __iomem *) (offset + (char __iomem *)addr); | ||
183 | } | ||
184 | |||
185 | #define IS_KSEG1(addr) (((unsigned long)(addr) & ~0x1fffffffUL) == KSEG1) | ||
186 | |||
187 | void iounmap(volatile void __iomem *addr) | ||
188 | { | ||
189 | if (!IS_KSEG1(addr)) | ||
190 | vfree((void *) (PAGE_MASK & (unsigned long) addr)); | ||
191 | } | ||
192 | |||
diff --git a/arch/m32r/mm/mmu.S b/arch/m32r/mm/mmu.S new file mode 100644 index 000000000000..0c28f11d6677 --- /dev/null +++ b/arch/m32r/mm/mmu.S | |||
@@ -0,0 +1,350 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/mmu.S | ||
3 | * | ||
4 | * Copyright (C) 2001 by Hiroyuki Kondo | ||
5 | */ | ||
6 | |||
7 | /* $Id: mmu.S,v 1.15 2004/03/16 02:56:27 takata Exp $ */ | ||
8 | |||
9 | #include <linux/config.h> /* CONFIG_MMU */ | ||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/assembler.h> | ||
12 | #include <asm/smp.h> | ||
13 | |||
14 | .text | ||
15 | #ifdef CONFIG_MMU | ||
16 | |||
17 | #include <asm/mmu_context.h> | ||
18 | #include <asm/page.h> | ||
19 | #include <asm/pgtable.h> | ||
20 | #include <asm/m32r.h> | ||
21 | |||
22 | /* | ||
23 | * TLB Miss Exception handler | ||
24 | */ | ||
25 | .balign 16 | ||
26 | ENTRY(tme_handler) | ||
27 | .global tlb_entry_i_dat | ||
28 | .global tlb_entry_d_dat | ||
29 | |||
30 | SWITCH_TO_KERNEL_STACK | ||
31 | |||
32 | #if defined(CONFIG_ISA_M32R2) | ||
33 | st r0, @-sp | ||
34 | st r1, @-sp | ||
35 | st r2, @-sp | ||
36 | st r3, @-sp | ||
37 | |||
38 | seth r3, #high(MMU_REG_BASE) | ||
39 | ld r1, @(MESTS_offset, r3) ; r1: status (MESTS reg.) | ||
40 | ld r0, @(MDEVP_offset, r3) ; r0: PFN + ASID (MDEVP reg.) | ||
41 | st r1, @(MESTS_offset, r3) ; clear status (MESTS reg.) | ||
42 | and3 r1, r1, #(MESTS_IT) | ||
43 | bnez r1, 1f ; instruction TLB miss? | ||
44 | |||
45 | ;; data TLB miss | ||
46 | ;; input | ||
47 | ;; r0: PFN + ASID (MDEVP reg.) | ||
48 | ;; r1 - r3: free | ||
49 | ;; output | ||
50 | ;; r0: PFN + ASID | ||
51 | ;; r1: TLB entry base address | ||
52 | ;; r2: &tlb_entry_{i|d}_dat | ||
53 | ;; r3: free | ||
54 | |||
55 | #ifndef CONFIG_SMP | ||
56 | seth r2, #high(tlb_entry_d_dat) | ||
57 | or3 r2, r2, #low(tlb_entry_d_dat) | ||
58 | #else /* CONFIG_SMP */ | ||
59 | ldi r1, #-8192 | ||
60 | seth r2, #high(tlb_entry_d_dat) | ||
61 | or3 r2, r2, #low(tlb_entry_d_dat) | ||
62 | and r1, sp | ||
63 | ld r1, @(16, r1) ; current_thread_info->cpu | ||
64 | slli r1, #2 | ||
65 | add r2, r1 | ||
66 | #endif /* !CONFIG_SMP */ | ||
67 | seth r1, #high(DTLB_BASE) | ||
68 | or3 r1, r1, #low(DTLB_BASE) | ||
69 | bra 2f | ||
70 | |||
71 | .balign 16 | ||
72 | .fillinsn | ||
73 | 1: | ||
74 | ;; instrucntion TLB miss | ||
75 | ;; input | ||
76 | ;; r0: MDEVP reg. (included ASID) | ||
77 | ;; r1 - r3: free | ||
78 | ;; output | ||
79 | ;; r0: PFN + ASID | ||
80 | ;; r1: TLB entry base address | ||
81 | ;; r2: &tlb_entry_{i|d}_dat | ||
82 | ;; r3: free | ||
83 | ldi r3, #-4096 | ||
84 | and3 r0, r0, #(MMU_CONTEXT_ASID_MASK) | ||
85 | mvfc r1, bpc | ||
86 | and r1, r3 | ||
87 | or r0, r1 ; r0: PFN + ASID | ||
88 | #ifndef CONFIG_SMP | ||
89 | seth r2, #high(tlb_entry_i_dat) | ||
90 | or3 r2, r2, #low(tlb_entry_i_dat) | ||
91 | #else /* CONFIG_SMP */ | ||
92 | ldi r1, #-8192 | ||
93 | seth r2, #high(tlb_entry_i_dat) | ||
94 | or3 r2, r2, #low(tlb_entry_i_dat) | ||
95 | and r1, sp | ||
96 | ld r1, @(16, r1) ; current_thread_info->cpu | ||
97 | slli r1, #2 | ||
98 | add r2, r1 | ||
99 | #endif /* !CONFIG_SMP */ | ||
100 | seth r1, #high(ITLB_BASE) | ||
101 | or3 r1, r1, #low(ITLB_BASE) | ||
102 | |||
103 | .fillinsn | ||
104 | 2: | ||
105 | ;; select TLB entry | ||
106 | ;; input | ||
107 | ;; r0: PFN + ASID | ||
108 | ;; r1: TLB entry base address | ||
109 | ;; r2: &tlb_entry_{i|d}_dat | ||
110 | ;; r3: free | ||
111 | ;; output | ||
112 | ;; r0: PFN + ASID | ||
113 | ;; r1: TLB entry address | ||
114 | ;; r2, r3: free | ||
115 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
116 | ld r3, @r2 || srli r1, #3 | ||
117 | #else | ||
118 | ld r3, @r2 | ||
119 | srli r1, #3 | ||
120 | #endif | ||
121 | add r1, r3 | ||
122 | ; tlb_entry_{d|i}_dat++; | ||
123 | addi r3, #1 | ||
124 | and3 r3, r3, #(NR_TLB_ENTRIES - 1) | ||
125 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
126 | st r3, @r2 || slli r1, #3 | ||
127 | #else | ||
128 | st r3, @r2 | ||
129 | slli r1, #3 | ||
130 | #endif | ||
131 | |||
132 | ;; load pte | ||
133 | ;; input | ||
134 | ;; r0: PFN + ASID | ||
135 | ;; r1: TLB entry address | ||
136 | ;; r2, r3: free | ||
137 | ;; output | ||
138 | ;; r0: PFN + ASID | ||
139 | ;; r1: TLB entry address | ||
140 | ;; r2: pte_data | ||
141 | ;; r3: free | ||
142 | ; pgd = *(unsigned long *)MPTB; | ||
143 | ld24 r2, #(-MPTB - 1) | ||
144 | srl3 r3, r0, #22 | ||
145 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
146 | not r2, r2 || slli r3, #2 ; r3: pgd offset | ||
147 | #else | ||
148 | not r2, r2 | ||
149 | slli r3, #2 | ||
150 | #endif | ||
151 | ld r2, @r2 ; r2: pgd base addr (MPTB reg.) | ||
152 | or r3, r2 ; r3: pmd addr | ||
153 | |||
154 | ; pmd = pmd_offset(pgd, address); | ||
155 | ld r3, @r3 ; r3: pmd data | ||
156 | ldi r2, #-4096 | ||
157 | beqz r3, 3f ; pmd_none(*pmd) ? | ||
158 | |||
159 | ; pte = pte_offset(pmd, address); | ||
160 | and r2, r3 ; r2: pte base addr | ||
161 | srl3 r3, r0, #10 | ||
162 | and3 r3, r3, #0xffc ; r3: pte offset | ||
163 | or r3, r2 | ||
164 | seth r2, #0x8000 | ||
165 | or r3, r2 ; r3: pte addr | ||
166 | |||
167 | ; pte_data = (unsigned long)pte_val(*pte); | ||
168 | ld r2, @r3 ; r2: pte data | ||
169 | or3 r2, r2, #2 ; _PAGE_PRESENT(=2) | ||
170 | |||
171 | .fillinsn | ||
172 | 5: | ||
173 | ;; set tlb | ||
174 | ;; input | ||
175 | ;; r0: PFN + ASID | ||
176 | ;; r1: TLB entry address | ||
177 | ;; r2: pte_data | ||
178 | ;; r3: free | ||
179 | st r0, @r1 ; set_tlb_tag(entry++, address); | ||
180 | st r2, @+r1 ; set_tlb_data(entry, pte_data); | ||
181 | |||
182 | .fillinsn | ||
183 | 6: | ||
184 | ld r3, @sp+ | ||
185 | ld r2, @sp+ | ||
186 | ld r1, @sp+ | ||
187 | ld r0, @sp+ | ||
188 | rte | ||
189 | |||
190 | .fillinsn | ||
191 | 3: | ||
192 | ;; error | ||
193 | ;; input | ||
194 | ;; r0: PFN + ASID | ||
195 | ;; r1: TLB entry address | ||
196 | ;; r2, r3: free | ||
197 | ;; output | ||
198 | ;; r0: PFN + ASID | ||
199 | ;; r1: TLB entry address | ||
200 | ;; r2: pte_data | ||
201 | ;; r3: free | ||
202 | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
203 | bra 5b || ldi r2, #2 | ||
204 | #else | ||
205 | ldi r2, #2 ; r2: pte_data = 0 | _PAGE_PRESENT(=2) | ||
206 | bra 5b | ||
207 | #endif | ||
208 | |||
209 | #elif defined (CONFIG_ISA_M32R) | ||
210 | |||
211 | st sp, @-sp | ||
212 | st r0, @-sp | ||
213 | st r1, @-sp | ||
214 | st r2, @-sp | ||
215 | st r3, @-sp | ||
216 | st r4, @-sp | ||
217 | |||
218 | seth r3, #high(MMU_REG_BASE) | ||
219 | ld r0, @(MDEVA_offset,r3) ; r0: address (MDEVA reg.) | ||
220 | mvfc r2, bpc ; r2: bpc | ||
221 | ld r1, @(MESTS_offset,r3) ; r1: status (MESTS reg.) | ||
222 | st r1, @(MESTS_offset,r3) ; clear status (MESTS reg.) | ||
223 | and3 r1, r1, #(MESTS_IT) | ||
224 | beqz r1, 1f ; data TLB miss? | ||
225 | |||
226 | ;; instrucntion TLB miss | ||
227 | mv r0, r2 ; address = bpc; | ||
228 | ; entry = (unsigned long *)ITLB_BASE+tlb_entry_i*2; | ||
229 | seth r3, #shigh(tlb_entry_i_dat) | ||
230 | ld r4, @(low(tlb_entry_i_dat),r3) | ||
231 | sll3 r2, r4, #3 | ||
232 | seth r1, #high(ITLB_BASE) | ||
233 | or3 r1, r1, #low(ITLB_BASE) | ||
234 | add r2, r1 ; r2: entry | ||
235 | addi r4, #1 ; tlb_entry_i++; | ||
236 | and3 r4, r4, #(NR_TLB_ENTRIES-1) | ||
237 | st r4, @(low(tlb_entry_i_dat),r3) | ||
238 | bra 2f | ||
239 | .fillinsn | ||
240 | 1: | ||
241 | ;; data TLB miss | ||
242 | ; entry = (unsigned long *)DTLB_BASE+tlb_entry_d*2; | ||
243 | seth r3, #shigh(tlb_entry_d_dat) | ||
244 | ld r4, @(low(tlb_entry_d_dat),r3) | ||
245 | sll3 r2, r4, #3 | ||
246 | seth r1, #high(DTLB_BASE) | ||
247 | or3 r1, r1, #low(DTLB_BASE) | ||
248 | add r2, r1 ; r2: entry | ||
249 | addi r4, #1 ; tlb_entry_d++; | ||
250 | and3 r4, r4, #(NR_TLB_ENTRIES-1) | ||
251 | st r4, @(low(tlb_entry_d_dat),r3) | ||
252 | .fillinsn | ||
253 | 2: | ||
254 | ;; load pte | ||
255 | ; r0: address, r2: entry | ||
256 | ; r1,r3,r4: (free) | ||
257 | ; pgd = *(unsigned long *)MPTB; | ||
258 | ld24 r1, #(-MPTB-1) | ||
259 | not r1, r1 | ||
260 | ld r1, @r1 | ||
261 | srl3 r4, r0, #22 | ||
262 | sll3 r3, r4, #2 | ||
263 | add r3, r1 ; r3: pgd | ||
264 | ; pmd = pmd_offset(pgd, address); | ||
265 | ld r1, @r3 ; r1: pmd | ||
266 | beqz r1, 3f ; pmd_none(*pmd) ? | ||
267 | ; | ||
268 | and3 r1, r1, #0xeff | ||
269 | ldi r4, #611 ; _KERNPG_TABLE(=611) | ||
270 | beq r1, r4, 4f ; !pmd_bad(*pmd) ? | ||
271 | .fillinsn | ||
272 | 3: | ||
273 | ldi r1, #0 ; r1: pte_data = 0 | ||
274 | bra 5f | ||
275 | .fillinsn | ||
276 | 4: | ||
277 | ; pte = pte_offset(pmd, address); | ||
278 | ld r4, @r3 ; r4: pte | ||
279 | ldi r3, #-4096 | ||
280 | and r4, r3 | ||
281 | srl3 r3, r0, #10 | ||
282 | and3 r3, r3, #0xffc | ||
283 | add r4, r3 | ||
284 | seth r3, #0x8000 | ||
285 | add r4, r3 ; r4: pte | ||
286 | ; pte_data = (unsigned long)pte_val(*pte); | ||
287 | ld r1, @r4 ; r1: pte_data | ||
288 | .fillinsn | ||
289 | |||
290 | ;; set tlb | ||
291 | ; r0: address, r1: pte_data, r2: entry | ||
292 | ; r3,r4: (free) | ||
293 | 5: | ||
294 | ldi r3, #-4096 ; set_tlb_tag(entry++, address); | ||
295 | and r3, r0 | ||
296 | seth r4, #shigh(MASID) | ||
297 | ld r4, @(low(MASID),r4) ; r4: MASID | ||
298 | and3 r4, r4, #(MMU_CONTEXT_ASID_MASK) | ||
299 | or r3, r4 | ||
300 | st r3, @r2 | ||
301 | or3 r4, r1, #2 ; _PAGE_PRESENT(=2) | ||
302 | st r4, @(4,r2) ; set_tlb_data(entry, pte_data); | ||
303 | |||
304 | ld r4, @sp+ | ||
305 | ld r3, @sp+ | ||
306 | ld r2, @sp+ | ||
307 | ld r1, @sp+ | ||
308 | ld r0, @sp+ | ||
309 | ld sp, @sp+ | ||
310 | rte | ||
311 | |||
312 | #else | ||
313 | #error unknown isa configuration | ||
314 | #endif | ||
315 | |||
316 | ENTRY(init_tlb) | ||
317 | ;; Set MMU Register | ||
318 | seth r0, #high(MMU_REG_BASE) ; Set MMU_REG_BASE higher | ||
319 | or3 r0, r0, #low(MMU_REG_BASE) ; Set MMU_REG_BASE lower | ||
320 | ldi r1, #0 | ||
321 | st r1, @(MPSZ_offset,r0) ; Set MPSZ Reg(Page size 4KB:0 16KB:1 64KB:2) | ||
322 | ldi r1, #0 | ||
323 | st r1, @(MASID_offset,r0) ; Set ASID Zero | ||
324 | |||
325 | ;; Set TLB | ||
326 | seth r0, #high(ITLB_BASE) ; Set ITLB_BASE higher | ||
327 | or3 r0, r0, #low(ITLB_BASE) ; Set ITLB_BASE lower | ||
328 | seth r1, #high(DTLB_BASE) ; Set DTLB_BASE higher | ||
329 | or3 r1, r1, #low(DTLB_BASE) ; Set DTLB_BASE lower | ||
330 | ldi r2, #0 | ||
331 | ldi r3, #NR_TLB_ENTRIES | ||
332 | addi r0, #-4 | ||
333 | addi r1, #-4 | ||
334 | clear_tlb: | ||
335 | st r2, @+r0 ; VPA <- 0 | ||
336 | st r2, @+r0 ; PPA <- 0 | ||
337 | st r2, @+r1 ; VPA <- 0 | ||
338 | st r2, @+r1 ; PPA <- 0 | ||
339 | addi r3, #-1 | ||
340 | bnez r3, clear_tlb | ||
341 | ;; | ||
342 | jmp r14 | ||
343 | |||
344 | ENTRY(m32r_itlb_entrys) | ||
345 | ENTRY(m32r_otlb_entrys) | ||
346 | |||
347 | #endif /* CONFIG_MMU */ | ||
348 | |||
349 | .end | ||
350 | |||
diff --git a/arch/m32r/mm/page.S b/arch/m32r/mm/page.S new file mode 100644 index 000000000000..a2e9367dbf79 --- /dev/null +++ b/arch/m32r/mm/page.S | |||
@@ -0,0 +1,82 @@ | |||
1 | /* | ||
2 | * linux/arch/m32r/mm/page.S | ||
3 | * | ||
4 | * Clear/Copy page with CPU | ||
5 | * | ||
6 | * Copyright (C) 2004 The Free Software Initiative of Japan | ||
7 | * | ||
8 | * Written by Niibe Yutaka | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | ||
11 | * License. See the file "COPYING" in the main directory of this archive | ||
12 | * for more details. | ||
13 | * | ||
14 | */ | ||
15 | .text | ||
16 | .global copy_page | ||
17 | /* | ||
18 | * copy_page (to, from) | ||
19 | * | ||
20 | * PAGE_SIZE = 4096-byte | ||
21 | * Cache line = 16-byte | ||
22 | * 16 * 256 | ||
23 | */ | ||
24 | .align 4 | ||
25 | copy_page: | ||
26 | ldi r2, #255 | ||
27 | ld r3, @r0 /* cache line allocate */ | ||
28 | ld r4, @r1+ | ||
29 | ld r5, @r1+ | ||
30 | ld r6, @r1+ | ||
31 | ld r7, @r1+ | ||
32 | .fillinsn | ||
33 | 0: | ||
34 | st r4, @r0 | ||
35 | st r5, @+r0 | ||
36 | st r6, @+r0 | ||
37 | st r7, @+r0 | ||
38 | ld r4, @r1+ | ||
39 | addi r0, #4 | ||
40 | ld r5, @r1+ | ||
41 | ld r6, @r1+ | ||
42 | ld r7, @r1+ | ||
43 | ld r3, @r0 /* cache line allocate */ | ||
44 | addi r2, #-1 | ||
45 | bnez r2, 0b | ||
46 | |||
47 | st r4, @r0 | ||
48 | st r5, @+r0 | ||
49 | st r6, @+r0 | ||
50 | st r7, @+r0 | ||
51 | jmp r14 | ||
52 | |||
53 | .text | ||
54 | .global clear_page | ||
55 | /* | ||
56 | * clear_page (to) | ||
57 | * | ||
58 | * PAGE_SIZE = 4096-byte | ||
59 | * Cache line = 16-byte | ||
60 | * 16 * 256 | ||
61 | */ | ||
62 | .align 4 | ||
63 | clear_page: | ||
64 | ldi r2, #255 | ||
65 | ldi r4, #0 | ||
66 | ld r3, @r0 /* cache line allocate */ | ||
67 | .fillinsn | ||
68 | 0: | ||
69 | st r4, @r0 | ||
70 | st r4, @+r0 | ||
71 | st r4, @+r0 | ||
72 | st r4, @+r0 | ||
73 | addi r0, #4 | ||
74 | ld r3, @r0 /* cache line allocate */ | ||
75 | addi r2, #-1 | ||
76 | bnez r2, 0b | ||
77 | |||
78 | st r4, @r0 | ||
79 | st r4, @+r0 | ||
80 | st r4, @+r0 | ||
81 | st r4, @+r0 | ||
82 | jmp r14 | ||
diff --git a/arch/m32r/oaks32r/defconfig.nommu b/arch/m32r/oaks32r/defconfig.nommu new file mode 100644 index 000000000000..f2da9be726e5 --- /dev/null +++ b/arch/m32r/oaks32r/defconfig.nommu | |||
@@ -0,0 +1,602 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:11:13 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | CONFIG_CLEAN_COMPILE=y | ||
17 | CONFIG_BROKEN_ON_SMP=y | ||
18 | CONFIG_LOCK_KERNEL=y | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_LOCALVERSION="" | ||
24 | # CONFIG_POSIX_MQUEUE is not set | ||
25 | CONFIG_BSD_PROCESS_ACCT=y | ||
26 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
27 | CONFIG_SYSCTL=y | ||
28 | # CONFIG_AUDIT is not set | ||
29 | CONFIG_LOG_BUF_SHIFT=14 | ||
30 | CONFIG_HOTPLUG=y | ||
31 | CONFIG_KOBJECT_UEVENT=y | ||
32 | # CONFIG_IKCONFIG is not set | ||
33 | CONFIG_EMBEDDED=y | ||
34 | # CONFIG_KALLSYMS is not set | ||
35 | # CONFIG_FUTEX is not set | ||
36 | # CONFIG_EPOLL is not set | ||
37 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
38 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
39 | CONFIG_CC_ALIGN_LABELS=0 | ||
40 | CONFIG_CC_ALIGN_LOOPS=0 | ||
41 | CONFIG_CC_ALIGN_JUMPS=0 | ||
42 | CONFIG_TINY_SHMEM=y | ||
43 | |||
44 | # | ||
45 | # Loadable module support | ||
46 | # | ||
47 | CONFIG_MODULES=y | ||
48 | CONFIG_MODULE_UNLOAD=y | ||
49 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
50 | CONFIG_OBSOLETE_MODPARM=y | ||
51 | # CONFIG_MODVERSIONS is not set | ||
52 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
53 | CONFIG_KMOD=y | ||
54 | |||
55 | # | ||
56 | # Processor type and features | ||
57 | # | ||
58 | # CONFIG_PLAT_MAPPI is not set | ||
59 | # CONFIG_PLAT_USRV is not set | ||
60 | # CONFIG_PLAT_M32700UT is not set | ||
61 | # CONFIG_PLAT_OPSPUT is not set | ||
62 | CONFIG_PLAT_OAKS32R=y | ||
63 | # CONFIG_PLAT_MAPPI2 is not set | ||
64 | # CONFIG_CHIP_M32700 is not set | ||
65 | CONFIG_CHIP_M32102=y | ||
66 | # CONFIG_CHIP_VDEC2 is not set | ||
67 | # CONFIG_CHIP_OPSP is not set | ||
68 | CONFIG_ISA_M32R=y | ||
69 | CONFIG_BUS_CLOCK=33333333 | ||
70 | CONFIG_TIMER_DIVIDE=128 | ||
71 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
72 | CONFIG_MEMORY_START=0x01000000 | ||
73 | CONFIG_MEMORY_SIZE=0x00800000 | ||
74 | CONFIG_NOHIGHMEM=y | ||
75 | # CONFIG_DISCONTIGMEM is not set | ||
76 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
77 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
78 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
79 | CONFIG_PREEMPT=y | ||
80 | # CONFIG_HAVE_DEC_LOCK is not set | ||
81 | # CONFIG_SMP is not set | ||
82 | |||
83 | # | ||
84 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
85 | # | ||
86 | # CONFIG_PCI is not set | ||
87 | # CONFIG_ISA is not set | ||
88 | |||
89 | # | ||
90 | # PCCARD (PCMCIA/CardBus) support | ||
91 | # | ||
92 | # CONFIG_PCCARD is not set | ||
93 | |||
94 | # | ||
95 | # PC-card bridges | ||
96 | # | ||
97 | |||
98 | # | ||
99 | # PCI Hotplug Support | ||
100 | # | ||
101 | |||
102 | # | ||
103 | # Executable file formats | ||
104 | # | ||
105 | CONFIG_BINFMT_FLAT=y | ||
106 | # CONFIG_BINFMT_ZFLAT is not set | ||
107 | # CONFIG_BINFMT_SHARED_FLAT is not set | ||
108 | # CONFIG_BINFMT_MISC is not set | ||
109 | |||
110 | # | ||
111 | # Device Drivers | ||
112 | # | ||
113 | |||
114 | # | ||
115 | # Generic Driver Options | ||
116 | # | ||
117 | CONFIG_STANDALONE=y | ||
118 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
119 | # CONFIG_FW_LOADER is not set | ||
120 | |||
121 | # | ||
122 | # Memory Technology Devices (MTD) | ||
123 | # | ||
124 | # CONFIG_MTD is not set | ||
125 | |||
126 | # | ||
127 | # Parallel port support | ||
128 | # | ||
129 | # CONFIG_PARPORT is not set | ||
130 | |||
131 | # | ||
132 | # Plug and Play support | ||
133 | # | ||
134 | |||
135 | # | ||
136 | # Block devices | ||
137 | # | ||
138 | # CONFIG_BLK_DEV_FD is not set | ||
139 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
140 | CONFIG_BLK_DEV_LOOP=y | ||
141 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
142 | CONFIG_BLK_DEV_NBD=y | ||
143 | CONFIG_BLK_DEV_RAM=y | ||
144 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
145 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
146 | # CONFIG_BLK_DEV_INITRD is not set | ||
147 | CONFIG_INITRAMFS_SOURCE="" | ||
148 | # CONFIG_CDROM_PKTCDVD is not set | ||
149 | |||
150 | # | ||
151 | # IO Schedulers | ||
152 | # | ||
153 | CONFIG_IOSCHED_NOOP=y | ||
154 | # CONFIG_IOSCHED_AS is not set | ||
155 | CONFIG_IOSCHED_DEADLINE=y | ||
156 | CONFIG_IOSCHED_CFQ=y | ||
157 | # CONFIG_ATA_OVER_ETH is not set | ||
158 | |||
159 | # | ||
160 | # ATA/ATAPI/MFM/RLL support | ||
161 | # | ||
162 | # CONFIG_IDE is not set | ||
163 | |||
164 | # | ||
165 | # SCSI device support | ||
166 | # | ||
167 | # CONFIG_SCSI is not set | ||
168 | |||
169 | # | ||
170 | # Multi-device support (RAID and LVM) | ||
171 | # | ||
172 | # CONFIG_MD is not set | ||
173 | |||
174 | # | ||
175 | # Fusion MPT device support | ||
176 | # | ||
177 | |||
178 | # | ||
179 | # IEEE 1394 (FireWire) support | ||
180 | # | ||
181 | |||
182 | # | ||
183 | # I2O device support | ||
184 | # | ||
185 | |||
186 | # | ||
187 | # Networking support | ||
188 | # | ||
189 | CONFIG_NET=y | ||
190 | |||
191 | # | ||
192 | # Networking options | ||
193 | # | ||
194 | CONFIG_PACKET=y | ||
195 | # CONFIG_PACKET_MMAP is not set | ||
196 | # CONFIG_NETLINK_DEV is not set | ||
197 | CONFIG_UNIX=y | ||
198 | # CONFIG_NET_KEY is not set | ||
199 | CONFIG_INET=y | ||
200 | # CONFIG_IP_MULTICAST is not set | ||
201 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
202 | CONFIG_IP_PNP=y | ||
203 | CONFIG_IP_PNP_DHCP=y | ||
204 | # CONFIG_IP_PNP_BOOTP is not set | ||
205 | # CONFIG_IP_PNP_RARP is not set | ||
206 | # CONFIG_NET_IPIP is not set | ||
207 | # CONFIG_NET_IPGRE is not set | ||
208 | # CONFIG_ARPD is not set | ||
209 | # CONFIG_SYN_COOKIES is not set | ||
210 | # CONFIG_INET_AH is not set | ||
211 | # CONFIG_INET_ESP is not set | ||
212 | # CONFIG_INET_IPCOMP is not set | ||
213 | # CONFIG_INET_TUNNEL is not set | ||
214 | CONFIG_IP_TCPDIAG=y | ||
215 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
216 | # CONFIG_IPV6 is not set | ||
217 | # CONFIG_NETFILTER is not set | ||
218 | |||
219 | # | ||
220 | # SCTP Configuration (EXPERIMENTAL) | ||
221 | # | ||
222 | # CONFIG_IP_SCTP is not set | ||
223 | # CONFIG_ATM is not set | ||
224 | # CONFIG_BRIDGE is not set | ||
225 | # CONFIG_VLAN_8021Q is not set | ||
226 | # CONFIG_DECNET is not set | ||
227 | # CONFIG_LLC2 is not set | ||
228 | # CONFIG_IPX is not set | ||
229 | # CONFIG_ATALK is not set | ||
230 | # CONFIG_X25 is not set | ||
231 | # CONFIG_LAPB is not set | ||
232 | # CONFIG_NET_DIVERT is not set | ||
233 | # CONFIG_ECONET is not set | ||
234 | # CONFIG_WAN_ROUTER is not set | ||
235 | |||
236 | # | ||
237 | # QoS and/or fair queueing | ||
238 | # | ||
239 | # CONFIG_NET_SCHED is not set | ||
240 | # CONFIG_NET_CLS_ROUTE is not set | ||
241 | |||
242 | # | ||
243 | # Network testing | ||
244 | # | ||
245 | # CONFIG_NET_PKTGEN is not set | ||
246 | # CONFIG_NETPOLL is not set | ||
247 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
248 | # CONFIG_HAMRADIO is not set | ||
249 | # CONFIG_IRDA is not set | ||
250 | # CONFIG_BT is not set | ||
251 | CONFIG_NETDEVICES=y | ||
252 | # CONFIG_DUMMY is not set | ||
253 | # CONFIG_BONDING is not set | ||
254 | # CONFIG_EQUALIZER is not set | ||
255 | # CONFIG_TUN is not set | ||
256 | |||
257 | # | ||
258 | # Ethernet (10 or 100Mbit) | ||
259 | # | ||
260 | # CONFIG_NET_ETHERNET is not set | ||
261 | CONFIG_NE2000=y | ||
262 | |||
263 | # | ||
264 | # Ethernet (1000 Mbit) | ||
265 | # | ||
266 | |||
267 | # | ||
268 | # Ethernet (10000 Mbit) | ||
269 | # | ||
270 | |||
271 | # | ||
272 | # Token Ring devices | ||
273 | # | ||
274 | |||
275 | # | ||
276 | # Wireless LAN (non-hamradio) | ||
277 | # | ||
278 | # CONFIG_NET_RADIO is not set | ||
279 | |||
280 | # | ||
281 | # Wan interfaces | ||
282 | # | ||
283 | # CONFIG_WAN is not set | ||
284 | # CONFIG_PPP is not set | ||
285 | # CONFIG_SLIP is not set | ||
286 | # CONFIG_SHAPER is not set | ||
287 | # CONFIG_NETCONSOLE is not set | ||
288 | |||
289 | # | ||
290 | # ISDN subsystem | ||
291 | # | ||
292 | # CONFIG_ISDN is not set | ||
293 | |||
294 | # | ||
295 | # Telephony Support | ||
296 | # | ||
297 | # CONFIG_PHONE is not set | ||
298 | |||
299 | # | ||
300 | # Input device support | ||
301 | # | ||
302 | CONFIG_INPUT=y | ||
303 | |||
304 | # | ||
305 | # Userland interfaces | ||
306 | # | ||
307 | # CONFIG_INPUT_MOUSEDEV is not set | ||
308 | # CONFIG_INPUT_JOYDEV is not set | ||
309 | # CONFIG_INPUT_TSDEV is not set | ||
310 | # CONFIG_INPUT_EVDEV is not set | ||
311 | # CONFIG_INPUT_EVBUG is not set | ||
312 | |||
313 | # | ||
314 | # Input I/O drivers | ||
315 | # | ||
316 | # CONFIG_GAMEPORT is not set | ||
317 | CONFIG_SOUND_GAMEPORT=y | ||
318 | CONFIG_SERIO=y | ||
319 | # CONFIG_SERIO_I8042 is not set | ||
320 | CONFIG_SERIO_SERPORT=y | ||
321 | # CONFIG_SERIO_CT82C710 is not set | ||
322 | # CONFIG_SERIO_LIBPS2 is not set | ||
323 | # CONFIG_SERIO_RAW is not set | ||
324 | |||
325 | # | ||
326 | # Input Device Drivers | ||
327 | # | ||
328 | # CONFIG_INPUT_KEYBOARD is not set | ||
329 | # CONFIG_INPUT_MOUSE is not set | ||
330 | # CONFIG_INPUT_JOYSTICK is not set | ||
331 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
332 | # CONFIG_INPUT_MISC is not set | ||
333 | |||
334 | # | ||
335 | # Character devices | ||
336 | # | ||
337 | # CONFIG_VT is not set | ||
338 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
339 | |||
340 | # | ||
341 | # Serial drivers | ||
342 | # | ||
343 | # CONFIG_SERIAL_8250 is not set | ||
344 | |||
345 | # | ||
346 | # Non-8250 serial port support | ||
347 | # | ||
348 | CONFIG_SERIAL_CORE=y | ||
349 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
350 | CONFIG_SERIAL_M32R_SIO=y | ||
351 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
352 | # CONFIG_SERIAL_M32R_PLDSIO is not set | ||
353 | CONFIG_UNIX98_PTYS=y | ||
354 | CONFIG_LEGACY_PTYS=y | ||
355 | CONFIG_LEGACY_PTY_COUNT=256 | ||
356 | |||
357 | # | ||
358 | # IPMI | ||
359 | # | ||
360 | # CONFIG_IPMI_HANDLER is not set | ||
361 | |||
362 | # | ||
363 | # Watchdog Cards | ||
364 | # | ||
365 | # CONFIG_WATCHDOG is not set | ||
366 | # CONFIG_RTC is not set | ||
367 | # CONFIG_GEN_RTC is not set | ||
368 | # CONFIG_DTLK is not set | ||
369 | # CONFIG_R3964 is not set | ||
370 | |||
371 | # | ||
372 | # Ftape, the floppy tape device driver | ||
373 | # | ||
374 | # CONFIG_DRM is not set | ||
375 | # CONFIG_RAW_DRIVER is not set | ||
376 | |||
377 | # | ||
378 | # I2C support | ||
379 | # | ||
380 | # CONFIG_I2C is not set | ||
381 | |||
382 | # | ||
383 | # Dallas's 1-wire bus | ||
384 | # | ||
385 | # CONFIG_W1 is not set | ||
386 | |||
387 | # | ||
388 | # Misc devices | ||
389 | # | ||
390 | |||
391 | # | ||
392 | # Multimedia devices | ||
393 | # | ||
394 | # CONFIG_VIDEO_DEV is not set | ||
395 | |||
396 | # | ||
397 | # Digital Video Broadcasting Devices | ||
398 | # | ||
399 | # CONFIG_DVB is not set | ||
400 | |||
401 | # | ||
402 | # Graphics support | ||
403 | # | ||
404 | # CONFIG_FB is not set | ||
405 | |||
406 | # | ||
407 | # Sound | ||
408 | # | ||
409 | # CONFIG_SOUND is not set | ||
410 | |||
411 | # | ||
412 | # USB support | ||
413 | # | ||
414 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
415 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
416 | |||
417 | # | ||
418 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
419 | # | ||
420 | |||
421 | # | ||
422 | # USB Gadget Support | ||
423 | # | ||
424 | # CONFIG_USB_GADGET is not set | ||
425 | |||
426 | # | ||
427 | # MMC/SD Card support | ||
428 | # | ||
429 | # CONFIG_MMC is not set | ||
430 | |||
431 | # | ||
432 | # InfiniBand support | ||
433 | # | ||
434 | # CONFIG_INFINIBAND is not set | ||
435 | |||
436 | # | ||
437 | # File systems | ||
438 | # | ||
439 | CONFIG_EXT2_FS=y | ||
440 | # CONFIG_EXT2_FS_XATTR is not set | ||
441 | # CONFIG_EXT3_FS is not set | ||
442 | # CONFIG_JBD is not set | ||
443 | # CONFIG_REISERFS_FS is not set | ||
444 | # CONFIG_JFS_FS is not set | ||
445 | |||
446 | # | ||
447 | # XFS support | ||
448 | # | ||
449 | # CONFIG_XFS_FS is not set | ||
450 | # CONFIG_MINIX_FS is not set | ||
451 | # CONFIG_ROMFS_FS is not set | ||
452 | # CONFIG_QUOTA is not set | ||
453 | CONFIG_DNOTIFY=y | ||
454 | # CONFIG_AUTOFS_FS is not set | ||
455 | # CONFIG_AUTOFS4_FS is not set | ||
456 | |||
457 | # | ||
458 | # CD-ROM/DVD Filesystems | ||
459 | # | ||
460 | # CONFIG_ISO9660_FS is not set | ||
461 | # CONFIG_UDF_FS is not set | ||
462 | |||
463 | # | ||
464 | # DOS/FAT/NT Filesystems | ||
465 | # | ||
466 | # CONFIG_MSDOS_FS is not set | ||
467 | # CONFIG_VFAT_FS is not set | ||
468 | # CONFIG_NTFS_FS is not set | ||
469 | |||
470 | # | ||
471 | # Pseudo filesystems | ||
472 | # | ||
473 | CONFIG_PROC_FS=y | ||
474 | CONFIG_SYSFS=y | ||
475 | # CONFIG_DEVFS_FS is not set | ||
476 | CONFIG_DEVPTS_FS_XATTR=y | ||
477 | CONFIG_DEVPTS_FS_SECURITY=y | ||
478 | # CONFIG_TMPFS is not set | ||
479 | # CONFIG_HUGETLB_PAGE is not set | ||
480 | CONFIG_RAMFS=y | ||
481 | |||
482 | # | ||
483 | # Miscellaneous filesystems | ||
484 | # | ||
485 | # CONFIG_ADFS_FS is not set | ||
486 | # CONFIG_AFFS_FS is not set | ||
487 | # CONFIG_HFS_FS is not set | ||
488 | # CONFIG_HFSPLUS_FS is not set | ||
489 | # CONFIG_BEFS_FS is not set | ||
490 | # CONFIG_BFS_FS is not set | ||
491 | # CONFIG_EFS_FS is not set | ||
492 | # CONFIG_CRAMFS is not set | ||
493 | # CONFIG_VXFS_FS is not set | ||
494 | # CONFIG_HPFS_FS is not set | ||
495 | # CONFIG_QNX4FS_FS is not set | ||
496 | # CONFIG_SYSV_FS is not set | ||
497 | # CONFIG_UFS_FS is not set | ||
498 | |||
499 | # | ||
500 | # Network File Systems | ||
501 | # | ||
502 | CONFIG_NFS_FS=y | ||
503 | CONFIG_NFS_V3=y | ||
504 | # CONFIG_NFS_V4 is not set | ||
505 | # CONFIG_NFS_DIRECTIO is not set | ||
506 | # CONFIG_NFSD is not set | ||
507 | CONFIG_ROOT_NFS=y | ||
508 | CONFIG_LOCKD=y | ||
509 | CONFIG_LOCKD_V4=y | ||
510 | CONFIG_SUNRPC=y | ||
511 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
512 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
513 | # CONFIG_SMB_FS is not set | ||
514 | # CONFIG_CIFS is not set | ||
515 | # CONFIG_NCP_FS is not set | ||
516 | # CONFIG_CODA_FS is not set | ||
517 | # CONFIG_AFS_FS is not set | ||
518 | |||
519 | # | ||
520 | # Partition Types | ||
521 | # | ||
522 | # CONFIG_PARTITION_ADVANCED is not set | ||
523 | CONFIG_MSDOS_PARTITION=y | ||
524 | |||
525 | # | ||
526 | # Native Language Support | ||
527 | # | ||
528 | CONFIG_NLS=y | ||
529 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
530 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
531 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
532 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
533 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
534 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
535 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
536 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
537 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
538 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
539 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
540 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
541 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
542 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
543 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
544 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
545 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
546 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
547 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
548 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
549 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
550 | # CONFIG_NLS_ISO8859_8 is not set | ||
551 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
552 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
553 | # CONFIG_NLS_ASCII is not set | ||
554 | # CONFIG_NLS_ISO8859_1 is not set | ||
555 | # CONFIG_NLS_ISO8859_2 is not set | ||
556 | # CONFIG_NLS_ISO8859_3 is not set | ||
557 | # CONFIG_NLS_ISO8859_4 is not set | ||
558 | # CONFIG_NLS_ISO8859_5 is not set | ||
559 | # CONFIG_NLS_ISO8859_6 is not set | ||
560 | # CONFIG_NLS_ISO8859_7 is not set | ||
561 | # CONFIG_NLS_ISO8859_9 is not set | ||
562 | # CONFIG_NLS_ISO8859_13 is not set | ||
563 | # CONFIG_NLS_ISO8859_14 is not set | ||
564 | # CONFIG_NLS_ISO8859_15 is not set | ||
565 | # CONFIG_NLS_KOI8_R is not set | ||
566 | # CONFIG_NLS_KOI8_U is not set | ||
567 | # CONFIG_NLS_UTF8 is not set | ||
568 | |||
569 | # | ||
570 | # Profiling support | ||
571 | # | ||
572 | # CONFIG_PROFILING is not set | ||
573 | |||
574 | # | ||
575 | # Kernel hacking | ||
576 | # | ||
577 | # CONFIG_DEBUG_KERNEL is not set | ||
578 | CONFIG_DEBUG_PREEMPT=y | ||
579 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
580 | # CONFIG_FRAME_POINTER is not set | ||
581 | |||
582 | # | ||
583 | # Security options | ||
584 | # | ||
585 | # CONFIG_KEYS is not set | ||
586 | # CONFIG_SECURITY is not set | ||
587 | |||
588 | # | ||
589 | # Cryptographic options | ||
590 | # | ||
591 | # CONFIG_CRYPTO is not set | ||
592 | |||
593 | # | ||
594 | # Hardware crypto devices | ||
595 | # | ||
596 | |||
597 | # | ||
598 | # Library routines | ||
599 | # | ||
600 | # CONFIG_CRC_CCITT is not set | ||
601 | CONFIG_CRC32=y | ||
602 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/m32r/oaks32r/dot.gdbinit.nommu b/arch/m32r/oaks32r/dot.gdbinit.nommu new file mode 100644 index 000000000000..d481d972b802 --- /dev/null +++ b/arch/m32r/oaks32r/dot.gdbinit.nommu | |||
@@ -0,0 +1,154 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id: dot.gdbinit.oaks32r,v 1.4 2004/10/20 02:24:37 takata Exp $ | ||
3 | #----- | ||
4 | # NOTE: this file is generated by a script, "gen_gdbinit.pl". | ||
5 | # (Please type "gen_gdbinit.pl --help" and check the help message). | ||
6 | # $ Id: gen_gdbinit.pl,v 1.12 2004/07/26 09:56:10 takata Exp $ | ||
7 | #----- | ||
8 | # target platform: oaks32r | ||
9 | |||
10 | # setting | ||
11 | set width 0d70 | ||
12 | set radix 0d16 | ||
13 | |||
14 | # clk xin:cpu:bus=16:66:33 | ||
15 | define clock_init | ||
16 | set *(unsigned long *)0x00ef4008 = 1 | ||
17 | shell sleep 0.1 | ||
18 | set *(unsigned long *)0x00ef4000 = 0x00020100 | ||
19 | end | ||
20 | |||
21 | # Initialize programmable ports | ||
22 | define port_init | ||
23 | set *(unsigned long *)0x00ef1000 = 0x1 | ||
24 | set *(unsigned long *)0x00ef1060 = 0x01400001 | ||
25 | set *(unsigned long *)0x00ef1064 = 0x00015555 | ||
26 | set *(unsigned long *)0x00ef1068 = 0x55555050 | ||
27 | set *(unsigned long *)0x00ef106c = 0x05150040 | ||
28 | end | ||
29 | |||
30 | # Initialize SDRAM controller | ||
31 | define sdram_init | ||
32 | set *(unsigned long *)0x00ef6008 = 0x00000182 | ||
33 | set *(unsigned long *)0x00ef600c = 0x00000001 | ||
34 | shell sleep 0.1 | ||
35 | set *(unsigned long *)0x00ef602c = 0x00000010 | ||
36 | set *(unsigned long *)0x00ef6028 = 0x00000300 | ||
37 | set *(unsigned long *)0x00ef6048 = 0x00000001 | ||
38 | set *(unsigned long *)0x00ef6020 = 0x01000041 | ||
39 | set *(unsigned long *)0x00ef6004 = 0x00010117 | ||
40 | set *(unsigned long *)0x00ef6010 = 0x00000001 | ||
41 | set *(unsigned long *)0x00ef6024 = 0x00000001 | ||
42 | end | ||
43 | document sdram_init | ||
44 | SDRAM controller initialization | ||
45 | 0x01000000 - 0x017fffff (8MB) | ||
46 | end | ||
47 | |||
48 | # Initialize LAN controller | ||
49 | define lanc_init | ||
50 | set *(unsigned long *)0x00ef5008 = 0x03031303 | ||
51 | #RST DRV (P64) | ||
52 | set *(unsigned char *)0x00ef1046 = 0x08 | ||
53 | set *(unsigned char *)0x00ef1026 = 0xff | ||
54 | set *(unsigned char *)0x00ef1026 = 0x00 | ||
55 | set *(unsigned short *)0x02000630 = 0xffff | ||
56 | end | ||
57 | |||
58 | # Show current task structure | ||
59 | define show_current | ||
60 | set $current = $spi & 0xffffe000 | ||
61 | printf "$current=0x%08lX\n",$current | ||
62 | print *(struct task_struct *)$current | ||
63 | end | ||
64 | |||
65 | # Show user assigned task structure | ||
66 | define show_task | ||
67 | set = $arg0 & 0xffffe000 | ||
68 | printf "$task=0x%08lX\n",$task | ||
69 | print *(struct task_struct *)$task | ||
70 | end | ||
71 | document show_task | ||
72 | Show user assigned task structure | ||
73 | arg0 : task structure address | ||
74 | end | ||
75 | |||
76 | # Show M32R registers | ||
77 | define show_regs | ||
78 | printf " R0[0x%08lX] R1[0x%08lX] R2[0x%08lX] R3[0x%08lX]\n",$r0,$r1,$r2,$r3 | ||
79 | printf " R4[0x%08lX] R5[0x%08lX] R6[0x%08lX] R7[0x%08lX]\n",$r4,$r5,$r6,$r7 | ||
80 | printf " R8[0x%08lX] R9[0x%08lX] R10[0x%08lX] R11[0x%08lX]\n",$r8,$r9,$r10,$r11 | ||
81 | printf "R12[0x%08lX] FP[0x%08lX] LR[0x%08lX] SP[0x%08lX]\n",$r12,$fp,$lr,$sp | ||
82 | printf "PSW[0x%08lX] CBR[0x%08lX] SPI[0x%08lX] SPU[0x%08lX]\n",$psw,$cbr,$spi,$spu | ||
83 | printf "BPC[0x%08lX] PC[0x%08lX] ACCL[0x%08lX] ACCH[0x%08lX]\n",$bpc,$pc,$accl,$acch | ||
84 | end | ||
85 | |||
86 | # Setup all | ||
87 | define setup | ||
88 | use_mon_code | ||
89 | set *(unsigned int)0xfffffffc=0x60 | ||
90 | shell sleep 0.1 | ||
91 | clock_init | ||
92 | shell sleep 0.1 | ||
93 | port_init | ||
94 | sdram_init | ||
95 | lanc_init | ||
96 | end | ||
97 | |||
98 | # Load modules | ||
99 | define load_modules | ||
100 | use_debug_dma | ||
101 | load | ||
102 | end | ||
103 | |||
104 | # Set kernel parameters | ||
105 | define set_kernel_parameters | ||
106 | set $param = (void*)0x01001000 | ||
107 | # INITRD_START | ||
108 | # set *(unsigned long *)($param + 0x0010) = 0x00000000 | ||
109 | # INITRD_SIZE | ||
110 | # set *(unsigned long *)($param + 0x0014) = 0x00000000 | ||
111 | # M32R_CPUCLK | ||
112 | set *(unsigned long *)($param + 0x0018) = 0d66666667 | ||
113 | # M32R_BUSCLK | ||
114 | set *(unsigned long *)($param + 0x001c) = 0d33333333 | ||
115 | |||
116 | # M32R_TIMER_DIVIDE | ||
117 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
118 | |||
119 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x root=/dev/nfsroot nfsroot=192.168.0.1:/project/m32r-linux/export/rootfs nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 \0" | ||
120 | end | ||
121 | |||
122 | # Boot | ||
123 | define boot | ||
124 | set_kernel_parameters | ||
125 | set $fp = 0 | ||
126 | set $pc = 0x01002000 | ||
127 | si | ||
128 | c | ||
129 | end | ||
130 | |||
131 | # Set breakpoints | ||
132 | define set_breakpoints | ||
133 | b *0x00000020 | ||
134 | b *0x00000030 | ||
135 | end | ||
136 | |||
137 | # Restart | ||
138 | define restart | ||
139 | sdireset | ||
140 | sdireset | ||
141 | setup | ||
142 | load_modules | ||
143 | boot | ||
144 | end | ||
145 | |||
146 | sdireset | ||
147 | sdireset | ||
148 | file vmlinux | ||
149 | target m32rsdi | ||
150 | setup | ||
151 | #load_modules | ||
152 | #set_breakpoints | ||
153 | #boot | ||
154 | |||
diff --git a/arch/m32r/oprofile/Kconfig b/arch/m32r/oprofile/Kconfig new file mode 100644 index 000000000000..19d37730b664 --- /dev/null +++ b/arch/m32r/oprofile/Kconfig | |||
@@ -0,0 +1,23 @@ | |||
1 | |||
2 | menu "Profiling support" | ||
3 | depends on EXPERIMENTAL | ||
4 | |||
5 | config PROFILING | ||
6 | bool "Profiling support (EXPERIMENTAL)" | ||
7 | help | ||
8 | Say Y here to enable the extended profiling support mechanisms used | ||
9 | by profilers such as OProfile. | ||
10 | |||
11 | |||
12 | config OPROFILE | ||
13 | tristate "OProfile system profiling (EXPERIMENTAL)" | ||
14 | depends on PROFILING | ||
15 | help | ||
16 | OProfile is a profiling system capable of profiling the | ||
17 | whole system, include the kernel, kernel modules, libraries, | ||
18 | and applications. | ||
19 | |||
20 | If unsure, say N. | ||
21 | |||
22 | endmenu | ||
23 | |||
diff --git a/arch/m32r/oprofile/Makefile b/arch/m32r/oprofile/Makefile new file mode 100644 index 000000000000..06e7c81ead2e --- /dev/null +++ b/arch/m32r/oprofile/Makefile | |||
@@ -0,0 +1,9 @@ | |||
1 | obj-$(CONFIG_OPROFILE) += oprofile.o | ||
2 | |||
3 | DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \ | ||
4 | oprof.o cpu_buffer.o buffer_sync.o \ | ||
5 | event_buffer.o oprofile_files.o \ | ||
6 | oprofilefs.o oprofile_stats.o \ | ||
7 | timer_int.o ) | ||
8 | |||
9 | oprofile-y := $(DRIVER_OBJS) init.o | ||
diff --git a/arch/m32r/oprofile/init.c b/arch/m32r/oprofile/init.c new file mode 100644 index 000000000000..b7773e45c43f --- /dev/null +++ b/arch/m32r/oprofile/init.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /** | ||
2 | * @file init.c | ||
3 | * | ||
4 | * @remark Copyright 2002 OProfile authors | ||
5 | * @remark Read the file COPYING | ||
6 | * | ||
7 | * @author John Levon <levon@movementarian.org> | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/oprofile.h> | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/init.h> | ||
14 | |||
15 | int __init oprofile_arch_init(struct oprofile_operations * ops) | ||
16 | { | ||
17 | return -ENODEV; | ||
18 | } | ||
19 | |||
20 | void oprofile_arch_exit(void) | ||
21 | { | ||
22 | } | ||
diff --git a/arch/m32r/opsput/defconfig.opsput b/arch/m32r/opsput/defconfig.opsput new file mode 100644 index 000000000000..a87e1ea4c301 --- /dev/null +++ b/arch/m32r/opsput/defconfig.opsput | |||
@@ -0,0 +1,692 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11-rc4 | ||
4 | # Wed Feb 16 21:11:41 2005 | ||
5 | # | ||
6 | CONFIG_M32R=y | ||
7 | # CONFIG_UID16 is not set | ||
8 | CONFIG_GENERIC_ISA_DMA=y | ||
9 | CONFIG_GENERIC_HARDIRQS=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
11 | |||
12 | # | ||
13 | # Code maturity level options | ||
14 | # | ||
15 | CONFIG_EXPERIMENTAL=y | ||
16 | CONFIG_CLEAN_COMPILE=y | ||
17 | CONFIG_BROKEN_ON_SMP=y | ||
18 | |||
19 | # | ||
20 | # General setup | ||
21 | # | ||
22 | CONFIG_LOCALVERSION="" | ||
23 | CONFIG_SWAP=y | ||
24 | CONFIG_SYSVIPC=y | ||
25 | # CONFIG_POSIX_MQUEUE is not set | ||
26 | CONFIG_BSD_PROCESS_ACCT=y | ||
27 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
28 | CONFIG_SYSCTL=y | ||
29 | # CONFIG_AUDIT is not set | ||
30 | CONFIG_LOG_BUF_SHIFT=14 | ||
31 | CONFIG_HOTPLUG=y | ||
32 | CONFIG_KOBJECT_UEVENT=y | ||
33 | CONFIG_IKCONFIG=y | ||
34 | # CONFIG_IKCONFIG_PROC is not set | ||
35 | CONFIG_EMBEDDED=y | ||
36 | # CONFIG_KALLSYMS is not set | ||
37 | # CONFIG_FUTEX is not set | ||
38 | # CONFIG_EPOLL is not set | ||
39 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
40 | CONFIG_SHMEM=y | ||
41 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
42 | CONFIG_CC_ALIGN_LABELS=0 | ||
43 | CONFIG_CC_ALIGN_LOOPS=0 | ||
44 | CONFIG_CC_ALIGN_JUMPS=0 | ||
45 | # CONFIG_TINY_SHMEM is not set | ||
46 | |||
47 | # | ||
48 | # Loadable module support | ||
49 | # | ||
50 | CONFIG_MODULES=y | ||
51 | CONFIG_MODULE_UNLOAD=y | ||
52 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
53 | CONFIG_OBSOLETE_MODPARM=y | ||
54 | # CONFIG_MODVERSIONS is not set | ||
55 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
56 | CONFIG_KMOD=y | ||
57 | |||
58 | # | ||
59 | # Processor type and features | ||
60 | # | ||
61 | # CONFIG_PLAT_MAPPI is not set | ||
62 | # CONFIG_PLAT_USRV is not set | ||
63 | # CONFIG_PLAT_M32700UT is not set | ||
64 | CONFIG_PLAT_OPSPUT=y | ||
65 | # CONFIG_PLAT_OAKS32R is not set | ||
66 | # CONFIG_PLAT_MAPPI2 is not set | ||
67 | # CONFIG_CHIP_M32700 is not set | ||
68 | # CONFIG_CHIP_M32102 is not set | ||
69 | # CONFIG_CHIP_VDEC2 is not set | ||
70 | CONFIG_CHIP_OPSP=y | ||
71 | CONFIG_MMU=y | ||
72 | CONFIG_TLB_ENTRIES=32 | ||
73 | CONFIG_ISA_M32R2=y | ||
74 | CONFIG_ISA_DSP_LEVEL2=y | ||
75 | CONFIG_ISA_DUAL_ISSUE=y | ||
76 | CONFIG_BUS_CLOCK=50000000 | ||
77 | CONFIG_TIMER_DIVIDE=128 | ||
78 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
79 | CONFIG_MEMORY_START=0x08000000 | ||
80 | CONFIG_MEMORY_SIZE=0x01000000 | ||
81 | CONFIG_NOHIGHMEM=y | ||
82 | # CONFIG_DISCONTIGMEM is not set | ||
83 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
84 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
85 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
86 | # CONFIG_PREEMPT is not set | ||
87 | # CONFIG_SMP is not set | ||
88 | |||
89 | # | ||
90 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
91 | # | ||
92 | # CONFIG_PCI is not set | ||
93 | # CONFIG_ISA is not set | ||
94 | |||
95 | # | ||
96 | # PCCARD (PCMCIA/CardBus) support | ||
97 | # | ||
98 | CONFIG_PCCARD=y | ||
99 | # CONFIG_PCMCIA_DEBUG is not set | ||
100 | CONFIG_PCMCIA=y | ||
101 | |||
102 | # | ||
103 | # PC-card bridges | ||
104 | # | ||
105 | # CONFIG_TCIC is not set | ||
106 | CONFIG_M32R_CFC=y | ||
107 | CONFIG_M32R_CFC_NUM=1 | ||
108 | |||
109 | # | ||
110 | # PCI Hotplug Support | ||
111 | # | ||
112 | |||
113 | # | ||
114 | # Executable file formats | ||
115 | # | ||
116 | CONFIG_BINFMT_ELF=y | ||
117 | # CONFIG_BINFMT_MISC is not set | ||
118 | |||
119 | # | ||
120 | # Device Drivers | ||
121 | # | ||
122 | |||
123 | # | ||
124 | # Generic Driver Options | ||
125 | # | ||
126 | CONFIG_STANDALONE=y | ||
127 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
128 | # CONFIG_FW_LOADER is not set | ||
129 | # CONFIG_DEBUG_DRIVER is not set | ||
130 | |||
131 | # | ||
132 | # Memory Technology Devices (MTD) | ||
133 | # | ||
134 | # CONFIG_MTD is not set | ||
135 | |||
136 | # | ||
137 | # Parallel port support | ||
138 | # | ||
139 | # CONFIG_PARPORT is not set | ||
140 | |||
141 | # | ||
142 | # Plug and Play support | ||
143 | # | ||
144 | |||
145 | # | ||
146 | # Block devices | ||
147 | # | ||
148 | # CONFIG_BLK_DEV_FD is not set | ||
149 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
150 | CONFIG_BLK_DEV_LOOP=y | ||
151 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
152 | # CONFIG_BLK_DEV_NBD is not set | ||
153 | CONFIG_BLK_DEV_RAM=y | ||
154 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
155 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
156 | # CONFIG_BLK_DEV_INITRD is not set | ||
157 | CONFIG_INITRAMFS_SOURCE="" | ||
158 | # CONFIG_CDROM_PKTCDVD is not set | ||
159 | |||
160 | # | ||
161 | # IO Schedulers | ||
162 | # | ||
163 | CONFIG_IOSCHED_NOOP=y | ||
164 | # CONFIG_IOSCHED_AS is not set | ||
165 | CONFIG_IOSCHED_DEADLINE=y | ||
166 | CONFIG_IOSCHED_CFQ=y | ||
167 | # CONFIG_ATA_OVER_ETH is not set | ||
168 | |||
169 | # | ||
170 | # ATA/ATAPI/MFM/RLL support | ||
171 | # | ||
172 | # CONFIG_IDE is not set | ||
173 | |||
174 | # | ||
175 | # SCSI device support | ||
176 | # | ||
177 | CONFIG_SCSI=m | ||
178 | CONFIG_SCSI_PROC_FS=y | ||
179 | |||
180 | # | ||
181 | # SCSI support type (disk, tape, CD-ROM) | ||
182 | # | ||
183 | CONFIG_BLK_DEV_SD=m | ||
184 | # CONFIG_CHR_DEV_ST is not set | ||
185 | # CONFIG_CHR_DEV_OSST is not set | ||
186 | CONFIG_BLK_DEV_SR=m | ||
187 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
188 | CONFIG_CHR_DEV_SG=m | ||
189 | |||
190 | # | ||
191 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
192 | # | ||
193 | CONFIG_SCSI_MULTI_LUN=y | ||
194 | # CONFIG_SCSI_CONSTANTS is not set | ||
195 | # CONFIG_SCSI_LOGGING is not set | ||
196 | |||
197 | # | ||
198 | # SCSI Transport Attributes | ||
199 | # | ||
200 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
201 | # CONFIG_SCSI_FC_ATTRS is not set | ||
202 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
203 | |||
204 | # | ||
205 | # SCSI low-level drivers | ||
206 | # | ||
207 | # CONFIG_SCSI_SATA is not set | ||
208 | # CONFIG_SCSI_DEBUG is not set | ||
209 | |||
210 | # | ||
211 | # PCMCIA SCSI adapter support | ||
212 | # | ||
213 | # CONFIG_PCMCIA_AHA152X is not set | ||
214 | # CONFIG_PCMCIA_FDOMAIN is not set | ||
215 | # CONFIG_PCMCIA_NINJA_SCSI is not set | ||
216 | # CONFIG_PCMCIA_QLOGIC is not set | ||
217 | # CONFIG_PCMCIA_SYM53C500 is not set | ||
218 | |||
219 | # | ||
220 | # Multi-device support (RAID and LVM) | ||
221 | # | ||
222 | # CONFIG_MD is not set | ||
223 | |||
224 | # | ||
225 | # Fusion MPT device support | ||
226 | # | ||
227 | |||
228 | # | ||
229 | # IEEE 1394 (FireWire) support | ||
230 | # | ||
231 | |||
232 | # | ||
233 | # I2O device support | ||
234 | # | ||
235 | |||
236 | # | ||
237 | # Networking support | ||
238 | # | ||
239 | CONFIG_NET=y | ||
240 | |||
241 | # | ||
242 | # Networking options | ||
243 | # | ||
244 | CONFIG_PACKET=y | ||
245 | # CONFIG_PACKET_MMAP is not set | ||
246 | # CONFIG_NETLINK_DEV is not set | ||
247 | CONFIG_UNIX=y | ||
248 | # CONFIG_NET_KEY is not set | ||
249 | CONFIG_INET=y | ||
250 | # CONFIG_IP_MULTICAST is not set | ||
251 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
252 | CONFIG_IP_PNP=y | ||
253 | CONFIG_IP_PNP_DHCP=y | ||
254 | # CONFIG_IP_PNP_BOOTP is not set | ||
255 | # CONFIG_IP_PNP_RARP is not set | ||
256 | # CONFIG_NET_IPIP is not set | ||
257 | # CONFIG_NET_IPGRE is not set | ||
258 | # CONFIG_ARPD is not set | ||
259 | # CONFIG_SYN_COOKIES is not set | ||
260 | # CONFIG_INET_AH is not set | ||
261 | # CONFIG_INET_ESP is not set | ||
262 | # CONFIG_INET_IPCOMP is not set | ||
263 | # CONFIG_INET_TUNNEL is not set | ||
264 | CONFIG_IP_TCPDIAG=y | ||
265 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
266 | # CONFIG_IPV6 is not set | ||
267 | # CONFIG_NETFILTER is not set | ||
268 | |||
269 | # | ||
270 | # SCTP Configuration (EXPERIMENTAL) | ||
271 | # | ||
272 | # CONFIG_IP_SCTP is not set | ||
273 | # CONFIG_ATM is not set | ||
274 | # CONFIG_BRIDGE is not set | ||
275 | # CONFIG_VLAN_8021Q is not set | ||
276 | # CONFIG_DECNET is not set | ||
277 | # CONFIG_LLC2 is not set | ||
278 | # CONFIG_IPX is not set | ||
279 | # CONFIG_ATALK is not set | ||
280 | # CONFIG_X25 is not set | ||
281 | # CONFIG_LAPB is not set | ||
282 | # CONFIG_NET_DIVERT is not set | ||
283 | # CONFIG_ECONET is not set | ||
284 | # CONFIG_WAN_ROUTER is not set | ||
285 | |||
286 | # | ||
287 | # QoS and/or fair queueing | ||
288 | # | ||
289 | # CONFIG_NET_SCHED is not set | ||
290 | # CONFIG_NET_CLS_ROUTE is not set | ||
291 | |||
292 | # | ||
293 | # Network testing | ||
294 | # | ||
295 | # CONFIG_NET_PKTGEN is not set | ||
296 | # CONFIG_NETPOLL is not set | ||
297 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
298 | # CONFIG_HAMRADIO is not set | ||
299 | # CONFIG_IRDA is not set | ||
300 | # CONFIG_BT is not set | ||
301 | CONFIG_NETDEVICES=y | ||
302 | # CONFIG_DUMMY is not set | ||
303 | # CONFIG_BONDING is not set | ||
304 | # CONFIG_EQUALIZER is not set | ||
305 | # CONFIG_TUN is not set | ||
306 | |||
307 | # | ||
308 | # Ethernet (10 or 100Mbit) | ||
309 | # | ||
310 | CONFIG_NET_ETHERNET=y | ||
311 | CONFIG_MII=y | ||
312 | CONFIG_SMC91X=y | ||
313 | # CONFIG_NE2000 is not set | ||
314 | |||
315 | # | ||
316 | # Ethernet (1000 Mbit) | ||
317 | # | ||
318 | |||
319 | # | ||
320 | # Ethernet (10000 Mbit) | ||
321 | # | ||
322 | |||
323 | # | ||
324 | # Token Ring devices | ||
325 | # | ||
326 | |||
327 | # | ||
328 | # Wireless LAN (non-hamradio) | ||
329 | # | ||
330 | # CONFIG_NET_RADIO is not set | ||
331 | |||
332 | # | ||
333 | # PCMCIA network device support | ||
334 | # | ||
335 | # CONFIG_NET_PCMCIA is not set | ||
336 | |||
337 | # | ||
338 | # Wan interfaces | ||
339 | # | ||
340 | # CONFIG_WAN is not set | ||
341 | # CONFIG_PPP is not set | ||
342 | # CONFIG_SLIP is not set | ||
343 | # CONFIG_SHAPER is not set | ||
344 | # CONFIG_NETCONSOLE is not set | ||
345 | |||
346 | # | ||
347 | # ISDN subsystem | ||
348 | # | ||
349 | # CONFIG_ISDN is not set | ||
350 | |||
351 | # | ||
352 | # Telephony Support | ||
353 | # | ||
354 | # CONFIG_PHONE is not set | ||
355 | |||
356 | # | ||
357 | # Input device support | ||
358 | # | ||
359 | CONFIG_INPUT=y | ||
360 | |||
361 | # | ||
362 | # Userland interfaces | ||
363 | # | ||
364 | # CONFIG_INPUT_MOUSEDEV is not set | ||
365 | # CONFIG_INPUT_JOYDEV is not set | ||
366 | # CONFIG_INPUT_TSDEV is not set | ||
367 | # CONFIG_INPUT_EVDEV is not set | ||
368 | # CONFIG_INPUT_EVBUG is not set | ||
369 | |||
370 | # | ||
371 | # Input I/O drivers | ||
372 | # | ||
373 | # CONFIG_GAMEPORT is not set | ||
374 | CONFIG_SOUND_GAMEPORT=y | ||
375 | CONFIG_SERIO=y | ||
376 | # CONFIG_SERIO_I8042 is not set | ||
377 | CONFIG_SERIO_SERPORT=y | ||
378 | # CONFIG_SERIO_CT82C710 is not set | ||
379 | # CONFIG_SERIO_LIBPS2 is not set | ||
380 | # CONFIG_SERIO_RAW is not set | ||
381 | |||
382 | # | ||
383 | # Input Device Drivers | ||
384 | # | ||
385 | # CONFIG_INPUT_KEYBOARD is not set | ||
386 | # CONFIG_INPUT_MOUSE is not set | ||
387 | # CONFIG_INPUT_JOYSTICK is not set | ||
388 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
389 | # CONFIG_INPUT_MISC is not set | ||
390 | |||
391 | # | ||
392 | # Character devices | ||
393 | # | ||
394 | # CONFIG_VT is not set | ||
395 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
396 | |||
397 | # | ||
398 | # Serial drivers | ||
399 | # | ||
400 | # CONFIG_SERIAL_8250 is not set | ||
401 | |||
402 | # | ||
403 | # Non-8250 serial port support | ||
404 | # | ||
405 | CONFIG_SERIAL_CORE=y | ||
406 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
407 | CONFIG_SERIAL_M32R_SIO=y | ||
408 | CONFIG_SERIAL_M32R_SIO_CONSOLE=y | ||
409 | CONFIG_SERIAL_M32R_PLDSIO=y | ||
410 | CONFIG_UNIX98_PTYS=y | ||
411 | CONFIG_LEGACY_PTYS=y | ||
412 | CONFIG_LEGACY_PTY_COUNT=256 | ||
413 | |||
414 | # | ||
415 | # IPMI | ||
416 | # | ||
417 | # CONFIG_IPMI_HANDLER is not set | ||
418 | |||
419 | # | ||
420 | # Watchdog Cards | ||
421 | # | ||
422 | # CONFIG_WATCHDOG is not set | ||
423 | # CONFIG_RTC is not set | ||
424 | # CONFIG_GEN_RTC is not set | ||
425 | CONFIG_DS1302=y | ||
426 | # CONFIG_DTLK is not set | ||
427 | # CONFIG_R3964 is not set | ||
428 | |||
429 | # | ||
430 | # Ftape, the floppy tape device driver | ||
431 | # | ||
432 | # CONFIG_DRM is not set | ||
433 | |||
434 | # | ||
435 | # PCMCIA character devices | ||
436 | # | ||
437 | # CONFIG_SYNCLINK_CS is not set | ||
438 | # CONFIG_RAW_DRIVER is not set | ||
439 | |||
440 | # | ||
441 | # I2C support | ||
442 | # | ||
443 | # CONFIG_I2C is not set | ||
444 | |||
445 | # | ||
446 | # Dallas's 1-wire bus | ||
447 | # | ||
448 | # CONFIG_W1 is not set | ||
449 | |||
450 | # | ||
451 | # Misc devices | ||
452 | # | ||
453 | |||
454 | # | ||
455 | # Multimedia devices | ||
456 | # | ||
457 | # CONFIG_VIDEO_DEV is not set | ||
458 | |||
459 | # | ||
460 | # Digital Video Broadcasting Devices | ||
461 | # | ||
462 | # CONFIG_DVB is not set | ||
463 | |||
464 | # | ||
465 | # Graphics support | ||
466 | # | ||
467 | # CONFIG_FB is not set | ||
468 | |||
469 | # | ||
470 | # Sound | ||
471 | # | ||
472 | # CONFIG_SOUND is not set | ||
473 | |||
474 | # | ||
475 | # USB support | ||
476 | # | ||
477 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
478 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
479 | |||
480 | # | ||
481 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
482 | # | ||
483 | |||
484 | # | ||
485 | # USB Gadget Support | ||
486 | # | ||
487 | # CONFIG_USB_GADGET is not set | ||
488 | |||
489 | # | ||
490 | # MMC/SD Card support | ||
491 | # | ||
492 | # CONFIG_MMC is not set | ||
493 | |||
494 | # | ||
495 | # InfiniBand support | ||
496 | # | ||
497 | # CONFIG_INFINIBAND is not set | ||
498 | |||
499 | # | ||
500 | # File systems | ||
501 | # | ||
502 | CONFIG_EXT2_FS=y | ||
503 | # CONFIG_EXT2_FS_XATTR is not set | ||
504 | CONFIG_EXT3_FS=m | ||
505 | CONFIG_EXT3_FS_XATTR=y | ||
506 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
507 | # CONFIG_EXT3_FS_SECURITY is not set | ||
508 | CONFIG_JBD=m | ||
509 | CONFIG_JBD_DEBUG=y | ||
510 | CONFIG_FS_MBCACHE=y | ||
511 | CONFIG_REISERFS_FS=m | ||
512 | # CONFIG_REISERFS_CHECK is not set | ||
513 | # CONFIG_REISERFS_PROC_INFO is not set | ||
514 | # CONFIG_REISERFS_FS_XATTR is not set | ||
515 | # CONFIG_JFS_FS is not set | ||
516 | |||
517 | # | ||
518 | # XFS support | ||
519 | # | ||
520 | # CONFIG_XFS_FS is not set | ||
521 | # CONFIG_MINIX_FS is not set | ||
522 | # CONFIG_ROMFS_FS is not set | ||
523 | # CONFIG_QUOTA is not set | ||
524 | CONFIG_DNOTIFY=y | ||
525 | # CONFIG_AUTOFS_FS is not set | ||
526 | # CONFIG_AUTOFS4_FS is not set | ||
527 | |||
528 | # | ||
529 | # CD-ROM/DVD Filesystems | ||
530 | # | ||
531 | CONFIG_ISO9660_FS=m | ||
532 | CONFIG_JOLIET=y | ||
533 | # CONFIG_ZISOFS is not set | ||
534 | CONFIG_UDF_FS=m | ||
535 | CONFIG_UDF_NLS=y | ||
536 | |||
537 | # | ||
538 | # DOS/FAT/NT Filesystems | ||
539 | # | ||
540 | CONFIG_FAT_FS=m | ||
541 | CONFIG_MSDOS_FS=m | ||
542 | CONFIG_VFAT_FS=m | ||
543 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
544 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
545 | # CONFIG_NTFS_FS is not set | ||
546 | |||
547 | # | ||
548 | # Pseudo filesystems | ||
549 | # | ||
550 | CONFIG_PROC_FS=y | ||
551 | CONFIG_PROC_KCORE=y | ||
552 | CONFIG_SYSFS=y | ||
553 | CONFIG_DEVFS_FS=y | ||
554 | CONFIG_DEVFS_MOUNT=y | ||
555 | # CONFIG_DEVFS_DEBUG is not set | ||
556 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
557 | CONFIG_TMPFS=y | ||
558 | # CONFIG_TMPFS_XATTR is not set | ||
559 | # CONFIG_HUGETLB_PAGE is not set | ||
560 | CONFIG_RAMFS=y | ||
561 | |||
562 | # | ||
563 | # Miscellaneous filesystems | ||
564 | # | ||
565 | # CONFIG_ADFS_FS is not set | ||
566 | # CONFIG_AFFS_FS is not set | ||
567 | # CONFIG_HFS_FS is not set | ||
568 | # CONFIG_HFSPLUS_FS is not set | ||
569 | # CONFIG_BEFS_FS is not set | ||
570 | # CONFIG_BFS_FS is not set | ||
571 | # CONFIG_EFS_FS is not set | ||
572 | # CONFIG_CRAMFS is not set | ||
573 | # CONFIG_VXFS_FS is not set | ||
574 | # CONFIG_HPFS_FS is not set | ||
575 | # CONFIG_QNX4FS_FS is not set | ||
576 | # CONFIG_SYSV_FS is not set | ||
577 | # CONFIG_UFS_FS is not set | ||
578 | |||
579 | # | ||
580 | # Network File Systems | ||
581 | # | ||
582 | CONFIG_NFS_FS=y | ||
583 | CONFIG_NFS_V3=y | ||
584 | # CONFIG_NFS_V4 is not set | ||
585 | # CONFIG_NFS_DIRECTIO is not set | ||
586 | # CONFIG_NFSD is not set | ||
587 | CONFIG_ROOT_NFS=y | ||
588 | CONFIG_LOCKD=y | ||
589 | CONFIG_LOCKD_V4=y | ||
590 | CONFIG_SUNRPC=y | ||
591 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
592 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
593 | # CONFIG_SMB_FS is not set | ||
594 | # CONFIG_CIFS is not set | ||
595 | # CONFIG_NCP_FS is not set | ||
596 | # CONFIG_CODA_FS is not set | ||
597 | # CONFIG_AFS_FS is not set | ||
598 | |||
599 | # | ||
600 | # Partition Types | ||
601 | # | ||
602 | # CONFIG_PARTITION_ADVANCED is not set | ||
603 | CONFIG_MSDOS_PARTITION=y | ||
604 | |||
605 | # | ||
606 | # Native Language Support | ||
607 | # | ||
608 | CONFIG_NLS=y | ||
609 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
610 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
611 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
612 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
613 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
614 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
615 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
616 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
617 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
618 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
619 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
620 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
621 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
622 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
623 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
624 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
625 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
626 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
627 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
628 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
629 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
630 | # CONFIG_NLS_ISO8859_8 is not set | ||
631 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
632 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
633 | # CONFIG_NLS_ASCII is not set | ||
634 | # CONFIG_NLS_ISO8859_1 is not set | ||
635 | # CONFIG_NLS_ISO8859_2 is not set | ||
636 | # CONFIG_NLS_ISO8859_3 is not set | ||
637 | # CONFIG_NLS_ISO8859_4 is not set | ||
638 | # CONFIG_NLS_ISO8859_5 is not set | ||
639 | # CONFIG_NLS_ISO8859_6 is not set | ||
640 | # CONFIG_NLS_ISO8859_7 is not set | ||
641 | # CONFIG_NLS_ISO8859_9 is not set | ||
642 | # CONFIG_NLS_ISO8859_13 is not set | ||
643 | # CONFIG_NLS_ISO8859_14 is not set | ||
644 | # CONFIG_NLS_ISO8859_15 is not set | ||
645 | # CONFIG_NLS_KOI8_R is not set | ||
646 | # CONFIG_NLS_KOI8_U is not set | ||
647 | # CONFIG_NLS_UTF8 is not set | ||
648 | |||
649 | # | ||
650 | # Profiling support | ||
651 | # | ||
652 | # CONFIG_PROFILING is not set | ||
653 | |||
654 | # | ||
655 | # Kernel hacking | ||
656 | # | ||
657 | CONFIG_DEBUG_KERNEL=y | ||
658 | # CONFIG_MAGIC_SYSRQ is not set | ||
659 | # CONFIG_SCHEDSTATS is not set | ||
660 | # CONFIG_DEBUG_SLAB is not set | ||
661 | # CONFIG_DEBUG_SPINLOCK is not set | ||
662 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
663 | # CONFIG_DEBUG_KOBJECT is not set | ||
664 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
665 | CONFIG_DEBUG_INFO=y | ||
666 | # CONFIG_DEBUG_FS is not set | ||
667 | # CONFIG_FRAME_POINTER is not set | ||
668 | # CONFIG_DEBUG_STACKOVERFLOW is not set | ||
669 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
670 | # CONFIG_DEBUG_PAGEALLOC is not set | ||
671 | |||
672 | # | ||
673 | # Security options | ||
674 | # | ||
675 | # CONFIG_KEYS is not set | ||
676 | # CONFIG_SECURITY is not set | ||
677 | |||
678 | # | ||
679 | # Cryptographic options | ||
680 | # | ||
681 | # CONFIG_CRYPTO is not set | ||
682 | |||
683 | # | ||
684 | # Hardware crypto devices | ||
685 | # | ||
686 | |||
687 | # | ||
688 | # Library routines | ||
689 | # | ||
690 | # CONFIG_CRC_CCITT is not set | ||
691 | CONFIG_CRC32=y | ||
692 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/m32r/opsput/dot.gdbinit b/arch/m32r/opsput/dot.gdbinit new file mode 100644 index 000000000000..b7e6c6640857 --- /dev/null +++ b/arch/m32r/opsput/dot.gdbinit | |||
@@ -0,0 +1,218 @@ | |||
1 | # .gdbinit file | ||
2 | # $Id: dot.gdbinit,v 1.1 2004/07/27 06:54:20 sakugawa Exp $ | ||
3 | |||
4 | # setting | ||
5 | set width 0d70 | ||
6 | set radix 0d16 | ||
7 | set height 0 | ||
8 | debug_chaos | ||
9 | |||
10 | # clk xin:cpu:bus=1:8:1 | ||
11 | define clock_init_on_181 | ||
12 | set *(unsigned long *)0x00ef400c = 0x2 | ||
13 | set *(unsigned long *)0x00ef4004 = 0x1 | ||
14 | shell sleep 0.1 | ||
15 | set *(unsigned long *)0x00ef4000 = 0x101 | ||
16 | end | ||
17 | # clk xin:cpu:bus=1:8:2 | ||
18 | define clock_init_on_182 | ||
19 | set *(unsigned long *)0x00ef400c = 0x1 | ||
20 | set *(unsigned long *)0x00ef4004 = 0x1 | ||
21 | shell sleep 0.1 | ||
22 | set *(unsigned long *)0x00ef4000 = 0x101 | ||
23 | end | ||
24 | |||
25 | # clk xin:cpu:bus=1:8:4 | ||
26 | define clock_init_on_184 | ||
27 | set *(unsigned long *)0x00ef400c = 0x0 | ||
28 | set *(unsigned long *)0x00ef4004 = 0x1 | ||
29 | shell sleep 0.1 | ||
30 | set *(unsigned long *)0x00ef4000 = 0x101 | ||
31 | end | ||
32 | |||
33 | # clk xin:cpu:bus=1:1:1 | ||
34 | define clock_init_off | ||
35 | shell sleep 0.1 | ||
36 | set *(unsigned long *)0x00ef4000 = 0x0 | ||
37 | shell sleep 0.1 | ||
38 | set *(unsigned long *)0x00ef4004 = 0x0 | ||
39 | shell sleep 0.1 | ||
40 | set *(unsigned long *)0x00ef400c = 0x0 | ||
41 | end | ||
42 | |||
43 | define tlb_init | ||
44 | set $tlbbase = 0xfe000000 | ||
45 | set *(unsigned long *)($tlbbase + 0x04) = 0x0 | ||
46 | set *(unsigned long *)($tlbbase + 0x0c) = 0x0 | ||
47 | set *(unsigned long *)($tlbbase + 0x14) = 0x0 | ||
48 | set *(unsigned long *)($tlbbase + 0x1c) = 0x0 | ||
49 | set *(unsigned long *)($tlbbase + 0x24) = 0x0 | ||
50 | set *(unsigned long *)($tlbbase + 0x2c) = 0x0 | ||
51 | set *(unsigned long *)($tlbbase + 0x34) = 0x0 | ||
52 | set *(unsigned long *)($tlbbase + 0x3c) = 0x0 | ||
53 | set *(unsigned long *)($tlbbase + 0x44) = 0x0 | ||
54 | set *(unsigned long *)($tlbbase + 0x4c) = 0x0 | ||
55 | set *(unsigned long *)($tlbbase + 0x54) = 0x0 | ||
56 | set *(unsigned long *)($tlbbase + 0x5c) = 0x0 | ||
57 | set *(unsigned long *)($tlbbase + 0x64) = 0x0 | ||
58 | set *(unsigned long *)($tlbbase + 0x6c) = 0x0 | ||
59 | set *(unsigned long *)($tlbbase + 0x74) = 0x0 | ||
60 | set *(unsigned long *)($tlbbase + 0x7c) = 0x0 | ||
61 | set *(unsigned long *)($tlbbase + 0x84) = 0x0 | ||
62 | set *(unsigned long *)($tlbbase + 0x8c) = 0x0 | ||
63 | set *(unsigned long *)($tlbbase + 0x94) = 0x0 | ||
64 | set *(unsigned long *)($tlbbase + 0x9c) = 0x0 | ||
65 | set *(unsigned long *)($tlbbase + 0xa4) = 0x0 | ||
66 | set *(unsigned long *)($tlbbase + 0xac) = 0x0 | ||
67 | set *(unsigned long *)($tlbbase + 0xb4) = 0x0 | ||
68 | set *(unsigned long *)($tlbbase + 0xbc) = 0x0 | ||
69 | set *(unsigned long *)($tlbbase + 0xc4) = 0x0 | ||
70 | set *(unsigned long *)($tlbbase + 0xcc) = 0x0 | ||
71 | set *(unsigned long *)($tlbbase + 0xd4) = 0x0 | ||
72 | set *(unsigned long *)($tlbbase + 0xdc) = 0x0 | ||
73 | set *(unsigned long *)($tlbbase + 0xe4) = 0x0 | ||
74 | set *(unsigned long *)($tlbbase + 0xec) = 0x0 | ||
75 | set *(unsigned long *)($tlbbase + 0xf4) = 0x0 | ||
76 | set *(unsigned long *)($tlbbase + 0xfc) = 0x0 | ||
77 | set $tlbbase = 0xfe000800 | ||
78 | set *(unsigned long *)($tlbbase + 0x04) = 0x0 | ||
79 | set *(unsigned long *)($tlbbase + 0x0c) = 0x0 | ||
80 | set *(unsigned long *)($tlbbase + 0x14) = 0x0 | ||
81 | set *(unsigned long *)($tlbbase + 0x1c) = 0x0 | ||
82 | set *(unsigned long *)($tlbbase + 0x24) = 0x0 | ||
83 | set *(unsigned long *)($tlbbase + 0x2c) = 0x0 | ||
84 | set *(unsigned long *)($tlbbase + 0x34) = 0x0 | ||
85 | set *(unsigned long *)($tlbbase + 0x3c) = 0x0 | ||
86 | set *(unsigned long *)($tlbbase + 0x44) = 0x0 | ||
87 | set *(unsigned long *)($tlbbase + 0x4c) = 0x0 | ||
88 | set *(unsigned long *)($tlbbase + 0x54) = 0x0 | ||
89 | set *(unsigned long *)($tlbbase + 0x5c) = 0x0 | ||
90 | set *(unsigned long *)($tlbbase + 0x64) = 0x0 | ||
91 | set *(unsigned long *)($tlbbase + 0x6c) = 0x0 | ||
92 | set *(unsigned long *)($tlbbase + 0x74) = 0x0 | ||
93 | set *(unsigned long *)($tlbbase + 0x7c) = 0x0 | ||
94 | set *(unsigned long *)($tlbbase + 0x84) = 0x0 | ||
95 | set *(unsigned long *)($tlbbase + 0x8c) = 0x0 | ||
96 | set *(unsigned long *)($tlbbase + 0x94) = 0x0 | ||
97 | set *(unsigned long *)($tlbbase + 0x9c) = 0x0 | ||
98 | set *(unsigned long *)($tlbbase + 0xa4) = 0x0 | ||
99 | set *(unsigned long *)($tlbbase + 0xac) = 0x0 | ||
100 | set *(unsigned long *)($tlbbase + 0xb4) = 0x0 | ||
101 | set *(unsigned long *)($tlbbase + 0xbc) = 0x0 | ||
102 | set *(unsigned long *)($tlbbase + 0xc4) = 0x0 | ||
103 | set *(unsigned long *)($tlbbase + 0xcc) = 0x0 | ||
104 | set *(unsigned long *)($tlbbase + 0xd4) = 0x0 | ||
105 | set *(unsigned long *)($tlbbase + 0xdc) = 0x0 | ||
106 | set *(unsigned long *)($tlbbase + 0xe4) = 0x0 | ||
107 | set *(unsigned long *)($tlbbase + 0xec) = 0x0 | ||
108 | set *(unsigned long *)($tlbbase + 0xf4) = 0x0 | ||
109 | set *(unsigned long *)($tlbbase + 0xfc) = 0x0 | ||
110 | end | ||
111 | |||
112 | define load_modules | ||
113 | use_debug_dma | ||
114 | load | ||
115 | end | ||
116 | |||
117 | # Set kernel parameters | ||
118 | define set_kernel_parameters | ||
119 | set $param = (void*)0x88001000 | ||
120 | # INITRD_START | ||
121 | # set *(unsigned long *)($param + 0x0010) = 0x08300000 | ||
122 | # INITRD_SIZE | ||
123 | # set *(unsigned long *)($param + 0x0014) = 0x00400000 | ||
124 | # M32R_CPUCLK | ||
125 | set *(unsigned long *)($param + 0x0018) = 0d200000000 | ||
126 | # M32R_BUSCLK | ||
127 | set *(unsigned long *)($param + 0x001c) = 0d50000000 | ||
128 | # set *(unsigned long *)($param + 0x001c) = 0d25000000 | ||
129 | |||
130 | # M32R_TIMER_DIVIDE | ||
131 | set *(unsigned long *)($param + 0x0020) = 0d128 | ||
132 | |||
133 | set {char[0x200]}($param + 0x100) = "console=ttyS0,115200n8x console=tty1 \ | ||
134 | root=/dev/nfsroot \ | ||
135 | nfsroot=192.168.0.1:/project/m32r-linux/export/root.2.6 \ | ||
136 | nfsaddrs=192.168.0.101:192.168.0.1:192.168.0.1:255.255.255.0:mappi001 \ | ||
137 | mem=16m \0" | ||
138 | end | ||
139 | |||
140 | define boot | ||
141 | set_kernel_parameters | ||
142 | set $pc=0x88002000 | ||
143 | set $fp=0 | ||
144 | set $evb=0x88000000 | ||
145 | si | ||
146 | c | ||
147 | end | ||
148 | |||
149 | # Show TLB entries | ||
150 | define show_tlb_entries | ||
151 | set $i = 0 | ||
152 | set $addr = $arg0 | ||
153 | use_mon_code | ||
154 | while ($i < 0d32 ) | ||
155 | set $tlb_tag = *(unsigned long*)$addr | ||
156 | set $tlb_data = *(unsigned long*)($addr + 4) | ||
157 | printf " [%2d] 0x%08lx : 0x%08lx - 0x%08lx\n", $i, $addr, $tlb_tag, $tlb_data | ||
158 | set $i = $i + 1 | ||
159 | set $addr = $addr + 8 | ||
160 | end | ||
161 | # use_debug_dma | ||
162 | end | ||
163 | define itlb | ||
164 | set $itlb=0xfe000000 | ||
165 | show_tlb_entries $itlb | ||
166 | end | ||
167 | define dtlb | ||
168 | set $dtlb=0xfe000800 | ||
169 | show_tlb_entries $dtlb | ||
170 | end | ||
171 | |||
172 | define show_regs | ||
173 | printf " R0[%08lx] R1[%08lx] R2[%08lx] R3[%08lx]\n",$r0,$r1,$r2,$r3 | ||
174 | printf " R4[%08lx] R5[%08lx] R6[%08lx] R7[%08lx]\n",$r4,$r5,$r6,$r7 | ||
175 | printf " R8[%08lx] R9[%08lx] R10[%08lx] R11[%08lx]\n",$r8,$r9,$r10,$r11 | ||
176 | printf "R12[%08lx] FP[%08lx] LR[%08lx] SP[%08lx]\n",$r12,$fp,$lr,$sp | ||
177 | printf "PSW[%08lx] CBR[%08lx] SPI[%08lx] SPU[%08lx]\n",$psw,$cbr,$spi,$spu | ||
178 | printf "BPC[%08lx] PC[%08lx] ACCL[%08lx] ACCH[%08lx]\n",$bpc,$pc,$accl,$acch | ||
179 | printf "EVB[%08lx]\n",$evb | ||
180 | end | ||
181 | |||
182 | define restart | ||
183 | sdireset | ||
184 | sdireset | ||
185 | en 1 | ||
186 | set $pc=0x0 | ||
187 | c | ||
188 | tlb_init | ||
189 | setup | ||
190 | load_modules | ||
191 | boot | ||
192 | end | ||
193 | |||
194 | define setup | ||
195 | debug_chaos | ||
196 | # Clock | ||
197 | # shell sleep 0.1 | ||
198 | # clock_init_off | ||
199 | # shell sleep 1 | ||
200 | # clock_init_on_182 | ||
201 | # shell sleep 0.1 | ||
202 | # SDRAM | ||
203 | set *(unsigned long *)0xa0ef6004 = 0x0001053f | ||
204 | set *(unsigned long *)0xa0ef6028 = 0x00031102 | ||
205 | end | ||
206 | |||
207 | sdireset | ||
208 | sdireset | ||
209 | file vmlinux | ||
210 | target m32rsdi | ||
211 | set $pc=0x0 | ||
212 | b *0x30000 | ||
213 | c | ||
214 | dis 1 | ||
215 | setup | ||
216 | tlb_init | ||
217 | load_modules | ||
218 | boot | ||