diff options
Diffstat (limited to 'arch/sh')
30 files changed, 244 insertions, 80 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index b940424f8ccc..88cdeb9f72d9 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -37,7 +37,6 @@ config SUPERH32 | |||
37 | select HAVE_FTRACE_MCOUNT_RECORD | 37 | select HAVE_FTRACE_MCOUNT_RECORD |
38 | select HAVE_DYNAMIC_FTRACE | 38 | select HAVE_DYNAMIC_FTRACE |
39 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST | 39 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST |
40 | select HAVE_FTRACE_SYSCALLS | ||
41 | select HAVE_FUNCTION_GRAPH_TRACER | 40 | select HAVE_FUNCTION_GRAPH_TRACER |
42 | select HAVE_ARCH_KGDB | 41 | select HAVE_ARCH_KGDB |
43 | select ARCH_HIBERNATION_POSSIBLE if MMU | 42 | select ARCH_HIBERNATION_POSSIBLE if MMU |
@@ -122,6 +121,9 @@ config SYS_SUPPORTS_APM_EMULATION | |||
122 | bool | 121 | bool |
123 | select ARCH_SUSPEND_POSSIBLE | 122 | select ARCH_SUSPEND_POSSIBLE |
124 | 123 | ||
124 | config SYS_SUPPORTS_HUGETLBFS | ||
125 | bool | ||
126 | |||
125 | config SYS_SUPPORTS_SMP | 127 | config SYS_SUPPORTS_SMP |
126 | bool | 128 | bool |
127 | 129 | ||
@@ -196,6 +198,7 @@ config CPU_SH4 | |||
196 | select CPU_HAS_SR_RB | 198 | select CPU_HAS_SR_RB |
197 | select CPU_HAS_FPU if !CPU_SH4AL_DSP | 199 | select CPU_HAS_FPU if !CPU_SH4AL_DSP |
198 | select SYS_SUPPORTS_TMU | 200 | select SYS_SUPPORTS_TMU |
201 | select SYS_SUPPORTS_HUGETLBFS if MMU | ||
199 | 202 | ||
200 | config CPU_SH4A | 203 | config CPU_SH4A |
201 | bool | 204 | bool |
@@ -210,6 +213,7 @@ config CPU_SH5 | |||
210 | bool | 213 | bool |
211 | select CPU_HAS_FPU | 214 | select CPU_HAS_FPU |
212 | select SYS_SUPPORTS_TMU | 215 | select SYS_SUPPORTS_TMU |
216 | select SYS_SUPPORTS_HUGETLBFS if MMU | ||
213 | 217 | ||
214 | config CPU_SHX2 | 218 | config CPU_SHX2 |
215 | bool | 219 | bool |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index fc51a918b31a..66e40aabc600 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -199,7 +199,7 @@ endif | |||
199 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) | 199 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) |
200 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) | 200 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) |
201 | 201 | ||
202 | BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.srec \ | 202 | BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.srec uImage.bin \ |
203 | zImage vmlinux.srec romImage | 203 | zImage vmlinux.srec romImage |
204 | PHONY += maketools $(BOOT_TARGETS) FORCE | 204 | PHONY += maketools $(BOOT_TARGETS) FORCE |
205 | 205 | ||
@@ -225,6 +225,7 @@ define archhelp | |||
225 | @echo ' vmlinux.srec - Create an ELF S-record' | 225 | @echo ' vmlinux.srec - Create an ELF S-record' |
226 | @echo '* uImage - Alias to bootable U-Boot image' | 226 | @echo '* uImage - Alias to bootable U-Boot image' |
227 | @echo ' uImage.srec - Create an S-record for U-Boot' | 227 | @echo ' uImage.srec - Create an S-record for U-Boot' |
228 | @echo ' uImage.bin - Kernel-only image for U-Boot (bin)' | ||
228 | @echo '* uImage.gz - Kernel-only image for U-Boot (gzip)' | 229 | @echo '* uImage.gz - Kernel-only image for U-Boot (gzip)' |
229 | @echo ' uImage.bz2 - Kernel-only image for U-Boot (bzip2)' | 230 | @echo ' uImage.bz2 - Kernel-only image for U-Boot (bzip2)' |
230 | @echo ' uImage.lzma - Kernel-only image for U-Boot (lzma)' | 231 | @echo ' uImage.lzma - Kernel-only image for U-Boot (lzma)' |
diff --git a/arch/sh/boards/board-magicpanelr2.c b/arch/sh/boards/board-magicpanelr2.c index 0a37c8bfc959..99ffc5f1c0dd 100644 --- a/arch/sh/boards/board-magicpanelr2.c +++ b/arch/sh/boards/board-magicpanelr2.c | |||
@@ -205,8 +205,6 @@ static void __init setup_port_multiplexing(void) | |||
205 | 205 | ||
206 | static void __init mpr2_setup(char **cmdline_p) | 206 | static void __init mpr2_setup(char **cmdline_p) |
207 | { | 207 | { |
208 | __set_io_port_base(0xa0000000); | ||
209 | |||
210 | /* set Pin Select Register A: | 208 | /* set Pin Select Register A: |
211 | * /PCC_CD1, /PCC_CD2, PCC_BVD1, PCC_BVD2, | 209 | * /PCC_CD1, /PCC_CD2, PCC_BVD1, PCC_BVD2, |
212 | * /IOIS16, IRQ4, IRQ5, USB1d_SUSPEND | 210 | * /IOIS16, IRQ4, IRQ5, USB1d_SUSPEND |
diff --git a/arch/sh/boards/mach-dreamcast/setup.c b/arch/sh/boards/mach-dreamcast/setup.c index ebe99227d4e6..a4b7402d6176 100644 --- a/arch/sh/boards/mach-dreamcast/setup.c +++ b/arch/sh/boards/mach-dreamcast/setup.c | |||
@@ -42,8 +42,6 @@ static void __init dreamcast_setup(char **cmdline_p) | |||
42 | /* Acknowledge any previous events */ | 42 | /* Acknowledge any previous events */ |
43 | /* XXX */ | 43 | /* XXX */ |
44 | 44 | ||
45 | __set_io_port_base(0xa0000000); | ||
46 | |||
47 | /* Assign all virtual IRQs to the System ASIC int. handler */ | 45 | /* Assign all virtual IRQs to the System ASIC int. handler */ |
48 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) | 46 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) |
49 | set_irq_chip_and_handler(i, &systemasic_int, | 47 | set_irq_chip_and_handler(i, &systemasic_int, |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 5f9881e16e2f..3b1ceb46fa54 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | #include <linux/usb/r8a66597.h> | 19 | #include <linux/usb/r8a66597.h> |
20 | #include <linux/i2c.h> | 20 | #include <linux/i2c.h> |
21 | #include <linux/i2c/tsc2007.h> | ||
21 | #include <linux/input.h> | 22 | #include <linux/input.h> |
22 | #include <video/sh_mobile_lcdc.h> | 23 | #include <video/sh_mobile_lcdc.h> |
23 | #include <media/sh_mobile_ceu.h> | 24 | #include <media/sh_mobile_ceu.h> |
@@ -38,6 +39,20 @@ | |||
38 | * 0x1800_0000 MFI 16bit | 39 | * 0x1800_0000 MFI 16bit |
39 | */ | 40 | */ |
40 | 41 | ||
42 | /* SWITCH | ||
43 | *------------------------------ | ||
44 | * DS2[1] = FlashROM write protect ON : write protect | ||
45 | * OFF : No write protect | ||
46 | * DS2[2] = RMII / TS, SCIF ON : RMII | ||
47 | * OFF : TS, SCIF3 | ||
48 | * DS2[3] = Camera / Video ON : Camera | ||
49 | * OFF : NTSC/PAL (IN) | ||
50 | * DS2[5] = NTSC_OUT Clock ON : On board OSC | ||
51 | * OFF : SH7724 DV_CLK | ||
52 | * DS2[6-7] = MMC / SD ON-OFF : SD | ||
53 | * OFF-ON : MMC | ||
54 | */ | ||
55 | |||
41 | /* Heartbeat */ | 56 | /* Heartbeat */ |
42 | static unsigned char led_pos[] = { 0, 1, 2, 3 }; | 57 | static unsigned char led_pos[] = { 0, 1, 2, 3 }; |
43 | static struct heartbeat_data heartbeat_data = { | 58 | static struct heartbeat_data heartbeat_data = { |
@@ -70,7 +85,7 @@ static struct mtd_partition nor_flash_partitions[] = { | |||
70 | .name = "boot loader", | 85 | .name = "boot loader", |
71 | .offset = 0, | 86 | .offset = 0, |
72 | .size = (5 * 1024 * 1024), | 87 | .size = (5 * 1024 * 1024), |
73 | .mask_flags = MTD_CAP_ROM, | 88 | .mask_flags = MTD_WRITEABLE, /* force read-only */ |
74 | }, { | 89 | }, { |
75 | .name = "free-area", | 90 | .name = "free-area", |
76 | .offset = MTDPART_OFS_APPEND, | 91 | .offset = MTDPART_OFS_APPEND, |
@@ -376,6 +391,43 @@ static struct platform_device keysc_device = { | |||
376 | }, | 391 | }, |
377 | }; | 392 | }; |
378 | 393 | ||
394 | /* TouchScreen */ | ||
395 | #define IRQ0 32 | ||
396 | static int ts_get_pendown_state(void) | ||
397 | { | ||
398 | int val = 0; | ||
399 | gpio_free(GPIO_FN_INTC_IRQ0); | ||
400 | gpio_request(GPIO_PTZ0, NULL); | ||
401 | gpio_direction_input(GPIO_PTZ0); | ||
402 | |||
403 | val = gpio_get_value(GPIO_PTZ0); | ||
404 | |||
405 | gpio_free(GPIO_PTZ0); | ||
406 | gpio_request(GPIO_FN_INTC_IRQ0, NULL); | ||
407 | |||
408 | return val ? 0 : 1; | ||
409 | } | ||
410 | |||
411 | static int ts_init(void) | ||
412 | { | ||
413 | gpio_request(GPIO_FN_INTC_IRQ0, NULL); | ||
414 | return 0; | ||
415 | } | ||
416 | |||
417 | struct tsc2007_platform_data tsc2007_info = { | ||
418 | .model = 2007, | ||
419 | .x_plate_ohms = 180, | ||
420 | .get_pendown_state = ts_get_pendown_state, | ||
421 | .init_platform_hw = ts_init, | ||
422 | }; | ||
423 | |||
424 | static struct i2c_board_info ts_i2c_clients = { | ||
425 | I2C_BOARD_INFO("tsc2007", 0x48), | ||
426 | .type = "tsc2007", | ||
427 | .platform_data = &tsc2007_info, | ||
428 | .irq = IRQ0, | ||
429 | }; | ||
430 | |||
379 | static struct platform_device *ecovec_devices[] __initdata = { | 431 | static struct platform_device *ecovec_devices[] __initdata = { |
380 | &heartbeat_device, | 432 | &heartbeat_device, |
381 | &nor_flash_device, | 433 | &nor_flash_device, |
@@ -460,6 +512,11 @@ static void __init sh_eth_init(void) | |||
460 | #define IODRIVEA 0xA405018A | 512 | #define IODRIVEA 0xA405018A |
461 | static int __init arch_setup(void) | 513 | static int __init arch_setup(void) |
462 | { | 514 | { |
515 | /* enable STATUS0, STATUS2 and PDSTATUS */ | ||
516 | gpio_request(GPIO_FN_STATUS0, NULL); | ||
517 | gpio_request(GPIO_FN_STATUS2, NULL); | ||
518 | gpio_request(GPIO_FN_PDSTATUS, NULL); | ||
519 | |||
463 | /* enable SCIFA0 */ | 520 | /* enable SCIFA0 */ |
464 | gpio_request(GPIO_FN_SCIF0_TXD, NULL); | 521 | gpio_request(GPIO_FN_SCIF0_TXD, NULL); |
465 | gpio_request(GPIO_FN_SCIF0_RXD, NULL); | 522 | gpio_request(GPIO_FN_SCIF0_RXD, NULL); |
@@ -590,6 +647,10 @@ static int __init arch_setup(void) | |||
590 | */ | 647 | */ |
591 | gpio_request(GPIO_PTF4, NULL); | 648 | gpio_request(GPIO_PTF4, NULL); |
592 | gpio_direction_output(GPIO_PTF4, 1); | 649 | gpio_direction_output(GPIO_PTF4, 1); |
650 | |||
651 | /* enable TouchScreen */ | ||
652 | i2c_register_board_info(0, &ts_i2c_clients, 1); | ||
653 | set_irq_type(IRQ0, IRQ_TYPE_LEVEL_LOW); | ||
593 | } | 654 | } |
594 | 655 | ||
595 | /* enable CEU0 */ | 656 | /* enable CEU0 */ |
diff --git a/arch/sh/boards/mach-landisk/gio.c b/arch/sh/boards/mach-landisk/gio.c index 25cdf7358000..528013188196 100644 --- a/arch/sh/boards/mach-landisk/gio.c +++ b/arch/sh/boards/mach-landisk/gio.c | |||
@@ -14,7 +14,6 @@ | |||
14 | */ | 14 | */ |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/smp_lock.h> | ||
18 | #include <linux/kdev_t.h> | 17 | #include <linux/kdev_t.h> |
19 | #include <linux/cdev.h> | 18 | #include <linux/cdev.h> |
20 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
@@ -35,7 +34,7 @@ static int gio_open(struct inode *inode, struct file *filp) | |||
35 | int minor; | 34 | int minor; |
36 | int ret = -ENOENT; | 35 | int ret = -ENOENT; |
37 | 36 | ||
38 | lock_kernel(); | 37 | preempt_disable(); |
39 | minor = MINOR(inode->i_rdev); | 38 | minor = MINOR(inode->i_rdev); |
40 | if (minor < DEVCOUNT) { | 39 | if (minor < DEVCOUNT) { |
41 | if (openCnt > 0) { | 40 | if (openCnt > 0) { |
@@ -45,7 +44,7 @@ static int gio_open(struct inode *inode, struct file *filp) | |||
45 | ret = 0; | 44 | ret = 0; |
46 | } | 45 | } |
47 | } | 46 | } |
48 | unlock_kernel(); | 47 | preempt_enable(); |
49 | return ret; | 48 | return ret; |
50 | } | 49 | } |
51 | 50 | ||
@@ -60,8 +59,7 @@ static int gio_close(struct inode *inode, struct file *filp) | |||
60 | return 0; | 59 | return 0; |
61 | } | 60 | } |
62 | 61 | ||
63 | static int gio_ioctl(struct inode *inode, struct file *filp, | 62 | static long gio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
64 | unsigned int cmd, unsigned long arg) | ||
65 | { | 63 | { |
66 | unsigned int data; | 64 | unsigned int data; |
67 | static unsigned int addr = 0; | 65 | static unsigned int addr = 0; |
@@ -129,7 +127,7 @@ static const struct file_operations gio_fops = { | |||
129 | .owner = THIS_MODULE, | 127 | .owner = THIS_MODULE, |
130 | .open = gio_open, /* open */ | 128 | .open = gio_open, /* open */ |
131 | .release = gio_close, /* release */ | 129 | .release = gio_close, /* release */ |
132 | .ioctl = gio_ioctl, /* ioctl */ | 130 | .unlocked_ioctl = gio_ioctl, |
133 | }; | 131 | }; |
134 | 132 | ||
135 | static int __init gio_init(void) | 133 | static int __init gio_init(void) |
diff --git a/arch/sh/boards/mach-rsk/devices-rsk7203.c b/arch/sh/boards/mach-rsk/devices-rsk7203.c index 4af3a771c058..c37617e63220 100644 --- a/arch/sh/boards/mach-rsk/devices-rsk7203.c +++ b/arch/sh/boards/mach-rsk/devices-rsk7203.c | |||
@@ -11,10 +11,6 @@ | |||
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
14 | #include <linux/mtd/mtd.h> | ||
15 | #include <linux/mtd/partitions.h> | ||
16 | #include <linux/mtd/physmap.h> | ||
17 | #include <linux/mtd/map.h> | ||
18 | #include <linux/smsc911x.h> | 14 | #include <linux/smsc911x.h> |
19 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
20 | #include <linux/leds.h> | 16 | #include <linux/leds.h> |
diff --git a/arch/sh/boards/mach-rsk/setup.c b/arch/sh/boards/mach-rsk/setup.c index af64d030a5c7..a5c0df785bfe 100644 --- a/arch/sh/boards/mach-rsk/setup.c +++ b/arch/sh/boards/mach-rsk/setup.c | |||
@@ -15,14 +15,12 @@ | |||
15 | #include <linux/mtd/mtd.h> | 15 | #include <linux/mtd/mtd.h> |
16 | #include <linux/mtd/partitions.h> | 16 | #include <linux/mtd/partitions.h> |
17 | #include <linux/mtd/physmap.h> | 17 | #include <linux/mtd/physmap.h> |
18 | #ifdef CONFIG_MTD | ||
18 | #include <linux/mtd/map.h> | 19 | #include <linux/mtd/map.h> |
20 | #endif | ||
19 | #include <asm/machvec.h> | 21 | #include <asm/machvec.h> |
20 | #include <asm/io.h> | 22 | #include <asm/io.h> |
21 | 23 | ||
22 | static const char *probes[] = { "cmdlinepart", NULL }; | ||
23 | |||
24 | static struct mtd_partition *parsed_partitions; | ||
25 | |||
26 | static struct mtd_partition rsk_partitions[] = { | 24 | static struct mtd_partition rsk_partitions[] = { |
27 | { | 25 | { |
28 | .name = "Bootloader", | 26 | .name = "Bootloader", |
@@ -41,6 +39,8 @@ static struct mtd_partition rsk_partitions[] = { | |||
41 | }; | 39 | }; |
42 | 40 | ||
43 | static struct physmap_flash_data flash_data = { | 41 | static struct physmap_flash_data flash_data = { |
42 | .parts = rsk_partitions, | ||
43 | .nr_parts = ARRAY_SIZE(rsk_partitions), | ||
44 | .width = 2, | 44 | .width = 2, |
45 | }; | 45 | }; |
46 | 46 | ||
@@ -60,7 +60,8 @@ static struct platform_device flash_device = { | |||
60 | }, | 60 | }, |
61 | }; | 61 | }; |
62 | 62 | ||
63 | static struct mtd_info *flash_mtd; | 63 | #ifdef CONFIG_MTD |
64 | static const char *probes[] = { "cmdlinepart", NULL }; | ||
64 | 65 | ||
65 | static struct map_info rsk_flash_map = { | 66 | static struct map_info rsk_flash_map = { |
66 | .name = "RSK+ Flash", | 67 | .name = "RSK+ Flash", |
@@ -68,6 +69,10 @@ static struct map_info rsk_flash_map = { | |||
68 | .bankwidth = 2, | 69 | .bankwidth = 2, |
69 | }; | 70 | }; |
70 | 71 | ||
72 | static struct mtd_info *flash_mtd; | ||
73 | |||
74 | static struct mtd_partition *parsed_partitions; | ||
75 | |||
71 | static void __init set_mtd_partitions(void) | 76 | static void __init set_mtd_partitions(void) |
72 | { | 77 | { |
73 | int nr_parts = 0; | 78 | int nr_parts = 0; |
@@ -77,14 +82,14 @@ static void __init set_mtd_partitions(void) | |||
77 | nr_parts = parse_mtd_partitions(flash_mtd, probes, | 82 | nr_parts = parse_mtd_partitions(flash_mtd, probes, |
78 | &parsed_partitions, 0); | 83 | &parsed_partitions, 0); |
79 | /* If there is no partition table, used the hard coded table */ | 84 | /* If there is no partition table, used the hard coded table */ |
80 | if (nr_parts <= 0) { | 85 | if (nr_parts > 0) { |
81 | flash_data.parts = rsk_partitions; | ||
82 | flash_data.nr_parts = ARRAY_SIZE(rsk_partitions); | ||
83 | } else { | ||
84 | flash_data.nr_parts = nr_parts; | 86 | flash_data.nr_parts = nr_parts; |
85 | flash_data.parts = parsed_partitions; | 87 | flash_data.parts = parsed_partitions; |
86 | } | 88 | } |
87 | } | 89 | } |
90 | #else | ||
91 | static inline void set_mtd_partitions(void) {} | ||
92 | #endif | ||
88 | 93 | ||
89 | static struct platform_device *rsk_devices[] __initdata = { | 94 | static struct platform_device *rsk_devices[] __initdata = { |
90 | &flash_device, | 95 | &flash_device, |
diff --git a/arch/sh/boot/Makefile b/arch/sh/boot/Makefile index a1316872be6f..cb8cf5572e79 100644 --- a/arch/sh/boot/Makefile +++ b/arch/sh/boot/Makefile | |||
@@ -20,11 +20,12 @@ CONFIG_BOOT_LINK_OFFSET ?= 0x00800000 | |||
20 | CONFIG_ZERO_PAGE_OFFSET ?= 0x00001000 | 20 | CONFIG_ZERO_PAGE_OFFSET ?= 0x00001000 |
21 | CONFIG_ENTRY_OFFSET ?= 0x00001000 | 21 | CONFIG_ENTRY_OFFSET ?= 0x00001000 |
22 | 22 | ||
23 | suffix-y := bin | ||
23 | suffix-$(CONFIG_KERNEL_GZIP) := gz | 24 | suffix-$(CONFIG_KERNEL_GZIP) := gz |
24 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 | 25 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 |
25 | suffix-$(CONFIG_KERNEL_LZMA) := lzma | 26 | suffix-$(CONFIG_KERNEL_LZMA) := lzma |
26 | 27 | ||
27 | targets := zImage vmlinux.srec romImage uImage uImage.srec uImage.gz uImage.bz2 uImage.lzma | 28 | targets := zImage vmlinux.srec romImage uImage uImage.srec uImage.gz uImage.bz2 uImage.lzma uImage.bin |
28 | extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma | 29 | extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma |
29 | subdir- := compressed romimage | 30 | subdir- := compressed romimage |
30 | 31 | ||
@@ -88,6 +89,9 @@ $(obj)/uImage.gz: $(obj)/vmlinux.bin.gz | |||
88 | $(obj)/uImage.lzma: $(obj)/vmlinux.bin.lzma | 89 | $(obj)/uImage.lzma: $(obj)/vmlinux.bin.lzma |
89 | $(call if_changed,uimage,lzma) | 90 | $(call if_changed,uimage,lzma) |
90 | 91 | ||
92 | $(obj)/uImage.bin: $(obj)/vmlinux.bin | ||
93 | $(call if_changed,uimage,none) | ||
94 | |||
91 | OBJCOPYFLAGS_vmlinux.srec := -I binary -O srec | 95 | OBJCOPYFLAGS_vmlinux.srec := -I binary -O srec |
92 | $(obj)/vmlinux.srec: $(obj)/compressed/vmlinux | 96 | $(obj)/vmlinux.srec: $(obj)/compressed/vmlinux |
93 | $(call if_changed,objcopy) | 97 | $(call if_changed,objcopy) |
diff --git a/arch/sh/include/asm/rwsem.h b/arch/sh/include/asm/rwsem.h index 1987f3ea7f1b..06e2251a5e48 100644 --- a/arch/sh/include/asm/rwsem.h +++ b/arch/sh/include/asm/rwsem.h | |||
@@ -41,7 +41,7 @@ struct rw_semaphore { | |||
41 | #endif | 41 | #endif |
42 | 42 | ||
43 | #define __RWSEM_INITIALIZER(name) \ | 43 | #define __RWSEM_INITIALIZER(name) \ |
44 | { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ | 44 | { RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \ |
45 | LIST_HEAD_INIT((name).wait_list) \ | 45 | LIST_HEAD_INIT((name).wait_list) \ |
46 | __RWSEM_DEP_MAP_INIT(name) } | 46 | __RWSEM_DEP_MAP_INIT(name) } |
47 | 47 | ||
diff --git a/arch/sh/kernel/cpu/irq/imask.c b/arch/sh/kernel/cpu/irq/imask.c index 6b5d191eec3a..a351ed84eec5 100644 --- a/arch/sh/kernel/cpu/irq/imask.c +++ b/arch/sh/kernel/cpu/irq/imask.c | |||
@@ -68,7 +68,7 @@ static void unmask_imask_irq(unsigned int irq) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | static struct irq_chip imask_irq_chip = { | 70 | static struct irq_chip imask_irq_chip = { |
71 | .typename = "SR.IMASK", | 71 | .name = "SR.IMASK", |
72 | .mask = mask_imask_irq, | 72 | .mask = mask_imask_irq, |
73 | .unmask = unmask_imask_irq, | 73 | .unmask = unmask_imask_irq, |
74 | .mask_ack = mask_imask_irq, | 74 | .mask_ack = mask_imask_irq, |
diff --git a/arch/sh/kernel/cpu/irq/intc-sh5.c b/arch/sh/kernel/cpu/irq/intc-sh5.c index 6c092f1f5557..06e7e2959b54 100644 --- a/arch/sh/kernel/cpu/irq/intc-sh5.c +++ b/arch/sh/kernel/cpu/irq/intc-sh5.c | |||
@@ -85,7 +85,7 @@ static void mask_and_ack_intc(unsigned int); | |||
85 | static void end_intc_irq(unsigned int irq); | 85 | static void end_intc_irq(unsigned int irq); |
86 | 86 | ||
87 | static struct irq_chip intc_irq_type = { | 87 | static struct irq_chip intc_irq_type = { |
88 | .typename = "INTC", | 88 | .name = "INTC", |
89 | .startup = startup_intc_irq, | 89 | .startup = startup_intc_irq, |
90 | .shutdown = shutdown_intc_irq, | 90 | .shutdown = shutdown_intc_irq, |
91 | .enable = enable_intc_irq, | 91 | .enable = enable_intc_irq, |
diff --git a/arch/sh/kernel/cpu/sh3/entry.S b/arch/sh/kernel/cpu/sh3/entry.S index 0151933e5253..bb407ef0b91e 100644 --- a/arch/sh/kernel/cpu/sh3/entry.S +++ b/arch/sh/kernel/cpu/sh3/entry.S | |||
@@ -152,8 +152,6 @@ call_do_page_fault: | |||
152 | mov.l 1f, r0 | 152 | mov.l 1f, r0 |
153 | mov.l @r0, r6 | 153 | mov.l @r0, r6 |
154 | 154 | ||
155 | sti | ||
156 | |||
157 | mov.l 3f, r0 | 155 | mov.l 3f, r0 |
158 | mov.l 4f, r1 | 156 | mov.l 4f, r1 |
159 | mov r15, r4 | 157 | mov r15, r4 |
diff --git a/arch/sh/kernel/dwarf.c b/arch/sh/kernel/dwarf.c index 03b3616c80a5..d76a23170dbb 100644 --- a/arch/sh/kernel/dwarf.c +++ b/arch/sh/kernel/dwarf.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/list.h> | 20 | #include <linux/list.h> |
21 | #include <linux/mempool.h> | 21 | #include <linux/mempool.h> |
22 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
23 | #include <linux/ftrace.h> | ||
23 | #include <asm/dwarf.h> | 24 | #include <asm/dwarf.h> |
24 | #include <asm/unwinder.h> | 25 | #include <asm/unwinder.h> |
25 | #include <asm/sections.h> | 26 | #include <asm/sections.h> |
@@ -554,9 +555,30 @@ struct dwarf_frame * dwarf_unwind_stack(unsigned long pc, | |||
554 | * NOTE: the return address is guaranteed to be setup by the | 555 | * NOTE: the return address is guaranteed to be setup by the |
555 | * time this function makes its first function call. | 556 | * time this function makes its first function call. |
556 | */ | 557 | */ |
557 | if (!pc && !prev) | 558 | if (!pc || !prev) |
558 | pc = (unsigned long)current_text_addr(); | 559 | pc = (unsigned long)current_text_addr(); |
559 | 560 | ||
561 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
562 | /* | ||
563 | * If our stack has been patched by the function graph tracer | ||
564 | * then we might see the address of return_to_handler() where we | ||
565 | * expected to find the real return address. | ||
566 | */ | ||
567 | if (pc == (unsigned long)&return_to_handler) { | ||
568 | int index = current->curr_ret_stack; | ||
569 | |||
570 | /* | ||
571 | * We currently have no way of tracking how many | ||
572 | * return_to_handler()'s we've seen. If there is more | ||
573 | * than one patched return address on our stack, | ||
574 | * complain loudly. | ||
575 | */ | ||
576 | WARN_ON(index > 0); | ||
577 | |||
578 | pc = current->ret_stack[index].ret; | ||
579 | } | ||
580 | #endif | ||
581 | |||
560 | frame = mempool_alloc(dwarf_frame_pool, GFP_ATOMIC); | 582 | frame = mempool_alloc(dwarf_frame_pool, GFP_ATOMIC); |
561 | if (!frame) { | 583 | if (!frame) { |
562 | printk(KERN_ERR "Unable to allocate a dwarf frame\n"); | 584 | printk(KERN_ERR "Unable to allocate a dwarf frame\n"); |
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index 68d9223b145e..3eb84931d2aa 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S | |||
@@ -121,7 +121,7 @@ noresched: | |||
121 | ENTRY(resume_userspace) | 121 | ENTRY(resume_userspace) |
122 | ! r8: current_thread_info | 122 | ! r8: current_thread_info |
123 | cli | 123 | cli |
124 | TRACE_IRQS_OfF | 124 | TRACE_IRQS_OFF |
125 | mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags | 125 | mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags |
126 | tst #(_TIF_WORK_MASK & 0xff), r0 | 126 | tst #(_TIF_WORK_MASK & 0xff), r0 |
127 | bt/s __restore_all | 127 | bt/s __restore_all |
diff --git a/arch/sh/kernel/ftrace.c b/arch/sh/kernel/ftrace.c index a3dcc6d5d253..2c48e267256e 100644 --- a/arch/sh/kernel/ftrace.c +++ b/arch/sh/kernel/ftrace.c | |||
@@ -291,31 +291,48 @@ struct syscall_metadata *syscall_nr_to_meta(int nr) | |||
291 | return syscalls_metadata[nr]; | 291 | return syscalls_metadata[nr]; |
292 | } | 292 | } |
293 | 293 | ||
294 | void arch_init_ftrace_syscalls(void) | 294 | int syscall_name_to_nr(char *name) |
295 | { | ||
296 | int i; | ||
297 | |||
298 | if (!syscalls_metadata) | ||
299 | return -1; | ||
300 | for (i = 0; i < NR_syscalls; i++) | ||
301 | if (syscalls_metadata[i]) | ||
302 | if (!strcmp(syscalls_metadata[i]->name, name)) | ||
303 | return i; | ||
304 | return -1; | ||
305 | } | ||
306 | |||
307 | void set_syscall_enter_id(int num, int id) | ||
308 | { | ||
309 | syscalls_metadata[num]->enter_id = id; | ||
310 | } | ||
311 | |||
312 | void set_syscall_exit_id(int num, int id) | ||
313 | { | ||
314 | syscalls_metadata[num]->exit_id = id; | ||
315 | } | ||
316 | |||
317 | static int __init arch_init_ftrace_syscalls(void) | ||
295 | { | 318 | { |
296 | int i; | 319 | int i; |
297 | struct syscall_metadata *meta; | 320 | struct syscall_metadata *meta; |
298 | unsigned long **psys_syscall_table = &sys_call_table; | 321 | unsigned long **psys_syscall_table = &sys_call_table; |
299 | static atomic_t refs; | ||
300 | |||
301 | if (atomic_inc_return(&refs) != 1) | ||
302 | goto end; | ||
303 | 322 | ||
304 | syscalls_metadata = kzalloc(sizeof(*syscalls_metadata) * | 323 | syscalls_metadata = kzalloc(sizeof(*syscalls_metadata) * |
305 | FTRACE_SYSCALL_MAX, GFP_KERNEL); | 324 | FTRACE_SYSCALL_MAX, GFP_KERNEL); |
306 | if (!syscalls_metadata) { | 325 | if (!syscalls_metadata) { |
307 | WARN_ON(1); | 326 | WARN_ON(1); |
308 | return; | 327 | return -ENOMEM; |
309 | } | 328 | } |
310 | 329 | ||
311 | for (i = 0; i < FTRACE_SYSCALL_MAX; i++) { | 330 | for (i = 0; i < FTRACE_SYSCALL_MAX; i++) { |
312 | meta = find_syscall_meta(psys_syscall_table[i]); | 331 | meta = find_syscall_meta(psys_syscall_table[i]); |
313 | syscalls_metadata[i] = meta; | 332 | syscalls_metadata[i] = meta; |
314 | } | 333 | } |
315 | return; | ||
316 | 334 | ||
317 | /* Paranoid: avoid overflow */ | 335 | return 0; |
318 | end: | ||
319 | atomic_dec(&refs); | ||
320 | } | 336 | } |
337 | arch_initcall(arch_init_ftrace_syscalls); | ||
321 | #endif /* CONFIG_FTRACE_SYSCALLS */ | 338 | #endif /* CONFIG_FTRACE_SYSCALLS */ |
diff --git a/arch/sh/kernel/io_generic.c b/arch/sh/kernel/io_generic.c index 4ff507239286..b8fa6524760a 100644 --- a/arch/sh/kernel/io_generic.c +++ b/arch/sh/kernel/io_generic.c | |||
@@ -147,6 +147,9 @@ void generic_outsl(unsigned long port, const void *src, unsigned long count) | |||
147 | 147 | ||
148 | void __iomem *generic_ioport_map(unsigned long addr, unsigned int size) | 148 | void __iomem *generic_ioport_map(unsigned long addr, unsigned int size) |
149 | { | 149 | { |
150 | if (PXSEG(addr) >= P1SEG) | ||
151 | return (void __iomem *)addr; | ||
152 | |||
150 | return (void __iomem *)(addr + generic_io_base); | 153 | return (void __iomem *)(addr + generic_io_base); |
151 | } | 154 | } |
152 | 155 | ||
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index 7cb933ba4957..eac7da772fc2 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/kernel_stat.h> | 12 | #include <linux/kernel_stat.h> |
13 | #include <linux/seq_file.h> | 13 | #include <linux/seq_file.h> |
14 | #include <linux/ftrace.h> | ||
14 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
15 | #include <asm/machvec.h> | 16 | #include <asm/machvec.h> |
16 | #include <asm/uaccess.h> | 17 | #include <asm/uaccess.h> |
@@ -106,7 +107,7 @@ static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly; | |||
106 | static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; | 107 | static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; |
107 | #endif | 108 | #endif |
108 | 109 | ||
109 | asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs) | 110 | asmlinkage __irq_entry int do_IRQ(unsigned int irq, struct pt_regs *regs) |
110 | { | 111 | { |
111 | struct pt_regs *old_regs = set_irq_regs(regs); | 112 | struct pt_regs *old_regs = set_irq_regs(regs); |
112 | #ifdef CONFIG_IRQSTACKS | 113 | #ifdef CONFIG_IRQSTACKS |
diff --git a/arch/sh/kernel/machvec.c b/arch/sh/kernel/machvec.c index 548f6607fd0f..cbce639b108a 100644 --- a/arch/sh/kernel/machvec.c +++ b/arch/sh/kernel/machvec.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
15 | #include <asm/machvec.h> | 15 | #include <asm/machvec.h> |
16 | #include <asm/sections.h> | 16 | #include <asm/sections.h> |
17 | #include <asm/addrspace.h> | ||
17 | #include <asm/setup.h> | 18 | #include <asm/setup.h> |
18 | #include <asm/io.h> | 19 | #include <asm/io.h> |
19 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
@@ -133,4 +134,6 @@ void __init sh_mv_setup(void) | |||
133 | 134 | ||
134 | if (!sh_mv.mv_nr_irqs) | 135 | if (!sh_mv.mv_nr_irqs) |
135 | sh_mv.mv_nr_irqs = NR_IRQS; | 136 | sh_mv.mv_nr_irqs = NR_IRQS; |
137 | |||
138 | __set_io_port_base(P2SEG); | ||
136 | } | 139 | } |
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index f9d44f8e0df6..99b4fb553bf1 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -549,6 +549,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
549 | 549 | ||
550 | if (cpu == 0) | 550 | if (cpu == 0) |
551 | seq_printf(m, "machine\t\t: %s\n", get_system_type()); | 551 | seq_printf(m, "machine\t\t: %s\n", get_system_type()); |
552 | else | ||
553 | seq_printf(m, "\n"); | ||
552 | 554 | ||
553 | seq_printf(m, "processor\t: %d\n", cpu); | 555 | seq_printf(m, "processor\t: %d\n", cpu); |
554 | seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine); | 556 | seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine); |
diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c index 8dbe26b17c44..444cce3ae921 100644 --- a/arch/sh/kernel/sh_ksyms_32.c +++ b/arch/sh/kernel/sh_ksyms_32.c | |||
@@ -84,6 +84,21 @@ DECLARE_EXPORT(__movstrSI60); | |||
84 | DECLARE_EXPORT(__movstr_i4_even); | 84 | DECLARE_EXPORT(__movstr_i4_even); |
85 | DECLARE_EXPORT(__movstr_i4_odd); | 85 | DECLARE_EXPORT(__movstr_i4_odd); |
86 | DECLARE_EXPORT(__movstrSI12_i4); | 86 | DECLARE_EXPORT(__movstrSI12_i4); |
87 | DECLARE_EXPORT(__movmem); | ||
88 | DECLARE_EXPORT(__movmemSI8); | ||
89 | DECLARE_EXPORT(__movmemSI12); | ||
90 | DECLARE_EXPORT(__movmemSI16); | ||
91 | DECLARE_EXPORT(__movmemSI20); | ||
92 | DECLARE_EXPORT(__movmemSI24); | ||
93 | DECLARE_EXPORT(__movmemSI28); | ||
94 | DECLARE_EXPORT(__movmemSI32); | ||
95 | DECLARE_EXPORT(__movmemSI36); | ||
96 | DECLARE_EXPORT(__movmemSI40); | ||
97 | DECLARE_EXPORT(__movmemSI44); | ||
98 | DECLARE_EXPORT(__movmemSI48); | ||
99 | DECLARE_EXPORT(__movmemSI52); | ||
100 | DECLARE_EXPORT(__movmemSI56); | ||
101 | DECLARE_EXPORT(__movmemSI60); | ||
87 | DECLARE_EXPORT(__movmem_i4_even); | 102 | DECLARE_EXPORT(__movmem_i4_even); |
88 | DECLARE_EXPORT(__movmem_i4_odd); | 103 | DECLARE_EXPORT(__movmem_i4_odd); |
89 | DECLARE_EXPORT(__movmemSI12_i4); | 104 | DECLARE_EXPORT(__movmemSI12_i4); |
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 6729703547a1..3db37425210d 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
@@ -145,7 +145,7 @@ static inline int restore_sigcontext_fpu(struct sigcontext __user *sc) | |||
145 | { | 145 | { |
146 | struct task_struct *tsk = current; | 146 | struct task_struct *tsk = current; |
147 | 147 | ||
148 | if (!(current_cpu_data.flags & CPU_HAS_FPU)) | 148 | if (!(boot_cpu_data.flags & CPU_HAS_FPU)) |
149 | return 0; | 149 | return 0; |
150 | 150 | ||
151 | set_used_math(); | 151 | set_used_math(); |
@@ -158,7 +158,7 @@ static inline int save_sigcontext_fpu(struct sigcontext __user *sc, | |||
158 | { | 158 | { |
159 | struct task_struct *tsk = current; | 159 | struct task_struct *tsk = current; |
160 | 160 | ||
161 | if (!(current_cpu_data.flags & CPU_HAS_FPU)) | 161 | if (!(boot_cpu_data.flags & CPU_HAS_FPU)) |
162 | return 0; | 162 | return 0; |
163 | 163 | ||
164 | if (!used_math()) { | 164 | if (!used_math()) { |
@@ -199,7 +199,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_p | |||
199 | #undef COPY | 199 | #undef COPY |
200 | 200 | ||
201 | #ifdef CONFIG_SH_FPU | 201 | #ifdef CONFIG_SH_FPU |
202 | if (current_cpu_data.flags & CPU_HAS_FPU) { | 202 | if (boot_cpu_data.flags & CPU_HAS_FPU) { |
203 | int owned_fp; | 203 | int owned_fp; |
204 | struct task_struct *tsk = current; | 204 | struct task_struct *tsk = current; |
205 | 205 | ||
@@ -472,6 +472,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
472 | err |= __put_user(OR_R0_R0, &frame->retcode[6]); | 472 | err |= __put_user(OR_R0_R0, &frame->retcode[6]); |
473 | err |= __put_user((__NR_rt_sigreturn), &frame->retcode[7]); | 473 | err |= __put_user((__NR_rt_sigreturn), &frame->retcode[7]); |
474 | regs->pr = (unsigned long) frame->retcode; | 474 | regs->pr = (unsigned long) frame->retcode; |
475 | flush_icache_range(regs->pr, regs->pr + sizeof(frame->retcode)); | ||
475 | } | 476 | } |
476 | 477 | ||
477 | if (err) | 478 | if (err) |
@@ -497,8 +498,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
497 | pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n", | 498 | pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n", |
498 | current->comm, task_pid_nr(current), frame, regs->pc, regs->pr); | 499 | current->comm, task_pid_nr(current), frame, regs->pc, regs->pr); |
499 | 500 | ||
500 | flush_icache_range(regs->pr, regs->pr + sizeof(frame->retcode)); | ||
501 | |||
502 | return 0; | 501 | return 0; |
503 | 502 | ||
504 | give_sigsegv: | 503 | give_sigsegv: |
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 442d8d47a41e..160db1003cfb 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
@@ -35,6 +35,8 @@ static inline void __init smp_store_cpu_info(unsigned int cpu) | |||
35 | { | 35 | { |
36 | struct sh_cpuinfo *c = cpu_data + cpu; | 36 | struct sh_cpuinfo *c = cpu_data + cpu; |
37 | 37 | ||
38 | memcpy(c, &boot_cpu_data, sizeof(struct sh_cpuinfo)); | ||
39 | |||
38 | c->loops_per_jiffy = loops_per_jiffy; | 40 | c->loops_per_jiffy = loops_per_jiffy; |
39 | } | 41 | } |
40 | 42 | ||
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index 69bb1652eccd..7a2ee3a6b8e7 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/kexec.h> | 25 | #include <linux/kexec.h> |
26 | #include <linux/limits.h> | 26 | #include <linux/limits.h> |
27 | #include <linux/proc_fs.h> | 27 | #include <linux/proc_fs.h> |
28 | #include <linux/sysfs.h> | ||
28 | #include <asm/system.h> | 29 | #include <asm/system.h> |
29 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
30 | #include <asm/fpu.h> | 31 | #include <asm/fpu.h> |
@@ -54,8 +55,8 @@ static unsigned long se_multi; | |||
54 | /* bitfield: 1: warn 2: fixup 4: signal -> combinations 2|4 && 1|2|4 are not | 55 | /* bitfield: 1: warn 2: fixup 4: signal -> combinations 2|4 && 1|2|4 are not |
55 | valid! */ | 56 | valid! */ |
56 | static int se_usermode = 3; | 57 | static int se_usermode = 3; |
57 | /* 0: no warning 1: print a warning message */ | 58 | /* 0: no warning 1: print a warning message, disabled by default */ |
58 | static int se_kernmode_warn = 1; | 59 | static int se_kernmode_warn; |
59 | 60 | ||
60 | #ifdef CONFIG_PROC_FS | 61 | #ifdef CONFIG_PROC_FS |
61 | static const char *se_usermode_action[] = { | 62 | static const char *se_usermode_action[] = { |
@@ -159,12 +160,12 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
159 | 160 | ||
160 | oops_enter(); | 161 | oops_enter(); |
161 | 162 | ||
162 | console_verbose(); | ||
163 | spin_lock_irq(&die_lock); | 163 | spin_lock_irq(&die_lock); |
164 | console_verbose(); | ||
164 | bust_spinlocks(1); | 165 | bust_spinlocks(1); |
165 | 166 | ||
166 | printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); | 167 | printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); |
167 | 168 | sysfs_printk_last_file(); | |
168 | print_modules(); | 169 | print_modules(); |
169 | show_regs(regs); | 170 | show_regs(regs); |
170 | 171 | ||
@@ -180,6 +181,7 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
180 | bust_spinlocks(0); | 181 | bust_spinlocks(0); |
181 | add_taint(TAINT_DIE); | 182 | add_taint(TAINT_DIE); |
182 | spin_unlock_irq(&die_lock); | 183 | spin_unlock_irq(&die_lock); |
184 | oops_exit(); | ||
183 | 185 | ||
184 | if (kexec_should_crash(current)) | 186 | if (kexec_should_crash(current)) |
185 | crash_kexec(regs); | 187 | crash_kexec(regs); |
@@ -190,7 +192,6 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
190 | if (panic_on_oops) | 192 | if (panic_on_oops) |
191 | panic("Fatal exception"); | 193 | panic("Fatal exception"); |
192 | 194 | ||
193 | oops_exit(); | ||
194 | do_exit(SIGSEGV); | 195 | do_exit(SIGSEGV); |
195 | } | 196 | } |
196 | 197 | ||
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 64dc1ad59801..7f7b52f9beba 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -227,7 +227,7 @@ endchoice | |||
227 | 227 | ||
228 | choice | 228 | choice |
229 | prompt "HugeTLB page size" | 229 | prompt "HugeTLB page size" |
230 | depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU | 230 | depends on HUGETLB_PAGE |
231 | default HUGETLB_PAGE_SIZE_1MB if PAGE_SIZE_64KB | 231 | default HUGETLB_PAGE_SIZE_1MB if PAGE_SIZE_64KB |
232 | default HUGETLB_PAGE_SIZE_64K | 232 | default HUGETLB_PAGE_SIZE_64K |
233 | 233 | ||
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c index b2453bbef4cd..b7f235c74d66 100644 --- a/arch/sh/mm/cache-sh4.c +++ b/arch/sh/mm/cache-sh4.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #define MAX_DCACHE_PAGES 64 /* XXX: Tune for ways */ | 26 | #define MAX_DCACHE_PAGES 64 /* XXX: Tune for ways */ |
27 | #define MAX_ICACHE_PAGES 32 | 27 | #define MAX_ICACHE_PAGES 32 |
28 | 28 | ||
29 | static void __flush_cache_4096(unsigned long addr, unsigned long phys, | 29 | static void __flush_cache_one(unsigned long addr, unsigned long phys, |
30 | unsigned long exec_offset); | 30 | unsigned long exec_offset); |
31 | 31 | ||
32 | /* | 32 | /* |
@@ -43,7 +43,7 @@ static void (*__flush_dcache_segment_fn)(unsigned long, unsigned long) = | |||
43 | * Called from kernel/module.c:sys_init_module and routine for a.out format, | 43 | * Called from kernel/module.c:sys_init_module and routine for a.out format, |
44 | * signal handler code and kprobes code | 44 | * signal handler code and kprobes code |
45 | */ | 45 | */ |
46 | static void sh4_flush_icache_range(void *args) | 46 | static void __uses_jump_to_uncached sh4_flush_icache_range(void *args) |
47 | { | 47 | { |
48 | struct flusher_data *data = args; | 48 | struct flusher_data *data = args; |
49 | unsigned long start, end; | 49 | unsigned long start, end; |
@@ -72,6 +72,7 @@ static void sh4_flush_icache_range(void *args) | |||
72 | 72 | ||
73 | for (v = start; v < end; v += L1_CACHE_BYTES) { | 73 | for (v = start; v < end; v += L1_CACHE_BYTES) { |
74 | unsigned long icacheaddr; | 74 | unsigned long icacheaddr; |
75 | int j, n; | ||
75 | 76 | ||
76 | __ocbwb(v); | 77 | __ocbwb(v); |
77 | 78 | ||
@@ -79,8 +80,10 @@ static void sh4_flush_icache_range(void *args) | |||
79 | cpu_data->icache.entry_mask); | 80 | cpu_data->icache.entry_mask); |
80 | 81 | ||
81 | /* Clear i-cache line valid-bit */ | 82 | /* Clear i-cache line valid-bit */ |
83 | n = boot_cpu_data.icache.n_aliases; | ||
82 | for (i = 0; i < cpu_data->icache.ways; i++) { | 84 | for (i = 0; i < cpu_data->icache.ways; i++) { |
83 | __raw_writel(0, icacheaddr); | 85 | for (j = 0; j < n; j++) |
86 | __raw_writel(0, icacheaddr + (j * PAGE_SIZE)); | ||
84 | icacheaddr += cpu_data->icache.way_incr; | 87 | icacheaddr += cpu_data->icache.way_incr; |
85 | } | 88 | } |
86 | } | 89 | } |
@@ -89,8 +92,7 @@ static void sh4_flush_icache_range(void *args) | |||
89 | local_irq_restore(flags); | 92 | local_irq_restore(flags); |
90 | } | 93 | } |
91 | 94 | ||
92 | static inline void flush_cache_4096(unsigned long start, | 95 | static inline void flush_cache_one(unsigned long start, unsigned long phys) |
93 | unsigned long phys) | ||
94 | { | 96 | { |
95 | unsigned long flags, exec_offset = 0; | 97 | unsigned long flags, exec_offset = 0; |
96 | 98 | ||
@@ -103,8 +105,7 @@ static inline void flush_cache_4096(unsigned long start, | |||
103 | exec_offset = 0x20000000; | 105 | exec_offset = 0x20000000; |
104 | 106 | ||
105 | local_irq_save(flags); | 107 | local_irq_save(flags); |
106 | __flush_cache_4096(start | SH_CACHE_ASSOC, | 108 | __flush_cache_one(start | SH_CACHE_ASSOC, P1SEGADDR(phys), exec_offset); |
107 | P1SEGADDR(phys), exec_offset); | ||
108 | local_irq_restore(flags); | 109 | local_irq_restore(flags); |
109 | } | 110 | } |
110 | 111 | ||
@@ -129,8 +130,8 @@ static void sh4_flush_dcache_page(void *arg) | |||
129 | 130 | ||
130 | /* Loop all the D-cache */ | 131 | /* Loop all the D-cache */ |
131 | n = boot_cpu_data.dcache.n_aliases; | 132 | n = boot_cpu_data.dcache.n_aliases; |
132 | for (i = 0; i < n; i++, addr += 4096) | 133 | for (i = 0; i < n; i++, addr += PAGE_SIZE) |
133 | flush_cache_4096(addr, phys); | 134 | flush_cache_one(addr, phys); |
134 | } | 135 | } |
135 | 136 | ||
136 | wmb(); | 137 | wmb(); |
@@ -318,11 +319,11 @@ static void sh4_flush_cache_page(void *args) | |||
318 | /* We only need to flush D-cache when we have alias */ | 319 | /* We only need to flush D-cache when we have alias */ |
319 | if ((address^phys) & alias_mask) { | 320 | if ((address^phys) & alias_mask) { |
320 | /* Loop 4K of the D-cache */ | 321 | /* Loop 4K of the D-cache */ |
321 | flush_cache_4096( | 322 | flush_cache_one( |
322 | CACHE_OC_ADDRESS_ARRAY | (address & alias_mask), | 323 | CACHE_OC_ADDRESS_ARRAY | (address & alias_mask), |
323 | phys); | 324 | phys); |
324 | /* Loop another 4K of the D-cache */ | 325 | /* Loop another 4K of the D-cache */ |
325 | flush_cache_4096( | 326 | flush_cache_one( |
326 | CACHE_OC_ADDRESS_ARRAY | (phys & alias_mask), | 327 | CACHE_OC_ADDRESS_ARRAY | (phys & alias_mask), |
327 | phys); | 328 | phys); |
328 | } | 329 | } |
@@ -337,7 +338,7 @@ static void sh4_flush_cache_page(void *args) | |||
337 | * kernel has never executed the code through its identity | 338 | * kernel has never executed the code through its identity |
338 | * translation. | 339 | * translation. |
339 | */ | 340 | */ |
340 | flush_cache_4096( | 341 | flush_cache_one( |
341 | CACHE_IC_ADDRESS_ARRAY | (address & alias_mask), | 342 | CACHE_IC_ADDRESS_ARRAY | (address & alias_mask), |
342 | phys); | 343 | phys); |
343 | } | 344 | } |
@@ -393,7 +394,7 @@ static void sh4_flush_cache_range(void *args) | |||
393 | } | 394 | } |
394 | 395 | ||
395 | /** | 396 | /** |
396 | * __flush_cache_4096 | 397 | * __flush_cache_one |
397 | * | 398 | * |
398 | * @addr: address in memory mapped cache array | 399 | * @addr: address in memory mapped cache array |
399 | * @phys: P1 address to flush (has to match tags if addr has 'A' bit | 400 | * @phys: P1 address to flush (has to match tags if addr has 'A' bit |
@@ -406,7 +407,7 @@ static void sh4_flush_cache_range(void *args) | |||
406 | * operation (purge/write-back) is selected by the lower 2 bits of | 407 | * operation (purge/write-back) is selected by the lower 2 bits of |
407 | * 'phys'. | 408 | * 'phys'. |
408 | */ | 409 | */ |
409 | static void __flush_cache_4096(unsigned long addr, unsigned long phys, | 410 | static void __flush_cache_one(unsigned long addr, unsigned long phys, |
410 | unsigned long exec_offset) | 411 | unsigned long exec_offset) |
411 | { | 412 | { |
412 | int way_count; | 413 | int way_count; |
diff --git a/arch/sh/mm/cache-sh7705.c b/arch/sh/mm/cache-sh7705.c index 2cadee2037ac..2601935eb589 100644 --- a/arch/sh/mm/cache-sh7705.c +++ b/arch/sh/mm/cache-sh7705.c | |||
@@ -78,7 +78,7 @@ static void sh7705_flush_icache_range(void *args) | |||
78 | /* | 78 | /* |
79 | * Writeback&Invalidate the D-cache of the page | 79 | * Writeback&Invalidate the D-cache of the page |
80 | */ | 80 | */ |
81 | static void __flush_dcache_page(unsigned long phys) | 81 | static void __uses_jump_to_uncached __flush_dcache_page(unsigned long phys) |
82 | { | 82 | { |
83 | unsigned long ways, waysize, addrstart; | 83 | unsigned long ways, waysize, addrstart; |
84 | unsigned long flags; | 84 | unsigned long flags; |
@@ -144,7 +144,7 @@ static void sh7705_flush_dcache_page(void *arg) | |||
144 | __flush_dcache_page(PHYSADDR(page_address(page))); | 144 | __flush_dcache_page(PHYSADDR(page_address(page))); |
145 | } | 145 | } |
146 | 146 | ||
147 | static void sh7705_flush_cache_all(void *args) | 147 | static void __uses_jump_to_uncached sh7705_flush_cache_all(void *args) |
148 | { | 148 | { |
149 | unsigned long flags; | 149 | unsigned long flags; |
150 | 150 | ||
diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index 35c37b7f717a..a2dc7f9ecc51 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c | |||
@@ -128,7 +128,7 @@ void __update_cache(struct vm_area_struct *vma, | |||
128 | return; | 128 | return; |
129 | 129 | ||
130 | page = pfn_to_page(pfn); | 130 | page = pfn_to_page(pfn); |
131 | if (pfn_valid(pfn) && page_mapping(page)) { | 131 | if (pfn_valid(pfn)) { |
132 | int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags); | 132 | int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags); |
133 | if (dirty) { | 133 | if (dirty) { |
134 | unsigned long addr = (unsigned long)page_address(page); | 134 | unsigned long addr = (unsigned long)page_address(page); |
@@ -265,6 +265,8 @@ static void __init emit_cache_params(void) | |||
265 | 265 | ||
266 | void __init cpu_cache_init(void) | 266 | void __init cpu_cache_init(void) |
267 | { | 267 | { |
268 | unsigned int cache_disabled = !(__raw_readl(CCR) & CCR_CACHE_ENABLE); | ||
269 | |||
268 | compute_alias(&boot_cpu_data.icache); | 270 | compute_alias(&boot_cpu_data.icache); |
269 | compute_alias(&boot_cpu_data.dcache); | 271 | compute_alias(&boot_cpu_data.dcache); |
270 | compute_alias(&boot_cpu_data.scache); | 272 | compute_alias(&boot_cpu_data.scache); |
@@ -273,6 +275,13 @@ void __init cpu_cache_init(void) | |||
273 | __flush_purge_region = noop__flush_region; | 275 | __flush_purge_region = noop__flush_region; |
274 | __flush_invalidate_region = noop__flush_region; | 276 | __flush_invalidate_region = noop__flush_region; |
275 | 277 | ||
278 | /* | ||
279 | * No flushing is necessary in the disabled cache case so we can | ||
280 | * just keep the noop functions in local_flush_..() and __flush_..() | ||
281 | */ | ||
282 | if (unlikely(cache_disabled)) | ||
283 | goto skip; | ||
284 | |||
276 | if (boot_cpu_data.family == CPU_FAMILY_SH2) { | 285 | if (boot_cpu_data.family == CPU_FAMILY_SH2) { |
277 | extern void __weak sh2_cache_init(void); | 286 | extern void __weak sh2_cache_init(void); |
278 | 287 | ||
@@ -312,5 +321,6 @@ void __init cpu_cache_init(void) | |||
312 | sh5_cache_init(); | 321 | sh5_cache_init(); |
313 | } | 322 | } |
314 | 323 | ||
324 | skip: | ||
315 | emit_cache_params(); | 325 | emit_cache_params(); |
316 | } | 326 | } |
diff --git a/arch/sh/mm/ioremap_32.c b/arch/sh/mm/ioremap_32.c index c3250614e3ae..a86eaa9d75a5 100644 --- a/arch/sh/mm/ioremap_32.c +++ b/arch/sh/mm/ioremap_32.c | |||
@@ -83,7 +83,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
83 | * | 83 | * |
84 | * PMB entries are all pre-faulted. | 84 | * PMB entries are all pre-faulted. |
85 | */ | 85 | */ |
86 | if (unlikely(size >= 0x1000000)) { | 86 | if (unlikely(phys_addr >= P1SEG)) { |
87 | unsigned long mapped = pmb_remap(addr, phys_addr, size, flags); | 87 | unsigned long mapped = pmb_remap(addr, phys_addr, size, flags); |
88 | 88 | ||
89 | if (likely(mapped)) { | 89 | if (likely(mapped)) { |
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index b1a714a92b14..aade31102112 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
@@ -33,6 +33,8 @@ | |||
33 | 33 | ||
34 | #define NR_PMB_ENTRIES 16 | 34 | #define NR_PMB_ENTRIES 16 |
35 | 35 | ||
36 | static void __pmb_unmap(struct pmb_entry *); | ||
37 | |||
36 | static struct kmem_cache *pmb_cache; | 38 | static struct kmem_cache *pmb_cache; |
37 | static unsigned long pmb_map; | 39 | static unsigned long pmb_map; |
38 | 40 | ||
@@ -218,9 +220,10 @@ static struct { | |||
218 | long pmb_remap(unsigned long vaddr, unsigned long phys, | 220 | long pmb_remap(unsigned long vaddr, unsigned long phys, |
219 | unsigned long size, unsigned long flags) | 221 | unsigned long size, unsigned long flags) |
220 | { | 222 | { |
221 | struct pmb_entry *pmbp; | 223 | struct pmb_entry *pmbp, *pmbe; |
222 | unsigned long wanted; | 224 | unsigned long wanted; |
223 | int pmb_flags, i; | 225 | int pmb_flags, i; |
226 | long err; | ||
224 | 227 | ||
225 | /* Convert typical pgprot value to the PMB equivalent */ | 228 | /* Convert typical pgprot value to the PMB equivalent */ |
226 | if (flags & _PAGE_CACHABLE) { | 229 | if (flags & _PAGE_CACHABLE) { |
@@ -236,20 +239,22 @@ long pmb_remap(unsigned long vaddr, unsigned long phys, | |||
236 | 239 | ||
237 | again: | 240 | again: |
238 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { | 241 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { |
239 | struct pmb_entry *pmbe; | ||
240 | int ret; | 242 | int ret; |
241 | 243 | ||
242 | if (size < pmb_sizes[i].size) | 244 | if (size < pmb_sizes[i].size) |
243 | continue; | 245 | continue; |
244 | 246 | ||
245 | pmbe = pmb_alloc(vaddr, phys, pmb_flags | pmb_sizes[i].flag); | 247 | pmbe = pmb_alloc(vaddr, phys, pmb_flags | pmb_sizes[i].flag); |
246 | if (IS_ERR(pmbe)) | 248 | if (IS_ERR(pmbe)) { |
247 | return PTR_ERR(pmbe); | 249 | err = PTR_ERR(pmbe); |
250 | goto out; | ||
251 | } | ||
248 | 252 | ||
249 | ret = set_pmb_entry(pmbe); | 253 | ret = set_pmb_entry(pmbe); |
250 | if (ret != 0) { | 254 | if (ret != 0) { |
251 | pmb_free(pmbe); | 255 | pmb_free(pmbe); |
252 | return -EBUSY; | 256 | err = -EBUSY; |
257 | goto out; | ||
253 | } | 258 | } |
254 | 259 | ||
255 | phys += pmb_sizes[i].size; | 260 | phys += pmb_sizes[i].size; |
@@ -264,12 +269,25 @@ again: | |||
264 | pmbp->link = pmbe; | 269 | pmbp->link = pmbe; |
265 | 270 | ||
266 | pmbp = pmbe; | 271 | pmbp = pmbe; |
272 | |||
273 | /* | ||
274 | * Instead of trying smaller sizes on every iteration | ||
275 | * (even if we succeed in allocating space), try using | ||
276 | * pmb_sizes[i].size again. | ||
277 | */ | ||
278 | i--; | ||
267 | } | 279 | } |
268 | 280 | ||
269 | if (size >= 0x1000000) | 281 | if (size >= 0x1000000) |
270 | goto again; | 282 | goto again; |
271 | 283 | ||
272 | return wanted - size; | 284 | return wanted - size; |
285 | |||
286 | out: | ||
287 | if (pmbp) | ||
288 | __pmb_unmap(pmbp); | ||
289 | |||
290 | return err; | ||
273 | } | 291 | } |
274 | 292 | ||
275 | void pmb_unmap(unsigned long addr) | 293 | void pmb_unmap(unsigned long addr) |
@@ -283,12 +301,19 @@ void pmb_unmap(unsigned long addr) | |||
283 | if (unlikely(!pmbe)) | 301 | if (unlikely(!pmbe)) |
284 | return; | 302 | return; |
285 | 303 | ||
304 | __pmb_unmap(pmbe); | ||
305 | } | ||
306 | |||
307 | static void __pmb_unmap(struct pmb_entry *pmbe) | ||
308 | { | ||
286 | WARN_ON(!test_bit(pmbe->entry, &pmb_map)); | 309 | WARN_ON(!test_bit(pmbe->entry, &pmb_map)); |
287 | 310 | ||
288 | do { | 311 | do { |
289 | struct pmb_entry *pmblink = pmbe; | 312 | struct pmb_entry *pmblink = pmbe; |
290 | 313 | ||
291 | clear_pmb_entry(pmbe); | 314 | if (pmbe->entry != PMB_NO_ENTRY) |
315 | clear_pmb_entry(pmbe); | ||
316 | |||
292 | pmbe = pmblink->link; | 317 | pmbe = pmblink->link; |
293 | 318 | ||
294 | pmb_free(pmblink); | 319 | pmb_free(pmblink); |