diff options
61 files changed, 879 insertions, 280 deletions
diff --git a/arch/avr32/boards/atstk1000/atstk1000.h b/arch/avr32/boards/atstk1000/atstk1000.h new file mode 100644 index 000000000000..9a49ed036b72 --- /dev/null +++ b/arch/avr32/boards/atstk1000/atstk1000.h | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | /* | ||
| 2 | * ATSTK1000 setup code: Daughterboard interface | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007 Atmel Corporation | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | #ifndef __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H | ||
| 11 | #define __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H | ||
| 12 | |||
| 13 | extern struct atmel_lcdfb_info atstk1000_lcdc_data; | ||
| 14 | |||
| 15 | #endif /* __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H */ | ||
diff --git a/arch/avr32/boards/atstk1000/atstk1002.c b/arch/avr32/boards/atstk1000/atstk1002.c index abe6ca203fa7..fe1dbe2e28f4 100644 --- a/arch/avr32/boards/atstk1000/atstk1002.c +++ b/arch/avr32/boards/atstk1000/atstk1002.c | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
| 17 | #include <linux/spi/spi.h> | 17 | #include <linux/spi/spi.h> |
| 18 | 18 | ||
| 19 | #include <video/atmel_lcdc.h> | ||
| 20 | |||
| 19 | #include <asm/io.h> | 21 | #include <asm/io.h> |
| 20 | #include <asm/setup.h> | 22 | #include <asm/setup.h> |
| 21 | #include <asm/arch/at32ap7000.h> | 23 | #include <asm/arch/at32ap7000.h> |
| @@ -23,6 +25,7 @@ | |||
| 23 | #include <asm/arch/init.h> | 25 | #include <asm/arch/init.h> |
| 24 | #include <asm/arch/portmux.h> | 26 | #include <asm/arch/portmux.h> |
| 25 | 27 | ||
| 28 | #include "atstk1000.h" | ||
| 26 | 29 | ||
| 27 | #define SW2_DEFAULT /* MMCI and UART_A available */ | 30 | #define SW2_DEFAULT /* MMCI and UART_A available */ |
| 28 | 31 | ||
| @@ -31,9 +34,7 @@ struct eth_addr { | |||
| 31 | }; | 34 | }; |
| 32 | 35 | ||
| 33 | static struct eth_addr __initdata hw_addr[2]; | 36 | static struct eth_addr __initdata hw_addr[2]; |
| 34 | |||
| 35 | static struct eth_platform_data __initdata eth_data[2]; | 37 | static struct eth_platform_data __initdata eth_data[2]; |
| 36 | static struct lcdc_platform_data atstk1000_fb0_data; | ||
| 37 | 38 | ||
| 38 | static struct spi_board_info spi0_board_info[] __initdata = { | 39 | static struct spi_board_info spi0_board_info[] __initdata = { |
| 39 | { | 40 | { |
| @@ -148,9 +149,8 @@ static int __init atstk1002_init(void) | |||
| 148 | set_hw_addr(at32_add_device_eth(0, ð_data[0])); | 149 | set_hw_addr(at32_add_device_eth(0, ð_data[0])); |
| 149 | 150 | ||
| 150 | at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); | 151 | at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); |
| 151 | atstk1000_fb0_data.fbmem_start = fbmem_start; | 152 | at32_add_device_lcdc(0, &atstk1000_lcdc_data, |
| 152 | atstk1000_fb0_data.fbmem_size = fbmem_size; | 153 | fbmem_start, fbmem_size); |
| 153 | at32_add_device_lcdc(0, &atstk1000_fb0_data); | ||
| 154 | 154 | ||
| 155 | return 0; | 155 | return 0; |
| 156 | } | 156 | } |
diff --git a/arch/avr32/boards/atstk1000/setup.c b/arch/avr32/boards/atstk1000/setup.c index 2bc4b88d7edb..c9af409ada9a 100644 --- a/arch/avr32/boards/atstk1000/setup.c +++ b/arch/avr32/boards/atstk1000/setup.c | |||
| @@ -8,13 +8,56 @@ | |||
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | #include <linux/bootmem.h> | 10 | #include <linux/bootmem.h> |
| 11 | #include <linux/fb.h> | ||
| 11 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 12 | #include <linux/types.h> | 13 | #include <linux/types.h> |
| 13 | #include <linux/linkage.h> | 14 | #include <linux/linkage.h> |
| 14 | 15 | ||
| 15 | #include <asm/setup.h> | 16 | #include <video/atmel_lcdc.h> |
| 16 | 17 | ||
| 18 | #include <asm/setup.h> | ||
| 17 | #include <asm/arch/board.h> | 19 | #include <asm/arch/board.h> |
| 18 | 20 | ||
| 21 | #include "atstk1000.h" | ||
| 22 | |||
| 19 | /* Initialized by bootloader-specific startup code. */ | 23 | /* Initialized by bootloader-specific startup code. */ |
| 20 | struct tag *bootloader_tags __initdata; | 24 | struct tag *bootloader_tags __initdata; |
| 25 | |||
| 26 | static struct fb_videomode __initdata ltv350qv_modes[] = { | ||
| 27 | { | ||
| 28 | .name = "320x240 @ 75", | ||
| 29 | .refresh = 75, | ||
| 30 | .xres = 320, .yres = 240, | ||
| 31 | .pixclock = KHZ2PICOS(6891), | ||
| 32 | |||
| 33 | .left_margin = 17, .right_margin = 33, | ||
| 34 | .upper_margin = 10, .lower_margin = 10, | ||
| 35 | .hsync_len = 16, .vsync_len = 1, | ||
| 36 | |||
| 37 | .sync = 0, | ||
| 38 | .vmode = FB_VMODE_NONINTERLACED, | ||
| 39 | }, | ||
| 40 | }; | ||
| 41 | |||
| 42 | static struct fb_monspecs __initdata atstk1000_default_monspecs = { | ||
| 43 | .manufacturer = "SNG", | ||
| 44 | .monitor = "LTV350QV", | ||
| 45 | .modedb = ltv350qv_modes, | ||
| 46 | .modedb_len = ARRAY_SIZE(ltv350qv_modes), | ||
| 47 | .hfmin = 14820, | ||
| 48 | .hfmax = 22230, | ||
| 49 | .vfmin = 60, | ||
| 50 | .vfmax = 90, | ||
| 51 | .dclkmax = 30000000, | ||
| 52 | }; | ||
| 53 | |||
| 54 | struct atmel_lcdfb_info __initdata atstk1000_lcdc_data = { | ||
| 55 | .default_bpp = 24, | ||
| 56 | .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN, | ||
| 57 | .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT | ||
| 58 | | ATMEL_LCDC_INVCLK | ||
| 59 | | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE | ||
| 60 | | ATMEL_LCDC_MEMOR_BIG), | ||
| 61 | .default_monspecs = &atstk1000_default_monspecs, | ||
| 62 | .guard_time = 2, | ||
| 63 | }; | ||
diff --git a/arch/avr32/kernel/irq.c b/arch/avr32/kernel/irq.c index fd311248c143..61f2de266f62 100644 --- a/arch/avr32/kernel/irq.c +++ b/arch/avr32/kernel/irq.c | |||
| @@ -7,15 +7,6 @@ | |||
| 7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
| 9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
| 10 | * | ||
| 11 | * This file contains the code used by various IRQ handling routines: | ||
| 12 | * asking for different IRQ's should be done through these routines | ||
| 13 | * instead of just grabbing them. Thus setups with different IRQ numbers | ||
| 14 | * shouldn't result in any weird surprises, and installing new handlers | ||
| 15 | * should be easier. | ||
| 16 | * | ||
| 17 | * IRQ's are in fact implemented a bit like signal handlers for the kernel. | ||
| 18 | * Naturally it's not a 1:1 relation, but there are similarities. | ||
| 19 | */ | 10 | */ |
| 20 | 11 | ||
| 21 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
diff --git a/arch/avr32/kernel/kprobes.c b/arch/avr32/kernel/kprobes.c index 004c94b6fc1d..4942ee662e0b 100644 --- a/arch/avr32/kernel/kprobes.c +++ b/arch/avr32/kernel/kprobes.c | |||
| @@ -179,7 +179,7 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs) | |||
| 179 | return 1; | 179 | return 1; |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | static int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) | 182 | int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) |
| 183 | { | 183 | { |
| 184 | struct kprobe *cur = kprobe_running(); | 184 | struct kprobe *cur = kprobe_running(); |
| 185 | 185 | ||
| @@ -216,11 +216,6 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
| 216 | if (post_kprobe_handler(args->regs)) | 216 | if (post_kprobe_handler(args->regs)) |
| 217 | ret = NOTIFY_STOP; | 217 | ret = NOTIFY_STOP; |
| 218 | break; | 218 | break; |
| 219 | case DIE_FAULT: | ||
| 220 | if (kprobe_running() | ||
| 221 | && kprobe_fault_handler(args->regs, args->trapnr)) | ||
| 222 | ret = NOTIFY_STOP; | ||
| 223 | break; | ||
| 224 | default: | 219 | default: |
| 225 | break; | 220 | break; |
| 226 | } | 221 | } |
diff --git a/arch/avr32/kernel/syscall_table.S b/arch/avr32/kernel/syscall_table.S index 07f6a6fa340d..75c81f2dd0b3 100644 --- a/arch/avr32/kernel/syscall_table.S +++ b/arch/avr32/kernel/syscall_table.S | |||
| @@ -292,4 +292,7 @@ sys_call_table: | |||
| 292 | .long sys_shmdt | 292 | .long sys_shmdt |
| 293 | .long sys_shmctl | 293 | .long sys_shmctl |
| 294 | .long sys_utimensat | 294 | .long sys_utimensat |
| 295 | .long sys_signalfd | ||
| 296 | .long sys_timerfd /* 280 */ | ||
| 297 | .long sys_eventfd | ||
| 295 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ | 298 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ |
diff --git a/arch/avr32/mach-at32ap/at32ap7000.c b/arch/avr32/mach-at32ap/at32ap7000.c index 56db45b99a0f..1d2bf347a1d6 100644 --- a/arch/avr32/mach-at32ap/at32ap7000.c +++ b/arch/avr32/mach-at32ap/at32ap7000.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | * published by the Free Software Foundation. | 6 | * published by the Free Software Foundation. |
| 7 | */ | 7 | */ |
| 8 | #include <linux/clk.h> | 8 | #include <linux/clk.h> |
| 9 | #include <linux/fb.h> | ||
| 9 | #include <linux/init.h> | 10 | #include <linux/init.h> |
| 10 | #include <linux/platform_device.h> | 11 | #include <linux/platform_device.h> |
| 11 | #include <linux/spi/spi.h> | 12 | #include <linux/spi/spi.h> |
| @@ -17,6 +18,8 @@ | |||
| 17 | #include <asm/arch/portmux.h> | 18 | #include <asm/arch/portmux.h> |
| 18 | #include <asm/arch/sm.h> | 19 | #include <asm/arch/sm.h> |
| 19 | 20 | ||
| 21 | #include <video/atmel_lcdc.h> | ||
| 22 | |||
| 20 | #include "clock.h" | 23 | #include "clock.h" |
| 21 | #include "hmatrix.h" | 24 | #include "hmatrix.h" |
| 22 | #include "pio.h" | 25 | #include "pio.h" |
| @@ -881,20 +884,26 @@ at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n) | |||
| 881 | /* -------------------------------------------------------------------- | 884 | /* -------------------------------------------------------------------- |
| 882 | * LCDC | 885 | * LCDC |
| 883 | * -------------------------------------------------------------------- */ | 886 | * -------------------------------------------------------------------- */ |
| 884 | static struct lcdc_platform_data lcdc0_data; | 887 | static struct atmel_lcdfb_info atmel_lcdfb0_data; |
| 885 | static struct resource lcdc0_resource[] = { | 888 | static struct resource atmel_lcdfb0_resource[] = { |
| 886 | { | 889 | { |
| 887 | .start = 0xff000000, | 890 | .start = 0xff000000, |
| 888 | .end = 0xff000fff, | 891 | .end = 0xff000fff, |
| 889 | .flags = IORESOURCE_MEM, | 892 | .flags = IORESOURCE_MEM, |
| 890 | }, | 893 | }, |
| 891 | IRQ(1), | 894 | IRQ(1), |
| 895 | { | ||
| 896 | /* Placeholder for pre-allocated fb memory */ | ||
| 897 | .start = 0x00000000, | ||
| 898 | .end = 0x00000000, | ||
| 899 | .flags = 0, | ||
| 900 | }, | ||
| 892 | }; | 901 | }; |
| 893 | DEFINE_DEV_DATA(lcdc, 0); | 902 | DEFINE_DEV_DATA(atmel_lcdfb, 0); |
| 894 | DEV_CLK(hclk, lcdc0, hsb, 7); | 903 | DEV_CLK(hck1, atmel_lcdfb0, hsb, 7); |
| 895 | static struct clk lcdc0_pixclk = { | 904 | static struct clk atmel_lcdfb0_pixclk = { |
| 896 | .name = "pixclk", | 905 | .name = "lcdc_clk", |
| 897 | .dev = &lcdc0_device.dev, | 906 | .dev = &atmel_lcdfb0_device.dev, |
| 898 | .mode = genclk_mode, | 907 | .mode = genclk_mode, |
| 899 | .get_rate = genclk_get_rate, | 908 | .get_rate = genclk_get_rate, |
| 900 | .set_rate = genclk_set_rate, | 909 | .set_rate = genclk_set_rate, |
| @@ -903,13 +912,34 @@ static struct clk lcdc0_pixclk = { | |||
| 903 | }; | 912 | }; |
| 904 | 913 | ||
| 905 | struct platform_device *__init | 914 | struct platform_device *__init |
| 906 | at32_add_device_lcdc(unsigned int id, struct lcdc_platform_data *data) | 915 | at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data, |
| 916 | unsigned long fbmem_start, unsigned long fbmem_len) | ||
| 907 | { | 917 | { |
| 908 | struct platform_device *pdev; | 918 | struct platform_device *pdev; |
| 919 | struct atmel_lcdfb_info *info; | ||
| 920 | struct fb_monspecs *monspecs; | ||
| 921 | struct fb_videomode *modedb; | ||
| 922 | unsigned int modedb_size; | ||
| 923 | |||
| 924 | /* | ||
| 925 | * Do a deep copy of the fb data, monspecs and modedb. Make | ||
| 926 | * sure all allocations are done before setting up the | ||
| 927 | * portmux. | ||
| 928 | */ | ||
| 929 | monspecs = kmemdup(data->default_monspecs, | ||
| 930 | sizeof(struct fb_monspecs), GFP_KERNEL); | ||
| 931 | if (!monspecs) | ||
| 932 | return NULL; | ||
| 933 | |||
| 934 | modedb_size = sizeof(struct fb_videomode) * monspecs->modedb_len; | ||
| 935 | modedb = kmemdup(monspecs->modedb, modedb_size, GFP_KERNEL); | ||
| 936 | if (!modedb) | ||
| 937 | goto err_dup_modedb; | ||
| 938 | monspecs->modedb = modedb; | ||
| 909 | 939 | ||
| 910 | switch (id) { | 940 | switch (id) { |
| 911 | case 0: | 941 | case 0: |
| 912 | pdev = &lcdc0_device; | 942 | pdev = &atmel_lcdfb0_device; |
| 913 | select_peripheral(PC(19), PERIPH_A, 0); /* CC */ | 943 | select_peripheral(PC(19), PERIPH_A, 0); /* CC */ |
| 914 | select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC */ | 944 | select_peripheral(PC(20), PERIPH_A, 0); /* HSYNC */ |
| 915 | select_peripheral(PC(21), PERIPH_A, 0); /* PCLK */ | 945 | select_peripheral(PC(21), PERIPH_A, 0); /* PCLK */ |
| @@ -942,19 +972,32 @@ at32_add_device_lcdc(unsigned int id, struct lcdc_platform_data *data) | |||
| 942 | select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */ | 972 | select_peripheral(PD(16), PERIPH_A, 0); /* DATA22 */ |
| 943 | select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */ | 973 | select_peripheral(PD(17), PERIPH_A, 0); /* DATA23 */ |
| 944 | 974 | ||
| 945 | clk_set_parent(&lcdc0_pixclk, &pll0); | 975 | clk_set_parent(&atmel_lcdfb0_pixclk, &pll0); |
| 946 | clk_set_rate(&lcdc0_pixclk, clk_get_rate(&pll0)); | 976 | clk_set_rate(&atmel_lcdfb0_pixclk, clk_get_rate(&pll0)); |
| 947 | break; | 977 | break; |
| 948 | 978 | ||
| 949 | default: | 979 | default: |
| 950 | return NULL; | 980 | goto err_invalid_id; |
| 951 | } | 981 | } |
| 952 | 982 | ||
| 953 | memcpy(pdev->dev.platform_data, data, | 983 | if (fbmem_len) { |
| 954 | sizeof(struct lcdc_platform_data)); | 984 | pdev->resource[2].start = fbmem_start; |
| 985 | pdev->resource[2].end = fbmem_start + fbmem_len - 1; | ||
| 986 | pdev->resource[2].flags = IORESOURCE_MEM; | ||
| 987 | } | ||
| 988 | |||
| 989 | info = pdev->dev.platform_data; | ||
| 990 | memcpy(info, data, sizeof(struct atmel_lcdfb_info)); | ||
| 991 | info->default_monspecs = monspecs; | ||
| 955 | 992 | ||
| 956 | platform_device_register(pdev); | 993 | platform_device_register(pdev); |
| 957 | return pdev; | 994 | return pdev; |
| 995 | |||
| 996 | err_invalid_id: | ||
| 997 | kfree(modedb); | ||
| 998 | err_dup_modedb: | ||
| 999 | kfree(monspecs); | ||
| 1000 | return NULL; | ||
| 958 | } | 1001 | } |
| 959 | 1002 | ||
| 960 | /* -------------------------------------------------------------------- | 1003 | /* -------------------------------------------------------------------- |
| @@ -1037,8 +1080,8 @@ struct clk *at32_clock_list[] = { | |||
| 1037 | &macb1_pclk, | 1080 | &macb1_pclk, |
| 1038 | &atmel_spi0_spi_clk, | 1081 | &atmel_spi0_spi_clk, |
| 1039 | &atmel_spi1_spi_clk, | 1082 | &atmel_spi1_spi_clk, |
| 1040 | &lcdc0_hclk, | 1083 | &atmel_lcdfb0_hck1, |
| 1041 | &lcdc0_pixclk, | 1084 | &atmel_lcdfb0_pixclk, |
| 1042 | &gclk0, | 1085 | &gclk0, |
| 1043 | &gclk1, | 1086 | &gclk1, |
| 1044 | &gclk2, | 1087 | &gclk2, |
| @@ -1077,7 +1120,7 @@ void __init at32_clock_init(void) | |||
| 1077 | genclk_init_parent(&gclk2); | 1120 | genclk_init_parent(&gclk2); |
| 1078 | genclk_init_parent(&gclk3); | 1121 | genclk_init_parent(&gclk3); |
| 1079 | genclk_init_parent(&gclk4); | 1122 | genclk_init_parent(&gclk4); |
| 1080 | genclk_init_parent(&lcdc0_pixclk); | 1123 | genclk_init_parent(&atmel_lcdfb0_pixclk); |
| 1081 | 1124 | ||
| 1082 | /* | 1125 | /* |
| 1083 | * Turn on all clocks that have at least one user already, and | 1126 | * Turn on all clocks that have at least one user already, and |
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c index 88b00b15970f..e011f1ce1875 100644 --- a/arch/avr32/mm/fault.c +++ b/arch/avr32/mm/fault.c | |||
| @@ -12,41 +12,30 @@ | |||
| 12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 14 | #include <linux/pagemap.h> | 14 | #include <linux/pagemap.h> |
| 15 | |||
| 16 | #include <linux/kdebug.h> | 15 | #include <linux/kdebug.h> |
| 16 | #include <linux/kprobes.h> | ||
| 17 | |||
| 17 | #include <asm/mmu_context.h> | 18 | #include <asm/mmu_context.h> |
| 18 | #include <asm/sysreg.h> | 19 | #include <asm/sysreg.h> |
| 19 | #include <asm/tlb.h> | 20 | #include <asm/tlb.h> |
| 20 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
| 21 | 22 | ||
| 22 | #ifdef CONFIG_KPROBES | 23 | #ifdef CONFIG_KPROBES |
| 23 | ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain); | 24 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
| 24 | |||
| 25 | /* Hook to register for page fault notifications */ | ||
| 26 | int register_page_fault_notifier(struct notifier_block *nb) | ||
| 27 | { | 25 | { |
| 28 | return atomic_notifier_chain_register(¬ify_page_fault_chain, nb); | 26 | int ret = 0; |
| 29 | } | ||
| 30 | 27 | ||
| 31 | int unregister_page_fault_notifier(struct notifier_block *nb) | 28 | if (!user_mode(regs)) { |
| 32 | { | 29 | if (kprobe_running() && kprobe_fault_handler(regs, trap)) |
| 33 | return atomic_notifier_chain_unregister(¬ify_page_fault_chain, nb); | 30 | ret = 1; |
| 34 | } | 31 | } |
| 35 | 32 | ||
| 36 | static inline int notify_page_fault(enum die_val val, struct pt_regs *regs, | 33 | return ret; |
| 37 | int trap, int sig) | ||
| 38 | { | ||
| 39 | struct die_args args = { | ||
| 40 | .regs = regs, | ||
| 41 | .trapnr = trap, | ||
| 42 | }; | ||
| 43 | return atomic_notifier_call_chain(¬ify_page_fault_chain, val, &args); | ||
| 44 | } | 34 | } |
| 45 | #else | 35 | #else |
| 46 | static inline int notify_page_fault(enum die_val val, struct pt_regs *regs, | 36 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
| 47 | int trap, int sig) | ||
| 48 | { | 37 | { |
| 49 | return NOTIFY_DONE; | 38 | return 0; |
| 50 | } | 39 | } |
| 51 | #endif | 40 | #endif |
| 52 | 41 | ||
| @@ -76,8 +65,7 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs) | |||
| 76 | long signr; | 65 | long signr; |
| 77 | int code; | 66 | int code; |
| 78 | 67 | ||
| 79 | if (notify_page_fault(DIE_PAGE_FAULT, regs, | 68 | if (notify_page_fault(regs, ecr)) |
| 80 | ecr, SIGSEGV) == NOTIFY_STOP) | ||
| 81 | return; | 69 | return; |
| 82 | 70 | ||
| 83 | address = sysreg_read(TLBEAR); | 71 | address = sysreg_read(TLBEAR); |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 3549c94467b8..c4784494970e 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
| @@ -791,7 +791,7 @@ static __init int setup_additional_cpus(char *s) | |||
| 791 | early_param("additional_cpus", setup_additional_cpus); | 791 | early_param("additional_cpus", setup_additional_cpus); |
| 792 | 792 | ||
| 793 | /* | 793 | /* |
| 794 | * cpu_possible_map should be static, it cannot change as cpu's | 794 | * cpu_possible_map should be static, it cannot change as CPUs |
| 795 | * are onlined, or offlined. The reason is per-cpu data-structures | 795 | * are onlined, or offlined. The reason is per-cpu data-structures |
| 796 | * are allocated by some modules at init time, and dont expect to | 796 | * are allocated by some modules at init time, and dont expect to |
| 797 | * do this dynamically on cpu arrival/departure. | 797 | * do this dynamically on cpu arrival/departure. |
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c index aeb79fb28f0b..1d64ef478dde 100644 --- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c | |||
| @@ -156,24 +156,30 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data) | |||
| 156 | if (!kdump_on_init) | 156 | if (!kdump_on_init) |
| 157 | return NOTIFY_DONE; | 157 | return NOTIFY_DONE; |
| 158 | 158 | ||
| 159 | if (val != DIE_INIT_MONARCH_ENTER && | 159 | if (val != DIE_INIT_MONARCH_LEAVE && |
| 160 | val != DIE_INIT_SLAVE_ENTER && | 160 | val != DIE_INIT_SLAVE_LEAVE && |
| 161 | val != DIE_INIT_MONARCH_PROCESS && | ||
| 161 | val != DIE_MCA_RENDZVOUS_LEAVE && | 162 | val != DIE_MCA_RENDZVOUS_LEAVE && |
| 162 | val != DIE_MCA_MONARCH_LEAVE) | 163 | val != DIE_MCA_MONARCH_LEAVE) |
| 163 | return NOTIFY_DONE; | 164 | return NOTIFY_DONE; |
| 164 | 165 | ||
| 165 | nd = (struct ia64_mca_notify_die *)args->err; | 166 | nd = (struct ia64_mca_notify_die *)args->err; |
| 166 | /* Reason code 1 means machine check rendezous*/ | 167 | /* Reason code 1 means machine check rendezvous*/ |
| 167 | if ((val == DIE_INIT_MONARCH_ENTER || val == DIE_INIT_SLAVE_ENTER) && | 168 | if ((val == DIE_INIT_MONARCH_LEAVE || val == DIE_INIT_SLAVE_LEAVE |
| 168 | nd->sos->rv_rc == 1) | 169 | || val == DIE_INIT_MONARCH_PROCESS) && nd->sos->rv_rc == 1) |
| 169 | return NOTIFY_DONE; | 170 | return NOTIFY_DONE; |
| 170 | 171 | ||
| 171 | switch (val) { | 172 | switch (val) { |
| 172 | case DIE_INIT_MONARCH_ENTER: | 173 | case DIE_INIT_MONARCH_PROCESS: |
| 174 | atomic_set(&kdump_in_progress, 1); | ||
| 175 | *(nd->monarch_cpu) = -1; | ||
| 176 | break; | ||
| 177 | case DIE_INIT_MONARCH_LEAVE: | ||
| 173 | machine_kdump_on_init(); | 178 | machine_kdump_on_init(); |
| 174 | break; | 179 | break; |
| 175 | case DIE_INIT_SLAVE_ENTER: | 180 | case DIE_INIT_SLAVE_LEAVE: |
| 176 | unw_init_running(kdump_cpu_freeze, NULL); | 181 | if (atomic_read(&kdump_in_progress)) |
| 182 | unw_init_running(kdump_cpu_freeze, NULL); | ||
| 177 | break; | 183 | break; |
| 178 | case DIE_MCA_RENDZVOUS_LEAVE: | 184 | case DIE_MCA_RENDZVOUS_LEAVE: |
| 179 | if (atomic_read(&kdump_in_progress)) | 185 | if (atomic_read(&kdump_in_progress)) |
| @@ -215,8 +221,10 @@ static ctl_table sys_table[] = { | |||
| 215 | static int | 221 | static int |
| 216 | machine_crash_setup(void) | 222 | machine_crash_setup(void) |
| 217 | { | 223 | { |
| 224 | /* be notified before default_monarch_init_process */ | ||
| 218 | static struct notifier_block kdump_init_notifier_nb = { | 225 | static struct notifier_block kdump_init_notifier_nb = { |
| 219 | .notifier_call = kdump_init_notifier, | 226 | .notifier_call = kdump_init_notifier, |
| 227 | .priority = 1, | ||
| 220 | }; | 228 | }; |
| 221 | int ret; | 229 | int ret; |
| 222 | if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0) | 230 | if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0) |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 144b056282af..95f517515235 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
| @@ -1585,5 +1585,8 @@ sys_call_table: | |||
| 1585 | data8 sys_getcpu | 1585 | data8 sys_getcpu |
| 1586 | data8 sys_epoll_pwait // 1305 | 1586 | data8 sys_epoll_pwait // 1305 |
| 1587 | data8 sys_utimensat | 1587 | data8 sys_utimensat |
| 1588 | data8 sys_signalfd | ||
| 1589 | data8 sys_timerfd | ||
| 1590 | data8 sys_eventfd | ||
| 1588 | 1591 | ||
| 1589 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls | 1592 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index b4c239685d2e..407b45870489 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar | 4 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar |
| 5 | * | 5 | * |
| 6 | * This file contains the code used by various IRQ handling routines: | 6 | * This file contains the code used by various IRQ handling routines: |
| 7 | * asking for different IRQ's should be done through these routines | 7 | * asking for different IRQs should be done through these routines |
| 8 | * instead of just grabbing them. Thus setups with different IRQ numbers | 8 | * instead of just grabbing them. Thus setups with different IRQ numbers |
| 9 | * shouldn't result in any weird surprises, and installing new handlers | 9 | * shouldn't result in any weird surprises, and installing new handlers |
| 10 | * should be easier. | 10 | * should be easier. |
| @@ -12,7 +12,7 @@ | |||
| 12 | * Copyright (C) Ashok Raj<ashok.raj@intel.com>, Intel Corporation 2004 | 12 | * Copyright (C) Ashok Raj<ashok.raj@intel.com>, Intel Corporation 2004 |
| 13 | * | 13 | * |
| 14 | * 4/14/2004: Added code to handle cpu migration and do safe irq | 14 | * 4/14/2004: Added code to handle cpu migration and do safe irq |
| 15 | * migration without lossing interrupts for iosapic | 15 | * migration without losing interrupts for iosapic |
| 16 | * architecture. | 16 | * architecture. |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| @@ -190,7 +190,7 @@ void fixup_irqs(void) | |||
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | /* | 192 | /* |
| 193 | * Phase 1: Locate irq's bound to this cpu and | 193 | * Phase 1: Locate IRQs bound to this cpu and |
| 194 | * relocate them for cpu removal. | 194 | * relocate them for cpu removal. |
| 195 | */ | 195 | */ |
| 196 | migrate_irqs(); | 196 | migrate_irqs(); |
diff --git a/arch/ia64/kernel/irq_lsapic.c b/arch/ia64/kernel/irq_lsapic.c index c2f07beb1759..e56a7a36aca3 100644 --- a/arch/ia64/kernel/irq_lsapic.c +++ b/arch/ia64/kernel/irq_lsapic.c | |||
| @@ -23,7 +23,7 @@ lsapic_noop_startup (unsigned int irq) | |||
| 23 | static void | 23 | static void |
| 24 | lsapic_noop (unsigned int irq) | 24 | lsapic_noop (unsigned int irq) |
| 25 | { | 25 | { |
| 26 | /* nuthing to do... */ | 26 | /* nothing to do... */ |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | static int lsapic_retrigger(unsigned int irq) | 29 | static int lsapic_retrigger(unsigned int irq) |
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 72e593e94053..5bc46f151344 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
| @@ -151,12 +151,12 @@ static uint __kprobes is_cmp_ctype_unc_inst(uint template, uint slot, | |||
| 151 | 151 | ||
| 152 | cmp_inst.l = kprobe_inst; | 152 | cmp_inst.l = kprobe_inst; |
| 153 | if ((cmp_inst.f.x2 == 0) || (cmp_inst.f.x2 == 1)) { | 153 | if ((cmp_inst.f.x2 == 0) || (cmp_inst.f.x2 == 1)) { |
| 154 | /* Integere compare - Register Register (A6 type)*/ | 154 | /* Integer compare - Register Register (A6 type)*/ |
| 155 | if ((cmp_inst.f.tb == 0) && (cmp_inst.f.ta == 0) | 155 | if ((cmp_inst.f.tb == 0) && (cmp_inst.f.ta == 0) |
| 156 | &&(cmp_inst.f.c == 1)) | 156 | &&(cmp_inst.f.c == 1)) |
| 157 | ctype_unc = 1; | 157 | ctype_unc = 1; |
| 158 | } else if ((cmp_inst.f.x2 == 2)||(cmp_inst.f.x2 == 3)) { | 158 | } else if ((cmp_inst.f.x2 == 2)||(cmp_inst.f.x2 == 3)) { |
| 159 | /* Integere compare - Immediate Register (A8 type)*/ | 159 | /* Integer compare - Immediate Register (A8 type)*/ |
| 160 | if ((cmp_inst.f.ta == 0) &&(cmp_inst.f.c == 1)) | 160 | if ((cmp_inst.f.ta == 0) &&(cmp_inst.f.c == 1)) |
| 161 | ctype_unc = 1; | 161 | ctype_unc = 1; |
| 162 | } | 162 | } |
| @@ -820,7 +820,7 @@ out: | |||
| 820 | return 1; | 820 | return 1; |
| 821 | } | 821 | } |
| 822 | 822 | ||
| 823 | static int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr) | 823 | int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr) |
| 824 | { | 824 | { |
| 825 | struct kprobe *cur = kprobe_running(); | 825 | struct kprobe *cur = kprobe_running(); |
| 826 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 826 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
| @@ -904,13 +904,6 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
| 904 | if (post_kprobes_handler(args->regs)) | 904 | if (post_kprobes_handler(args->regs)) |
| 905 | ret = NOTIFY_STOP; | 905 | ret = NOTIFY_STOP; |
| 906 | break; | 906 | break; |
| 907 | case DIE_PAGE_FAULT: | ||
| 908 | /* kprobe_running() needs smp_processor_id() */ | ||
| 909 | preempt_disable(); | ||
| 910 | if (kprobe_running() && | ||
| 911 | kprobes_fault_handler(args->regs, args->trapnr)) | ||
| 912 | ret = NOTIFY_STOP; | ||
| 913 | preempt_enable(); | ||
| 914 | default: | 907 | default: |
| 915 | break; | 908 | break; |
| 916 | } | 909 | } |
| @@ -954,7 +947,7 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 954 | /* | 947 | /* |
| 955 | * Callee owns the argument space and could overwrite it, eg | 948 | * Callee owns the argument space and could overwrite it, eg |
| 956 | * tail call optimization. So to be absolutely safe | 949 | * tail call optimization. So to be absolutely safe |
| 957 | * we save the argument space before transfering the control | 950 | * we save the argument space before transferring the control |
| 958 | * to instrumented jprobe function which runs in | 951 | * to instrumented jprobe function which runs in |
| 959 | * the process context | 952 | * the process context |
| 960 | */ | 953 | */ |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 26814de6c29a..1ead5ea6c5ce 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
| @@ -273,7 +273,6 @@ static void ia64_mlogbuf_finish(int wait) | |||
| 273 | 273 | ||
| 274 | mlogbuf_finished = 1; | 274 | mlogbuf_finished = 1; |
| 275 | } | 275 | } |
| 276 | EXPORT_SYMBOL(ia64_mlogbuf_finish); | ||
| 277 | 276 | ||
| 278 | /* | 277 | /* |
| 279 | * Print buffered messages from INIT context. | 278 | * Print buffered messages from INIT context. |
| @@ -1477,6 +1476,10 @@ default_monarch_init_process(struct notifier_block *self, unsigned long val, voi | |||
| 1477 | struct task_struct *g, *t; | 1476 | struct task_struct *g, *t; |
| 1478 | if (val != DIE_INIT_MONARCH_PROCESS) | 1477 | if (val != DIE_INIT_MONARCH_PROCESS) |
| 1479 | return NOTIFY_DONE; | 1478 | return NOTIFY_DONE; |
| 1479 | #ifdef CONFIG_KEXEC | ||
| 1480 | if (atomic_read(&kdump_in_progress)) | ||
| 1481 | return NOTIFY_DONE; | ||
| 1482 | #endif | ||
| 1480 | 1483 | ||
| 1481 | /* | 1484 | /* |
| 1482 | * FIXME: mlogbuf will brim over with INIT stack dumps. | 1485 | * FIXME: mlogbuf will brim over with INIT stack dumps. |
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c index 70b8bdbb7e6f..aba813c2c150 100644 --- a/arch/ia64/kernel/mca_drv.c +++ b/arch/ia64/kernel/mca_drv.c | |||
| @@ -438,7 +438,7 @@ is_mca_global(peidx_table_t *peidx, pal_bus_check_info_t *pbci, | |||
| 438 | * @peidx: pointer of index of processor error section | 438 | * @peidx: pointer of index of processor error section |
| 439 | * | 439 | * |
| 440 | * Return value: | 440 | * Return value: |
| 441 | * target address on Success / 0 on Failue | 441 | * target address on Success / 0 on Failure |
| 442 | */ | 442 | */ |
| 443 | static u64 | 443 | static u64 |
| 444 | get_target_identifier(peidx_table_t *peidx) | 444 | get_target_identifier(peidx_table_t *peidx) |
| @@ -701,7 +701,7 @@ recover_from_processor_error(int platform, slidx_table_t *slidx, | |||
| 701 | return fatal_mca("External bus check fatal status"); | 701 | return fatal_mca("External bus check fatal status"); |
| 702 | 702 | ||
| 703 | /* | 703 | /* |
| 704 | * This is a local MCA and estimated as a recoverble error. | 704 | * This is a local MCA and estimated as a recoverable error. |
| 705 | */ | 705 | */ |
| 706 | if (platform) | 706 | if (platform) |
| 707 | return recover_from_platform_error(slidx, peidx, pbci, sos); | 707 | return recover_from_platform_error(slidx, peidx, pbci, sos); |
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index 158e3c51bb77..196287928bae 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
| @@ -861,7 +861,7 @@ apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex, | |||
| 861 | /* | 861 | /* |
| 862 | * Modules contain a single unwind table which covers both the core and the init text | 862 | * Modules contain a single unwind table which covers both the core and the init text |
| 863 | * sections but since the two are not contiguous, we need to split this table up such that | 863 | * sections but since the two are not contiguous, we need to split this table up such that |
| 864 | * we can register (and unregister) each "segment" seperately. Fortunately, this sounds | 864 | * we can register (and unregister) each "segment" separately. Fortunately, this sounds |
| 865 | * more complicated than it really is. | 865 | * more complicated than it really is. |
| 866 | */ | 866 | */ |
| 867 | static void | 867 | static void |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index e7191ca30b16..b7133cabdbea 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
| @@ -1318,7 +1318,7 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu) | |||
| 1318 | { | 1318 | { |
| 1319 | unsigned long flags; | 1319 | unsigned long flags; |
| 1320 | /* | 1320 | /* |
| 1321 | * validy checks on cpu_mask have been done upstream | 1321 | * validity checks on cpu_mask have been done upstream |
| 1322 | */ | 1322 | */ |
| 1323 | LOCK_PFS(flags); | 1323 | LOCK_PFS(flags); |
| 1324 | 1324 | ||
| @@ -1384,7 +1384,7 @@ pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu) | |||
| 1384 | { | 1384 | { |
| 1385 | unsigned long flags; | 1385 | unsigned long flags; |
| 1386 | /* | 1386 | /* |
| 1387 | * validy checks on cpu_mask have been done upstream | 1387 | * validity checks on cpu_mask have been done upstream |
| 1388 | */ | 1388 | */ |
| 1389 | LOCK_PFS(flags); | 1389 | LOCK_PFS(flags); |
| 1390 | 1390 | ||
| @@ -1835,7 +1835,7 @@ pfm_flush(struct file *filp, fl_owner_t id) | |||
| 1835 | /* | 1835 | /* |
| 1836 | * remove our file from the async queue, if we use this mode. | 1836 | * remove our file from the async queue, if we use this mode. |
| 1837 | * This can be done without the context being protected. We come | 1837 | * This can be done without the context being protected. We come |
| 1838 | * here when the context has become unreacheable by other tasks. | 1838 | * here when the context has become unreachable by other tasks. |
| 1839 | * | 1839 | * |
| 1840 | * We may still have active monitoring at this point and we may | 1840 | * We may still have active monitoring at this point and we may |
| 1841 | * end up in pfm_overflow_handler(). However, fasync_helper() | 1841 | * end up in pfm_overflow_handler(). However, fasync_helper() |
| @@ -2132,7 +2132,7 @@ doit: | |||
| 2132 | filp->private_data = NULL; | 2132 | filp->private_data = NULL; |
| 2133 | 2133 | ||
| 2134 | /* | 2134 | /* |
| 2135 | * if we free on the spot, the context is now completely unreacheable | 2135 | * if we free on the spot, the context is now completely unreachable |
| 2136 | * from the callers side. The monitored task side is also cut, so we | 2136 | * from the callers side. The monitored task side is also cut, so we |
| 2137 | * can freely cut. | 2137 | * can freely cut. |
| 2138 | * | 2138 | * |
| @@ -2562,7 +2562,7 @@ pfm_reset_pmu_state(pfm_context_t *ctx) | |||
| 2562 | ctx->ctx_all_pmcs[0] = pmu_conf->impl_pmcs[0] & ~0x1; | 2562 | ctx->ctx_all_pmcs[0] = pmu_conf->impl_pmcs[0] & ~0x1; |
| 2563 | 2563 | ||
| 2564 | /* | 2564 | /* |
| 2565 | * bitmask of all PMDs that are accesible to this context | 2565 | * bitmask of all PMDs that are accessible to this context |
| 2566 | */ | 2566 | */ |
| 2567 | ctx->ctx_all_pmds[0] = pmu_conf->impl_pmds[0]; | 2567 | ctx->ctx_all_pmds[0] = pmu_conf->impl_pmds[0]; |
| 2568 | 2568 | ||
| @@ -3395,7 +3395,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs) | |||
| 3395 | if (unlikely(!PMD_IS_IMPL(cnum))) goto error; | 3395 | if (unlikely(!PMD_IS_IMPL(cnum))) goto error; |
| 3396 | /* | 3396 | /* |
| 3397 | * we can only read the register that we use. That includes | 3397 | * we can only read the register that we use. That includes |
| 3398 | * the one we explicitely initialize AND the one we want included | 3398 | * the one we explicitly initialize AND the one we want included |
| 3399 | * in the sampling buffer (smpl_regs). | 3399 | * in the sampling buffer (smpl_regs). |
| 3400 | * | 3400 | * |
| 3401 | * Having this restriction allows optimization in the ctxsw routine | 3401 | * Having this restriction allows optimization in the ctxsw routine |
| @@ -3715,7 +3715,7 @@ pfm_restart(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs) | |||
| 3715 | * if non-blocking, then we ensure that the task will go into | 3715 | * if non-blocking, then we ensure that the task will go into |
| 3716 | * pfm_handle_work() before returning to user mode. | 3716 | * pfm_handle_work() before returning to user mode. |
| 3717 | * | 3717 | * |
| 3718 | * We cannot explicitely reset another task, it MUST always | 3718 | * We cannot explicitly reset another task, it MUST always |
| 3719 | * be done by the task itself. This works for system wide because | 3719 | * be done by the task itself. This works for system wide because |
| 3720 | * the tool that is controlling the session is logically doing | 3720 | * the tool that is controlling the session is logically doing |
| 3721 | * "self-monitoring". | 3721 | * "self-monitoring". |
| @@ -4644,7 +4644,7 @@ pfm_exit_thread(struct task_struct *task) | |||
| 4644 | switch(state) { | 4644 | switch(state) { |
| 4645 | case PFM_CTX_UNLOADED: | 4645 | case PFM_CTX_UNLOADED: |
| 4646 | /* | 4646 | /* |
| 4647 | * only comes to thios function if pfm_context is not NULL, i.e., cannot | 4647 | * only comes to this function if pfm_context is not NULL, i.e., cannot |
| 4648 | * be in unloaded state | 4648 | * be in unloaded state |
| 4649 | */ | 4649 | */ |
| 4650 | printk(KERN_ERR "perfmon: pfm_exit_thread [%d] ctx unloaded\n", task->pid); | 4650 | printk(KERN_ERR "perfmon: pfm_exit_thread [%d] ctx unloaded\n", task->pid); |
| @@ -5247,7 +5247,7 @@ pfm_end_notify_user(pfm_context_t *ctx) | |||
| 5247 | 5247 | ||
| 5248 | /* | 5248 | /* |
| 5249 | * main overflow processing routine. | 5249 | * main overflow processing routine. |
| 5250 | * it can be called from the interrupt path or explicitely during the context switch code | 5250 | * it can be called from the interrupt path or explicitly during the context switch code |
| 5251 | */ | 5251 | */ |
| 5252 | static void | 5252 | static void |
| 5253 | pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, struct pt_regs *regs) | 5253 | pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, struct pt_regs *regs) |
diff --git a/arch/ia64/kernel/perfmon_mckinley.h b/arch/ia64/kernel/perfmon_mckinley.h index 9becccda2897..c4bec7a9d18f 100644 --- a/arch/ia64/kernel/perfmon_mckinley.h +++ b/arch/ia64/kernel/perfmon_mckinley.h | |||
| @@ -181,7 +181,7 @@ static pmu_config_t pmu_conf_mck={ | |||
| 181 | .pmc_desc = pfm_mck_pmc_desc, | 181 | .pmc_desc = pfm_mck_pmc_desc, |
| 182 | .num_ibrs = 8, | 182 | .num_ibrs = 8, |
| 183 | .num_dbrs = 8, | 183 | .num_dbrs = 8, |
| 184 | .use_rr_dbregs = 1 /* debug register are use for range retrictions */ | 184 | .use_rr_dbregs = 1 /* debug register are use for range restrictions */ |
| 185 | }; | 185 | }; |
| 186 | 186 | ||
| 187 | 187 | ||
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index 37c876f95dba..27c2ef445a56 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
| @@ -134,7 +134,7 @@ set_smp_redirect (int flag) | |||
| 134 | * interrupt redirection. The reason is this would require that | 134 | * interrupt redirection. The reason is this would require that |
| 135 | * All interrupts be stopped and hard bind the irq to a cpu. | 135 | * All interrupts be stopped and hard bind the irq to a cpu. |
| 136 | * Later when the interrupt is fired we need to set the redir hint | 136 | * Later when the interrupt is fired we need to set the redir hint |
| 137 | * on again in the vector. This is combersome for something that the | 137 | * on again in the vector. This is cumbersome for something that the |
| 138 | * user mode irq balancer will solve anyways. | 138 | * user mode irq balancer will solve anyways. |
| 139 | */ | 139 | */ |
| 140 | no_int_routing=1; | 140 | no_int_routing=1; |
diff --git a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c index 89f6b138a62c..25cd75f50ab1 100644 --- a/arch/ia64/kernel/salinfo.c +++ b/arch/ia64/kernel/salinfo.c | |||
| @@ -162,7 +162,7 @@ static DEFINE_SPINLOCK(data_saved_lock); | |||
| 162 | /** salinfo_platform_oemdata - optional callback to decode oemdata from an error | 162 | /** salinfo_platform_oemdata - optional callback to decode oemdata from an error |
| 163 | * record. | 163 | * record. |
| 164 | * @sect_header: pointer to the start of the section to decode. | 164 | * @sect_header: pointer to the start of the section to decode. |
| 165 | * @oemdata: returns vmalloc area containing the decded output. | 165 | * @oemdata: returns vmalloc area containing the decoded output. |
| 166 | * @oemdata_size: returns length of decoded output (strlen). | 166 | * @oemdata_size: returns length of decoded output (strlen). |
| 167 | * | 167 | * |
| 168 | * Description: If user space asks for oem data to be decoded by the kernel | 168 | * Description: If user space asks for oem data to be decoded by the kernel |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 9df1efe7487d..eaa6a24bc0b6 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
| @@ -576,7 +576,7 @@ setup_arch (char **cmdline_p) | |||
| 576 | } | 576 | } |
| 577 | 577 | ||
| 578 | /* | 578 | /* |
| 579 | * Display cpu info for all cpu's. | 579 | * Display cpu info for all CPUs. |
| 580 | */ | 580 | */ |
| 581 | static int | 581 | static int |
| 582 | show_cpuinfo (struct seq_file *m, void *v) | 582 | show_cpuinfo (struct seq_file *m, void *v) |
| @@ -761,7 +761,7 @@ identify_cpu (struct cpuinfo_ia64 *c) | |||
| 761 | c->cpu = smp_processor_id(); | 761 | c->cpu = smp_processor_id(); |
| 762 | 762 | ||
| 763 | /* below default values will be overwritten by identify_siblings() | 763 | /* below default values will be overwritten by identify_siblings() |
| 764 | * for Multi-Threading/Multi-Core capable cpu's | 764 | * for Multi-Threading/Multi-Core capable CPUs |
| 765 | */ | 765 | */ |
| 766 | c->threads_per_core = c->cores_per_socket = c->num_log = 1; | 766 | c->threads_per_core = c->cores_per_socket = c->num_log = 1; |
| 767 | c->socket_id = -1; | 767 | c->socket_id = -1; |
| @@ -947,7 +947,7 @@ cpu_init (void) | |||
| 947 | ia32_cpu_init(); | 947 | ia32_cpu_init(); |
| 948 | #endif | 948 | #endif |
| 949 | 949 | ||
| 950 | /* Clear ITC to eliminiate sched_clock() overflows in human time. */ | 950 | /* Clear ITC to eliminate sched_clock() overflows in human time. */ |
| 951 | ia64_set_itc(0); | 951 | ia64_set_itc(0); |
| 952 | 952 | ||
| 953 | /* disable all local interrupt sources: */ | 953 | /* disable all local interrupt sources: */ |
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index 221de3804560..b3a47f986e1e 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
| @@ -186,7 +186,7 @@ handle_IPI (int irq, void *dev_id) | |||
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | /* | 188 | /* |
| 189 | * Called with preeemption disabled. | 189 | * Called with preemption disabled. |
| 190 | */ | 190 | */ |
| 191 | static inline void | 191 | static inline void |
| 192 | send_IPI_single (int dest_cpu, int op) | 192 | send_IPI_single (int dest_cpu, int op) |
| @@ -196,7 +196,7 @@ send_IPI_single (int dest_cpu, int op) | |||
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | /* | 198 | /* |
| 199 | * Called with preeemption disabled. | 199 | * Called with preemption disabled. |
| 200 | */ | 200 | */ |
| 201 | static inline void | 201 | static inline void |
| 202 | send_IPI_allbutself (int op) | 202 | send_IPI_allbutself (int op) |
| @@ -210,7 +210,7 @@ send_IPI_allbutself (int op) | |||
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | /* | 212 | /* |
| 213 | * Called with preeemption disabled. | 213 | * Called with preemption disabled. |
| 214 | */ | 214 | */ |
| 215 | static inline void | 215 | static inline void |
| 216 | send_IPI_all (int op) | 216 | send_IPI_all (int op) |
| @@ -223,7 +223,7 @@ send_IPI_all (int op) | |||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | /* | 225 | /* |
| 226 | * Called with preeemption disabled. | 226 | * Called with preemption disabled. |
| 227 | */ | 227 | */ |
| 228 | static inline void | 228 | static inline void |
| 229 | send_IPI_self (int op) | 229 | send_IPI_self (int op) |
| @@ -252,7 +252,7 @@ kdump_smp_send_init(void) | |||
| 252 | } | 252 | } |
| 253 | #endif | 253 | #endif |
| 254 | /* | 254 | /* |
| 255 | * Called with preeemption disabled. | 255 | * Called with preemption disabled. |
| 256 | */ | 256 | */ |
| 257 | void | 257 | void |
| 258 | smp_send_reschedule (int cpu) | 258 | smp_send_reschedule (int cpu) |
| @@ -261,7 +261,7 @@ smp_send_reschedule (int cpu) | |||
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | /* | 263 | /* |
| 264 | * Called with preeemption disabled. | 264 | * Called with preemption disabled. |
| 265 | */ | 265 | */ |
| 266 | static void | 266 | static void |
| 267 | smp_send_local_flush_tlb (int cpu) | 267 | smp_send_local_flush_tlb (int cpu) |
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index a44792d0f3a9..542958079f1b 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
| @@ -694,7 +694,7 @@ int migrate_platform_irqs(unsigned int cpu) | |||
| 694 | set_cpei_target_cpu(new_cpei_cpu); | 694 | set_cpei_target_cpu(new_cpei_cpu); |
| 695 | desc = irq_desc + ia64_cpe_irq; | 695 | desc = irq_desc + ia64_cpe_irq; |
| 696 | /* | 696 | /* |
| 697 | * Switch for now, immediatly, we need to do fake intr | 697 | * Switch for now, immediately, we need to do fake intr |
| 698 | * as other interrupts, but need to study CPEI behaviour with | 698 | * as other interrupts, but need to study CPEI behaviour with |
| 699 | * polling before making changes. | 699 | * polling before making changes. |
| 700 | */ | 700 | */ |
| @@ -840,7 +840,7 @@ __cpu_up (unsigned int cpu) | |||
| 840 | } | 840 | } |
| 841 | 841 | ||
| 842 | /* | 842 | /* |
| 843 | * Assume that CPU's have been discovered by some platform-dependent interface. For | 843 | * Assume that CPUs have been discovered by some platform-dependent interface. For |
| 844 | * SoftSDV/Lion, that would be ACPI. | 844 | * SoftSDV/Lion, that would be ACPI. |
| 845 | * | 845 | * |
| 846 | * Setup of the IPI irq handler is done in irq.c:init_IRQ_SMP(). | 846 | * Setup of the IPI irq handler is done in irq.c:init_IRQ_SMP(). |
| @@ -854,7 +854,7 @@ init_smp_config(void) | |||
| 854 | } *ap_startup; | 854 | } *ap_startup; |
| 855 | long sal_ret; | 855 | long sal_ret; |
| 856 | 856 | ||
| 857 | /* Tell SAL where to drop the AP's. */ | 857 | /* Tell SAL where to drop the APs. */ |
| 858 | ap_startup = (struct fptr *) start_ap; | 858 | ap_startup = (struct fptr *) start_ap; |
| 859 | sal_ret = ia64_sal_set_vectors(SAL_VECTOR_OS_BOOT_RENDEZ, | 859 | sal_ret = ia64_sal_set_vectors(SAL_VECTOR_OS_BOOT_RENDEZ, |
| 860 | ia64_tpa(ap_startup->fp), ia64_tpa(ap_startup->gp), 0, 0, 0, 0); | 860 | ia64_tpa(ap_startup->fp), ia64_tpa(ap_startup->gp), 0, 0, 0, 0); |
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index b8e0d70bf989..15ad85da15a9 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c | |||
| @@ -304,7 +304,7 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr) | |||
| 304 | * Lower 4 bits are used as a count. Upper bits are a sequence | 304 | * Lower 4 bits are used as a count. Upper bits are a sequence |
| 305 | * number that is updated when count is reset. The cmpxchg will | 305 | * number that is updated when count is reset. The cmpxchg will |
| 306 | * fail is seqno has changed. This minimizes mutiple cpus | 306 | * fail is seqno has changed. This minimizes mutiple cpus |
| 307 | * reseting the count. | 307 | * resetting the count. |
| 308 | */ | 308 | */ |
| 309 | if (current_jiffies > last.time) | 309 | if (current_jiffies > last.time) |
| 310 | (void) cmpxchg_acq(&last.count, count, 16 + (count & ~15)); | 310 | (void) cmpxchg_acq(&last.count, count, 16 + (count & ~15)); |
diff --git a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c index fe1426266b9b..7d3dd6cdafa4 100644 --- a/arch/ia64/kernel/unwind.c +++ b/arch/ia64/kernel/unwind.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Copyright (C) 1999-2004 Hewlett-Packard Co | 2 | * Copyright (C) 1999-2004 Hewlett-Packard Co |
| 3 | * David Mosberger-Tang <davidm@hpl.hp.com> | 3 | * David Mosberger-Tang <davidm@hpl.hp.com> |
| 4 | * Copyright (C) 2003 Fenghua Yu <fenghua.yu@intel.com> | 4 | * Copyright (C) 2003 Fenghua Yu <fenghua.yu@intel.com> |
| 5 | * - Change pt_regs_off() to make it less dependant on pt_regs structure. | 5 | * - Change pt_regs_off() to make it less dependent on pt_regs structure. |
| 6 | */ | 6 | */ |
| 7 | /* | 7 | /* |
| 8 | * This file implements call frame unwind support for the Linux | 8 | * This file implements call frame unwind support for the Linux |
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 38085ac18338..0dbf0e81f8c0 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
| @@ -317,7 +317,7 @@ static void __meminit scatter_node_data(void) | |||
| 317 | * node_online_map is not set for hot-added nodes at this time, | 317 | * node_online_map is not set for hot-added nodes at this time, |
| 318 | * because we are halfway through initialization of the new node's | 318 | * because we are halfway through initialization of the new node's |
| 319 | * structures. If for_each_online_node() is used, a new node's | 319 | * structures. If for_each_online_node() is used, a new node's |
| 320 | * pg_data_ptrs will be not initialized. Insted of using it, | 320 | * pg_data_ptrs will be not initialized. Instead of using it, |
| 321 | * pgdat_list[] is checked. | 321 | * pgdat_list[] is checked. |
| 322 | */ | 322 | */ |
| 323 | for_each_node(node) { | 323 | for_each_node(node) { |
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index 21658e02116c..b87f785c2416 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c | |||
| @@ -19,36 +19,24 @@ | |||
| 19 | extern void die (char *, struct pt_regs *, long); | 19 | extern void die (char *, struct pt_regs *, long); |
| 20 | 20 | ||
| 21 | #ifdef CONFIG_KPROBES | 21 | #ifdef CONFIG_KPROBES |
| 22 | ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain); | 22 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
| 23 | |||
| 24 | /* Hook to register for page fault notifications */ | ||
| 25 | int register_page_fault_notifier(struct notifier_block *nb) | ||
| 26 | { | ||
| 27 | return atomic_notifier_chain_register(¬ify_page_fault_chain, nb); | ||
| 28 | } | ||
| 29 | |||
| 30 | int unregister_page_fault_notifier(struct notifier_block *nb) | ||
| 31 | { | 23 | { |
| 32 | return atomic_notifier_chain_unregister(¬ify_page_fault_chain, nb); | 24 | int ret = 0; |
| 33 | } | 25 | |
| 26 | if (!user_mode(regs)) { | ||
| 27 | /* kprobe_running() needs smp_processor_id() */ | ||
| 28 | preempt_disable(); | ||
| 29 | if (kprobe_running() && kprobes_fault_handler(regs, trap)) | ||
| 30 | ret = 1; | ||
| 31 | preempt_enable(); | ||
| 32 | } | ||
| 34 | 33 | ||
| 35 | static inline int notify_page_fault(enum die_val val, const char *str, | 34 | return ret; |
| 36 | struct pt_regs *regs, long err, int trap, int sig) | ||
| 37 | { | ||
| 38 | struct die_args args = { | ||
| 39 | .regs = regs, | ||
| 40 | .str = str, | ||
| 41 | .err = err, | ||
| 42 | .trapnr = trap, | ||
| 43 | .signr = sig | ||
| 44 | }; | ||
| 45 | return atomic_notifier_call_chain(¬ify_page_fault_chain, val, &args); | ||
| 46 | } | 35 | } |
| 47 | #else | 36 | #else |
| 48 | static inline int notify_page_fault(enum die_val val, const char *str, | 37 | static inline int notify_page_fault(struct pt_regs *regs, int trap) |
| 49 | struct pt_regs *regs, long err, int trap, int sig) | ||
| 50 | { | 38 | { |
| 51 | return NOTIFY_DONE; | 39 | return 0; |
| 52 | } | 40 | } |
| 53 | #endif | 41 | #endif |
| 54 | 42 | ||
| @@ -117,8 +105,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | |||
| 117 | /* | 105 | /* |
| 118 | * This is to handle the kprobes on user space access instructions | 106 | * This is to handle the kprobes on user space access instructions |
| 119 | */ | 107 | */ |
| 120 | if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, code, TRAP_BRKPT, | 108 | if (notify_page_fault(regs, TRAP_BRKPT)) |
| 121 | SIGSEGV) == NOTIFY_STOP) | ||
| 122 | return; | 109 | return; |
| 123 | 110 | ||
| 124 | down_read(&mm->mmap_sem); | 111 | down_read(&mm->mmap_sem); |
diff --git a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c index ff1c55601178..b362d6d6a8c8 100644 --- a/arch/ia64/sn/kernel/bte.c +++ b/arch/ia64/sn/kernel/bte.c | |||
| @@ -63,7 +63,7 @@ static inline void bte_start_transfer(struct bteinfo_s *bte, u64 len, u64 mode) | |||
| 63 | * Use the block transfer engine to move kernel memory from src to dest | 63 | * Use the block transfer engine to move kernel memory from src to dest |
| 64 | * using the assigned mode. | 64 | * using the assigned mode. |
| 65 | * | 65 | * |
| 66 | * Paramaters: | 66 | * Parameters: |
| 67 | * src - physical address of the transfer source. | 67 | * src - physical address of the transfer source. |
| 68 | * dest - physical address of the transfer destination. | 68 | * dest - physical address of the transfer destination. |
| 69 | * len - number of bytes to transfer from source to dest. | 69 | * len - number of bytes to transfer from source to dest. |
| @@ -247,7 +247,7 @@ EXPORT_SYMBOL(bte_copy); | |||
| 247 | * use the block transfer engine to move kernel | 247 | * use the block transfer engine to move kernel |
| 248 | * memory from src to dest using the assigned mode. | 248 | * memory from src to dest using the assigned mode. |
| 249 | * | 249 | * |
| 250 | * Paramaters: | 250 | * Parameters: |
| 251 | * src - physical address of the transfer source. | 251 | * src - physical address of the transfer source. |
| 252 | * dest - physical address of the transfer destination. | 252 | * dest - physical address of the transfer destination. |
| 253 | * len - number of bytes to transfer from source to dest. | 253 | * len - number of bytes to transfer from source to dest. |
| @@ -255,7 +255,7 @@ EXPORT_SYMBOL(bte_copy); | |||
| 255 | * for IBCT0/1 in the SGI documentation. | 255 | * for IBCT0/1 in the SGI documentation. |
| 256 | * | 256 | * |
| 257 | * NOTE: If the source, dest, and len are all cache line aligned, | 257 | * NOTE: If the source, dest, and len are all cache line aligned, |
| 258 | * then it would be _FAR_ preferrable to use bte_copy instead. | 258 | * then it would be _FAR_ preferable to use bte_copy instead. |
| 259 | */ | 259 | */ |
| 260 | bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | 260 | bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) |
| 261 | { | 261 | { |
| @@ -300,7 +300,7 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
| 300 | * a standard bte copy. | 300 | * a standard bte copy. |
| 301 | * | 301 | * |
| 302 | * One nasty exception to the above rule is when the | 302 | * One nasty exception to the above rule is when the |
| 303 | * source and destination are not symetrically | 303 | * source and destination are not symmetrically |
| 304 | * mis-aligned. If the source offset from the first | 304 | * mis-aligned. If the source offset from the first |
| 305 | * cache line is different from the destination offset, | 305 | * cache line is different from the destination offset, |
| 306 | * we make the first section be the entire transfer | 306 | * we make the first section be the entire transfer |
| @@ -337,7 +337,7 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
| 337 | 337 | ||
| 338 | if (footBcopyDest == (headBcopyDest + headBcopyLen)) { | 338 | if (footBcopyDest == (headBcopyDest + headBcopyLen)) { |
| 339 | /* | 339 | /* |
| 340 | * We have two contigous bcopy | 340 | * We have two contiguous bcopy |
| 341 | * blocks. Merge them. | 341 | * blocks. Merge them. |
| 342 | */ | 342 | */ |
| 343 | headBcopyLen += footBcopyLen; | 343 | headBcopyLen += footBcopyLen; |
| @@ -375,7 +375,7 @@ bte_result_t bte_unaligned_copy(u64 src, u64 dest, u64 len, u64 mode) | |||
| 375 | } else { | 375 | } else { |
| 376 | 376 | ||
| 377 | /* | 377 | /* |
| 378 | * The transfer is not symetric, we will | 378 | * The transfer is not symmetric, we will |
| 379 | * allocate a buffer large enough for all the | 379 | * allocate a buffer large enough for all the |
| 380 | * data, bte_copy into that buffer and then | 380 | * data, bte_copy into that buffer and then |
| 381 | * bcopy to the destination. | 381 | * bcopy to the destination. |
diff --git a/arch/ia64/sn/kernel/bte_error.c b/arch/ia64/sn/kernel/bte_error.c index b6fcf8164f2b..27c5936ccfe9 100644 --- a/arch/ia64/sn/kernel/bte_error.c +++ b/arch/ia64/sn/kernel/bte_error.c | |||
| @@ -105,7 +105,7 @@ int shub1_bte_error_handler(unsigned long _nodepda) | |||
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | BTE_PRINTK(("eh:%p:%d Cleaning up\n", err_nodepda, smp_processor_id())); | 107 | BTE_PRINTK(("eh:%p:%d Cleaning up\n", err_nodepda, smp_processor_id())); |
| 108 | /* Reenable both bte interfaces */ | 108 | /* Re-enable both bte interfaces */ |
| 109 | imem.ii_imem_regval = REMOTE_HUB_L(nasid, IIO_IMEM); | 109 | imem.ii_imem_regval = REMOTE_HUB_L(nasid, IIO_IMEM); |
| 110 | imem.ii_imem_fld_s.i_b0_esd = imem.ii_imem_fld_s.i_b1_esd = 1; | 110 | imem.ii_imem_fld_s.i_b0_esd = imem.ii_imem_fld_s.i_b1_esd = 1; |
| 111 | REMOTE_HUB_S(nasid, IIO_IMEM, imem.ii_imem_regval); | 111 | REMOTE_HUB_S(nasid, IIO_IMEM, imem.ii_imem_regval); |
| @@ -243,7 +243,7 @@ bte_crb_error_handler(cnodeid_t cnode, int btenum, | |||
| 243 | 243 | ||
| 244 | /* | 244 | /* |
| 245 | * The caller has already figured out the error type, we save that | 245 | * The caller has already figured out the error type, we save that |
| 246 | * in the bte handle structure for the thread excercising the | 246 | * in the bte handle structure for the thread exercising the |
| 247 | * interface to consume. | 247 | * interface to consume. |
| 248 | */ | 248 | */ |
| 249 | bte->bh_error = ioe->ie_errortype + BTEFAIL_OFFSET; | 249 | bte->bh_error = ioe->ie_errortype + BTEFAIL_OFFSET; |
diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index 7ed72d3faf73..787ed642dd49 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c | |||
| @@ -479,7 +479,7 @@ sn_io_early_init(void) | |||
| 479 | } | 479 | } |
| 480 | 480 | ||
| 481 | /* | 481 | /* |
| 482 | * prime sn_pci_provider[]. Individial provider init routines will | 482 | * prime sn_pci_provider[]. Individual provider init routines will |
| 483 | * override their respective default entries. | 483 | * override their respective default entries. |
| 484 | */ | 484 | */ |
| 485 | 485 | ||
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index a9bed5ca2ed8..a574fcd163dd 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
| @@ -167,7 +167,7 @@ void __init early_sn_setup(void) | |||
| 167 | * IO on SN2 is done via SAL calls, early_printk won't work without this. | 167 | * IO on SN2 is done via SAL calls, early_printk won't work without this. |
| 168 | * | 168 | * |
| 169 | * This code duplicates some of the ACPI table parsing that is in efi.c & sal.c. | 169 | * This code duplicates some of the ACPI table parsing that is in efi.c & sal.c. |
| 170 | * Any changes to those file may have to be made hereas well. | 170 | * Any changes to those file may have to be made here as well. |
| 171 | */ | 171 | */ |
| 172 | efi_systab = (efi_system_table_t *) __va(ia64_boot_param->efi_systab); | 172 | efi_systab = (efi_system_table_t *) __va(ia64_boot_param->efi_systab); |
| 173 | config_tables = __va(efi_systab->tables); | 173 | config_tables = __va(efi_systab->tables); |
diff --git a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c index 5d318b579fb1..033c8a9f000e 100644 --- a/arch/ia64/sn/kernel/sn2/sn2_smp.c +++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c | |||
| @@ -104,7 +104,7 @@ static inline unsigned long wait_piowc(void) | |||
| 104 | * | 104 | * |
| 105 | * SN2 PIO writes from separate CPUs are not guaranteed to arrive in order. | 105 | * SN2 PIO writes from separate CPUs are not guaranteed to arrive in order. |
| 106 | * Context switching user threads which have memory-mapped MMIO may cause | 106 | * Context switching user threads which have memory-mapped MMIO may cause |
| 107 | * PIOs to issue from seperate CPUs, thus the PIO writes must be drained | 107 | * PIOs to issue from separate CPUs, thus the PIO writes must be drained |
| 108 | * from the previous CPU's Shub before execution resumes on the new CPU. | 108 | * from the previous CPU's Shub before execution resumes on the new CPU. |
| 109 | */ | 109 | */ |
| 110 | void sn_migrate(struct task_struct *task) | 110 | void sn_migrate(struct task_struct *task) |
diff --git a/arch/ia64/sn/kernel/xpc_channel.c b/arch/ia64/sn/kernel/xpc_channel.c index c08db9c2375d..44ccc0d789c9 100644 --- a/arch/ia64/sn/kernel/xpc_channel.c +++ b/arch/ia64/sn/kernel/xpc_channel.c | |||
| @@ -293,7 +293,7 @@ xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst, | |||
| 293 | 293 | ||
| 294 | 294 | ||
| 295 | /* | 295 | /* |
| 296 | * Pull the remote per partititon specific variables from the specified | 296 | * Pull the remote per partition specific variables from the specified |
| 297 | * partition. | 297 | * partition. |
| 298 | */ | 298 | */ |
| 299 | enum xpc_retval | 299 | enum xpc_retval |
| @@ -461,7 +461,7 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch) | |||
| 461 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between | 461 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between |
| 462 | // >>> iterations of the for-loop, bail if set? | 462 | // >>> iterations of the for-loop, bail if set? |
| 463 | 463 | ||
| 464 | // >>> should we impose a minumum #of entries? like 4 or 8? | 464 | // >>> should we impose a minimum #of entries? like 4 or 8? |
| 465 | for (nentries = ch->local_nentries; nentries > 0; nentries--) { | 465 | for (nentries = ch->local_nentries; nentries > 0; nentries--) { |
| 466 | 466 | ||
| 467 | nbytes = nentries * ch->msg_size; | 467 | nbytes = nentries * ch->msg_size; |
| @@ -514,7 +514,7 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch) | |||
| 514 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between | 514 | // >>> may want to check for ch->flags & XPC_C_DISCONNECTING between |
| 515 | // >>> iterations of the for-loop, bail if set? | 515 | // >>> iterations of the for-loop, bail if set? |
| 516 | 516 | ||
| 517 | // >>> should we impose a minumum #of entries? like 4 or 8? | 517 | // >>> should we impose a minimum #of entries? like 4 or 8? |
| 518 | for (nentries = ch->remote_nentries; nentries > 0; nentries--) { | 518 | for (nentries = ch->remote_nentries; nentries > 0; nentries--) { |
| 519 | 519 | ||
| 520 | nbytes = nentries * ch->msg_size; | 520 | nbytes = nentries * ch->msg_size; |
| @@ -1478,7 +1478,7 @@ xpc_teardown_infrastructure(struct xpc_partition *part) | |||
| 1478 | 1478 | ||
| 1479 | 1479 | ||
| 1480 | /* | 1480 | /* |
| 1481 | * Before proceding with the teardown we have to wait until all | 1481 | * Before proceeding with the teardown we have to wait until all |
| 1482 | * existing references cease. | 1482 | * existing references cease. |
| 1483 | */ | 1483 | */ |
| 1484 | wait_event(part->teardown_wq, (atomic_read(&part->references) == 0)); | 1484 | wait_event(part->teardown_wq, (atomic_read(&part->references) == 0)); |
diff --git a/arch/ia64/sn/kernel/xpnet.c b/arch/ia64/sn/kernel/xpnet.c index da7213530972..e58fcadff2e9 100644 --- a/arch/ia64/sn/kernel/xpnet.c +++ b/arch/ia64/sn/kernel/xpnet.c | |||
| @@ -531,7 +531,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 531 | dev_dbg(xpnet, "destination Partitions mask (dp) = 0x%lx\n", dp); | 531 | dev_dbg(xpnet, "destination Partitions mask (dp) = 0x%lx\n", dp); |
| 532 | 532 | ||
| 533 | /* | 533 | /* |
| 534 | * If we wanted to allow promiscous mode to work like an | 534 | * If we wanted to allow promiscuous mode to work like an |
| 535 | * unswitched network, this would be a good point to OR in a | 535 | * unswitched network, this would be a good point to OR in a |
| 536 | * mask of partitions which should be receiving all packets. | 536 | * mask of partitions which should be receiving all packets. |
| 537 | */ | 537 | */ |
diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index 7a291a271511..d79ddacfba2d 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c | |||
| @@ -333,7 +333,7 @@ int sn_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size) | |||
| 333 | /* | 333 | /* |
| 334 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work | 334 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work |
| 335 | * around hw issues at the pci bus level. SGI proms older than | 335 | * around hw issues at the pci bus level. SGI proms older than |
| 336 | * 4.10 don't implment this. | 336 | * 4.10 don't implement this. |
| 337 | */ | 337 | */ |
| 338 | 338 | ||
| 339 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, | 339 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, |
| @@ -348,7 +348,7 @@ int sn_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size) | |||
| 348 | /* | 348 | /* |
| 349 | * If the above failed, retry using the SAL_PROBE call which should | 349 | * If the above failed, retry using the SAL_PROBE call which should |
| 350 | * be present in all proms (but which cannot work round PCI chipset | 350 | * be present in all proms (but which cannot work round PCI chipset |
| 351 | * bugs). This code is retained for compatability with old | 351 | * bugs). This code is retained for compatibility with old |
| 352 | * pre-4.10 proms, and should be removed at some point in the future. | 352 | * pre-4.10 proms, and should be removed at some point in the future. |
| 353 | */ | 353 | */ |
| 354 | 354 | ||
| @@ -379,7 +379,7 @@ int sn_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size) | |||
| 379 | /* | 379 | /* |
| 380 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work | 380 | * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work |
| 381 | * around hw issues at the pci bus level. SGI proms older than | 381 | * around hw issues at the pci bus level. SGI proms older than |
| 382 | * 4.10 don't implment this. | 382 | * 4.10 don't implement this. |
| 383 | */ | 383 | */ |
| 384 | 384 | ||
| 385 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, | 385 | SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE, |
| @@ -394,7 +394,7 @@ int sn_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size) | |||
| 394 | /* | 394 | /* |
| 395 | * If the above failed, retry using the SAL_PROBE call which should | 395 | * If the above failed, retry using the SAL_PROBE call which should |
| 396 | * be present in all proms (but which cannot work round PCI chipset | 396 | * be present in all proms (but which cannot work round PCI chipset |
| 397 | * bugs). This code is retained for compatability with old | 397 | * bugs). This code is retained for compatibility with old |
| 398 | * pre-4.10 proms, and should be removed at some point in the future. | 398 | * pre-4.10 proms, and should be removed at some point in the future. |
| 399 | */ | 399 | */ |
| 400 | 400 | ||
diff --git a/arch/ia64/sn/pci/pcibr/pcibr_ate.c b/arch/ia64/sn/pci/pcibr/pcibr_ate.c index 935029fc400d..239b3cedcf2b 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_ate.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_ate.c | |||
| @@ -30,7 +30,7 @@ static void mark_ate(struct ate_resource *ate_resource, int start, int number, | |||
| 30 | 30 | ||
| 31 | /* | 31 | /* |
| 32 | * find_free_ate: Find the first free ate index starting from the given | 32 | * find_free_ate: Find the first free ate index starting from the given |
| 33 | * index for the desired consequtive count. | 33 | * index for the desired consecutive count. |
| 34 | */ | 34 | */ |
| 35 | static int find_free_ate(struct ate_resource *ate_resource, int start, | 35 | static int find_free_ate(struct ate_resource *ate_resource, int start, |
| 36 | int count) | 36 | int count) |
| @@ -88,7 +88,7 @@ static inline int alloc_ate_resource(struct ate_resource *ate_resource, | |||
| 88 | return -1; | 88 | return -1; |
| 89 | 89 | ||
| 90 | /* | 90 | /* |
| 91 | * Find the required number of free consequtive ates. | 91 | * Find the required number of free consecutive ates. |
| 92 | */ | 92 | */ |
| 93 | start_index = | 93 | start_index = |
| 94 | find_free_ate(ate_resource, ate_resource->lowest_free_index, | 94 | find_free_ate(ate_resource, ate_resource->lowest_free_index, |
| @@ -105,7 +105,7 @@ static inline int alloc_ate_resource(struct ate_resource *ate_resource, | |||
| 105 | /* | 105 | /* |
| 106 | * Allocate "count" contiguous Bridge Address Translation Entries | 106 | * Allocate "count" contiguous Bridge Address Translation Entries |
| 107 | * on the specified bridge to be used for PCI to XTALK mappings. | 107 | * on the specified bridge to be used for PCI to XTALK mappings. |
| 108 | * Indices in rm map range from 1..num_entries. Indicies returned | 108 | * Indices in rm map range from 1..num_entries. Indices returned |
| 109 | * to caller range from 0..num_entries-1. | 109 | * to caller range from 0..num_entries-1. |
| 110 | * | 110 | * |
| 111 | * Return the start index on success, -1 on failure. | 111 | * Return the start index on success, -1 on failure. |
diff --git a/arch/ia64/sn/pci/pcibr/pcibr_dma.c b/arch/ia64/sn/pci/pcibr/pcibr_dma.c index 95af40cb22f2..e626e50a938a 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_dma.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_dma.c | |||
| @@ -201,7 +201,7 @@ pcibr_dmatrans_direct32(struct pcidev_info * info, | |||
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | /* | 203 | /* |
| 204 | * Wrapper routine for free'ing DMA maps | 204 | * Wrapper routine for freeing DMA maps |
| 205 | * DMA mappings for Direct 64 and 32 do not have any DMA maps. | 205 | * DMA mappings for Direct 64 and 32 do not have any DMA maps. |
| 206 | */ | 206 | */ |
| 207 | void | 207 | void |
diff --git a/arch/ia64/sn/pci/tioca_provider.c b/arch/ia64/sn/pci/tioca_provider.c index 8a2cb4e691fd..b9bedbd6e1d6 100644 --- a/arch/ia64/sn/pci/tioca_provider.c +++ b/arch/ia64/sn/pci/tioca_provider.c | |||
| @@ -223,7 +223,7 @@ tioca_fastwrite_enable(struct tioca_kernel *tioca_kern) | |||
| 223 | 223 | ||
| 224 | /* | 224 | /* |
| 225 | * Scan all vga controllers on this bus making sure they all | 225 | * Scan all vga controllers on this bus making sure they all |
| 226 | * suport FW. If not, return. | 226 | * support FW. If not, return. |
| 227 | */ | 227 | */ |
| 228 | 228 | ||
| 229 | list_for_each_entry(pdev, tioca_kern->ca_devices, bus_list) { | 229 | list_for_each_entry(pdev, tioca_kern->ca_devices, bus_list) { |
| @@ -364,7 +364,7 @@ tioca_dma_d48(struct pci_dev *pdev, u64 paddr) | |||
| 364 | * @req_size: len (bytes) to map | 364 | * @req_size: len (bytes) to map |
| 365 | * | 365 | * |
| 366 | * Map @paddr into CA address space using the GART mechanism. The mapped | 366 | * Map @paddr into CA address space using the GART mechanism. The mapped |
| 367 | * dma_addr_t is guarenteed to be contiguous in CA bus space. | 367 | * dma_addr_t is guaranteed to be contiguous in CA bus space. |
| 368 | */ | 368 | */ |
| 369 | static dma_addr_t | 369 | static dma_addr_t |
| 370 | tioca_dma_mapped(struct pci_dev *pdev, u64 paddr, size_t req_size) | 370 | tioca_dma_mapped(struct pci_dev *pdev, u64 paddr, size_t req_size) |
| @@ -526,7 +526,7 @@ tioca_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, int dma_flags) | |||
| 526 | return 0; | 526 | return 0; |
| 527 | 527 | ||
| 528 | /* | 528 | /* |
| 529 | * If card is 64 or 48 bit addresable, use a direct mapping. 32 | 529 | * If card is 64 or 48 bit addressable, use a direct mapping. 32 |
| 530 | * bit direct is so restrictive w.r.t. where the memory resides that | 530 | * bit direct is so restrictive w.r.t. where the memory resides that |
| 531 | * we don't use it even though CA has some support. | 531 | * we don't use it even though CA has some support. |
| 532 | */ | 532 | */ |
diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c index 35f854fb6120..f4c0b961a939 100644 --- a/arch/ia64/sn/pci/tioce_provider.c +++ b/arch/ia64/sn/pci/tioce_provider.c | |||
| @@ -256,9 +256,9 @@ pcidev_to_tioce(struct pci_dev *pdev, struct tioce __iomem **base, | |||
| 256 | * @ct_addr: the coretalk address to map | 256 | * @ct_addr: the coretalk address to map |
| 257 | * @len: number of bytes to map | 257 | * @len: number of bytes to map |
| 258 | * | 258 | * |
| 259 | * Given the addressing type, set up various paramaters that define the | 259 | * Given the addressing type, set up various parameters that define the |
| 260 | * ATE pool to use. Search for a contiguous block of entries to cover the | 260 | * ATE pool to use. Search for a contiguous block of entries to cover the |
| 261 | * length, and if enough resources exist, fill in the ATE's and construct a | 261 | * length, and if enough resources exist, fill in the ATEs and construct a |
| 262 | * tioce_dmamap struct to track the mapping. | 262 | * tioce_dmamap struct to track the mapping. |
| 263 | */ | 263 | */ |
| 264 | static u64 | 264 | static u64 |
| @@ -581,8 +581,8 @@ tioce_do_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, | |||
| 581 | */ | 581 | */ |
| 582 | if (!mapaddr && !barrier && dma_mask >= 0xffffffffffUL) { | 582 | if (!mapaddr && !barrier && dma_mask >= 0xffffffffffUL) { |
| 583 | /* | 583 | /* |
| 584 | * We have two options for 40-bit mappings: 16GB "super" ATE's | 584 | * We have two options for 40-bit mappings: 16GB "super" ATEs |
| 585 | * and 64MB "regular" ATE's. We'll try both if needed for a | 585 | * and 64MB "regular" ATEs. We'll try both if needed for a |
| 586 | * given mapping but which one we try first depends on the | 586 | * given mapping but which one we try first depends on the |
| 587 | * size. For requests >64MB, prefer to use a super page with | 587 | * size. For requests >64MB, prefer to use a super page with |
| 588 | * regular as the fallback. Otherwise, try in the reverse order. | 588 | * regular as the fallback. Otherwise, try in the reverse order. |
| @@ -687,8 +687,8 @@ tioce_error_intr_handler(int irq, void *arg) | |||
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | /** | 689 | /** |
| 690 | * tioce_reserve_m32 - reserve M32 ate's for the indicated address range | 690 | * tioce_reserve_m32 - reserve M32 ATEs for the indicated address range |
| 691 | * @tioce_kernel: TIOCE context to reserve ate's for | 691 | * @tioce_kernel: TIOCE context to reserve ATEs for |
| 692 | * @base: starting bus address to reserve | 692 | * @base: starting bus address to reserve |
| 693 | * @limit: last bus address to reserve | 693 | * @limit: last bus address to reserve |
| 694 | * | 694 | * |
| @@ -763,7 +763,7 @@ tioce_kern_init(struct tioce_common *tioce_common) | |||
| 763 | 763 | ||
| 764 | /* | 764 | /* |
| 765 | * Set PMU pagesize to the largest size available, and zero out | 765 | * Set PMU pagesize to the largest size available, and zero out |
| 766 | * the ate's. | 766 | * the ATEs. |
| 767 | */ | 767 | */ |
| 768 | 768 | ||
| 769 | tioce_mmr = (struct tioce __iomem *)tioce_common->ce_pcibus.bs_base; | 769 | tioce_mmr = (struct tioce __iomem *)tioce_common->ce_pcibus.bs_base; |
| @@ -784,7 +784,7 @@ tioce_kern_init(struct tioce_common *tioce_common) | |||
| 784 | } | 784 | } |
| 785 | 785 | ||
| 786 | /* | 786 | /* |
| 787 | * Reserve ATE's corresponding to reserved address ranges. These | 787 | * Reserve ATEs corresponding to reserved address ranges. These |
| 788 | * include: | 788 | * include: |
| 789 | * | 789 | * |
| 790 | * Memory space covered by each PPB mem base/limit register | 790 | * Memory space covered by each PPB mem base/limit register |
diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile index 6bf6fb65bc20..c749dccacc32 100644 --- a/arch/sparc64/kernel/Makefile +++ b/arch/sparc64/kernel/Makefile | |||
| @@ -12,7 +12,7 @@ obj-y := process.o setup.o cpu.o idprom.o \ | |||
| 12 | irq.o ptrace.o time.o sys_sparc.o signal.o \ | 12 | irq.o ptrace.o time.o sys_sparc.o signal.o \ |
| 13 | unaligned.o central.o pci.o starfire.o semaphore.o \ | 13 | unaligned.o central.o pci.o starfire.o semaphore.o \ |
| 14 | power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \ | 14 | power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \ |
| 15 | visemul.o prom.o of_device.o | 15 | visemul.o prom.o of_device.o hvapi.o |
| 16 | 16 | ||
| 17 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | 17 | obj-$(CONFIG_STACKTRACE) += stacktrace.o |
| 18 | obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o pci_iommu.o \ | 18 | obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o pci_iommu.o \ |
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index c15a3edcb826..732b77cb71f8 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
| @@ -1843,3 +1843,97 @@ sun4v_cpu_state: | |||
| 1843 | mov %o1, %o0 | 1843 | mov %o1, %o0 |
| 1844 | 1: retl | 1844 | 1: retl |
| 1845 | nop | 1845 | nop |
| 1846 | |||
| 1847 | /* %o0: API group number | ||
| 1848 | * %o1: pointer to unsigned long major number storage | ||
| 1849 | * %o2: pointer to unsigned long minor number storage | ||
| 1850 | * | ||
| 1851 | * returns %o0: status | ||
| 1852 | */ | ||
| 1853 | .globl sun4v_get_version | ||
| 1854 | sun4v_get_version: | ||
| 1855 | mov HV_CORE_GET_VER, %o5 | ||
| 1856 | mov %o1, %o3 | ||
| 1857 | mov %o2, %o4 | ||
| 1858 | ta HV_CORE_TRAP | ||
| 1859 | stx %o1, [%o3] | ||
| 1860 | retl | ||
| 1861 | stx %o2, [%o4] | ||
| 1862 | |||
| 1863 | /* %o0: API group number | ||
| 1864 | * %o1: desired major number | ||
| 1865 | * %o2: desired minor number | ||
| 1866 | * %o3: pointer to unsigned long actual minor number storage | ||
| 1867 | * | ||
| 1868 | * returns %o0: status | ||
| 1869 | */ | ||
| 1870 | .globl sun4v_set_version | ||
| 1871 | sun4v_set_version: | ||
| 1872 | mov HV_CORE_SET_VER, %o5 | ||
| 1873 | mov %o3, %o4 | ||
| 1874 | ta HV_CORE_TRAP | ||
| 1875 | retl | ||
| 1876 | stx %o1, [%o4] | ||
| 1877 | |||
| 1878 | /* %o0: pointer to unsigned long status | ||
| 1879 | * | ||
| 1880 | * returns %o0: signed character | ||
| 1881 | */ | ||
| 1882 | .globl sun4v_con_getchar | ||
| 1883 | sun4v_con_getchar: | ||
| 1884 | mov %o0, %o4 | ||
| 1885 | mov HV_FAST_CONS_GETCHAR, %o5 | ||
| 1886 | clr %o0 | ||
| 1887 | clr %o1 | ||
| 1888 | ta HV_FAST_TRAP | ||
| 1889 | stx %o0, [%o4] | ||
| 1890 | retl | ||
| 1891 | sra %o1, 0, %o0 | ||
| 1892 | |||
| 1893 | /* %o0: signed long character | ||
| 1894 | * | ||
| 1895 | * returns %o0: status | ||
| 1896 | */ | ||
| 1897 | .globl sun4v_con_putchar | ||
| 1898 | sun4v_con_putchar: | ||
| 1899 | mov HV_FAST_CONS_PUTCHAR, %o5 | ||
| 1900 | ta HV_FAST_TRAP | ||
| 1901 | retl | ||
| 1902 | sra %o0, 0, %o0 | ||
| 1903 | |||
| 1904 | /* %o0: buffer real address | ||
| 1905 | * %o1: buffer size | ||
| 1906 | * %o2: pointer to unsigned long bytes_read | ||
| 1907 | * | ||
| 1908 | * returns %o0: status | ||
| 1909 | */ | ||
| 1910 | .globl sun4v_con_read | ||
| 1911 | sun4v_con_read: | ||
| 1912 | mov %o2, %o4 | ||
| 1913 | mov HV_FAST_CONS_READ, %o5 | ||
| 1914 | ta HV_FAST_TRAP | ||
| 1915 | brnz %o0, 1f | ||
| 1916 | cmp %o1, -1 /* break */ | ||
| 1917 | be,a,pn %icc, 1f | ||
| 1918 | mov %o1, %o0 | ||
| 1919 | cmp %o1, -2 /* hup */ | ||
| 1920 | be,a,pn %icc, 1f | ||
| 1921 | mov %o1, %o0 | ||
| 1922 | stx %o1, [%o4] | ||
| 1923 | 1: retl | ||
| 1924 | nop | ||
| 1925 | |||
| 1926 | /* %o0: buffer real address | ||
| 1927 | * %o1: buffer size | ||
| 1928 | * %o2: pointer to unsigned long bytes_written | ||
| 1929 | * | ||
| 1930 | * returns %o0: status | ||
| 1931 | */ | ||
| 1932 | .globl sun4v_con_write | ||
| 1933 | sun4v_con_write: | ||
| 1934 | mov %o2, %o4 | ||
| 1935 | mov HV_FAST_CONS_WRITE, %o5 | ||
| 1936 | ta HV_FAST_TRAP | ||
| 1937 | stx %o1, [%o4] | ||
| 1938 | retl | ||
| 1939 | nop | ||
diff --git a/arch/sparc64/kernel/hvapi.c b/arch/sparc64/kernel/hvapi.c new file mode 100644 index 000000000000..f03ffc829c7a --- /dev/null +++ b/arch/sparc64/kernel/hvapi.c | |||
| @@ -0,0 +1,189 @@ | |||
| 1 | /* hvapi.c: Hypervisor API management. | ||
| 2 | * | ||
| 3 | * Copyright (C) 2007 David S. Miller <davem@davemloft.net> | ||
| 4 | */ | ||
| 5 | #include <linux/kernel.h> | ||
| 6 | #include <linux/module.h> | ||
| 7 | #include <linux/init.h> | ||
| 8 | #include <linux/slab.h> | ||
| 9 | |||
| 10 | #include <asm/hypervisor.h> | ||
| 11 | #include <asm/oplib.h> | ||
| 12 | |||
| 13 | /* If the hypervisor indicates that the API setting | ||
| 14 | * calls are unsupported, by returning HV_EBADTRAP or | ||
| 15 | * HV_ENOTSUPPORTED, we assume that API groups with the | ||
| 16 | * PRE_API flag set are major 1 minor 0. | ||
| 17 | */ | ||
| 18 | struct api_info { | ||
| 19 | unsigned long group; | ||
| 20 | unsigned long major; | ||
| 21 | unsigned long minor; | ||
| 22 | unsigned int refcnt; | ||
| 23 | unsigned int flags; | ||
| 24 | #define FLAG_PRE_API 0x00000001 | ||
| 25 | }; | ||
| 26 | |||
| 27 | static struct api_info api_table[] = { | ||
| 28 | { .group = HV_GRP_SUN4V, .flags = FLAG_PRE_API }, | ||
| 29 | { .group = HV_GRP_CORE, .flags = FLAG_PRE_API }, | ||
| 30 | { .group = HV_GRP_INTR, }, | ||
| 31 | { .group = HV_GRP_SOFT_STATE, }, | ||
| 32 | { .group = HV_GRP_PCI, .flags = FLAG_PRE_API }, | ||
| 33 | { .group = HV_GRP_LDOM, }, | ||
| 34 | { .group = HV_GRP_SVC_CHAN, .flags = FLAG_PRE_API }, | ||
| 35 | { .group = HV_GRP_NCS, .flags = FLAG_PRE_API }, | ||
| 36 | { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, | ||
| 37 | { .group = HV_GRP_FIRE_PERF, }, | ||
| 38 | { .group = HV_GRP_DIAG, .flags = FLAG_PRE_API }, | ||
| 39 | }; | ||
| 40 | |||
| 41 | static DEFINE_SPINLOCK(hvapi_lock); | ||
| 42 | |||
| 43 | static struct api_info *__get_info(unsigned long group) | ||
| 44 | { | ||
| 45 | int i; | ||
| 46 | |||
| 47 | for (i = 0; i < ARRAY_SIZE(api_table); i++) { | ||
| 48 | if (api_table[i].group == group) | ||
| 49 | return &api_table[i]; | ||
| 50 | } | ||
| 51 | return NULL; | ||
| 52 | } | ||
| 53 | |||
| 54 | static void __get_ref(struct api_info *p) | ||
| 55 | { | ||
| 56 | p->refcnt++; | ||
| 57 | } | ||
| 58 | |||
| 59 | static void __put_ref(struct api_info *p) | ||
| 60 | { | ||
| 61 | if (--p->refcnt == 0) { | ||
| 62 | unsigned long ignore; | ||
| 63 | |||
| 64 | sun4v_set_version(p->group, 0, 0, &ignore); | ||
| 65 | p->major = p->minor = 0; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | |||
| 69 | /* Register a hypervisor API specification. It indicates the | ||
| 70 | * API group and desired major+minor. | ||
| 71 | * | ||
| 72 | * If an existing API registration exists '0' (success) will | ||
| 73 | * be returned if it is compatible with the one being registered. | ||
| 74 | * Otherwise a negative error code will be returned. | ||
| 75 | * | ||
| 76 | * Otherwise an attempt will be made to negotiate the requested | ||
| 77 | * API group/major/minor with the hypervisor, and errors returned | ||
| 78 | * if that does not succeed. | ||
| 79 | */ | ||
| 80 | int sun4v_hvapi_register(unsigned long group, unsigned long major, | ||
| 81 | unsigned long *minor) | ||
| 82 | { | ||
| 83 | struct api_info *p; | ||
| 84 | unsigned long flags; | ||
| 85 | int ret; | ||
| 86 | |||
| 87 | spin_lock_irqsave(&hvapi_lock, flags); | ||
| 88 | p = __get_info(group); | ||
| 89 | ret = -EINVAL; | ||
| 90 | if (p) { | ||
| 91 | if (p->refcnt) { | ||
| 92 | ret = -EINVAL; | ||
| 93 | if (p->major == major) { | ||
| 94 | *minor = p->minor; | ||
| 95 | ret = 0; | ||
| 96 | } | ||
| 97 | } else { | ||
| 98 | unsigned long actual_minor; | ||
| 99 | unsigned long hv_ret; | ||
| 100 | |||
| 101 | hv_ret = sun4v_set_version(group, major, *minor, | ||
| 102 | &actual_minor); | ||
| 103 | ret = -EINVAL; | ||
| 104 | if (hv_ret == HV_EOK) { | ||
| 105 | *minor = actual_minor; | ||
| 106 | p->major = major; | ||
| 107 | p->minor = actual_minor; | ||
| 108 | ret = 0; | ||
| 109 | } else if (hv_ret == HV_EBADTRAP || | ||
| 110 | HV_ENOTSUPPORTED) { | ||
| 111 | if (p->flags & FLAG_PRE_API) { | ||
| 112 | if (major == 1) { | ||
| 113 | p->major = 1; | ||
| 114 | p->minor = 0; | ||
| 115 | *minor = 0; | ||
| 116 | ret = 0; | ||
| 117 | } | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | if (ret == 0) | ||
| 123 | __get_ref(p); | ||
| 124 | } | ||
| 125 | spin_unlock_irqrestore(&hvapi_lock, flags); | ||
| 126 | |||
| 127 | return ret; | ||
| 128 | } | ||
| 129 | EXPORT_SYMBOL(sun4v_hvapi_register); | ||
| 130 | |||
| 131 | void sun4v_hvapi_unregister(unsigned long group) | ||
| 132 | { | ||
| 133 | struct api_info *p; | ||
| 134 | unsigned long flags; | ||
| 135 | |||
| 136 | spin_lock_irqsave(&hvapi_lock, flags); | ||
| 137 | p = __get_info(group); | ||
| 138 | if (p) | ||
| 139 | __put_ref(p); | ||
| 140 | spin_unlock_irqrestore(&hvapi_lock, flags); | ||
| 141 | } | ||
| 142 | EXPORT_SYMBOL(sun4v_hvapi_unregister); | ||
| 143 | |||
| 144 | int sun4v_hvapi_get(unsigned long group, | ||
| 145 | unsigned long *major, | ||
| 146 | unsigned long *minor) | ||
| 147 | { | ||
| 148 | struct api_info *p; | ||
| 149 | unsigned long flags; | ||
| 150 | int ret; | ||
| 151 | |||
| 152 | spin_lock_irqsave(&hvapi_lock, flags); | ||
| 153 | ret = -EINVAL; | ||
| 154 | p = __get_info(group); | ||
| 155 | if (p && p->refcnt) { | ||
| 156 | *major = p->major; | ||
| 157 | *minor = p->minor; | ||
| 158 | ret = 0; | ||
| 159 | } | ||
| 160 | spin_unlock_irqrestore(&hvapi_lock, flags); | ||
| 161 | |||
| 162 | return ret; | ||
| 163 | } | ||
| 164 | EXPORT_SYMBOL(sun4v_hvapi_get); | ||
| 165 | |||
| 166 | void __init sun4v_hvapi_init(void) | ||
| 167 | { | ||
| 168 | unsigned long group, major, minor; | ||
| 169 | |||
| 170 | group = HV_GRP_SUN4V; | ||
| 171 | major = 1; | ||
| 172 | minor = 0; | ||
| 173 | if (sun4v_hvapi_register(group, major, &minor)) | ||
| 174 | goto bad; | ||
| 175 | |||
| 176 | group = HV_GRP_CORE; | ||
| 177 | major = 1; | ||
| 178 | minor = 1; | ||
| 179 | if (sun4v_hvapi_register(group, major, &minor)) | ||
| 180 | goto bad; | ||
| 181 | |||
| 182 | return; | ||
| 183 | |||
| 184 | bad: | ||
| 185 | prom_printf("HVAPI: Cannot register API group " | ||
| 186 | "%lx with major(%u) minor(%u)\n", | ||
| 187 | group, major, minor); | ||
| 188 | prom_halt(); | ||
| 189 | } | ||
diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c index 451028341c75..dea9c3c9ec5f 100644 --- a/arch/sparc64/kernel/setup.c +++ b/arch/sparc64/kernel/setup.c | |||
| @@ -269,6 +269,7 @@ void __init per_cpu_patch(void) | |||
| 269 | 269 | ||
| 270 | void __init sun4v_patch(void) | 270 | void __init sun4v_patch(void) |
| 271 | { | 271 | { |
| 272 | extern void sun4v_hvapi_init(void); | ||
| 272 | struct sun4v_1insn_patch_entry *p1; | 273 | struct sun4v_1insn_patch_entry *p1; |
| 273 | struct sun4v_2insn_patch_entry *p2; | 274 | struct sun4v_2insn_patch_entry *p2; |
| 274 | 275 | ||
| @@ -300,6 +301,8 @@ void __init sun4v_patch(void) | |||
| 300 | 301 | ||
| 301 | p2++; | 302 | p2++; |
| 302 | } | 303 | } |
| 304 | |||
| 305 | sun4v_hvapi_init(); | ||
| 303 | } | 306 | } |
| 304 | 307 | ||
| 305 | #ifdef CONFIG_SMP | 308 | #ifdef CONFIG_SMP |
diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c index 02c0d52c9f76..7bfbad57879d 100644 --- a/drivers/parport/parport_pc.c +++ b/drivers/parport/parport_pc.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <linux/ioport.h> | 51 | #include <linux/ioport.h> |
| 52 | #include <linux/kernel.h> | 52 | #include <linux/kernel.h> |
| 53 | #include <linux/slab.h> | 53 | #include <linux/slab.h> |
| 54 | #include <linux/dma-mapping.h> | ||
| 54 | #include <linux/pci.h> | 55 | #include <linux/pci.h> |
| 55 | #include <linux/pnp.h> | 56 | #include <linux/pnp.h> |
| 56 | #include <linux/platform_device.h> | 57 | #include <linux/platform_device.h> |
diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c index c3a6bd2e7950..96557e6dba60 100644 --- a/drivers/serial/sunhv.c +++ b/drivers/serial/sunhv.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* sunhv.c: Serial driver for SUN4V hypervisor console. | 1 | /* sunhv.c: Serial driver for SUN4V hypervisor console. |
| 2 | * | 2 | * |
| 3 | * Copyright (C) 2006 David S. Miller (davem@davemloft.net) | 3 | * Copyright (C) 2006, 2007 David S. Miller (davem@davemloft.net) |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #include <linux/module.h> | 6 | #include <linux/module.h> |
| @@ -35,57 +35,51 @@ | |||
| 35 | #define CON_BREAK ((long)-1) | 35 | #define CON_BREAK ((long)-1) |
| 36 | #define CON_HUP ((long)-2) | 36 | #define CON_HUP ((long)-2) |
| 37 | 37 | ||
| 38 | static inline long hypervisor_con_getchar(long *status) | 38 | #define IGNORE_BREAK 0x1 |
| 39 | { | 39 | #define IGNORE_ALL 0x2 |
| 40 | register unsigned long func asm("%o5"); | ||
| 41 | register unsigned long arg0 asm("%o0"); | ||
| 42 | register unsigned long arg1 asm("%o1"); | ||
| 43 | |||
| 44 | func = HV_FAST_CONS_GETCHAR; | ||
| 45 | arg0 = 0; | ||
| 46 | arg1 = 0; | ||
| 47 | __asm__ __volatile__("ta %6" | ||
| 48 | : "=&r" (func), "=&r" (arg0), "=&r" (arg1) | ||
| 49 | : "0" (func), "1" (arg0), "2" (arg1), | ||
| 50 | "i" (HV_FAST_TRAP)); | ||
| 51 | 40 | ||
| 52 | *status = arg0; | 41 | static char *con_write_page; |
| 42 | static char *con_read_page; | ||
| 53 | 43 | ||
| 54 | return (long) arg1; | 44 | static int hung_up = 0; |
| 55 | } | ||
| 56 | 45 | ||
| 57 | static inline long hypervisor_con_putchar(long ch) | 46 | static void transmit_chars_putchar(struct uart_port *port, struct circ_buf *xmit) |
| 58 | { | 47 | { |
| 59 | register unsigned long func asm("%o5"); | 48 | while (!uart_circ_empty(xmit)) { |
| 60 | register unsigned long arg0 asm("%o0"); | 49 | long status = sun4v_con_putchar(xmit->buf[xmit->tail]); |
| 61 | 50 | ||
| 62 | func = HV_FAST_CONS_PUTCHAR; | 51 | if (status != HV_EOK) |
| 63 | arg0 = ch; | 52 | break; |
| 64 | __asm__ __volatile__("ta %4" | ||
| 65 | : "=&r" (func), "=&r" (arg0) | ||
| 66 | : "0" (func), "1" (arg0), "i" (HV_FAST_TRAP)); | ||
| 67 | 53 | ||
| 68 | return (long) arg0; | 54 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
| 55 | port->icount.tx++; | ||
| 56 | } | ||
| 69 | } | 57 | } |
| 70 | 58 | ||
| 71 | #define IGNORE_BREAK 0x1 | 59 | static void transmit_chars_write(struct uart_port *port, struct circ_buf *xmit) |
| 72 | #define IGNORE_ALL 0x2 | 60 | { |
| 61 | while (!uart_circ_empty(xmit)) { | ||
| 62 | unsigned long ra = __pa(xmit->buf + xmit->tail); | ||
| 63 | unsigned long len, status, sent; | ||
| 73 | 64 | ||
| 74 | static int hung_up = 0; | 65 | len = CIRC_CNT_TO_END(xmit->head, xmit->tail, |
| 66 | UART_XMIT_SIZE); | ||
| 67 | status = sun4v_con_write(ra, len, &sent); | ||
| 68 | if (status != HV_EOK) | ||
| 69 | break; | ||
| 70 | xmit->tail = (xmit->tail + sent) & (UART_XMIT_SIZE - 1); | ||
| 71 | port->icount.tx += sent; | ||
| 72 | } | ||
| 73 | } | ||
| 75 | 74 | ||
| 76 | static struct tty_struct *receive_chars(struct uart_port *port) | 75 | static int receive_chars_getchar(struct uart_port *port, struct tty_struct *tty) |
| 77 | { | 76 | { |
| 78 | struct tty_struct *tty = NULL; | ||
| 79 | int saw_console_brk = 0; | 77 | int saw_console_brk = 0; |
| 80 | int limit = 10000; | 78 | int limit = 10000; |
| 81 | 79 | ||
| 82 | if (port->info != NULL) /* Unopened serial console */ | ||
| 83 | tty = port->info->tty; | ||
| 84 | |||
| 85 | while (limit-- > 0) { | 80 | while (limit-- > 0) { |
| 86 | long status; | 81 | long status; |
| 87 | long c = hypervisor_con_getchar(&status); | 82 | long c = sun4v_con_getchar(&status); |
| 88 | unsigned char flag; | ||
| 89 | 83 | ||
| 90 | if (status == HV_EWOULDBLOCK) | 84 | if (status == HV_EWOULDBLOCK) |
| 91 | break; | 85 | break; |
| @@ -110,27 +104,90 @@ static struct tty_struct *receive_chars(struct uart_port *port) | |||
| 110 | continue; | 104 | continue; |
| 111 | } | 105 | } |
| 112 | 106 | ||
| 113 | flag = TTY_NORMAL; | ||
| 114 | port->icount.rx++; | 107 | port->icount.rx++; |
| 115 | if (c == CON_BREAK) { | ||
| 116 | port->icount.brk++; | ||
| 117 | if (uart_handle_break(port)) | ||
| 118 | continue; | ||
| 119 | flag = TTY_BREAK; | ||
| 120 | } | ||
| 121 | 108 | ||
| 122 | if (uart_handle_sysrq_char(port, c)) | 109 | if (uart_handle_sysrq_char(port, c)) |
| 123 | continue; | 110 | continue; |
| 124 | 111 | ||
| 125 | if ((port->ignore_status_mask & IGNORE_ALL) || | 112 | tty_insert_flip_char(tty, c, TTY_NORMAL); |
| 126 | ((port->ignore_status_mask & IGNORE_BREAK) && | 113 | } |
| 127 | (c == CON_BREAK))) | 114 | |
| 115 | return saw_console_brk; | ||
| 116 | } | ||
| 117 | |||
| 118 | static int receive_chars_read(struct uart_port *port, struct tty_struct *tty) | ||
| 119 | { | ||
| 120 | int saw_console_brk = 0; | ||
| 121 | int limit = 10000; | ||
| 122 | |||
| 123 | while (limit-- > 0) { | ||
| 124 | unsigned long ra = __pa(con_read_page); | ||
| 125 | unsigned long bytes_read, i; | ||
| 126 | long stat = sun4v_con_read(ra, PAGE_SIZE, &bytes_read); | ||
| 127 | |||
| 128 | if (stat != HV_EOK) { | ||
| 129 | bytes_read = 0; | ||
| 130 | |||
| 131 | if (stat == CON_BREAK) { | ||
| 132 | if (uart_handle_break(port)) | ||
| 133 | continue; | ||
| 134 | saw_console_brk = 1; | ||
| 135 | *con_read_page = 0; | ||
| 136 | bytes_read = 1; | ||
| 137 | } else if (stat == CON_HUP) { | ||
| 138 | hung_up = 1; | ||
| 139 | uart_handle_dcd_change(port, 0); | ||
| 140 | continue; | ||
| 141 | } else { | ||
| 142 | /* HV_EWOULDBLOCK, etc. */ | ||
| 143 | break; | ||
| 144 | } | ||
| 145 | } | ||
| 146 | |||
| 147 | if (hung_up) { | ||
| 148 | hung_up = 0; | ||
| 149 | uart_handle_dcd_change(port, 1); | ||
| 150 | } | ||
| 151 | |||
| 152 | for (i = 0; i < bytes_read; i++) | ||
| 153 | uart_handle_sysrq_char(port, con_read_page[i]); | ||
| 154 | |||
| 155 | if (tty == NULL) | ||
| 128 | continue; | 156 | continue; |
| 129 | 157 | ||
| 130 | tty_insert_flip_char(tty, c, flag); | 158 | port->icount.rx += bytes_read; |
| 159 | |||
| 160 | tty_insert_flip_string(tty, con_read_page, bytes_read); | ||
| 131 | } | 161 | } |
| 132 | 162 | ||
| 133 | if (saw_console_brk) | 163 | return saw_console_brk; |
| 164 | } | ||
| 165 | |||
| 166 | struct sunhv_ops { | ||
| 167 | void (*transmit_chars)(struct uart_port *port, struct circ_buf *xmit); | ||
| 168 | int (*receive_chars)(struct uart_port *port, struct tty_struct *tty); | ||
| 169 | }; | ||
| 170 | |||
| 171 | static struct sunhv_ops bychar_ops = { | ||
| 172 | .transmit_chars = transmit_chars_putchar, | ||
| 173 | .receive_chars = receive_chars_getchar, | ||
| 174 | }; | ||
| 175 | |||
| 176 | static struct sunhv_ops bywrite_ops = { | ||
| 177 | .transmit_chars = transmit_chars_write, | ||
| 178 | .receive_chars = receive_chars_read, | ||
| 179 | }; | ||
| 180 | |||
| 181 | static struct sunhv_ops *sunhv_ops = &bychar_ops; | ||
| 182 | |||
| 183 | static struct tty_struct *receive_chars(struct uart_port *port) | ||
| 184 | { | ||
| 185 | struct tty_struct *tty = NULL; | ||
| 186 | |||
| 187 | if (port->info != NULL) /* Unopened serial console */ | ||
| 188 | tty = port->info->tty; | ||
| 189 | |||
| 190 | if (sunhv_ops->receive_chars(port, tty)) | ||
| 134 | sun_do_break(); | 191 | sun_do_break(); |
| 135 | 192 | ||
| 136 | return tty; | 193 | return tty; |
| @@ -147,15 +204,7 @@ static void transmit_chars(struct uart_port *port) | |||
| 147 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) | 204 | if (uart_circ_empty(xmit) || uart_tx_stopped(port)) |
| 148 | return; | 205 | return; |
| 149 | 206 | ||
| 150 | while (!uart_circ_empty(xmit)) { | 207 | sunhv_ops->transmit_chars(port, xmit); |
| 151 | long status = hypervisor_con_putchar(xmit->buf[xmit->tail]); | ||
| 152 | |||
| 153 | if (status != HV_EOK) | ||
| 154 | break; | ||
| 155 | |||
| 156 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | ||
| 157 | port->icount.tx++; | ||
| 158 | } | ||
| 159 | 208 | ||
| 160 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 209 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
| 161 | uart_write_wakeup(port); | 210 | uart_write_wakeup(port); |
| @@ -212,7 +261,7 @@ static void sunhv_start_tx(struct uart_port *port) | |||
| 212 | struct circ_buf *xmit = &port->info->xmit; | 261 | struct circ_buf *xmit = &port->info->xmit; |
| 213 | 262 | ||
| 214 | while (!uart_circ_empty(xmit)) { | 263 | while (!uart_circ_empty(xmit)) { |
| 215 | long status = hypervisor_con_putchar(xmit->buf[xmit->tail]); | 264 | long status = sun4v_con_putchar(xmit->buf[xmit->tail]); |
| 216 | 265 | ||
| 217 | if (status != HV_EOK) | 266 | if (status != HV_EOK) |
| 218 | break; | 267 | break; |
| @@ -231,9 +280,10 @@ static void sunhv_send_xchar(struct uart_port *port, char ch) | |||
| 231 | spin_lock_irqsave(&port->lock, flags); | 280 | spin_lock_irqsave(&port->lock, flags); |
| 232 | 281 | ||
| 233 | while (limit-- > 0) { | 282 | while (limit-- > 0) { |
| 234 | long status = hypervisor_con_putchar(ch); | 283 | long status = sun4v_con_putchar(ch); |
| 235 | if (status == HV_EOK) | 284 | if (status == HV_EOK) |
| 236 | break; | 285 | break; |
| 286 | udelay(1); | ||
| 237 | } | 287 | } |
| 238 | 288 | ||
| 239 | spin_unlock_irqrestore(&port->lock, flags); | 289 | spin_unlock_irqrestore(&port->lock, flags); |
| @@ -254,15 +304,15 @@ static void sunhv_break_ctl(struct uart_port *port, int break_state) | |||
| 254 | { | 304 | { |
| 255 | if (break_state) { | 305 | if (break_state) { |
| 256 | unsigned long flags; | 306 | unsigned long flags; |
| 257 | int limit = 1000000; | 307 | int limit = 10000; |
| 258 | 308 | ||
| 259 | spin_lock_irqsave(&port->lock, flags); | 309 | spin_lock_irqsave(&port->lock, flags); |
| 260 | 310 | ||
| 261 | while (limit-- > 0) { | 311 | while (limit-- > 0) { |
| 262 | long status = hypervisor_con_putchar(CON_BREAK); | 312 | long status = sun4v_con_putchar(CON_BREAK); |
| 263 | if (status == HV_EOK) | 313 | if (status == HV_EOK) |
| 264 | break; | 314 | break; |
| 265 | udelay(2); | 315 | udelay(1); |
| 266 | } | 316 | } |
| 267 | 317 | ||
| 268 | spin_unlock_irqrestore(&port->lock, flags); | 318 | spin_unlock_irqrestore(&port->lock, flags); |
| @@ -359,38 +409,99 @@ static struct uart_driver sunhv_reg = { | |||
| 359 | 409 | ||
| 360 | static struct uart_port *sunhv_port; | 410 | static struct uart_port *sunhv_port; |
| 361 | 411 | ||
| 362 | static inline void sunhv_console_putchar(struct uart_port *port, char c) | 412 | /* Copy 's' into the con_write_page, decoding "\n" into |
| 413 | * "\r\n" along the way. We have to return two lengths | ||
| 414 | * because the caller needs to know how much to advance | ||
| 415 | * 's' and also how many bytes to output via con_write_page. | ||
| 416 | */ | ||
| 417 | static int fill_con_write_page(const char *s, unsigned int n, | ||
| 418 | unsigned long *page_bytes) | ||
| 419 | { | ||
| 420 | const char *orig_s = s; | ||
| 421 | char *p = con_write_page; | ||
| 422 | int left = PAGE_SIZE; | ||
| 423 | |||
| 424 | while (n--) { | ||
| 425 | if (*s == '\n') { | ||
| 426 | if (left < 2) | ||
| 427 | break; | ||
| 428 | *p++ = '\r'; | ||
| 429 | left--; | ||
| 430 | } else if (left < 1) | ||
| 431 | break; | ||
| 432 | *p++ = *s++; | ||
| 433 | left--; | ||
| 434 | } | ||
| 435 | *page_bytes = p - con_write_page; | ||
| 436 | return s - orig_s; | ||
| 437 | } | ||
| 438 | |||
| 439 | static void sunhv_console_write_paged(struct console *con, const char *s, unsigned n) | ||
| 363 | { | 440 | { |
| 441 | struct uart_port *port = sunhv_port; | ||
| 364 | unsigned long flags; | 442 | unsigned long flags; |
| 365 | int limit = 1000000; | ||
| 366 | 443 | ||
| 367 | spin_lock_irqsave(&port->lock, flags); | 444 | spin_lock_irqsave(&port->lock, flags); |
| 445 | while (n > 0) { | ||
| 446 | unsigned long ra = __pa(con_write_page); | ||
| 447 | unsigned long page_bytes; | ||
| 448 | unsigned int cpy = fill_con_write_page(s, n, | ||
| 449 | &page_bytes); | ||
| 450 | |||
| 451 | n -= cpy; | ||
| 452 | s += cpy; | ||
| 453 | while (page_bytes > 0) { | ||
| 454 | unsigned long written; | ||
| 455 | int limit = 1000000; | ||
| 456 | |||
| 457 | while (limit--) { | ||
| 458 | unsigned long stat; | ||
| 459 | |||
| 460 | stat = sun4v_con_write(ra, page_bytes, | ||
| 461 | &written); | ||
| 462 | if (stat == HV_EOK) | ||
| 463 | break; | ||
| 464 | udelay(1); | ||
| 465 | } | ||
| 466 | if (limit <= 0) | ||
| 467 | break; | ||
| 468 | page_bytes -= written; | ||
| 469 | ra += written; | ||
| 470 | } | ||
| 471 | } | ||
| 472 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 473 | } | ||
| 474 | |||
| 475 | static inline void sunhv_console_putchar(struct uart_port *port, char c) | ||
| 476 | { | ||
| 477 | int limit = 1000000; | ||
| 368 | 478 | ||
| 369 | while (limit-- > 0) { | 479 | while (limit-- > 0) { |
| 370 | long status = hypervisor_con_putchar(c); | 480 | long status = sun4v_con_putchar(c); |
| 371 | if (status == HV_EOK) | 481 | if (status == HV_EOK) |
| 372 | break; | 482 | break; |
| 373 | udelay(2); | 483 | udelay(1); |
| 374 | } | 484 | } |
| 375 | |||
| 376 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 377 | } | 485 | } |
| 378 | 486 | ||
| 379 | static void sunhv_console_write(struct console *con, const char *s, unsigned n) | 487 | static void sunhv_console_write_bychar(struct console *con, const char *s, unsigned n) |
| 380 | { | 488 | { |
| 381 | struct uart_port *port = sunhv_port; | 489 | struct uart_port *port = sunhv_port; |
| 490 | unsigned long flags; | ||
| 382 | int i; | 491 | int i; |
| 383 | 492 | ||
| 493 | spin_lock_irqsave(&port->lock, flags); | ||
| 384 | for (i = 0; i < n; i++) { | 494 | for (i = 0; i < n; i++) { |
| 385 | if (*s == '\n') | 495 | if (*s == '\n') |
| 386 | sunhv_console_putchar(port, '\r'); | 496 | sunhv_console_putchar(port, '\r'); |
| 387 | sunhv_console_putchar(port, *s++); | 497 | sunhv_console_putchar(port, *s++); |
| 388 | } | 498 | } |
| 499 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 389 | } | 500 | } |
| 390 | 501 | ||
| 391 | static struct console sunhv_console = { | 502 | static struct console sunhv_console = { |
| 392 | .name = "ttyHV", | 503 | .name = "ttyHV", |
| 393 | .write = sunhv_console_write, | 504 | .write = sunhv_console_write_bychar, |
| 394 | .device = uart_console_device, | 505 | .device = uart_console_device, |
| 395 | .flags = CON_PRINTBUFFER, | 506 | .flags = CON_PRINTBUFFER, |
| 396 | .index = -1, | 507 | .index = -1, |
| @@ -410,6 +521,7 @@ static inline struct console *SUNHV_CONSOLE(void) | |||
| 410 | static int __devinit hv_probe(struct of_device *op, const struct of_device_id *match) | 521 | static int __devinit hv_probe(struct of_device *op, const struct of_device_id *match) |
| 411 | { | 522 | { |
| 412 | struct uart_port *port; | 523 | struct uart_port *port; |
| 524 | unsigned long minor; | ||
| 413 | int err; | 525 | int err; |
| 414 | 526 | ||
| 415 | if (op->irqs[0] == 0xffffffff) | 527 | if (op->irqs[0] == 0xffffffff) |
| @@ -419,6 +531,22 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m | |||
| 419 | if (unlikely(!port)) | 531 | if (unlikely(!port)) |
| 420 | return -ENOMEM; | 532 | return -ENOMEM; |
| 421 | 533 | ||
| 534 | minor = 1; | ||
| 535 | if (sun4v_hvapi_register(HV_GRP_CORE, 1, &minor) == 0 && | ||
| 536 | minor >= 1) { | ||
| 537 | err = -ENOMEM; | ||
| 538 | con_write_page = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
| 539 | if (!con_write_page) | ||
| 540 | goto out_free_port; | ||
| 541 | |||
| 542 | con_read_page = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
| 543 | if (!con_read_page) | ||
| 544 | goto out_free_con_write_page; | ||
| 545 | |||
| 546 | sunhv_console.write = sunhv_console_write_paged; | ||
| 547 | sunhv_ops = &bywrite_ops; | ||
| 548 | } | ||
| 549 | |||
| 422 | sunhv_port = port; | 550 | sunhv_port = port; |
| 423 | 551 | ||
| 424 | port->line = 0; | 552 | port->line = 0; |
| @@ -437,7 +565,7 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m | |||
| 437 | 565 | ||
| 438 | err = uart_register_driver(&sunhv_reg); | 566 | err = uart_register_driver(&sunhv_reg); |
| 439 | if (err) | 567 | if (err) |
| 440 | goto out_free_port; | 568 | goto out_free_con_read_page; |
| 441 | 569 | ||
| 442 | sunhv_reg.tty_driver->name_base = sunhv_reg.minor - 64; | 570 | sunhv_reg.tty_driver->name_base = sunhv_reg.minor - 64; |
| 443 | sunserial_current_minor += 1; | 571 | sunserial_current_minor += 1; |
| @@ -463,6 +591,12 @@ out_unregister_driver: | |||
| 463 | sunserial_current_minor -= 1; | 591 | sunserial_current_minor -= 1; |
| 464 | uart_unregister_driver(&sunhv_reg); | 592 | uart_unregister_driver(&sunhv_reg); |
| 465 | 593 | ||
| 594 | out_free_con_read_page: | ||
| 595 | kfree(con_read_page); | ||
| 596 | |||
| 597 | out_free_con_write_page: | ||
| 598 | kfree(con_write_page); | ||
| 599 | |||
| 466 | out_free_port: | 600 | out_free_port: |
| 467 | kfree(port); | 601 | kfree(port); |
| 468 | sunhv_port = NULL; | 602 | sunhv_port = NULL; |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index c0a6dce800a3..225d6b2f82dd 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
| @@ -484,7 +484,7 @@ static int spidev_probe(struct spi_device *spi) | |||
| 484 | * Reusing minors is fine so long as udev or mdev is working. | 484 | * Reusing minors is fine so long as udev or mdev is working. |
| 485 | */ | 485 | */ |
| 486 | mutex_lock(&device_list_lock); | 486 | mutex_lock(&device_list_lock); |
| 487 | minor = find_first_zero_bit(minors, ARRAY_SIZE(minors)); | 487 | minor = find_first_zero_bit(minors, N_SPI_MINORS); |
| 488 | if (minor < N_SPI_MINORS) { | 488 | if (minor < N_SPI_MINORS) { |
| 489 | spidev->dev.parent = &spi->dev; | 489 | spidev->dev.parent = &spi->dev; |
| 490 | spidev->dev.class = &spidev_class; | 490 | spidev->dev.class = &spidev_class; |
diff --git a/fs/afs/super.c b/fs/afs/super.c index 579af632c8e8..370cecc910db 100644 --- a/fs/afs/super.c +++ b/fs/afs/super.c | |||
| @@ -47,7 +47,6 @@ struct file_system_type afs_fs_type = { | |||
| 47 | static const struct super_operations afs_super_ops = { | 47 | static const struct super_operations afs_super_ops = { |
| 48 | .statfs = afs_statfs, | 48 | .statfs = afs_statfs, |
| 49 | .alloc_inode = afs_alloc_inode, | 49 | .alloc_inode = afs_alloc_inode, |
| 50 | .drop_inode = generic_delete_inode, | ||
| 51 | .write_inode = afs_write_inode, | 50 | .write_inode = afs_write_inode, |
| 52 | .destroy_inode = afs_destroy_inode, | 51 | .destroy_inode = afs_destroy_inode, |
| 53 | .clear_inode = afs_clear_inode, | 52 | .clear_inode = afs_clear_inode, |
diff --git a/fs/afs/write.c b/fs/afs/write.c index 28f37516c126..a03b92a0fe1d 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c | |||
| @@ -206,7 +206,6 @@ int afs_prepare_write(struct file *file, struct page *page, | |||
| 206 | _leave(" = %d [prep]", ret); | 206 | _leave(" = %d [prep]", ret); |
| 207 | return ret; | 207 | return ret; |
| 208 | } | 208 | } |
| 209 | SetPageUptodate(page); | ||
| 210 | } | 209 | } |
| 211 | 210 | ||
| 212 | try_again: | 211 | try_again: |
| @@ -311,8 +310,8 @@ int afs_commit_write(struct file *file, struct page *page, | |||
| 311 | spin_unlock(&vnode->writeback_lock); | 310 | spin_unlock(&vnode->writeback_lock); |
| 312 | } | 311 | } |
| 313 | 312 | ||
| 313 | SetPageUptodate(page); | ||
| 314 | set_page_dirty(page); | 314 | set_page_dirty(page); |
| 315 | |||
| 316 | if (PageDirty(page)) | 315 | if (PageDirty(page)) |
| 317 | _debug("dirtied"); | 316 | _debug("dirtied"); |
| 318 | 317 | ||
diff --git a/include/asm-avr32/arch-at32ap/board.h b/include/asm-avr32/arch-at32ap/board.h index 1a7b07d436ff..9fd2e32f84b8 100644 --- a/include/asm-avr32/arch-at32ap/board.h +++ b/include/asm-avr32/arch-at32ap/board.h | |||
| @@ -30,11 +30,9 @@ struct spi_board_info; | |||
| 30 | struct platform_device * | 30 | struct platform_device * |
| 31 | at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n); | 31 | at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n); |
| 32 | 32 | ||
| 33 | struct lcdc_platform_data { | 33 | struct atmel_lcdfb_info; |
| 34 | unsigned long fbmem_start; | ||
| 35 | unsigned long fbmem_size; | ||
| 36 | }; | ||
| 37 | struct platform_device * | 34 | struct platform_device * |
| 38 | at32_add_device_lcdc(unsigned int id, struct lcdc_platform_data *data); | 35 | at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data, |
| 36 | unsigned long fbmem_start, unsigned long fbmem_len); | ||
| 39 | 37 | ||
| 40 | #endif /* __ASM_ARCH_BOARD_H */ | 38 | #endif /* __ASM_ARCH_BOARD_H */ |
diff --git a/include/asm-avr32/kdebug.h b/include/asm-avr32/kdebug.h index de419278fc39..7f54e2b15d13 100644 --- a/include/asm-avr32/kdebug.h +++ b/include/asm-avr32/kdebug.h | |||
| @@ -5,13 +5,22 @@ | |||
| 5 | 5 | ||
| 6 | /* Grossly misnamed. */ | 6 | /* Grossly misnamed. */ |
| 7 | enum die_val { | 7 | enum die_val { |
| 8 | DIE_FAULT, | ||
| 9 | DIE_BREAKPOINT, | 8 | DIE_BREAKPOINT, |
| 10 | DIE_SSTEP, | 9 | DIE_SSTEP, |
| 11 | DIE_PAGE_FAULT, | ||
| 12 | }; | 10 | }; |
| 13 | 11 | ||
| 14 | int register_page_fault_notifier(struct notifier_block *nb); | 12 | /* |
| 15 | int unregister_page_fault_notifier(struct notifier_block *nb); | 13 | * These are only here because kprobes.c wants them to implement a |
| 14 | * blatant layering violation. Will hopefully go away soon once all | ||
| 15 | * architectures are updated. | ||
| 16 | */ | ||
| 17 | static inline int register_page_fault_notifier(struct notifier_block *nb) | ||
| 18 | { | ||
| 19 | return 0; | ||
| 20 | } | ||
| 21 | static inline int unregister_page_fault_notifier(struct notifier_block *nb) | ||
| 22 | { | ||
| 23 | return 0; | ||
| 24 | } | ||
| 16 | 25 | ||
| 17 | #endif /* __ASM_AVR32_KDEBUG_H */ | 26 | #endif /* __ASM_AVR32_KDEBUG_H */ |
diff --git a/include/asm-avr32/kprobes.h b/include/asm-avr32/kprobes.h index 09a5cbe2f896..190a6377c809 100644 --- a/include/asm-avr32/kprobes.h +++ b/include/asm-avr32/kprobes.h | |||
| @@ -26,6 +26,7 @@ struct arch_specific_insn { | |||
| 26 | kprobe_opcode_t insn[MAX_INSN_SIZE]; | 26 | kprobe_opcode_t insn[MAX_INSN_SIZE]; |
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); | ||
| 29 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 30 | extern int kprobe_exceptions_notify(struct notifier_block *self, |
| 30 | unsigned long val, void *data); | 31 | unsigned long val, void *data); |
| 31 | 32 | ||
diff --git a/include/asm-avr32/unistd.h b/include/asm-avr32/unistd.h index 2418cce624cc..3b4e35b55c82 100644 --- a/include/asm-avr32/unistd.h +++ b/include/asm-avr32/unistd.h | |||
| @@ -296,9 +296,12 @@ | |||
| 296 | #define __NR_shmctl 277 | 296 | #define __NR_shmctl 277 |
| 297 | 297 | ||
| 298 | #define __NR_utimensat 278 | 298 | #define __NR_utimensat 278 |
| 299 | #define __NR_signalfd 279 | ||
| 300 | #define __NR_timerfd 280 | ||
| 301 | #define __NR_eventfd 281 | ||
| 299 | 302 | ||
| 300 | #ifdef __KERNEL__ | 303 | #ifdef __KERNEL__ |
| 301 | #define NR_syscalls 279 | 304 | #define NR_syscalls 282 |
| 302 | 305 | ||
| 303 | 306 | ||
| 304 | #define __ARCH_WANT_IPC_PARSE_VERSION | 307 | #define __ARCH_WANT_IPC_PARSE_VERSION |
diff --git a/include/asm-ia64/kdebug.h b/include/asm-ia64/kdebug.h index ba211e011a1d..320cd8e754ea 100644 --- a/include/asm-ia64/kdebug.h +++ b/include/asm-ia64/kdebug.h | |||
| @@ -28,14 +28,24 @@ | |||
| 28 | */ | 28 | */ |
| 29 | #include <linux/notifier.h> | 29 | #include <linux/notifier.h> |
| 30 | 30 | ||
| 31 | extern int register_page_fault_notifier(struct notifier_block *); | 31 | /* |
| 32 | extern int unregister_page_fault_notifier(struct notifier_block *); | 32 | * These are only here because kprobes.c wants them to implement a |
| 33 | * blatant layering violation. Will hopefully go away soon once all | ||
| 34 | * architectures are updated. | ||
| 35 | */ | ||
| 36 | static inline int register_page_fault_notifier(struct notifier_block *nb) | ||
| 37 | { | ||
| 38 | return 0; | ||
| 39 | } | ||
| 40 | static inline int unregister_page_fault_notifier(struct notifier_block *nb) | ||
| 41 | { | ||
| 42 | return 0; | ||
| 43 | } | ||
| 33 | 44 | ||
| 34 | enum die_val { | 45 | enum die_val { |
| 35 | DIE_BREAK = 1, | 46 | DIE_BREAK = 1, |
| 36 | DIE_FAULT, | 47 | DIE_FAULT, |
| 37 | DIE_OOPS, | 48 | DIE_OOPS, |
| 38 | DIE_PAGE_FAULT, | ||
| 39 | DIE_MACHINE_HALT, | 49 | DIE_MACHINE_HALT, |
| 40 | DIE_MACHINE_RESTART, | 50 | DIE_MACHINE_RESTART, |
| 41 | DIE_MCA_MONARCH_ENTER, | 51 | DIE_MCA_MONARCH_ENTER, |
diff --git a/include/asm-ia64/kprobes.h b/include/asm-ia64/kprobes.h index 2abc98b336f3..6382e52ec227 100644 --- a/include/asm-ia64/kprobes.h +++ b/include/asm-ia64/kprobes.h | |||
| @@ -120,6 +120,7 @@ struct arch_specific_insn { | |||
| 120 | unsigned short slot; | 120 | unsigned short slot; |
| 121 | }; | 121 | }; |
| 122 | 122 | ||
| 123 | extern int kprobes_fault_handler(struct pt_regs *regs, int trapnr); | ||
| 123 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 124 | extern int kprobe_exceptions_notify(struct notifier_block *self, |
| 124 | unsigned long val, void *data); | 125 | unsigned long val, void *data); |
| 125 | 126 | ||
diff --git a/include/asm-ia64/unistd.h b/include/asm-ia64/unistd.h index f049bc40ca7d..d7781a2ddefe 100644 --- a/include/asm-ia64/unistd.h +++ b/include/asm-ia64/unistd.h | |||
| @@ -296,11 +296,14 @@ | |||
| 296 | #define __NR_getcpu 1304 | 296 | #define __NR_getcpu 1304 |
| 297 | #define __NR_epoll_pwait 1305 | 297 | #define __NR_epoll_pwait 1305 |
| 298 | #define __NR_utimensat 1306 | 298 | #define __NR_utimensat 1306 |
| 299 | #define __NR_signalfd 1307 | ||
| 300 | #define __NR_timerfd 1308 | ||
| 301 | #define __NR_eventfd 1309 | ||
| 299 | 302 | ||
| 300 | #ifdef __KERNEL__ | 303 | #ifdef __KERNEL__ |
| 301 | 304 | ||
| 302 | 305 | ||
| 303 | #define NR_syscalls 283 /* length of syscall table */ | 306 | #define NR_syscalls 286 /* length of syscall table */ |
| 304 | 307 | ||
| 305 | #define __ARCH_WANT_SYS_RT_SIGACTION | 308 | #define __ARCH_WANT_SYS_RT_SIGACTION |
| 306 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | 309 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND |
diff --git a/include/asm-sparc64/hypervisor.h b/include/asm-sparc64/hypervisor.h index 612bf319753f..a5558c87556d 100644 --- a/include/asm-sparc64/hypervisor.h +++ b/include/asm-sparc64/hypervisor.h | |||
| @@ -940,6 +940,54 @@ struct hv_fault_status { | |||
| 940 | */ | 940 | */ |
| 941 | #define HV_FAST_CONS_PUTCHAR 0x61 | 941 | #define HV_FAST_CONS_PUTCHAR 0x61 |
| 942 | 942 | ||
| 943 | /* con_read() | ||
| 944 | * TRAP: HV_FAST_TRAP | ||
| 945 | * FUNCTION: HV_FAST_CONS_READ | ||
| 946 | * ARG0: buffer real address | ||
| 947 | * ARG1: buffer size in bytes | ||
| 948 | * RET0: status | ||
| 949 | * RET1: bytes read or BREAK or HUP | ||
| 950 | * ERRORS: EWOULDBLOCK No character available. | ||
| 951 | * | ||
| 952 | * Reads characters into a buffer from the console device. If no | ||
| 953 | * character is available then an EWOULDBLOCK error is returned. | ||
| 954 | * If a character is available, then the returned status is EOK | ||
| 955 | * and the number of bytes read into the given buffer is provided | ||
| 956 | * in RET1. | ||
| 957 | * | ||
| 958 | * A virtual BREAK is represented by the 64-bit RET1 value -1. | ||
| 959 | * | ||
| 960 | * A virtual HUP signal is represented by the 64-bit RET1 value -2. | ||
| 961 | * | ||
| 962 | * If BREAK or HUP are indicated, no bytes were read into buffer. | ||
| 963 | */ | ||
| 964 | #define HV_FAST_CONS_READ 0x62 | ||
| 965 | |||
| 966 | /* con_write() | ||
| 967 | * TRAP: HV_FAST_TRAP | ||
| 968 | * FUNCTION: HV_FAST_CONS_WRITE | ||
| 969 | * ARG0: buffer real address | ||
| 970 | * ARG1: buffer size in bytes | ||
| 971 | * RET0: status | ||
| 972 | * RET1: bytes written | ||
| 973 | * ERRORS: EWOULDBLOCK Output buffer currently full, would block | ||
| 974 | * | ||
| 975 | * Send a characters in buffer to the console device. Breaks must be | ||
| 976 | * sent using con_putchar(). | ||
| 977 | */ | ||
| 978 | #define HV_FAST_CONS_WRITE 0x63 | ||
| 979 | |||
| 980 | #ifndef __ASSEMBLY__ | ||
| 981 | extern long sun4v_con_getchar(long *status); | ||
| 982 | extern long sun4v_con_putchar(long c); | ||
| 983 | extern long sun4v_con_read(unsigned long buffer, | ||
| 984 | unsigned long size, | ||
| 985 | unsigned long *bytes_read); | ||
| 986 | extern unsigned long sun4v_con_write(unsigned long buffer, | ||
| 987 | unsigned long size, | ||
| 988 | unsigned long *bytes_written); | ||
| 989 | #endif | ||
| 990 | |||
| 943 | /* Trap trace services. | 991 | /* Trap trace services. |
| 944 | * | 992 | * |
| 945 | * The hypervisor provides a trap tracing capability for privileged | 993 | * The hypervisor provides a trap tracing capability for privileged |
| @@ -2121,8 +2169,41 @@ struct hv_mmu_statistics { | |||
| 2121 | #define HV_FAST_MMUSTAT_INFO 0x103 | 2169 | #define HV_FAST_MMUSTAT_INFO 0x103 |
| 2122 | 2170 | ||
| 2123 | /* Function numbers for HV_CORE_TRAP. */ | 2171 | /* Function numbers for HV_CORE_TRAP. */ |
| 2124 | #define HV_CORE_VER 0x00 | 2172 | #define HV_CORE_SET_VER 0x00 |
| 2125 | #define HV_CORE_PUTCHAR 0x01 | 2173 | #define HV_CORE_PUTCHAR 0x01 |
| 2126 | #define HV_CORE_EXIT 0x02 | 2174 | #define HV_CORE_EXIT 0x02 |
| 2175 | #define HV_CORE_GET_VER 0x03 | ||
| 2176 | |||
| 2177 | /* Hypervisor API groups for use with HV_CORE_SET_VER and | ||
| 2178 | * HV_CORE_GET_VER. | ||
| 2179 | */ | ||
| 2180 | #define HV_GRP_SUN4V 0x0000 | ||
| 2181 | #define HV_GRP_CORE 0x0001 | ||
| 2182 | #define HV_GRP_INTR 0x0002 | ||
| 2183 | #define HV_GRP_SOFT_STATE 0x0003 | ||
| 2184 | #define HV_GRP_PCI 0x0100 | ||
| 2185 | #define HV_GRP_LDOM 0x0101 | ||
| 2186 | #define HV_GRP_SVC_CHAN 0x0102 | ||
| 2187 | #define HV_GRP_NCS 0x0103 | ||
| 2188 | #define HV_GRP_NIAG_PERF 0x0200 | ||
| 2189 | #define HV_GRP_FIRE_PERF 0x0201 | ||
| 2190 | #define HV_GRP_DIAG 0x0300 | ||
| 2191 | |||
| 2192 | #ifndef __ASSEMBLY__ | ||
| 2193 | extern unsigned long sun4v_get_version(unsigned long group, | ||
| 2194 | unsigned long *major, | ||
| 2195 | unsigned long *minor); | ||
| 2196 | extern unsigned long sun4v_set_version(unsigned long group, | ||
| 2197 | unsigned long major, | ||
| 2198 | unsigned long minor, | ||
| 2199 | unsigned long *actual_minor); | ||
| 2200 | |||
| 2201 | extern int sun4v_hvapi_register(unsigned long group, unsigned long major, | ||
| 2202 | unsigned long *minor); | ||
| 2203 | extern void sun4v_hvapi_unregister(unsigned long group); | ||
| 2204 | extern int sun4v_hvapi_get(unsigned long group, | ||
| 2205 | unsigned long *major, | ||
| 2206 | unsigned long *minor); | ||
| 2207 | #endif | ||
| 2127 | 2208 | ||
| 2128 | #endif /* !(_SPARC64_HYPERVISOR_H) */ | 2209 | #endif /* !(_SPARC64_HYPERVISOR_H) */ |
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index fd6627e2d115..c6c1f4a120e3 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
| @@ -88,7 +88,7 @@ static inline int kmalloc_index(int size) | |||
| 88 | */ | 88 | */ |
| 89 | WARN_ON_ONCE(size == 0); | 89 | WARN_ON_ONCE(size == 0); |
| 90 | 90 | ||
| 91 | if (size >= (1 << KMALLOC_SHIFT_HIGH)) | 91 | if (size > (1 << KMALLOC_SHIFT_HIGH)) |
| 92 | return -1; | 92 | return -1; |
| 93 | 93 | ||
| 94 | if (size > 64 && size <= 96) | 94 | if (size > 64 && size <= 96) |
diff --git a/kernel/power/main.c b/kernel/power/main.c index 40d56a31245e..b98b80ccf437 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
| @@ -97,25 +97,26 @@ static int suspend_prepare(suspend_state_t state) | |||
| 97 | } | 97 | } |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | if (pm_ops->prepare) { | ||
| 101 | if ((error = pm_ops->prepare(state))) | ||
| 102 | goto Thaw; | ||
| 103 | } | ||
| 104 | |||
| 105 | suspend_console(); | 100 | suspend_console(); |
| 106 | error = device_suspend(PMSG_SUSPEND); | 101 | error = device_suspend(PMSG_SUSPEND); |
| 107 | if (error) { | 102 | if (error) { |
| 108 | printk(KERN_ERR "Some devices failed to suspend\n"); | 103 | printk(KERN_ERR "Some devices failed to suspend\n"); |
| 109 | goto Resume_devices; | 104 | goto Resume_console; |
| 110 | } | 105 | } |
| 106 | if (pm_ops->prepare) { | ||
| 107 | if ((error = pm_ops->prepare(state))) | ||
| 108 | goto Resume_devices; | ||
| 109 | } | ||
| 110 | |||
| 111 | error = disable_nonboot_cpus(); | 111 | error = disable_nonboot_cpus(); |
| 112 | if (!error) | 112 | if (!error) |
| 113 | return 0; | 113 | return 0; |
| 114 | 114 | ||
| 115 | enable_nonboot_cpus(); | 115 | enable_nonboot_cpus(); |
| 116 | Resume_devices: | ||
| 117 | pm_finish(state); | 116 | pm_finish(state); |
| 117 | Resume_devices: | ||
| 118 | device_resume(); | 118 | device_resume(); |
| 119 | Resume_console: | ||
| 119 | resume_console(); | 120 | resume_console(); |
| 120 | Thaw: | 121 | Thaw: |
| 121 | thaw_processes(); | 122 | thaw_processes(); |
diff --git a/mm/filemap.c b/mm/filemap.c index 7b48b2ad00e7..edb1b0b5cc8d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -670,7 +670,8 @@ repeat: | |||
| 670 | page = find_lock_page(mapping, index); | 670 | page = find_lock_page(mapping, index); |
| 671 | if (!page) { | 671 | if (!page) { |
| 672 | if (!cached_page) { | 672 | if (!cached_page) { |
| 673 | cached_page = alloc_page(gfp_mask); | 673 | cached_page = |
| 674 | __page_cache_alloc(gfp_mask); | ||
| 674 | if (!cached_page) | 675 | if (!cached_page) |
| 675 | return NULL; | 676 | return NULL; |
| 676 | } | 677 | } |
| @@ -2522,7 +2522,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, | |||
| 2522 | struct kmem_cache *s; | 2522 | struct kmem_cache *s; |
| 2523 | 2523 | ||
| 2524 | down_write(&slub_lock); | 2524 | down_write(&slub_lock); |
| 2525 | s = find_mergeable(size, align, flags, dtor, ctor); | 2525 | s = find_mergeable(size, align, flags, ctor, dtor); |
| 2526 | if (s) { | 2526 | if (s) { |
| 2527 | s->refcount++; | 2527 | s->refcount++; |
| 2528 | /* | 2528 | /* |
