diff options
Diffstat (limited to 'arch')
248 files changed, 5489 insertions, 1319 deletions
diff --git a/arch/alpha/include/asm/percpu.h b/arch/alpha/include/asm/percpu.h index 06c5c7a4afd3..b663f1f10b6a 100644 --- a/arch/alpha/include/asm/percpu.h +++ b/arch/alpha/include/asm/percpu.h | |||
| @@ -30,7 +30,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; | |||
| 30 | 30 | ||
| 31 | #ifndef MODULE | 31 | #ifndef MODULE |
| 32 | #define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset)) | 32 | #define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset)) |
| 33 | #define PER_CPU_ATTRIBUTES | 33 | #define PER_CPU_DEF_ATTRIBUTES |
| 34 | #else | 34 | #else |
| 35 | /* | 35 | /* |
| 36 | * To calculate addresses of locally defined variables, GCC uses 32-bit | 36 | * To calculate addresses of locally defined variables, GCC uses 32-bit |
| @@ -49,7 +49,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; | |||
| 49 | : "=&r"(__ptr), "=&r"(tmp_gp)); \ | 49 | : "=&r"(__ptr), "=&r"(tmp_gp)); \ |
| 50 | (typeof(&per_cpu_var(var)))(__ptr + (offset)); }) | 50 | (typeof(&per_cpu_var(var)))(__ptr + (offset)); }) |
| 51 | 51 | ||
| 52 | #define PER_CPU_ATTRIBUTES __used | 52 | #define PER_CPU_DEF_ATTRIBUTES __used |
| 53 | 53 | ||
| 54 | #endif /* MODULE */ | 54 | #endif /* MODULE */ |
| 55 | 55 | ||
| @@ -71,7 +71,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; | |||
| 71 | #define __get_cpu_var(var) per_cpu_var(var) | 71 | #define __get_cpu_var(var) per_cpu_var(var) |
| 72 | #define __raw_get_cpu_var(var) per_cpu_var(var) | 72 | #define __raw_get_cpu_var(var) per_cpu_var(var) |
| 73 | 73 | ||
| 74 | #define PER_CPU_ATTRIBUTES | 74 | #define PER_CPU_DEF_ATTRIBUTES |
| 75 | 75 | ||
| 76 | #endif /* SMP */ | 76 | #endif /* SMP */ |
| 77 | 77 | ||
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index a71fd941ade7..a89e4734b8f0 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
| @@ -99,14 +99,6 @@ config DEBUG_CLPS711X_UART2 | |||
| 99 | output to the second serial port on these devices. Saying N will | 99 | output to the second serial port on these devices. Saying N will |
| 100 | cause the debug messages to appear on the first serial port. | 100 | cause the debug messages to appear on the first serial port. |
| 101 | 101 | ||
| 102 | config DEBUG_S3C_PORT | ||
| 103 | depends on DEBUG_LL && PLAT_S3C | ||
| 104 | bool "Kernel low-level debugging messages via S3C UART" | ||
| 105 | help | ||
| 106 | Say Y here if you want debug print routines to go to one of the | ||
| 107 | S3C internal UARTs. The chosen UART must have been configured | ||
| 108 | before it is used. | ||
| 109 | |||
| 110 | config DEBUG_S3C_UART | 102 | config DEBUG_S3C_UART |
| 111 | depends on PLAT_S3C | 103 | depends on PLAT_S3C |
| 112 | int "S3C UART to use for low-level debug" | 104 | int "S3C UART to use for low-level debug" |
diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig index 2d58b8fe59be..b49810461e41 100644 --- a/arch/arm/configs/s3c2410_defconfig +++ b/arch/arm/configs/s3c2410_defconfig | |||
| @@ -260,6 +260,7 @@ CONFIG_MACH_NEXCODER_2440=y | |||
| 260 | CONFIG_SMDK2440_CPU2440=y | 260 | CONFIG_SMDK2440_CPU2440=y |
| 261 | CONFIG_MACH_AT2440EVB=y | 261 | CONFIG_MACH_AT2440EVB=y |
| 262 | CONFIG_CPU_S3C2442=y | 262 | CONFIG_CPU_S3C2442=y |
| 263 | CONFIG_MACH_MINI2440=y | ||
| 263 | 264 | ||
| 264 | # | 265 | # |
| 265 | # S3C2442 Machines | 266 | # S3C2442 Machines |
| @@ -2298,7 +2299,6 @@ CONFIG_DEBUG_ERRORS=y | |||
| 2298 | # CONFIG_DEBUG_STACK_USAGE is not set | 2299 | # CONFIG_DEBUG_STACK_USAGE is not set |
| 2299 | CONFIG_DEBUG_LL=y | 2300 | CONFIG_DEBUG_LL=y |
| 2300 | # CONFIG_DEBUG_ICEDCC is not set | 2301 | # CONFIG_DEBUG_ICEDCC is not set |
| 2301 | CONFIG_DEBUG_S3C_PORT=y | ||
| 2302 | CONFIG_DEBUG_S3C_UART=0 | 2302 | CONFIG_DEBUG_S3C_UART=0 |
| 2303 | 2303 | ||
| 2304 | # | 2304 | # |
diff --git a/arch/arm/configs/s3c6400_defconfig b/arch/arm/configs/s3c6400_defconfig index 2e8fa50e9a09..32860609e057 100644 --- a/arch/arm/configs/s3c6400_defconfig +++ b/arch/arm/configs/s3c6400_defconfig | |||
| @@ -816,7 +816,6 @@ CONFIG_DEBUG_ERRORS=y | |||
| 816 | # CONFIG_DEBUG_STACK_USAGE is not set | 816 | # CONFIG_DEBUG_STACK_USAGE is not set |
| 817 | CONFIG_DEBUG_LL=y | 817 | CONFIG_DEBUG_LL=y |
| 818 | # CONFIG_DEBUG_ICEDCC is not set | 818 | # CONFIG_DEBUG_ICEDCC is not set |
| 819 | CONFIG_DEBUG_S3C_PORT=y | ||
| 820 | CONFIG_DEBUG_S3C_UART=0 | 819 | CONFIG_DEBUG_S3C_UART=0 |
| 821 | 820 | ||
| 822 | # | 821 | # |
diff --git a/arch/arm/configs/tct_hammer_defconfig b/arch/arm/configs/tct_hammer_defconfig index 07dfb98df4f0..9d32faef05f6 100644 --- a/arch/arm/configs/tct_hammer_defconfig +++ b/arch/arm/configs/tct_hammer_defconfig | |||
| @@ -857,7 +857,6 @@ CONFIG_DEBUG_ERRORS=y | |||
| 857 | # CONFIG_DEBUG_STACK_USAGE is not set | 857 | # CONFIG_DEBUG_STACK_USAGE is not set |
| 858 | CONFIG_DEBUG_LL=y | 858 | CONFIG_DEBUG_LL=y |
| 859 | # CONFIG_DEBUG_ICEDCC is not set | 859 | # CONFIG_DEBUG_ICEDCC is not set |
| 860 | # CONFIG_DEBUG_S3C_PORT is not set | ||
| 861 | CONFIG_DEBUG_S3C_UART=0 | 860 | CONFIG_DEBUG_S3C_UART=0 |
| 862 | 861 | ||
| 863 | # | 862 | # |
diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h index be962c1349c4..9c746af1bf6e 100644 --- a/arch/arm/include/asm/page.h +++ b/arch/arm/include/asm/page.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | /* PAGE_SHIFT determines the page size */ | 13 | /* PAGE_SHIFT determines the page size */ |
| 14 | #define PAGE_SHIFT 12 | 14 | #define PAGE_SHIFT 12 |
| 15 | #define PAGE_SIZE (1UL << PAGE_SHIFT) | 15 | #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) |
| 16 | #define PAGE_MASK (~(PAGE_SIZE-1)) | 16 | #define PAGE_MASK (~(PAGE_SIZE-1)) |
| 17 | 17 | ||
| 18 | #ifndef __ASSEMBLY__ | 18 | #ifndef __ASSEMBLY__ |
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 096f600dc8d8..b7c3490eaa24 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c | |||
| @@ -98,17 +98,6 @@ unlock: | |||
| 98 | return 0; | 98 | return 0; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | /* Handle bad interrupts */ | ||
| 102 | static struct irq_desc bad_irq_desc = { | ||
| 103 | .handle_irq = handle_bad_irq, | ||
| 104 | .lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock), | ||
| 105 | }; | ||
| 106 | |||
| 107 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
| 108 | /* We are not allocating bad_irq_desc.affinity or .pending_mask */ | ||
| 109 | #error "ARM architecture does not support CONFIG_CPUMASK_OFFSTACK." | ||
| 110 | #endif | ||
| 111 | |||
| 112 | /* | 101 | /* |
| 113 | * do_IRQ handles all hardware IRQ's. Decoded IRQs should not | 102 | * do_IRQ handles all hardware IRQ's. Decoded IRQs should not |
| 114 | * come via this function. Instead, they should provide their | 103 | * come via this function. Instead, they should provide their |
| @@ -124,10 +113,13 @@ asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs) | |||
| 124 | * Some hardware gives randomly wrong interrupts. Rather | 113 | * Some hardware gives randomly wrong interrupts. Rather |
| 125 | * than crashing, do something sensible. | 114 | * than crashing, do something sensible. |
| 126 | */ | 115 | */ |
| 127 | if (irq >= NR_IRQS) | 116 | if (unlikely(irq >= NR_IRQS)) { |
| 128 | handle_bad_irq(irq, &bad_irq_desc); | 117 | if (printk_ratelimit()) |
| 129 | else | 118 | printk(KERN_WARNING "Bad IRQ%u\n", irq); |
| 119 | ack_bad_irq(irq); | ||
| 120 | } else { | ||
| 130 | generic_handle_irq(irq); | 121 | generic_handle_irq(irq); |
| 122 | } | ||
| 131 | 123 | ||
| 132 | /* AT91 specific workaround */ | 124 | /* AT91 specific workaround */ |
| 133 | irq_finish(irq); | 125 | irq_finish(irq); |
| @@ -165,10 +157,6 @@ void __init init_IRQ(void) | |||
| 165 | for (irq = 0; irq < NR_IRQS; irq++) | 157 | for (irq = 0; irq < NR_IRQS; irq++) |
| 166 | irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE; | 158 | irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE; |
| 167 | 159 | ||
| 168 | #ifdef CONFIG_SMP | ||
| 169 | cpumask_setall(bad_irq_desc.affinity); | ||
| 170 | bad_irq_desc.node = smp_processor_id(); | ||
| 171 | #endif | ||
| 172 | init_arch_irq(); | 160 | init_arch_irq(); |
| 173 | } | 161 | } |
| 174 | 162 | ||
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 4340bf3d2c84..69371028a202 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <asm-generic/vmlinux.lds.h> | 6 | #include <asm-generic/vmlinux.lds.h> |
| 7 | #include <asm/thread_info.h> | 7 | #include <asm/thread_info.h> |
| 8 | #include <asm/memory.h> | 8 | #include <asm/memory.h> |
| 9 | #include <asm/page.h> | ||
| 9 | 10 | ||
| 10 | OUTPUT_ARCH(arm) | 11 | OUTPUT_ARCH(arm) |
| 11 | ENTRY(stext) | 12 | ENTRY(stext) |
| @@ -63,7 +64,7 @@ SECTIONS | |||
| 63 | usr/built-in.o(.init.ramfs) | 64 | usr/built-in.o(.init.ramfs) |
| 64 | __initramfs_end = .; | 65 | __initramfs_end = .; |
| 65 | #endif | 66 | #endif |
| 66 | . = ALIGN(4096); | 67 | . = ALIGN(PAGE_SIZE); |
| 67 | __per_cpu_load = .; | 68 | __per_cpu_load = .; |
| 68 | __per_cpu_start = .; | 69 | __per_cpu_start = .; |
| 69 | *(.data.percpu.page_aligned) | 70 | *(.data.percpu.page_aligned) |
| @@ -73,7 +74,7 @@ SECTIONS | |||
| 73 | #ifndef CONFIG_XIP_KERNEL | 74 | #ifndef CONFIG_XIP_KERNEL |
| 74 | __init_begin = _stext; | 75 | __init_begin = _stext; |
| 75 | INIT_DATA | 76 | INIT_DATA |
| 76 | . = ALIGN(4096); | 77 | . = ALIGN(PAGE_SIZE); |
| 77 | __init_end = .; | 78 | __init_end = .; |
| 78 | #endif | 79 | #endif |
| 79 | } | 80 | } |
| @@ -118,7 +119,7 @@ SECTIONS | |||
| 118 | *(.got) /* Global offset table */ | 119 | *(.got) /* Global offset table */ |
| 119 | } | 120 | } |
| 120 | 121 | ||
| 121 | RODATA | 122 | RO_DATA(PAGE_SIZE) |
| 122 | 123 | ||
| 123 | _etext = .; /* End of text and rodata section */ | 124 | _etext = .; /* End of text and rodata section */ |
| 124 | 125 | ||
| @@ -158,17 +159,17 @@ SECTIONS | |||
| 158 | *(.data.init_task) | 159 | *(.data.init_task) |
| 159 | 160 | ||
| 160 | #ifdef CONFIG_XIP_KERNEL | 161 | #ifdef CONFIG_XIP_KERNEL |
| 161 | . = ALIGN(4096); | 162 | . = ALIGN(PAGE_SIZE); |
| 162 | __init_begin = .; | 163 | __init_begin = .; |
| 163 | INIT_DATA | 164 | INIT_DATA |
| 164 | . = ALIGN(4096); | 165 | . = ALIGN(PAGE_SIZE); |
| 165 | __init_end = .; | 166 | __init_end = .; |
| 166 | #endif | 167 | #endif |
| 167 | 168 | ||
| 168 | . = ALIGN(4096); | 169 | . = ALIGN(PAGE_SIZE); |
| 169 | __nosave_begin = .; | 170 | __nosave_begin = .; |
| 170 | *(.data.nosave) | 171 | *(.data.nosave) |
| 171 | . = ALIGN(4096); | 172 | . = ALIGN(PAGE_SIZE); |
| 172 | __nosave_end = .; | 173 | __nosave_end = .; |
| 173 | 174 | ||
| 174 | /* | 175 | /* |
diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index cc270beadd5d..a55398ed1211 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
| 25 | #include <linux/spi/spi.h> | 25 | #include <linux/spi/spi.h> |
| 26 | #include <linux/spi/at73c213.h> | 26 | #include <linux/spi/at73c213.h> |
| 27 | #include <linux/gpio_keys.h> | ||
| 28 | #include <linux/input.h> | ||
| 27 | #include <linux/clk.h> | 29 | #include <linux/clk.h> |
| 28 | 30 | ||
| 29 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
| @@ -218,6 +220,56 @@ static struct gpio_led ek_leds[] = { | |||
| 218 | } | 220 | } |
| 219 | }; | 221 | }; |
| 220 | 222 | ||
| 223 | |||
| 224 | /* | ||
| 225 | * GPIO Buttons | ||
| 226 | */ | ||
| 227 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
| 228 | static struct gpio_keys_button ek_buttons[] = { | ||
| 229 | { | ||
| 230 | .gpio = AT91_PIN_PA30, | ||
| 231 | .code = BTN_3, | ||
| 232 | .desc = "Button 3", | ||
| 233 | .active_low = 1, | ||
| 234 | .wakeup = 1, | ||
| 235 | }, | ||
| 236 | { | ||
| 237 | .gpio = AT91_PIN_PA31, | ||
| 238 | .code = BTN_4, | ||
| 239 | .desc = "Button 4", | ||
| 240 | .active_low = 1, | ||
| 241 | .wakeup = 1, | ||
| 242 | } | ||
| 243 | }; | ||
| 244 | |||
| 245 | static struct gpio_keys_platform_data ek_button_data = { | ||
| 246 | .buttons = ek_buttons, | ||
| 247 | .nbuttons = ARRAY_SIZE(ek_buttons), | ||
| 248 | }; | ||
| 249 | |||
| 250 | static struct platform_device ek_button_device = { | ||
| 251 | .name = "gpio-keys", | ||
| 252 | .id = -1, | ||
| 253 | .num_resources = 0, | ||
| 254 | .dev = { | ||
| 255 | .platform_data = &ek_button_data, | ||
| 256 | } | ||
| 257 | }; | ||
| 258 | |||
| 259 | static void __init ek_add_device_buttons(void) | ||
| 260 | { | ||
| 261 | at91_set_gpio_input(AT91_PIN_PA30, 1); /* btn3 */ | ||
| 262 | at91_set_deglitch(AT91_PIN_PA30, 1); | ||
| 263 | at91_set_gpio_input(AT91_PIN_PA31, 1); /* btn4 */ | ||
| 264 | at91_set_deglitch(AT91_PIN_PA31, 1); | ||
| 265 | |||
| 266 | platform_device_register(&ek_button_device); | ||
| 267 | } | ||
| 268 | #else | ||
| 269 | static void __init ek_add_device_buttons(void) {} | ||
| 270 | #endif | ||
| 271 | |||
| 272 | |||
| 221 | static struct i2c_board_info __initdata ek_i2c_devices[] = { | 273 | static struct i2c_board_info __initdata ek_i2c_devices[] = { |
| 222 | { | 274 | { |
| 223 | I2C_BOARD_INFO("24c512", 0x50), | 275 | I2C_BOARD_INFO("24c512", 0x50), |
| @@ -245,6 +297,8 @@ static void __init ek_board_init(void) | |||
| 245 | at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices)); | 297 | at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices)); |
| 246 | /* LEDs */ | 298 | /* LEDs */ |
| 247 | at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); | 299 | at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); |
| 300 | /* Push Buttons */ | ||
| 301 | ek_add_device_buttons(); | ||
| 248 | /* PCK0 provides MCLK to the WM8731 */ | 302 | /* PCK0 provides MCLK to the WM8731 */ |
| 249 | at91_set_B_periph(AT91_PIN_PC1, 0); | 303 | at91_set_B_periph(AT91_PIN_PC1, 0); |
| 250 | /* SSC (for WM8731) */ | 304 | /* SSC (for WM8731) */ |
diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index 35e12a49d1a6..f6b5672cabd6 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c | |||
| @@ -186,19 +186,21 @@ static struct fb_monspecs at91fb_default_monspecs = { | |||
| 186 | static void at91_lcdc_power_control(int on) | 186 | static void at91_lcdc_power_control(int on) |
| 187 | { | 187 | { |
| 188 | if (on) | 188 | if (on) |
| 189 | at91_set_gpio_value(AT91_PIN_PA30, 0); /* power up */ | 189 | at91_set_gpio_value(AT91_PIN_PC1, 0); /* power up */ |
| 190 | else | 190 | else |
| 191 | at91_set_gpio_value(AT91_PIN_PA30, 1); /* power down */ | 191 | at91_set_gpio_value(AT91_PIN_PC1, 1); /* power down */ |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | /* Driver datas */ | 194 | /* Driver datas */ |
| 195 | static struct atmel_lcdfb_info __initdata ek_lcdc_data = { | 195 | static struct atmel_lcdfb_info __initdata ek_lcdc_data = { |
| 196 | .lcdcon_is_backlight = true, | ||
| 196 | .default_bpp = 16, | 197 | .default_bpp = 16, |
| 197 | .default_dmacon = ATMEL_LCDC_DMAEN, | 198 | .default_dmacon = ATMEL_LCDC_DMAEN, |
| 198 | .default_lcdcon2 = AT91SAM9RL_DEFAULT_LCDCON2, | 199 | .default_lcdcon2 = AT91SAM9RL_DEFAULT_LCDCON2, |
| 199 | .default_monspecs = &at91fb_default_monspecs, | 200 | .default_monspecs = &at91fb_default_monspecs, |
| 200 | .atmel_lcdfb_power_control = at91_lcdc_power_control, | 201 | .atmel_lcdfb_power_control = at91_lcdc_power_control, |
| 201 | .guard_time = 1, | 202 | .guard_time = 1, |
| 203 | .lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB, | ||
| 202 | }; | 204 | }; |
| 203 | 205 | ||
| 204 | #else | 206 | #else |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index e70fc7c66bbb..ed2a48a9ce74 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #include <mach/hwa742.h> | 36 | #include <mach/hwa742.h> |
| 37 | #include <mach/lcd_mipid.h> | 37 | #include <mach/lcd_mipid.h> |
| 38 | #include <mach/mmc.h> | 38 | #include <mach/mmc.h> |
| 39 | #include <mach/usb.h> | ||
| 40 | #include <mach/clock.h> | 39 | #include <mach/clock.h> |
| 41 | 40 | ||
| 42 | #define ADS7846_PENDOWN_GPIO 15 | 41 | #define ADS7846_PENDOWN_GPIO 15 |
| @@ -205,9 +204,11 @@ static int nokia770_mmc_get_cover_state(struct device *dev, int slot) | |||
| 205 | static struct omap_mmc_platform_data nokia770_mmc2_data = { | 204 | static struct omap_mmc_platform_data nokia770_mmc2_data = { |
| 206 | .nr_slots = 1, | 205 | .nr_slots = 1, |
| 207 | .dma_mask = 0xffffffff, | 206 | .dma_mask = 0xffffffff, |
| 207 | .max_freq = 12000000, | ||
| 208 | .slots[0] = { | 208 | .slots[0] = { |
| 209 | .set_power = nokia770_mmc_set_power, | 209 | .set_power = nokia770_mmc_set_power, |
| 210 | .get_cover_state = nokia770_mmc_get_cover_state, | 210 | .get_cover_state = nokia770_mmc_get_cover_state, |
| 211 | .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | ||
| 211 | .name = "mmcblk", | 212 | .name = "mmcblk", |
| 212 | }, | 213 | }, |
| 213 | }; | 214 | }; |
diff --git a/arch/arm/mach-omap1/mailbox.c b/arch/arm/mach-omap1/mailbox.c index 0af4d6c85b47..6810b4aeb02c 100644 --- a/arch/arm/mach-omap1/mailbox.c +++ b/arch/arm/mach-omap1/mailbox.c | |||
| @@ -203,5 +203,5 @@ module_exit(omap1_mbox_exit); | |||
| 203 | 203 | ||
| 204 | MODULE_LICENSE("GPL v2"); | 204 | MODULE_LICENSE("GPL v2"); |
| 205 | MODULE_DESCRIPTION("omap mailbox: omap1 architecture specific functions"); | 205 | MODULE_DESCRIPTION("omap mailbox: omap1 architecture specific functions"); |
| 206 | MODULE_AUTHOR("Hiroshi DOYU" <Hiroshi.DOYU@nokia.com>); | 206 | MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>"); |
| 207 | MODULE_ALIAS("platform:omap1-mailbox"); | 207 | MODULE_ALIAS("platform:omap1-mailbox"); |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index da93b86234ed..9a0bf6744a05 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
| @@ -362,6 +362,7 @@ static struct omap_onenand_platform_data board_onenand_data = { | |||
| 362 | .gpio_irq = 65, | 362 | .gpio_irq = 65, |
| 363 | .parts = onenand_partitions, | 363 | .parts = onenand_partitions, |
| 364 | .nr_parts = ARRAY_SIZE(onenand_partitions), | 364 | .nr_parts = ARRAY_SIZE(onenand_partitions), |
| 365 | .flags = ONENAND_SYNC_READWRITE, | ||
| 365 | }; | 366 | }; |
| 366 | 367 | ||
| 367 | static void __init board_onenand_init(void) | 368 | static void __init board_onenand_init(void) |
diff --git a/arch/arm/mach-omap2/gpmc-onenand.c b/arch/arm/mach-omap2/gpmc-onenand.c index 2fd22f9c5f0e..54fec53a48e7 100644 --- a/arch/arm/mach-omap2/gpmc-onenand.c +++ b/arch/arm/mach-omap2/gpmc-onenand.c | |||
| @@ -31,6 +31,8 @@ static struct platform_device gpmc_onenand_device = { | |||
| 31 | static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base) | 31 | static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base) |
| 32 | { | 32 | { |
| 33 | struct gpmc_timings t; | 33 | struct gpmc_timings t; |
| 34 | u32 reg; | ||
| 35 | int err; | ||
| 34 | 36 | ||
| 35 | const int t_cer = 15; | 37 | const int t_cer = 15; |
| 36 | const int t_avdp = 12; | 38 | const int t_avdp = 12; |
| @@ -43,6 +45,11 @@ static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base) | |||
| 43 | const int t_wpl = 40; | 45 | const int t_wpl = 40; |
| 44 | const int t_wph = 30; | 46 | const int t_wph = 30; |
| 45 | 47 | ||
| 48 | /* Ensure sync read and sync write are disabled */ | ||
| 49 | reg = readw(onenand_base + ONENAND_REG_SYS_CFG1); | ||
| 50 | reg &= ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE; | ||
| 51 | writew(reg, onenand_base + ONENAND_REG_SYS_CFG1); | ||
| 52 | |||
| 46 | memset(&t, 0, sizeof(t)); | 53 | memset(&t, 0, sizeof(t)); |
| 47 | t.sync_clk = 0; | 54 | t.sync_clk = 0; |
| 48 | t.cs_on = 0; | 55 | t.cs_on = 0; |
| @@ -74,7 +81,16 @@ static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base) | |||
| 74 | GPMC_CONFIG1_DEVICESIZE_16 | | 81 | GPMC_CONFIG1_DEVICESIZE_16 | |
| 75 | GPMC_CONFIG1_MUXADDDATA); | 82 | GPMC_CONFIG1_MUXADDDATA); |
| 76 | 83 | ||
| 77 | return gpmc_cs_set_timings(cs, &t); | 84 | err = gpmc_cs_set_timings(cs, &t); |
| 85 | if (err) | ||
| 86 | return err; | ||
| 87 | |||
| 88 | /* Ensure sync read and sync write are disabled */ | ||
| 89 | reg = readw(onenand_base + ONENAND_REG_SYS_CFG1); | ||
| 90 | reg &= ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE; | ||
| 91 | writew(reg, onenand_base + ONENAND_REG_SYS_CFG1); | ||
| 92 | |||
| 93 | return 0; | ||
| 78 | } | 94 | } |
| 79 | 95 | ||
| 80 | static void set_onenand_cfg(void __iomem *onenand_base, int latency, | 96 | static void set_onenand_cfg(void __iomem *onenand_base, int latency, |
| @@ -124,7 +140,8 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg, | |||
| 124 | } else if (cfg->flags & ONENAND_SYNC_READWRITE) { | 140 | } else if (cfg->flags & ONENAND_SYNC_READWRITE) { |
| 125 | sync_read = 1; | 141 | sync_read = 1; |
| 126 | sync_write = 1; | 142 | sync_write = 1; |
| 127 | } | 143 | } else |
| 144 | return omap2_onenand_set_async_mode(cs, onenand_base); | ||
| 128 | 145 | ||
| 129 | if (!freq) { | 146 | if (!freq) { |
| 130 | /* Very first call freq is not known */ | 147 | /* Very first call freq is not known */ |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 458990e20c60..a98201cc265c 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
| @@ -48,6 +48,28 @@ int omap_chip_is(struct omap_chip_id oci) | |||
| 48 | } | 48 | } |
| 49 | EXPORT_SYMBOL(omap_chip_is); | 49 | EXPORT_SYMBOL(omap_chip_is); |
| 50 | 50 | ||
| 51 | int omap_type(void) | ||
| 52 | { | ||
| 53 | u32 val = 0; | ||
| 54 | |||
| 55 | if (cpu_is_omap24xx()) | ||
| 56 | val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS); | ||
| 57 | else if (cpu_is_omap34xx()) | ||
| 58 | val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS); | ||
| 59 | else { | ||
| 60 | pr_err("Cannot detect omap type!\n"); | ||
| 61 | goto out; | ||
| 62 | } | ||
| 63 | |||
| 64 | val &= OMAP2_DEVICETYPE_MASK; | ||
| 65 | val >>= 8; | ||
| 66 | |||
| 67 | out: | ||
| 68 | return val; | ||
| 69 | } | ||
| 70 | EXPORT_SYMBOL(omap_type); | ||
| 71 | |||
| 72 | |||
| 51 | /*----------------------------------------------------------------------------*/ | 73 | /*----------------------------------------------------------------------------*/ |
| 52 | 74 | ||
| 53 | #define OMAP_TAP_IDCODE 0x0204 | 75 | #define OMAP_TAP_IDCODE 0x0204 |
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index fd5b8a5925cc..6f71f3730c97 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c | |||
| @@ -282,12 +282,12 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev) | |||
| 282 | return -ENOMEM; | 282 | return -ENOMEM; |
| 283 | 283 | ||
| 284 | /* DSP or IVA2 IRQ */ | 284 | /* DSP or IVA2 IRQ */ |
| 285 | mbox_dsp_info.irq = platform_get_irq(pdev, 0); | 285 | ret = platform_get_irq(pdev, 0); |
| 286 | if (mbox_dsp_info.irq < 0) { | 286 | if (ret < 0) { |
| 287 | dev_err(&pdev->dev, "invalid irq resource\n"); | 287 | dev_err(&pdev->dev, "invalid irq resource\n"); |
| 288 | ret = -ENODEV; | ||
| 289 | goto err_dsp; | 288 | goto err_dsp; |
| 290 | } | 289 | } |
| 290 | mbox_dsp_info.irq = ret; | ||
| 291 | 291 | ||
| 292 | ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info); | 292 | ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info); |
| 293 | if (ret) | 293 | if (ret) |
diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c index 9756a878fd90..1541fd4c8d0f 100644 --- a/arch/arm/mach-omap2/mmc-twl4030.c +++ b/arch/arm/mach-omap2/mmc-twl4030.c | |||
| @@ -263,8 +263,19 @@ static int twl_mmc1_set_power(struct device *dev, int slot, int power_on, | |||
| 263 | static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int vdd) | 263 | static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int vdd) |
| 264 | { | 264 | { |
| 265 | int ret = 0; | 265 | int ret = 0; |
| 266 | struct twl_mmc_controller *c = &hsmmc[1]; | 266 | struct twl_mmc_controller *c = NULL; |
| 267 | struct omap_mmc_platform_data *mmc = dev->platform_data; | 267 | struct omap_mmc_platform_data *mmc = dev->platform_data; |
| 268 | int i; | ||
| 269 | |||
| 270 | for (i = 1; i < ARRAY_SIZE(hsmmc); i++) { | ||
| 271 | if (mmc == hsmmc[i].mmc) { | ||
| 272 | c = &hsmmc[i]; | ||
| 273 | break; | ||
| 274 | } | ||
| 275 | } | ||
| 276 | |||
| 277 | if (c == NULL) | ||
| 278 | return -ENODEV; | ||
| 268 | 279 | ||
| 269 | /* If we don't see a Vcc regulator, assume it's a fixed | 280 | /* If we don't see a Vcc regulator, assume it's a fixed |
| 270 | * voltage always-on regulator. | 281 | * voltage always-on regulator. |
diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c index 6a5bc3021bdb..ec71a6965786 100644 --- a/arch/arm/mach-s3c2440/mach-mini2440.c +++ b/arch/arm/mach-s3c2440/mach-mini2440.c | |||
| @@ -48,8 +48,6 @@ | |||
| 48 | #include <plat/mci.h> | 48 | #include <plat/mci.h> |
| 49 | #include <plat/udc.h> | 49 | #include <plat/udc.h> |
| 50 | 50 | ||
| 51 | #include <plat/regs-serial.h> | ||
| 52 | |||
| 53 | #include <linux/mtd/mtd.h> | 51 | #include <linux/mtd/mtd.h> |
| 54 | #include <linux/mtd/nand.h> | 52 | #include <linux/mtd/nand.h> |
| 55 | #include <linux/mtd/nand_ecc.h> | 53 | #include <linux/mtd/nand_ecc.h> |
| @@ -275,6 +273,7 @@ static struct s3c2410_nand_set mini2440_nand_sets[] __initdata = { | |||
| 275 | .nr_chips = 1, | 273 | .nr_chips = 1, |
| 276 | .nr_partitions = ARRAY_SIZE(mini2440_default_nand_part), | 274 | .nr_partitions = ARRAY_SIZE(mini2440_default_nand_part), |
| 277 | .partitions = mini2440_default_nand_part, | 275 | .partitions = mini2440_default_nand_part, |
| 276 | .flash_bbt = 1, /* we use u-boot to create a BBT */ | ||
| 278 | }, | 277 | }, |
| 279 | }; | 278 | }; |
| 280 | 279 | ||
diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c index e23b581aa0e1..0fb385bd9cd9 100644 --- a/arch/arm/mach-s3c2442/mach-gta02.c +++ b/arch/arm/mach-s3c2442/mach-gta02.c | |||
| @@ -433,8 +433,7 @@ static struct s3c2410_nand_set gta02_nand_sets[] = { | |||
| 433 | */ | 433 | */ |
| 434 | .name = "neo1973-nand", | 434 | .name = "neo1973-nand", |
| 435 | .nr_chips = 1, | 435 | .nr_chips = 1, |
| 436 | .use_bbt = 1, | 436 | .flash_bbt = 1, |
| 437 | .force_soft_ecc = 1, | ||
| 438 | }, | 437 | }, |
| 439 | }; | 438 | }; |
| 440 | 439 | ||
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index def14ec265b3..7677a4a1cef2 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
| @@ -2457,6 +2457,19 @@ static int __init omap_init_dma(void) | |||
| 2457 | setup_irq(irq, &omap24xx_dma_irq); | 2457 | setup_irq(irq, &omap24xx_dma_irq); |
| 2458 | } | 2458 | } |
| 2459 | 2459 | ||
| 2460 | /* Enable smartidle idlemodes and autoidle */ | ||
| 2461 | if (cpu_is_omap34xx()) { | ||
| 2462 | u32 v = dma_read(OCP_SYSCONFIG); | ||
| 2463 | v &= ~(DMA_SYSCONFIG_MIDLEMODE_MASK | | ||
| 2464 | DMA_SYSCONFIG_SIDLEMODE_MASK | | ||
| 2465 | DMA_SYSCONFIG_AUTOIDLE); | ||
| 2466 | v |= (DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_SMARTIDLE) | | ||
| 2467 | DMA_SYSCONFIG_SIDLEMODE(DMA_IDLEMODE_SMARTIDLE) | | ||
| 2468 | DMA_SYSCONFIG_AUTOIDLE); | ||
| 2469 | dma_write(v , OCP_SYSCONFIG); | ||
| 2470 | } | ||
| 2471 | |||
| 2472 | |||
| 2460 | /* FIXME: Update LCD DMA to work on 24xx */ | 2473 | /* FIXME: Update LCD DMA to work on 24xx */ |
| 2461 | if (cpu_class_is_omap1()) { | 2474 | if (cpu_class_is_omap1()) { |
| 2462 | r = request_irq(INT_DMA_LCD, lcd_dma_irq_handler, 0, | 2475 | r = request_irq(INT_DMA_LCD, lcd_dma_irq_handler, 0, |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 7fd89ba8d3b5..26b387c12423 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
| @@ -1585,6 +1585,7 @@ static int __init _omap_gpio_init(void) | |||
| 1585 | __raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1); | 1585 | __raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1); |
| 1586 | __raw_writel(0xffffffff, bank->base + OMAP24XX_GPIO_IRQSTATUS1); | 1586 | __raw_writel(0xffffffff, bank->base + OMAP24XX_GPIO_IRQSTATUS1); |
| 1587 | __raw_writew(0x0015, bank->base + OMAP24XX_GPIO_SYSCONFIG); | 1587 | __raw_writew(0x0015, bank->base + OMAP24XX_GPIO_SYSCONFIG); |
| 1588 | __raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_DEBOUNCE_EN); | ||
| 1588 | 1589 | ||
| 1589 | /* Initialize interface clock ungated, module enabled */ | 1590 | /* Initialize interface clock ungated, module enabled */ |
| 1590 | __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL); | 1591 | __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL); |
diff --git a/arch/arm/plat-omap/include/mach/cpu.h b/arch/arm/plat-omap/include/mach/cpu.h index fc60c4ebcc28..285eaa3a8275 100644 --- a/arch/arm/plat-omap/include/mach/cpu.h +++ b/arch/arm/plat-omap/include/mach/cpu.h | |||
| @@ -30,6 +30,17 @@ | |||
| 30 | #ifndef __ASM_ARCH_OMAP_CPU_H | 30 | #ifndef __ASM_ARCH_OMAP_CPU_H |
| 31 | #define __ASM_ARCH_OMAP_CPU_H | 31 | #define __ASM_ARCH_OMAP_CPU_H |
| 32 | 32 | ||
| 33 | /* | ||
| 34 | * Omap device type i.e. EMU/HS/TST/GP/BAD | ||
| 35 | */ | ||
| 36 | #define OMAP2_DEVICE_TYPE_TEST 0 | ||
| 37 | #define OMAP2_DEVICE_TYPE_EMU 1 | ||
| 38 | #define OMAP2_DEVICE_TYPE_SEC 2 | ||
| 39 | #define OMAP2_DEVICE_TYPE_GP 3 | ||
| 40 | #define OMAP2_DEVICE_TYPE_BAD 4 | ||
| 41 | |||
| 42 | int omap_type(void); | ||
| 43 | |||
| 33 | struct omap_chip_id { | 44 | struct omap_chip_id { |
| 34 | u8 oc; | 45 | u8 oc; |
| 35 | u8 type; | 46 | u8 type; |
| @@ -424,17 +435,6 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
| 424 | 435 | ||
| 425 | 436 | ||
| 426 | int omap_chip_is(struct omap_chip_id oci); | 437 | int omap_chip_is(struct omap_chip_id oci); |
| 427 | int omap_type(void); | ||
| 428 | |||
| 429 | /* | ||
| 430 | * Macro to detect device type i.e. EMU/HS/TST/GP/BAD | ||
| 431 | */ | ||
| 432 | #define OMAP2_DEVICE_TYPE_TEST 0 | ||
| 433 | #define OMAP2_DEVICE_TYPE_EMU 1 | ||
| 434 | #define OMAP2_DEVICE_TYPE_SEC 2 | ||
| 435 | #define OMAP2_DEVICE_TYPE_GP 3 | ||
| 436 | #define OMAP2_DEVICE_TYPE_BAD 4 | ||
| 437 | |||
| 438 | void omap2_check_revision(void); | 438 | void omap2_check_revision(void); |
| 439 | 439 | ||
| 440 | #endif /* defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) */ | 440 | #endif /* defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) */ |
diff --git a/arch/arm/plat-omap/include/mach/dma.h b/arch/arm/plat-omap/include/mach/dma.h index 8c1eae88737e..7b939cc01962 100644 --- a/arch/arm/plat-omap/include/mach/dma.h +++ b/arch/arm/plat-omap/include/mach/dma.h | |||
| @@ -389,6 +389,21 @@ | |||
| 389 | #define DMA_THREAD_FIFO_25 (0x02 << 14) | 389 | #define DMA_THREAD_FIFO_25 (0x02 << 14) |
| 390 | #define DMA_THREAD_FIFO_50 (0x03 << 14) | 390 | #define DMA_THREAD_FIFO_50 (0x03 << 14) |
| 391 | 391 | ||
| 392 | /* DMA4_OCP_SYSCONFIG bits */ | ||
| 393 | #define DMA_SYSCONFIG_MIDLEMODE_MASK (3 << 12) | ||
| 394 | #define DMA_SYSCONFIG_CLOCKACTIVITY_MASK (3 << 8) | ||
| 395 | #define DMA_SYSCONFIG_EMUFREE (1 << 5) | ||
| 396 | #define DMA_SYSCONFIG_SIDLEMODE_MASK (3 << 3) | ||
| 397 | #define DMA_SYSCONFIG_SOFTRESET (1 << 2) | ||
| 398 | #define DMA_SYSCONFIG_AUTOIDLE (1 << 0) | ||
| 399 | |||
| 400 | #define DMA_SYSCONFIG_MIDLEMODE(n) ((n) << 12) | ||
| 401 | #define DMA_SYSCONFIG_SIDLEMODE(n) ((n) << 3) | ||
| 402 | |||
| 403 | #define DMA_IDLEMODE_SMARTIDLE 0x2 | ||
| 404 | #define DMA_IDLEMODE_NO_IDLE 0x1 | ||
| 405 | #define DMA_IDLEMODE_FORCE_IDLE 0x0 | ||
| 406 | |||
| 392 | /* Chaining modes*/ | 407 | /* Chaining modes*/ |
| 393 | #ifndef CONFIG_ARCH_OMAP1 | 408 | #ifndef CONFIG_ARCH_OMAP1 |
| 394 | #define OMAP_DMA_STATIC_CHAIN 0x1 | 409 | #define OMAP_DMA_STATIC_CHAIN 0x1 |
diff --git a/arch/arm/plat-omap/include/mach/io.h b/arch/arm/plat-omap/include/mach/io.h index 3b2814720569..73f483d56ca6 100644 --- a/arch/arm/plat-omap/include/mach/io.h +++ b/arch/arm/plat-omap/include/mach/io.h | |||
| @@ -201,7 +201,7 @@ | |||
| 201 | #define OMAP2_IO_ADDRESS(pa) IOMEM(__OMAP2_IO_ADDRESS(pa)) | 201 | #define OMAP2_IO_ADDRESS(pa) IOMEM(__OMAP2_IO_ADDRESS(pa)) |
| 202 | 202 | ||
| 203 | #ifdef __ASSEMBLER__ | 203 | #ifdef __ASSEMBLER__ |
| 204 | #define IOMEM(x) x | 204 | #define IOMEM(x) (x) |
| 205 | #else | 205 | #else |
| 206 | #define IOMEM(x) ((void __force __iomem *)(x)) | 206 | #define IOMEM(x) ((void __force __iomem *)(x)) |
| 207 | 207 | ||
diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c index 4cf449fa2cb5..4a0301399013 100644 --- a/arch/arm/plat-omap/iommu.c +++ b/arch/arm/plat-omap/iommu.c | |||
| @@ -298,7 +298,7 @@ void flush_iotlb_page(struct iommu *obj, u32 da) | |||
| 298 | if ((start <= da) && (da < start + bytes)) { | 298 | if ((start <= da) && (da < start + bytes)) { |
| 299 | dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n", | 299 | dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n", |
| 300 | __func__, start, da, bytes); | 300 | __func__, start, da, bytes); |
| 301 | 301 | iotlb_load_cr(obj, &cr); | |
| 302 | iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); | 302 | iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); |
| 303 | } | 303 | } |
| 304 | } | 304 | } |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 65006df3f1b7..4ea73804d21e 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
| @@ -133,7 +133,12 @@ void __init omap_detect_sram(void) | |||
| 133 | if (cpu_is_omap34xx()) { | 133 | if (cpu_is_omap34xx()) { |
| 134 | omap_sram_base = OMAP3_SRAM_PUB_VA; | 134 | omap_sram_base = OMAP3_SRAM_PUB_VA; |
| 135 | omap_sram_start = OMAP3_SRAM_PUB_PA; | 135 | omap_sram_start = OMAP3_SRAM_PUB_PA; |
| 136 | omap_sram_size = 0x8000; /* 32K */ | 136 | if ((omap_type() == OMAP2_DEVICE_TYPE_EMU) || |
| 137 | (omap_type() == OMAP2_DEVICE_TYPE_SEC)) { | ||
| 138 | omap_sram_size = 0x7000; /* 28K */ | ||
| 139 | } else { | ||
| 140 | omap_sram_size = 0x8000; /* 32K */ | ||
| 141 | } | ||
| 137 | } else { | 142 | } else { |
| 138 | omap_sram_base = OMAP2_SRAM_PUB_VA; | 143 | omap_sram_base = OMAP2_SRAM_PUB_VA; |
| 139 | omap_sram_start = OMAP2_SRAM_PUB_PA; | 144 | omap_sram_start = OMAP2_SRAM_PUB_PA; |
diff --git a/arch/arm/plat-s3c/Makefile b/arch/arm/plat-s3c/Makefile index 74bb7cb5da49..0761766b1833 100644 --- a/arch/arm/plat-s3c/Makefile +++ b/arch/arm/plat-s3c/Makefile | |||
| @@ -34,7 +34,7 @@ obj-$(CONFIG_S3C_DEV_HSMMC) += dev-hsmmc.o | |||
| 34 | obj-$(CONFIG_S3C_DEV_HSMMC1) += dev-hsmmc1.o | 34 | obj-$(CONFIG_S3C_DEV_HSMMC1) += dev-hsmmc1.o |
| 35 | obj-y += dev-i2c0.o | 35 | obj-y += dev-i2c0.o |
| 36 | obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o | 36 | obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o |
| 37 | obj-$(CONFIG_SND_S3C24XX_SOC) += dev-audio.o | 37 | obj-$(CONFIG_SND_S3C64XX_SOC_I2S) += dev-audio.o |
| 38 | obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o | 38 | obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o |
| 39 | obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o | 39 | obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o |
| 40 | obj-$(CONFIG_S3C_DEV_USB_HSOTG) += dev-usb-hsotg.o | 40 | obj-$(CONFIG_S3C_DEV_USB_HSOTG) += dev-usb-hsotg.o |
diff --git a/arch/arm/plat-s3c/include/plat/devs.h b/arch/arm/plat-s3c/include/plat/devs.h index b5b9c4d46e9a..2e170827e0b0 100644 --- a/arch/arm/plat-s3c/include/plat/devs.h +++ b/arch/arm/plat-s3c/include/plat/devs.h | |||
| @@ -37,6 +37,7 @@ extern struct platform_device s3c_device_i2c1; | |||
| 37 | extern struct platform_device s3c_device_rtc; | 37 | extern struct platform_device s3c_device_rtc; |
| 38 | extern struct platform_device s3c_device_adc; | 38 | extern struct platform_device s3c_device_adc; |
| 39 | extern struct platform_device s3c_device_sdi; | 39 | extern struct platform_device s3c_device_sdi; |
| 40 | extern struct platform_device s3c_device_iis; | ||
| 40 | extern struct platform_device s3c_device_hwmon; | 41 | extern struct platform_device s3c_device_hwmon; |
| 41 | extern struct platform_device s3c_device_hsmmc0; | 42 | extern struct platform_device s3c_device_hsmmc0; |
| 42 | extern struct platform_device s3c_device_hsmmc1; | 43 | extern struct platform_device s3c_device_hsmmc1; |
diff --git a/arch/arm/plat-s3c24xx/Makefile b/arch/arm/plat-s3c24xx/Makefile index 636cb12711df..579a165c2827 100644 --- a/arch/arm/plat-s3c24xx/Makefile +++ b/arch/arm/plat-s3c24xx/Makefile | |||
| @@ -29,7 +29,7 @@ obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o | |||
| 29 | obj-$(CONFIG_PM) += pm.o | 29 | obj-$(CONFIG_PM) += pm.o |
| 30 | obj-$(CONFIG_PM) += irq-pm.o | 30 | obj-$(CONFIG_PM) += irq-pm.o |
| 31 | obj-$(CONFIG_PM) += sleep.o | 31 | obj-$(CONFIG_PM) += sleep.o |
| 32 | obj-$(CONFIG_HAVE_PWM) += pwm.o | 32 | obj-$(CONFIG_S3C24XX_PWM) += pwm.o |
| 33 | obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o | 33 | obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o |
| 34 | obj-$(CONFIG_S3C2410_DMA) += dma.o | 34 | obj-$(CONFIG_S3C2410_DMA) += dma.o |
| 35 | obj-$(CONFIG_S3C24XX_ADC) += adc.o | 35 | obj-$(CONFIG_S3C24XX_ADC) += adc.o |
diff --git a/arch/arm/plat-s3c24xx/spi-bus0-gpe11_12_13.c b/arch/arm/plat-s3c24xx/spi-bus0-gpe11_12_13.c index 9edf7894eedd..da7a61728c18 100644 --- a/arch/arm/plat-s3c24xx/spi-bus0-gpe11_12_13.c +++ b/arch/arm/plat-s3c24xx/spi-bus0-gpe11_12_13.c | |||
| @@ -12,8 +12,7 @@ | |||
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 15 | 15 | #include <linux/gpio.h> | |
| 16 | #include <mach/hardware.h> | ||
| 17 | 16 | ||
| 18 | #include <mach/spi.h> | 17 | #include <mach/spi.h> |
| 19 | #include <mach/regs-gpio.h> | 18 | #include <mach/regs-gpio.h> |
diff --git a/arch/arm/plat-s3c24xx/spi-bus1-gpg5_6_7.c b/arch/arm/plat-s3c24xx/spi-bus1-gpg5_6_7.c index f34d0fc69ad8..86b9edc67413 100644 --- a/arch/arm/plat-s3c24xx/spi-bus1-gpg5_6_7.c +++ b/arch/arm/plat-s3c24xx/spi-bus1-gpg5_6_7.c | |||
| @@ -12,8 +12,7 @@ | |||
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 15 | 15 | #include <linux/gpio.h> | |
| 16 | #include <mach/hardware.h> | ||
| 17 | 16 | ||
| 18 | #include <mach/spi.h> | 17 | #include <mach/spi.h> |
| 19 | #include <mach/regs-gpio.h> | 18 | #include <mach/regs-gpio.h> |
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index 8a5bd7a9c6f5..b86e19c9b5b0 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig | |||
| @@ -7,6 +7,7 @@ config FRV | |||
| 7 | default y | 7 | default y |
| 8 | select HAVE_IDE | 8 | select HAVE_IDE |
| 9 | select HAVE_ARCH_TRACEHOOK | 9 | select HAVE_ARCH_TRACEHOOK |
| 10 | select HAVE_PERF_COUNTERS | ||
| 10 | 11 | ||
| 11 | config ZONE_DMA | 12 | config ZONE_DMA |
| 12 | bool | 13 | bool |
diff --git a/arch/frv/include/asm/atomic.h b/arch/frv/include/asm/atomic.h index 0409d981fd39..00a57af79afc 100644 --- a/arch/frv/include/asm/atomic.h +++ b/arch/frv/include/asm/atomic.h | |||
| @@ -121,10 +121,72 @@ static inline void atomic_dec(atomic_t *v) | |||
| 121 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) | 121 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) |
| 122 | #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) | 122 | #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) |
| 123 | 123 | ||
| 124 | /* | ||
| 125 | * 64-bit atomic ops | ||
| 126 | */ | ||
| 127 | typedef struct { | ||
| 128 | volatile long long counter; | ||
| 129 | } atomic64_t; | ||
| 130 | |||
| 131 | #define ATOMIC64_INIT(i) { (i) } | ||
| 132 | |||
| 133 | static inline long long atomic64_read(atomic64_t *v) | ||
| 134 | { | ||
| 135 | long long counter; | ||
| 136 | |||
| 137 | asm("ldd%I1 %M1,%0" | ||
| 138 | : "=e"(counter) | ||
| 139 | : "m"(v->counter)); | ||
| 140 | return counter; | ||
| 141 | } | ||
| 142 | |||
| 143 | static inline void atomic64_set(atomic64_t *v, long long i) | ||
| 144 | { | ||
| 145 | asm volatile("std%I0 %1,%M0" | ||
| 146 | : "=m"(v->counter) | ||
| 147 | : "e"(i)); | ||
| 148 | } | ||
| 149 | |||
| 150 | extern long long atomic64_inc_return(atomic64_t *v); | ||
| 151 | extern long long atomic64_dec_return(atomic64_t *v); | ||
| 152 | extern long long atomic64_add_return(long long i, atomic64_t *v); | ||
| 153 | extern long long atomic64_sub_return(long long i, atomic64_t *v); | ||
| 154 | |||
| 155 | static inline long long atomic64_add_negative(long long i, atomic64_t *v) | ||
| 156 | { | ||
| 157 | return atomic64_add_return(i, v) < 0; | ||
| 158 | } | ||
| 159 | |||
| 160 | static inline void atomic64_add(long long i, atomic64_t *v) | ||
| 161 | { | ||
| 162 | atomic64_add_return(i, v); | ||
| 163 | } | ||
| 164 | |||
| 165 | static inline void atomic64_sub(long long i, atomic64_t *v) | ||
| 166 | { | ||
| 167 | atomic64_sub_return(i, v); | ||
| 168 | } | ||
| 169 | |||
| 170 | static inline void atomic64_inc(atomic64_t *v) | ||
| 171 | { | ||
| 172 | atomic64_inc_return(v); | ||
| 173 | } | ||
| 174 | |||
| 175 | static inline void atomic64_dec(atomic64_t *v) | ||
| 176 | { | ||
| 177 | atomic64_dec_return(v); | ||
| 178 | } | ||
| 179 | |||
| 180 | #define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0) | ||
| 181 | #define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0) | ||
| 182 | #define atomic64_inc_and_test(v) (atomic64_inc_return((v)) == 0) | ||
| 183 | |||
| 124 | /*****************************************************************************/ | 184 | /*****************************************************************************/ |
| 125 | /* | 185 | /* |
| 126 | * exchange value with memory | 186 | * exchange value with memory |
| 127 | */ | 187 | */ |
| 188 | extern uint64_t __xchg_64(uint64_t i, volatile void *v); | ||
| 189 | |||
| 128 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS | 190 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS |
| 129 | 191 | ||
| 130 | #define xchg(ptr, x) \ | 192 | #define xchg(ptr, x) \ |
| @@ -174,8 +236,10 @@ extern uint32_t __xchg_32(uint32_t i, volatile void *v); | |||
| 174 | 236 | ||
| 175 | #define tas(ptr) (xchg((ptr), 1)) | 237 | #define tas(ptr) (xchg((ptr), 1)) |
| 176 | 238 | ||
| 177 | #define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new)) | 239 | #define atomic_cmpxchg(v, old, new) (cmpxchg(&(v)->counter, old, new)) |
| 178 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | 240 | #define atomic_xchg(v, new) (xchg(&(v)->counter, new)) |
| 241 | #define atomic64_cmpxchg(v, old, new) (__cmpxchg_64(old, new, &(v)->counter)) | ||
| 242 | #define atomic64_xchg(v, new) (__xchg_64(new, &(v)->counter)) | ||
| 179 | 243 | ||
| 180 | static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | 244 | static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) |
| 181 | { | 245 | { |
diff --git a/arch/frv/include/asm/perf_counter.h b/arch/frv/include/asm/perf_counter.h new file mode 100644 index 000000000000..ccf726e61b2e --- /dev/null +++ b/arch/frv/include/asm/perf_counter.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* FRV performance counter support | ||
| 2 | * | ||
| 3 | * Copyright (C) 2009 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public Licence | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the Licence, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_PERF_COUNTER_H | ||
| 13 | #define _ASM_PERF_COUNTER_H | ||
| 14 | |||
| 15 | #define PERF_COUNTER_INDEX_OFFSET 0 | ||
| 16 | |||
| 17 | #endif /* _ASM_PERF_COUNTER_H */ | ||
diff --git a/arch/frv/include/asm/system.h b/arch/frv/include/asm/system.h index 7742ec000cc4..efd22d9077ac 100644 --- a/arch/frv/include/asm/system.h +++ b/arch/frv/include/asm/system.h | |||
| @@ -208,6 +208,8 @@ extern void free_initmem(void); | |||
| 208 | * - if (*ptr == test) then orig = *ptr; *ptr = test; | 208 | * - if (*ptr == test) then orig = *ptr; *ptr = test; |
| 209 | * - if (*ptr != test) then orig = *ptr; | 209 | * - if (*ptr != test) then orig = *ptr; |
| 210 | */ | 210 | */ |
| 211 | extern uint64_t __cmpxchg_64(uint64_t test, uint64_t new, volatile uint64_t *v); | ||
| 212 | |||
| 211 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS | 213 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS |
| 212 | 214 | ||
| 213 | #define cmpxchg(ptr, test, new) \ | 215 | #define cmpxchg(ptr, test, new) \ |
diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h index 96d78d5d2c41..4a8fb427ce0a 100644 --- a/arch/frv/include/asm/unistd.h +++ b/arch/frv/include/asm/unistd.h | |||
| @@ -341,10 +341,12 @@ | |||
| 341 | #define __NR_inotify_init1 332 | 341 | #define __NR_inotify_init1 332 |
| 342 | #define __NR_preadv 333 | 342 | #define __NR_preadv 333 |
| 343 | #define __NR_pwritev 334 | 343 | #define __NR_pwritev 334 |
| 344 | #define __NR_rt_tgsigqueueinfo 335 | ||
| 345 | #define __NR_perf_counter_open 336 | ||
| 344 | 346 | ||
| 345 | #ifdef __KERNEL__ | 347 | #ifdef __KERNEL__ |
| 346 | 348 | ||
| 347 | #define NR_syscalls 335 | 349 | #define NR_syscalls 337 |
| 348 | 350 | ||
| 349 | #define __ARCH_WANT_IPC_PARSE_VERSION | 351 | #define __ARCH_WANT_IPC_PARSE_VERSION |
| 350 | /* #define __ARCH_WANT_OLD_READDIR */ | 352 | /* #define __ARCH_WANT_OLD_READDIR */ |
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S index 356e0e327a89..fde1e446b440 100644 --- a/arch/frv/kernel/entry.S +++ b/arch/frv/kernel/entry.S | |||
| @@ -1524,5 +1524,7 @@ sys_call_table: | |||
| 1524 | .long sys_inotify_init1 | 1524 | .long sys_inotify_init1 |
| 1525 | .long sys_preadv | 1525 | .long sys_preadv |
| 1526 | .long sys_pwritev | 1526 | .long sys_pwritev |
| 1527 | .long sys_rt_tgsigqueueinfo /* 335 */ | ||
| 1528 | .long sys_perf_counter_open | ||
| 1527 | 1529 | ||
| 1528 | syscall_table_size = (. - sys_call_table) | 1530 | syscall_table_size = (. - sys_call_table) |
diff --git a/arch/frv/kernel/frv_ksyms.c b/arch/frv/kernel/frv_ksyms.c index 0316b3c50eff..a89803b58b9a 100644 --- a/arch/frv/kernel/frv_ksyms.c +++ b/arch/frv/kernel/frv_ksyms.c | |||
| @@ -67,6 +67,10 @@ EXPORT_SYMBOL(atomic_sub_return); | |||
| 67 | EXPORT_SYMBOL(__xchg_32); | 67 | EXPORT_SYMBOL(__xchg_32); |
| 68 | EXPORT_SYMBOL(__cmpxchg_32); | 68 | EXPORT_SYMBOL(__cmpxchg_32); |
| 69 | #endif | 69 | #endif |
| 70 | EXPORT_SYMBOL(atomic64_add_return); | ||
| 71 | EXPORT_SYMBOL(atomic64_sub_return); | ||
| 72 | EXPORT_SYMBOL(__xchg_64); | ||
| 73 | EXPORT_SYMBOL(__cmpxchg_64); | ||
| 70 | 74 | ||
| 71 | EXPORT_SYMBOL(__debug_bug_printk); | 75 | EXPORT_SYMBOL(__debug_bug_printk); |
| 72 | EXPORT_SYMBOL(__delay_loops_MHz); | 76 | EXPORT_SYMBOL(__delay_loops_MHz); |
diff --git a/arch/frv/lib/Makefile b/arch/frv/lib/Makefile index 08be305c9f44..0a377210c89b 100644 --- a/arch/frv/lib/Makefile +++ b/arch/frv/lib/Makefile | |||
| @@ -4,5 +4,5 @@ | |||
| 4 | 4 | ||
| 5 | lib-y := \ | 5 | lib-y := \ |
| 6 | __ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o __ucmpdi2.o \ | 6 | __ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o __ucmpdi2.o \ |
| 7 | checksum.o memcpy.o memset.o atomic-ops.o \ | 7 | checksum.o memcpy.o memset.o atomic-ops.o atomic64-ops.o \ |
| 8 | outsl_ns.o outsl_sw.o insl_ns.o insl_sw.o cache.o | 8 | outsl_ns.o outsl_sw.o insl_ns.o insl_sw.o cache.o perf_counter.o |
diff --git a/arch/frv/lib/atomic-ops.S b/arch/frv/lib/atomic-ops.S index ee0ac905fb08..5e9e6ab5dd0e 100644 --- a/arch/frv/lib/atomic-ops.S +++ b/arch/frv/lib/atomic-ops.S | |||
| @@ -163,11 +163,10 @@ __cmpxchg_32: | |||
| 163 | ld.p @(gr11,gr0),gr8 | 163 | ld.p @(gr11,gr0),gr8 |
| 164 | orcr cc7,cc7,cc3 | 164 | orcr cc7,cc7,cc3 |
| 165 | subcc gr8,gr9,gr7,icc0 | 165 | subcc gr8,gr9,gr7,icc0 |
| 166 | bne icc0,#0,1f | 166 | bnelr icc0,#0 |
| 167 | cst.p gr10,@(gr11,gr0) ,cc3,#1 | 167 | cst.p gr10,@(gr11,gr0) ,cc3,#1 |
| 168 | corcc gr29,gr29,gr0 ,cc3,#1 | 168 | corcc gr29,gr29,gr0 ,cc3,#1 |
| 169 | beq icc3,#0,0b | 169 | beq icc3,#0,0b |
| 170 | 1: | ||
| 171 | bralr | 170 | bralr |
| 172 | 171 | ||
| 173 | .size __cmpxchg_32, .-__cmpxchg_32 | 172 | .size __cmpxchg_32, .-__cmpxchg_32 |
diff --git a/arch/frv/lib/atomic64-ops.S b/arch/frv/lib/atomic64-ops.S new file mode 100644 index 000000000000..b6194eeac127 --- /dev/null +++ b/arch/frv/lib/atomic64-ops.S | |||
| @@ -0,0 +1,162 @@ | |||
| 1 | /* kernel atomic64 operations | ||
| 2 | * | ||
| 3 | * For an explanation of how atomic ops work in this arch, see: | ||
| 4 | * Documentation/frv/atomic-ops.txt | ||
| 5 | * | ||
| 6 | * Copyright (C) 2009 Red Hat, Inc. All Rights Reserved. | ||
| 7 | * Written by David Howells (dhowells@redhat.com) | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU General Public License | ||
| 11 | * as published by the Free Software Foundation; either version | ||
| 12 | * 2 of the License, or (at your option) any later version. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <asm/spr-regs.h> | ||
| 16 | |||
| 17 | .text | ||
| 18 | .balign 4 | ||
| 19 | |||
| 20 | |||
| 21 | ############################################################################### | ||
| 22 | # | ||
| 23 | # long long atomic64_inc_return(atomic64_t *v) | ||
| 24 | # | ||
| 25 | ############################################################################### | ||
| 26 | .globl atomic64_inc_return | ||
| 27 | .type atomic64_inc_return,@function | ||
| 28 | atomic64_inc_return: | ||
| 29 | or.p gr8,gr8,gr10 | ||
| 30 | 0: | ||
| 31 | orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */ | ||
| 32 | ckeq icc3,cc7 | ||
| 33 | ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */ | ||
| 34 | orcr cc7,cc7,cc3 /* set CC3 to true */ | ||
| 35 | addicc gr9,#1,gr9,icc0 | ||
| 36 | addxi gr8,#0,gr8,icc0 | ||
| 37 | cstd.p gr8,@(gr10,gr0) ,cc3,#1 | ||
| 38 | corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */ | ||
| 39 | beq icc3,#0,0b | ||
| 40 | bralr | ||
| 41 | |||
| 42 | .size atomic64_inc_return, .-atomic64_inc_return | ||
| 43 | |||
| 44 | ############################################################################### | ||
| 45 | # | ||
| 46 | # long long atomic64_dec_return(atomic64_t *v) | ||
| 47 | # | ||
| 48 | ############################################################################### | ||
| 49 | .globl atomic64_dec_return | ||
| 50 | .type atomic64_dec_return,@function | ||
| 51 | atomic64_dec_return: | ||
| 52 | or.p gr8,gr8,gr10 | ||
| 53 | 0: | ||
| 54 | orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */ | ||
| 55 | ckeq icc3,cc7 | ||
| 56 | ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */ | ||
| 57 | orcr cc7,cc7,cc3 /* set CC3 to true */ | ||
| 58 | subicc gr9,#1,gr9,icc0 | ||
| 59 | subxi gr8,#0,gr8,icc0 | ||
| 60 | cstd.p gr8,@(gr10,gr0) ,cc3,#1 | ||
| 61 | corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */ | ||
| 62 | beq icc3,#0,0b | ||
| 63 | bralr | ||
| 64 | |||
| 65 | .size atomic64_dec_return, .-atomic64_dec_return | ||
| 66 | |||
| 67 | ############################################################################### | ||
| 68 | # | ||
| 69 | # long long atomic64_add_return(long long i, atomic64_t *v) | ||
| 70 | # | ||
| 71 | ############################################################################### | ||
| 72 | .globl atomic64_add_return | ||
| 73 | .type atomic64_add_return,@function | ||
| 74 | atomic64_add_return: | ||
| 75 | or.p gr8,gr8,gr4 | ||
| 76 | or gr9,gr9,gr5 | ||
| 77 | 0: | ||
| 78 | orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */ | ||
| 79 | ckeq icc3,cc7 | ||
| 80 | ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */ | ||
| 81 | orcr cc7,cc7,cc3 /* set CC3 to true */ | ||
| 82 | addcc gr9,gr5,gr9,icc0 | ||
| 83 | addx gr8,gr4,gr8,icc0 | ||
| 84 | cstd.p gr8,@(gr10,gr0) ,cc3,#1 | ||
| 85 | corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */ | ||
| 86 | beq icc3,#0,0b | ||
| 87 | bralr | ||
| 88 | |||
| 89 | .size atomic64_add_return, .-atomic64_add_return | ||
| 90 | |||
| 91 | ############################################################################### | ||
| 92 | # | ||
| 93 | # long long atomic64_sub_return(long long i, atomic64_t *v) | ||
| 94 | # | ||
| 95 | ############################################################################### | ||
| 96 | .globl atomic64_sub_return | ||
| 97 | .type atomic64_sub_return,@function | ||
| 98 | atomic64_sub_return: | ||
| 99 | or.p gr8,gr8,gr4 | ||
| 100 | or gr9,gr9,gr5 | ||
| 101 | 0: | ||
| 102 | orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */ | ||
| 103 | ckeq icc3,cc7 | ||
| 104 | ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */ | ||
| 105 | orcr cc7,cc7,cc3 /* set CC3 to true */ | ||
| 106 | subcc gr9,gr5,gr9,icc0 | ||
| 107 | subx gr8,gr4,gr8,icc0 | ||
| 108 | cstd.p gr8,@(gr10,gr0) ,cc3,#1 | ||
| 109 | corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */ | ||
| 110 | beq icc3,#0,0b | ||
| 111 | bralr | ||
| 112 | |||
| 113 | .size atomic64_sub_return, .-atomic64_sub_return | ||
| 114 | |||
| 115 | ############################################################################### | ||
| 116 | # | ||
| 117 | # uint64_t __xchg_64(uint64_t i, uint64_t *v) | ||
| 118 | # | ||
| 119 | ############################################################################### | ||
| 120 | .globl __xchg_64 | ||
| 121 | .type __xchg_64,@function | ||
| 122 | __xchg_64: | ||
| 123 | or.p gr8,gr8,gr4 | ||
| 124 | or gr9,gr9,gr5 | ||
| 125 | 0: | ||
| 126 | orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */ | ||
| 127 | ckeq icc3,cc7 | ||
| 128 | ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */ | ||
| 129 | orcr cc7,cc7,cc3 /* set CC3 to true */ | ||
| 130 | cstd.p gr4,@(gr10,gr0) ,cc3,#1 | ||
| 131 | corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */ | ||
| 132 | beq icc3,#0,0b | ||
| 133 | bralr | ||
| 134 | |||
| 135 | .size __xchg_64, .-__xchg_64 | ||
| 136 | |||
| 137 | ############################################################################### | ||
| 138 | # | ||
| 139 | # uint64_t __cmpxchg_64(uint64_t test, uint64_t new, uint64_t *v) | ||
| 140 | # | ||
| 141 | ############################################################################### | ||
| 142 | .globl __cmpxchg_64 | ||
| 143 | .type __cmpxchg_64,@function | ||
| 144 | __cmpxchg_64: | ||
| 145 | or.p gr8,gr8,gr4 | ||
| 146 | or gr9,gr9,gr5 | ||
| 147 | 0: | ||
| 148 | orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */ | ||
| 149 | ckeq icc3,cc7 | ||
| 150 | ldd.p @(gr12,gr0),gr8 /* LDD.P/ORCR must be atomic */ | ||
| 151 | orcr cc7,cc7,cc3 | ||
| 152 | subcc gr8,gr4,gr0,icc0 | ||
| 153 | subcc.p gr9,gr5,gr0,icc1 | ||
| 154 | bnelr icc0,#0 | ||
| 155 | bnelr icc1,#0 | ||
| 156 | cstd.p gr10,@(gr12,gr0) ,cc3,#1 | ||
| 157 | corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */ | ||
| 158 | beq icc3,#0,0b | ||
| 159 | bralr | ||
| 160 | |||
| 161 | .size __cmpxchg_64, .-__cmpxchg_64 | ||
| 162 | |||
diff --git a/arch/frv/lib/perf_counter.c b/arch/frv/lib/perf_counter.c new file mode 100644 index 000000000000..2000feecd571 --- /dev/null +++ b/arch/frv/lib/perf_counter.c | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | /* Performance counter handling | ||
| 2 | * | ||
| 3 | * Copyright (C) 2009 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public Licence | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the Licence, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/perf_counter.h> | ||
| 13 | |||
| 14 | /* | ||
| 15 | * mark the performance counter as pending | ||
| 16 | */ | ||
| 17 | void set_perf_counter_pending(void) | ||
| 18 | { | ||
| 19 | } | ||
diff --git a/arch/ia64/kernel/esi.c b/arch/ia64/kernel/esi.c index ebf4e988e78c..d5764a3d74af 100644 --- a/arch/ia64/kernel/esi.c +++ b/arch/ia64/kernel/esi.c | |||
| @@ -65,7 +65,7 @@ static int __init esi_init (void) | |||
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | if (!esi) | 67 | if (!esi) |
| 68 | return -ENODEV;; | 68 | return -ENODEV; |
| 69 | 69 | ||
| 70 | systab = __va(esi); | 70 | systab = __va(esi); |
| 71 | 71 | ||
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index abce2468a40b..f1782705b1f7 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
| @@ -5603,7 +5603,7 @@ pfm_interrupt_handler(int irq, void *arg) | |||
| 5603 | * /proc/perfmon interface, for debug only | 5603 | * /proc/perfmon interface, for debug only |
| 5604 | */ | 5604 | */ |
| 5605 | 5605 | ||
| 5606 | #define PFM_PROC_SHOW_HEADER ((void *)nr_cpu_ids+1) | 5606 | #define PFM_PROC_SHOW_HEADER ((void *)(long)nr_cpu_ids+1) |
| 5607 | 5607 | ||
| 5608 | static void * | 5608 | static void * |
| 5609 | pfm_proc_start(struct seq_file *m, loff_t *pos) | 5609 | pfm_proc_start(struct seq_file *m, loff_t *pos) |
diff --git a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c index 7053c55b7649..e6676fca4828 100644 --- a/arch/ia64/kernel/salinfo.c +++ b/arch/ia64/kernel/salinfo.c | |||
| @@ -192,7 +192,7 @@ struct salinfo_platform_oemdata_parms { | |||
| 192 | static void | 192 | static void |
| 193 | salinfo_work_to_do(struct salinfo_data *data) | 193 | salinfo_work_to_do(struct salinfo_data *data) |
| 194 | { | 194 | { |
| 195 | down_trylock(&data->mutex); | 195 | (void)(down_trylock(&data->mutex) ?: 0); |
| 196 | up(&data->mutex); | 196 | up(&data->mutex); |
| 197 | } | 197 | } |
| 198 | 198 | ||
diff --git a/arch/ia64/kvm/kvm_lib.c b/arch/ia64/kvm/kvm_lib.c index a85cb611ecd7..f1268b8e6f9e 100644 --- a/arch/ia64/kvm/kvm_lib.c +++ b/arch/ia64/kvm/kvm_lib.c | |||
| @@ -11,5 +11,11 @@ | |||
| 11 | * | 11 | * |
| 12 | */ | 12 | */ |
| 13 | #undef CONFIG_MODULES | 13 | #undef CONFIG_MODULES |
| 14 | #include <linux/module.h> | ||
| 15 | #undef CONFIG_KALLSYMS | ||
| 16 | #undef EXPORT_SYMBOL | ||
| 17 | #undef EXPORT_SYMBOL_GPL | ||
| 18 | #define EXPORT_SYMBOL(sym) | ||
| 19 | #define EXPORT_SYMBOL_GPL(sym) | ||
| 14 | #include "../../../lib/vsprintf.c" | 20 | #include "../../../lib/vsprintf.c" |
| 15 | #include "../../../lib/ctype.c" | 21 | #include "../../../lib/ctype.c" |
diff --git a/arch/ia64/kvm/process.c b/arch/ia64/kvm/process.c index a8f84da04b49..bb862fb224f2 100644 --- a/arch/ia64/kvm/process.c +++ b/arch/ia64/kvm/process.c | |||
| @@ -130,7 +130,7 @@ static void collect_interruption(struct kvm_vcpu *vcpu) | |||
| 130 | if (vdcr & IA64_DCR_PP) { | 130 | if (vdcr & IA64_DCR_PP) { |
| 131 | vpsr |= IA64_PSR_PP; | 131 | vpsr |= IA64_PSR_PP; |
| 132 | } else { | 132 | } else { |
| 133 | vpsr &= ~IA64_PSR_PP;; | 133 | vpsr &= ~IA64_PSR_PP; |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | vcpu_set_psr(vcpu, vpsr); | 136 | vcpu_set_psr(vcpu, vpsr); |
| @@ -594,11 +594,11 @@ static void set_pal_call_data(struct kvm_vcpu *vcpu) | |||
| 594 | p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30); | 594 | p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30); |
| 595 | break; | 595 | break; |
| 596 | case PAL_BRAND_INFO: | 596 | case PAL_BRAND_INFO: |
| 597 | p->u.pal_data.gr29 = gr29;; | 597 | p->u.pal_data.gr29 = gr29; |
| 598 | p->u.pal_data.gr30 = kvm_trans_pal_call_args(vcpu, gr30); | 598 | p->u.pal_data.gr30 = kvm_trans_pal_call_args(vcpu, gr30); |
| 599 | break; | 599 | break; |
| 600 | default: | 600 | default: |
| 601 | p->u.pal_data.gr29 = gr29;; | 601 | p->u.pal_data.gr29 = gr29; |
| 602 | p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30); | 602 | p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30); |
| 603 | } | 603 | } |
| 604 | p->u.pal_data.gr28 = gr28; | 604 | p->u.pal_data.gr28 = gr28; |
diff --git a/arch/ia64/kvm/vcpu.c b/arch/ia64/kvm/vcpu.c index a2c6c15e4761..46b02cbcc874 100644 --- a/arch/ia64/kvm/vcpu.c +++ b/arch/ia64/kvm/vcpu.c | |||
| @@ -406,7 +406,7 @@ void getreg(unsigned long regnum, unsigned long *val, | |||
| 406 | * Now look at registers in [0-31] range and init correct UNAT | 406 | * Now look at registers in [0-31] range and init correct UNAT |
| 407 | */ | 407 | */ |
| 408 | addr = (unsigned long)regs; | 408 | addr = (unsigned long)regs; |
| 409 | unat = ®s->eml_unat;; | 409 | unat = ®s->eml_unat; |
| 410 | 410 | ||
| 411 | addr += gr_info[regnum]; | 411 | addr += gr_info[regnum]; |
| 412 | 412 | ||
diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c index 4290a429bf7c..20b3852f7a6e 100644 --- a/arch/ia64/kvm/vtlb.c +++ b/arch/ia64/kvm/vtlb.c | |||
| @@ -135,7 +135,7 @@ struct thash_data *__vtr_lookup(struct kvm_vcpu *vcpu, u64 va, int type) | |||
| 135 | u64 rid; | 135 | u64 rid; |
| 136 | 136 | ||
| 137 | rid = vcpu_get_rr(vcpu, va); | 137 | rid = vcpu_get_rr(vcpu, va); |
| 138 | rid = rid & RR_RID_MASK;; | 138 | rid = rid & RR_RID_MASK; |
| 139 | if (type == D_TLB) { | 139 | if (type == D_TLB) { |
| 140 | if (vcpu_quick_region_check(vcpu->arch.dtr_regions, va)) { | 140 | if (vcpu_quick_region_check(vcpu->arch.dtr_regions, va)) { |
| 141 | for (trp = (struct thash_data *)&vcpu->arch.dtrs, i = 0; | 141 | for (trp = (struct thash_data *)&vcpu->arch.dtrs, i = 0; |
| @@ -518,7 +518,7 @@ struct thash_data *vtlb_lookup(struct kvm_vcpu *v, u64 va, int is_data) | |||
| 518 | 518 | ||
| 519 | struct thash_cb *hcb = &v->arch.vtlb; | 519 | struct thash_cb *hcb = &v->arch.vtlb; |
| 520 | 520 | ||
| 521 | cch = __vtr_lookup(v, va, is_data);; | 521 | cch = __vtr_lookup(v, va, is_data); |
| 522 | if (cch) | 522 | if (cch) |
| 523 | return cch; | 523 | return cch; |
| 524 | 524 | ||
diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index 76645cf6ac5d..25831c47c579 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c | |||
| @@ -435,7 +435,8 @@ void sn_generate_path(struct pci_bus *pci_bus, char *address) | |||
| 435 | bricktype = MODULE_GET_BTYPE(moduleid); | 435 | bricktype = MODULE_GET_BTYPE(moduleid); |
| 436 | if ((bricktype == L1_BRICKTYPE_191010) || | 436 | if ((bricktype == L1_BRICKTYPE_191010) || |
| 437 | (bricktype == L1_BRICKTYPE_1932)) | 437 | (bricktype == L1_BRICKTYPE_1932)) |
| 438 | sprintf(address, "%s^%d", address, geo_slot(geoid)); | 438 | sprintf(address + strlen(address), "^%d", |
| 439 | geo_slot(geoid)); | ||
| 439 | } | 440 | } |
| 440 | 441 | ||
| 441 | void __devinit | 442 | void __devinit |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 8c4be1f301cf..3ca0fe1a9123 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -22,6 +22,26 @@ choice | |||
| 22 | config MACH_ALCHEMY | 22 | config MACH_ALCHEMY |
| 23 | bool "Alchemy processor based machines" | 23 | bool "Alchemy processor based machines" |
| 24 | 24 | ||
| 25 | config AR7 | ||
| 26 | bool "Texas Instruments AR7" | ||
| 27 | select BOOT_ELF32 | ||
| 28 | select DMA_NONCOHERENT | ||
| 29 | select CEVT_R4K | ||
| 30 | select CSRC_R4K | ||
| 31 | select IRQ_CPU | ||
| 32 | select NO_EXCEPT_FILL | ||
| 33 | select SWAP_IO_SPACE | ||
| 34 | select SYS_HAS_CPU_MIPS32_R1 | ||
| 35 | select SYS_HAS_EARLY_PRINTK | ||
| 36 | select SYS_SUPPORTS_32BIT_KERNEL | ||
| 37 | select SYS_SUPPORTS_LITTLE_ENDIAN | ||
| 38 | select GENERIC_GPIO | ||
| 39 | select GCD | ||
| 40 | select VLYNQ | ||
| 41 | help | ||
| 42 | Support for the Texas Instruments AR7 System-on-a-Chip | ||
| 43 | family: TNETD7100, 7200 and 7300. | ||
| 44 | |||
| 25 | config BASLER_EXCITE | 45 | config BASLER_EXCITE |
| 26 | bool "Basler eXcite smart camera" | 46 | bool "Basler eXcite smart camera" |
| 27 | select CEVT_R4K | 47 | select CEVT_R4K |
| @@ -209,7 +229,7 @@ config MIPS_MALTA | |||
| 209 | select SYS_SUPPORTS_64BIT_KERNEL | 229 | select SYS_SUPPORTS_64BIT_KERNEL |
| 210 | select SYS_SUPPORTS_BIG_ENDIAN | 230 | select SYS_SUPPORTS_BIG_ENDIAN |
| 211 | select SYS_SUPPORTS_LITTLE_ENDIAN | 231 | select SYS_SUPPORTS_LITTLE_ENDIAN |
| 212 | select SYS_SUPPORTS_MIPS_CMP if BROKEN # because SYNC_R4K is broken | 232 | select SYS_SUPPORTS_MIPS_CMP |
| 213 | select SYS_SUPPORTS_MULTITHREADING | 233 | select SYS_SUPPORTS_MULTITHREADING |
| 214 | select SYS_SUPPORTS_SMARTMIPS | 234 | select SYS_SUPPORTS_SMARTMIPS |
| 215 | help | 235 | help |
| @@ -247,6 +267,7 @@ config MACH_VR41XX | |||
| 247 | select CEVT_R4K | 267 | select CEVT_R4K |
| 248 | select CSRC_R4K | 268 | select CSRC_R4K |
| 249 | select SYS_HAS_CPU_VR41XX | 269 | select SYS_HAS_CPU_VR41XX |
| 270 | select ARCH_REQUIRE_GPIOLIB | ||
| 250 | 271 | ||
| 251 | config NXP_STB220 | 272 | config NXP_STB220 |
| 252 | bool "NXP STB220 board" | 273 | bool "NXP STB220 board" |
| @@ -1635,7 +1656,7 @@ config MIPS_APSP_KSPD | |||
| 1635 | config MIPS_CMP | 1656 | config MIPS_CMP |
| 1636 | bool "MIPS CMP framework support" | 1657 | bool "MIPS CMP framework support" |
| 1637 | depends on SYS_SUPPORTS_MIPS_CMP | 1658 | depends on SYS_SUPPORTS_MIPS_CMP |
| 1638 | select SYNC_R4K if BROKEN | 1659 | select SYNC_R4K |
| 1639 | select SYS_SUPPORTS_SMP | 1660 | select SYS_SUPPORTS_SMP |
| 1640 | select SYS_SUPPORTS_SCHED_SMT if SMP | 1661 | select SYS_SUPPORTS_SCHED_SMT if SMP |
| 1641 | select WEAK_ORDERING | 1662 | select WEAK_ORDERING |
| @@ -2147,11 +2168,11 @@ menu "Power management options" | |||
| 2147 | 2168 | ||
| 2148 | config ARCH_HIBERNATION_POSSIBLE | 2169 | config ARCH_HIBERNATION_POSSIBLE |
| 2149 | def_bool y | 2170 | def_bool y |
| 2150 | depends on SYS_SUPPORTS_HOTPLUG_CPU | 2171 | depends on SYS_SUPPORTS_HOTPLUG_CPU || !SMP |
| 2151 | 2172 | ||
| 2152 | config ARCH_SUSPEND_POSSIBLE | 2173 | config ARCH_SUSPEND_POSSIBLE |
| 2153 | def_bool y | 2174 | def_bool y |
| 2154 | depends on SYS_SUPPORTS_HOTPLUG_CPU | 2175 | depends on SYS_SUPPORTS_HOTPLUG_CPU || !SMP |
| 2155 | 2176 | ||
| 2156 | source "kernel/power/Kconfig" | 2177 | source "kernel/power/Kconfig" |
| 2157 | 2178 | ||
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 807572a6a4d2..861da514a468 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
| @@ -173,6 +173,13 @@ libs-y += arch/mips/fw/lib/ | |||
| 173 | # | 173 | # |
| 174 | 174 | ||
| 175 | # | 175 | # |
| 176 | # Texas Instruments AR7 | ||
| 177 | # | ||
| 178 | core-$(CONFIG_AR7) += arch/mips/ar7/ | ||
| 179 | cflags-$(CONFIG_AR7) += -I$(srctree)/arch/mips/include/asm/mach-ar7 | ||
| 180 | load-$(CONFIG_AR7) += 0xffffffff94100000 | ||
| 181 | |||
| 182 | # | ||
| 176 | # Acer PICA 61, Mips Magnum 4000 and Olivetti M700. | 183 | # Acer PICA 61, Mips Magnum 4000 and Olivetti M700. |
| 177 | # | 184 | # |
| 178 | core-$(CONFIG_MACH_JAZZ) += arch/mips/jazz/ | 185 | core-$(CONFIG_MACH_JAZZ) += arch/mips/jazz/ |
diff --git a/arch/mips/ar7/Makefile b/arch/mips/ar7/Makefile new file mode 100644 index 000000000000..7435e44b3964 --- /dev/null +++ b/arch/mips/ar7/Makefile | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | |||
| 2 | obj-y := \ | ||
| 3 | prom.o \ | ||
| 4 | setup.o \ | ||
| 5 | memory.o \ | ||
| 6 | irq.o \ | ||
| 7 | time.o \ | ||
| 8 | platform.o \ | ||
| 9 | gpio.o \ | ||
| 10 | clock.o | ||
diff --git a/arch/mips/ar7/clock.c b/arch/mips/ar7/clock.c new file mode 100644 index 000000000000..27dc6663f2fa --- /dev/null +++ b/arch/mips/ar7/clock.c | |||
| @@ -0,0 +1,440 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2007 Felix Fietkau <nbd@openwrt.org> | ||
| 3 | * Copyright (C) 2007 Eugene Konev <ejka@openwrt.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/kernel.h> | ||
| 21 | #include <linux/init.h> | ||
| 22 | #include <linux/types.h> | ||
| 23 | #include <linux/module.h> | ||
| 24 | #include <linux/delay.h> | ||
| 25 | #include <linux/gcd.h> | ||
| 26 | #include <linux/io.h> | ||
| 27 | |||
| 28 | #include <asm/addrspace.h> | ||
| 29 | #include <asm/mach-ar7/ar7.h> | ||
| 30 | |||
| 31 | #define BOOT_PLL_SOURCE_MASK 0x3 | ||
| 32 | #define CPU_PLL_SOURCE_SHIFT 16 | ||
| 33 | #define BUS_PLL_SOURCE_SHIFT 14 | ||
| 34 | #define USB_PLL_SOURCE_SHIFT 18 | ||
| 35 | #define DSP_PLL_SOURCE_SHIFT 22 | ||
| 36 | #define BOOT_PLL_SOURCE_AFE 0 | ||
| 37 | #define BOOT_PLL_SOURCE_BUS 0 | ||
| 38 | #define BOOT_PLL_SOURCE_REF 1 | ||
| 39 | #define BOOT_PLL_SOURCE_XTAL 2 | ||
| 40 | #define BOOT_PLL_SOURCE_CPU 3 | ||
| 41 | #define BOOT_PLL_BYPASS 0x00000020 | ||
| 42 | #define BOOT_PLL_ASYNC_MODE 0x02000000 | ||
| 43 | #define BOOT_PLL_2TO1_MODE 0x00008000 | ||
| 44 | |||
| 45 | #define TNETD7200_CLOCK_ID_CPU 0 | ||
| 46 | #define TNETD7200_CLOCK_ID_DSP 1 | ||
| 47 | #define TNETD7200_CLOCK_ID_USB 2 | ||
| 48 | |||
| 49 | #define TNETD7200_DEF_CPU_CLK 211000000 | ||
| 50 | #define TNETD7200_DEF_DSP_CLK 125000000 | ||
| 51 | #define TNETD7200_DEF_USB_CLK 48000000 | ||
| 52 | |||
| 53 | struct tnetd7300_clock { | ||
| 54 | u32 ctrl; | ||
| 55 | #define PREDIV_MASK 0x001f0000 | ||
| 56 | #define PREDIV_SHIFT 16 | ||
| 57 | #define POSTDIV_MASK 0x0000001f | ||
| 58 | u32 unused1[3]; | ||
| 59 | u32 pll; | ||
| 60 | #define MUL_MASK 0x0000f000 | ||
| 61 | #define MUL_SHIFT 12 | ||
| 62 | #define PLL_MODE_MASK 0x00000001 | ||
| 63 | #define PLL_NDIV 0x00000800 | ||
| 64 | #define PLL_DIV 0x00000002 | ||
| 65 | #define PLL_STATUS 0x00000001 | ||
| 66 | u32 unused2[3]; | ||
| 67 | }; | ||
| 68 | |||
| 69 | struct tnetd7300_clocks { | ||
| 70 | struct tnetd7300_clock bus; | ||
| 71 | struct tnetd7300_clock cpu; | ||
| 72 | struct tnetd7300_clock usb; | ||
| 73 | struct tnetd7300_clock dsp; | ||
| 74 | }; | ||
| 75 | |||
| 76 | struct tnetd7200_clock { | ||
| 77 | u32 ctrl; | ||
| 78 | u32 unused1[3]; | ||
| 79 | #define DIVISOR_ENABLE_MASK 0x00008000 | ||
| 80 | u32 mul; | ||
| 81 | u32 prediv; | ||
| 82 | u32 postdiv; | ||
| 83 | u32 postdiv2; | ||
| 84 | u32 unused2[6]; | ||
| 85 | u32 cmd; | ||
| 86 | u32 status; | ||
| 87 | u32 cmden; | ||
| 88 | u32 padding[15]; | ||
| 89 | }; | ||
| 90 | |||
| 91 | struct tnetd7200_clocks { | ||
| 92 | struct tnetd7200_clock cpu; | ||
| 93 | struct tnetd7200_clock dsp; | ||
| 94 | struct tnetd7200_clock usb; | ||
| 95 | }; | ||
| 96 | |||
| 97 | int ar7_cpu_clock = 150000000; | ||
| 98 | EXPORT_SYMBOL(ar7_cpu_clock); | ||
| 99 | int ar7_bus_clock = 125000000; | ||
| 100 | EXPORT_SYMBOL(ar7_bus_clock); | ||
| 101 | int ar7_dsp_clock; | ||
| 102 | EXPORT_SYMBOL(ar7_dsp_clock); | ||
| 103 | |||
| 104 | static void approximate(int base, int target, int *prediv, | ||
| 105 | int *postdiv, int *mul) | ||
| 106 | { | ||
| 107 | int i, j, k, freq, res = target; | ||
| 108 | for (i = 1; i <= 16; i++) | ||
| 109 | for (j = 1; j <= 32; j++) | ||
| 110 | for (k = 1; k <= 32; k++) { | ||
| 111 | freq = abs(base / j * i / k - target); | ||
| 112 | if (freq < res) { | ||
| 113 | res = freq; | ||
| 114 | *mul = i; | ||
| 115 | *prediv = j; | ||
| 116 | *postdiv = k; | ||
| 117 | } | ||
| 118 | } | ||
| 119 | } | ||
| 120 | |||
| 121 | static void calculate(int base, int target, int *prediv, int *postdiv, | ||
| 122 | int *mul) | ||
| 123 | { | ||
| 124 | int tmp_gcd, tmp_base, tmp_freq; | ||
| 125 | |||
| 126 | for (*prediv = 1; *prediv <= 32; (*prediv)++) { | ||
| 127 | tmp_base = base / *prediv; | ||
| 128 | tmp_gcd = gcd(target, tmp_base); | ||
| 129 | *mul = target / tmp_gcd; | ||
| 130 | *postdiv = tmp_base / tmp_gcd; | ||
| 131 | if ((*mul < 1) || (*mul >= 16)) | ||
| 132 | continue; | ||
| 133 | if ((*postdiv > 0) & (*postdiv <= 32)) | ||
| 134 | break; | ||
| 135 | } | ||
| 136 | |||
| 137 | if (base / *prediv * *mul / *postdiv != target) { | ||
| 138 | approximate(base, target, prediv, postdiv, mul); | ||
| 139 | tmp_freq = base / *prediv * *mul / *postdiv; | ||
| 140 | printk(KERN_WARNING | ||
| 141 | "Adjusted requested frequency %d to %d\n", | ||
| 142 | target, tmp_freq); | ||
| 143 | } | ||
| 144 | |||
| 145 | printk(KERN_DEBUG "Clocks: prediv: %d, postdiv: %d, mul: %d\n", | ||
| 146 | *prediv, *postdiv, *mul); | ||
| 147 | } | ||
| 148 | |||
| 149 | static int tnetd7300_dsp_clock(void) | ||
| 150 | { | ||
| 151 | u32 didr1, didr2; | ||
| 152 | u8 rev = ar7_chip_rev(); | ||
| 153 | didr1 = readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x18)); | ||
| 154 | didr2 = readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x1c)); | ||
| 155 | if (didr2 & (1 << 23)) | ||
| 156 | return 0; | ||
| 157 | if ((rev >= 0x23) && (rev != 0x57)) | ||
| 158 | return 250000000; | ||
| 159 | if ((((didr2 & 0x1fff) << 10) | ((didr1 & 0xffc00000) >> 22)) | ||
| 160 | > 4208000) | ||
| 161 | return 250000000; | ||
| 162 | return 0; | ||
| 163 | } | ||
| 164 | |||
| 165 | static int tnetd7300_get_clock(u32 shift, struct tnetd7300_clock *clock, | ||
| 166 | u32 *bootcr, u32 bus_clock) | ||
| 167 | { | ||
| 168 | int product; | ||
| 169 | int base_clock = AR7_REF_CLOCK; | ||
| 170 | u32 ctrl = readl(&clock->ctrl); | ||
| 171 | u32 pll = readl(&clock->pll); | ||
| 172 | int prediv = ((ctrl & PREDIV_MASK) >> PREDIV_SHIFT) + 1; | ||
| 173 | int postdiv = (ctrl & POSTDIV_MASK) + 1; | ||
| 174 | int divisor = prediv * postdiv; | ||
| 175 | int mul = ((pll & MUL_MASK) >> MUL_SHIFT) + 1; | ||
| 176 | |||
| 177 | switch ((*bootcr & (BOOT_PLL_SOURCE_MASK << shift)) >> shift) { | ||
| 178 | case BOOT_PLL_SOURCE_BUS: | ||
| 179 | base_clock = bus_clock; | ||
| 180 | break; | ||
| 181 | case BOOT_PLL_SOURCE_REF: | ||
| 182 | base_clock = AR7_REF_CLOCK; | ||
| 183 | break; | ||
| 184 | case BOOT_PLL_SOURCE_XTAL: | ||
| 185 | base_clock = AR7_XTAL_CLOCK; | ||
| 186 | break; | ||
| 187 | case BOOT_PLL_SOURCE_CPU: | ||
| 188 | base_clock = ar7_cpu_clock; | ||
| 189 | break; | ||
| 190 | } | ||
| 191 | |||
| 192 | if (*bootcr & BOOT_PLL_BYPASS) | ||
| 193 | return base_clock / divisor; | ||
| 194 | |||
| 195 | if ((pll & PLL_MODE_MASK) == 0) | ||
| 196 | return (base_clock >> (mul / 16 + 1)) / divisor; | ||
| 197 | |||
| 198 | if ((pll & (PLL_NDIV | PLL_DIV)) == (PLL_NDIV | PLL_DIV)) { | ||
| 199 | product = (mul & 1) ? | ||
| 200 | (base_clock * mul) >> 1 : | ||
| 201 | (base_clock * (mul - 1)) >> 2; | ||
| 202 | return product / divisor; | ||
| 203 | } | ||
| 204 | |||
| 205 | if (mul == 16) | ||
| 206 | return base_clock / divisor; | ||
| 207 | |||
| 208 | return base_clock * mul / divisor; | ||
| 209 | } | ||
| 210 | |||
| 211 | static void tnetd7300_set_clock(u32 shift, struct tnetd7300_clock *clock, | ||
| 212 | u32 *bootcr, u32 frequency) | ||
| 213 | { | ||
| 214 | int prediv, postdiv, mul; | ||
| 215 | int base_clock = ar7_bus_clock; | ||
| 216 | |||
| 217 | switch ((*bootcr & (BOOT_PLL_SOURCE_MASK << shift)) >> shift) { | ||
| 218 | case BOOT_PLL_SOURCE_BUS: | ||
| 219 | base_clock = ar7_bus_clock; | ||
| 220 | break; | ||
| 221 | case BOOT_PLL_SOURCE_REF: | ||
| 222 | base_clock = AR7_REF_CLOCK; | ||
| 223 | break; | ||
| 224 | case BOOT_PLL_SOURCE_XTAL: | ||
| 225 | base_clock = AR7_XTAL_CLOCK; | ||
| 226 | break; | ||
| 227 | case BOOT_PLL_SOURCE_CPU: | ||
| 228 | base_clock = ar7_cpu_clock; | ||
| 229 | break; | ||
| 230 | } | ||
| 231 | |||
| 232 | calculate(base_clock, frequency, &prediv, &postdiv, &mul); | ||
| 233 | |||
| 234 | writel(((prediv - 1) << PREDIV_SHIFT) | (postdiv - 1), &clock->ctrl); | ||
| 235 | msleep(1); | ||
| 236 | writel(4, &clock->pll); | ||
| 237 | while (readl(&clock->pll) & PLL_STATUS) | ||
| 238 | ; | ||
| 239 | writel(((mul - 1) << MUL_SHIFT) | (0xff << 3) | 0x0e, &clock->pll); | ||
| 240 | msleep(75); | ||
| 241 | } | ||
| 242 | |||
| 243 | static void __init tnetd7300_init_clocks(void) | ||
| 244 | { | ||
| 245 | u32 *bootcr = (u32 *)ioremap_nocache(AR7_REGS_DCL, 4); | ||
| 246 | struct tnetd7300_clocks *clocks = | ||
| 247 | ioremap_nocache(UR8_REGS_CLOCKS, | ||
| 248 | sizeof(struct tnetd7300_clocks)); | ||
| 249 | |||
| 250 | ar7_bus_clock = tnetd7300_get_clock(BUS_PLL_SOURCE_SHIFT, | ||
| 251 | &clocks->bus, bootcr, AR7_AFE_CLOCK); | ||
| 252 | |||
| 253 | if (*bootcr & BOOT_PLL_ASYNC_MODE) | ||
| 254 | ar7_cpu_clock = tnetd7300_get_clock(CPU_PLL_SOURCE_SHIFT, | ||
| 255 | &clocks->cpu, bootcr, AR7_AFE_CLOCK); | ||
| 256 | else | ||
| 257 | ar7_cpu_clock = ar7_bus_clock; | ||
| 258 | |||
| 259 | if (ar7_dsp_clock == 250000000) | ||
| 260 | tnetd7300_set_clock(DSP_PLL_SOURCE_SHIFT, &clocks->dsp, | ||
| 261 | bootcr, ar7_dsp_clock); | ||
| 262 | |||
| 263 | iounmap(clocks); | ||
| 264 | iounmap(bootcr); | ||
| 265 | } | ||
| 266 | |||
| 267 | static int tnetd7200_get_clock(int base, struct tnetd7200_clock *clock, | ||
| 268 | u32 *bootcr, u32 bus_clock) | ||
| 269 | { | ||
| 270 | int divisor = ((readl(&clock->prediv) & 0x1f) + 1) * | ||
| 271 | ((readl(&clock->postdiv) & 0x1f) + 1); | ||
| 272 | |||
| 273 | if (*bootcr & BOOT_PLL_BYPASS) | ||
| 274 | return base / divisor; | ||
| 275 | |||
| 276 | return base * ((readl(&clock->mul) & 0xf) + 1) / divisor; | ||
| 277 | } | ||
| 278 | |||
| 279 | |||
| 280 | static void tnetd7200_set_clock(int base, struct tnetd7200_clock *clock, | ||
| 281 | int prediv, int postdiv, int postdiv2, int mul, u32 frequency) | ||
| 282 | { | ||
| 283 | printk(KERN_INFO | ||
| 284 | "Clocks: base = %d, frequency = %u, prediv = %d, " | ||
| 285 | "postdiv = %d, postdiv2 = %d, mul = %d\n", | ||
| 286 | base, frequency, prediv, postdiv, postdiv2, mul); | ||
| 287 | |||
| 288 | writel(0, &clock->ctrl); | ||
| 289 | writel(DIVISOR_ENABLE_MASK | ((prediv - 1) & 0x1F), &clock->prediv); | ||
| 290 | writel((mul - 1) & 0xF, &clock->mul); | ||
| 291 | |||
| 292 | while (readl(&clock->status) & 0x1) | ||
| 293 | ; /* nop */ | ||
| 294 | |||
| 295 | writel(DIVISOR_ENABLE_MASK | ((postdiv - 1) & 0x1F), &clock->postdiv); | ||
| 296 | |||
| 297 | writel(readl(&clock->cmden) | 1, &clock->cmden); | ||
| 298 | writel(readl(&clock->cmd) | 1, &clock->cmd); | ||
| 299 | |||
| 300 | while (readl(&clock->status) & 0x1) | ||
| 301 | ; /* nop */ | ||
| 302 | |||
| 303 | writel(DIVISOR_ENABLE_MASK | ((postdiv2 - 1) & 0x1F), &clock->postdiv2); | ||
| 304 | |||
| 305 | writel(readl(&clock->cmden) | 1, &clock->cmden); | ||
| 306 | writel(readl(&clock->cmd) | 1, &clock->cmd); | ||
| 307 | |||
| 308 | while (readl(&clock->status) & 0x1) | ||
| 309 | ; /* nop */ | ||
| 310 | |||
| 311 | writel(readl(&clock->ctrl) | 1, &clock->ctrl); | ||
| 312 | } | ||
| 313 | |||
| 314 | static int tnetd7200_get_clock_base(int clock_id, u32 *bootcr) | ||
| 315 | { | ||
| 316 | if (*bootcr & BOOT_PLL_ASYNC_MODE) | ||
| 317 | /* Async */ | ||
| 318 | switch (clock_id) { | ||
| 319 | case TNETD7200_CLOCK_ID_DSP: | ||
| 320 | return AR7_REF_CLOCK; | ||
| 321 | default: | ||
| 322 | return AR7_AFE_CLOCK; | ||
| 323 | } | ||
| 324 | else | ||
| 325 | /* Sync */ | ||
| 326 | if (*bootcr & BOOT_PLL_2TO1_MODE) | ||
| 327 | /* 2:1 */ | ||
| 328 | switch (clock_id) { | ||
| 329 | case TNETD7200_CLOCK_ID_DSP: | ||
| 330 | return AR7_REF_CLOCK; | ||
| 331 | default: | ||
| 332 | return AR7_AFE_CLOCK; | ||
| 333 | } | ||
| 334 | else | ||
| 335 | /* 1:1 */ | ||
| 336 | return AR7_REF_CLOCK; | ||
| 337 | } | ||
| 338 | |||
| 339 | |||
| 340 | static void __init tnetd7200_init_clocks(void) | ||
| 341 | { | ||
| 342 | u32 *bootcr = (u32 *)ioremap_nocache(AR7_REGS_DCL, 4); | ||
| 343 | struct tnetd7200_clocks *clocks = | ||
| 344 | ioremap_nocache(AR7_REGS_CLOCKS, | ||
| 345 | sizeof(struct tnetd7200_clocks)); | ||
| 346 | int cpu_base, cpu_mul, cpu_prediv, cpu_postdiv; | ||
| 347 | int dsp_base, dsp_mul, dsp_prediv, dsp_postdiv; | ||
| 348 | int usb_base, usb_mul, usb_prediv, usb_postdiv; | ||
| 349 | |||
| 350 | cpu_base = tnetd7200_get_clock_base(TNETD7200_CLOCK_ID_CPU, bootcr); | ||
| 351 | dsp_base = tnetd7200_get_clock_base(TNETD7200_CLOCK_ID_DSP, bootcr); | ||
| 352 | |||
| 353 | if (*bootcr & BOOT_PLL_ASYNC_MODE) { | ||
| 354 | printk(KERN_INFO "Clocks: Async mode\n"); | ||
| 355 | |||
| 356 | printk(KERN_INFO "Clocks: Setting DSP clock\n"); | ||
| 357 | calculate(dsp_base, TNETD7200_DEF_DSP_CLK, | ||
| 358 | &dsp_prediv, &dsp_postdiv, &dsp_mul); | ||
| 359 | ar7_bus_clock = | ||
| 360 | ((dsp_base / dsp_prediv) * dsp_mul) / dsp_postdiv; | ||
| 361 | tnetd7200_set_clock(dsp_base, &clocks->dsp, | ||
| 362 | dsp_prediv, dsp_postdiv * 2, dsp_postdiv, dsp_mul * 2, | ||
| 363 | ar7_bus_clock); | ||
| 364 | |||
| 365 | printk(KERN_INFO "Clocks: Setting CPU clock\n"); | ||
| 366 | calculate(cpu_base, TNETD7200_DEF_CPU_CLK, &cpu_prediv, | ||
| 367 | &cpu_postdiv, &cpu_mul); | ||
| 368 | ar7_cpu_clock = | ||
| 369 | ((cpu_base / cpu_prediv) * cpu_mul) / cpu_postdiv; | ||
| 370 | tnetd7200_set_clock(cpu_base, &clocks->cpu, | ||
| 371 | cpu_prediv, cpu_postdiv, -1, cpu_mul, | ||
| 372 | ar7_cpu_clock); | ||
| 373 | |||
| 374 | } else | ||
| 375 | if (*bootcr & BOOT_PLL_2TO1_MODE) { | ||
| 376 | printk(KERN_INFO "Clocks: Sync 2:1 mode\n"); | ||
| 377 | |||
| 378 | printk(KERN_INFO "Clocks: Setting CPU clock\n"); | ||
| 379 | calculate(cpu_base, TNETD7200_DEF_CPU_CLK, &cpu_prediv, | ||
| 380 | &cpu_postdiv, &cpu_mul); | ||
| 381 | ar7_cpu_clock = ((cpu_base / cpu_prediv) * cpu_mul) | ||
| 382 | / cpu_postdiv; | ||
| 383 | tnetd7200_set_clock(cpu_base, &clocks->cpu, | ||
| 384 | cpu_prediv, cpu_postdiv, -1, cpu_mul, | ||
| 385 | ar7_cpu_clock); | ||
| 386 | |||
| 387 | printk(KERN_INFO "Clocks: Setting DSP clock\n"); | ||
| 388 | calculate(dsp_base, TNETD7200_DEF_DSP_CLK, &dsp_prediv, | ||
| 389 | &dsp_postdiv, &dsp_mul); | ||
| 390 | ar7_bus_clock = ar7_cpu_clock / 2; | ||
| 391 | tnetd7200_set_clock(dsp_base, &clocks->dsp, | ||
| 392 | dsp_prediv, dsp_postdiv * 2, dsp_postdiv, | ||
| 393 | dsp_mul * 2, ar7_bus_clock); | ||
| 394 | } else { | ||
| 395 | printk(KERN_INFO "Clocks: Sync 1:1 mode\n"); | ||
| 396 | |||
| 397 | printk(KERN_INFO "Clocks: Setting DSP clock\n"); | ||
| 398 | calculate(dsp_base, TNETD7200_DEF_DSP_CLK, &dsp_prediv, | ||
| 399 | &dsp_postdiv, &dsp_mul); | ||
| 400 | ar7_bus_clock = ((dsp_base / dsp_prediv) * dsp_mul) | ||
| 401 | / dsp_postdiv; | ||
| 402 | tnetd7200_set_clock(dsp_base, &clocks->dsp, | ||
| 403 | dsp_prediv, dsp_postdiv * 2, dsp_postdiv, | ||
| 404 | dsp_mul * 2, ar7_bus_clock); | ||
| 405 | |||
| 406 | ar7_cpu_clock = ar7_bus_clock; | ||
| 407 | } | ||
| 408 | |||
| 409 | printk(KERN_INFO "Clocks: Setting USB clock\n"); | ||
| 410 | usb_base = ar7_bus_clock; | ||
| 411 | calculate(usb_base, TNETD7200_DEF_USB_CLK, &usb_prediv, | ||
| 412 | &usb_postdiv, &usb_mul); | ||
| 413 | tnetd7200_set_clock(usb_base, &clocks->usb, | ||
| 414 | usb_prediv, usb_postdiv, -1, usb_mul, | ||
| 415 | TNETD7200_DEF_USB_CLK); | ||
| 416 | |||
| 417 | ar7_dsp_clock = ar7_cpu_clock; | ||
| 418 | |||
| 419 | iounmap(clocks); | ||
| 420 | iounmap(bootcr); | ||
| 421 | } | ||
| 422 | |||
| 423 | int __init ar7_init_clocks(void) | ||
| 424 | { | ||
| 425 | switch (ar7_chip_id()) { | ||
| 426 | case AR7_CHIP_7100: | ||
| 427 | case AR7_CHIP_7200: | ||
| 428 | tnetd7200_init_clocks(); | ||
| 429 | break; | ||
| 430 | case AR7_CHIP_7300: | ||
| 431 | ar7_dsp_clock = tnetd7300_dsp_clock(); | ||
| 432 | tnetd7300_init_clocks(); | ||
| 433 | break; | ||
| 434 | default: | ||
| 435 | break; | ||
| 436 | } | ||
| 437 | |||
| 438 | return 0; | ||
| 439 | } | ||
| 440 | arch_initcall(ar7_init_clocks); | ||
diff --git a/arch/mips/ar7/gpio.c b/arch/mips/ar7/gpio.c new file mode 100644 index 000000000000..74e14a3dbf4a --- /dev/null +++ b/arch/mips/ar7/gpio.c | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2007 Felix Fietkau <nbd@openwrt.org> | ||
| 3 | * Copyright (C) 2007 Eugene Konev <ejka@openwrt.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/module.h> | ||
| 21 | |||
| 22 | #include <asm/mach-ar7/gpio.h> | ||
| 23 | |||
| 24 | static const char *ar7_gpio_list[AR7_GPIO_MAX]; | ||
| 25 | |||
| 26 | int gpio_request(unsigned gpio, const char *label) | ||
| 27 | { | ||
| 28 | if (gpio >= AR7_GPIO_MAX) | ||
| 29 | return -EINVAL; | ||
| 30 | |||
| 31 | if (ar7_gpio_list[gpio]) | ||
| 32 | return -EBUSY; | ||
| 33 | |||
| 34 | if (label) | ||
| 35 | ar7_gpio_list[gpio] = label; | ||
| 36 | else | ||
| 37 | ar7_gpio_list[gpio] = "busy"; | ||
| 38 | |||
| 39 | return 0; | ||
| 40 | } | ||
| 41 | EXPORT_SYMBOL(gpio_request); | ||
| 42 | |||
| 43 | void gpio_free(unsigned gpio) | ||
| 44 | { | ||
| 45 | BUG_ON(!ar7_gpio_list[gpio]); | ||
| 46 | ar7_gpio_list[gpio] = NULL; | ||
| 47 | } | ||
| 48 | EXPORT_SYMBOL(gpio_free); | ||
diff --git a/arch/mips/ar7/irq.c b/arch/mips/ar7/irq.c new file mode 100644 index 000000000000..c781556c44e4 --- /dev/null +++ b/arch/mips/ar7/irq.c | |||
| @@ -0,0 +1,176 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2006,2007 Felix Fietkau <nbd@openwrt.org> | ||
| 3 | * Copyright (C) 2006,2007 Eugene Konev <ejka@openwrt.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/interrupt.h> | ||
| 21 | #include <linux/io.h> | ||
| 22 | |||
| 23 | #include <asm/irq_cpu.h> | ||
| 24 | #include <asm/mipsregs.h> | ||
| 25 | #include <asm/mach-ar7/ar7.h> | ||
| 26 | |||
| 27 | #define EXCEPT_OFFSET 0x80 | ||
| 28 | #define PACE_OFFSET 0xA0 | ||
| 29 | #define CHNLS_OFFSET 0x200 | ||
| 30 | |||
| 31 | #define REG_OFFSET(irq, reg) ((irq) / 32 * 0x4 + reg * 0x10) | ||
| 32 | #define SEC_REG_OFFSET(reg) (EXCEPT_OFFSET + reg * 0x8) | ||
| 33 | #define SEC_SR_OFFSET (SEC_REG_OFFSET(0)) /* 0x80 */ | ||
| 34 | #define CR_OFFSET(irq) (REG_OFFSET(irq, 1)) /* 0x10 */ | ||
| 35 | #define SEC_CR_OFFSET (SEC_REG_OFFSET(1)) /* 0x88 */ | ||
| 36 | #define ESR_OFFSET(irq) (REG_OFFSET(irq, 2)) /* 0x20 */ | ||
| 37 | #define SEC_ESR_OFFSET (SEC_REG_OFFSET(2)) /* 0x90 */ | ||
| 38 | #define ECR_OFFSET(irq) (REG_OFFSET(irq, 3)) /* 0x30 */ | ||
| 39 | #define SEC_ECR_OFFSET (SEC_REG_OFFSET(3)) /* 0x98 */ | ||
| 40 | #define PIR_OFFSET (0x40) | ||
| 41 | #define MSR_OFFSET (0x44) | ||
| 42 | #define PM_OFFSET(irq) (REG_OFFSET(irq, 5)) /* 0x50 */ | ||
| 43 | #define TM_OFFSET(irq) (REG_OFFSET(irq, 6)) /* 0x60 */ | ||
| 44 | |||
| 45 | #define REG(addr) ((u32 *)(KSEG1ADDR(AR7_REGS_IRQ) + addr)) | ||
| 46 | |||
| 47 | #define CHNL_OFFSET(chnl) (CHNLS_OFFSET + (chnl * 4)) | ||
| 48 | |||
| 49 | static int ar7_irq_base; | ||
| 50 | |||
| 51 | static void ar7_unmask_irq(unsigned int irq) | ||
| 52 | { | ||
| 53 | writel(1 << ((irq - ar7_irq_base) % 32), | ||
| 54 | REG(ESR_OFFSET(irq - ar7_irq_base))); | ||
| 55 | } | ||
| 56 | |||
| 57 | static void ar7_mask_irq(unsigned int irq) | ||
| 58 | { | ||
| 59 | writel(1 << ((irq - ar7_irq_base) % 32), | ||
| 60 | REG(ECR_OFFSET(irq - ar7_irq_base))); | ||
| 61 | } | ||
| 62 | |||
| 63 | static void ar7_ack_irq(unsigned int irq) | ||
| 64 | { | ||
| 65 | writel(1 << ((irq - ar7_irq_base) % 32), | ||
| 66 | REG(CR_OFFSET(irq - ar7_irq_base))); | ||
| 67 | } | ||
| 68 | |||
| 69 | static void ar7_unmask_sec_irq(unsigned int irq) | ||
| 70 | { | ||
| 71 | writel(1 << (irq - ar7_irq_base - 40), REG(SEC_ESR_OFFSET)); | ||
| 72 | } | ||
| 73 | |||
| 74 | static void ar7_mask_sec_irq(unsigned int irq) | ||
| 75 | { | ||
| 76 | writel(1 << (irq - ar7_irq_base - 40), REG(SEC_ECR_OFFSET)); | ||
| 77 | } | ||
| 78 | |||
| 79 | static void ar7_ack_sec_irq(unsigned int irq) | ||
| 80 | { | ||
| 81 | writel(1 << (irq - ar7_irq_base - 40), REG(SEC_CR_OFFSET)); | ||
| 82 | } | ||
| 83 | |||
| 84 | static struct irq_chip ar7_irq_type = { | ||
| 85 | .name = "AR7", | ||
| 86 | .unmask = ar7_unmask_irq, | ||
| 87 | .mask = ar7_mask_irq, | ||
| 88 | .ack = ar7_ack_irq | ||
| 89 | }; | ||
| 90 | |||
| 91 | static struct irq_chip ar7_sec_irq_type = { | ||
| 92 | .name = "AR7", | ||
| 93 | .unmask = ar7_unmask_sec_irq, | ||
| 94 | .mask = ar7_mask_sec_irq, | ||
| 95 | .ack = ar7_ack_sec_irq, | ||
| 96 | }; | ||
| 97 | |||
| 98 | static struct irqaction ar7_cascade_action = { | ||
| 99 | .handler = no_action, | ||
| 100 | .name = "AR7 cascade interrupt" | ||
| 101 | }; | ||
| 102 | |||
| 103 | static void __init ar7_irq_init(int base) | ||
| 104 | { | ||
| 105 | int i; | ||
| 106 | /* | ||
| 107 | * Disable interrupts and clear pending | ||
| 108 | */ | ||
| 109 | writel(0xffffffff, REG(ECR_OFFSET(0))); | ||
| 110 | writel(0xff, REG(ECR_OFFSET(32))); | ||
| 111 | writel(0xffffffff, REG(SEC_ECR_OFFSET)); | ||
| 112 | writel(0xffffffff, REG(CR_OFFSET(0))); | ||
| 113 | writel(0xff, REG(CR_OFFSET(32))); | ||
| 114 | writel(0xffffffff, REG(SEC_CR_OFFSET)); | ||
| 115 | |||
| 116 | ar7_irq_base = base; | ||
| 117 | |||
| 118 | for (i = 0; i < 40; i++) { | ||
| 119 | writel(i, REG(CHNL_OFFSET(i))); | ||
| 120 | /* Primary IRQ's */ | ||
| 121 | set_irq_chip_and_handler(base + i, &ar7_irq_type, | ||
| 122 | handle_level_irq); | ||
| 123 | /* Secondary IRQ's */ | ||
| 124 | if (i < 32) | ||
| 125 | set_irq_chip_and_handler(base + i + 40, | ||
| 126 | &ar7_sec_irq_type, | ||
| 127 | handle_level_irq); | ||
| 128 | } | ||
| 129 | |||
| 130 | setup_irq(2, &ar7_cascade_action); | ||
| 131 | setup_irq(ar7_irq_base, &ar7_cascade_action); | ||
| 132 | set_c0_status(IE_IRQ0); | ||
| 133 | } | ||
| 134 | |||
| 135 | void __init arch_init_irq(void) | ||
| 136 | { | ||
| 137 | mips_cpu_irq_init(); | ||
| 138 | ar7_irq_init(8); | ||
| 139 | } | ||
| 140 | |||
| 141 | static void ar7_cascade(void) | ||
| 142 | { | ||
| 143 | u32 status; | ||
| 144 | int i, irq; | ||
| 145 | |||
| 146 | /* Primary IRQ's */ | ||
| 147 | irq = readl(REG(PIR_OFFSET)) & 0x3f; | ||
| 148 | if (irq) { | ||
| 149 | do_IRQ(ar7_irq_base + irq); | ||
| 150 | return; | ||
| 151 | } | ||
| 152 | |||
| 153 | /* Secondary IRQ's are cascaded through primary '0' */ | ||
| 154 | writel(1, REG(CR_OFFSET(irq))); | ||
| 155 | status = readl(REG(SEC_SR_OFFSET)); | ||
| 156 | for (i = 0; i < 32; i++) { | ||
| 157 | if (status & 1) { | ||
| 158 | do_IRQ(ar7_irq_base + i + 40); | ||
| 159 | return; | ||
| 160 | } | ||
| 161 | status >>= 1; | ||
| 162 | } | ||
| 163 | |||
| 164 | spurious_interrupt(); | ||
| 165 | } | ||
| 166 | |||
| 167 | asmlinkage void plat_irq_dispatch(void) | ||
| 168 | { | ||
| 169 | unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; | ||
| 170 | if (pending & STATUSF_IP7) /* cpu timer */ | ||
| 171 | do_IRQ(7); | ||
| 172 | else if (pending & STATUSF_IP2) /* int0 hardware line */ | ||
| 173 | ar7_cascade(); | ||
| 174 | else | ||
| 175 | spurious_interrupt(); | ||
| 176 | } | ||
diff --git a/arch/mips/ar7/memory.c b/arch/mips/ar7/memory.c new file mode 100644 index 000000000000..46fed44825a6 --- /dev/null +++ b/arch/mips/ar7/memory.c | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2007 Felix Fietkau <nbd@openwrt.org> | ||
| 3 | * Copyright (C) 2007 Eugene Konev <ejka@openwrt.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 18 | */ | ||
| 19 | #include <linux/bootmem.h> | ||
| 20 | #include <linux/init.h> | ||
| 21 | #include <linux/mm.h> | ||
| 22 | #include <linux/module.h> | ||
| 23 | #include <linux/pfn.h> | ||
| 24 | #include <linux/proc_fs.h> | ||
| 25 | #include <linux/string.h> | ||
| 26 | #include <linux/swap.h> | ||
| 27 | |||
| 28 | #include <asm/bootinfo.h> | ||
| 29 | #include <asm/page.h> | ||
| 30 | #include <asm/sections.h> | ||
| 31 | |||
| 32 | #include <asm/mach-ar7/ar7.h> | ||
| 33 | #include <asm/mips-boards/prom.h> | ||
| 34 | |||
| 35 | static int __init memsize(void) | ||
| 36 | { | ||
| 37 | u32 size = (64 << 20); | ||
| 38 | u32 *addr = (u32 *)KSEG1ADDR(AR7_SDRAM_BASE + size - 4); | ||
| 39 | u32 *kernel_end = (u32 *)KSEG1ADDR(CPHYSADDR((u32)&_end)); | ||
| 40 | u32 *tmpaddr = addr; | ||
| 41 | |||
| 42 | while (tmpaddr > kernel_end) { | ||
| 43 | *tmpaddr = (u32)tmpaddr; | ||
| 44 | size >>= 1; | ||
| 45 | tmpaddr -= size >> 2; | ||
| 46 | } | ||
| 47 | |||
| 48 | do { | ||
| 49 | tmpaddr += size >> 2; | ||
| 50 | if (*tmpaddr != (u32)tmpaddr) | ||
| 51 | break; | ||
| 52 | size <<= 1; | ||
| 53 | } while (size < (64 << 20)); | ||
| 54 | |||
| 55 | writel(tmpaddr, &addr); | ||
| 56 | |||
| 57 | return size; | ||
| 58 | } | ||
| 59 | |||
| 60 | void __init prom_meminit(void) | ||
| 61 | { | ||
| 62 | unsigned long pages; | ||
| 63 | |||
| 64 | pages = memsize() >> PAGE_SHIFT; | ||
| 65 | add_memory_region(PHYS_OFFSET, pages << PAGE_SHIFT, | ||
| 66 | BOOT_MEM_RAM); | ||
| 67 | } | ||
| 68 | |||
| 69 | void __init prom_free_prom_memory(void) | ||
| 70 | { | ||
| 71 | /* Nothing to free */ | ||
| 72 | } | ||
diff --git a/arch/mips/ar7/platform.c b/arch/mips/ar7/platform.c new file mode 100644 index 000000000000..542244961780 --- /dev/null +++ b/arch/mips/ar7/platform.c | |||
| @@ -0,0 +1,555 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2006,2007 Felix Fietkau <nbd@openwrt.org> | ||
| 3 | * Copyright (C) 2006,2007 Eugene Konev <ejka@openwrt.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/init.h> | ||
| 21 | #include <linux/types.h> | ||
| 22 | #include <linux/module.h> | ||
| 23 | #include <linux/delay.h> | ||
| 24 | #include <linux/dma-mapping.h> | ||
| 25 | #include <linux/platform_device.h> | ||
| 26 | #include <linux/mtd/physmap.h> | ||
| 27 | #include <linux/serial.h> | ||
| 28 | #include <linux/serial_8250.h> | ||
| 29 | #include <linux/ioport.h> | ||
| 30 | #include <linux/io.h> | ||
| 31 | #include <linux/version.h> | ||
| 32 | #include <linux/vlynq.h> | ||
| 33 | #include <linux/leds.h> | ||
| 34 | #include <linux/string.h> | ||
| 35 | #include <linux/etherdevice.h> | ||
| 36 | |||
| 37 | #include <asm/addrspace.h> | ||
| 38 | #include <asm/mach-ar7/ar7.h> | ||
| 39 | #include <asm/mach-ar7/gpio.h> | ||
| 40 | #include <asm/mach-ar7/prom.h> | ||
| 41 | |||
| 42 | struct plat_vlynq_data { | ||
| 43 | struct plat_vlynq_ops ops; | ||
| 44 | int gpio_bit; | ||
| 45 | int reset_bit; | ||
| 46 | }; | ||
| 47 | |||
| 48 | |||
| 49 | static int vlynq_on(struct vlynq_device *dev) | ||
| 50 | { | ||
| 51 | int result; | ||
| 52 | struct plat_vlynq_data *pdata = dev->dev.platform_data; | ||
| 53 | |||
| 54 | result = gpio_request(pdata->gpio_bit, "vlynq"); | ||
| 55 | if (result) | ||
| 56 | goto out; | ||
| 57 | |||
| 58 | ar7_device_reset(pdata->reset_bit); | ||
| 59 | |||
| 60 | result = ar7_gpio_disable(pdata->gpio_bit); | ||
| 61 | if (result) | ||
| 62 | goto out_enabled; | ||
| 63 | |||
| 64 | result = ar7_gpio_enable(pdata->gpio_bit); | ||
| 65 | if (result) | ||
| 66 | goto out_enabled; | ||
| 67 | |||
| 68 | result = gpio_direction_output(pdata->gpio_bit, 0); | ||
| 69 | if (result) | ||
| 70 | goto out_gpio_enabled; | ||
| 71 | |||
| 72 | msleep(50); | ||
| 73 | |||
| 74 | gpio_set_value(pdata->gpio_bit, 1); | ||
| 75 | msleep(50); | ||
| 76 | |||
| 77 | return 0; | ||
| 78 | |||
| 79 | out_gpio_enabled: | ||
| 80 | ar7_gpio_disable(pdata->gpio_bit); | ||
| 81 | out_enabled: | ||
| 82 | ar7_device_disable(pdata->reset_bit); | ||
| 83 | gpio_free(pdata->gpio_bit); | ||
| 84 | out: | ||
| 85 | return result; | ||
| 86 | } | ||
| 87 | |||
| 88 | static void vlynq_off(struct vlynq_device *dev) | ||
| 89 | { | ||
| 90 | struct plat_vlynq_data *pdata = dev->dev.platform_data; | ||
| 91 | ar7_gpio_disable(pdata->gpio_bit); | ||
| 92 | gpio_free(pdata->gpio_bit); | ||
| 93 | ar7_device_disable(pdata->reset_bit); | ||
| 94 | } | ||
| 95 | |||
| 96 | static struct resource physmap_flash_resource = { | ||
| 97 | .name = "mem", | ||
| 98 | .flags = IORESOURCE_MEM, | ||
| 99 | .start = 0x10000000, | ||
| 100 | .end = 0x107fffff, | ||
| 101 | }; | ||
| 102 | |||
| 103 | static struct resource cpmac_low_res[] = { | ||
| 104 | { | ||
| 105 | .name = "regs", | ||
| 106 | .flags = IORESOURCE_MEM, | ||
| 107 | .start = AR7_REGS_MAC0, | ||
| 108 | .end = AR7_REGS_MAC0 + 0x7ff, | ||
| 109 | }, | ||
| 110 | { | ||
| 111 | .name = "irq", | ||
| 112 | .flags = IORESOURCE_IRQ, | ||
| 113 | .start = 27, | ||
| 114 | .end = 27, | ||
| 115 | }, | ||
| 116 | }; | ||
| 117 | |||
| 118 | static struct resource cpmac_high_res[] = { | ||
| 119 | { | ||
| 120 | .name = "regs", | ||
| 121 | .flags = IORESOURCE_MEM, | ||
| 122 | .start = AR7_REGS_MAC1, | ||
| 123 | .end = AR7_REGS_MAC1 + 0x7ff, | ||
| 124 | }, | ||
| 125 | { | ||
| 126 | .name = "irq", | ||
| 127 | .flags = IORESOURCE_IRQ, | ||
| 128 | .start = 41, | ||
| 129 | .end = 41, | ||
| 130 | }, | ||
| 131 | }; | ||
| 132 | |||
| 133 | static struct resource vlynq_low_res[] = { | ||
| 134 | { | ||
| 135 | .name = "regs", | ||
| 136 | .flags = IORESOURCE_MEM, | ||
| 137 | .start = AR7_REGS_VLYNQ0, | ||
| 138 | .end = AR7_REGS_VLYNQ0 + 0xff, | ||
| 139 | }, | ||
| 140 | { | ||
| 141 | .name = "irq", | ||
| 142 | .flags = IORESOURCE_IRQ, | ||
| 143 | .start = 29, | ||
| 144 | .end = 29, | ||
| 145 | }, | ||
| 146 | { | ||
| 147 | .name = "mem", | ||
| 148 | .flags = IORESOURCE_MEM, | ||
| 149 | .start = 0x04000000, | ||
| 150 | .end = 0x04ffffff, | ||
| 151 | }, | ||
| 152 | { | ||
| 153 | .name = "devirq", | ||
| 154 | .flags = IORESOURCE_IRQ, | ||
| 155 | .start = 80, | ||
| 156 | .end = 111, | ||
| 157 | }, | ||
| 158 | }; | ||
| 159 | |||
| 160 | static struct resource vlynq_high_res[] = { | ||
| 161 | { | ||
| 162 | .name = "regs", | ||
| 163 | .flags = IORESOURCE_MEM, | ||
| 164 | .start = AR7_REGS_VLYNQ1, | ||
| 165 | .end = AR7_REGS_VLYNQ1 + 0xff, | ||
| 166 | }, | ||
| 167 | { | ||
| 168 | .name = "irq", | ||
| 169 | .flags = IORESOURCE_IRQ, | ||
| 170 | .start = 33, | ||
| 171 | .end = 33, | ||
| 172 | }, | ||
| 173 | { | ||
| 174 | .name = "mem", | ||
| 175 | .flags = IORESOURCE_MEM, | ||
| 176 | .start = 0x0c000000, | ||
| 177 | .end = 0x0cffffff, | ||
| 178 | }, | ||
| 179 | { | ||
| 180 | .name = "devirq", | ||
| 181 | .flags = IORESOURCE_IRQ, | ||
| 182 | .start = 112, | ||
| 183 | .end = 143, | ||
| 184 | }, | ||
| 185 | }; | ||
| 186 | |||
| 187 | static struct resource usb_res[] = { | ||
| 188 | { | ||
| 189 | .name = "regs", | ||
| 190 | .flags = IORESOURCE_MEM, | ||
| 191 | .start = AR7_REGS_USB, | ||
| 192 | .end = AR7_REGS_USB + 0xff, | ||
| 193 | }, | ||
| 194 | { | ||
| 195 | .name = "irq", | ||
| 196 | .flags = IORESOURCE_IRQ, | ||
| 197 | .start = 32, | ||
| 198 | .end = 32, | ||
| 199 | }, | ||
| 200 | { | ||
| 201 | .name = "mem", | ||
| 202 | .flags = IORESOURCE_MEM, | ||
| 203 | .start = 0x03400000, | ||
| 204 | .end = 0x034001fff, | ||
| 205 | }, | ||
| 206 | }; | ||
| 207 | |||
| 208 | static struct physmap_flash_data physmap_flash_data = { | ||
| 209 | .width = 2, | ||
| 210 | }; | ||
| 211 | |||
| 212 | static struct plat_cpmac_data cpmac_low_data = { | ||
| 213 | .reset_bit = 17, | ||
| 214 | .power_bit = 20, | ||
| 215 | .phy_mask = 0x80000000, | ||
| 216 | }; | ||
| 217 | |||
| 218 | static struct plat_cpmac_data cpmac_high_data = { | ||
| 219 | .reset_bit = 21, | ||
| 220 | .power_bit = 22, | ||
| 221 | .phy_mask = 0x7fffffff, | ||
| 222 | }; | ||
| 223 | |||
| 224 | static struct plat_vlynq_data vlynq_low_data = { | ||
| 225 | .ops.on = vlynq_on, | ||
| 226 | .ops.off = vlynq_off, | ||
| 227 | .reset_bit = 20, | ||
| 228 | .gpio_bit = 18, | ||
| 229 | }; | ||
| 230 | |||
| 231 | static struct plat_vlynq_data vlynq_high_data = { | ||
| 232 | .ops.on = vlynq_on, | ||
| 233 | .ops.off = vlynq_off, | ||
| 234 | .reset_bit = 16, | ||
| 235 | .gpio_bit = 19, | ||
| 236 | }; | ||
| 237 | |||
| 238 | static struct platform_device physmap_flash = { | ||
| 239 | .id = 0, | ||
| 240 | .name = "physmap-flash", | ||
| 241 | .dev.platform_data = &physmap_flash_data, | ||
| 242 | .resource = &physmap_flash_resource, | ||
| 243 | .num_resources = 1, | ||
| 244 | }; | ||
| 245 | |||
| 246 | static u64 cpmac_dma_mask = DMA_32BIT_MASK; | ||
| 247 | static struct platform_device cpmac_low = { | ||
| 248 | .id = 0, | ||
| 249 | .name = "cpmac", | ||
| 250 | .dev = { | ||
| 251 | .dma_mask = &cpmac_dma_mask, | ||
| 252 | .coherent_dma_mask = DMA_32BIT_MASK, | ||
| 253 | .platform_data = &cpmac_low_data, | ||
| 254 | }, | ||
| 255 | .resource = cpmac_low_res, | ||
| 256 | .num_resources = ARRAY_SIZE(cpmac_low_res), | ||
| 257 | }; | ||
| 258 | |||
| 259 | static struct platform_device cpmac_high = { | ||
| 260 | .id = 1, | ||
| 261 | .name = "cpmac", | ||
| 262 | .dev = { | ||
| 263 | .dma_mask = &cpmac_dma_mask, | ||
| 264 | .coherent_dma_mask = DMA_32BIT_MASK, | ||
| 265 | .platform_data = &cpmac_high_data, | ||
| 266 | }, | ||
| 267 | .resource = cpmac_high_res, | ||
| 268 | .num_resources = ARRAY_SIZE(cpmac_high_res), | ||
| 269 | }; | ||
| 270 | |||
| 271 | static struct platform_device vlynq_low = { | ||
| 272 | .id = 0, | ||
| 273 | .name = "vlynq", | ||
| 274 | .dev.platform_data = &vlynq_low_data, | ||
| 275 | .resource = vlynq_low_res, | ||
| 276 | .num_resources = ARRAY_SIZE(vlynq_low_res), | ||
| 277 | }; | ||
| 278 | |||
| 279 | static struct platform_device vlynq_high = { | ||
| 280 | .id = 1, | ||
| 281 | .name = "vlynq", | ||
| 282 | .dev.platform_data = &vlynq_high_data, | ||
| 283 | .resource = vlynq_high_res, | ||
| 284 | .num_resources = ARRAY_SIZE(vlynq_high_res), | ||
| 285 | }; | ||
| 286 | |||
| 287 | |||
| 288 | static struct gpio_led default_leds[] = { | ||
| 289 | { | ||
| 290 | .name = "status", | ||
| 291 | .gpio = 8, | ||
| 292 | .active_low = 1, | ||
| 293 | }, | ||
| 294 | }; | ||
| 295 | |||
| 296 | static struct gpio_led dsl502t_leds[] = { | ||
| 297 | { | ||
| 298 | .name = "status", | ||
| 299 | .gpio = 9, | ||
| 300 | .active_low = 1, | ||
| 301 | }, | ||
| 302 | { | ||
| 303 | .name = "ethernet", | ||
| 304 | .gpio = 7, | ||
| 305 | .active_low = 1, | ||
| 306 | }, | ||
| 307 | { | ||
| 308 | .name = "usb", | ||
| 309 | .gpio = 12, | ||
| 310 | .active_low = 1, | ||
| 311 | }, | ||
| 312 | }; | ||
| 313 | |||
| 314 | static struct gpio_led dg834g_leds[] = { | ||
| 315 | { | ||
| 316 | .name = "ppp", | ||
| 317 | .gpio = 6, | ||
| 318 | .active_low = 1, | ||
| 319 | }, | ||
| 320 | { | ||
| 321 | .name = "status", | ||
| 322 | .gpio = 7, | ||
| 323 | .active_low = 1, | ||
| 324 | }, | ||
| 325 | { | ||
| 326 | .name = "adsl", | ||
| 327 | .gpio = 8, | ||
| 328 | .active_low = 1, | ||
| 329 | }, | ||
| 330 | { | ||
| 331 | .name = "wifi", | ||
| 332 | .gpio = 12, | ||
| 333 | .active_low = 1, | ||
| 334 | }, | ||
| 335 | { | ||
| 336 | .name = "power", | ||
| 337 | .gpio = 14, | ||
| 338 | .active_low = 1, | ||
| 339 | .default_trigger = "default-on", | ||
| 340 | }, | ||
| 341 | }; | ||
| 342 | |||
| 343 | static struct gpio_led fb_sl_leds[] = { | ||
| 344 | { | ||
| 345 | .name = "1", | ||
| 346 | .gpio = 7, | ||
| 347 | }, | ||
| 348 | { | ||
| 349 | .name = "2", | ||
| 350 | .gpio = 13, | ||
| 351 | .active_low = 1, | ||
| 352 | }, | ||
| 353 | { | ||
| 354 | .name = "3", | ||
| 355 | .gpio = 10, | ||
| 356 | .active_low = 1, | ||
| 357 | }, | ||
| 358 | { | ||
| 359 | .name = "4", | ||
| 360 | .gpio = 12, | ||
| 361 | .active_low = 1, | ||
| 362 | }, | ||
| 363 | { | ||
| 364 | .name = "5", | ||
| 365 | .gpio = 9, | ||
| 366 | .active_low = 1, | ||
| 367 | }, | ||
| 368 | }; | ||
| 369 | |||
| 370 | static struct gpio_led fb_fon_leds[] = { | ||
| 371 | { | ||
| 372 | .name = "1", | ||
| 373 | .gpio = 8, | ||
| 374 | }, | ||
| 375 | { | ||
| 376 | .name = "2", | ||
| 377 | .gpio = 3, | ||
| 378 | .active_low = 1, | ||
| 379 | }, | ||
| 380 | { | ||
| 381 | .name = "3", | ||
| 382 | .gpio = 5, | ||
| 383 | }, | ||
| 384 | { | ||
| 385 | .name = "4", | ||
| 386 | .gpio = 4, | ||
| 387 | .active_low = 1, | ||
| 388 | }, | ||
| 389 | { | ||
| 390 | .name = "5", | ||
| 391 | .gpio = 11, | ||
| 392 | .active_low = 1, | ||
| 393 | }, | ||
| 394 | }; | ||
| 395 | |||
| 396 | static struct gpio_led_platform_data ar7_led_data; | ||
| 397 | |||
| 398 | static struct platform_device ar7_gpio_leds = { | ||
| 399 | .name = "leds-gpio", | ||
| 400 | .id = -1, | ||
| 401 | .dev = { | ||
| 402 | .platform_data = &ar7_led_data, | ||
| 403 | } | ||
| 404 | }; | ||
| 405 | |||
| 406 | static struct platform_device ar7_udc = { | ||
| 407 | .id = -1, | ||
| 408 | .name = "ar7_udc", | ||
| 409 | .resource = usb_res, | ||
| 410 | .num_resources = ARRAY_SIZE(usb_res), | ||
| 411 | }; | ||
| 412 | |||
| 413 | static inline unsigned char char2hex(char h) | ||
| 414 | { | ||
| 415 | switch (h) { | ||
| 416 | case '0': case '1': case '2': case '3': case '4': | ||
| 417 | case '5': case '6': case '7': case '8': case '9': | ||
| 418 | return h - '0'; | ||
| 419 | case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': | ||
| 420 | return h - 'A' + 10; | ||
| 421 | case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': | ||
| 422 | return h - 'a' + 10; | ||
| 423 | default: | ||
| 424 | return 0; | ||
| 425 | } | ||
| 426 | } | ||
| 427 | |||
| 428 | static void cpmac_get_mac(int instance, unsigned char *dev_addr) | ||
| 429 | { | ||
| 430 | int i; | ||
| 431 | char name[5], default_mac[ETH_ALEN], *mac; | ||
| 432 | |||
| 433 | mac = NULL; | ||
| 434 | sprintf(name, "mac%c", 'a' + instance); | ||
| 435 | mac = prom_getenv(name); | ||
| 436 | if (!mac) { | ||
| 437 | sprintf(name, "mac%c", 'a'); | ||
| 438 | mac = prom_getenv(name); | ||
| 439 | } | ||
| 440 | if (!mac) { | ||
| 441 | random_ether_addr(default_mac); | ||
| 442 | mac = default_mac; | ||
| 443 | } | ||
| 444 | for (i = 0; i < 6; i++) | ||
| 445 | dev_addr[i] = (char2hex(mac[i * 3]) << 4) + | ||
| 446 | char2hex(mac[i * 3 + 1]); | ||
| 447 | } | ||
| 448 | |||
| 449 | static void __init detect_leds(void) | ||
| 450 | { | ||
| 451 | char *prid, *usb_prod; | ||
| 452 | |||
| 453 | /* Default LEDs */ | ||
| 454 | ar7_led_data.num_leds = ARRAY_SIZE(default_leds); | ||
| 455 | ar7_led_data.leds = default_leds; | ||
| 456 | |||
| 457 | /* FIXME: the whole thing is unreliable */ | ||
| 458 | prid = prom_getenv("ProductID"); | ||
| 459 | usb_prod = prom_getenv("usb_prod"); | ||
| 460 | |||
| 461 | /* If we can't get the product id from PROM, use the default LEDs */ | ||
| 462 | if (!prid) | ||
| 463 | return; | ||
| 464 | |||
| 465 | if (strstr(prid, "Fritz_Box_FON")) { | ||
| 466 | ar7_led_data.num_leds = ARRAY_SIZE(fb_fon_leds); | ||
| 467 | ar7_led_data.leds = fb_fon_leds; | ||
| 468 | } else if (strstr(prid, "Fritz_Box_")) { | ||
| 469 | ar7_led_data.num_leds = ARRAY_SIZE(fb_sl_leds); | ||
| 470 | ar7_led_data.leds = fb_sl_leds; | ||
| 471 | } else if ((!strcmp(prid, "AR7RD") || !strcmp(prid, "AR7DB")) | ||
| 472 | && usb_prod != NULL && strstr(usb_prod, "DSL-502T")) { | ||
| 473 | ar7_led_data.num_leds = ARRAY_SIZE(dsl502t_leds); | ||
| 474 | ar7_led_data.leds = dsl502t_leds; | ||
| 475 | } else if (strstr(prid, "DG834")) { | ||
| 476 | ar7_led_data.num_leds = ARRAY_SIZE(dg834g_leds); | ||
| 477 | ar7_led_data.leds = dg834g_leds; | ||
| 478 | } | ||
| 479 | } | ||
| 480 | |||
| 481 | static int __init ar7_register_devices(void) | ||
| 482 | { | ||
| 483 | int res; | ||
| 484 | static struct uart_port uart_port[2]; | ||
| 485 | |||
| 486 | memset(uart_port, 0, sizeof(struct uart_port) * 2); | ||
| 487 | |||
| 488 | uart_port[0].type = PORT_16550A; | ||
| 489 | uart_port[0].line = 0; | ||
| 490 | uart_port[0].irq = AR7_IRQ_UART0; | ||
| 491 | uart_port[0].uartclk = ar7_bus_freq() / 2; | ||
| 492 | uart_port[0].iotype = UPIO_MEM32; | ||
| 493 | uart_port[0].mapbase = AR7_REGS_UART0; | ||
| 494 | uart_port[0].membase = ioremap(uart_port[0].mapbase, 256); | ||
| 495 | uart_port[0].regshift = 2; | ||
| 496 | res = early_serial_setup(&uart_port[0]); | ||
| 497 | if (res) | ||
| 498 | return res; | ||
| 499 | |||
| 500 | |||
| 501 | /* Only TNETD73xx have a second serial port */ | ||
| 502 | if (ar7_has_second_uart()) { | ||
| 503 | uart_port[1].type = PORT_16550A; | ||
| 504 | uart_port[1].line = 1; | ||
| 505 | uart_port[1].irq = AR7_IRQ_UART1; | ||
| 506 | uart_port[1].uartclk = ar7_bus_freq() / 2; | ||
| 507 | uart_port[1].iotype = UPIO_MEM32; | ||
| 508 | uart_port[1].mapbase = UR8_REGS_UART1; | ||
| 509 | uart_port[1].membase = ioremap(uart_port[1].mapbase, 256); | ||
| 510 | uart_port[1].regshift = 2; | ||
| 511 | res = early_serial_setup(&uart_port[1]); | ||
| 512 | if (res) | ||
| 513 | return res; | ||
| 514 | } | ||
| 515 | |||
| 516 | res = platform_device_register(&physmap_flash); | ||
| 517 | if (res) | ||
| 518 | return res; | ||
| 519 | |||
| 520 | ar7_device_disable(vlynq_low_data.reset_bit); | ||
| 521 | res = platform_device_register(&vlynq_low); | ||
| 522 | if (res) | ||
| 523 | return res; | ||
| 524 | |||
| 525 | if (ar7_has_high_vlynq()) { | ||
| 526 | ar7_device_disable(vlynq_high_data.reset_bit); | ||
| 527 | res = platform_device_register(&vlynq_high); | ||
| 528 | if (res) | ||
| 529 | return res; | ||
| 530 | } | ||
| 531 | |||
| 532 | if (ar7_has_high_cpmac()) { | ||
| 533 | cpmac_get_mac(1, cpmac_high_data.dev_addr); | ||
| 534 | res = platform_device_register(&cpmac_high); | ||
| 535 | if (res) | ||
| 536 | return res; | ||
| 537 | } else { | ||
| 538 | cpmac_low_data.phy_mask = 0xffffffff; | ||
| 539 | } | ||
| 540 | |||
| 541 | cpmac_get_mac(0, cpmac_low_data.dev_addr); | ||
| 542 | res = platform_device_register(&cpmac_low); | ||
| 543 | if (res) | ||
| 544 | return res; | ||
| 545 | |||
| 546 | detect_leds(); | ||
| 547 | res = platform_device_register(&ar7_gpio_leds); | ||
| 548 | if (res) | ||
| 549 | return res; | ||
| 550 | |||
| 551 | res = platform_device_register(&ar7_udc); | ||
| 552 | |||
| 553 | return res; | ||
| 554 | } | ||
| 555 | arch_initcall(ar7_register_devices); | ||
diff --git a/arch/mips/ar7/prom.c b/arch/mips/ar7/prom.c new file mode 100644 index 000000000000..a320bceb2f9d --- /dev/null +++ b/arch/mips/ar7/prom.c | |||
| @@ -0,0 +1,297 @@ | |||
| 1 | /* | ||
| 2 | * Carsten Langgaard, carstenl@mips.com | ||
| 3 | * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. | ||
| 4 | * | ||
| 5 | * This program is free software; you can distribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License (Version 2) as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| 12 | * for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
| 17 | * | ||
| 18 | * Putting things on the screen/serial line using YAMONs facilities. | ||
| 19 | */ | ||
| 20 | #include <linux/init.h> | ||
| 21 | #include <linux/kernel.h> | ||
| 22 | #include <linux/serial_reg.h> | ||
| 23 | #include <linux/spinlock.h> | ||
| 24 | #include <linux/module.h> | ||
| 25 | #include <linux/string.h> | ||
| 26 | #include <linux/io.h> | ||
| 27 | #include <asm/bootinfo.h> | ||
| 28 | |||
| 29 | #include <asm/mach-ar7/ar7.h> | ||
| 30 | #include <asm/mach-ar7/prom.h> | ||
| 31 | |||
| 32 | #define MAX_ENTRY 80 | ||
| 33 | |||
| 34 | struct env_var { | ||
| 35 | char *name; | ||
| 36 | char *value; | ||
| 37 | }; | ||
| 38 | |||
| 39 | static struct env_var adam2_env[MAX_ENTRY]; | ||
| 40 | |||
| 41 | char *prom_getenv(const char *name) | ||
| 42 | { | ||
| 43 | int i; | ||
| 44 | for (i = 0; (i < MAX_ENTRY) && adam2_env[i].name; i++) | ||
| 45 | if (!strcmp(name, adam2_env[i].name)) | ||
| 46 | return adam2_env[i].value; | ||
| 47 | |||
| 48 | return NULL; | ||
| 49 | } | ||
| 50 | EXPORT_SYMBOL(prom_getenv); | ||
| 51 | |||
| 52 | char * __init prom_getcmdline(void) | ||
| 53 | { | ||
| 54 | return &(arcs_cmdline[0]); | ||
| 55 | } | ||
| 56 | |||
| 57 | static void __init ar7_init_cmdline(int argc, char *argv[]) | ||
| 58 | { | ||
| 59 | char *cp; | ||
| 60 | int actr; | ||
| 61 | |||
| 62 | actr = 1; /* Always ignore argv[0] */ | ||
| 63 | |||
| 64 | cp = &(arcs_cmdline[0]); | ||
| 65 | while (actr < argc) { | ||
| 66 | strcpy(cp, argv[actr]); | ||
| 67 | cp += strlen(argv[actr]); | ||
| 68 | *cp++ = ' '; | ||
| 69 | actr++; | ||
| 70 | } | ||
| 71 | if (cp != &(arcs_cmdline[0])) { | ||
| 72 | /* get rid of trailing space */ | ||
| 73 | --cp; | ||
| 74 | *cp = '\0'; | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | struct psbl_rec { | ||
| 79 | u32 psbl_size; | ||
| 80 | u32 env_base; | ||
| 81 | u32 env_size; | ||
| 82 | u32 ffs_base; | ||
| 83 | u32 ffs_size; | ||
| 84 | }; | ||
| 85 | |||
| 86 | static __initdata char psp_env_version[] = "TIENV0.8"; | ||
| 87 | |||
| 88 | struct psp_env_chunk { | ||
| 89 | u8 num; | ||
| 90 | u8 ctrl; | ||
| 91 | u16 csum; | ||
| 92 | u8 len; | ||
| 93 | char data[11]; | ||
| 94 | } __attribute__ ((packed)); | ||
| 95 | |||
| 96 | struct psp_var_map_entry { | ||
| 97 | u8 num; | ||
| 98 | char *value; | ||
| 99 | }; | ||
| 100 | |||
| 101 | static struct psp_var_map_entry psp_var_map[] = { | ||
| 102 | { 1, "cpufrequency" }, | ||
| 103 | { 2, "memsize" }, | ||
| 104 | { 3, "flashsize" }, | ||
| 105 | { 4, "modetty0" }, | ||
| 106 | { 5, "modetty1" }, | ||
| 107 | { 8, "maca" }, | ||
| 108 | { 9, "macb" }, | ||
| 109 | { 28, "sysfrequency" }, | ||
| 110 | { 38, "mipsfrequency" }, | ||
| 111 | }; | ||
| 112 | |||
| 113 | /* | ||
| 114 | |||
| 115 | Well-known variable (num is looked up in table above for matching variable name) | ||
| 116 | Example: cpufrequency=211968000 | ||
| 117 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- | ||
| 118 | | 01 |CTRL|CHECKSUM | 01 | _2 | _1 | _1 | _9 | _6 | _8 | _0 | _0 | _0 | \0 | FF | ||
| 119 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- | ||
| 120 | |||
| 121 | Name=Value pair in a single chunk | ||
| 122 | Example: NAME=VALUE | ||
| 123 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- | ||
| 124 | | 00 |CTRL|CHECKSUM | 01 | _N | _A | _M | _E | _0 | _V | _A | _L | _U | _E | \0 | ||
| 125 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- | ||
| 126 | |||
| 127 | Name=Value pair in 2 chunks (len is the number of chunks) | ||
| 128 | Example: bootloaderVersion=1.3.7.15 | ||
| 129 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- | ||
| 130 | | 00 |CTRL|CHECKSUM | 02 | _b | _o | _o | _t | _l | _o | _a | _d | _e | _r | _V | ||
| 131 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- | ||
| 132 | | _e | _r | _s | _i | _o | _n | \0 | _1 | _. | _3 | _. | _7 | _. | _1 | _5 | \0 | ||
| 133 | +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- | ||
| 134 | |||
| 135 | Data is padded with 0xFF | ||
| 136 | |||
| 137 | */ | ||
| 138 | |||
| 139 | #define PSP_ENV_SIZE 4096 | ||
| 140 | |||
| 141 | static char psp_env_data[PSP_ENV_SIZE] = { 0, }; | ||
| 142 | |||
| 143 | static char * __init lookup_psp_var_map(u8 num) | ||
| 144 | { | ||
| 145 | int i; | ||
| 146 | |||
| 147 | for (i = 0; i < sizeof(psp_var_map); i++) | ||
| 148 | if (psp_var_map[i].num == num) | ||
| 149 | return psp_var_map[i].value; | ||
| 150 | |||
| 151 | return NULL; | ||
| 152 | } | ||
| 153 | |||
| 154 | static void __init add_adam2_var(char *name, char *value) | ||
| 155 | { | ||
| 156 | int i; | ||
| 157 | for (i = 0; i < MAX_ENTRY; i++) { | ||
| 158 | if (!adam2_env[i].name) { | ||
| 159 | adam2_env[i].name = name; | ||
| 160 | adam2_env[i].value = value; | ||
| 161 | return; | ||
| 162 | } else if (!strcmp(adam2_env[i].name, name)) { | ||
| 163 | adam2_env[i].value = value; | ||
| 164 | return; | ||
| 165 | } | ||
| 166 | } | ||
| 167 | } | ||
| 168 | |||
| 169 | static int __init parse_psp_env(void *psp_env_base) | ||
| 170 | { | ||
| 171 | int i, n; | ||
| 172 | char *name, *value; | ||
| 173 | struct psp_env_chunk *chunks = (struct psp_env_chunk *)psp_env_data; | ||
| 174 | |||
| 175 | memcpy_fromio(chunks, psp_env_base, PSP_ENV_SIZE); | ||
| 176 | |||
| 177 | i = 1; | ||
| 178 | n = PSP_ENV_SIZE / sizeof(struct psp_env_chunk); | ||
| 179 | while (i < n) { | ||
| 180 | if ((chunks[i].num == 0xff) || ((i + chunks[i].len) > n)) | ||
| 181 | break; | ||
| 182 | value = chunks[i].data; | ||
| 183 | if (chunks[i].num) { | ||
| 184 | name = lookup_psp_var_map(chunks[i].num); | ||
| 185 | } else { | ||
| 186 | name = value; | ||
| 187 | value += strlen(name) + 1; | ||
| 188 | } | ||
| 189 | if (name) | ||
| 190 | add_adam2_var(name, value); | ||
| 191 | i += chunks[i].len; | ||
| 192 | } | ||
| 193 | return 0; | ||
| 194 | } | ||
| 195 | |||
| 196 | static void __init ar7_init_env(struct env_var *env) | ||
| 197 | { | ||
| 198 | int i; | ||
| 199 | struct psbl_rec *psbl = (struct psbl_rec *)(KSEG1ADDR(0x14000300)); | ||
| 200 | void *psp_env = (void *)KSEG1ADDR(psbl->env_base); | ||
| 201 | |||
| 202 | if (strcmp(psp_env, psp_env_version) == 0) { | ||
| 203 | parse_psp_env(psp_env); | ||
| 204 | } else { | ||
| 205 | for (i = 0; i < MAX_ENTRY; i++, env++) | ||
| 206 | if (env->name) | ||
| 207 | add_adam2_var(env->name, env->value); | ||
| 208 | } | ||
| 209 | } | ||
| 210 | |||
| 211 | static void __init console_config(void) | ||
| 212 | { | ||
| 213 | #ifdef CONFIG_SERIAL_8250_CONSOLE | ||
| 214 | char console_string[40]; | ||
| 215 | int baud = 0; | ||
| 216 | char parity = '\0', bits = '\0', flow = '\0'; | ||
| 217 | char *s, *p; | ||
| 218 | |||
| 219 | if (strstr(prom_getcmdline(), "console=")) | ||
| 220 | return; | ||
| 221 | |||
| 222 | #ifdef CONFIG_KGDB | ||
| 223 | if (!strstr(prom_getcmdline(), "nokgdb")) { | ||
| 224 | strcat(prom_getcmdline(), " console=kgdb"); | ||
| 225 | kgdb_enabled = 1; | ||
| 226 | return; | ||
| 227 | } | ||
| 228 | #endif | ||
| 229 | |||
| 230 | s = prom_getenv("modetty0"); | ||
| 231 | if (s) { | ||
| 232 | baud = simple_strtoul(s, &p, 10); | ||
| 233 | s = p; | ||
| 234 | if (*s == ',') | ||
| 235 | s++; | ||
| 236 | if (*s) | ||
| 237 | parity = *s++; | ||
| 238 | if (*s == ',') | ||
| 239 | s++; | ||
| 240 | if (*s) | ||
| 241 | bits = *s++; | ||
| 242 | if (*s == ',') | ||
| 243 | s++; | ||
| 244 | if (*s == 'h') | ||
| 245 | flow = 'r'; | ||
| 246 | } | ||
| 247 | |||
| 248 | if (baud == 0) | ||
| 249 | baud = 38400; | ||
| 250 | if (parity != 'n' && parity != 'o' && parity != 'e') | ||
| 251 | parity = 'n'; | ||
| 252 | if (bits != '7' && bits != '8') | ||
| 253 | bits = '8'; | ||
| 254 | |||
| 255 | if (flow == 'r') | ||
| 256 | sprintf(console_string, " console=ttyS0,%d%c%c%c", baud, | ||
| 257 | parity, bits, flow); | ||
| 258 | else | ||
| 259 | sprintf(console_string, " console=ttyS0,%d%c%c", baud, parity, | ||
| 260 | bits); | ||
| 261 | strcat(prom_getcmdline(), console_string); | ||
| 262 | #endif | ||
| 263 | } | ||
| 264 | |||
| 265 | void __init prom_init(void) | ||
| 266 | { | ||
| 267 | ar7_init_cmdline(fw_arg0, (char **)fw_arg1); | ||
| 268 | ar7_init_env((struct env_var *)fw_arg2); | ||
| 269 | console_config(); | ||
| 270 | } | ||
| 271 | |||
| 272 | #define PORT(offset) (KSEG1ADDR(AR7_REGS_UART0 + (offset * 4))) | ||
| 273 | static inline unsigned int serial_in(int offset) | ||
| 274 | { | ||
| 275 | return readl((void *)PORT(offset)); | ||
| 276 | } | ||
| 277 | |||
| 278 | static inline void serial_out(int offset, int value) | ||
| 279 | { | ||
| 280 | writel(value, (void *)PORT(offset)); | ||
| 281 | } | ||
| 282 | |||
| 283 | char prom_getchar(void) | ||
| 284 | { | ||
| 285 | while (!(serial_in(UART_LSR) & UART_LSR_DR)) | ||
| 286 | ; | ||
| 287 | return serial_in(UART_RX); | ||
| 288 | } | ||
| 289 | |||
| 290 | int prom_putchar(char c) | ||
| 291 | { | ||
| 292 | while ((serial_in(UART_LSR) & UART_LSR_TEMT) == 0) | ||
| 293 | ; | ||
| 294 | serial_out(UART_TX, c); | ||
| 295 | return 1; | ||
| 296 | } | ||
| 297 | |||
diff --git a/arch/mips/ar7/setup.c b/arch/mips/ar7/setup.c new file mode 100644 index 000000000000..6ebb5f16d967 --- /dev/null +++ b/arch/mips/ar7/setup.c | |||
| @@ -0,0 +1,94 @@ | |||
| 1 | /* | ||
| 2 | * Carsten Langgaard, carstenl@mips.com | ||
| 3 | * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. | ||
| 4 | * | ||
| 5 | * This program is free software; you can distribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License (Version 2) as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| 12 | * for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
| 17 | */ | ||
| 18 | #include <linux/version.h> | ||
| 19 | #include <linux/init.h> | ||
| 20 | #include <linux/ioport.h> | ||
| 21 | #include <linux/pm.h> | ||
| 22 | #include <linux/time.h> | ||
| 23 | |||
| 24 | #include <asm/reboot.h> | ||
| 25 | #include <asm/mach-ar7/ar7.h> | ||
| 26 | #include <asm/mach-ar7/prom.h> | ||
| 27 | |||
| 28 | static void ar7_machine_restart(char *command) | ||
| 29 | { | ||
| 30 | u32 *softres_reg = ioremap(AR7_REGS_RESET + | ||
| 31 | AR7_RESET_SOFTWARE, 1); | ||
| 32 | writel(1, softres_reg); | ||
| 33 | } | ||
| 34 | |||
| 35 | static void ar7_machine_halt(void) | ||
| 36 | { | ||
| 37 | while (1) | ||
| 38 | ; | ||
| 39 | } | ||
| 40 | |||
| 41 | static void ar7_machine_power_off(void) | ||
| 42 | { | ||
| 43 | u32 *power_reg = (u32 *)ioremap(AR7_REGS_POWER, 1); | ||
| 44 | u32 power_state = readl(power_reg) | (3 << 30); | ||
| 45 | writel(power_state, power_reg); | ||
| 46 | ar7_machine_halt(); | ||
| 47 | } | ||
| 48 | |||
| 49 | const char *get_system_type(void) | ||
| 50 | { | ||
| 51 | u16 chip_id = ar7_chip_id(); | ||
| 52 | switch (chip_id) { | ||
| 53 | case AR7_CHIP_7300: | ||
| 54 | return "TI AR7 (TNETD7300)"; | ||
| 55 | case AR7_CHIP_7100: | ||
| 56 | return "TI AR7 (TNETD7100)"; | ||
| 57 | case AR7_CHIP_7200: | ||
| 58 | return "TI AR7 (TNETD7200)"; | ||
| 59 | default: | ||
| 60 | return "TI AR7 (Unknown)"; | ||
| 61 | } | ||
| 62 | } | ||
| 63 | |||
| 64 | static int __init ar7_init_console(void) | ||
| 65 | { | ||
| 66 | return 0; | ||
| 67 | } | ||
| 68 | console_initcall(ar7_init_console); | ||
| 69 | |||
| 70 | /* | ||
| 71 | * Initializes basic routines and structures pointers, memory size (as | ||
| 72 | * given by the bios and saves the command line. | ||
| 73 | */ | ||
| 74 | |||
| 75 | void __init plat_mem_setup(void) | ||
| 76 | { | ||
| 77 | unsigned long io_base; | ||
| 78 | |||
| 79 | _machine_restart = ar7_machine_restart; | ||
| 80 | _machine_halt = ar7_machine_halt; | ||
| 81 | pm_power_off = ar7_machine_power_off; | ||
| 82 | panic_timeout = 3; | ||
| 83 | |||
| 84 | io_base = (unsigned long)ioremap(AR7_REGS_BASE, 0x10000); | ||
| 85 | if (!io_base) | ||
| 86 | panic("Can't remap IO base!\n"); | ||
| 87 | set_io_port_base(io_base); | ||
| 88 | |||
| 89 | prom_meminit(); | ||
| 90 | |||
| 91 | printk(KERN_INFO "%s, ID: 0x%04x, Revision: 0x%02x\n", | ||
| 92 | get_system_type(), | ||
| 93 | ar7_chip_id(), ar7_chip_rev()); | ||
| 94 | } | ||
diff --git a/arch/mips/ar7/time.c b/arch/mips/ar7/time.c new file mode 100644 index 000000000000..a1fba894daa2 --- /dev/null +++ b/arch/mips/ar7/time.c | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | /* | ||
| 2 | * Carsten Langgaard, carstenl@mips.com | ||
| 3 | * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. | ||
| 4 | * | ||
| 5 | * This program is free software; you can distribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License (Version 2) as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| 12 | * for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
| 17 | * | ||
| 18 | * Setting up the clock on the MIPS boards. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #include <linux/init.h> | ||
| 22 | #include <linux/time.h> | ||
| 23 | |||
| 24 | #include <asm/time.h> | ||
| 25 | #include <asm/mach-ar7/ar7.h> | ||
| 26 | |||
| 27 | void __init plat_time_init(void) | ||
| 28 | { | ||
| 29 | mips_hpt_frequency = ar7_cpu_freq() / 2; | ||
| 30 | } | ||
diff --git a/arch/mips/cavium-octeon/Makefile b/arch/mips/cavium-octeon/Makefile index 7c0528b0e34c..d6903c3f3d51 100644 --- a/arch/mips/cavium-octeon/Makefile +++ b/arch/mips/cavium-octeon/Makefile | |||
| @@ -14,9 +14,5 @@ obj-y += dma-octeon.o flash_setup.o | |||
| 14 | obj-y += octeon-memcpy.o | 14 | obj-y += octeon-memcpy.o |
| 15 | 15 | ||
| 16 | obj-$(CONFIG_SMP) += smp.o | 16 | obj-$(CONFIG_SMP) += smp.o |
| 17 | obj-$(CONFIG_PCI) += pci-common.o | ||
| 18 | obj-$(CONFIG_PCI) += pci.o | ||
| 19 | obj-$(CONFIG_PCI) += pcie.o | ||
| 20 | obj-$(CONFIG_PCI_MSI) += msi.o | ||
| 21 | 17 | ||
| 22 | EXTRA_CFLAGS += -Werror | 18 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/mips/cavium-octeon/dma-octeon.c b/arch/mips/cavium-octeon/dma-octeon.c index 627c162a6159..4b92bfc662db 100644 --- a/arch/mips/cavium-octeon/dma-octeon.c +++ b/arch/mips/cavium-octeon/dma-octeon.c | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | #include <dma-coherence.h> | 29 | #include <dma-coherence.h> |
| 30 | 30 | ||
| 31 | #ifdef CONFIG_PCI | 31 | #ifdef CONFIG_PCI |
| 32 | #include "pci-common.h" | 32 | #include <asm/octeon/pci-octeon.h> |
| 33 | #endif | 33 | #endif |
| 34 | 34 | ||
| 35 | #define BAR2_PCI_ADDRESS 0x8000000000ul | 35 | #define BAR2_PCI_ADDRESS 0x8000000000ul |
diff --git a/arch/mips/cavium-octeon/pci-common.c b/arch/mips/cavium-octeon/pci-common.c deleted file mode 100644 index cd029f88da7f..000000000000 --- a/arch/mips/cavium-octeon/pci-common.c +++ /dev/null | |||
| @@ -1,137 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2005-2007 Cavium Networks | ||
| 7 | */ | ||
| 8 | #include <linux/kernel.h> | ||
| 9 | #include <linux/init.h> | ||
| 10 | #include <linux/pci.h> | ||
| 11 | #include <linux/interrupt.h> | ||
| 12 | #include <linux/time.h> | ||
| 13 | #include <linux/delay.h> | ||
| 14 | #include "pci-common.h" | ||
| 15 | |||
| 16 | typeof(pcibios_map_irq) *octeon_pcibios_map_irq; | ||
| 17 | enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID; | ||
| 18 | |||
| 19 | /** | ||
| 20 | * Map a PCI device to the appropriate interrupt line | ||
| 21 | * | ||
| 22 | * @param dev The Linux PCI device structure for the device to map | ||
| 23 | * @param slot The slot number for this device on __BUS 0__. Linux | ||
| 24 | * enumerates through all the bridges and figures out the | ||
| 25 | * slot on Bus 0 where this device eventually hooks to. | ||
| 26 | * @param pin The PCI interrupt pin read from the device, then swizzled | ||
| 27 | * as it goes through each bridge. | ||
| 28 | * @return Interrupt number for the device | ||
| 29 | */ | ||
| 30 | int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||
| 31 | { | ||
| 32 | if (octeon_pcibios_map_irq) | ||
| 33 | return octeon_pcibios_map_irq(dev, slot, pin); | ||
| 34 | else | ||
| 35 | panic("octeon_pcibios_map_irq doesn't point to a " | ||
| 36 | "pcibios_map_irq() function"); | ||
| 37 | } | ||
| 38 | |||
| 39 | |||
| 40 | /** | ||
| 41 | * Called to perform platform specific PCI setup | ||
| 42 | * | ||
| 43 | * @param dev | ||
| 44 | * @return | ||
| 45 | */ | ||
| 46 | int pcibios_plat_dev_init(struct pci_dev *dev) | ||
| 47 | { | ||
| 48 | uint16_t config; | ||
| 49 | uint32_t dconfig; | ||
| 50 | int pos; | ||
| 51 | /* | ||
| 52 | * Force the Cache line setting to 64 bytes. The standard | ||
| 53 | * Linux bus scan doesn't seem to set it. Octeon really has | ||
| 54 | * 128 byte lines, but Intel bridges get really upset if you | ||
| 55 | * try and set values above 64 bytes. Value is specified in | ||
| 56 | * 32bit words. | ||
| 57 | */ | ||
| 58 | pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 64 / 4); | ||
| 59 | /* Set latency timers for all devices */ | ||
| 60 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 48); | ||
| 61 | |||
| 62 | /* Enable reporting System errors and parity errors on all devices */ | ||
| 63 | /* Enable parity checking and error reporting */ | ||
| 64 | pci_read_config_word(dev, PCI_COMMAND, &config); | ||
| 65 | config |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR; | ||
| 66 | pci_write_config_word(dev, PCI_COMMAND, config); | ||
| 67 | |||
| 68 | if (dev->subordinate) { | ||
| 69 | /* Set latency timers on sub bridges */ | ||
| 70 | pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 48); | ||
| 71 | /* More bridge error detection */ | ||
| 72 | pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &config); | ||
| 73 | config |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR; | ||
| 74 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, config); | ||
| 75 | } | ||
| 76 | |||
| 77 | /* Enable the PCIe normal error reporting */ | ||
| 78 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | ||
| 79 | if (pos) { | ||
| 80 | /* Update Device Control */ | ||
| 81 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &config); | ||
| 82 | /* Correctable Error Reporting */ | ||
| 83 | config |= PCI_EXP_DEVCTL_CERE; | ||
| 84 | /* Non-Fatal Error Reporting */ | ||
| 85 | config |= PCI_EXP_DEVCTL_NFERE; | ||
| 86 | /* Fatal Error Reporting */ | ||
| 87 | config |= PCI_EXP_DEVCTL_FERE; | ||
| 88 | /* Unsupported Request */ | ||
| 89 | config |= PCI_EXP_DEVCTL_URRE; | ||
| 90 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, config); | ||
| 91 | } | ||
| 92 | |||
| 93 | /* Find the Advanced Error Reporting capability */ | ||
| 94 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); | ||
| 95 | if (pos) { | ||
| 96 | /* Clear Uncorrectable Error Status */ | ||
| 97 | pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, | ||
| 98 | &dconfig); | ||
| 99 | pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, | ||
| 100 | dconfig); | ||
| 101 | /* Enable reporting of all uncorrectable errors */ | ||
| 102 | /* Uncorrectable Error Mask - turned on bits disable errors */ | ||
| 103 | pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, 0); | ||
| 104 | /* | ||
| 105 | * Leave severity at HW default. This only controls if | ||
| 106 | * errors are reported as uncorrectable or | ||
| 107 | * correctable, not if the error is reported. | ||
| 108 | */ | ||
| 109 | /* PCI_ERR_UNCOR_SEVER - Uncorrectable Error Severity */ | ||
| 110 | /* Clear Correctable Error Status */ | ||
| 111 | pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &dconfig); | ||
| 112 | pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, dconfig); | ||
| 113 | /* Enable reporting of all correctable errors */ | ||
| 114 | /* Correctable Error Mask - turned on bits disable errors */ | ||
| 115 | pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, 0); | ||
| 116 | /* Advanced Error Capabilities */ | ||
| 117 | pci_read_config_dword(dev, pos + PCI_ERR_CAP, &dconfig); | ||
| 118 | /* ECRC Generation Enable */ | ||
| 119 | if (config & PCI_ERR_CAP_ECRC_GENC) | ||
| 120 | config |= PCI_ERR_CAP_ECRC_GENE; | ||
| 121 | /* ECRC Check Enable */ | ||
| 122 | if (config & PCI_ERR_CAP_ECRC_CHKC) | ||
| 123 | config |= PCI_ERR_CAP_ECRC_CHKE; | ||
| 124 | pci_write_config_dword(dev, pos + PCI_ERR_CAP, dconfig); | ||
| 125 | /* PCI_ERR_HEADER_LOG - Header Log Register (16 bytes) */ | ||
| 126 | /* Report all errors to the root complex */ | ||
| 127 | pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, | ||
| 128 | PCI_ERR_ROOT_CMD_COR_EN | | ||
| 129 | PCI_ERR_ROOT_CMD_NONFATAL_EN | | ||
| 130 | PCI_ERR_ROOT_CMD_FATAL_EN); | ||
| 131 | /* Clear the Root status register */ | ||
| 132 | pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &dconfig); | ||
| 133 | pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, dconfig); | ||
| 134 | } | ||
| 135 | |||
| 136 | return 0; | ||
| 137 | } | ||
diff --git a/arch/mips/cobalt/buttons.c b/arch/mips/cobalt/buttons.c index 9e143989c7b8..4eaec8b46e0c 100644 --- a/arch/mips/cobalt/buttons.c +++ b/arch/mips/cobalt/buttons.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Cobalt buttons platform device. | 2 | * Cobalt buttons platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cobalt/lcd.c b/arch/mips/cobalt/lcd.c index 0720e4fae311..0f1cd90f37ed 100644 --- a/arch/mips/cobalt/lcd.c +++ b/arch/mips/cobalt/lcd.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Registration of Cobalt LCD platform device. | 2 | * Registration of Cobalt LCD platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cobalt/led.c b/arch/mips/cobalt/led.c index 1c6ebd468b07..d3ce6fa1dc74 100644 --- a/arch/mips/cobalt/led.c +++ b/arch/mips/cobalt/led.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Registration of Cobalt LED platform device. | 2 | * Registration of Cobalt LED platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cobalt/mtd.c b/arch/mips/cobalt/mtd.c index 2b088ef3839a..691d620b6766 100644 --- a/arch/mips/cobalt/mtd.c +++ b/arch/mips/cobalt/mtd.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Registration of Cobalt MTD device. | 2 | * Registration of Cobalt MTD device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2006 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2006 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cobalt/rtc.c b/arch/mips/cobalt/rtc.c index e70794b8bcba..3ab39898b4e4 100644 --- a/arch/mips/cobalt/rtc.c +++ b/arch/mips/cobalt/rtc.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Registration of Cobalt RTC platform device. | 2 | * Registration of Cobalt RTC platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cobalt/serial.c b/arch/mips/cobalt/serial.c index 53b8d0d6da90..7cb51f57275e 100644 --- a/arch/mips/cobalt/serial.c +++ b/arch/mips/cobalt/serial.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Registration of Cobalt UART platform device. | 2 | * Registration of Cobalt UART platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cobalt/time.c b/arch/mips/cobalt/time.c index 4a570e7145fe..0162f9edc693 100644 --- a/arch/mips/cobalt/time.c +++ b/arch/mips/cobalt/time.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Cobalt time initialization. | 2 | * Cobalt time initialization. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/configs/ar7_defconfig b/arch/mips/configs/ar7_defconfig new file mode 100644 index 000000000000..dad5b6769d74 --- /dev/null +++ b/arch/mips/configs/ar7_defconfig | |||
| @@ -0,0 +1,1182 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.30 | ||
| 4 | # Wed Jun 24 14:08:59 2009 | ||
| 5 | # | ||
| 6 | CONFIG_MIPS=y | ||
| 7 | |||
| 8 | # | ||
| 9 | # Machine selection | ||
| 10 | # | ||
| 11 | # CONFIG_MACH_ALCHEMY is not set | ||
| 12 | CONFIG_AR7=y | ||
| 13 | # CONFIG_BASLER_EXCITE is not set | ||
| 14 | # CONFIG_BCM47XX is not set | ||
| 15 | # CONFIG_MIPS_COBALT is not set | ||
| 16 | # CONFIG_MACH_DECSTATION is not set | ||
| 17 | # CONFIG_MACH_JAZZ is not set | ||
| 18 | # CONFIG_LASAT is not set | ||
| 19 | # CONFIG_LEMOTE_FULONG is not set | ||
| 20 | # CONFIG_MIPS_MALTA is not set | ||
| 21 | # CONFIG_MIPS_SIM is not set | ||
| 22 | # CONFIG_NEC_MARKEINS is not set | ||
| 23 | # CONFIG_MACH_VR41XX is not set | ||
| 24 | # CONFIG_NXP_STB220 is not set | ||
| 25 | # CONFIG_NXP_STB225 is not set | ||
| 26 | # CONFIG_PNX8550_JBS is not set | ||
| 27 | # CONFIG_PNX8550_STB810 is not set | ||
| 28 | # CONFIG_PMC_MSP is not set | ||
| 29 | # CONFIG_PMC_YOSEMITE is not set | ||
| 30 | # CONFIG_SGI_IP22 is not set | ||
| 31 | # CONFIG_SGI_IP27 is not set | ||
| 32 | # CONFIG_SGI_IP28 is not set | ||
| 33 | # CONFIG_SGI_IP32 is not set | ||
| 34 | # CONFIG_SIBYTE_CRHINE is not set | ||
| 35 | # CONFIG_SIBYTE_CARMEL is not set | ||
| 36 | # CONFIG_SIBYTE_CRHONE is not set | ||
| 37 | # CONFIG_SIBYTE_RHONE is not set | ||
| 38 | # CONFIG_SIBYTE_SWARM is not set | ||
| 39 | # CONFIG_SIBYTE_LITTLESUR is not set | ||
| 40 | # CONFIG_SIBYTE_SENTOSA is not set | ||
| 41 | # CONFIG_SIBYTE_BIGSUR is not set | ||
| 42 | # CONFIG_SNI_RM is not set | ||
| 43 | # CONFIG_MACH_TX39XX is not set | ||
| 44 | # CONFIG_MACH_TX49XX is not set | ||
| 45 | # CONFIG_MIKROTIK_RB532 is not set | ||
| 46 | # CONFIG_WR_PPMC is not set | ||
| 47 | # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set | ||
| 48 | # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set | ||
| 49 | # CONFIG_ALCHEMY_GPIO_INDIRECT is not set | ||
| 50 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 51 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 52 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 53 | CONFIG_ARCH_SUPPORTS_OPROFILE=y | ||
| 54 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
| 55 | CONFIG_GENERIC_HWEIGHT=y | ||
| 56 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 57 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 58 | CONFIG_GENERIC_TIME=y | ||
| 59 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
| 60 | CONFIG_SCHED_OMIT_FRAME_POINTER=y | ||
| 61 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
| 62 | CONFIG_CEVT_R4K_LIB=y | ||
| 63 | CONFIG_CEVT_R4K=y | ||
| 64 | CONFIG_CSRC_R4K_LIB=y | ||
| 65 | CONFIG_CSRC_R4K=y | ||
| 66 | CONFIG_DMA_NONCOHERENT=y | ||
| 67 | CONFIG_DMA_NEED_PCI_MAP_STATE=y | ||
| 68 | CONFIG_EARLY_PRINTK=y | ||
| 69 | CONFIG_SYS_HAS_EARLY_PRINTK=y | ||
| 70 | # CONFIG_HOTPLUG_CPU is not set | ||
| 71 | # CONFIG_NO_IOPORT is not set | ||
| 72 | CONFIG_GENERIC_GPIO=y | ||
| 73 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
| 74 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
| 75 | CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y | ||
| 76 | CONFIG_IRQ_CPU=y | ||
| 77 | CONFIG_NO_EXCEPT_FILL=y | ||
| 78 | CONFIG_SWAP_IO_SPACE=y | ||
| 79 | CONFIG_BOOT_ELF32=y | ||
| 80 | CONFIG_MIPS_L1_CACHE_SHIFT=5 | ||
| 81 | |||
| 82 | # | ||
| 83 | # CPU selection | ||
| 84 | # | ||
| 85 | # CONFIG_CPU_LOONGSON2 is not set | ||
| 86 | CONFIG_CPU_MIPS32_R1=y | ||
| 87 | # CONFIG_CPU_MIPS32_R2 is not set | ||
| 88 | # CONFIG_CPU_MIPS64_R1 is not set | ||
| 89 | # CONFIG_CPU_MIPS64_R2 is not set | ||
| 90 | # CONFIG_CPU_R3000 is not set | ||
| 91 | # CONFIG_CPU_TX39XX is not set | ||
| 92 | # CONFIG_CPU_VR41XX is not set | ||
| 93 | # CONFIG_CPU_R4300 is not set | ||
| 94 | # CONFIG_CPU_R4X00 is not set | ||
| 95 | # CONFIG_CPU_TX49XX is not set | ||
| 96 | # CONFIG_CPU_R5000 is not set | ||
| 97 | # CONFIG_CPU_R5432 is not set | ||
| 98 | # CONFIG_CPU_R5500 is not set | ||
| 99 | # CONFIG_CPU_R6000 is not set | ||
| 100 | # CONFIG_CPU_NEVADA is not set | ||
| 101 | # CONFIG_CPU_R8000 is not set | ||
| 102 | # CONFIG_CPU_R10000 is not set | ||
| 103 | # CONFIG_CPU_RM7000 is not set | ||
| 104 | # CONFIG_CPU_RM9000 is not set | ||
| 105 | # CONFIG_CPU_SB1 is not set | ||
| 106 | # CONFIG_CPU_CAVIUM_OCTEON is not set | ||
| 107 | CONFIG_SYS_HAS_CPU_MIPS32_R1=y | ||
| 108 | CONFIG_CPU_MIPS32=y | ||
| 109 | CONFIG_CPU_MIPSR1=y | ||
| 110 | CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y | ||
| 111 | CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y | ||
| 112 | CONFIG_HARDWARE_WATCHPOINTS=y | ||
| 113 | |||
| 114 | # | ||
| 115 | # Kernel type | ||
| 116 | # | ||
| 117 | CONFIG_32BIT=y | ||
| 118 | # CONFIG_64BIT is not set | ||
| 119 | CONFIG_PAGE_SIZE_4KB=y | ||
| 120 | # CONFIG_PAGE_SIZE_8KB is not set | ||
| 121 | # CONFIG_PAGE_SIZE_16KB is not set | ||
| 122 | # CONFIG_PAGE_SIZE_32KB is not set | ||
| 123 | # CONFIG_PAGE_SIZE_64KB is not set | ||
| 124 | CONFIG_CPU_HAS_PREFETCH=y | ||
| 125 | CONFIG_MIPS_MT_DISABLED=y | ||
| 126 | # CONFIG_MIPS_MT_SMP is not set | ||
| 127 | # CONFIG_MIPS_MT_SMTC is not set | ||
| 128 | CONFIG_CPU_HAS_LLSC=y | ||
| 129 | CONFIG_CPU_HAS_SYNC=y | ||
| 130 | CONFIG_GENERIC_HARDIRQS=y | ||
| 131 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 132 | CONFIG_CPU_SUPPORTS_HIGHMEM=y | ||
| 133 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
| 134 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
| 135 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 136 | CONFIG_FLATMEM_MANUAL=y | ||
| 137 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 138 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 139 | CONFIG_FLATMEM=y | ||
| 140 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 141 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
| 142 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 143 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
| 144 | CONFIG_ZONE_DMA_FLAG=0 | ||
| 145 | CONFIG_VIRT_TO_BUS=y | ||
| 146 | CONFIG_HAVE_MLOCK=y | ||
| 147 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | ||
| 148 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
| 149 | CONFIG_TICK_ONESHOT=y | ||
| 150 | # CONFIG_NO_HZ is not set | ||
| 151 | CONFIG_HIGH_RES_TIMERS=y | ||
| 152 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 153 | # CONFIG_HZ_48 is not set | ||
| 154 | CONFIG_HZ_100=y | ||
| 155 | # CONFIG_HZ_128 is not set | ||
| 156 | # CONFIG_HZ_250 is not set | ||
| 157 | # CONFIG_HZ_256 is not set | ||
| 158 | # CONFIG_HZ_1000 is not set | ||
| 159 | # CONFIG_HZ_1024 is not set | ||
| 160 | CONFIG_SYS_SUPPORTS_ARBIT_HZ=y | ||
| 161 | CONFIG_HZ=100 | ||
| 162 | CONFIG_PREEMPT_NONE=y | ||
| 163 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
| 164 | # CONFIG_PREEMPT is not set | ||
| 165 | CONFIG_KEXEC=y | ||
| 166 | # CONFIG_SECCOMP is not set | ||
| 167 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 168 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 169 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 170 | |||
| 171 | # | ||
| 172 | # General setup | ||
| 173 | # | ||
| 174 | CONFIG_EXPERIMENTAL=y | ||
| 175 | CONFIG_BROKEN_ON_SMP=y | ||
| 176 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 177 | CONFIG_LOCALVERSION="" | ||
| 178 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 179 | CONFIG_SWAP=y | ||
| 180 | CONFIG_SYSVIPC=y | ||
| 181 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 182 | # CONFIG_POSIX_MQUEUE is not set | ||
| 183 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 184 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
| 185 | # CONFIG_TASKSTATS is not set | ||
| 186 | # CONFIG_AUDIT is not set | ||
| 187 | |||
| 188 | # | ||
| 189 | # RCU Subsystem | ||
| 190 | # | ||
| 191 | CONFIG_CLASSIC_RCU=y | ||
| 192 | # CONFIG_TREE_RCU is not set | ||
| 193 | # CONFIG_PREEMPT_RCU is not set | ||
| 194 | # CONFIG_TREE_RCU_TRACE is not set | ||
| 195 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
| 196 | # CONFIG_IKCONFIG is not set | ||
| 197 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 198 | # CONFIG_GROUP_SCHED is not set | ||
| 199 | # CONFIG_CGROUPS is not set | ||
| 200 | CONFIG_SYSFS_DEPRECATED=y | ||
| 201 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 202 | CONFIG_RELAY=y | ||
| 203 | # CONFIG_NAMESPACES is not set | ||
| 204 | CONFIG_BLK_DEV_INITRD=y | ||
| 205 | CONFIG_INITRAMFS_SOURCE="" | ||
| 206 | CONFIG_RD_GZIP=y | ||
| 207 | # CONFIG_RD_BZIP2 is not set | ||
| 208 | CONFIG_RD_LZMA=y | ||
| 209 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 210 | CONFIG_SYSCTL=y | ||
| 211 | CONFIG_ANON_INODES=y | ||
| 212 | CONFIG_EMBEDDED=y | ||
| 213 | CONFIG_SYSCTL_SYSCALL=y | ||
| 214 | # CONFIG_KALLSYMS is not set | ||
| 215 | CONFIG_HOTPLUG=y | ||
| 216 | CONFIG_PRINTK=y | ||
| 217 | CONFIG_BUG=y | ||
| 218 | # CONFIG_ELF_CORE is not set | ||
| 219 | # CONFIG_PCSPKR_PLATFORM is not set | ||
| 220 | CONFIG_BASE_FULL=y | ||
| 221 | CONFIG_FUTEX=y | ||
| 222 | CONFIG_EPOLL=y | ||
| 223 | CONFIG_SIGNALFD=y | ||
| 224 | CONFIG_TIMERFD=y | ||
| 225 | CONFIG_EVENTFD=y | ||
| 226 | CONFIG_SHMEM=y | ||
| 227 | CONFIG_AIO=y | ||
| 228 | |||
| 229 | # | ||
| 230 | # Performance Counters | ||
| 231 | # | ||
| 232 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
| 233 | CONFIG_STRIP_ASM_SYMS=y | ||
| 234 | # CONFIG_COMPAT_BRK is not set | ||
| 235 | CONFIG_SLAB=y | ||
| 236 | # CONFIG_SLUB is not set | ||
| 237 | # CONFIG_SLOB is not set | ||
| 238 | # CONFIG_PROFILING is not set | ||
| 239 | # CONFIG_MARKERS is not set | ||
| 240 | CONFIG_HAVE_OPROFILE=y | ||
| 241 | # CONFIG_SLOW_WORK is not set | ||
| 242 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
| 243 | CONFIG_SLABINFO=y | ||
| 244 | CONFIG_RT_MUTEXES=y | ||
| 245 | CONFIG_BASE_SMALL=0 | ||
| 246 | CONFIG_MODULES=y | ||
| 247 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 248 | CONFIG_MODULE_UNLOAD=y | ||
| 249 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
| 250 | # CONFIG_MODVERSIONS is not set | ||
| 251 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 252 | CONFIG_BLOCK=y | ||
| 253 | # CONFIG_LBD is not set | ||
| 254 | # CONFIG_BLK_DEV_BSG is not set | ||
| 255 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
| 256 | |||
| 257 | # | ||
| 258 | # IO Schedulers | ||
| 259 | # | ||
| 260 | CONFIG_IOSCHED_NOOP=y | ||
| 261 | # CONFIG_IOSCHED_AS is not set | ||
| 262 | CONFIG_IOSCHED_DEADLINE=y | ||
| 263 | # CONFIG_IOSCHED_CFQ is not set | ||
| 264 | # CONFIG_DEFAULT_AS is not set | ||
| 265 | CONFIG_DEFAULT_DEADLINE=y | ||
| 266 | # CONFIG_DEFAULT_CFQ is not set | ||
| 267 | # CONFIG_DEFAULT_NOOP is not set | ||
| 268 | CONFIG_DEFAULT_IOSCHED="deadline" | ||
| 269 | CONFIG_PROBE_INITRD_HEADER=y | ||
| 270 | # CONFIG_FREEZER is not set | ||
| 271 | |||
| 272 | # | ||
| 273 | # Bus options (PCI, PCMCIA, EISA, ISA, TC) | ||
| 274 | # | ||
| 275 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 276 | CONFIG_MMU=y | ||
| 277 | # CONFIG_PCCARD is not set | ||
| 278 | |||
| 279 | # | ||
| 280 | # Executable file formats | ||
| 281 | # | ||
| 282 | CONFIG_BINFMT_ELF=y | ||
| 283 | # CONFIG_HAVE_AOUT is not set | ||
| 284 | # CONFIG_BINFMT_MISC is not set | ||
| 285 | CONFIG_TRAD_SIGNALS=y | ||
| 286 | |||
| 287 | # | ||
| 288 | # Power management options | ||
| 289 | # | ||
| 290 | CONFIG_ARCH_HIBERNATION_POSSIBLE=y | ||
| 291 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
| 292 | # CONFIG_PM is not set | ||
| 293 | CONFIG_NET=y | ||
| 294 | |||
| 295 | # | ||
| 296 | # Networking options | ||
| 297 | # | ||
| 298 | CONFIG_PACKET=y | ||
| 299 | CONFIG_PACKET_MMAP=y | ||
| 300 | CONFIG_UNIX=y | ||
| 301 | # CONFIG_NET_KEY is not set | ||
| 302 | CONFIG_INET=y | ||
| 303 | CONFIG_IP_MULTICAST=y | ||
| 304 | CONFIG_IP_ADVANCED_ROUTER=y | ||
| 305 | CONFIG_ASK_IP_FIB_HASH=y | ||
| 306 | # CONFIG_IP_FIB_TRIE is not set | ||
| 307 | CONFIG_IP_FIB_HASH=y | ||
| 308 | CONFIG_IP_MULTIPLE_TABLES=y | ||
| 309 | CONFIG_IP_ROUTE_MULTIPATH=y | ||
| 310 | CONFIG_IP_ROUTE_VERBOSE=y | ||
| 311 | # CONFIG_IP_PNP is not set | ||
| 312 | # CONFIG_NET_IPIP is not set | ||
| 313 | # CONFIG_NET_IPGRE is not set | ||
| 314 | CONFIG_IP_MROUTE=y | ||
| 315 | # CONFIG_IP_PIMSM_V1 is not set | ||
| 316 | # CONFIG_IP_PIMSM_V2 is not set | ||
| 317 | CONFIG_ARPD=y | ||
| 318 | CONFIG_SYN_COOKIES=y | ||
| 319 | # CONFIG_INET_AH is not set | ||
| 320 | # CONFIG_INET_ESP is not set | ||
| 321 | # CONFIG_INET_IPCOMP is not set | ||
| 322 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 323 | # CONFIG_INET_TUNNEL is not set | ||
| 324 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
| 325 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
| 326 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
| 327 | # CONFIG_INET_LRO is not set | ||
| 328 | # CONFIG_INET_DIAG is not set | ||
| 329 | CONFIG_TCP_CONG_ADVANCED=y | ||
| 330 | # CONFIG_TCP_CONG_BIC is not set | ||
| 331 | # CONFIG_TCP_CONG_CUBIC is not set | ||
| 332 | CONFIG_TCP_CONG_WESTWOOD=y | ||
| 333 | # CONFIG_TCP_CONG_HTCP is not set | ||
| 334 | # CONFIG_TCP_CONG_HSTCP is not set | ||
| 335 | # CONFIG_TCP_CONG_HYBLA is not set | ||
| 336 | # CONFIG_TCP_CONG_VEGAS is not set | ||
| 337 | # CONFIG_TCP_CONG_SCALABLE is not set | ||
| 338 | # CONFIG_TCP_CONG_LP is not set | ||
| 339 | # CONFIG_TCP_CONG_VENO is not set | ||
| 340 | # CONFIG_TCP_CONG_YEAH is not set | ||
| 341 | # CONFIG_TCP_CONG_ILLINOIS is not set | ||
| 342 | # CONFIG_DEFAULT_BIC is not set | ||
| 343 | # CONFIG_DEFAULT_CUBIC is not set | ||
| 344 | # CONFIG_DEFAULT_HTCP is not set | ||
| 345 | # CONFIG_DEFAULT_VEGAS is not set | ||
| 346 | CONFIG_DEFAULT_WESTWOOD=y | ||
| 347 | # CONFIG_DEFAULT_RENO is not set | ||
| 348 | CONFIG_DEFAULT_TCP_CONG="westwood" | ||
| 349 | # CONFIG_TCP_MD5SIG is not set | ||
| 350 | # CONFIG_IPV6 is not set | ||
| 351 | # CONFIG_NETWORK_SECMARK is not set | ||
| 352 | CONFIG_NETFILTER=y | ||
| 353 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 354 | CONFIG_NETFILTER_ADVANCED=y | ||
| 355 | # CONFIG_BRIDGE_NETFILTER is not set | ||
| 356 | |||
| 357 | # | ||
| 358 | # Core Netfilter Configuration | ||
| 359 | # | ||
| 360 | # CONFIG_NETFILTER_NETLINK_QUEUE is not set | ||
| 361 | # CONFIG_NETFILTER_NETLINK_LOG is not set | ||
| 362 | CONFIG_NF_CONNTRACK=m | ||
| 363 | # CONFIG_NF_CT_ACCT is not set | ||
| 364 | CONFIG_NF_CONNTRACK_MARK=y | ||
| 365 | # CONFIG_NF_CONNTRACK_EVENTS is not set | ||
| 366 | # CONFIG_NF_CT_PROTO_DCCP is not set | ||
| 367 | # CONFIG_NF_CT_PROTO_SCTP is not set | ||
| 368 | # CONFIG_NF_CT_PROTO_UDPLITE is not set | ||
| 369 | # CONFIG_NF_CONNTRACK_AMANDA is not set | ||
| 370 | CONFIG_NF_CONNTRACK_FTP=m | ||
| 371 | # CONFIG_NF_CONNTRACK_H323 is not set | ||
| 372 | CONFIG_NF_CONNTRACK_IRC=m | ||
| 373 | # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set | ||
| 374 | # CONFIG_NF_CONNTRACK_PPTP is not set | ||
| 375 | # CONFIG_NF_CONNTRACK_SANE is not set | ||
| 376 | # CONFIG_NF_CONNTRACK_SIP is not set | ||
| 377 | CONFIG_NF_CONNTRACK_TFTP=m | ||
| 378 | # CONFIG_NF_CT_NETLINK is not set | ||
| 379 | # CONFIG_NETFILTER_TPROXY is not set | ||
| 380 | CONFIG_NETFILTER_XTABLES=m | ||
| 381 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 382 | # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set | ||
| 383 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 384 | # CONFIG_NETFILTER_XT_TARGET_HL is not set | ||
| 385 | # CONFIG_NETFILTER_XT_TARGET_LED is not set | ||
| 386 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 387 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 388 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 389 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | ||
| 390 | # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set | ||
| 391 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 392 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | ||
| 393 | # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set | ||
| 394 | # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set | ||
| 395 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 396 | # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set | ||
| 397 | # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set | ||
| 398 | # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set | ||
| 399 | # CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set | ||
| 400 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 401 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 402 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 403 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 404 | # CONFIG_NETFILTER_XT_MATCH_HELPER is not set | ||
| 405 | # CONFIG_NETFILTER_XT_MATCH_HL is not set | ||
| 406 | # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set | ||
| 407 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 408 | CONFIG_NETFILTER_XT_MATCH_LIMIT=m | ||
| 409 | CONFIG_NETFILTER_XT_MATCH_MAC=m | ||
| 410 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 411 | CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m | ||
| 412 | # CONFIG_NETFILTER_XT_MATCH_OWNER is not set | ||
| 413 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 414 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 415 | # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set | ||
| 416 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 417 | # CONFIG_NETFILTER_XT_MATCH_RECENT is not set | ||
| 418 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 419 | CONFIG_NETFILTER_XT_MATCH_STATE=m | ||
| 420 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 421 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 422 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 423 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 424 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 425 | # CONFIG_IP_VS is not set | ||
| 426 | |||
| 427 | # | ||
| 428 | # IP: Netfilter Configuration | ||
| 429 | # | ||
| 430 | CONFIG_NF_DEFRAG_IPV4=m | ||
| 431 | CONFIG_NF_CONNTRACK_IPV4=m | ||
| 432 | CONFIG_NF_CONNTRACK_PROC_COMPAT=y | ||
| 433 | # CONFIG_IP_NF_QUEUE is not set | ||
| 434 | CONFIG_IP_NF_IPTABLES=m | ||
| 435 | # CONFIG_IP_NF_MATCH_ADDRTYPE is not set | ||
| 436 | # CONFIG_IP_NF_MATCH_AH is not set | ||
| 437 | # CONFIG_IP_NF_MATCH_ECN is not set | ||
| 438 | # CONFIG_IP_NF_MATCH_TTL is not set | ||
| 439 | CONFIG_IP_NF_FILTER=m | ||
| 440 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 441 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 442 | # CONFIG_IP_NF_TARGET_ULOG is not set | ||
| 443 | CONFIG_NF_NAT=m | ||
| 444 | CONFIG_NF_NAT_NEEDED=y | ||
| 445 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
| 446 | # CONFIG_IP_NF_TARGET_NETMAP is not set | ||
| 447 | # CONFIG_IP_NF_TARGET_REDIRECT is not set | ||
| 448 | # CONFIG_NF_NAT_SNMP_BASIC is not set | ||
| 449 | CONFIG_NF_NAT_FTP=m | ||
| 450 | CONFIG_NF_NAT_IRC=m | ||
| 451 | CONFIG_NF_NAT_TFTP=m | ||
| 452 | # CONFIG_NF_NAT_AMANDA is not set | ||
| 453 | # CONFIG_NF_NAT_PPTP is not set | ||
| 454 | # CONFIG_NF_NAT_H323 is not set | ||
| 455 | # CONFIG_NF_NAT_SIP is not set | ||
| 456 | CONFIG_IP_NF_MANGLE=m | ||
| 457 | # CONFIG_IP_NF_TARGET_CLUSTERIP is not set | ||
| 458 | # CONFIG_IP_NF_TARGET_ECN is not set | ||
| 459 | # CONFIG_IP_NF_TARGET_TTL is not set | ||
| 460 | CONFIG_IP_NF_RAW=m | ||
| 461 | # CONFIG_IP_NF_ARPTABLES is not set | ||
| 462 | # CONFIG_IP_DCCP is not set | ||
| 463 | # CONFIG_IP_SCTP is not set | ||
| 464 | # CONFIG_TIPC is not set | ||
| 465 | CONFIG_ATM=m | ||
| 466 | # CONFIG_ATM_CLIP is not set | ||
| 467 | # CONFIG_ATM_LANE is not set | ||
| 468 | CONFIG_ATM_BR2684=m | ||
| 469 | CONFIG_ATM_BR2684_IPFILTER=y | ||
| 470 | CONFIG_STP=y | ||
| 471 | CONFIG_BRIDGE=y | ||
| 472 | # CONFIG_NET_DSA is not set | ||
| 473 | CONFIG_VLAN_8021Q=y | ||
| 474 | # CONFIG_VLAN_8021Q_GVRP is not set | ||
| 475 | # CONFIG_DECNET is not set | ||
| 476 | CONFIG_LLC=y | ||
| 477 | # CONFIG_LLC2 is not set | ||
| 478 | # CONFIG_IPX is not set | ||
| 479 | # CONFIG_ATALK is not set | ||
| 480 | # CONFIG_X25 is not set | ||
| 481 | # CONFIG_LAPB is not set | ||
| 482 | # CONFIG_ECONET is not set | ||
| 483 | # CONFIG_WAN_ROUTER is not set | ||
| 484 | # CONFIG_PHONET is not set | ||
| 485 | # CONFIG_IEEE802154 is not set | ||
| 486 | CONFIG_NET_SCHED=y | ||
| 487 | |||
| 488 | # | ||
| 489 | # Queueing/Scheduling | ||
| 490 | # | ||
| 491 | # CONFIG_NET_SCH_CBQ is not set | ||
| 492 | # CONFIG_NET_SCH_HTB is not set | ||
| 493 | # CONFIG_NET_SCH_HFSC is not set | ||
| 494 | # CONFIG_NET_SCH_ATM is not set | ||
| 495 | # CONFIG_NET_SCH_PRIO is not set | ||
| 496 | # CONFIG_NET_SCH_MULTIQ is not set | ||
| 497 | # CONFIG_NET_SCH_RED is not set | ||
| 498 | # CONFIG_NET_SCH_SFQ is not set | ||
| 499 | # CONFIG_NET_SCH_TEQL is not set | ||
| 500 | # CONFIG_NET_SCH_TBF is not set | ||
| 501 | # CONFIG_NET_SCH_GRED is not set | ||
| 502 | # CONFIG_NET_SCH_DSMARK is not set | ||
| 503 | # CONFIG_NET_SCH_NETEM is not set | ||
| 504 | # CONFIG_NET_SCH_DRR is not set | ||
| 505 | # CONFIG_NET_SCH_INGRESS is not set | ||
| 506 | |||
| 507 | # | ||
| 508 | # Classification | ||
| 509 | # | ||
| 510 | # CONFIG_NET_CLS_BASIC is not set | ||
| 511 | # CONFIG_NET_CLS_TCINDEX is not set | ||
| 512 | # CONFIG_NET_CLS_ROUTE4 is not set | ||
| 513 | # CONFIG_NET_CLS_FW is not set | ||
| 514 | # CONFIG_NET_CLS_U32 is not set | ||
| 515 | # CONFIG_NET_CLS_RSVP is not set | ||
| 516 | # CONFIG_NET_CLS_RSVP6 is not set | ||
| 517 | # CONFIG_NET_CLS_FLOW is not set | ||
| 518 | # CONFIG_NET_EMATCH is not set | ||
| 519 | CONFIG_NET_CLS_ACT=y | ||
| 520 | CONFIG_NET_ACT_POLICE=y | ||
| 521 | # CONFIG_NET_ACT_GACT is not set | ||
| 522 | # CONFIG_NET_ACT_MIRRED is not set | ||
| 523 | # CONFIG_NET_ACT_IPT is not set | ||
| 524 | # CONFIG_NET_ACT_NAT is not set | ||
| 525 | # CONFIG_NET_ACT_PEDIT is not set | ||
| 526 | # CONFIG_NET_ACT_SIMP is not set | ||
| 527 | # CONFIG_NET_ACT_SKBEDIT is not set | ||
| 528 | CONFIG_NET_SCH_FIFO=y | ||
| 529 | # CONFIG_DCB is not set | ||
| 530 | |||
| 531 | # | ||
| 532 | # Network testing | ||
| 533 | # | ||
| 534 | # CONFIG_NET_PKTGEN is not set | ||
| 535 | CONFIG_HAMRADIO=y | ||
| 536 | |||
| 537 | # | ||
| 538 | # Packet Radio protocols | ||
| 539 | # | ||
| 540 | # CONFIG_AX25 is not set | ||
| 541 | # CONFIG_CAN is not set | ||
| 542 | # CONFIG_IRDA is not set | ||
| 543 | # CONFIG_BT is not set | ||
| 544 | # CONFIG_AF_RXRPC is not set | ||
| 545 | CONFIG_FIB_RULES=y | ||
| 546 | CONFIG_WIRELESS=y | ||
| 547 | CONFIG_CFG80211=m | ||
| 548 | # CONFIG_CFG80211_REG_DEBUG is not set | ||
| 549 | # CONFIG_CFG80211_DEBUGFS is not set | ||
| 550 | # CONFIG_WIRELESS_OLD_REGULATORY is not set | ||
| 551 | CONFIG_WIRELESS_EXT=y | ||
| 552 | CONFIG_WIRELESS_EXT_SYSFS=y | ||
| 553 | # CONFIG_LIB80211 is not set | ||
| 554 | CONFIG_MAC80211=m | ||
| 555 | CONFIG_MAC80211_DEFAULT_PS=y | ||
| 556 | CONFIG_MAC80211_DEFAULT_PS_VALUE=1 | ||
| 557 | |||
| 558 | # | ||
| 559 | # Rate control algorithm selection | ||
| 560 | # | ||
| 561 | CONFIG_MAC80211_RC_PID=y | ||
| 562 | CONFIG_MAC80211_RC_MINSTREL=y | ||
| 563 | CONFIG_MAC80211_RC_DEFAULT_PID=y | ||
| 564 | # CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set | ||
| 565 | CONFIG_MAC80211_RC_DEFAULT="pid" | ||
| 566 | # CONFIG_MAC80211_MESH is not set | ||
| 567 | # CONFIG_MAC80211_LEDS is not set | ||
| 568 | # CONFIG_MAC80211_DEBUGFS is not set | ||
| 569 | # CONFIG_MAC80211_DEBUG_MENU is not set | ||
| 570 | # CONFIG_WIMAX is not set | ||
| 571 | # CONFIG_RFKILL is not set | ||
| 572 | # CONFIG_NET_9P is not set | ||
| 573 | |||
| 574 | # | ||
| 575 | # Device Drivers | ||
| 576 | # | ||
| 577 | |||
| 578 | # | ||
| 579 | # Generic Driver Options | ||
| 580 | # | ||
| 581 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 582 | CONFIG_STANDALONE=y | ||
| 583 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 584 | CONFIG_FW_LOADER=y | ||
| 585 | # CONFIG_FIRMWARE_IN_KERNEL is not set | ||
| 586 | CONFIG_EXTRA_FIRMWARE="" | ||
| 587 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 588 | # CONFIG_CONNECTOR is not set | ||
| 589 | CONFIG_MTD=y | ||
| 590 | # CONFIG_MTD_DEBUG is not set | ||
| 591 | # CONFIG_MTD_CONCAT is not set | ||
| 592 | CONFIG_MTD_PARTITIONS=y | ||
| 593 | # CONFIG_MTD_TESTS is not set | ||
| 594 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 595 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
| 596 | # CONFIG_MTD_AR7_PARTS is not set | ||
| 597 | |||
| 598 | # | ||
| 599 | # User Modules And Translation Layers | ||
| 600 | # | ||
| 601 | CONFIG_MTD_CHAR=y | ||
| 602 | CONFIG_MTD_BLKDEVS=y | ||
| 603 | CONFIG_MTD_BLOCK=y | ||
| 604 | # CONFIG_FTL is not set | ||
| 605 | # CONFIG_NFTL is not set | ||
| 606 | # CONFIG_INFTL is not set | ||
| 607 | # CONFIG_RFD_FTL is not set | ||
| 608 | # CONFIG_SSFDC is not set | ||
| 609 | # CONFIG_MTD_OOPS is not set | ||
| 610 | |||
| 611 | # | ||
| 612 | # RAM/ROM/Flash chip drivers | ||
| 613 | # | ||
| 614 | CONFIG_MTD_CFI=y | ||
| 615 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 616 | CONFIG_MTD_GEN_PROBE=y | ||
| 617 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
| 618 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 619 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 620 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 621 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 622 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 623 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 624 | CONFIG_MTD_CFI_I1=y | ||
| 625 | CONFIG_MTD_CFI_I2=y | ||
| 626 | # CONFIG_MTD_CFI_I4 is not set | ||
| 627 | # CONFIG_MTD_CFI_I8 is not set | ||
| 628 | CONFIG_MTD_CFI_INTELEXT=y | ||
| 629 | CONFIG_MTD_CFI_AMDSTD=y | ||
| 630 | CONFIG_MTD_CFI_STAA=y | ||
| 631 | CONFIG_MTD_CFI_UTIL=y | ||
| 632 | # CONFIG_MTD_RAM is not set | ||
| 633 | # CONFIG_MTD_ROM is not set | ||
| 634 | # CONFIG_MTD_ABSENT is not set | ||
| 635 | |||
| 636 | # | ||
| 637 | # Mapping drivers for chip access | ||
| 638 | # | ||
| 639 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
| 640 | CONFIG_MTD_PHYSMAP=y | ||
| 641 | # CONFIG_MTD_PHYSMAP_COMPAT is not set | ||
| 642 | # CONFIG_MTD_PLATRAM is not set | ||
| 643 | |||
| 644 | # | ||
| 645 | # Self-contained MTD device drivers | ||
| 646 | # | ||
| 647 | # CONFIG_MTD_SLRAM is not set | ||
| 648 | # CONFIG_MTD_PHRAM is not set | ||
| 649 | # CONFIG_MTD_MTDRAM is not set | ||
| 650 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 651 | |||
| 652 | # | ||
| 653 | # Disk-On-Chip Device Drivers | ||
| 654 | # | ||
| 655 | # CONFIG_MTD_DOC2000 is not set | ||
| 656 | # CONFIG_MTD_DOC2001 is not set | ||
| 657 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 658 | # CONFIG_MTD_NAND is not set | ||
| 659 | # CONFIG_MTD_ONENAND is not set | ||
| 660 | |||
| 661 | # | ||
| 662 | # LPDDR flash memory drivers | ||
| 663 | # | ||
| 664 | # CONFIG_MTD_LPDDR is not set | ||
| 665 | |||
| 666 | # | ||
| 667 | # UBI - Unsorted block images | ||
| 668 | # | ||
| 669 | # CONFIG_MTD_UBI is not set | ||
| 670 | # CONFIG_PARPORT is not set | ||
| 671 | CONFIG_BLK_DEV=y | ||
| 672 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 673 | # CONFIG_BLK_DEV_LOOP is not set | ||
| 674 | # CONFIG_BLK_DEV_NBD is not set | ||
| 675 | # CONFIG_BLK_DEV_RAM is not set | ||
| 676 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 677 | # CONFIG_ATA_OVER_ETH is not set | ||
| 678 | # CONFIG_BLK_DEV_HD is not set | ||
| 679 | CONFIG_MISC_DEVICES=y | ||
| 680 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
| 681 | # CONFIG_C2PORT is not set | ||
| 682 | |||
| 683 | # | ||
| 684 | # EEPROM support | ||
| 685 | # | ||
| 686 | # CONFIG_EEPROM_93CX6 is not set | ||
| 687 | CONFIG_HAVE_IDE=y | ||
| 688 | # CONFIG_IDE is not set | ||
| 689 | |||
| 690 | # | ||
| 691 | # SCSI device support | ||
| 692 | # | ||
| 693 | # CONFIG_RAID_ATTRS is not set | ||
| 694 | # CONFIG_SCSI is not set | ||
| 695 | # CONFIG_SCSI_DMA is not set | ||
| 696 | # CONFIG_SCSI_NETLINK is not set | ||
| 697 | # CONFIG_ATA is not set | ||
| 698 | # CONFIG_MD is not set | ||
| 699 | CONFIG_NETDEVICES=y | ||
| 700 | # CONFIG_IFB is not set | ||
| 701 | # CONFIG_DUMMY is not set | ||
| 702 | # CONFIG_BONDING is not set | ||
| 703 | # CONFIG_MACVLAN is not set | ||
| 704 | # CONFIG_EQUALIZER is not set | ||
| 705 | # CONFIG_TUN is not set | ||
| 706 | # CONFIG_VETH is not set | ||
| 707 | CONFIG_PHYLIB=y | ||
| 708 | |||
| 709 | # | ||
| 710 | # MII PHY device drivers | ||
| 711 | # | ||
| 712 | # CONFIG_MARVELL_PHY is not set | ||
| 713 | # CONFIG_DAVICOM_PHY is not set | ||
| 714 | # CONFIG_QSEMI_PHY is not set | ||
| 715 | # CONFIG_LXT_PHY is not set | ||
| 716 | # CONFIG_CICADA_PHY is not set | ||
| 717 | # CONFIG_VITESSE_PHY is not set | ||
| 718 | # CONFIG_SMSC_PHY is not set | ||
| 719 | # CONFIG_BROADCOM_PHY is not set | ||
| 720 | # CONFIG_ICPLUS_PHY is not set | ||
| 721 | # CONFIG_REALTEK_PHY is not set | ||
| 722 | # CONFIG_NATIONAL_PHY is not set | ||
| 723 | # CONFIG_STE10XP is not set | ||
| 724 | # CONFIG_LSI_ET1011C_PHY is not set | ||
| 725 | CONFIG_FIXED_PHY=y | ||
| 726 | # CONFIG_MDIO_BITBANG is not set | ||
| 727 | CONFIG_NET_ETHERNET=y | ||
| 728 | CONFIG_MII=y | ||
| 729 | # CONFIG_AX88796 is not set | ||
| 730 | # CONFIG_SMC91X is not set | ||
| 731 | # CONFIG_DM9000 is not set | ||
| 732 | # CONFIG_ETHOC is not set | ||
| 733 | # CONFIG_DNET is not set | ||
| 734 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 735 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 736 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 737 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 738 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
| 739 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
| 740 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
| 741 | # CONFIG_B44 is not set | ||
| 742 | # CONFIG_KS8842 is not set | ||
| 743 | CONFIG_CPMAC=y | ||
| 744 | # CONFIG_NETDEV_1000 is not set | ||
| 745 | # CONFIG_NETDEV_10000 is not set | ||
| 746 | |||
| 747 | # | ||
| 748 | # Wireless LAN | ||
| 749 | # | ||
| 750 | # CONFIG_WLAN_PRE80211 is not set | ||
| 751 | CONFIG_WLAN_80211=y | ||
| 752 | # CONFIG_LIBERTAS is not set | ||
| 753 | # CONFIG_LIBERTAS_THINFIRM is not set | ||
| 754 | # CONFIG_MAC80211_HWSIM is not set | ||
| 755 | # CONFIG_P54_COMMON is not set | ||
| 756 | # CONFIG_HOSTAP is not set | ||
| 757 | # CONFIG_B43 is not set | ||
| 758 | # CONFIG_B43LEGACY is not set | ||
| 759 | # CONFIG_RT2X00 is not set | ||
| 760 | |||
| 761 | # | ||
| 762 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
| 763 | # | ||
| 764 | # CONFIG_WAN is not set | ||
| 765 | CONFIG_ATM_DRIVERS=y | ||
| 766 | # CONFIG_ATM_DUMMY is not set | ||
| 767 | # CONFIG_ATM_TCP is not set | ||
| 768 | CONFIG_PPP=m | ||
| 769 | CONFIG_PPP_MULTILINK=y | ||
| 770 | CONFIG_PPP_FILTER=y | ||
| 771 | CONFIG_PPP_ASYNC=m | ||
| 772 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 773 | # CONFIG_PPP_DEFLATE is not set | ||
| 774 | # CONFIG_PPP_BSDCOMP is not set | ||
| 775 | # CONFIG_PPP_MPPE is not set | ||
| 776 | CONFIG_PPPOE=m | ||
| 777 | CONFIG_PPPOATM=m | ||
| 778 | # CONFIG_PPPOL2TP is not set | ||
| 779 | # CONFIG_SLIP is not set | ||
| 780 | CONFIG_SLHC=m | ||
| 781 | # CONFIG_NETCONSOLE is not set | ||
| 782 | # CONFIG_NETPOLL is not set | ||
| 783 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 784 | # CONFIG_ISDN is not set | ||
| 785 | # CONFIG_PHONE is not set | ||
| 786 | |||
| 787 | # | ||
| 788 | # Input device support | ||
| 789 | # | ||
| 790 | # CONFIG_INPUT is not set | ||
| 791 | |||
| 792 | # | ||
| 793 | # Hardware I/O ports | ||
| 794 | # | ||
| 795 | # CONFIG_SERIO is not set | ||
| 796 | # CONFIG_GAMEPORT is not set | ||
| 797 | |||
| 798 | # | ||
| 799 | # Character devices | ||
| 800 | # | ||
| 801 | # CONFIG_VT is not set | ||
| 802 | # CONFIG_DEVKMEM is not set | ||
| 803 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 804 | |||
| 805 | # | ||
| 806 | # Serial drivers | ||
| 807 | # | ||
| 808 | CONFIG_SERIAL_8250=y | ||
| 809 | CONFIG_SERIAL_8250_CONSOLE=y | ||
| 810 | CONFIG_SERIAL_8250_NR_UARTS=2 | ||
| 811 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | ||
| 812 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 813 | |||
| 814 | # | ||
| 815 | # Non-8250 serial port support | ||
| 816 | # | ||
| 817 | CONFIG_SERIAL_CORE=y | ||
| 818 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 819 | CONFIG_UNIX98_PTYS=y | ||
| 820 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
| 821 | # CONFIG_LEGACY_PTYS is not set | ||
| 822 | # CONFIG_IPMI_HANDLER is not set | ||
| 823 | CONFIG_HW_RANDOM=y | ||
| 824 | # CONFIG_HW_RANDOM_TIMERIOMEM is not set | ||
| 825 | # CONFIG_R3964 is not set | ||
| 826 | # CONFIG_RAW_DRIVER is not set | ||
| 827 | # CONFIG_TCG_TPM is not set | ||
| 828 | # CONFIG_I2C is not set | ||
| 829 | # CONFIG_SPI is not set | ||
| 830 | # CONFIG_W1 is not set | ||
| 831 | # CONFIG_POWER_SUPPLY is not set | ||
| 832 | # CONFIG_HWMON is not set | ||
| 833 | # CONFIG_THERMAL is not set | ||
| 834 | # CONFIG_THERMAL_HWMON is not set | ||
| 835 | CONFIG_WATCHDOG=y | ||
| 836 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
| 837 | |||
| 838 | # | ||
| 839 | # Watchdog Device Drivers | ||
| 840 | # | ||
| 841 | # CONFIG_SOFT_WATCHDOG is not set | ||
| 842 | CONFIG_AR7_WDT=y | ||
| 843 | CONFIG_SSB_POSSIBLE=y | ||
| 844 | |||
| 845 | # | ||
| 846 | # Sonics Silicon Backplane | ||
| 847 | # | ||
| 848 | CONFIG_SSB=y | ||
| 849 | # CONFIG_SSB_SILENT is not set | ||
| 850 | # CONFIG_SSB_DEBUG is not set | ||
| 851 | CONFIG_SSB_SERIAL=y | ||
| 852 | CONFIG_SSB_DRIVER_MIPS=y | ||
| 853 | CONFIG_SSB_EMBEDDED=y | ||
| 854 | CONFIG_SSB_DRIVER_EXTIF=y | ||
| 855 | |||
| 856 | # | ||
| 857 | # Multifunction device drivers | ||
| 858 | # | ||
| 859 | # CONFIG_MFD_CORE is not set | ||
| 860 | # CONFIG_MFD_SM501 is not set | ||
| 861 | # CONFIG_HTC_PASIC3 is not set | ||
| 862 | # CONFIG_MFD_TMIO is not set | ||
| 863 | # CONFIG_REGULATOR is not set | ||
| 864 | # CONFIG_MEDIA_SUPPORT is not set | ||
| 865 | |||
| 866 | # | ||
| 867 | # Graphics support | ||
| 868 | # | ||
| 869 | # CONFIG_VGASTATE is not set | ||
| 870 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
| 871 | # CONFIG_FB is not set | ||
| 872 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 873 | |||
| 874 | # | ||
| 875 | # Display device support | ||
| 876 | # | ||
| 877 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 878 | # CONFIG_SOUND is not set | ||
| 879 | # CONFIG_USB_SUPPORT is not set | ||
| 880 | # CONFIG_MMC is not set | ||
| 881 | # CONFIG_MEMSTICK is not set | ||
| 882 | CONFIG_NEW_LEDS=y | ||
| 883 | CONFIG_LEDS_CLASS=y | ||
| 884 | |||
| 885 | # | ||
| 886 | # LED drivers | ||
| 887 | # | ||
| 888 | # CONFIG_LEDS_GPIO is not set | ||
| 889 | |||
| 890 | # | ||
| 891 | # LED Triggers | ||
| 892 | # | ||
| 893 | CONFIG_LEDS_TRIGGERS=y | ||
| 894 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 895 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
| 896 | # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set | ||
| 897 | CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | ||
| 898 | |||
| 899 | # | ||
| 900 | # iptables trigger is under Netfilter config (LED target) | ||
| 901 | # | ||
| 902 | # CONFIG_ACCESSIBILITY is not set | ||
| 903 | CONFIG_RTC_LIB=y | ||
| 904 | # CONFIG_RTC_CLASS is not set | ||
| 905 | # CONFIG_DMADEVICES is not set | ||
| 906 | # CONFIG_AUXDISPLAY is not set | ||
| 907 | # CONFIG_UIO is not set | ||
| 908 | |||
| 909 | # | ||
| 910 | # TI VLYNQ | ||
| 911 | # | ||
| 912 | CONFIG_VLYNQ=y | ||
| 913 | # CONFIG_STAGING is not set | ||
| 914 | |||
| 915 | # | ||
| 916 | # File systems | ||
| 917 | # | ||
| 918 | # CONFIG_EXT2_FS is not set | ||
| 919 | # CONFIG_EXT3_FS is not set | ||
| 920 | # CONFIG_EXT4_FS is not set | ||
| 921 | # CONFIG_REISERFS_FS is not set | ||
| 922 | # CONFIG_JFS_FS is not set | ||
| 923 | # CONFIG_FS_POSIX_ACL is not set | ||
| 924 | # CONFIG_XFS_FS is not set | ||
| 925 | # CONFIG_OCFS2_FS is not set | ||
| 926 | # CONFIG_BTRFS_FS is not set | ||
| 927 | CONFIG_FILE_LOCKING=y | ||
| 928 | CONFIG_FSNOTIFY=y | ||
| 929 | # CONFIG_DNOTIFY is not set | ||
| 930 | # CONFIG_INOTIFY is not set | ||
| 931 | CONFIG_INOTIFY_USER=y | ||
| 932 | # CONFIG_QUOTA is not set | ||
| 933 | # CONFIG_AUTOFS_FS is not set | ||
| 934 | # CONFIG_AUTOFS4_FS is not set | ||
| 935 | # CONFIG_FUSE_FS is not set | ||
| 936 | |||
| 937 | # | ||
| 938 | # Caches | ||
| 939 | # | ||
| 940 | # CONFIG_FSCACHE is not set | ||
| 941 | |||
| 942 | # | ||
| 943 | # CD-ROM/DVD Filesystems | ||
| 944 | # | ||
| 945 | # CONFIG_ISO9660_FS is not set | ||
| 946 | # CONFIG_UDF_FS is not set | ||
| 947 | |||
| 948 | # | ||
| 949 | # DOS/FAT/NT Filesystems | ||
| 950 | # | ||
| 951 | # CONFIG_MSDOS_FS is not set | ||
| 952 | # CONFIG_VFAT_FS is not set | ||
| 953 | # CONFIG_NTFS_FS is not set | ||
| 954 | |||
| 955 | # | ||
| 956 | # Pseudo filesystems | ||
| 957 | # | ||
| 958 | CONFIG_PROC_FS=y | ||
| 959 | CONFIG_PROC_KCORE=y | ||
| 960 | CONFIG_PROC_SYSCTL=y | ||
| 961 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
| 962 | CONFIG_SYSFS=y | ||
| 963 | CONFIG_TMPFS=y | ||
| 964 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 965 | # CONFIG_HUGETLB_PAGE is not set | ||
| 966 | # CONFIG_CONFIGFS_FS is not set | ||
| 967 | CONFIG_MISC_FILESYSTEMS=y | ||
| 968 | # CONFIG_ADFS_FS is not set | ||
| 969 | # CONFIG_AFFS_FS is not set | ||
| 970 | # CONFIG_HFS_FS is not set | ||
| 971 | # CONFIG_HFSPLUS_FS is not set | ||
| 972 | # CONFIG_BEFS_FS is not set | ||
| 973 | # CONFIG_BFS_FS is not set | ||
| 974 | # CONFIG_EFS_FS is not set | ||
| 975 | CONFIG_JFFS2_FS=y | ||
| 976 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 977 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 978 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 979 | CONFIG_JFFS2_SUMMARY=y | ||
| 980 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 981 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 982 | CONFIG_JFFS2_ZLIB=y | ||
| 983 | # CONFIG_JFFS2_LZO is not set | ||
| 984 | CONFIG_JFFS2_RTIME=y | ||
| 985 | # CONFIG_JFFS2_RUBIN is not set | ||
| 986 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 987 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 988 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 989 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 990 | # CONFIG_CRAMFS is not set | ||
| 991 | CONFIG_SQUASHFS=y | ||
| 992 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 993 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 994 | # CONFIG_VXFS_FS is not set | ||
| 995 | # CONFIG_MINIX_FS is not set | ||
| 996 | # CONFIG_OMFS_FS is not set | ||
| 997 | # CONFIG_HPFS_FS is not set | ||
| 998 | # CONFIG_QNX4FS_FS is not set | ||
| 999 | # CONFIG_ROMFS_FS is not set | ||
| 1000 | # CONFIG_SYSV_FS is not set | ||
| 1001 | # CONFIG_UFS_FS is not set | ||
| 1002 | # CONFIG_NILFS2_FS is not set | ||
| 1003 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1004 | # CONFIG_NFS_FS is not set | ||
| 1005 | # CONFIG_NFSD is not set | ||
| 1006 | # CONFIG_SMB_FS is not set | ||
| 1007 | # CONFIG_CIFS is not set | ||
| 1008 | # CONFIG_NCP_FS is not set | ||
| 1009 | # CONFIG_CODA_FS is not set | ||
| 1010 | # CONFIG_AFS_FS is not set | ||
| 1011 | |||
| 1012 | # | ||
| 1013 | # Partition Types | ||
| 1014 | # | ||
| 1015 | CONFIG_PARTITION_ADVANCED=y | ||
| 1016 | # CONFIG_ACORN_PARTITION is not set | ||
| 1017 | # CONFIG_OSF_PARTITION is not set | ||
| 1018 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1019 | # CONFIG_ATARI_PARTITION is not set | ||
| 1020 | # CONFIG_MAC_PARTITION is not set | ||
| 1021 | CONFIG_MSDOS_PARTITION=y | ||
| 1022 | CONFIG_BSD_DISKLABEL=y | ||
| 1023 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1024 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1025 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1026 | # CONFIG_LDM_PARTITION is not set | ||
| 1027 | # CONFIG_SGI_PARTITION is not set | ||
| 1028 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1029 | # CONFIG_SUN_PARTITION is not set | ||
| 1030 | # CONFIG_KARMA_PARTITION is not set | ||
| 1031 | # CONFIG_EFI_PARTITION is not set | ||
| 1032 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1033 | # CONFIG_NLS is not set | ||
| 1034 | # CONFIG_DLM is not set | ||
| 1035 | |||
| 1036 | # | ||
| 1037 | # Kernel hacking | ||
| 1038 | # | ||
| 1039 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 1040 | # CONFIG_PRINTK_TIME is not set | ||
| 1041 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1042 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
| 1043 | CONFIG_FRAME_WARN=1024 | ||
| 1044 | # CONFIG_MAGIC_SYSRQ is not set | ||
| 1045 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1046 | CONFIG_DEBUG_FS=y | ||
| 1047 | # CONFIG_HEADERS_CHECK is not set | ||
| 1048 | # CONFIG_DEBUG_KERNEL is not set | ||
| 1049 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
| 1050 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 1051 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 1052 | CONFIG_TRACING_SUPPORT=y | ||
| 1053 | # CONFIG_FTRACE is not set | ||
| 1054 | # CONFIG_DYNAMIC_DEBUG is not set | ||
| 1055 | # CONFIG_SAMPLES is not set | ||
| 1056 | CONFIG_HAVE_ARCH_KGDB=y | ||
| 1057 | CONFIG_CMDLINE="rootfstype=squashfs,jffs2" | ||
| 1058 | |||
| 1059 | # | ||
| 1060 | # Security options | ||
| 1061 | # | ||
| 1062 | # CONFIG_KEYS is not set | ||
| 1063 | # CONFIG_SECURITY is not set | ||
| 1064 | # CONFIG_SECURITYFS is not set | ||
| 1065 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1066 | CONFIG_CRYPTO=y | ||
| 1067 | |||
| 1068 | # | ||
| 1069 | # Crypto core or helper | ||
| 1070 | # | ||
| 1071 | # CONFIG_CRYPTO_FIPS is not set | ||
| 1072 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1073 | CONFIG_CRYPTO_ALGAPI2=m | ||
| 1074 | CONFIG_CRYPTO_AEAD2=m | ||
| 1075 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1076 | CONFIG_CRYPTO_BLKCIPHER2=m | ||
| 1077 | CONFIG_CRYPTO_HASH2=m | ||
| 1078 | CONFIG_CRYPTO_RNG2=m | ||
| 1079 | CONFIG_CRYPTO_PCOMP=m | ||
| 1080 | CONFIG_CRYPTO_MANAGER=m | ||
| 1081 | CONFIG_CRYPTO_MANAGER2=m | ||
| 1082 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1083 | # CONFIG_CRYPTO_NULL is not set | ||
| 1084 | CONFIG_CRYPTO_WORKQUEUE=m | ||
| 1085 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1086 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1087 | # CONFIG_CRYPTO_TEST is not set | ||
| 1088 | |||
| 1089 | # | ||
| 1090 | # Authenticated Encryption with Associated Data | ||
| 1091 | # | ||
| 1092 | # CONFIG_CRYPTO_CCM is not set | ||
| 1093 | # CONFIG_CRYPTO_GCM is not set | ||
| 1094 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 1095 | |||
| 1096 | # | ||
| 1097 | # Block modes | ||
| 1098 | # | ||
| 1099 | # CONFIG_CRYPTO_CBC is not set | ||
| 1100 | # CONFIG_CRYPTO_CTR is not set | ||
| 1101 | # CONFIG_CRYPTO_CTS is not set | ||
| 1102 | CONFIG_CRYPTO_ECB=m | ||
| 1103 | # CONFIG_CRYPTO_LRW is not set | ||
| 1104 | # CONFIG_CRYPTO_PCBC is not set | ||
| 1105 | # CONFIG_CRYPTO_XTS is not set | ||
| 1106 | |||
| 1107 | # | ||
| 1108 | # Hash modes | ||
| 1109 | # | ||
| 1110 | # CONFIG_CRYPTO_HMAC is not set | ||
| 1111 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1112 | |||
| 1113 | # | ||
| 1114 | # Digest | ||
| 1115 | # | ||
| 1116 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 1117 | # CONFIG_CRYPTO_MD4 is not set | ||
| 1118 | # CONFIG_CRYPTO_MD5 is not set | ||
| 1119 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 1120 | # CONFIG_CRYPTO_RMD128 is not set | ||
| 1121 | # CONFIG_CRYPTO_RMD160 is not set | ||
| 1122 | # CONFIG_CRYPTO_RMD256 is not set | ||
| 1123 | # CONFIG_CRYPTO_RMD320 is not set | ||
| 1124 | # CONFIG_CRYPTO_SHA1 is not set | ||
| 1125 | # CONFIG_CRYPTO_SHA256 is not set | ||
| 1126 | # CONFIG_CRYPTO_SHA512 is not set | ||
| 1127 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1128 | # CONFIG_CRYPTO_WP512 is not set | ||
| 1129 | |||
| 1130 | # | ||
| 1131 | # Ciphers | ||
| 1132 | # | ||
| 1133 | CONFIG_CRYPTO_AES=m | ||
| 1134 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 1135 | CONFIG_CRYPTO_ARC4=m | ||
| 1136 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 1137 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1138 | # CONFIG_CRYPTO_CAST5 is not set | ||
| 1139 | # CONFIG_CRYPTO_CAST6 is not set | ||
| 1140 | # CONFIG_CRYPTO_DES is not set | ||
| 1141 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1142 | # CONFIG_CRYPTO_KHAZAD is not set | ||
| 1143 | # CONFIG_CRYPTO_SALSA20 is not set | ||
| 1144 | # CONFIG_CRYPTO_SEED is not set | ||
| 1145 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 1146 | # CONFIG_CRYPTO_TEA is not set | ||
| 1147 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 1148 | |||
| 1149 | # | ||
| 1150 | # Compression | ||
| 1151 | # | ||
| 1152 | # CONFIG_CRYPTO_DEFLATE is not set | ||
| 1153 | # CONFIG_CRYPTO_ZLIB is not set | ||
| 1154 | # CONFIG_CRYPTO_LZO is not set | ||
| 1155 | |||
| 1156 | # | ||
| 1157 | # Random Number Generation | ||
| 1158 | # | ||
| 1159 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
| 1160 | # CONFIG_CRYPTO_HW is not set | ||
| 1161 | # CONFIG_BINARY_PRINTF is not set | ||
| 1162 | |||
| 1163 | # | ||
| 1164 | # Library routines | ||
| 1165 | # | ||
| 1166 | CONFIG_BITREVERSE=y | ||
| 1167 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
| 1168 | CONFIG_CRC_CCITT=m | ||
| 1169 | # CONFIG_CRC16 is not set | ||
| 1170 | # CONFIG_CRC_T10DIF is not set | ||
| 1171 | # CONFIG_CRC_ITU_T is not set | ||
| 1172 | CONFIG_CRC32=y | ||
| 1173 | # CONFIG_CRC7 is not set | ||
| 1174 | # CONFIG_LIBCRC32C is not set | ||
| 1175 | CONFIG_ZLIB_INFLATE=y | ||
| 1176 | CONFIG_ZLIB_DEFLATE=y | ||
| 1177 | CONFIG_DECOMPRESS_GZIP=y | ||
| 1178 | CONFIG_DECOMPRESS_LZMA=y | ||
| 1179 | CONFIG_HAS_IOMEM=y | ||
| 1180 | CONFIG_HAS_IOPORT=y | ||
| 1181 | CONFIG_HAS_DMA=y | ||
| 1182 | CONFIG_NLATTR=y | ||
diff --git a/arch/mips/gt64120/wrppmc/serial.c b/arch/mips/gt64120/wrppmc/serial.c index 5ec1c2ffd3a5..6f9d0858f596 100644 --- a/arch/mips/gt64120/wrppmc/serial.c +++ b/arch/mips/gt64120/wrppmc/serial.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Registration of WRPPMC UART platform device. | 2 | * Registration of WRPPMC UART platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/amon.h b/arch/mips/include/asm/amon.h new file mode 100644 index 000000000000..c3dc1a68dd8d --- /dev/null +++ b/arch/mips/include/asm/amon.h | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | /* | ||
| 2 | * Amon support | ||
| 3 | */ | ||
| 4 | |||
| 5 | int amon_cpu_avail(int); | ||
| 6 | void amon_cpu_start(int, unsigned long, unsigned long, | ||
| 7 | unsigned long, unsigned long); | ||
diff --git a/arch/mips/include/asm/ds1287.h b/arch/mips/include/asm/ds1287.h index ba1702e86931..3af0b8fb3b8c 100644 --- a/arch/mips/include/asm/ds1287.h +++ b/arch/mips/include/asm/ds1287.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DS1287 timer functions. | 2 | * DS1287 timer functions. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/elf.h b/arch/mips/include/asm/elf.h index d58f128aa747..7990694cda22 100644 --- a/arch/mips/include/asm/elf.h +++ b/arch/mips/include/asm/elf.h | |||
| @@ -316,9 +316,13 @@ extern void elf_dump_regs(elf_greg_t *, struct pt_regs *regs); | |||
| 316 | extern int dump_task_regs(struct task_struct *, elf_gregset_t *); | 316 | extern int dump_task_regs(struct task_struct *, elf_gregset_t *); |
| 317 | extern int dump_task_fpu(struct task_struct *, elf_fpregset_t *); | 317 | extern int dump_task_fpu(struct task_struct *, elf_fpregset_t *); |
| 318 | 318 | ||
| 319 | #ifndef ELF_CORE_COPY_REGS | ||
| 319 | #define ELF_CORE_COPY_REGS(elf_regs, regs) \ | 320 | #define ELF_CORE_COPY_REGS(elf_regs, regs) \ |
| 320 | elf_dump_regs((elf_greg_t *)&(elf_regs), regs); | 321 | elf_dump_regs((elf_greg_t *)&(elf_regs), regs); |
| 322 | #endif | ||
| 323 | #ifndef ELF_CORE_COPY_TASK_REGS | ||
| 321 | #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) | 324 | #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) |
| 325 | #endif | ||
| 322 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) \ | 326 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) \ |
| 323 | dump_task_fpu(tsk, elf_fpregs) | 327 | dump_task_fpu(tsk, elf_fpregs) |
| 324 | 328 | ||
diff --git a/arch/mips/include/asm/gcmpregs.h b/arch/mips/include/asm/gcmpregs.h index d74a8a4ca861..36fd969d64d6 100644 --- a/arch/mips/include/asm/gcmpregs.h +++ b/arch/mips/include/asm/gcmpregs.h | |||
| @@ -114,4 +114,6 @@ | |||
| 114 | #define GCMP_CCB_DINTGROUP_OFS 0x0030 /* DINT Group Participate */ | 114 | #define GCMP_CCB_DINTGROUP_OFS 0x0030 /* DINT Group Participate */ |
| 115 | #define GCMP_CCB_DBGGROUP_OFS 0x0100 /* DebugBreak Group */ | 115 | #define GCMP_CCB_DBGGROUP_OFS 0x0100 /* DebugBreak Group */ |
| 116 | 116 | ||
| 117 | extern int __init gcmp_probe(unsigned long, unsigned long); | ||
| 118 | |||
| 117 | #endif /* _ASM_GCMPREGS_H */ | 119 | #endif /* _ASM_GCMPREGS_H */ |
diff --git a/arch/mips/include/asm/gic.h b/arch/mips/include/asm/gic.h index 954807d9d66a..10292e37c1f7 100644 --- a/arch/mips/include/asm/gic.h +++ b/arch/mips/include/asm/gic.h | |||
| @@ -20,7 +20,11 @@ | |||
| 20 | #define GIC_TRIG_EDGE 1 | 20 | #define GIC_TRIG_EDGE 1 |
| 21 | #define GIC_TRIG_LEVEL 0 | 21 | #define GIC_TRIG_LEVEL 0 |
| 22 | 22 | ||
| 23 | #if CONFIG_SMP | ||
| 24 | #define GIC_NUM_INTRS (24 + NR_CPUS * 2) | ||
| 25 | #else | ||
| 23 | #define GIC_NUM_INTRS 32 | 26 | #define GIC_NUM_INTRS 32 |
| 27 | #endif | ||
| 24 | 28 | ||
| 25 | #define MSK(n) ((1 << (n)) - 1) | 29 | #define MSK(n) ((1 << (n)) - 1) |
| 26 | #define REG32(addr) (*(volatile unsigned int *) (addr)) | 30 | #define REG32(addr) (*(volatile unsigned int *) (addr)) |
| @@ -483,5 +487,7 @@ extern void gic_init(unsigned long gic_base_addr, | |||
| 483 | 487 | ||
| 484 | extern unsigned int gic_get_int(void); | 488 | extern unsigned int gic_get_int(void); |
| 485 | extern void gic_send_ipi(unsigned int intr); | 489 | extern void gic_send_ipi(unsigned int intr); |
| 490 | extern unsigned int plat_ipi_call_int_xlate(unsigned int); | ||
| 491 | extern unsigned int plat_ipi_resched_int_xlate(unsigned int); | ||
| 486 | 492 | ||
| 487 | #endif /* _ASM_GICREGS_H */ | 493 | #endif /* _ASM_GICREGS_H */ |
diff --git a/arch/mips/include/asm/irq_gt641xx.h b/arch/mips/include/asm/irq_gt641xx.h index f9a7c3ac2e66..250a2407b599 100644 --- a/arch/mips/include/asm/irq_gt641xx.h +++ b/arch/mips/include/asm/irq_gt641xx.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Galileo/Marvell GT641xx IRQ definitions. | 2 | * Galileo/Marvell GT641xx IRQ definitions. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/mach-ar7/ar7.h b/arch/mips/include/asm/mach-ar7/ar7.h new file mode 100644 index 000000000000..de71694614de --- /dev/null +++ b/arch/mips/include/asm/mach-ar7/ar7.h | |||
| @@ -0,0 +1,178 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2006,2007 Felix Fietkau <nbd@openwrt.org> | ||
| 3 | * Copyright (C) 2006,2007 Eugene Konev <ejka@openwrt.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef __AR7_H__ | ||
| 21 | #define __AR7_H__ | ||
| 22 | |||
| 23 | #include <linux/delay.h> | ||
| 24 | #include <linux/io.h> | ||
| 25 | #include <linux/errno.h> | ||
| 26 | |||
| 27 | #include <asm/addrspace.h> | ||
| 28 | |||
| 29 | #define AR7_SDRAM_BASE 0x14000000 | ||
| 30 | |||
| 31 | #define AR7_REGS_BASE 0x08610000 | ||
| 32 | |||
| 33 | #define AR7_REGS_MAC0 (AR7_REGS_BASE + 0x0000) | ||
| 34 | #define AR7_REGS_GPIO (AR7_REGS_BASE + 0x0900) | ||
| 35 | /* 0x08610A00 - 0x08610BFF (512 bytes, 128 bytes / clock) */ | ||
| 36 | #define AR7_REGS_POWER (AR7_REGS_BASE + 0x0a00) | ||
| 37 | #define AR7_REGS_CLOCKS (AR7_REGS_POWER + 0x80) | ||
| 38 | #define UR8_REGS_CLOCKS (AR7_REGS_POWER + 0x20) | ||
| 39 | #define AR7_REGS_UART0 (AR7_REGS_BASE + 0x0e00) | ||
| 40 | #define AR7_REGS_USB (AR7_REGS_BASE + 0x1200) | ||
| 41 | #define AR7_REGS_RESET (AR7_REGS_BASE + 0x1600) | ||
| 42 | #define AR7_REGS_VLYNQ0 (AR7_REGS_BASE + 0x1800) | ||
| 43 | #define AR7_REGS_DCL (AR7_REGS_BASE + 0x1a00) | ||
| 44 | #define AR7_REGS_VLYNQ1 (AR7_REGS_BASE + 0x1c00) | ||
| 45 | #define AR7_REGS_MDIO (AR7_REGS_BASE + 0x1e00) | ||
| 46 | #define AR7_REGS_IRQ (AR7_REGS_BASE + 0x2400) | ||
| 47 | #define AR7_REGS_MAC1 (AR7_REGS_BASE + 0x2800) | ||
| 48 | |||
| 49 | #define AR7_REGS_WDT (AR7_REGS_BASE + 0x1f00) | ||
| 50 | #define UR8_REGS_WDT (AR7_REGS_BASE + 0x0b00) | ||
| 51 | #define UR8_REGS_UART1 (AR7_REGS_BASE + 0x0f00) | ||
| 52 | |||
| 53 | #define AR7_RESET_PEREPHERIAL 0x0 | ||
| 54 | #define AR7_RESET_SOFTWARE 0x4 | ||
| 55 | #define AR7_RESET_STATUS 0x8 | ||
| 56 | |||
| 57 | #define AR7_RESET_BIT_CPMAC_LO 17 | ||
| 58 | #define AR7_RESET_BIT_CPMAC_HI 21 | ||
| 59 | #define AR7_RESET_BIT_MDIO 22 | ||
| 60 | #define AR7_RESET_BIT_EPHY 26 | ||
| 61 | |||
| 62 | /* GPIO control registers */ | ||
| 63 | #define AR7_GPIO_INPUT 0x0 | ||
| 64 | #define AR7_GPIO_OUTPUT 0x4 | ||
| 65 | #define AR7_GPIO_DIR 0x8 | ||
| 66 | #define AR7_GPIO_ENABLE 0xc | ||
| 67 | |||
| 68 | #define AR7_CHIP_7100 0x18 | ||
| 69 | #define AR7_CHIP_7200 0x2b | ||
| 70 | #define AR7_CHIP_7300 0x05 | ||
| 71 | |||
| 72 | /* Interrupts */ | ||
| 73 | #define AR7_IRQ_UART0 15 | ||
| 74 | #define AR7_IRQ_UART1 16 | ||
| 75 | |||
| 76 | /* Clocks */ | ||
| 77 | #define AR7_AFE_CLOCK 35328000 | ||
| 78 | #define AR7_REF_CLOCK 25000000 | ||
| 79 | #define AR7_XTAL_CLOCK 24000000 | ||
| 80 | |||
| 81 | struct plat_cpmac_data { | ||
| 82 | int reset_bit; | ||
| 83 | int power_bit; | ||
| 84 | u32 phy_mask; | ||
| 85 | char dev_addr[6]; | ||
| 86 | }; | ||
| 87 | |||
| 88 | struct plat_dsl_data { | ||
| 89 | int reset_bit_dsl; | ||
| 90 | int reset_bit_sar; | ||
| 91 | }; | ||
| 92 | |||
| 93 | extern int ar7_cpu_clock, ar7_bus_clock, ar7_dsp_clock; | ||
| 94 | |||
| 95 | static inline u16 ar7_chip_id(void) | ||
| 96 | { | ||
| 97 | return readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x14)) & 0xffff; | ||
| 98 | } | ||
| 99 | |||
| 100 | static inline u8 ar7_chip_rev(void) | ||
| 101 | { | ||
| 102 | return (readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x14)) >> 16) & 0xff; | ||
| 103 | } | ||
| 104 | |||
| 105 | static inline int ar7_cpu_freq(void) | ||
| 106 | { | ||
| 107 | return ar7_cpu_clock; | ||
| 108 | } | ||
| 109 | |||
| 110 | static inline int ar7_bus_freq(void) | ||
| 111 | { | ||
| 112 | return ar7_bus_clock; | ||
| 113 | } | ||
| 114 | |||
| 115 | static inline int ar7_vbus_freq(void) | ||
| 116 | { | ||
| 117 | return ar7_bus_clock / 2; | ||
| 118 | } | ||
| 119 | #define ar7_cpmac_freq ar7_vbus_freq | ||
| 120 | |||
| 121 | static inline int ar7_dsp_freq(void) | ||
| 122 | { | ||
| 123 | return ar7_dsp_clock; | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline int ar7_has_high_cpmac(void) | ||
| 127 | { | ||
| 128 | u16 chip_id = ar7_chip_id(); | ||
| 129 | switch (chip_id) { | ||
| 130 | case AR7_CHIP_7100: | ||
| 131 | case AR7_CHIP_7200: | ||
| 132 | return 0; | ||
| 133 | case AR7_CHIP_7300: | ||
| 134 | return 1; | ||
| 135 | default: | ||
| 136 | return -ENXIO; | ||
| 137 | } | ||
| 138 | } | ||
| 139 | #define ar7_has_high_vlynq ar7_has_high_cpmac | ||
| 140 | #define ar7_has_second_uart ar7_has_high_cpmac | ||
| 141 | |||
| 142 | static inline void ar7_device_enable(u32 bit) | ||
| 143 | { | ||
| 144 | void *reset_reg = | ||
| 145 | (void *)KSEG1ADDR(AR7_REGS_RESET + AR7_RESET_PEREPHERIAL); | ||
| 146 | writel(readl(reset_reg) | (1 << bit), reset_reg); | ||
| 147 | msleep(20); | ||
| 148 | } | ||
| 149 | |||
| 150 | static inline void ar7_device_disable(u32 bit) | ||
| 151 | { | ||
| 152 | void *reset_reg = | ||
| 153 | (void *)KSEG1ADDR(AR7_REGS_RESET + AR7_RESET_PEREPHERIAL); | ||
| 154 | writel(readl(reset_reg) & ~(1 << bit), reset_reg); | ||
| 155 | msleep(20); | ||
| 156 | } | ||
| 157 | |||
| 158 | static inline void ar7_device_reset(u32 bit) | ||
| 159 | { | ||
| 160 | ar7_device_disable(bit); | ||
| 161 | ar7_device_enable(bit); | ||
| 162 | } | ||
| 163 | |||
| 164 | static inline void ar7_device_on(u32 bit) | ||
| 165 | { | ||
| 166 | void *power_reg = (void *)KSEG1ADDR(AR7_REGS_POWER); | ||
| 167 | writel(readl(power_reg) | (1 << bit), power_reg); | ||
| 168 | msleep(20); | ||
| 169 | } | ||
| 170 | |||
| 171 | static inline void ar7_device_off(u32 bit) | ||
| 172 | { | ||
| 173 | void *power_reg = (void *)KSEG1ADDR(AR7_REGS_POWER); | ||
| 174 | writel(readl(power_reg) & ~(1 << bit), power_reg); | ||
| 175 | msleep(20); | ||
| 176 | } | ||
| 177 | |||
| 178 | #endif /* __AR7_H__ */ | ||
diff --git a/arch/mips/include/asm/mach-ar7/gpio.h b/arch/mips/include/asm/mach-ar7/gpio.h new file mode 100644 index 000000000000..cbe9c4f126df --- /dev/null +++ b/arch/mips/include/asm/mach-ar7/gpio.h | |||
| @@ -0,0 +1,110 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2007 Florian Fainelli <florian@openwrt.org> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifndef __AR7_GPIO_H__ | ||
| 20 | #define __AR7_GPIO_H__ | ||
| 21 | |||
| 22 | #include <asm/mach-ar7/ar7.h> | ||
| 23 | |||
| 24 | #define AR7_GPIO_MAX 32 | ||
| 25 | |||
| 26 | extern int gpio_request(unsigned gpio, const char *label); | ||
| 27 | extern void gpio_free(unsigned gpio); | ||
| 28 | |||
| 29 | /* Common GPIO layer */ | ||
| 30 | static inline int gpio_get_value(unsigned gpio) | ||
| 31 | { | ||
| 32 | void __iomem *gpio_in = | ||
| 33 | (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_INPUT); | ||
| 34 | |||
| 35 | return readl(gpio_in) & (1 << gpio); | ||
| 36 | } | ||
| 37 | |||
| 38 | static inline void gpio_set_value(unsigned gpio, int value) | ||
| 39 | { | ||
| 40 | void __iomem *gpio_out = | ||
| 41 | (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_OUTPUT); | ||
| 42 | unsigned tmp; | ||
| 43 | |||
| 44 | tmp = readl(gpio_out) & ~(1 << gpio); | ||
| 45 | if (value) | ||
| 46 | tmp |= 1 << gpio; | ||
| 47 | writel(tmp, gpio_out); | ||
| 48 | } | ||
| 49 | |||
| 50 | static inline int gpio_direction_input(unsigned gpio) | ||
| 51 | { | ||
| 52 | void __iomem *gpio_dir = | ||
| 53 | (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_DIR); | ||
| 54 | |||
| 55 | if (gpio >= AR7_GPIO_MAX) | ||
| 56 | return -EINVAL; | ||
| 57 | |||
| 58 | writel(readl(gpio_dir) | (1 << gpio), gpio_dir); | ||
| 59 | |||
| 60 | return 0; | ||
| 61 | } | ||
| 62 | |||
| 63 | static inline int gpio_direction_output(unsigned gpio, int value) | ||
| 64 | { | ||
| 65 | void __iomem *gpio_dir = | ||
| 66 | (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_DIR); | ||
| 67 | |||
| 68 | if (gpio >= AR7_GPIO_MAX) | ||
| 69 | return -EINVAL; | ||
| 70 | |||
| 71 | gpio_set_value(gpio, value); | ||
| 72 | writel(readl(gpio_dir) & ~(1 << gpio), gpio_dir); | ||
| 73 | |||
| 74 | return 0; | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline int gpio_to_irq(unsigned gpio) | ||
| 78 | { | ||
| 79 | return -EINVAL; | ||
| 80 | } | ||
| 81 | |||
| 82 | static inline int irq_to_gpio(unsigned irq) | ||
| 83 | { | ||
| 84 | return -EINVAL; | ||
| 85 | } | ||
| 86 | |||
| 87 | /* Board specific GPIO functions */ | ||
| 88 | static inline int ar7_gpio_enable(unsigned gpio) | ||
| 89 | { | ||
| 90 | void __iomem *gpio_en = | ||
| 91 | (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_ENABLE); | ||
| 92 | |||
| 93 | writel(readl(gpio_en) | (1 << gpio), gpio_en); | ||
| 94 | |||
| 95 | return 0; | ||
| 96 | } | ||
| 97 | |||
| 98 | static inline int ar7_gpio_disable(unsigned gpio) | ||
| 99 | { | ||
| 100 | void __iomem *gpio_en = | ||
| 101 | (void __iomem *)KSEG1ADDR(AR7_REGS_GPIO + AR7_GPIO_ENABLE); | ||
| 102 | |||
| 103 | writel(readl(gpio_en) & ~(1 << gpio), gpio_en); | ||
| 104 | |||
| 105 | return 0; | ||
| 106 | } | ||
| 107 | |||
| 108 | #include <asm-generic/gpio.h> | ||
| 109 | |||
| 110 | #endif | ||
diff --git a/arch/mips/include/asm/mach-ar7/irq.h b/arch/mips/include/asm/mach-ar7/irq.h new file mode 100644 index 000000000000..39e9757e3d93 --- /dev/null +++ b/arch/mips/include/asm/mach-ar7/irq.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Shamelessly copied from asm-mips/mach-emma2rh/ | ||
| 7 | * Copyright (C) 2003 by Ralf Baechle | ||
| 8 | */ | ||
| 9 | #ifndef __ASM_AR7_IRQ_H | ||
| 10 | #define __ASM_AR7_IRQ_H | ||
| 11 | |||
| 12 | #define NR_IRQS 256 | ||
| 13 | |||
| 14 | #include_next <irq.h> | ||
| 15 | |||
| 16 | #endif /* __ASM_AR7_IRQ_H */ | ||
diff --git a/arch/mips/include/asm/mach-ar7/prom.h b/arch/mips/include/asm/mach-ar7/prom.h new file mode 100644 index 000000000000..088f61fe85ea --- /dev/null +++ b/arch/mips/include/asm/mach-ar7/prom.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2006, 2007 Florian Fainelli <florian@openwrt.org> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifndef __PROM_H__ | ||
| 20 | #define __PROM_H__ | ||
| 21 | |||
| 22 | extern char *prom_getenv(const char *name); | ||
| 23 | extern void prom_meminit(void); | ||
| 24 | |||
| 25 | #endif /* __PROM_H__ */ | ||
diff --git a/arch/mips/include/asm/mach-ar7/spaces.h b/arch/mips/include/asm/mach-ar7/spaces.h new file mode 100644 index 000000000000..ac28f273449c --- /dev/null +++ b/arch/mips/include/asm/mach-ar7/spaces.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 1994 - 1999, 2000, 03, 04 Ralf Baechle | ||
| 7 | * Copyright (C) 2000, 2002 Maciej W. Rozycki | ||
| 8 | * Copyright (C) 1990, 1999, 2000 Silicon Graphics, Inc. | ||
| 9 | */ | ||
| 10 | #ifndef _ASM_AR7_SPACES_H | ||
| 11 | #define _ASM_AR7_SPACES_H | ||
| 12 | |||
| 13 | /* | ||
| 14 | * This handles the memory map. | ||
| 15 | * We handle pages at KSEG0 for kernels with 32 bit address space. | ||
| 16 | */ | ||
| 17 | #define PAGE_OFFSET 0x94000000UL | ||
| 18 | #define PHYS_OFFSET 0x14000000UL | ||
| 19 | |||
| 20 | #include <asm/mach-generic/spaces.h> | ||
| 21 | |||
| 22 | #endif /* __ASM_AR7_SPACES_H */ | ||
diff --git a/arch/mips/include/asm/mach-ar7/war.h b/arch/mips/include/asm/mach-ar7/war.h new file mode 100644 index 000000000000..f4862b563080 --- /dev/null +++ b/arch/mips/include/asm/mach-ar7/war.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org> | ||
| 7 | */ | ||
| 8 | #ifndef __ASM_MIPS_MACH_AR7_WAR_H | ||
| 9 | #define __ASM_MIPS_MACH_AR7_WAR_H | ||
| 10 | |||
| 11 | #define R4600_V1_INDEX_ICACHEOP_WAR 0 | ||
| 12 | #define R4600_V1_HIT_CACHEOP_WAR 0 | ||
| 13 | #define R4600_V2_HIT_CACHEOP_WAR 0 | ||
| 14 | #define R5432_CP0_INTERRUPT_WAR 0 | ||
| 15 | #define BCM1250_M3_WAR 0 | ||
| 16 | #define SIBYTE_1956_WAR 0 | ||
| 17 | #define MIPS4K_ICACHE_REFILL_WAR 0 | ||
| 18 | #define MIPS_CACHE_SYNC_WAR 0 | ||
| 19 | #define TX49XX_ICACHE_INDEX_INV_WAR 0 | ||
| 20 | #define RM9000_CDEX_SMP_WAR 0 | ||
| 21 | #define ICACHE_REFILLS_WORKAROUND_WAR 0 | ||
| 22 | #define R10000_LLSC_WAR 0 | ||
| 23 | #define MIPS34K_MISSED_ITLB_WAR 0 | ||
| 24 | |||
| 25 | #endif /* __ASM_MIPS_MACH_AR7_WAR_H */ | ||
diff --git a/arch/mips/include/asm/mach-cobalt/irq.h b/arch/mips/include/asm/mach-cobalt/irq.h index 57c8c9ac5851..9da9acf5dcba 100644 --- a/arch/mips/include/asm/mach-cobalt/irq.h +++ b/arch/mips/include/asm/mach-cobalt/irq.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * Copyright (C) 1997 Cobalt Microserver | 8 | * Copyright (C) 1997 Cobalt Microserver |
| 9 | * Copyright (C) 1997, 2003 Ralf Baechle | 9 | * Copyright (C) 1997, 2003 Ralf Baechle |
| 10 | * Copyright (C) 2001-2003 Liam Davies (ldavies@agile.tv) | 10 | * Copyright (C) 2001-2003 Liam Davies (ldavies@agile.tv) |
| 11 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 11 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 12 | */ | 12 | */ |
| 13 | #ifndef _ASM_COBALT_IRQ_H | 13 | #ifndef _ASM_COBALT_IRQ_H |
| 14 | #define _ASM_COBALT_IRQ_H | 14 | #define _ASM_COBALT_IRQ_H |
diff --git a/arch/mips/include/asm/mach-cobalt/mach-gt64120.h b/arch/mips/include/asm/mach-cobalt/mach-gt64120.h index ae9c5523c7ef..f8afec3f2943 100644 --- a/arch/mips/include/asm/mach-cobalt/mach-gt64120.h +++ b/arch/mips/include/asm/mach-cobalt/mach-gt64120.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2006 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 2 | * Copyright (C) 2006 Yoichi Yuasa <yuasa@linux-mips.org> |
| 3 | * | 3 | * |
| 4 | * This program is free software; you can redistribute it and/or modify | 4 | * This program is free software; you can redistribute it and/or modify |
| 5 | * it under the terms of the GNU General Public License as published by | 5 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cavium-octeon/pci-common.h b/arch/mips/include/asm/octeon/pci-octeon.h index 74ae79991e45..6ac5d3e3398e 100644 --- a/arch/mips/cavium-octeon/pci-common.h +++ b/arch/mips/include/asm/octeon/pci-octeon.h | |||
| @@ -3,23 +3,29 @@ | |||
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2005-2007 Cavium Networks | 6 | * Copyright (C) 2005-2009 Cavium Networks |
| 7 | */ | 7 | */ |
| 8 | #ifndef __OCTEON_PCI_COMMON_H__ | 8 | |
| 9 | #define __OCTEON_PCI_COMMON_H__ | 9 | #ifndef __PCI_OCTEON_H__ |
| 10 | #define __PCI_OCTEON_H__ | ||
| 10 | 11 | ||
| 11 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
| 12 | 13 | ||
| 13 | /* Some PCI cards require delays when accessing config space. */ | 14 | /* Some PCI cards require delays when accessing config space. */ |
| 14 | #define PCI_CONFIG_SPACE_DELAY 10000 | 15 | #define PCI_CONFIG_SPACE_DELAY 10000 |
| 15 | 16 | ||
| 16 | /* pcibios_map_irq() is defined inside pci-common.c. All it does is call the | 17 | /* |
| 17 | Octeon specific version pointed to by this variable. This function needs to | 18 | * pcibios_map_irq() is defined inside pci-octeon.c. All it does is |
| 18 | change for PCI or PCIe based hosts */ | 19 | * call the Octeon specific version pointed to by this variable. This |
| 19 | extern typeof(pcibios_map_irq) *octeon_pcibios_map_irq; | 20 | * function needs to change for PCI or PCIe based hosts. |
| 21 | */ | ||
| 22 | extern int (*octeon_pcibios_map_irq)(const struct pci_dev *dev, | ||
| 23 | u8 slot, u8 pin); | ||
| 20 | 24 | ||
| 21 | /* The following defines are only used when octeon_dma_bar_type = | 25 | /* |
| 22 | OCTEON_DMA_BAR_TYPE_BIG */ | 26 | * The following defines are used when octeon_dma_bar_type = |
| 27 | * OCTEON_DMA_BAR_TYPE_BIG | ||
| 28 | */ | ||
| 23 | #define OCTEON_PCI_BAR1_HOLE_BITS 5 | 29 | #define OCTEON_PCI_BAR1_HOLE_BITS 5 |
| 24 | #define OCTEON_PCI_BAR1_HOLE_SIZE (1ul<<(OCTEON_PCI_BAR1_HOLE_BITS+3)) | 30 | #define OCTEON_PCI_BAR1_HOLE_SIZE (1ul<<(OCTEON_PCI_BAR1_HOLE_BITS+3)) |
| 25 | 31 | ||
| @@ -30,9 +36,9 @@ enum octeon_dma_bar_type { | |||
| 30 | OCTEON_DMA_BAR_TYPE_PCIE | 36 | OCTEON_DMA_BAR_TYPE_PCIE |
| 31 | }; | 37 | }; |
| 32 | 38 | ||
| 33 | /** | 39 | /* |
| 34 | * This is a variable to tell the DMA mapping system in dma-octeon.c | 40 | * This tells the DMA mapping system in dma-octeon.c how to map PCI |
| 35 | * how to map PCI DMA addresses. | 41 | * DMA addresses. |
| 36 | */ | 42 | */ |
| 37 | extern enum octeon_dma_bar_type octeon_dma_bar_type; | 43 | extern enum octeon_dma_bar_type octeon_dma_bar_type; |
| 38 | 44 | ||
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index dc0eaa731281..96a14a426a7c 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h | |||
| @@ -165,7 +165,14 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
| 165 | 165 | ||
| 166 | #ifdef CONFIG_FLATMEM | 166 | #ifdef CONFIG_FLATMEM |
| 167 | 167 | ||
| 168 | #define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr) | 168 | #define pfn_valid(pfn) \ |
| 169 | ({ \ | ||
| 170 | unsigned long __pfn = (pfn); \ | ||
| 171 | /* avoid <linux/bootmem.h> include hell */ \ | ||
| 172 | extern unsigned long min_low_pfn; \ | ||
| 173 | \ | ||
| 174 | __pfn >= min_low_pfn && __pfn < max_mapnr; \ | ||
| 175 | }) | ||
| 169 | 176 | ||
| 170 | #elif defined(CONFIG_SPARSEMEM) | 177 | #elif defined(CONFIG_SPARSEMEM) |
| 171 | 178 | ||
diff --git a/arch/mips/include/asm/reg.h b/arch/mips/include/asm/reg.h index 634b55d7e7f6..910e71a12466 100644 --- a/arch/mips/include/asm/reg.h +++ b/arch/mips/include/asm/reg.h | |||
| @@ -69,7 +69,7 @@ | |||
| 69 | 69 | ||
| 70 | #endif | 70 | #endif |
| 71 | 71 | ||
| 72 | #ifdef CONFIG_64BIT | 72 | #if defined(CONFIG_64BIT) && !defined(WANT_COMPAT_REG_H) |
| 73 | 73 | ||
| 74 | #define EF_R0 0 | 74 | #define EF_R0 0 |
| 75 | #define EF_R1 1 | 75 | #define EF_R1 1 |
diff --git a/arch/mips/include/asm/swab.h b/arch/mips/include/asm/swab.h index 99993c0d6c12..97c2f81b4b43 100644 --- a/arch/mips/include/asm/swab.h +++ b/arch/mips/include/asm/swab.h | |||
| @@ -38,7 +38,11 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | |||
| 38 | } | 38 | } |
| 39 | #define __arch_swab32 __arch_swab32 | 39 | #define __arch_swab32 __arch_swab32 |
| 40 | 40 | ||
| 41 | #ifdef CONFIG_CPU_MIPS64_R2 | 41 | /* |
| 42 | * Having already checked for CONFIG_CPU_MIPSR2, enable the | ||
| 43 | * optimized version for 64-bit kernel on r2 CPUs. | ||
| 44 | */ | ||
| 45 | #ifdef CONFIG_64BIT | ||
| 42 | static inline __attribute_const__ __u64 __arch_swab64(__u64 x) | 46 | static inline __attribute_const__ __u64 __arch_swab64(__u64 x) |
| 43 | { | 47 | { |
| 44 | __asm__( | 48 | __asm__( |
| @@ -50,6 +54,6 @@ static inline __attribute_const__ __u64 __arch_swab64(__u64 x) | |||
| 50 | return x; | 54 | return x; |
| 51 | } | 55 | } |
| 52 | #define __arch_swab64 __arch_swab64 | 56 | #define __arch_swab64 __arch_swab64 |
| 53 | #endif /* CONFIG_CPU_MIPS64_R2 */ | 57 | #endif /* CONFIG_64BIT */ |
| 54 | #endif /* CONFIG_CPU_MIPSR2 */ | 58 | #endif /* CONFIG_CPU_MIPSR2 */ |
| 55 | #endif /* _ASM_SWAB_H */ | 59 | #endif /* _ASM_SWAB_H */ |
diff --git a/arch/mips/include/asm/unistd.h b/arch/mips/include/asm/unistd.h index 40005010827c..b70c49fdda26 100644 --- a/arch/mips/include/asm/unistd.h +++ b/arch/mips/include/asm/unistd.h | |||
| @@ -352,16 +352,18 @@ | |||
| 352 | #define __NR_inotify_init1 (__NR_Linux + 329) | 352 | #define __NR_inotify_init1 (__NR_Linux + 329) |
| 353 | #define __NR_preadv (__NR_Linux + 330) | 353 | #define __NR_preadv (__NR_Linux + 330) |
| 354 | #define __NR_pwritev (__NR_Linux + 331) | 354 | #define __NR_pwritev (__NR_Linux + 331) |
| 355 | #define __NR_rt_tgsigqueueinfo (__NR_Linux + 332) | ||
| 356 | #define __NR_perf_counter_open (__NR_Linux + 333) | ||
| 355 | 357 | ||
| 356 | /* | 358 | /* |
| 357 | * Offset of the last Linux o32 flavoured syscall | 359 | * Offset of the last Linux o32 flavoured syscall |
| 358 | */ | 360 | */ |
| 359 | #define __NR_Linux_syscalls 331 | 361 | #define __NR_Linux_syscalls 333 |
| 360 | 362 | ||
| 361 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | 363 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ |
| 362 | 364 | ||
| 363 | #define __NR_O32_Linux 4000 | 365 | #define __NR_O32_Linux 4000 |
| 364 | #define __NR_O32_Linux_syscalls 331 | 366 | #define __NR_O32_Linux_syscalls 333 |
| 365 | 367 | ||
| 366 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | 368 | #if _MIPS_SIM == _MIPS_SIM_ABI64 |
| 367 | 369 | ||
| @@ -660,16 +662,18 @@ | |||
| 660 | #define __NR_inotify_init1 (__NR_Linux + 288) | 662 | #define __NR_inotify_init1 (__NR_Linux + 288) |
| 661 | #define __NR_preadv (__NR_Linux + 289) | 663 | #define __NR_preadv (__NR_Linux + 289) |
| 662 | #define __NR_pwritev (__NR_Linux + 290) | 664 | #define __NR_pwritev (__NR_Linux + 290) |
| 665 | #define __NR_rt_tgsigqueueinfo (__NR_Linux + 291) | ||
| 666 | #define __NR_perf_counter_open (__NR_Linux + 292) | ||
| 663 | 667 | ||
| 664 | /* | 668 | /* |
| 665 | * Offset of the last Linux 64-bit flavoured syscall | 669 | * Offset of the last Linux 64-bit flavoured syscall |
| 666 | */ | 670 | */ |
| 667 | #define __NR_Linux_syscalls 290 | 671 | #define __NR_Linux_syscalls 292 |
| 668 | 672 | ||
| 669 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 673 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
| 670 | 674 | ||
| 671 | #define __NR_64_Linux 5000 | 675 | #define __NR_64_Linux 5000 |
| 672 | #define __NR_64_Linux_syscalls 290 | 676 | #define __NR_64_Linux_syscalls 292 |
| 673 | 677 | ||
| 674 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 678 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
| 675 | 679 | ||
| @@ -972,16 +976,18 @@ | |||
| 972 | #define __NR_inotify_init1 (__NR_Linux + 292) | 976 | #define __NR_inotify_init1 (__NR_Linux + 292) |
| 973 | #define __NR_preadv (__NR_Linux + 293) | 977 | #define __NR_preadv (__NR_Linux + 293) |
| 974 | #define __NR_pwritev (__NR_Linux + 294) | 978 | #define __NR_pwritev (__NR_Linux + 294) |
| 979 | #define __NR_rt_tgsigqueueinfo (__NR_Linux + 295) | ||
| 980 | #define __NR_perf_counter_open (__NR_Linux + 296) | ||
| 975 | 981 | ||
| 976 | /* | 982 | /* |
| 977 | * Offset of the last N32 flavoured syscall | 983 | * Offset of the last N32 flavoured syscall |
| 978 | */ | 984 | */ |
| 979 | #define __NR_Linux_syscalls 294 | 985 | #define __NR_Linux_syscalls 296 |
| 980 | 986 | ||
| 981 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | 987 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ |
| 982 | 988 | ||
| 983 | #define __NR_N32_Linux 6000 | 989 | #define __NR_N32_Linux 6000 |
| 984 | #define __NR_N32_Linux_syscalls 294 | 990 | #define __NR_N32_Linux_syscalls 296 |
| 985 | 991 | ||
| 986 | #ifdef __KERNEL__ | 992 | #ifdef __KERNEL__ |
| 987 | 993 | ||
diff --git a/arch/mips/include/asm/vr41xx/capcella.h b/arch/mips/include/asm/vr41xx/capcella.h index e0ee05a3dfcc..fcc6569414fa 100644 --- a/arch/mips/include/asm/vr41xx/capcella.h +++ b/arch/mips/include/asm/vr41xx/capcella.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * capcella.h, Include file for ZAO Networks Capcella. | 2 | * capcella.h, Include file for ZAO Networks Capcella. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/vr41xx/giu.h b/arch/mips/include/asm/vr41xx/giu.h index 0bcdd3a5c256..6a90bc1d916b 100644 --- a/arch/mips/include/asm/vr41xx/giu.h +++ b/arch/mips/include/asm/vr41xx/giu.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Include file for NEC VR4100 series General-purpose I/O Unit. | 2 | * Include file for NEC VR4100 series General-purpose I/O Unit. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2005-2009 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
| @@ -41,7 +41,8 @@ typedef enum { | |||
| 41 | IRQ_SIGNAL_HOLD, | 41 | IRQ_SIGNAL_HOLD, |
| 42 | } irq_signal_t; | 42 | } irq_signal_t; |
| 43 | 43 | ||
| 44 | extern void vr41xx_set_irq_trigger(unsigned int pin, irq_trigger_t trigger, irq_signal_t signal); | 44 | extern void vr41xx_set_irq_trigger(unsigned int pin, irq_trigger_t trigger, |
| 45 | irq_signal_t signal); | ||
| 45 | 46 | ||
| 46 | typedef enum { | 47 | typedef enum { |
| 47 | IRQ_LEVEL_LOW, | 48 | IRQ_LEVEL_LOW, |
| @@ -51,23 +52,6 @@ typedef enum { | |||
| 51 | extern void vr41xx_set_irq_level(unsigned int pin, irq_level_t level); | 52 | extern void vr41xx_set_irq_level(unsigned int pin, irq_level_t level); |
| 52 | 53 | ||
| 53 | typedef enum { | 54 | typedef enum { |
| 54 | GPIO_DATA_LOW, | ||
| 55 | GPIO_DATA_HIGH, | ||
| 56 | GPIO_DATA_INVAL, | ||
| 57 | } gpio_data_t; | ||
| 58 | |||
| 59 | extern gpio_data_t vr41xx_gpio_get_pin(unsigned int pin); | ||
| 60 | extern int vr41xx_gpio_set_pin(unsigned int pin, gpio_data_t data); | ||
| 61 | |||
| 62 | typedef enum { | ||
| 63 | GPIO_INPUT, | ||
| 64 | GPIO_OUTPUT, | ||
| 65 | GPIO_OUTPUT_DISABLE, | ||
| 66 | } gpio_direction_t; | ||
| 67 | |||
| 68 | extern int vr41xx_gpio_set_direction(unsigned int pin, gpio_direction_t dir); | ||
| 69 | |||
| 70 | typedef enum { | ||
| 71 | GPIO_PULL_DOWN, | 55 | GPIO_PULL_DOWN, |
| 72 | GPIO_PULL_UP, | 56 | GPIO_PULL_UP, |
| 73 | GPIO_PULL_DISABLE, | 57 | GPIO_PULL_DISABLE, |
diff --git a/arch/mips/include/asm/vr41xx/irq.h b/arch/mips/include/asm/vr41xx/irq.h index d315dfbc08f2..b07f7321751d 100644 --- a/arch/mips/include/asm/vr41xx/irq.h +++ b/arch/mips/include/asm/vr41xx/irq.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * Copyright (C) 2001, 2002 Paul Mundt | 7 | * Copyright (C) 2001, 2002 Paul Mundt |
| 8 | * Copyright (C) 2002 MontaVista Software, Inc. | 8 | * Copyright (C) 2002 MontaVista Software, Inc. |
| 9 | * Copyright (C) 2002 TimeSys Corp. | 9 | * Copyright (C) 2002 TimeSys Corp. |
| 10 | * Copyright (C) 2003-2006 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 10 | * Copyright (C) 2003-2006 Yoichi Yuasa <yuasa@linux-mips.org> |
| 11 | * | 11 | * |
| 12 | * This program is free software; you can redistribute it and/or modify it | 12 | * This program is free software; you can redistribute it and/or modify it |
| 13 | * under the terms of the GNU General Public License as published by the | 13 | * under the terms of the GNU General Public License as published by the |
diff --git a/arch/mips/include/asm/vr41xx/mpc30x.h b/arch/mips/include/asm/vr41xx/mpc30x.h index 1d67df843dc3..130d09d8c8cb 100644 --- a/arch/mips/include/asm/vr41xx/mpc30x.h +++ b/arch/mips/include/asm/vr41xx/mpc30x.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * mpc30x.h, Include file for Victor MP-C303/304. | 2 | * mpc30x.h, Include file for Victor MP-C303/304. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/vr41xx/pci.h b/arch/mips/include/asm/vr41xx/pci.h index 6fc01ce19777..c231a3d6cfd8 100644 --- a/arch/mips/include/asm/vr41xx/pci.h +++ b/arch/mips/include/asm/vr41xx/pci.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Include file for NEC VR4100 series PCI Control Unit. | 2 | * Include file for NEC VR4100 series PCI Control Unit. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2004-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2004-2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/vr41xx/siu.h b/arch/mips/include/asm/vr41xx/siu.h index da9f6e373409..ca806bc4ddc8 100644 --- a/arch/mips/include/asm/vr41xx/siu.h +++ b/arch/mips/include/asm/vr41xx/siu.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Include file for NEC VR4100 series Serial Interface Unit. | 2 | * Include file for NEC VR4100 series Serial Interface Unit. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005-2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2005-2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/vr41xx/tb0219.h b/arch/mips/include/asm/vr41xx/tb0219.h index dc981b4be0a4..c78e8243b447 100644 --- a/arch/mips/include/asm/vr41xx/tb0219.h +++ b/arch/mips/include/asm/vr41xx/tb0219.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * tb0219.h, Include file for TANBAC TB0219. | 2 | * tb0219.h, Include file for TANBAC TB0219. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * Modified for TANBAC TB0219: | 6 | * Modified for TANBAC TB0219: |
| 7 | * Copyright (C) 2003 Megasolution Inc. <matsu@megasolution.jp> | 7 | * Copyright (C) 2003 Megasolution Inc. <matsu@megasolution.jp> |
diff --git a/arch/mips/include/asm/vr41xx/tb0226.h b/arch/mips/include/asm/vr41xx/tb0226.h index de527dcfa5f3..36f5f798e416 100644 --- a/arch/mips/include/asm/vr41xx/tb0226.h +++ b/arch/mips/include/asm/vr41xx/tb0226.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * tb0226.h, Include file for TANBAC TB0226. | 2 | * tb0226.h, Include file for TANBAC TB0226. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002-2004 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/include/asm/vr41xx/vr41xx.h b/arch/mips/include/asm/vr41xx/vr41xx.h index 22be64971cc6..7b96a43b72ba 100644 --- a/arch/mips/include/asm/vr41xx/vr41xx.h +++ b/arch/mips/include/asm/vr41xx/vr41xx.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * Copyright (C) 2001, 2002 Paul Mundt | 7 | * Copyright (C) 2001, 2002 Paul Mundt |
| 8 | * Copyright (C) 2002 MontaVista Software, Inc. | 8 | * Copyright (C) 2002 MontaVista Software, Inc. |
| 9 | * Copyright (C) 2002 TimeSys Corp. | 9 | * Copyright (C) 2002 TimeSys Corp. |
| 10 | * Copyright (C) 2003-2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 10 | * Copyright (C) 2003-2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 11 | * | 11 | * |
| 12 | * This program is free software; you can redistribute it and/or modify it | 12 | * This program is free software; you can redistribute it and/or modify it |
| 13 | * under the terms of the GNU General Public License as published by the | 13 | * under the terms of the GNU General Public License as published by the |
diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c index e1333d7319e2..ff448233dab5 100644 --- a/arch/mips/kernel/binfmt_elfo32.c +++ b/arch/mips/kernel/binfmt_elfo32.c | |||
| @@ -53,6 +53,23 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; | |||
| 53 | #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) | 53 | #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) |
| 54 | 54 | ||
| 55 | #include <asm/processor.h> | 55 | #include <asm/processor.h> |
| 56 | |||
| 57 | /* | ||
| 58 | * When this file is selected, we are definitely running a 64bit kernel. | ||
| 59 | * So using the right regs define in asm/reg.h | ||
| 60 | */ | ||
| 61 | #define WANT_COMPAT_REG_H | ||
| 62 | |||
| 63 | /* These MUST be defined before elf.h gets included */ | ||
| 64 | extern void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs); | ||
| 65 | #define ELF_CORE_COPY_REGS(_dest, _regs) elf32_core_copy_regs(_dest, _regs); | ||
| 66 | #define ELF_CORE_COPY_TASK_REGS(_tsk, _dest) \ | ||
| 67 | ({ \ | ||
| 68 | int __res = 1; \ | ||
| 69 | elf32_core_copy_regs(*(_dest), task_pt_regs(_tsk)); \ | ||
| 70 | __res; \ | ||
| 71 | }) | ||
| 72 | |||
| 56 | #include <linux/module.h> | 73 | #include <linux/module.h> |
| 57 | #include <linux/elfcore.h> | 74 | #include <linux/elfcore.h> |
| 58 | #include <linux/compat.h> | 75 | #include <linux/compat.h> |
| @@ -110,9 +127,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) | |||
| 110 | value->tv_usec = rem / NSEC_PER_USEC; | 127 | value->tv_usec = rem / NSEC_PER_USEC; |
| 111 | } | 128 | } |
| 112 | 129 | ||
| 113 | #undef ELF_CORE_COPY_REGS | ||
| 114 | #define ELF_CORE_COPY_REGS(_dest, _regs) elf32_core_copy_regs(_dest, _regs); | ||
| 115 | |||
| 116 | void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs) | 130 | void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs) |
| 117 | { | 131 | { |
| 118 | int i; | 132 | int i; |
diff --git a/arch/mips/kernel/cevt-ds1287.c b/arch/mips/kernel/cevt-ds1287.c index 1ada45ea0700..6996da4d74a2 100644 --- a/arch/mips/kernel/cevt-ds1287.c +++ b/arch/mips/kernel/cevt-ds1287.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DS1287 clockevent driver | 2 | * DS1287 clockevent driver |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/cevt-gt641xx.c b/arch/mips/kernel/cevt-gt641xx.c index e9b787feedcb..92351e00ae0e 100644 --- a/arch/mips/kernel/cevt-gt641xx.c +++ b/arch/mips/kernel/cevt-gt641xx.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * GT641xx clockevent routines. | 2 | * GT641xx clockevent routines. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/csrc-ioasic.c b/arch/mips/kernel/csrc-ioasic.c index b551f48d3a07..23da108506b0 100644 --- a/arch/mips/kernel/csrc-ioasic.c +++ b/arch/mips/kernel/csrc-ioasic.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DEC I/O ASIC's counter clocksource | 2 | * DEC I/O ASIC's counter clocksource |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/irq-gic.c b/arch/mips/kernel/irq-gic.c index 39000f103f2c..d2072cd38592 100644 --- a/arch/mips/kernel/irq-gic.c +++ b/arch/mips/kernel/irq-gic.c | |||
| @@ -107,9 +107,7 @@ static unsigned int gic_irq_startup(unsigned int irq) | |||
| 107 | { | 107 | { |
| 108 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 108 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 109 | irq -= _irqbase; | 109 | irq -= _irqbase; |
| 110 | /* FIXME: this is wrong for !GICISWORDLITTLEENDIAN */ | 110 | GIC_SET_INTR_MASK(irq, 1); |
| 111 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_SMASK_31_0_OFS + (irq / 32))), | ||
| 112 | 1 << (irq % 32)); | ||
| 113 | return 0; | 111 | return 0; |
| 114 | } | 112 | } |
| 115 | 113 | ||
| @@ -120,8 +118,7 @@ static void gic_irq_ack(unsigned int irq) | |||
| 120 | #endif | 118 | #endif |
| 121 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 119 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 122 | irq -= _irqbase; | 120 | irq -= _irqbase; |
| 123 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_RMASK_31_0_OFS + (irq / 32))), | 121 | GIC_CLR_INTR_MASK(irq, 1); |
| 124 | 1 << (irq % 32)); | ||
| 125 | 122 | ||
| 126 | if (_intrmap[irq].trigtype == GIC_TRIG_EDGE) { | 123 | if (_intrmap[irq].trigtype == GIC_TRIG_EDGE) { |
| 127 | if (!gic_wedgeb2bok) | 124 | if (!gic_wedgeb2bok) |
| @@ -138,18 +135,14 @@ static void gic_mask_irq(unsigned int irq) | |||
| 138 | { | 135 | { |
| 139 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 136 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 140 | irq -= _irqbase; | 137 | irq -= _irqbase; |
| 141 | /* FIXME: this is wrong for !GICISWORDLITTLEENDIAN */ | 138 | GIC_CLR_INTR_MASK(irq, 1); |
| 142 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_RMASK_31_0_OFS + (irq / 32))), | ||
| 143 | 1 << (irq % 32)); | ||
| 144 | } | 139 | } |
| 145 | 140 | ||
| 146 | static void gic_unmask_irq(unsigned int irq) | 141 | static void gic_unmask_irq(unsigned int irq) |
| 147 | { | 142 | { |
| 148 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 143 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 149 | irq -= _irqbase; | 144 | irq -= _irqbase; |
| 150 | /* FIXME: this is wrong for !GICISWORDLITTLEENDIAN */ | 145 | GIC_SET_INTR_MASK(irq, 1); |
| 151 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_SMASK_31_0_OFS + (irq / 32))), | ||
| 152 | 1 << (irq % 32)); | ||
| 153 | } | 146 | } |
| 154 | 147 | ||
| 155 | #ifdef CONFIG_SMP | 148 | #ifdef CONFIG_SMP |
| @@ -254,6 +247,10 @@ static void __init gic_basic_init(void) | |||
| 254 | if (cpu == X) | 247 | if (cpu == X) |
| 255 | continue; | 248 | continue; |
| 256 | 249 | ||
| 250 | if (cpu == 0 && i != 0 && _intrmap[i].intrnum == 0 && | ||
| 251 | _intrmap[i].ipiflag == 0) | ||
| 252 | continue; | ||
| 253 | |||
| 257 | setup_intr(_intrmap[i].intrnum, | 254 | setup_intr(_intrmap[i].intrnum, |
| 258 | _intrmap[i].cpunum, | 255 | _intrmap[i].cpunum, |
| 259 | _intrmap[i].pin, | 256 | _intrmap[i].pin, |
diff --git a/arch/mips/kernel/irq-gt641xx.c b/arch/mips/kernel/irq-gt641xx.c index 1b81b131f43c..ebcc5f7ad9c2 100644 --- a/arch/mips/kernel/irq-gt641xx.c +++ b/arch/mips/kernel/irq-gt641xx.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * GT641xx IRQ routines. | 2 | * GT641xx IRQ routines. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 0b31b9bda048..20a86e08fd58 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
| @@ -652,6 +652,8 @@ einval: li v0, -ENOSYS | |||
| 652 | sys sys_inotify_init1 1 | 652 | sys sys_inotify_init1 1 |
| 653 | sys sys_preadv 6 /* 4330 */ | 653 | sys sys_preadv 6 /* 4330 */ |
| 654 | sys sys_pwritev 6 | 654 | sys sys_pwritev 6 |
| 655 | sys sys_rt_tgsigqueueinfo 4 | ||
| 656 | sys sys_perf_counter_open 5 | ||
| 655 | .endm | 657 | .endm |
| 656 | 658 | ||
| 657 | /* We pre-compute the number of _instruction_ bytes needed to | 659 | /* We pre-compute the number of _instruction_ bytes needed to |
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index c647fd6e722f..b046130d4c5d 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
| @@ -489,4 +489,6 @@ sys_call_table: | |||
| 489 | PTR sys_inotify_init1 | 489 | PTR sys_inotify_init1 |
| 490 | PTR sys_preadv | 490 | PTR sys_preadv |
| 491 | PTR sys_pwritev /* 5390 */ | 491 | PTR sys_pwritev /* 5390 */ |
| 492 | PTR sys_rt_tgsigqueueinfo | ||
| 493 | PTR sys_perf_counter_open | ||
| 492 | .size sys_call_table,.-sys_call_table | 494 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 93cc672f4522..15874f9812cc 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -415,4 +415,6 @@ EXPORT(sysn32_call_table) | |||
| 415 | PTR sys_inotify_init1 | 415 | PTR sys_inotify_init1 |
| 416 | PTR sys_preadv | 416 | PTR sys_preadv |
| 417 | PTR sys_pwritev | 417 | PTR sys_pwritev |
| 418 | PTR compat_sys_rt_tgsigqueueinfo /* 5295 */ | ||
| 419 | PTR sys_perf_counter_open | ||
| 418 | .size sysn32_call_table,.-sysn32_call_table | 420 | .size sysn32_call_table,.-sysn32_call_table |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index a5598b2339dd..781e0f1e9533 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
| @@ -535,4 +535,6 @@ sys_call_table: | |||
| 535 | PTR sys_inotify_init1 | 535 | PTR sys_inotify_init1 |
| 536 | PTR compat_sys_preadv /* 4330 */ | 536 | PTR compat_sys_preadv /* 4330 */ |
| 537 | PTR compat_sys_pwritev | 537 | PTR compat_sys_pwritev |
| 538 | PTR compat_sys_rt_tgsigqueueinfo | ||
| 539 | PTR sys_perf_counter_open | ||
| 538 | .size sys_call_table,.-sys_call_table | 540 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c index 653be061b9ec..ad0ff5dc4d59 100644 --- a/arch/mips/kernel/smp-cmp.c +++ b/arch/mips/kernel/smp-cmp.c | |||
| @@ -37,80 +37,24 @@ | |||
| 37 | #include <asm/mipsregs.h> | 37 | #include <asm/mipsregs.h> |
| 38 | #include <asm/mipsmtregs.h> | 38 | #include <asm/mipsmtregs.h> |
| 39 | #include <asm/mips_mt.h> | 39 | #include <asm/mips_mt.h> |
| 40 | 40 | #include <asm/amon.h> | |
| 41 | /* | 41 | #include <asm/gic.h> |
| 42 | * Crude manipulation of the CPU masks to control which | ||
| 43 | * which CPU's are brought online during initialisation | ||
| 44 | * | ||
| 45 | * Beware... this needs to be called after CPU discovery | ||
| 46 | * but before CPU bringup | ||
| 47 | */ | ||
| 48 | static int __init allowcpus(char *str) | ||
| 49 | { | ||
| 50 | cpumask_t cpu_allow_map; | ||
| 51 | char buf[256]; | ||
| 52 | int len; | ||
| 53 | |||
| 54 | cpus_clear(cpu_allow_map); | ||
| 55 | if (cpulist_parse(str, &cpu_allow_map) == 0) { | ||
| 56 | cpu_set(0, cpu_allow_map); | ||
| 57 | cpus_and(cpu_possible_map, cpu_possible_map, cpu_allow_map); | ||
| 58 | len = cpulist_scnprintf(buf, sizeof(buf)-1, &cpu_possible_map); | ||
| 59 | buf[len] = '\0'; | ||
| 60 | pr_debug("Allowable CPUs: %s\n", buf); | ||
| 61 | return 1; | ||
| 62 | } else | ||
| 63 | return 0; | ||
| 64 | } | ||
| 65 | __setup("allowcpus=", allowcpus); | ||
| 66 | 42 | ||
| 67 | static void ipi_call_function(unsigned int cpu) | 43 | static void ipi_call_function(unsigned int cpu) |
| 68 | { | 44 | { |
| 69 | unsigned int action = 0; | ||
| 70 | |||
| 71 | pr_debug("CPU%d: %s cpu %d status %08x\n", | 45 | pr_debug("CPU%d: %s cpu %d status %08x\n", |
| 72 | smp_processor_id(), __func__, cpu, read_c0_status()); | 46 | smp_processor_id(), __func__, cpu, read_c0_status()); |
| 73 | 47 | ||
| 74 | switch (cpu) { | 48 | gic_send_ipi(plat_ipi_call_int_xlate(cpu)); |
| 75 | case 0: | ||
| 76 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE0; | ||
| 77 | break; | ||
| 78 | case 1: | ||
| 79 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE1; | ||
| 80 | break; | ||
| 81 | case 2: | ||
| 82 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE2; | ||
| 83 | break; | ||
| 84 | case 3: | ||
| 85 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE3; | ||
| 86 | break; | ||
| 87 | } | ||
| 88 | gic_send_ipi(action); | ||
| 89 | } | 49 | } |
| 90 | 50 | ||
| 91 | 51 | ||
| 92 | static void ipi_resched(unsigned int cpu) | 52 | static void ipi_resched(unsigned int cpu) |
| 93 | { | 53 | { |
| 94 | unsigned int action = 0; | ||
| 95 | |||
| 96 | pr_debug("CPU%d: %s cpu %d status %08x\n", | 54 | pr_debug("CPU%d: %s cpu %d status %08x\n", |
| 97 | smp_processor_id(), __func__, cpu, read_c0_status()); | 55 | smp_processor_id(), __func__, cpu, read_c0_status()); |
| 98 | 56 | ||
| 99 | switch (cpu) { | 57 | gic_send_ipi(plat_ipi_resched_int_xlate(cpu)); |
| 100 | case 0: | ||
| 101 | action = GIC_IPI_EXT_INTR_RESCHED_VPE0; | ||
| 102 | break; | ||
| 103 | case 1: | ||
| 104 | action = GIC_IPI_EXT_INTR_RESCHED_VPE1; | ||
| 105 | break; | ||
| 106 | case 2: | ||
| 107 | action = GIC_IPI_EXT_INTR_RESCHED_VPE2; | ||
| 108 | break; | ||
| 109 | case 3: | ||
| 110 | action = GIC_IPI_EXT_INTR_RESCHED_VPE3; | ||
| 111 | break; | ||
| 112 | } | ||
| 113 | gic_send_ipi(action); | ||
| 114 | } | 58 | } |
| 115 | 59 | ||
| 116 | /* | 60 | /* |
| @@ -206,7 +150,7 @@ static void cmp_boot_secondary(int cpu, struct task_struct *idle) | |||
| 206 | (unsigned long)(gp + sizeof(struct thread_info))); | 150 | (unsigned long)(gp + sizeof(struct thread_info))); |
| 207 | #endif | 151 | #endif |
| 208 | 152 | ||
| 209 | amon_cpu_start(cpu, pc, sp, gp, a0); | 153 | amon_cpu_start(cpu, pc, sp, (unsigned long)gp, a0); |
| 210 | } | 154 | } |
| 211 | 155 | ||
| 212 | /* | 156 | /* |
diff --git a/arch/mips/kernel/sync-r4k.c b/arch/mips/kernel/sync-r4k.c index 9021108eb9c1..05dd170a83f7 100644 --- a/arch/mips/kernel/sync-r4k.c +++ b/arch/mips/kernel/sync-r4k.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Count register synchronisation. | 2 | * Count register synchronisation. |
| 3 | * | 3 | * |
| 4 | * All CPUs will have their count registers synchronised to the CPU0 expirelo | 4 | * All CPUs will have their count registers synchronised to the CPU0 next time |
| 5 | * value. This can cause a small timewarp for CPU0. All other CPU's should | 5 | * value. This can cause a small timewarp for CPU0. All other CPU's should |
| 6 | * not have done anything significant (but they may have had interrupts | 6 | * not have done anything significant (but they may have had interrupts |
| 7 | * enabled briefly - prom_smp_finish() should not be responsible for enabling | 7 | * enabled briefly - prom_smp_finish() should not be responsible for enabling |
| @@ -13,21 +13,22 @@ | |||
| 13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/irqflags.h> | 15 | #include <linux/irqflags.h> |
| 16 | #include <linux/r4k-timer.h> | 16 | #include <linux/cpumask.h> |
| 17 | 17 | ||
| 18 | #include <asm/r4k-timer.h> | ||
| 18 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
| 19 | #include <asm/barrier.h> | 20 | #include <asm/barrier.h> |
| 20 | #include <asm/cpumask.h> | ||
| 21 | #include <asm/mipsregs.h> | 21 | #include <asm/mipsregs.h> |
| 22 | 22 | ||
| 23 | static atomic_t __initdata count_start_flag = ATOMIC_INIT(0); | 23 | static atomic_t __cpuinitdata count_start_flag = ATOMIC_INIT(0); |
| 24 | static atomic_t __initdata count_count_start = ATOMIC_INIT(0); | 24 | static atomic_t __cpuinitdata count_count_start = ATOMIC_INIT(0); |
| 25 | static atomic_t __initdata count_count_stop = ATOMIC_INIT(0); | 25 | static atomic_t __cpuinitdata count_count_stop = ATOMIC_INIT(0); |
| 26 | static atomic_t __cpuinitdata count_reference = ATOMIC_INIT(0); | ||
| 26 | 27 | ||
| 27 | #define COUNTON 100 | 28 | #define COUNTON 100 |
| 28 | #define NR_LOOPS 5 | 29 | #define NR_LOOPS 5 |
| 29 | 30 | ||
| 30 | void __init synchronise_count_master(void) | 31 | void __cpuinit synchronise_count_master(void) |
| 31 | { | 32 | { |
| 32 | int i; | 33 | int i; |
| 33 | unsigned long flags; | 34 | unsigned long flags; |
| @@ -42,19 +43,20 @@ void __init synchronise_count_master(void) | |||
| 42 | return; | 43 | return; |
| 43 | #endif | 44 | #endif |
| 44 | 45 | ||
| 45 | pr_info("Checking COUNT synchronization across %u CPUs: ", | 46 | printk(KERN_INFO "Synchronize counters across %u CPUs: ", |
| 46 | num_online_cpus()); | 47 | num_online_cpus()); |
| 47 | 48 | ||
| 48 | local_irq_save(flags); | 49 | local_irq_save(flags); |
| 49 | 50 | ||
| 50 | /* | 51 | /* |
| 51 | * Notify the slaves that it's time to start | 52 | * Notify the slaves that it's time to start |
| 52 | */ | 53 | */ |
| 54 | atomic_set(&count_reference, read_c0_count()); | ||
| 53 | atomic_set(&count_start_flag, 1); | 55 | atomic_set(&count_start_flag, 1); |
| 54 | smp_wmb(); | 56 | smp_wmb(); |
| 55 | 57 | ||
| 56 | /* Count will be initialised to expirelo for all CPU's */ | 58 | /* Count will be initialised to current timer for all CPU's */ |
| 57 | initcount = expirelo; | 59 | initcount = read_c0_count(); |
| 58 | 60 | ||
| 59 | /* | 61 | /* |
| 60 | * We loop a few times to get a primed instruction cache, | 62 | * We loop a few times to get a primed instruction cache, |
| @@ -106,7 +108,7 @@ void __init synchronise_count_master(void) | |||
| 106 | printk("done.\n"); | 108 | printk("done.\n"); |
| 107 | } | 109 | } |
| 108 | 110 | ||
| 109 | void __init synchronise_count_slave(void) | 111 | void __cpuinit synchronise_count_slave(void) |
| 110 | { | 112 | { |
| 111 | int i; | 113 | int i; |
| 112 | unsigned long flags; | 114 | unsigned long flags; |
| @@ -131,8 +133,8 @@ void __init synchronise_count_slave(void) | |||
| 131 | while (!atomic_read(&count_start_flag)) | 133 | while (!atomic_read(&count_start_flag)) |
| 132 | mb(); | 134 | mb(); |
| 133 | 135 | ||
| 134 | /* Count will be initialised to expirelo for all CPU's */ | 136 | /* Count will be initialised to next expire for all CPU's */ |
| 135 | initcount = expirelo; | 137 | initcount = atomic_read(&count_reference); |
| 136 | 138 | ||
| 137 | ncpus = num_online_cpus(); | 139 | ncpus = num_online_cpus(); |
| 138 | for (i = 0; i < NR_LOOPS; i++) { | 140 | for (i = 0; i < NR_LOOPS; i++) { |
| @@ -156,4 +158,3 @@ void __init synchronise_count_slave(void) | |||
| 156 | local_irq_restore(flags); | 158 | local_irq_restore(flags); |
| 157 | } | 159 | } |
| 158 | #undef NR_LOOPS | 160 | #undef NR_LOOPS |
| 159 | #endif | ||
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index 3ca5f42e819d..07b9ec2c6e3d 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c | |||
| @@ -1387,7 +1387,7 @@ static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr, | |||
| 1387 | return len; | 1387 | return len; |
| 1388 | 1388 | ||
| 1389 | out_einval: | 1389 | out_einval: |
| 1390 | return -EINVAL;; | 1390 | return -EINVAL; |
| 1391 | } | 1391 | } |
| 1392 | 1392 | ||
| 1393 | static struct device_attribute vpe_class_attributes[] = { | 1393 | static struct device_attribute vpe_class_attributes[] = { |
diff --git a/arch/mips/mti-malta/malta-init.c b/arch/mips/mti-malta/malta-init.c index 475038a141a6..27c807b67fea 100644 --- a/arch/mips/mti-malta/malta-init.c +++ b/arch/mips/mti-malta/malta-init.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <asm/cacheflush.h> | 30 | #include <asm/cacheflush.h> |
| 31 | #include <asm/traps.h> | 31 | #include <asm/traps.h> |
| 32 | 32 | ||
| 33 | #include <asm/gcmpregs.h> | ||
| 33 | #include <asm/mips-boards/prom.h> | 34 | #include <asm/mips-boards/prom.h> |
| 34 | #include <asm/mips-boards/generic.h> | 35 | #include <asm/mips-boards/generic.h> |
| 35 | #include <asm/mips-boards/bonito64.h> | 36 | #include <asm/mips-boards/bonito64.h> |
| @@ -192,6 +193,8 @@ extern struct plat_smp_ops msmtc_smp_ops; | |||
| 192 | 193 | ||
| 193 | void __init prom_init(void) | 194 | void __init prom_init(void) |
| 194 | { | 195 | { |
| 196 | int result; | ||
| 197 | |||
| 195 | prom_argc = fw_arg0; | 198 | prom_argc = fw_arg0; |
| 196 | _prom_argv = (int *) fw_arg1; | 199 | _prom_argv = (int *) fw_arg1; |
| 197 | _prom_envp = (int *) fw_arg2; | 200 | _prom_envp = (int *) fw_arg2; |
| @@ -358,12 +361,21 @@ void __init prom_init(void) | |||
| 358 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 361 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
| 359 | console_config(); | 362 | console_config(); |
| 360 | #endif | 363 | #endif |
| 364 | /* Early detection of CMP support */ | ||
| 365 | result = gcmp_probe(GCMP_BASE_ADDR, GCMP_ADDRSPACE_SZ); | ||
| 366 | |||
| 361 | #ifdef CONFIG_MIPS_CMP | 367 | #ifdef CONFIG_MIPS_CMP |
| 362 | register_smp_ops(&cmp_smp_ops); | 368 | if (result) |
| 369 | register_smp_ops(&cmp_smp_ops); | ||
| 363 | #endif | 370 | #endif |
| 364 | #ifdef CONFIG_MIPS_MT_SMP | 371 | #ifdef CONFIG_MIPS_MT_SMP |
| 372 | #ifdef CONFIG_MIPS_CMP | ||
| 373 | if (!result) | ||
| 374 | register_smp_ops(&vsmp_smp_ops); | ||
| 375 | #else | ||
| 365 | register_smp_ops(&vsmp_smp_ops); | 376 | register_smp_ops(&vsmp_smp_ops); |
| 366 | #endif | 377 | #endif |
| 378 | #endif | ||
| 367 | #ifdef CONFIG_MIPS_MT_SMTC | 379 | #ifdef CONFIG_MIPS_MT_SMTC |
| 368 | register_smp_ops(&msmtc_smp_ops); | 380 | register_smp_ops(&msmtc_smp_ops); |
| 369 | #endif | 381 | #endif |
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c index b4eaf137e4a7..a8756f82c31b 100644 --- a/arch/mips/mti-malta/malta-int.c +++ b/arch/mips/mti-malta/malta-int.c | |||
| @@ -331,6 +331,21 @@ static struct irqaction irq_call = { | |||
| 331 | .flags = IRQF_DISABLED|IRQF_PERCPU, | 331 | .flags = IRQF_DISABLED|IRQF_PERCPU, |
| 332 | .name = "IPI_call" | 332 | .name = "IPI_call" |
| 333 | }; | 333 | }; |
| 334 | |||
| 335 | static int gic_resched_int_base; | ||
| 336 | static int gic_call_int_base; | ||
| 337 | #define GIC_RESCHED_INT(cpu) (gic_resched_int_base+(cpu)) | ||
| 338 | #define GIC_CALL_INT(cpu) (gic_call_int_base+(cpu)) | ||
| 339 | |||
| 340 | unsigned int plat_ipi_call_int_xlate(unsigned int cpu) | ||
| 341 | { | ||
| 342 | return GIC_CALL_INT(cpu); | ||
| 343 | } | ||
| 344 | |||
| 345 | unsigned int plat_ipi_resched_int_xlate(unsigned int cpu) | ||
| 346 | { | ||
| 347 | return GIC_RESCHED_INT(cpu); | ||
| 348 | } | ||
| 334 | #endif /* CONFIG_MIPS_MT_SMP */ | 349 | #endif /* CONFIG_MIPS_MT_SMP */ |
| 335 | 350 | ||
| 336 | static struct irqaction i8259irq = { | 351 | static struct irqaction i8259irq = { |
| @@ -370,7 +385,7 @@ static int __initdata msc_nr_eicirqs = ARRAY_SIZE(msc_eicirqmap); | |||
| 370 | * Interrupts and CPUs/Core Interrupts. The nature of the External | 385 | * Interrupts and CPUs/Core Interrupts. The nature of the External |
| 371 | * Interrupts is also defined here - polarity/trigger. | 386 | * Interrupts is also defined here - polarity/trigger. |
| 372 | */ | 387 | */ |
| 373 | static struct gic_intr_map gic_intr_map[] = { | 388 | static struct gic_intr_map gic_intr_map[GIC_NUM_INTRS] = { |
| 374 | { GIC_EXT_INTR(0), X, X, X, X, 0 }, | 389 | { GIC_EXT_INTR(0), X, X, X, X, 0 }, |
| 375 | { GIC_EXT_INTR(1), X, X, X, X, 0 }, | 390 | { GIC_EXT_INTR(1), X, X, X, X, 0 }, |
| 376 | { GIC_EXT_INTR(2), X, X, X, X, 0 }, | 391 | { GIC_EXT_INTR(2), X, X, X, X, 0 }, |
| @@ -387,21 +402,14 @@ static struct gic_intr_map gic_intr_map[] = { | |||
| 387 | { GIC_EXT_INTR(13), 0, GIC_MAP_TO_NMI_MSK, GIC_POL_POS, GIC_TRIG_LEVEL, 0 }, | 402 | { GIC_EXT_INTR(13), 0, GIC_MAP_TO_NMI_MSK, GIC_POL_POS, GIC_TRIG_LEVEL, 0 }, |
| 388 | { GIC_EXT_INTR(14), 0, GIC_MAP_TO_NMI_MSK, GIC_POL_POS, GIC_TRIG_LEVEL, 0 }, | 403 | { GIC_EXT_INTR(14), 0, GIC_MAP_TO_NMI_MSK, GIC_POL_POS, GIC_TRIG_LEVEL, 0 }, |
| 389 | { GIC_EXT_INTR(15), X, X, X, X, 0 }, | 404 | { GIC_EXT_INTR(15), X, X, X, X, 0 }, |
| 390 | { GIC_EXT_INTR(16), 0, GIC_CPU_INT1, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | 405 | /* This is the end of the general interrupts now we do IPI ones */ |
| 391 | { GIC_EXT_INTR(17), 0, GIC_CPU_INT2, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | ||
| 392 | { GIC_EXT_INTR(18), 1, GIC_CPU_INT1, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | ||
| 393 | { GIC_EXT_INTR(19), 1, GIC_CPU_INT2, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | ||
| 394 | { GIC_EXT_INTR(20), 2, GIC_CPU_INT1, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | ||
| 395 | { GIC_EXT_INTR(21), 2, GIC_CPU_INT2, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | ||
| 396 | { GIC_EXT_INTR(22), 3, GIC_CPU_INT1, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | ||
| 397 | { GIC_EXT_INTR(23), 3, GIC_CPU_INT2, GIC_POL_POS, GIC_TRIG_EDGE, 1 }, | ||
| 398 | }; | 406 | }; |
| 399 | #endif | 407 | #endif |
| 400 | 408 | ||
| 401 | /* | 409 | /* |
| 402 | * GCMP needs to be detected before any SMP initialisation | 410 | * GCMP needs to be detected before any SMP initialisation |
| 403 | */ | 411 | */ |
| 404 | static int __init gcmp_probe(unsigned long addr, unsigned long size) | 412 | int __init gcmp_probe(unsigned long addr, unsigned long size) |
| 405 | { | 413 | { |
| 406 | if (gcmp_present >= 0) | 414 | if (gcmp_present >= 0) |
| 407 | return gcmp_present; | 415 | return gcmp_present; |
| @@ -416,28 +424,36 @@ static int __init gcmp_probe(unsigned long addr, unsigned long size) | |||
| 416 | } | 424 | } |
| 417 | 425 | ||
| 418 | #if defined(CONFIG_MIPS_MT_SMP) | 426 | #if defined(CONFIG_MIPS_MT_SMP) |
| 427 | static void __init fill_ipi_map1(int baseintr, int cpu, int cpupin) | ||
| 428 | { | ||
| 429 | int intr = baseintr + cpu; | ||
| 430 | gic_intr_map[intr].intrnum = GIC_EXT_INTR(intr); | ||
| 431 | gic_intr_map[intr].cpunum = cpu; | ||
| 432 | gic_intr_map[intr].pin = cpupin; | ||
| 433 | gic_intr_map[intr].polarity = GIC_POL_POS; | ||
| 434 | gic_intr_map[intr].trigtype = GIC_TRIG_EDGE; | ||
| 435 | gic_intr_map[intr].ipiflag = 1; | ||
| 436 | ipi_map[cpu] |= (1 << (cpupin + 2)); | ||
| 437 | } | ||
| 438 | |||
| 419 | static void __init fill_ipi_map(void) | 439 | static void __init fill_ipi_map(void) |
| 420 | { | 440 | { |
| 421 | int i; | 441 | int cpu; |
| 422 | 442 | ||
| 423 | for (i = 0; i < ARRAY_SIZE(gic_intr_map); i++) { | 443 | for (cpu = 0; cpu < NR_CPUS; cpu++) { |
| 424 | if (gic_intr_map[i].ipiflag && (gic_intr_map[i].cpunum != X)) | 444 | fill_ipi_map1(gic_resched_int_base, cpu, GIC_CPU_INT1); |
| 425 | ipi_map[gic_intr_map[i].cpunum] |= | 445 | fill_ipi_map1(gic_call_int_base, cpu, GIC_CPU_INT2); |
| 426 | (1 << (gic_intr_map[i].pin + 2)); | ||
| 427 | } | 446 | } |
| 428 | } | 447 | } |
| 429 | #endif | 448 | #endif |
| 430 | 449 | ||
| 431 | void __init arch_init_irq(void) | 450 | void __init arch_init_irq(void) |
| 432 | { | 451 | { |
| 433 | int gic_present, gcmp_present; | ||
| 434 | |||
| 435 | init_i8259_irqs(); | 452 | init_i8259_irqs(); |
| 436 | 453 | ||
| 437 | if (!cpu_has_veic) | 454 | if (!cpu_has_veic) |
| 438 | mips_cpu_irq_init(); | 455 | mips_cpu_irq_init(); |
| 439 | 456 | ||
| 440 | gcmp_present = gcmp_probe(GCMP_BASE_ADDR, GCMP_ADDRSPACE_SZ); | ||
| 441 | if (gcmp_present) { | 457 | if (gcmp_present) { |
| 442 | GCMPGCB(GICBA) = GIC_BASE_ADDR | GCMP_GCB_GICBA_EN_MSK; | 458 | GCMPGCB(GICBA) = GIC_BASE_ADDR | GCMP_GCB_GICBA_EN_MSK; |
| 443 | gic_present = 1; | 459 | gic_present = 1; |
| @@ -514,24 +530,10 @@ void __init arch_init_irq(void) | |||
| 514 | if (gic_present) { | 530 | if (gic_present) { |
| 515 | /* FIXME */ | 531 | /* FIXME */ |
| 516 | int i; | 532 | int i; |
| 517 | struct { | 533 | |
| 518 | unsigned int resched; | 534 | gic_call_int_base = GIC_NUM_INTRS - NR_CPUS; |
| 519 | unsigned int call; | 535 | gic_resched_int_base = gic_call_int_base - NR_CPUS; |
| 520 | } ipiirq[] = { | 536 | |
| 521 | { | ||
| 522 | .resched = GIC_IPI_EXT_INTR_RESCHED_VPE0, | ||
| 523 | .call = GIC_IPI_EXT_INTR_CALLFNC_VPE0}, | ||
| 524 | { | ||
| 525 | .resched = GIC_IPI_EXT_INTR_RESCHED_VPE1, | ||
| 526 | .call = GIC_IPI_EXT_INTR_CALLFNC_VPE1 | ||
| 527 | }, { | ||
| 528 | .resched = GIC_IPI_EXT_INTR_RESCHED_VPE2, | ||
| 529 | .call = GIC_IPI_EXT_INTR_CALLFNC_VPE2 | ||
| 530 | }, { | ||
| 531 | .resched = GIC_IPI_EXT_INTR_RESCHED_VPE3, | ||
| 532 | .call = GIC_IPI_EXT_INTR_CALLFNC_VPE3 | ||
| 533 | } | ||
| 534 | }; | ||
| 535 | fill_ipi_map(); | 537 | fill_ipi_map(); |
| 536 | gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map, ARRAY_SIZE(gic_intr_map), MIPS_GIC_IRQ_BASE); | 538 | gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map, ARRAY_SIZE(gic_intr_map), MIPS_GIC_IRQ_BASE); |
| 537 | if (!gcmp_present) { | 539 | if (!gcmp_present) { |
| @@ -553,12 +555,15 @@ void __init arch_init_irq(void) | |||
| 553 | printk("CPU%d: status register now %08x\n", smp_processor_id(), read_c0_status()); | 555 | printk("CPU%d: status register now %08x\n", smp_processor_id(), read_c0_status()); |
| 554 | write_c0_status(0x1100dc00); | 556 | write_c0_status(0x1100dc00); |
| 555 | printk("CPU%d: status register frc %08x\n", smp_processor_id(), read_c0_status()); | 557 | printk("CPU%d: status register frc %08x\n", smp_processor_id(), read_c0_status()); |
| 556 | for (i = 0; i < ARRAY_SIZE(ipiirq); i++) { | 558 | for (i = 0; i < NR_CPUS; i++) { |
| 557 | setup_irq(MIPS_GIC_IRQ_BASE + ipiirq[i].resched, &irq_resched); | 559 | setup_irq(MIPS_GIC_IRQ_BASE + |
| 558 | setup_irq(MIPS_GIC_IRQ_BASE + ipiirq[i].call, &irq_call); | 560 | GIC_RESCHED_INT(i), &irq_resched); |
| 559 | 561 | setup_irq(MIPS_GIC_IRQ_BASE + | |
| 560 | set_irq_handler(MIPS_GIC_IRQ_BASE + ipiirq[i].resched, handle_percpu_irq); | 562 | GIC_CALL_INT(i), &irq_call); |
| 561 | set_irq_handler(MIPS_GIC_IRQ_BASE + ipiirq[i].call, handle_percpu_irq); | 563 | set_irq_handler(MIPS_GIC_IRQ_BASE + |
| 564 | GIC_RESCHED_INT(i), handle_percpu_irq); | ||
| 565 | set_irq_handler(MIPS_GIC_IRQ_BASE + | ||
| 566 | GIC_CALL_INT(i), handle_percpu_irq); | ||
| 562 | } | 567 | } |
| 563 | } else { | 568 | } else { |
| 564 | /* set up ipi interrupts */ | 569 | /* set up ipi interrupts */ |
diff --git a/arch/mips/mti-malta/malta-reset.c b/arch/mips/mti-malta/malta-reset.c index 42dee4da37ba..f48d60e84290 100644 --- a/arch/mips/mti-malta/malta-reset.c +++ b/arch/mips/mti-malta/malta-reset.c | |||
| @@ -28,9 +28,6 @@ | |||
| 28 | #include <asm/reboot.h> | 28 | #include <asm/reboot.h> |
| 29 | #include <asm/mips-boards/generic.h> | 29 | #include <asm/mips-boards/generic.h> |
| 30 | 30 | ||
| 31 | static void mips_machine_restart(char *command); | ||
| 32 | static void mips_machine_halt(void); | ||
| 33 | |||
| 34 | static void mips_machine_restart(char *command) | 31 | static void mips_machine_restart(char *command) |
| 35 | { | 32 | { |
| 36 | unsigned int __iomem *softres_reg = | 33 | unsigned int __iomem *softres_reg = |
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile index e8a97f59e066..63d8a297c58d 100644 --- a/arch/mips/pci/Makefile +++ b/arch/mips/pci/Makefile | |||
| @@ -52,3 +52,8 @@ obj-$(CONFIG_VICTOR_MPC30X) += fixup-mpc30x.o | |||
| 52 | obj-$(CONFIG_ZAO_CAPCELLA) += fixup-capcella.o | 52 | obj-$(CONFIG_ZAO_CAPCELLA) += fixup-capcella.o |
| 53 | obj-$(CONFIG_WR_PPMC) += fixup-wrppmc.o | 53 | obj-$(CONFIG_WR_PPMC) += fixup-wrppmc.o |
| 54 | obj-$(CONFIG_MIKROTIK_RB532) += pci-rc32434.o ops-rc32434.o fixup-rc32434.o | 54 | obj-$(CONFIG_MIKROTIK_RB532) += pci-rc32434.o ops-rc32434.o fixup-rc32434.o |
| 55 | obj-$(CONFIG_CPU_CAVIUM_OCTEON) += pci-octeon.o pcie-octeon.o | ||
| 56 | |||
| 57 | ifdef CONFIG_PCI_MSI | ||
| 58 | obj-$(CONFIG_CPU_CAVIUM_OCTEON) += msi-octeon.o | ||
| 59 | endif | ||
diff --git a/arch/mips/pci/fixup-capcella.c b/arch/mips/pci/fixup-capcella.c index 1416bca6d1a3..1c02f5737367 100644 --- a/arch/mips/pci/fixup-capcella.c +++ b/arch/mips/pci/fixup-capcella.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * fixup-cappcela.c, The ZAO Networks Capcella specific PCI fixups. | 2 | * fixup-cappcela.c, The ZAO Networks Capcella specific PCI fixups. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002,2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002,2004 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/pci/fixup-mpc30x.c b/arch/mips/pci/fixup-mpc30x.c index 591159625722..e08f49cb6875 100644 --- a/arch/mips/pci/fixup-mpc30x.c +++ b/arch/mips/pci/fixup-mpc30x.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * fixup-mpc30x.c, The Victor MP-C303/304 specific PCI fixups. | 2 | * fixup-mpc30x.c, The Victor MP-C303/304 specific PCI fixups. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002,2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002,2004 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/pci/fixup-tb0219.c b/arch/mips/pci/fixup-tb0219.c index ed87733f6796..8084b17d4406 100644 --- a/arch/mips/pci/fixup-tb0219.c +++ b/arch/mips/pci/fixup-tb0219.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * fixup-tb0219.c, The TANBAC TB0219 specific PCI fixups. | 2 | * fixup-tb0219.c, The TANBAC TB0219 specific PCI fixups. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2003 Megasolution Inc. <matsu@megasolution.jp> | 4 | * Copyright (C) 2003 Megasolution Inc. <matsu@megasolution.jp> |
| 5 | * Copyright (C) 2004-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 5 | * Copyright (C) 2004-2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 6 | * | 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 as published by | 8 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/pci/fixup-tb0226.c b/arch/mips/pci/fixup-tb0226.c index e3eedf4bf9bd..4196ccf3ea3d 100644 --- a/arch/mips/pci/fixup-tb0226.c +++ b/arch/mips/pci/fixup-tb0226.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * fixup-tb0226.c, The TANBAC TB0226 specific PCI fixups. | 2 | * fixup-tb0226.c, The TANBAC TB0226 specific PCI fixups. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002-2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/pci/fixup-tb0287.c b/arch/mips/pci/fixup-tb0287.c index 267ab3dc3d42..2fe29db43725 100644 --- a/arch/mips/pci/fixup-tb0287.c +++ b/arch/mips/pci/fixup-tb0287.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * fixup-tb0287.c, The TANBAC TB0287 specific PCI fixups. | 2 | * fixup-tb0287.c, The TANBAC TB0287 specific PCI fixups. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cavium-octeon/msi.c b/arch/mips/pci/msi-octeon.c index 964b03b75a8f..03742e647657 100644 --- a/arch/mips/cavium-octeon/msi.c +++ b/arch/mips/pci/msi-octeon.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2005-2007 Cavium Networks | 6 | * Copyright (C) 2005-2009 Cavium Networks |
| 7 | */ | 7 | */ |
| 8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
| 9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
| @@ -16,8 +16,7 @@ | |||
| 16 | #include <asm/octeon/cvmx-pci-defs.h> | 16 | #include <asm/octeon/cvmx-pci-defs.h> |
| 17 | #include <asm/octeon/cvmx-npei-defs.h> | 17 | #include <asm/octeon/cvmx-npei-defs.h> |
| 18 | #include <asm/octeon/cvmx-pexp-defs.h> | 18 | #include <asm/octeon/cvmx-pexp-defs.h> |
| 19 | 19 | #include <asm/octeon/pci-octeon.h> | |
| 20 | #include "pci-common.h" | ||
| 21 | 20 | ||
| 22 | /* | 21 | /* |
| 23 | * Each bit in msi_free_irq_bitmask represents a MSI interrupt that is | 22 | * Each bit in msi_free_irq_bitmask represents a MSI interrupt that is |
| @@ -47,8 +46,8 @@ static DEFINE_SPINLOCK(msi_free_irq_bitmask_lock); | |||
| 47 | * programming the MSI control bits [6:4] before calling | 46 | * programming the MSI control bits [6:4] before calling |
| 48 | * pci_enable_msi(). | 47 | * pci_enable_msi(). |
| 49 | * | 48 | * |
| 50 | * @param dev Device requesting MSI interrupts | 49 | * @dev: Device requesting MSI interrupts |
| 51 | * @param desc MSI descriptor | 50 | * @desc: MSI descriptor |
| 52 | * | 51 | * |
| 53 | * Returns 0 on success. | 52 | * Returns 0 on success. |
| 54 | */ | 53 | */ |
| @@ -213,14 +212,9 @@ void arch_teardown_msi_irq(unsigned int irq) | |||
| 213 | } | 212 | } |
| 214 | 213 | ||
| 215 | 214 | ||
| 216 | /** | 215 | /* |
| 217 | * Called by the interrupt handling code when an MSI interrupt | 216 | * Called by the interrupt handling code when an MSI interrupt |
| 218 | * occurs. | 217 | * occurs. |
| 219 | * | ||
| 220 | * @param cpl | ||
| 221 | * @param dev_id | ||
| 222 | * | ||
| 223 | * @return | ||
| 224 | */ | 218 | */ |
| 225 | static irqreturn_t octeon_msi_interrupt(int cpl, void *dev_id) | 219 | static irqreturn_t octeon_msi_interrupt(int cpl, void *dev_id) |
| 226 | { | 220 | { |
| @@ -256,31 +250,37 @@ static irqreturn_t octeon_msi_interrupt(int cpl, void *dev_id) | |||
| 256 | } | 250 | } |
| 257 | 251 | ||
| 258 | 252 | ||
| 259 | /** | 253 | /* |
| 260 | * Initializes the MSI interrupt handling code | 254 | * Initializes the MSI interrupt handling code |
| 261 | * | ||
| 262 | * @return | ||
| 263 | */ | 255 | */ |
| 264 | int octeon_msi_initialize(void) | 256 | int octeon_msi_initialize(void) |
| 265 | { | 257 | { |
| 266 | int r; | ||
| 267 | if (octeon_has_feature(OCTEON_FEATURE_PCIE)) { | 258 | if (octeon_has_feature(OCTEON_FEATURE_PCIE)) { |
| 268 | r = request_irq(OCTEON_IRQ_PCI_MSI0, octeon_msi_interrupt, | 259 | if (request_irq(OCTEON_IRQ_PCI_MSI0, octeon_msi_interrupt, |
| 269 | IRQF_SHARED, | 260 | IRQF_SHARED, |
| 270 | "MSI[0:63]", octeon_msi_interrupt); | 261 | "MSI[0:63]", octeon_msi_interrupt)) |
| 262 | panic("request_irq(OCTEON_IRQ_PCI_MSI0) failed"); | ||
| 271 | } else if (octeon_is_pci_host()) { | 263 | } else if (octeon_is_pci_host()) { |
| 272 | r = request_irq(OCTEON_IRQ_PCI_MSI0, octeon_msi_interrupt, | 264 | if (request_irq(OCTEON_IRQ_PCI_MSI0, octeon_msi_interrupt, |
| 273 | IRQF_SHARED, | 265 | IRQF_SHARED, |
| 274 | "MSI[0:15]", octeon_msi_interrupt); | 266 | "MSI[0:15]", octeon_msi_interrupt)) |
| 275 | r += request_irq(OCTEON_IRQ_PCI_MSI1, octeon_msi_interrupt, | 267 | panic("request_irq(OCTEON_IRQ_PCI_MSI0) failed"); |
| 276 | IRQF_SHARED, | 268 | |
| 277 | "MSI[16:31]", octeon_msi_interrupt); | 269 | if (request_irq(OCTEON_IRQ_PCI_MSI1, octeon_msi_interrupt, |
| 278 | r += request_irq(OCTEON_IRQ_PCI_MSI2, octeon_msi_interrupt, | 270 | IRQF_SHARED, |
| 279 | IRQF_SHARED, | 271 | "MSI[16:31]", octeon_msi_interrupt)) |
| 280 | "MSI[32:47]", octeon_msi_interrupt); | 272 | panic("request_irq(OCTEON_IRQ_PCI_MSI1) failed"); |
| 281 | r += request_irq(OCTEON_IRQ_PCI_MSI3, octeon_msi_interrupt, | 273 | |
| 282 | IRQF_SHARED, | 274 | if (request_irq(OCTEON_IRQ_PCI_MSI2, octeon_msi_interrupt, |
| 283 | "MSI[48:63]", octeon_msi_interrupt); | 275 | IRQF_SHARED, |
| 276 | "MSI[32:47]", octeon_msi_interrupt)) | ||
| 277 | panic("request_irq(OCTEON_IRQ_PCI_MSI2) failed"); | ||
| 278 | |||
| 279 | if (request_irq(OCTEON_IRQ_PCI_MSI3, octeon_msi_interrupt, | ||
| 280 | IRQF_SHARED, | ||
| 281 | "MSI[48:63]", octeon_msi_interrupt)) | ||
| 282 | panic("request_irq(OCTEON_IRQ_PCI_MSI3) failed"); | ||
| 283 | |||
| 284 | } | 284 | } |
| 285 | return 0; | 285 | return 0; |
| 286 | } | 286 | } |
diff --git a/arch/mips/pci/ops-vr41xx.c b/arch/mips/pci/ops-vr41xx.c index 900c6b32576c..28962a7c6606 100644 --- a/arch/mips/pci/ops-vr41xx.c +++ b/arch/mips/pci/ops-vr41xx.c | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * ops-vr41xx.c, PCI configuration routines for the PCIU of NEC VR4100 series. | 2 | * ops-vr41xx.c, PCI configuration routines for the PCIU of NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001-2003 MontaVista Software Inc. | 4 | * Copyright (C) 2001-2003 MontaVista Software Inc. |
| 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com> | 5 | * Author: Yoichi Yuasa <source@mvista.com> |
| 6 | * Copyright (C) 2004-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 6 | * Copyright (C) 2004-2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 7 | * | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
| @@ -21,7 +21,7 @@ | |||
| 21 | */ | 21 | */ |
| 22 | /* | 22 | /* |
| 23 | * Changes: | 23 | * Changes: |
| 24 | * MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com> | 24 | * MontaVista Software Inc. <source@mvista.com> |
| 25 | * - New creation, NEC VR4122 and VR4131 are supported. | 25 | * - New creation, NEC VR4122 and VR4131 are supported. |
| 26 | */ | 26 | */ |
| 27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
diff --git a/arch/mips/cavium-octeon/pci.c b/arch/mips/pci/pci-octeon.c index 67c0ff5e92f1..9cb0c807f564 100644 --- a/arch/mips/cavium-octeon/pci.c +++ b/arch/mips/pci/pci-octeon.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2005-2007 Cavium Networks | 6 | * Copyright (C) 2005-2009 Cavium Networks |
| 7 | */ | 7 | */ |
| 8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
| 9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
| @@ -17,8 +17,7 @@ | |||
| 17 | #include <asm/octeon/octeon.h> | 17 | #include <asm/octeon/octeon.h> |
| 18 | #include <asm/octeon/cvmx-npi-defs.h> | 18 | #include <asm/octeon/cvmx-npi-defs.h> |
| 19 | #include <asm/octeon/cvmx-pci-defs.h> | 19 | #include <asm/octeon/cvmx-pci-defs.h> |
| 20 | 20 | #include <asm/octeon/pci-octeon.h> | |
| 21 | #include "pci-common.h" | ||
| 22 | 21 | ||
| 23 | #define USE_OCTEON_INTERNAL_ARBITER | 22 | #define USE_OCTEON_INTERNAL_ARBITER |
| 24 | 23 | ||
| @@ -54,6 +53,126 @@ union octeon_pci_address { | |||
| 54 | } s; | 53 | } s; |
| 55 | }; | 54 | }; |
| 56 | 55 | ||
| 56 | int __initdata (*octeon_pcibios_map_irq)(const struct pci_dev *dev, | ||
| 57 | u8 slot, u8 pin); | ||
| 58 | enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID; | ||
| 59 | |||
| 60 | /** | ||
| 61 | * Map a PCI device to the appropriate interrupt line | ||
| 62 | * | ||
| 63 | * @dev: The Linux PCI device structure for the device to map | ||
| 64 | * @slot: The slot number for this device on __BUS 0__. Linux | ||
| 65 | * enumerates through all the bridges and figures out the | ||
| 66 | * slot on Bus 0 where this device eventually hooks to. | ||
| 67 | * @pin: The PCI interrupt pin read from the device, then swizzled | ||
| 68 | * as it goes through each bridge. | ||
| 69 | * Returns Interrupt number for the device | ||
| 70 | */ | ||
| 71 | int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||
| 72 | { | ||
| 73 | if (octeon_pcibios_map_irq) | ||
| 74 | return octeon_pcibios_map_irq(dev, slot, pin); | ||
| 75 | else | ||
| 76 | panic("octeon_pcibios_map_irq not set."); | ||
| 77 | } | ||
| 78 | |||
| 79 | |||
| 80 | /* | ||
| 81 | * Called to perform platform specific PCI setup | ||
| 82 | */ | ||
| 83 | int pcibios_plat_dev_init(struct pci_dev *dev) | ||
| 84 | { | ||
| 85 | uint16_t config; | ||
| 86 | uint32_t dconfig; | ||
| 87 | int pos; | ||
| 88 | /* | ||
| 89 | * Force the Cache line setting to 64 bytes. The standard | ||
| 90 | * Linux bus scan doesn't seem to set it. Octeon really has | ||
| 91 | * 128 byte lines, but Intel bridges get really upset if you | ||
| 92 | * try and set values above 64 bytes. Value is specified in | ||
| 93 | * 32bit words. | ||
| 94 | */ | ||
| 95 | pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 64 / 4); | ||
| 96 | /* Set latency timers for all devices */ | ||
| 97 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 48); | ||
| 98 | |||
| 99 | /* Enable reporting System errors and parity errors on all devices */ | ||
| 100 | /* Enable parity checking and error reporting */ | ||
| 101 | pci_read_config_word(dev, PCI_COMMAND, &config); | ||
| 102 | config |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR; | ||
| 103 | pci_write_config_word(dev, PCI_COMMAND, config); | ||
| 104 | |||
| 105 | if (dev->subordinate) { | ||
| 106 | /* Set latency timers on sub bridges */ | ||
| 107 | pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 48); | ||
| 108 | /* More bridge error detection */ | ||
| 109 | pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &config); | ||
| 110 | config |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR; | ||
| 111 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, config); | ||
| 112 | } | ||
| 113 | |||
| 114 | /* Enable the PCIe normal error reporting */ | ||
| 115 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | ||
| 116 | if (pos) { | ||
| 117 | /* Update Device Control */ | ||
| 118 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &config); | ||
| 119 | /* Correctable Error Reporting */ | ||
| 120 | config |= PCI_EXP_DEVCTL_CERE; | ||
| 121 | /* Non-Fatal Error Reporting */ | ||
| 122 | config |= PCI_EXP_DEVCTL_NFERE; | ||
| 123 | /* Fatal Error Reporting */ | ||
| 124 | config |= PCI_EXP_DEVCTL_FERE; | ||
| 125 | /* Unsupported Request */ | ||
| 126 | config |= PCI_EXP_DEVCTL_URRE; | ||
| 127 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, config); | ||
| 128 | } | ||
| 129 | |||
| 130 | /* Find the Advanced Error Reporting capability */ | ||
| 131 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); | ||
| 132 | if (pos) { | ||
| 133 | /* Clear Uncorrectable Error Status */ | ||
| 134 | pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, | ||
| 135 | &dconfig); | ||
| 136 | pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, | ||
| 137 | dconfig); | ||
| 138 | /* Enable reporting of all uncorrectable errors */ | ||
| 139 | /* Uncorrectable Error Mask - turned on bits disable errors */ | ||
| 140 | pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, 0); | ||
| 141 | /* | ||
| 142 | * Leave severity at HW default. This only controls if | ||
| 143 | * errors are reported as uncorrectable or | ||
| 144 | * correctable, not if the error is reported. | ||
| 145 | */ | ||
| 146 | /* PCI_ERR_UNCOR_SEVER - Uncorrectable Error Severity */ | ||
| 147 | /* Clear Correctable Error Status */ | ||
| 148 | pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &dconfig); | ||
| 149 | pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, dconfig); | ||
| 150 | /* Enable reporting of all correctable errors */ | ||
| 151 | /* Correctable Error Mask - turned on bits disable errors */ | ||
| 152 | pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, 0); | ||
| 153 | /* Advanced Error Capabilities */ | ||
| 154 | pci_read_config_dword(dev, pos + PCI_ERR_CAP, &dconfig); | ||
| 155 | /* ECRC Generation Enable */ | ||
| 156 | if (config & PCI_ERR_CAP_ECRC_GENC) | ||
| 157 | config |= PCI_ERR_CAP_ECRC_GENE; | ||
| 158 | /* ECRC Check Enable */ | ||
| 159 | if (config & PCI_ERR_CAP_ECRC_CHKC) | ||
| 160 | config |= PCI_ERR_CAP_ECRC_CHKE; | ||
| 161 | pci_write_config_dword(dev, pos + PCI_ERR_CAP, dconfig); | ||
| 162 | /* PCI_ERR_HEADER_LOG - Header Log Register (16 bytes) */ | ||
| 163 | /* Report all errors to the root complex */ | ||
| 164 | pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, | ||
| 165 | PCI_ERR_ROOT_CMD_COR_EN | | ||
| 166 | PCI_ERR_ROOT_CMD_NONFATAL_EN | | ||
| 167 | PCI_ERR_ROOT_CMD_FATAL_EN); | ||
| 168 | /* Clear the Root status register */ | ||
| 169 | pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &dconfig); | ||
| 170 | pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, dconfig); | ||
| 171 | } | ||
| 172 | |||
| 173 | return 0; | ||
| 174 | } | ||
| 175 | |||
| 57 | /** | 176 | /** |
| 58 | * Return the mapping of PCI device number to IRQ line. Each | 177 | * Return the mapping of PCI device number to IRQ line. Each |
| 59 | * character in the return string represents the interrupt | 178 | * character in the return string represents the interrupt |
| @@ -136,9 +255,8 @@ int __init octeon_pci_pcibios_map_irq(const struct pci_dev *dev, | |||
| 136 | } | 255 | } |
| 137 | 256 | ||
| 138 | 257 | ||
| 139 | /** | 258 | /* |
| 140 | * Read a value from configuration space | 259 | * Read a value from configuration space |
| 141 | * | ||
| 142 | */ | 260 | */ |
| 143 | static int octeon_read_config(struct pci_bus *bus, unsigned int devfn, | 261 | static int octeon_read_config(struct pci_bus *bus, unsigned int devfn, |
| 144 | int reg, int size, u32 *val) | 262 | int reg, int size, u32 *val) |
| @@ -174,15 +292,8 @@ static int octeon_read_config(struct pci_bus *bus, unsigned int devfn, | |||
| 174 | } | 292 | } |
| 175 | 293 | ||
| 176 | 294 | ||
| 177 | /** | 295 | /* |
| 178 | * Write a value to PCI configuration space | 296 | * Write a value to PCI configuration space |
| 179 | * | ||
| 180 | * @bus: | ||
| 181 | * @devfn: | ||
| 182 | * @reg: | ||
| 183 | * @size: | ||
| 184 | * @val: | ||
| 185 | * Returns | ||
| 186 | */ | 297 | */ |
| 187 | static int octeon_write_config(struct pci_bus *bus, unsigned int devfn, | 298 | static int octeon_write_config(struct pci_bus *bus, unsigned int devfn, |
| 188 | int reg, int size, u32 val) | 299 | int reg, int size, u32 val) |
| @@ -251,10 +362,8 @@ static struct pci_controller octeon_pci_controller = { | |||
| 251 | }; | 362 | }; |
| 252 | 363 | ||
| 253 | 364 | ||
| 254 | /** | 365 | /* |
| 255 | * Low level initialize the Octeon PCI controller | 366 | * Low level initialize the Octeon PCI controller |
| 256 | * | ||
| 257 | * Returns | ||
| 258 | */ | 367 | */ |
| 259 | static void octeon_pci_initialize(void) | 368 | static void octeon_pci_initialize(void) |
| 260 | { | 369 | { |
| @@ -398,7 +507,7 @@ static void octeon_pci_initialize(void) | |||
| 398 | pci_int_arb_cfg.s.en = 1; /* Internal arbiter enable */ | 507 | pci_int_arb_cfg.s.en = 1; /* Internal arbiter enable */ |
| 399 | cvmx_write_csr(CVMX_NPI_PCI_INT_ARB_CFG, pci_int_arb_cfg.u64); | 508 | cvmx_write_csr(CVMX_NPI_PCI_INT_ARB_CFG, pci_int_arb_cfg.u64); |
| 400 | } | 509 | } |
| 401 | #endif /* USE_OCTEON_INTERNAL_ARBITER */ | 510 | #endif /* USE_OCTEON_INTERNAL_ARBITER */ |
| 402 | 511 | ||
| 403 | /* | 512 | /* |
| 404 | * Preferrably written to 1 to set MLTD. [RDSATI,TRTAE, | 513 | * Preferrably written to 1 to set MLTD. [RDSATI,TRTAE, |
| @@ -457,10 +566,8 @@ static void octeon_pci_initialize(void) | |||
| 457 | } | 566 | } |
| 458 | 567 | ||
| 459 | 568 | ||
| 460 | /** | 569 | /* |
| 461 | * Initialize the Octeon PCI controller | 570 | * Initialize the Octeon PCI controller |
| 462 | * | ||
| 463 | * Returns | ||
| 464 | */ | 571 | */ |
| 465 | static int __init octeon_pci_setup(void) | 572 | static int __init octeon_pci_setup(void) |
| 466 | { | 573 | { |
diff --git a/arch/mips/pci/pci-vr41xx.c b/arch/mips/pci/pci-vr41xx.c index d1e049b55f34..56525711f8b7 100644 --- a/arch/mips/pci/pci-vr41xx.c +++ b/arch/mips/pci/pci-vr41xx.c | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * pci-vr41xx.c, PCI Control Unit routines for the NEC VR4100 series. | 2 | * pci-vr41xx.c, PCI Control Unit routines for the NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001-2003 MontaVista Software Inc. | 4 | * Copyright (C) 2001-2003 MontaVista Software Inc. |
| 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com> | 5 | * Author: Yoichi Yuasa <source@mvista.com> |
| 6 | * Copyright (C) 2004-2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 6 | * Copyright (C) 2004-2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 7 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) | 7 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) |
| 8 | * | 8 | * |
| 9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
| @@ -22,7 +22,7 @@ | |||
| 22 | */ | 22 | */ |
| 23 | /* | 23 | /* |
| 24 | * Changes: | 24 | * Changes: |
| 25 | * MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com> | 25 | * MontaVista Software Inc. <source@mvista.com> |
| 26 | * - New creation, NEC VR4122 and VR4131 are supported. | 26 | * - New creation, NEC VR4122 and VR4131 are supported. |
| 27 | */ | 27 | */ |
| 28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
diff --git a/arch/mips/pci/pci-vr41xx.h b/arch/mips/pci/pci-vr41xx.h index 8a35e32b8376..6b1ae2eb1c06 100644 --- a/arch/mips/pci/pci-vr41xx.h +++ b/arch/mips/pci/pci-vr41xx.h | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * pci-vr41xx.h, Include file for PCI Control Unit of the NEC VR4100 series. | 2 | * pci-vr41xx.h, Include file for PCI Control Unit of the NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002 MontaVista Software Inc. | 4 | * Copyright (C) 2002 MontaVista Software Inc. |
| 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com> | 5 | * Author: Yoichi Yuasa <source@mvista.com> |
| 6 | * Copyright (C) 2004-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 6 | * Copyright (C) 2004-2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 7 | * | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/cavium-octeon/pcie.c b/arch/mips/pci/pcie-octeon.c index 49d14081b3b5..75262247f3e4 100644 --- a/arch/mips/cavium-octeon/pcie.c +++ b/arch/mips/pci/pcie-octeon.c | |||
| @@ -18,8 +18,7 @@ | |||
| 18 | #include <asm/octeon/cvmx-pescx-defs.h> | 18 | #include <asm/octeon/cvmx-pescx-defs.h> |
| 19 | #include <asm/octeon/cvmx-pexp-defs.h> | 19 | #include <asm/octeon/cvmx-pexp-defs.h> |
| 20 | #include <asm/octeon/cvmx-helper-errata.h> | 20 | #include <asm/octeon/cvmx-helper-errata.h> |
| 21 | 21 | #include <asm/octeon/pci-octeon.h> | |
| 22 | #include "pci-common.h" | ||
| 23 | 22 | ||
| 24 | union cvmx_pcie_address { | 23 | union cvmx_pcie_address { |
| 25 | uint64_t u64; | 24 | uint64_t u64; |
| @@ -976,13 +975,13 @@ static int cvmx_pcie_rc_initialize(int pcie_port) | |||
| 976 | /** | 975 | /** |
| 977 | * Map a PCI device to the appropriate interrupt line | 976 | * Map a PCI device to the appropriate interrupt line |
| 978 | * | 977 | * |
| 979 | * @param dev The Linux PCI device structure for the device to map | 978 | * @dev: The Linux PCI device structure for the device to map |
| 980 | * @param slot The slot number for this device on __BUS 0__. Linux | 979 | * @slot: The slot number for this device on __BUS 0__. Linux |
| 981 | * enumerates through all the bridges and figures out the | 980 | * enumerates through all the bridges and figures out the |
| 982 | * slot on Bus 0 where this device eventually hooks to. | 981 | * slot on Bus 0 where this device eventually hooks to. |
| 983 | * @param pin The PCI interrupt pin read from the device, then swizzled | 982 | * @pin: The PCI interrupt pin read from the device, then swizzled |
| 984 | * as it goes through each bridge. | 983 | * as it goes through each bridge. |
| 985 | * @return Interrupt number for the device | 984 | * Returns Interrupt number for the device |
| 986 | */ | 985 | */ |
| 987 | int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev, | 986 | int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev, |
| 988 | u8 slot, u8 pin) | 987 | u8 slot, u8 pin) |
| @@ -1025,12 +1024,12 @@ int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev, | |||
| 1025 | /** | 1024 | /** |
| 1026 | * Read a value from configuration space | 1025 | * Read a value from configuration space |
| 1027 | * | 1026 | * |
| 1028 | * @param bus | 1027 | * @bus: |
| 1029 | * @param devfn | 1028 | * @devfn: |
| 1030 | * @param reg | 1029 | * @reg: |
| 1031 | * @param size | 1030 | * @size: |
| 1032 | * @param val | 1031 | * @val: |
| 1033 | * @return | 1032 | * Returns |
| 1034 | */ | 1033 | */ |
| 1035 | static inline int octeon_pcie_read_config(int pcie_port, struct pci_bus *bus, | 1034 | static inline int octeon_pcie_read_config(int pcie_port, struct pci_bus *bus, |
| 1036 | unsigned int devfn, int reg, int size, | 1035 | unsigned int devfn, int reg, int size, |
| @@ -1156,12 +1155,12 @@ static int octeon_pcie1_read_config(struct pci_bus *bus, unsigned int devfn, | |||
| 1156 | /** | 1155 | /** |
| 1157 | * Write a value to PCI configuration space | 1156 | * Write a value to PCI configuration space |
| 1158 | * | 1157 | * |
| 1159 | * @param bus | 1158 | * @bus: |
| 1160 | * @param devfn | 1159 | * @devfn: |
| 1161 | * @param reg | 1160 | * @reg: |
| 1162 | * @param size | 1161 | * @size: |
| 1163 | * @param val | 1162 | * @val: |
| 1164 | * @return | 1163 | * Returns |
| 1165 | */ | 1164 | */ |
| 1166 | static inline int octeon_pcie_write_config(int pcie_port, struct pci_bus *bus, | 1165 | static inline int octeon_pcie_write_config(int pcie_port, struct pci_bus *bus, |
| 1167 | unsigned int devfn, int reg, | 1166 | unsigned int devfn, int reg, |
| @@ -1254,7 +1253,7 @@ static struct pci_controller octeon_pcie1_controller = { | |||
| 1254 | /** | 1253 | /** |
| 1255 | * Initialize the Octeon PCIe controllers | 1254 | * Initialize the Octeon PCIe controllers |
| 1256 | * | 1255 | * |
| 1257 | * @return | 1256 | * Returns |
| 1258 | */ | 1257 | */ |
| 1259 | static int __init octeon_pcie_setup(void) | 1258 | static int __init octeon_pcie_setup(void) |
| 1260 | { | 1259 | { |
diff --git a/arch/mips/vr41xx/casio-e55/setup.c b/arch/mips/vr41xx/casio-e55/setup.c index 6d9bab890587..719f4a5b9844 100644 --- a/arch/mips/vr41xx/casio-e55/setup.c +++ b/arch/mips/vr41xx/casio-e55/setup.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * setup.c, Setup for the CASIO CASSIOPEIA E-11/15/55/65. | 2 | * setup.c, Setup for the CASIO CASSIOPEIA E-11/15/55/65. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002-2006 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002-2006 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/common/bcu.c b/arch/mips/vr41xx/common/bcu.c index d77c330a0d59..6346c59c9f9d 100644 --- a/arch/mips/vr41xx/common/bcu.c +++ b/arch/mips/vr41xx/common/bcu.c | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * bcu.c, Bus Control Unit routines for the NEC VR4100 series. | 2 | * bcu.c, Bus Control Unit routines for the NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002 MontaVista Software Inc. | 4 | * Copyright (C) 2002 MontaVista Software Inc. |
| 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com, or source@mvista.com> | 5 | * Author: Yoichi Yuasa <source@mvista.com> |
| 6 | * Copyright (C) 2003-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 6 | * Copyright (C) 2003-2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 7 | * | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
| @@ -21,11 +21,11 @@ | |||
| 21 | */ | 21 | */ |
| 22 | /* | 22 | /* |
| 23 | * Changes: | 23 | * Changes: |
| 24 | * MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com> | 24 | * MontaVista Software Inc. <source@mvista.com> |
| 25 | * - New creation, NEC VR4122 and VR4131 are supported. | 25 | * - New creation, NEC VR4122 and VR4131 are supported. |
| 26 | * - Added support for NEC VR4111 and VR4121. | 26 | * - Added support for NEC VR4111 and VR4121. |
| 27 | * | 27 | * |
| 28 | * Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 28 | * Yoichi Yuasa <yuasa@linux-mips.org> |
| 29 | * - Added support for NEC VR4133. | 29 | * - Added support for NEC VR4133. |
| 30 | */ | 30 | */ |
| 31 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
diff --git a/arch/mips/vr41xx/common/cmu.c b/arch/mips/vr41xx/common/cmu.c index ad0e8e3409d9..8ba7d04a5ec5 100644 --- a/arch/mips/vr41xx/common/cmu.c +++ b/arch/mips/vr41xx/common/cmu.c | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * cmu.c, Clock Mask Unit routines for the NEC VR4100 series. | 2 | * cmu.c, Clock Mask Unit routines for the NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001-2002 MontaVista Software Inc. | 4 | * Copyright (C) 2001-2002 MontaVista Software Inc. |
| 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com> | 5 | * Author: Yoichi Yuasa <source@mvista.com> |
| 6 | * Copuright (C) 2003-2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 6 | * Copuright (C) 2003-2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 7 | * | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
| @@ -21,11 +21,11 @@ | |||
| 21 | */ | 21 | */ |
| 22 | /* | 22 | /* |
| 23 | * Changes: | 23 | * Changes: |
| 24 | * MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com> | 24 | * MontaVista Software Inc. <source@mvista.com> |
| 25 | * - New creation, NEC VR4122 and VR4131 are supported. | 25 | * - New creation, NEC VR4122 and VR4131 are supported. |
| 26 | * - Added support for NEC VR4111 and VR4121. | 26 | * - Added support for NEC VR4111 and VR4121. |
| 27 | * | 27 | * |
| 28 | * Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 28 | * Yoichi Yuasa <yuasa@linux-mips.org> |
| 29 | * - Added support for NEC VR4133. | 29 | * - Added support for NEC VR4133. |
| 30 | */ | 30 | */ |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
diff --git a/arch/mips/vr41xx/common/giu.c b/arch/mips/vr41xx/common/giu.c index 2b272f1496fe..22cc6f2100a1 100644 --- a/arch/mips/vr41xx/common/giu.c +++ b/arch/mips/vr41xx/common/giu.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * NEC VR4100 series GIU platform device. | 2 | * NEC VR4100 series GIU platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/common/icu.c b/arch/mips/vr41xx/common/icu.c index 3f23d9fda662..6d39e222b170 100644 --- a/arch/mips/vr41xx/common/icu.c +++ b/arch/mips/vr41xx/common/icu.c | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * icu.c, Interrupt Control Unit routines for the NEC VR4100 series. | 2 | * icu.c, Interrupt Control Unit routines for the NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001-2002 MontaVista Software Inc. | 4 | * Copyright (C) 2001-2002 MontaVista Software Inc. |
| 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com> | 5 | * Author: Yoichi Yuasa <source@mvista.com> |
| 6 | * Copyright (C) 2003-2006 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 6 | * Copyright (C) 2003-2006 Yoichi Yuasa <yuasa@linux-mips.org> |
| 7 | * | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
| @@ -21,11 +21,11 @@ | |||
| 21 | */ | 21 | */ |
| 22 | /* | 22 | /* |
| 23 | * Changes: | 23 | * Changes: |
| 24 | * MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com> | 24 | * MontaVista Software Inc. <source@mvista.com> |
| 25 | * - New creation, NEC VR4122 and VR4131 are supported. | 25 | * - New creation, NEC VR4122 and VR4131 are supported. |
| 26 | * - Added support for NEC VR4111 and VR4121. | 26 | * - Added support for NEC VR4111 and VR4121. |
| 27 | * | 27 | * |
| 28 | * Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 28 | * Yoichi Yuasa <yuasa@linux-mips.org> |
| 29 | * - Coped with INTASSIGN of NEC VR4133. | 29 | * - Coped with INTASSIGN of NEC VR4133. |
| 30 | */ | 30 | */ |
| 31 | #include <linux/errno.h> | 31 | #include <linux/errno.h> |
diff --git a/arch/mips/vr41xx/common/init.c b/arch/mips/vr41xx/common/init.c index c64995342ba8..1386e6f081c8 100644 --- a/arch/mips/vr41xx/common/init.c +++ b/arch/mips/vr41xx/common/init.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * init.c, Common initialization routines for NEC VR4100 series. | 2 | * init.c, Common initialization routines for NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2003-2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2003-2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/common/irq.c b/arch/mips/vr41xx/common/irq.c index 9cc389109b19..bef06872f012 100644 --- a/arch/mips/vr41xx/common/irq.c +++ b/arch/mips/vr41xx/common/irq.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Interrupt handing routines for NEC VR4100 series. | 2 | * Interrupt handing routines for NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005-2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2005-2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/common/pmu.c b/arch/mips/vr41xx/common/pmu.c index 028aaf75eb21..692b4e85b7fc 100644 --- a/arch/mips/vr41xx/common/pmu.c +++ b/arch/mips/vr41xx/common/pmu.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pmu.c, Power Management Unit routines for NEC VR4100 series. | 2 | * pmu.c, Power Management Unit routines for NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2003-2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2003-2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/common/rtc.c b/arch/mips/vr41xx/common/rtc.c index 9f26c14edcac..ebc5dcf0ed8e 100644 --- a/arch/mips/vr41xx/common/rtc.c +++ b/arch/mips/vr41xx/common/rtc.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * NEC VR4100 series RTC platform device. | 2 | * NEC VR4100 series RTC platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/common/siu.c b/arch/mips/vr41xx/common/siu.c index 654dee6208be..54eae56108fb 100644 --- a/arch/mips/vr41xx/common/siu.c +++ b/arch/mips/vr41xx/common/siu.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * NEC VR4100 series SIU platform device. | 2 | * NEC VR4100 series SIU platform device. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007-2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/common/type.c b/arch/mips/vr41xx/common/type.c index e0c1ac5e988e..ff841422b638 100644 --- a/arch/mips/vr41xx/common/type.c +++ b/arch/mips/vr41xx/common/type.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * type.c, System type for NEC VR4100 series. | 2 | * type.c, System type for NEC VR4100 series. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2005 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/vr41xx/ibm-workpad/setup.c b/arch/mips/vr41xx/ibm-workpad/setup.c index 9eef297eca1a..3982f378a3e6 100644 --- a/arch/mips/vr41xx/ibm-workpad/setup.c +++ b/arch/mips/vr41xx/ibm-workpad/setup.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * setup.c, Setup for the IBM WorkPad z50. | 2 | * setup.c, Setup for the IBM WorkPad z50. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2002-2006 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2002-2006 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h index fef5b434dadc..fad68616af32 100644 --- a/arch/mn10300/include/asm/unistd.h +++ b/arch/mn10300/include/asm/unistd.h | |||
| @@ -346,10 +346,12 @@ | |||
| 346 | #define __NR_inotify_init1 333 | 346 | #define __NR_inotify_init1 333 |
| 347 | #define __NR_preadv 334 | 347 | #define __NR_preadv 334 |
| 348 | #define __NR_pwritev 335 | 348 | #define __NR_pwritev 335 |
| 349 | #define __NR_rt_tgsigqueueinfo 336 | ||
| 350 | #define __NR_perf_counter_open 337 | ||
| 349 | 351 | ||
| 350 | #ifdef __KERNEL__ | 352 | #ifdef __KERNEL__ |
| 351 | 353 | ||
| 352 | #define NR_syscalls 326 | 354 | #define NR_syscalls 338 |
| 353 | 355 | ||
| 354 | /* | 356 | /* |
| 355 | * specify the deprecated syscalls we want to support on this arch | 357 | * specify the deprecated syscalls we want to support on this arch |
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index 7408a27199f3..e0d2563af4f2 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S | |||
| @@ -722,6 +722,8 @@ ENTRY(sys_call_table) | |||
| 722 | .long sys_inotify_init1 | 722 | .long sys_inotify_init1 |
| 723 | .long sys_preadv | 723 | .long sys_preadv |
| 724 | .long sys_pwritev /* 335 */ | 724 | .long sys_pwritev /* 335 */ |
| 725 | .long sys_rt_tgsigqueueinfo | ||
| 726 | .long sys_perf_counter_open | ||
| 725 | 727 | ||
| 726 | 728 | ||
| 727 | nr_syscalls=(.-sys_call_table)/4 | 729 | nr_syscalls=(.-sys_call_table)/4 |
diff --git a/arch/mn10300/kernel/vmlinux.lds.S b/arch/mn10300/kernel/vmlinux.lds.S index bcebcefb4ad7..c96ba3da95ac 100644 --- a/arch/mn10300/kernel/vmlinux.lds.S +++ b/arch/mn10300/kernel/vmlinux.lds.S | |||
| @@ -61,7 +61,7 @@ SECTIONS | |||
| 61 | _edata = .; /* End of data section */ | 61 | _edata = .; /* End of data section */ |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | .data.init_task : { INIT_TASK(THREAD_SIZE); } | 64 | .data.init_task : { INIT_TASK_DATA(THREAD_SIZE); } |
| 65 | 65 | ||
| 66 | /* might get freed after init */ | 66 | /* might get freed after init */ |
| 67 | . = ALIGN(PAGE_SIZE); | 67 | . = ALIGN(PAGE_SIZE); |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 9038f39d9d73..06f8d5b5b0f9 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
| @@ -16,6 +16,8 @@ config PARISC | |||
| 16 | select RTC_DRV_GENERIC | 16 | select RTC_DRV_GENERIC |
| 17 | select INIT_ALL_POSSIBLE | 17 | select INIT_ALL_POSSIBLE |
| 18 | select BUG | 18 | select BUG |
| 19 | select HAVE_PERF_COUNTERS | ||
| 20 | select GENERIC_ATOMIC64 if !64BIT | ||
| 19 | help | 21 | help |
| 20 | The PA-RISC microprocessor is designed by Hewlett-Packard and used | 22 | The PA-RISC microprocessor is designed by Hewlett-Packard and used |
| 21 | in many of their workstations & servers (HP9000 700 and 800 series, | 23 | in many of their workstations & servers (HP9000 700 and 800 series, |
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h index 7eeaff944360..8bc9e96699b2 100644 --- a/arch/parisc/include/asm/atomic.h +++ b/arch/parisc/include/asm/atomic.h | |||
| @@ -222,13 +222,13 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | |||
| 222 | 222 | ||
| 223 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 223 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
| 224 | 224 | ||
| 225 | #define atomic_add(i,v) ((void)(__atomic_add_return( ((int)(i)),(v)))) | 225 | #define atomic_add(i,v) ((void)(__atomic_add_return( (i),(v)))) |
| 226 | #define atomic_sub(i,v) ((void)(__atomic_add_return(-((int)(i)),(v)))) | 226 | #define atomic_sub(i,v) ((void)(__atomic_add_return(-(i),(v)))) |
| 227 | #define atomic_inc(v) ((void)(__atomic_add_return( 1,(v)))) | 227 | #define atomic_inc(v) ((void)(__atomic_add_return( 1,(v)))) |
| 228 | #define atomic_dec(v) ((void)(__atomic_add_return( -1,(v)))) | 228 | #define atomic_dec(v) ((void)(__atomic_add_return( -1,(v)))) |
| 229 | 229 | ||
| 230 | #define atomic_add_return(i,v) (__atomic_add_return( ((int)(i)),(v))) | 230 | #define atomic_add_return(i,v) (__atomic_add_return( (i),(v))) |
| 231 | #define atomic_sub_return(i,v) (__atomic_add_return(-((int)(i)),(v))) | 231 | #define atomic_sub_return(i,v) (__atomic_add_return(-(i),(v))) |
| 232 | #define atomic_inc_return(v) (__atomic_add_return( 1,(v))) | 232 | #define atomic_inc_return(v) (__atomic_add_return( 1,(v))) |
| 233 | #define atomic_dec_return(v) (__atomic_add_return( -1,(v))) | 233 | #define atomic_dec_return(v) (__atomic_add_return( -1,(v))) |
| 234 | 234 | ||
| @@ -336,7 +336,11 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) | |||
| 336 | 336 | ||
| 337 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) | 337 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) |
| 338 | 338 | ||
| 339 | #endif /* CONFIG_64BIT */ | 339 | #else /* CONFIG_64BIT */ |
| 340 | |||
| 341 | #include <asm-generic/atomic64.h> | ||
| 342 | |||
| 343 | #endif /* !CONFIG_64BIT */ | ||
| 340 | 344 | ||
| 341 | #include <asm-generic/atomic-long.h> | 345 | #include <asm-generic/atomic-long.h> |
| 342 | 346 | ||
diff --git a/arch/parisc/include/asm/dma.h b/arch/parisc/include/asm/dma.h index 31ad0f05af3d..f7a18f968703 100644 --- a/arch/parisc/include/asm/dma.h +++ b/arch/parisc/include/asm/dma.h | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* $Id: dma.h,v 1.2 1999/04/27 00:46:18 deller Exp $ | 1 | /* asm/dma.h: Defines for using and allocating dma channels. |
| 2 | * linux/include/asm/dma.h: Defines for using and allocating dma channels. | ||
| 3 | * Written by Hennus Bergman, 1992. | 2 | * Written by Hennus Bergman, 1992. |
| 4 | * High DMA channel support & info by Hannu Savolainen | 3 | * High DMA channel support & info by Hannu Savolainen |
| 5 | * and John Boyd, Nov. 1992. | 4 | * and John Boyd, Nov. 1992. |
diff --git a/arch/parisc/include/asm/perf_counter.h b/arch/parisc/include/asm/perf_counter.h new file mode 100644 index 000000000000..dc9e829f7013 --- /dev/null +++ b/arch/parisc/include/asm/perf_counter.h | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #ifndef __ASM_PARISC_PERF_COUNTER_H | ||
| 2 | #define __ASM_PARISC_PERF_COUNTER_H | ||
| 3 | |||
| 4 | /* parisc only supports software counters through this interface. */ | ||
| 5 | static inline void set_perf_counter_pending(void) { } | ||
| 6 | |||
| 7 | #endif /* __ASM_PARISC_PERF_COUNTER_H */ | ||
diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h index 9d64df8754ba..9ce66e9d1c2b 100644 --- a/arch/parisc/include/asm/processor.h +++ b/arch/parisc/include/asm/processor.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <asm/types.h> | 18 | #include <asm/types.h> |
| 19 | #include <asm/system.h> | 19 | #include <asm/system.h> |
| 20 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
| 21 | |||
| 21 | #endif /* __ASSEMBLY__ */ | 22 | #endif /* __ASSEMBLY__ */ |
| 22 | 23 | ||
| 23 | #define KERNEL_STACK_SIZE (4*PAGE_SIZE) | 24 | #define KERNEL_STACK_SIZE (4*PAGE_SIZE) |
| @@ -127,6 +128,8 @@ struct thread_struct { | |||
| 127 | unsigned long flags; | 128 | unsigned long flags; |
| 128 | }; | 129 | }; |
| 129 | 130 | ||
| 131 | #define task_pt_regs(tsk) ((struct pt_regs *)&((tsk)->thread.regs)) | ||
| 132 | |||
| 130 | /* Thread struct flags. */ | 133 | /* Thread struct flags. */ |
| 131 | #define PARISC_UAC_NOPRINT (1UL << 0) /* see prctl and unaligned.c */ | 134 | #define PARISC_UAC_NOPRINT (1UL << 0) /* see prctl and unaligned.c */ |
| 132 | #define PARISC_UAC_SIGBUS (1UL << 1) | 135 | #define PARISC_UAC_SIGBUS (1UL << 1) |
diff --git a/arch/parisc/include/asm/system.h b/arch/parisc/include/asm/system.h index ee80c920b464..d91357bca5b4 100644 --- a/arch/parisc/include/asm/system.h +++ b/arch/parisc/include/asm/system.h | |||
| @@ -168,8 +168,8 @@ static inline void set_eiem(unsigned long val) | |||
| 168 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ | 168 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ |
| 169 | #define __ldcw(a) ({ \ | 169 | #define __ldcw(a) ({ \ |
| 170 | unsigned __ret; \ | 170 | unsigned __ret; \ |
| 171 | __asm__ __volatile__(__LDCW " 0(%1),%0" \ | 171 | __asm__ __volatile__(__LDCW " 0(%2),%0" \ |
| 172 | : "=r" (__ret) : "r" (a)); \ | 172 | : "=r" (__ret), "+m" (*(a)) : "r" (a)); \ |
| 173 | __ret; \ | 173 | __ret; \ |
| 174 | }) | 174 | }) |
| 175 | 175 | ||
diff --git a/arch/parisc/include/asm/tlbflush.h b/arch/parisc/include/asm/tlbflush.h index 1f6fd4fc05b9..8f1a8100bf2d 100644 --- a/arch/parisc/include/asm/tlbflush.h +++ b/arch/parisc/include/asm/tlbflush.h | |||
| @@ -12,14 +12,12 @@ | |||
| 12 | * N class systems, only one PxTLB inter processor broadcast can be | 12 | * N class systems, only one PxTLB inter processor broadcast can be |
| 13 | * active at any one time on the Merced bus. This tlb purge | 13 | * active at any one time on the Merced bus. This tlb purge |
| 14 | * synchronisation is fairly lightweight and harmless so we activate | 14 | * synchronisation is fairly lightweight and harmless so we activate |
| 15 | * it on all SMP systems not just the N class. We also need to have | 15 | * it on all systems not just the N class. |
| 16 | * preemption disabled on uniprocessor machines, and spin_lock does that | ||
| 17 | * nicely. | ||
| 18 | */ | 16 | */ |
| 19 | extern spinlock_t pa_tlb_lock; | 17 | extern spinlock_t pa_tlb_lock; |
| 20 | 18 | ||
| 21 | #define purge_tlb_start(x) spin_lock(&pa_tlb_lock) | 19 | #define purge_tlb_start(flags) spin_lock_irqsave(&pa_tlb_lock, flags) |
| 22 | #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) | 20 | #define purge_tlb_end(flags) spin_unlock_irqrestore(&pa_tlb_lock, flags) |
| 23 | 21 | ||
| 24 | extern void flush_tlb_all(void); | 22 | extern void flush_tlb_all(void); |
| 25 | extern void flush_tlb_all_local(void *); | 23 | extern void flush_tlb_all_local(void *); |
| @@ -63,14 +61,16 @@ static inline void flush_tlb_mm(struct mm_struct *mm) | |||
| 63 | static inline void flush_tlb_page(struct vm_area_struct *vma, | 61 | static inline void flush_tlb_page(struct vm_area_struct *vma, |
| 64 | unsigned long addr) | 62 | unsigned long addr) |
| 65 | { | 63 | { |
| 64 | unsigned long flags; | ||
| 65 | |||
| 66 | /* For one page, it's not worth testing the split_tlb variable */ | 66 | /* For one page, it's not worth testing the split_tlb variable */ |
| 67 | 67 | ||
| 68 | mb(); | 68 | mb(); |
| 69 | mtsp(vma->vm_mm->context,1); | 69 | mtsp(vma->vm_mm->context,1); |
| 70 | purge_tlb_start(); | 70 | purge_tlb_start(flags); |
| 71 | pdtlb(addr); | 71 | pdtlb(addr); |
| 72 | pitlb(addr); | 72 | pitlb(addr); |
| 73 | purge_tlb_end(); | 73 | purge_tlb_end(flags); |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | void __flush_tlb_range(unsigned long sid, | 76 | void __flush_tlb_range(unsigned long sid, |
diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h index ef26b009dc5d..f3d3b8b012c4 100644 --- a/arch/parisc/include/asm/unistd.h +++ b/arch/parisc/include/asm/unistd.h | |||
| @@ -807,8 +807,12 @@ | |||
| 807 | #define __NR_dup3 (__NR_Linux + 312) | 807 | #define __NR_dup3 (__NR_Linux + 312) |
| 808 | #define __NR_pipe2 (__NR_Linux + 313) | 808 | #define __NR_pipe2 (__NR_Linux + 313) |
| 809 | #define __NR_inotify_init1 (__NR_Linux + 314) | 809 | #define __NR_inotify_init1 (__NR_Linux + 314) |
| 810 | #define __NR_preadv (__NR_Linux + 315) | ||
| 811 | #define __NR_pwritev (__NR_Linux + 316) | ||
| 812 | #define __NR_rt_tgsigqueueinfo (__NR_Linux + 317) | ||
| 813 | #define __NR_perf_counter_open (__NR_Linux + 318) | ||
| 810 | 814 | ||
| 811 | #define __NR_Linux_syscalls (__NR_inotify_init1 + 1) | 815 | #define __NR_Linux_syscalls (__NR_perf_counter_open + 1) |
| 812 | 816 | ||
| 813 | 817 | ||
| 814 | #define __IGNORE_select /* newselect */ | 818 | #define __IGNORE_select /* newselect */ |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 837530ea32e7..b6ed34de14e1 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* $Id: cache.c,v 1.4 2000/01/25 00:11:38 prumpf Exp $ | 1 | /* |
| 2 | * | ||
| 3 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
| 4 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 5 | * for more details. | 4 | * for more details. |
| @@ -398,12 +397,13 @@ EXPORT_SYMBOL(flush_kernel_icache_range_asm); | |||
| 398 | 397 | ||
| 399 | void clear_user_page_asm(void *page, unsigned long vaddr) | 398 | void clear_user_page_asm(void *page, unsigned long vaddr) |
| 400 | { | 399 | { |
| 400 | unsigned long flags; | ||
| 401 | /* This function is implemented in assembly in pacache.S */ | 401 | /* This function is implemented in assembly in pacache.S */ |
| 402 | extern void __clear_user_page_asm(void *page, unsigned long vaddr); | 402 | extern void __clear_user_page_asm(void *page, unsigned long vaddr); |
| 403 | 403 | ||
| 404 | purge_tlb_start(); | 404 | purge_tlb_start(flags); |
| 405 | __clear_user_page_asm(page, vaddr); | 405 | __clear_user_page_asm(page, vaddr); |
| 406 | purge_tlb_end(); | 406 | purge_tlb_end(flags); |
| 407 | } | 407 | } |
| 408 | 408 | ||
| 409 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ | 409 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ |
| @@ -444,20 +444,24 @@ extern void clear_user_page_asm(void *page, unsigned long vaddr); | |||
| 444 | 444 | ||
| 445 | void clear_user_page(void *page, unsigned long vaddr, struct page *pg) | 445 | void clear_user_page(void *page, unsigned long vaddr, struct page *pg) |
| 446 | { | 446 | { |
| 447 | unsigned long flags; | ||
| 448 | |||
| 447 | purge_kernel_dcache_page((unsigned long)page); | 449 | purge_kernel_dcache_page((unsigned long)page); |
| 448 | purge_tlb_start(); | 450 | purge_tlb_start(flags); |
| 449 | pdtlb_kernel(page); | 451 | pdtlb_kernel(page); |
| 450 | purge_tlb_end(); | 452 | purge_tlb_end(flags); |
| 451 | clear_user_page_asm(page, vaddr); | 453 | clear_user_page_asm(page, vaddr); |
| 452 | } | 454 | } |
| 453 | EXPORT_SYMBOL(clear_user_page); | 455 | EXPORT_SYMBOL(clear_user_page); |
| 454 | 456 | ||
| 455 | void flush_kernel_dcache_page_addr(void *addr) | 457 | void flush_kernel_dcache_page_addr(void *addr) |
| 456 | { | 458 | { |
| 459 | unsigned long flags; | ||
| 460 | |||
| 457 | flush_kernel_dcache_page_asm(addr); | 461 | flush_kernel_dcache_page_asm(addr); |
| 458 | purge_tlb_start(); | 462 | purge_tlb_start(flags); |
| 459 | pdtlb_kernel(addr); | 463 | pdtlb_kernel(addr); |
| 460 | purge_tlb_end(); | 464 | purge_tlb_end(flags); |
| 461 | } | 465 | } |
| 462 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); | 466 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); |
| 463 | 467 | ||
| @@ -490,8 +494,10 @@ void __flush_tlb_range(unsigned long sid, unsigned long start, | |||
| 490 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ | 494 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ |
| 491 | flush_tlb_all(); | 495 | flush_tlb_all(); |
| 492 | else { | 496 | else { |
| 497 | unsigned long flags; | ||
| 498 | |||
| 493 | mtsp(sid, 1); | 499 | mtsp(sid, 1); |
| 494 | purge_tlb_start(); | 500 | purge_tlb_start(flags); |
| 495 | if (split_tlb) { | 501 | if (split_tlb) { |
| 496 | while (npages--) { | 502 | while (npages--) { |
| 497 | pdtlb(start); | 503 | pdtlb(start); |
| @@ -504,7 +510,7 @@ void __flush_tlb_range(unsigned long sid, unsigned long start, | |||
| 504 | start += PAGE_SIZE; | 510 | start += PAGE_SIZE; |
| 505 | } | 511 | } |
| 506 | } | 512 | } |
| 507 | purge_tlb_end(); | 513 | purge_tlb_end(flags); |
| 508 | } | 514 | } |
| 509 | } | 515 | } |
| 510 | 516 | ||
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index bd1f7f1ff74e..d228d8237879 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c | |||
| @@ -170,23 +170,27 @@ static void __init pagezero_memconfig(void) | |||
| 170 | static int __init | 170 | static int __init |
| 171 | pat_query_module(ulong pcell_loc, ulong mod_index) | 171 | pat_query_module(ulong pcell_loc, ulong mod_index) |
| 172 | { | 172 | { |
| 173 | pdc_pat_cell_mod_maddr_block_t pa_pdc_cell; | 173 | pdc_pat_cell_mod_maddr_block_t *pa_pdc_cell; |
| 174 | unsigned long bytecnt; | 174 | unsigned long bytecnt; |
| 175 | unsigned long temp; /* 64-bit scratch value */ | 175 | unsigned long temp; /* 64-bit scratch value */ |
| 176 | long status; /* PDC return value status */ | 176 | long status; /* PDC return value status */ |
| 177 | struct parisc_device *dev; | 177 | struct parisc_device *dev; |
| 178 | 178 | ||
| 179 | pa_pdc_cell = kmalloc(sizeof (*pa_pdc_cell), GFP_KERNEL); | ||
| 180 | if (!pa_pdc_cell) | ||
| 181 | panic("couldn't allocate memory for PDC_PAT_CELL!"); | ||
| 182 | |||
| 179 | /* return cell module (PA or Processor view) */ | 183 | /* return cell module (PA or Processor view) */ |
| 180 | status = pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, | 184 | status = pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, |
| 181 | PA_VIEW, &pa_pdc_cell); | 185 | PA_VIEW, pa_pdc_cell); |
| 182 | 186 | ||
| 183 | if (status != PDC_OK) { | 187 | if (status != PDC_OK) { |
| 184 | /* no more cell modules or error */ | 188 | /* no more cell modules or error */ |
| 185 | return status; | 189 | return status; |
| 186 | } | 190 | } |
| 187 | 191 | ||
| 188 | temp = pa_pdc_cell.cba; | 192 | temp = pa_pdc_cell->cba; |
| 189 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &pa_pdc_cell.mod_path); | 193 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &(pa_pdc_cell->mod_path)); |
| 190 | if (!dev) { | 194 | if (!dev) { |
| 191 | return PDC_OK; | 195 | return PDC_OK; |
| 192 | } | 196 | } |
| @@ -203,8 +207,8 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
| 203 | 207 | ||
| 204 | /* save generic info returned from the call */ | 208 | /* save generic info returned from the call */ |
| 205 | /* REVISIT: who is the consumer of this? not sure yet... */ | 209 | /* REVISIT: who is the consumer of this? not sure yet... */ |
| 206 | dev->mod_info = pa_pdc_cell.mod_info; /* pass to PAT_GET_ENTITY() */ | 210 | dev->mod_info = pa_pdc_cell->mod_info; /* pass to PAT_GET_ENTITY() */ |
| 207 | dev->pmod_loc = pa_pdc_cell.mod_location; | 211 | dev->pmod_loc = pa_pdc_cell->mod_location; |
| 208 | 212 | ||
| 209 | register_parisc_device(dev); /* advertise device */ | 213 | register_parisc_device(dev); /* advertise device */ |
| 210 | 214 | ||
| @@ -216,14 +220,14 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
| 216 | 220 | ||
| 217 | case PAT_ENTITY_PROC: | 221 | case PAT_ENTITY_PROC: |
| 218 | printk(KERN_DEBUG "PAT_ENTITY_PROC: id_eid 0x%lx\n", | 222 | printk(KERN_DEBUG "PAT_ENTITY_PROC: id_eid 0x%lx\n", |
| 219 | pa_pdc_cell.mod[0]); | 223 | pa_pdc_cell->mod[0]); |
| 220 | break; | 224 | break; |
| 221 | 225 | ||
| 222 | case PAT_ENTITY_MEM: | 226 | case PAT_ENTITY_MEM: |
| 223 | printk(KERN_DEBUG | 227 | printk(KERN_DEBUG |
| 224 | "PAT_ENTITY_MEM: amount 0x%lx min_gni_base 0x%lx min_gni_len 0x%lx\n", | 228 | "PAT_ENTITY_MEM: amount 0x%lx min_gni_base 0x%lx min_gni_len 0x%lx\n", |
| 225 | pa_pdc_cell.mod[0], pa_pdc_cell.mod[1], | 229 | pa_pdc_cell->mod[0], pa_pdc_cell->mod[1], |
| 226 | pa_pdc_cell.mod[2]); | 230 | pa_pdc_cell->mod[2]); |
| 227 | break; | 231 | break; |
| 228 | case PAT_ENTITY_CA: | 232 | case PAT_ENTITY_CA: |
| 229 | printk(KERN_DEBUG "PAT_ENTITY_CA: %ld\n", pcell_loc); | 233 | printk(KERN_DEBUG "PAT_ENTITY_CA: %ld\n", pcell_loc); |
| @@ -243,23 +247,26 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
| 243 | print_ranges: | 247 | print_ranges: |
| 244 | pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, | 248 | pdc_pat_cell_module(&bytecnt, pcell_loc, mod_index, |
| 245 | IO_VIEW, &io_pdc_cell); | 249 | IO_VIEW, &io_pdc_cell); |
| 246 | printk(KERN_DEBUG "ranges %ld\n", pa_pdc_cell.mod[1]); | 250 | printk(KERN_DEBUG "ranges %ld\n", pa_pdc_cell->mod[1]); |
| 247 | for (i = 0; i < pa_pdc_cell.mod[1]; i++) { | 251 | for (i = 0; i < pa_pdc_cell->mod[1]; i++) { |
| 248 | printk(KERN_DEBUG | 252 | printk(KERN_DEBUG |
| 249 | " PA_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", | 253 | " PA_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", |
| 250 | i, pa_pdc_cell.mod[2 + i * 3], /* type */ | 254 | i, pa_pdc_cell->mod[2 + i * 3], /* type */ |
| 251 | pa_pdc_cell.mod[3 + i * 3], /* start */ | 255 | pa_pdc_cell->mod[3 + i * 3], /* start */ |
| 252 | pa_pdc_cell.mod[4 + i * 3]); /* finish (ie end) */ | 256 | pa_pdc_cell->mod[4 + i * 3]); /* finish (ie end) */ |
| 253 | printk(KERN_DEBUG | 257 | printk(KERN_DEBUG |
| 254 | " IO_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", | 258 | " IO_VIEW %ld: 0x%016lx 0x%016lx 0x%016lx\n", |
| 255 | i, io_pdc_cell.mod[2 + i * 3], /* type */ | 259 | i, io_pdc_cell->mod[2 + i * 3], /* type */ |
| 256 | io_pdc_cell.mod[3 + i * 3], /* start */ | 260 | io_pdc_cell->mod[3 + i * 3], /* start */ |
| 257 | io_pdc_cell.mod[4 + i * 3]); /* finish (ie end) */ | 261 | io_pdc_cell->mod[4 + i * 3]); /* finish (ie end) */ |
| 258 | } | 262 | } |
| 259 | printk(KERN_DEBUG "\n"); | 263 | printk(KERN_DEBUG "\n"); |
| 260 | break; | 264 | break; |
| 261 | } | 265 | } |
| 262 | #endif /* DEBUG_PAT */ | 266 | #endif /* DEBUG_PAT */ |
| 267 | |||
| 268 | kfree(pa_pdc_cell); | ||
| 269 | |||
| 263 | return PDC_OK; | 270 | return PDC_OK; |
| 264 | } | 271 | } |
| 265 | 272 | ||
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 8007f1e65729..330f536a9324 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
| @@ -120,7 +120,7 @@ int cpu_check_affinity(unsigned int irq, const struct cpumask *dest) | |||
| 120 | if (CHECK_IRQ_PER_CPU(irq)) { | 120 | if (CHECK_IRQ_PER_CPU(irq)) { |
| 121 | /* Bad linux design decision. The mask has already | 121 | /* Bad linux design decision. The mask has already |
| 122 | * been set; we must reset it */ | 122 | * been set; we must reset it */ |
| 123 | cpumask_setall(&irq_desc[irq].affinity); | 123 | cpumask_setall(irq_desc[irq].affinity); |
| 124 | return -EINVAL; | 124 | return -EINVAL; |
| 125 | } | 125 | } |
| 126 | 126 | ||
| @@ -138,13 +138,13 @@ static int cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) | |||
| 138 | if (cpu_dest < 0) | 138 | if (cpu_dest < 0) |
| 139 | return -1; | 139 | return -1; |
| 140 | 140 | ||
| 141 | cpumask_copy(&irq_desc[irq].affinity, dest); | 141 | cpumask_copy(irq_desc[irq].affinity, dest); |
| 142 | 142 | ||
| 143 | return 0; | 143 | return 0; |
| 144 | } | 144 | } |
| 145 | #endif | 145 | #endif |
| 146 | 146 | ||
| 147 | static struct hw_interrupt_type cpu_interrupt_type = { | 147 | static struct irq_chip cpu_interrupt_type = { |
| 148 | .typename = "CPU", | 148 | .typename = "CPU", |
| 149 | .startup = cpu_startup_irq, | 149 | .startup = cpu_startup_irq, |
| 150 | .shutdown = cpu_disable_irq, | 150 | .shutdown = cpu_disable_irq, |
| @@ -299,7 +299,7 @@ int txn_alloc_irq(unsigned int bits_wide) | |||
| 299 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) | 299 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) |
| 300 | { | 300 | { |
| 301 | #ifdef CONFIG_SMP | 301 | #ifdef CONFIG_SMP |
| 302 | cpumask_copy(&irq_desc[irq].affinity, cpumask_of(cpu)); | 302 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
| 303 | #endif | 303 | #endif |
| 304 | 304 | ||
| 305 | return per_cpu(cpu_data, cpu).txn_addr; | 305 | return per_cpu(cpu_data, cpu).txn_addr; |
| @@ -356,7 +356,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
| 356 | irq = eirr_to_irq(eirr_val); | 356 | irq = eirr_to_irq(eirr_val); |
| 357 | 357 | ||
| 358 | #ifdef CONFIG_SMP | 358 | #ifdef CONFIG_SMP |
| 359 | cpumask_copy(&dest, &irq_desc[irq].affinity); | 359 | cpumask_copy(&dest, irq_desc[irq].affinity); |
| 360 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && | 360 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && |
| 361 | !cpu_isset(smp_processor_id(), dest)) { | 361 | !cpu_isset(smp_processor_id(), dest)) { |
| 362 | int cpu = first_cpu(dest); | 362 | int cpu = first_cpu(dest); |
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index 7d927eac932b..c07f618ff7da 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c | |||
| @@ -90,12 +90,14 @@ static inline int map_pte_uncached(pte_t * pte, | |||
| 90 | if (end > PMD_SIZE) | 90 | if (end > PMD_SIZE) |
| 91 | end = PMD_SIZE; | 91 | end = PMD_SIZE; |
| 92 | do { | 92 | do { |
| 93 | unsigned long flags; | ||
| 94 | |||
| 93 | if (!pte_none(*pte)) | 95 | if (!pte_none(*pte)) |
| 94 | printk(KERN_ERR "map_pte_uncached: page already exists\n"); | 96 | printk(KERN_ERR "map_pte_uncached: page already exists\n"); |
| 95 | set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC)); | 97 | set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC)); |
| 96 | purge_tlb_start(); | 98 | purge_tlb_start(flags); |
| 97 | pdtlb_kernel(orig_vaddr); | 99 | pdtlb_kernel(orig_vaddr); |
| 98 | purge_tlb_end(); | 100 | purge_tlb_end(flags); |
| 99 | vaddr += PAGE_SIZE; | 101 | vaddr += PAGE_SIZE; |
| 100 | orig_vaddr += PAGE_SIZE; | 102 | orig_vaddr += PAGE_SIZE; |
| 101 | (*paddr_ptr) += PAGE_SIZE; | 103 | (*paddr_ptr) += PAGE_SIZE; |
| @@ -168,11 +170,13 @@ static inline void unmap_uncached_pte(pmd_t * pmd, unsigned long vaddr, | |||
| 168 | if (end > PMD_SIZE) | 170 | if (end > PMD_SIZE) |
| 169 | end = PMD_SIZE; | 171 | end = PMD_SIZE; |
| 170 | do { | 172 | do { |
| 173 | unsigned long flags; | ||
| 171 | pte_t page = *pte; | 174 | pte_t page = *pte; |
| 175 | |||
| 172 | pte_clear(&init_mm, vaddr, pte); | 176 | pte_clear(&init_mm, vaddr, pte); |
| 173 | purge_tlb_start(); | 177 | purge_tlb_start(flags); |
| 174 | pdtlb_kernel(orig_vaddr); | 178 | pdtlb_kernel(orig_vaddr); |
| 175 | purge_tlb_end(); | 179 | purge_tlb_end(flags); |
| 176 | vaddr += PAGE_SIZE; | 180 | vaddr += PAGE_SIZE; |
| 177 | orig_vaddr += PAGE_SIZE; | 181 | orig_vaddr += PAGE_SIZE; |
| 178 | pte++; | 182 | pte++; |
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 6936386c9861..f7064abc3bb6 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* $Id: pci.c,v 1.6 2000/01/29 00:12:05 grundler Exp $ | 1 | /* |
| 2 | * | ||
| 3 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
| 4 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 5 | * for more details. | 4 | * for more details. |
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index e09d0f7fb6b0..c8fb61ed32f4 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* $Id: processor.c,v 1.1 2002/07/20 16:27:06 rhirst Exp $ | 1 | /* |
| 2 | * | ||
| 3 | * Initial setup-routines for HP 9000 based hardware. | 2 | * Initial setup-routines for HP 9000 based hardware. |
| 4 | * | 3 | * |
| 5 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | 4 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds |
| @@ -121,22 +120,28 @@ static int __cpuinit processor_probe(struct parisc_device *dev) | |||
| 121 | if (is_pdc_pat()) { | 120 | if (is_pdc_pat()) { |
| 122 | ulong status; | 121 | ulong status; |
| 123 | unsigned long bytecnt; | 122 | unsigned long bytecnt; |
| 124 | pdc_pat_cell_mod_maddr_block_t pa_pdc_cell; | 123 | pdc_pat_cell_mod_maddr_block_t *pa_pdc_cell; |
| 125 | #undef USE_PAT_CPUID | 124 | #undef USE_PAT_CPUID |
| 126 | #ifdef USE_PAT_CPUID | 125 | #ifdef USE_PAT_CPUID |
| 127 | struct pdc_pat_cpu_num cpu_info; | 126 | struct pdc_pat_cpu_num cpu_info; |
| 128 | #endif | 127 | #endif |
| 129 | 128 | ||
| 129 | pa_pdc_cell = kmalloc(sizeof (*pa_pdc_cell), GFP_KERNEL); | ||
| 130 | if (!pa_pdc_cell) | ||
| 131 | panic("couldn't allocate memory for PDC_PAT_CELL!"); | ||
| 132 | |||
| 130 | status = pdc_pat_cell_module(&bytecnt, dev->pcell_loc, | 133 | status = pdc_pat_cell_module(&bytecnt, dev->pcell_loc, |
| 131 | dev->mod_index, PA_VIEW, &pa_pdc_cell); | 134 | dev->mod_index, PA_VIEW, pa_pdc_cell); |
| 132 | 135 | ||
| 133 | BUG_ON(PDC_OK != status); | 136 | BUG_ON(PDC_OK != status); |
| 134 | 137 | ||
| 135 | /* verify it's the same as what do_pat_inventory() found */ | 138 | /* verify it's the same as what do_pat_inventory() found */ |
| 136 | BUG_ON(dev->mod_info != pa_pdc_cell.mod_info); | 139 | BUG_ON(dev->mod_info != pa_pdc_cell->mod_info); |
| 137 | BUG_ON(dev->pmod_loc != pa_pdc_cell.mod_location); | 140 | BUG_ON(dev->pmod_loc != pa_pdc_cell->mod_location); |
| 141 | |||
| 142 | txn_addr = pa_pdc_cell->mod[0]; /* id_eid for IO sapic */ | ||
| 138 | 143 | ||
| 139 | txn_addr = pa_pdc_cell.mod[0]; /* id_eid for IO sapic */ | 144 | kfree(pa_pdc_cell); |
| 140 | 145 | ||
| 141 | #ifdef USE_PAT_CPUID | 146 | #ifdef USE_PAT_CPUID |
| 142 | /* We need contiguous numbers for cpuid. Firmware's notion | 147 | /* We need contiguous numbers for cpuid. Firmware's notion |
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 82131ca8e05c..cb71f3dac995 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* $Id: setup.c,v 1.8 2000/02/02 04:42:38 prumpf Exp $ | 1 | /* |
| 2 | * | ||
| 3 | * Initial setup-routines for HP 9000 based hardware. | 2 | * Initial setup-routines for HP 9000 based hardware. |
| 4 | * | 3 | * |
| 5 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | 4 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds |
diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index 1adb40c81669..92a0acaa0d12 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c | |||
| @@ -174,68 +174,6 @@ asmlinkage long sys32_sched_rr_get_interval(pid_t pid, | |||
| 174 | return ret; | 174 | return ret; |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | /*** copied from mips64 ***/ | ||
| 178 | /* | ||
| 179 | * Ooo, nasty. We need here to frob 32-bit unsigned longs to | ||
| 180 | * 64-bit unsigned longs. | ||
| 181 | */ | ||
| 182 | |||
| 183 | static inline int | ||
| 184 | get_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset) | ||
| 185 | { | ||
| 186 | n = (n + 8*sizeof(u32) - 1) / (8*sizeof(u32)); | ||
| 187 | if (ufdset) { | ||
| 188 | unsigned long odd; | ||
| 189 | |||
| 190 | if (!access_ok(VERIFY_WRITE, ufdset, n*sizeof(u32))) | ||
| 191 | return -EFAULT; | ||
| 192 | |||
| 193 | odd = n & 1UL; | ||
| 194 | n &= ~1UL; | ||
| 195 | while (n) { | ||
| 196 | unsigned long h, l; | ||
| 197 | __get_user(l, ufdset); | ||
| 198 | __get_user(h, ufdset+1); | ||
| 199 | ufdset += 2; | ||
| 200 | *fdset++ = h << 32 | l; | ||
| 201 | n -= 2; | ||
| 202 | } | ||
| 203 | if (odd) | ||
| 204 | __get_user(*fdset, ufdset); | ||
| 205 | } else { | ||
| 206 | /* Tricky, must clear full unsigned long in the | ||
| 207 | * kernel fdset at the end, this makes sure that | ||
| 208 | * actually happens. | ||
| 209 | */ | ||
| 210 | memset(fdset, 0, ((n + 1) & ~1)*sizeof(u32)); | ||
| 211 | } | ||
| 212 | return 0; | ||
| 213 | } | ||
| 214 | |||
| 215 | static inline void | ||
| 216 | set_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset) | ||
| 217 | { | ||
| 218 | unsigned long odd; | ||
| 219 | n = (n + 8*sizeof(u32) - 1) / (8*sizeof(u32)); | ||
| 220 | |||
| 221 | if (!ufdset) | ||
| 222 | return; | ||
| 223 | |||
| 224 | odd = n & 1UL; | ||
| 225 | n &= ~1UL; | ||
| 226 | while (n) { | ||
| 227 | unsigned long h, l; | ||
| 228 | l = *fdset++; | ||
| 229 | h = l >> 32; | ||
| 230 | __put_user(l, ufdset); | ||
| 231 | __put_user(h, ufdset+1); | ||
| 232 | ufdset += 2; | ||
| 233 | n -= 2; | ||
| 234 | } | ||
| 235 | if (odd) | ||
| 236 | __put_user(*fdset, ufdset); | ||
| 237 | } | ||
| 238 | |||
| 239 | struct msgbuf32 { | 177 | struct msgbuf32 { |
| 240 | int mtype; | 178 | int mtype; |
| 241 | char mtext[1]; | 179 | char mtext[1]; |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 03b9a01bc16c..cf145eb026b3 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
| @@ -413,6 +413,10 @@ | |||
| 413 | ENTRY_SAME(dup3) | 413 | ENTRY_SAME(dup3) |
| 414 | ENTRY_SAME(pipe2) | 414 | ENTRY_SAME(pipe2) |
| 415 | ENTRY_SAME(inotify_init1) | 415 | ENTRY_SAME(inotify_init1) |
| 416 | ENTRY_COMP(preadv) /* 315 */ | ||
| 417 | ENTRY_COMP(pwritev) | ||
| 418 | ENTRY_COMP(rt_tgsigqueueinfo) | ||
| 419 | ENTRY_SAME(perf_counter_open) | ||
| 416 | 420 | ||
| 417 | /* Nothing yet */ | 421 | /* Nothing yet */ |
| 418 | 422 | ||
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index d4dd05674c62..a79c6f9e7e2c 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
| @@ -56,9 +56,9 @@ static unsigned long clocktick __read_mostly; /* timer cycles per tick */ | |||
| 56 | */ | 56 | */ |
| 57 | irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) | 57 | irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) |
| 58 | { | 58 | { |
| 59 | unsigned long now; | 59 | unsigned long now, now2; |
| 60 | unsigned long next_tick; | 60 | unsigned long next_tick; |
| 61 | unsigned long cycles_elapsed, ticks_elapsed; | 61 | unsigned long cycles_elapsed, ticks_elapsed = 1; |
| 62 | unsigned long cycles_remainder; | 62 | unsigned long cycles_remainder; |
| 63 | unsigned int cpu = smp_processor_id(); | 63 | unsigned int cpu = smp_processor_id(); |
| 64 | struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); | 64 | struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); |
| @@ -71,44 +71,24 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) | |||
| 71 | /* Initialize next_tick to the expected tick time. */ | 71 | /* Initialize next_tick to the expected tick time. */ |
| 72 | next_tick = cpuinfo->it_value; | 72 | next_tick = cpuinfo->it_value; |
| 73 | 73 | ||
| 74 | /* Get current interval timer. | 74 | /* Get current cycle counter (Control Register 16). */ |
| 75 | * CR16 reads as 64 bits in CPU wide mode. | ||
| 76 | * CR16 reads as 32 bits in CPU narrow mode. | ||
| 77 | */ | ||
| 78 | now = mfctl(16); | 75 | now = mfctl(16); |
| 79 | 76 | ||
| 80 | cycles_elapsed = now - next_tick; | 77 | cycles_elapsed = now - next_tick; |
| 81 | 78 | ||
| 82 | if ((cycles_elapsed >> 5) < cpt) { | 79 | if ((cycles_elapsed >> 6) < cpt) { |
| 83 | /* use "cheap" math (add/subtract) instead | 80 | /* use "cheap" math (add/subtract) instead |
| 84 | * of the more expensive div/mul method | 81 | * of the more expensive div/mul method |
| 85 | */ | 82 | */ |
| 86 | cycles_remainder = cycles_elapsed; | 83 | cycles_remainder = cycles_elapsed; |
| 87 | ticks_elapsed = 1; | ||
| 88 | while (cycles_remainder > cpt) { | 84 | while (cycles_remainder > cpt) { |
| 89 | cycles_remainder -= cpt; | 85 | cycles_remainder -= cpt; |
| 90 | ticks_elapsed++; | 86 | ticks_elapsed++; |
| 91 | } | 87 | } |
| 92 | } else { | 88 | } else { |
| 89 | /* TODO: Reduce this to one fdiv op */ | ||
| 93 | cycles_remainder = cycles_elapsed % cpt; | 90 | cycles_remainder = cycles_elapsed % cpt; |
| 94 | ticks_elapsed = 1 + cycles_elapsed / cpt; | 91 | ticks_elapsed += cycles_elapsed / cpt; |
| 95 | } | ||
| 96 | |||
| 97 | /* Can we differentiate between "early CR16" (aka Scenario 1) and | ||
| 98 | * "long delay" (aka Scenario 3)? I don't think so. | ||
| 99 | * | ||
| 100 | * We expected timer_interrupt to be delivered at least a few hundred | ||
| 101 | * cycles after the IT fires. But it's arbitrary how much time passes | ||
| 102 | * before we call it "late". I've picked one second. | ||
| 103 | */ | ||
| 104 | if (unlikely(ticks_elapsed > HZ)) { | ||
| 105 | /* Scenario 3: very long delay? bad in any case */ | ||
| 106 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" | ||
| 107 | " cycles %lX rem %lX " | ||
| 108 | " next/now %lX/%lX\n", | ||
| 109 | cpu, | ||
| 110 | cycles_elapsed, cycles_remainder, | ||
| 111 | next_tick, now ); | ||
| 112 | } | 92 | } |
| 113 | 93 | ||
| 114 | /* convert from "division remainder" to "remainder of clock tick" */ | 94 | /* convert from "division remainder" to "remainder of clock tick" */ |
| @@ -122,18 +102,56 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id) | |||
| 122 | 102 | ||
| 123 | cpuinfo->it_value = next_tick; | 103 | cpuinfo->it_value = next_tick; |
| 124 | 104 | ||
| 125 | /* Skip one clocktick on purpose if we are likely to miss next_tick. | 105 | /* Program the IT when to deliver the next interrupt. |
| 126 | * We want to avoid the new next_tick being less than CR16. | 106 | * Only bottom 32-bits of next_tick are writable in CR16! |
| 127 | * If that happened, itimer wouldn't fire until CR16 wrapped. | ||
| 128 | * We'll catch the tick we missed on the tick after that. | ||
| 129 | */ | 107 | */ |
| 130 | if (!(cycles_remainder >> 13)) | ||
| 131 | next_tick += cpt; | ||
| 132 | |||
| 133 | /* Program the IT when to deliver the next interrupt. */ | ||
| 134 | /* Only bottom 32-bits of next_tick are written to cr16. */ | ||
| 135 | mtctl(next_tick, 16); | 108 | mtctl(next_tick, 16); |
| 136 | 109 | ||
| 110 | /* Skip one clocktick on purpose if we missed next_tick. | ||
| 111 | * The new CR16 must be "later" than current CR16 otherwise | ||
| 112 | * itimer would not fire until CR16 wrapped - e.g 4 seconds | ||
| 113 | * later on a 1Ghz processor. We'll account for the missed | ||
| 114 | * tick on the next timer interrupt. | ||
| 115 | * | ||
| 116 | * "next_tick - now" will always give the difference regardless | ||
| 117 | * if one or the other wrapped. If "now" is "bigger" we'll end up | ||
| 118 | * with a very large unsigned number. | ||
| 119 | */ | ||
| 120 | now2 = mfctl(16); | ||
| 121 | if (next_tick - now2 > cpt) | ||
| 122 | mtctl(next_tick+cpt, 16); | ||
| 123 | |||
| 124 | #if 1 | ||
| 125 | /* | ||
| 126 | * GGG: DEBUG code for how many cycles programming CR16 used. | ||
| 127 | */ | ||
| 128 | if (unlikely(now2 - now > 0x3000)) /* 12K cycles */ | ||
| 129 | printk (KERN_CRIT "timer_interrupt(CPU %d): SLOW! 0x%lx cycles!" | ||
| 130 | " cyc %lX rem %lX " | ||
| 131 | " next/now %lX/%lX\n", | ||
| 132 | cpu, now2 - now, cycles_elapsed, cycles_remainder, | ||
| 133 | next_tick, now ); | ||
| 134 | #endif | ||
| 135 | |||
| 136 | /* Can we differentiate between "early CR16" (aka Scenario 1) and | ||
| 137 | * "long delay" (aka Scenario 3)? I don't think so. | ||
| 138 | * | ||
| 139 | * Timer_interrupt will be delivered at least a few hundred cycles | ||
| 140 | * after the IT fires. But it's arbitrary how much time passes | ||
| 141 | * before we call it "late". I've picked one second. | ||
| 142 | * | ||
| 143 | * It's important NO printk's are between reading CR16 and | ||
| 144 | * setting up the next value. May introduce huge variance. | ||
| 145 | */ | ||
| 146 | if (unlikely(ticks_elapsed > HZ)) { | ||
| 147 | /* Scenario 3: very long delay? bad in any case */ | ||
| 148 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" | ||
| 149 | " cycles %lX rem %lX " | ||
| 150 | " next/now %lX/%lX\n", | ||
| 151 | cpu, | ||
| 152 | cycles_elapsed, cycles_remainder, | ||
| 153 | next_tick, now ); | ||
| 154 | } | ||
| 137 | 155 | ||
| 138 | /* Done mucking with unreliable delivery of interrupts. | 156 | /* Done mucking with unreliable delivery of interrupts. |
| 139 | * Go do system house keeping. | 157 | * Go do system house keeping. |
| @@ -173,7 +191,7 @@ EXPORT_SYMBOL(profile_pc); | |||
| 173 | 191 | ||
| 174 | /* clock source code */ | 192 | /* clock source code */ |
| 175 | 193 | ||
| 176 | static cycle_t read_cr16(void) | 194 | static cycle_t read_cr16(struct clocksource *cs) |
| 177 | { | 195 | { |
| 178 | return get_cycles(); | 196 | return get_cycles(); |
| 179 | } | 197 | } |
diff --git a/arch/parisc/lib/checksum.c b/arch/parisc/lib/checksum.c index 462696d30d3b..ae66d31f9ecf 100644 --- a/arch/parisc/lib/checksum.c +++ b/arch/parisc/lib/checksum.c | |||
| @@ -13,8 +13,6 @@ | |||
| 13 | * modify it under the terms of the GNU General Public License | 13 | * modify it under the terms of the GNU General Public License |
| 14 | * as published by the Free Software Foundation; either version | 14 | * as published by the Free Software Foundation; either version |
| 15 | * 2 of the License, or (at your option) any later version. | 15 | * 2 of the License, or (at your option) any later version. |
| 16 | * | ||
| 17 | * $Id: checksum.c,v 1.3 1997/12/01 17:57:34 ralf Exp $ | ||
| 18 | */ | 16 | */ |
| 19 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 20 | #include <linux/types.h> | 18 | #include <linux/types.h> |
diff --git a/arch/parisc/lib/memcpy.c b/arch/parisc/lib/memcpy.c index bbda909c866e..abf41f4632a9 100644 --- a/arch/parisc/lib/memcpy.c +++ b/arch/parisc/lib/memcpy.c | |||
| @@ -405,7 +405,7 @@ byte_copy: | |||
| 405 | 405 | ||
| 406 | unaligned_copy: | 406 | unaligned_copy: |
| 407 | /* possibly we are aligned on a word, but not on a double... */ | 407 | /* possibly we are aligned on a word, but not on a double... */ |
| 408 | if (likely(t1 & (sizeof(unsigned int)-1)) == 0) { | 408 | if (likely((t1 & (sizeof(unsigned int)-1)) == 0)) { |
| 409 | t2 = src & (sizeof(unsigned int) - 1); | 409 | t2 = src & (sizeof(unsigned int) - 1); |
| 410 | 410 | ||
| 411 | if (unlikely(t2 != 0)) { | 411 | if (unlikely(t2 != 0)) { |
diff --git a/arch/parisc/math-emu/decode_exc.c b/arch/parisc/math-emu/decode_exc.c index 66c8a9f6a27e..3ca1c6149218 100644 --- a/arch/parisc/math-emu/decode_exc.c +++ b/arch/parisc/math-emu/decode_exc.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | * END_DESC | 40 | * END_DESC |
| 41 | */ | 41 | */ |
| 42 | 42 | ||
| 43 | 43 | #include <linux/kernel.h> | |
| 44 | #include "float.h" | 44 | #include "float.h" |
| 45 | #include "sgl_float.h" | 45 | #include "sgl_float.h" |
| 46 | #include "dbl_float.h" | 46 | #include "dbl_float.h" |
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index bfb6dd6ab380..c6afbfc95770 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* $Id: fault.c,v 1.5 2000/01/26 16:20:29 jsm Exp $ | 1 | /* |
| 2 | * | ||
| 3 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
| 4 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 5 | * for more details. | 4 | * for more details. |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index 4356ceb1e366..b0831d9e35cb 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
| @@ -370,34 +370,22 @@ static void __init setup_bootmem(void) | |||
| 370 | 370 | ||
| 371 | void free_initmem(void) | 371 | void free_initmem(void) |
| 372 | { | 372 | { |
| 373 | unsigned long addr, init_begin, init_end; | 373 | unsigned long addr; |
| 374 | 374 | unsigned long init_begin = (unsigned long)__init_begin; | |
| 375 | printk(KERN_INFO "Freeing unused kernel memory: "); | 375 | unsigned long init_end = (unsigned long)__init_end; |
| 376 | 376 | ||
| 377 | #ifdef CONFIG_DEBUG_KERNEL | 377 | #ifdef CONFIG_DEBUG_KERNEL |
| 378 | /* Attempt to catch anyone trying to execute code here | 378 | /* Attempt to catch anyone trying to execute code here |
| 379 | * by filling the page with BRK insns. | 379 | * by filling the page with BRK insns. |
| 380 | * | ||
| 381 | * If we disable interrupts for all CPUs, then IPI stops working. | ||
| 382 | * Kinda breaks the global cache flushing. | ||
| 383 | */ | 380 | */ |
| 384 | local_irq_disable(); | 381 | memset((void *)init_begin, 0x00, init_end - init_begin); |
| 385 | 382 | flush_icache_range(init_begin, init_end); | |
| 386 | memset(__init_begin, 0x00, | ||
| 387 | (unsigned long)__init_end - (unsigned long)__init_begin); | ||
| 388 | |||
| 389 | flush_data_cache(); | ||
| 390 | asm volatile("sync" : : ); | ||
| 391 | flush_icache_range((unsigned long)__init_begin, (unsigned long)__init_end); | ||
| 392 | asm volatile("sync" : : ); | ||
| 393 | |||
| 394 | local_irq_enable(); | ||
| 395 | #endif | 383 | #endif |
| 396 | 384 | ||
| 397 | /* align __init_begin and __init_end to page size, | 385 | /* align __init_begin and __init_end to page size, |
| 398 | ignoring linker script where we might have tried to save RAM */ | 386 | ignoring linker script where we might have tried to save RAM */ |
| 399 | init_begin = PAGE_ALIGN((unsigned long)(__init_begin)); | 387 | init_begin = PAGE_ALIGN(init_begin); |
| 400 | init_end = PAGE_ALIGN((unsigned long)(__init_end)); | 388 | init_end = PAGE_ALIGN(init_end); |
| 401 | for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) { | 389 | for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) { |
| 402 | ClearPageReserved(virt_to_page(addr)); | 390 | ClearPageReserved(virt_to_page(addr)); |
| 403 | init_page_count(virt_to_page(addr)); | 391 | init_page_count(virt_to_page(addr)); |
| @@ -409,7 +397,8 @@ void free_initmem(void) | |||
| 409 | /* set up a new led state on systems shipped LED State panel */ | 397 | /* set up a new led state on systems shipped LED State panel */ |
| 410 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE); | 398 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE); |
| 411 | 399 | ||
| 412 | printk("%luk freed\n", (init_end - init_begin) >> 10); | 400 | printk(KERN_INFO "Freeing unused kernel memory: %luk freed\n", |
| 401 | (init_end - init_begin) >> 10); | ||
| 413 | } | 402 | } |
| 414 | 403 | ||
| 415 | 404 | ||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index bf6cedfa05db..d00131ca0835 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -62,7 +62,6 @@ config HAVE_LATENCYTOP_SUPPORT | |||
| 62 | 62 | ||
| 63 | config TRACE_IRQFLAGS_SUPPORT | 63 | config TRACE_IRQFLAGS_SUPPORT |
| 64 | bool | 64 | bool |
| 65 | depends on PPC64 | ||
| 66 | default y | 65 | default y |
| 67 | 66 | ||
| 68 | config LOCKDEP_SUPPORT | 67 | config LOCKDEP_SUPPORT |
diff --git a/arch/powerpc/boot/.gitignore b/arch/powerpc/boot/.gitignore index 2f50acd11a60..3d80c3e9cf60 100644 --- a/arch/powerpc/boot/.gitignore +++ b/arch/powerpc/boot/.gitignore | |||
| @@ -36,3 +36,13 @@ zImage.pseries | |||
| 36 | zconf.h | 36 | zconf.h |
| 37 | zlib.h | 37 | zlib.h |
| 38 | zutil.h | 38 | zutil.h |
| 39 | fdt.c | ||
| 40 | fdt.h | ||
| 41 | fdt_ro.c | ||
| 42 | fdt_rw.c | ||
| 43 | fdt_strerror.c | ||
| 44 | fdt_sw.c | ||
| 45 | fdt_wip.c | ||
| 46 | libfdt.h | ||
| 47 | libfdt_internal.h | ||
| 48 | |||
diff --git a/arch/powerpc/boot/dts/amigaone.dts b/arch/powerpc/boot/dts/amigaone.dts index 26549fca2ed4..49ac36b16dd7 100644 --- a/arch/powerpc/boot/dts/amigaone.dts +++ b/arch/powerpc/boot/dts/amigaone.dts | |||
| @@ -70,8 +70,8 @@ | |||
| 70 | devsel-speed = <0x00000001>; | 70 | devsel-speed = <0x00000001>; |
| 71 | min-grant = <0>; | 71 | min-grant = <0>; |
| 72 | max-latency = <0>; | 72 | max-latency = <0>; |
| 73 | /* First 64k for I/O at 0x0 on PCI mapped to 0x0 on ISA. */ | 73 | /* First 4k for I/O at 0x0 on PCI mapped to 0x0 on ISA. */ |
| 74 | ranges = <0x00000001 0 0x01000000 0 0x00000000 0x00010000>; | 74 | ranges = <0x00000001 0 0x01000000 0 0x00000000 0x00001000>; |
| 75 | interrupt-parent = <&i8259>; | 75 | interrupt-parent = <&i8259>; |
| 76 | #interrupt-cells = <2>; | 76 | #interrupt-cells = <2>; |
| 77 | #address-cells = <2>; | 77 | #address-cells = <2>; |
diff --git a/arch/powerpc/boot/dts/mpc8569mds.dts b/arch/powerpc/boot/dts/mpc8569mds.dts index a8dcb018c4a5..a680165292f2 100644 --- a/arch/powerpc/boot/dts/mpc8569mds.dts +++ b/arch/powerpc/boot/dts/mpc8569mds.dts | |||
| @@ -253,6 +253,7 @@ | |||
| 253 | /* Filled in by U-Boot */ | 253 | /* Filled in by U-Boot */ |
| 254 | clock-frequency = <0>; | 254 | clock-frequency = <0>; |
| 255 | status = "disabled"; | 255 | status = "disabled"; |
| 256 | sdhci,1-bit-only; | ||
| 256 | }; | 257 | }; |
| 257 | 258 | ||
| 258 | crypto@30000 { | 259 | crypto@30000 { |
diff --git a/arch/powerpc/include/asm/cpm1.h b/arch/powerpc/include/asm/cpm1.h index 2ff798744c1d..7685ffde8821 100644 --- a/arch/powerpc/include/asm/cpm1.h +++ b/arch/powerpc/include/asm/cpm1.h | |||
| @@ -598,8 +598,6 @@ typedef struct risc_timer_pram { | |||
| 598 | #define CICR_IEN ((uint)0x00000080) /* Int. enable */ | 598 | #define CICR_IEN ((uint)0x00000080) /* Int. enable */ |
| 599 | #define CICR_SPS ((uint)0x00000001) /* SCC Spread */ | 599 | #define CICR_SPS ((uint)0x00000001) /* SCC Spread */ |
| 600 | 600 | ||
| 601 | #define IMAP_ADDR (get_immrbase()) | ||
| 602 | |||
| 603 | #define CPM_PIN_INPUT 0 | 601 | #define CPM_PIN_INPUT 0 |
| 604 | #define CPM_PIN_OUTPUT 1 | 602 | #define CPM_PIN_OUTPUT 1 |
| 605 | #define CPM_PIN_PRIMARY 0 | 603 | #define CPM_PIN_PRIMARY 0 |
diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h index 3d9e887c3c0c..b44aaabdd1a6 100644 --- a/arch/powerpc/include/asm/dma-mapping.h +++ b/arch/powerpc/include/asm/dma-mapping.h | |||
| @@ -309,7 +309,9 @@ static inline void dma_sync_single_for_cpu(struct device *dev, | |||
| 309 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 309 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); |
| 310 | 310 | ||
| 311 | BUG_ON(!dma_ops); | 311 | BUG_ON(!dma_ops); |
| 312 | dma_ops->sync_single_range_for_cpu(dev, dma_handle, 0, | 312 | |
| 313 | if (dma_ops->sync_single_range_for_cpu) | ||
| 314 | dma_ops->sync_single_range_for_cpu(dev, dma_handle, 0, | ||
| 313 | size, direction); | 315 | size, direction); |
| 314 | } | 316 | } |
| 315 | 317 | ||
| @@ -320,7 +322,9 @@ static inline void dma_sync_single_for_device(struct device *dev, | |||
| 320 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 322 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); |
| 321 | 323 | ||
| 322 | BUG_ON(!dma_ops); | 324 | BUG_ON(!dma_ops); |
| 323 | dma_ops->sync_single_range_for_device(dev, dma_handle, | 325 | |
| 326 | if (dma_ops->sync_single_range_for_device) | ||
| 327 | dma_ops->sync_single_range_for_device(dev, dma_handle, | ||
| 324 | 0, size, direction); | 328 | 0, size, direction); |
| 325 | } | 329 | } |
| 326 | 330 | ||
| @@ -331,7 +335,9 @@ static inline void dma_sync_sg_for_cpu(struct device *dev, | |||
| 331 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 335 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); |
| 332 | 336 | ||
| 333 | BUG_ON(!dma_ops); | 337 | BUG_ON(!dma_ops); |
| 334 | dma_ops->sync_sg_for_cpu(dev, sgl, nents, direction); | 338 | |
| 339 | if (dma_ops->sync_sg_for_cpu) | ||
| 340 | dma_ops->sync_sg_for_cpu(dev, sgl, nents, direction); | ||
| 335 | } | 341 | } |
| 336 | 342 | ||
| 337 | static inline void dma_sync_sg_for_device(struct device *dev, | 343 | static inline void dma_sync_sg_for_device(struct device *dev, |
| @@ -341,7 +347,9 @@ static inline void dma_sync_sg_for_device(struct device *dev, | |||
| 341 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 347 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); |
| 342 | 348 | ||
| 343 | BUG_ON(!dma_ops); | 349 | BUG_ON(!dma_ops); |
| 344 | dma_ops->sync_sg_for_device(dev, sgl, nents, direction); | 350 | |
| 351 | if (dma_ops->sync_sg_for_device) | ||
| 352 | dma_ops->sync_sg_for_device(dev, sgl, nents, direction); | ||
| 345 | } | 353 | } |
| 346 | 354 | ||
| 347 | static inline void dma_sync_single_range_for_cpu(struct device *dev, | 355 | static inline void dma_sync_single_range_for_cpu(struct device *dev, |
| @@ -351,7 +359,9 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, | |||
| 351 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 359 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); |
| 352 | 360 | ||
| 353 | BUG_ON(!dma_ops); | 361 | BUG_ON(!dma_ops); |
| 354 | dma_ops->sync_single_range_for_cpu(dev, dma_handle, | 362 | |
| 363 | if (dma_ops->sync_single_range_for_cpu) | ||
| 364 | dma_ops->sync_single_range_for_cpu(dev, dma_handle, | ||
| 355 | offset, size, direction); | 365 | offset, size, direction); |
| 356 | } | 366 | } |
| 357 | 367 | ||
| @@ -362,7 +372,9 @@ static inline void dma_sync_single_range_for_device(struct device *dev, | |||
| 362 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); | 372 | struct dma_mapping_ops *dma_ops = get_dma_ops(dev); |
| 363 | 373 | ||
| 364 | BUG_ON(!dma_ops); | 374 | BUG_ON(!dma_ops); |
| 365 | dma_ops->sync_single_range_for_device(dev, dma_handle, offset, | 375 | |
| 376 | if (dma_ops->sync_single_range_for_device) | ||
| 377 | dma_ops->sync_single_range_for_device(dev, dma_handle, offset, | ||
| 366 | size, direction); | 378 | size, direction); |
| 367 | } | 379 | } |
| 368 | #else /* CONFIG_PPC_NEED_DMA_SYNC_OPS */ | 380 | #else /* CONFIG_PPC_NEED_DMA_SYNC_OPS */ |
diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index 684a73f4324f..a74c4ee6c020 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h | |||
| @@ -22,9 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | #ifdef __KERNEL__ | 23 | #ifdef __KERNEL__ |
| 24 | 24 | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| 27 | #include <linux/highmem.h> | ||
| 28 | #include <asm/kmap_types.h> | 26 | #include <asm/kmap_types.h> |
| 29 | #include <asm/tlbflush.h> | 27 | #include <asm/tlbflush.h> |
| 30 | #include <asm/page.h> | 28 | #include <asm/page.h> |
| @@ -62,6 +60,9 @@ extern pte_t *pkmap_page_table; | |||
| 62 | 60 | ||
| 63 | extern void *kmap_high(struct page *page); | 61 | extern void *kmap_high(struct page *page); |
| 64 | extern void kunmap_high(struct page *page); | 62 | extern void kunmap_high(struct page *page); |
| 63 | extern void *kmap_atomic_prot(struct page *page, enum km_type type, | ||
| 64 | pgprot_t prot); | ||
| 65 | extern void kunmap_atomic(void *kvaddr, enum km_type type); | ||
| 65 | 66 | ||
| 66 | static inline void *kmap(struct page *page) | 67 | static inline void *kmap(struct page *page) |
| 67 | { | 68 | { |
| @@ -79,62 +80,11 @@ static inline void kunmap(struct page *page) | |||
| 79 | kunmap_high(page); | 80 | kunmap_high(page); |
| 80 | } | 81 | } |
| 81 | 82 | ||
| 82 | /* | ||
| 83 | * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap | ||
| 84 | * gives a more generic (and caching) interface. But kmap_atomic can | ||
| 85 | * be used in IRQ contexts, so in some (very limited) cases we need | ||
| 86 | * it. | ||
| 87 | */ | ||
| 88 | static inline void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot) | ||
| 89 | { | ||
| 90 | unsigned int idx; | ||
| 91 | unsigned long vaddr; | ||
| 92 | |||
| 93 | /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ | ||
| 94 | pagefault_disable(); | ||
| 95 | if (!PageHighMem(page)) | ||
| 96 | return page_address(page); | ||
| 97 | |||
| 98 | debug_kmap_atomic(type); | ||
| 99 | idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 100 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | ||
| 101 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
| 102 | BUG_ON(!pte_none(*(kmap_pte-idx))); | ||
| 103 | #endif | ||
| 104 | __set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot), 1); | ||
| 105 | local_flush_tlb_page(NULL, vaddr); | ||
| 106 | |||
| 107 | return (void*) vaddr; | ||
| 108 | } | ||
| 109 | |||
| 110 | static inline void *kmap_atomic(struct page *page, enum km_type type) | 83 | static inline void *kmap_atomic(struct page *page, enum km_type type) |
| 111 | { | 84 | { |
| 112 | return kmap_atomic_prot(page, type, kmap_prot); | 85 | return kmap_atomic_prot(page, type, kmap_prot); |
| 113 | } | 86 | } |
| 114 | 87 | ||
| 115 | static inline void kunmap_atomic(void *kvaddr, enum km_type type) | ||
| 116 | { | ||
| 117 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
| 118 | unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; | ||
| 119 | enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 120 | |||
| 121 | if (vaddr < __fix_to_virt(FIX_KMAP_END)) { | ||
| 122 | pagefault_enable(); | ||
| 123 | return; | ||
| 124 | } | ||
| 125 | |||
| 126 | BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); | ||
| 127 | |||
| 128 | /* | ||
| 129 | * force other mappings to Oops if they'll try to access | ||
| 130 | * this pte without first remap it | ||
| 131 | */ | ||
| 132 | pte_clear(&init_mm, vaddr, kmap_pte-idx); | ||
| 133 | local_flush_tlb_page(NULL, vaddr); | ||
| 134 | #endif | ||
| 135 | pagefault_enable(); | ||
| 136 | } | ||
| 137 | |||
| 138 | static inline struct page *kmap_atomic_to_page(void *ptr) | 88 | static inline struct page *kmap_atomic_to_page(void *ptr) |
| 139 | { | 89 | { |
| 140 | unsigned long idx, vaddr = (unsigned long) ptr; | 90 | unsigned long idx, vaddr = (unsigned long) ptr; |
| @@ -148,6 +98,7 @@ static inline struct page *kmap_atomic_to_page(void *ptr) | |||
| 148 | return pte_page(*pte); | 98 | return pte_page(*pte); |
| 149 | } | 99 | } |
| 150 | 100 | ||
| 101 | |||
| 151 | #define flush_cache_kmaps() flush_cache_all() | 102 | #define flush_cache_kmaps() flush_cache_all() |
| 152 | 103 | ||
| 153 | #endif /* __KERNEL__ */ | 104 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index 867ab8ed69b3..8b505eaaa38a 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
| @@ -68,13 +68,13 @@ static inline int irqs_disabled_flags(unsigned long flags) | |||
| 68 | 68 | ||
| 69 | #if defined(CONFIG_BOOKE) | 69 | #if defined(CONFIG_BOOKE) |
| 70 | #define SET_MSR_EE(x) mtmsr(x) | 70 | #define SET_MSR_EE(x) mtmsr(x) |
| 71 | #define local_irq_restore(flags) __asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory") | 71 | #define raw_local_irq_restore(flags) __asm__ __volatile__("wrtee %0" : : "r" (flags) : "memory") |
| 72 | #else | 72 | #else |
| 73 | #define SET_MSR_EE(x) mtmsr(x) | 73 | #define SET_MSR_EE(x) mtmsr(x) |
| 74 | #define local_irq_restore(flags) mtmsr(flags) | 74 | #define raw_local_irq_restore(flags) mtmsr(flags) |
| 75 | #endif | 75 | #endif |
| 76 | 76 | ||
| 77 | static inline void local_irq_disable(void) | 77 | static inline void raw_local_irq_disable(void) |
| 78 | { | 78 | { |
| 79 | #ifdef CONFIG_BOOKE | 79 | #ifdef CONFIG_BOOKE |
| 80 | __asm__ __volatile__("wrteei 0": : :"memory"); | 80 | __asm__ __volatile__("wrteei 0": : :"memory"); |
| @@ -86,7 +86,7 @@ static inline void local_irq_disable(void) | |||
| 86 | #endif | 86 | #endif |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | static inline void local_irq_enable(void) | 89 | static inline void raw_local_irq_enable(void) |
| 90 | { | 90 | { |
| 91 | #ifdef CONFIG_BOOKE | 91 | #ifdef CONFIG_BOOKE |
| 92 | __asm__ __volatile__("wrteei 1": : :"memory"); | 92 | __asm__ __volatile__("wrteei 1": : :"memory"); |
| @@ -98,7 +98,7 @@ static inline void local_irq_enable(void) | |||
| 98 | #endif | 98 | #endif |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | static inline void local_irq_save_ptr(unsigned long *flags) | 101 | static inline void raw_local_irq_save_ptr(unsigned long *flags) |
| 102 | { | 102 | { |
| 103 | unsigned long msr; | 103 | unsigned long msr; |
| 104 | msr = mfmsr(); | 104 | msr = mfmsr(); |
| @@ -110,12 +110,12 @@ static inline void local_irq_save_ptr(unsigned long *flags) | |||
| 110 | #endif | 110 | #endif |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | #define local_save_flags(flags) ((flags) = mfmsr()) | 113 | #define raw_local_save_flags(flags) ((flags) = mfmsr()) |
| 114 | #define local_irq_save(flags) local_irq_save_ptr(&flags) | 114 | #define raw_local_irq_save(flags) raw_local_irq_save_ptr(&flags) |
| 115 | #define irqs_disabled() ((mfmsr() & MSR_EE) == 0) | 115 | #define raw_irqs_disabled() ((mfmsr() & MSR_EE) == 0) |
| 116 | #define raw_irqs_disabled_flags(flags) (((flags) & MSR_EE) == 0) | ||
| 116 | 117 | ||
| 117 | #define hard_irq_enable() local_irq_enable() | 118 | #define hard_irq_disable() raw_local_irq_disable() |
| 118 | #define hard_irq_disable() local_irq_disable() | ||
| 119 | 119 | ||
| 120 | static inline int irqs_disabled_flags(unsigned long flags) | 120 | static inline int irqs_disabled_flags(unsigned long flags) |
| 121 | { | 121 | { |
diff --git a/arch/powerpc/include/asm/perf_counter.h b/arch/powerpc/include/asm/perf_counter.h index 8ccd4e155768..0ea0639fcf75 100644 --- a/arch/powerpc/include/asm/perf_counter.h +++ b/arch/powerpc/include/asm/perf_counter.h | |||
| @@ -61,6 +61,8 @@ struct pt_regs; | |||
| 61 | extern unsigned long perf_misc_flags(struct pt_regs *regs); | 61 | extern unsigned long perf_misc_flags(struct pt_regs *regs); |
| 62 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); | 62 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); |
| 63 | 63 | ||
| 64 | #define PERF_COUNTER_INDEX_OFFSET 1 | ||
| 65 | |||
| 64 | /* | 66 | /* |
| 65 | * Only override the default definitions in include/linux/perf_counter.h | 67 | * Only override the default definitions in include/linux/perf_counter.h |
| 66 | * if we have hardware PMU support. | 68 | * if we have hardware PMU support. |
diff --git a/arch/powerpc/include/asm/pte-hash64-64k.h b/arch/powerpc/include/asm/pte-hash64-64k.h index e05d26fa372f..82b72207c51c 100644 --- a/arch/powerpc/include/asm/pte-hash64-64k.h +++ b/arch/powerpc/include/asm/pte-hash64-64k.h | |||
| @@ -47,7 +47,8 @@ | |||
| 47 | * generic accessors and iterators here | 47 | * generic accessors and iterators here |
| 48 | */ | 48 | */ |
| 49 | #define __real_pte(e,p) ((real_pte_t) { \ | 49 | #define __real_pte(e,p) ((real_pte_t) { \ |
| 50 | (e), pte_val(*((p) + PTRS_PER_PTE)) }) | 50 | (e), ((e) & _PAGE_COMBO) ? \ |
| 51 | (pte_val(*((p) + PTRS_PER_PTE))) : 0 }) | ||
| 51 | #define __rpte_to_hidx(r,index) ((pte_val((r).pte) & _PAGE_COMBO) ? \ | 52 | #define __rpte_to_hidx(r,index) ((pte_val((r).pte) & _PAGE_COMBO) ? \ |
| 52 | (((r).hidx >> ((index)<<2)) & 0xf) : ((pte_val((r).pte) >> 12) & 0xf)) | 53 | (((r).hidx >> ((index)<<2)) & 0xf) : ((pte_val((r).pte) >> 12) & 0xf)) |
| 53 | #define __rpte_to_pte(r) ((r).pte) | 54 | #define __rpte_to_pte(r) ((r).pte) |
diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h index 01c12339b304..168fce726201 100644 --- a/arch/powerpc/include/asm/rtas.h +++ b/arch/powerpc/include/asm/rtas.h | |||
| @@ -58,7 +58,7 @@ struct rtas_t { | |||
| 58 | unsigned long entry; /* physical address pointer */ | 58 | unsigned long entry; /* physical address pointer */ |
| 59 | unsigned long base; /* physical address pointer */ | 59 | unsigned long base; /* physical address pointer */ |
| 60 | unsigned long size; | 60 | unsigned long size; |
| 61 | spinlock_t lock; | 61 | raw_spinlock_t lock; |
| 62 | struct rtas_args args; | 62 | struct rtas_args args; |
| 63 | struct device_node *dev; /* virtual address pointer */ | 63 | struct device_node *dev; /* virtual address pointer */ |
| 64 | }; | 64 | }; |
| @@ -245,5 +245,8 @@ static inline u32 rtas_config_addr(int busno, int devfn, int reg) | |||
| 245 | (devfn << 8) | (reg & 0xff); | 245 | (devfn << 8) | (reg & 0xff); |
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | extern void __cpuinit rtas_give_timebase(void); | ||
| 249 | extern void __cpuinit rtas_take_timebase(void); | ||
| 250 | |||
| 248 | #endif /* __KERNEL__ */ | 251 | #endif /* __KERNEL__ */ |
| 249 | #endif /* _POWERPC_RTAS_H */ | 252 | #endif /* _POWERPC_RTAS_H */ |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 4dd38f129153..3cadba60a4b6 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
| @@ -191,11 +191,49 @@ transfer_to_handler_cont: | |||
| 191 | mflr r9 | 191 | mflr r9 |
| 192 | lwz r11,0(r9) /* virtual address of handler */ | 192 | lwz r11,0(r9) /* virtual address of handler */ |
| 193 | lwz r9,4(r9) /* where to go when done */ | 193 | lwz r9,4(r9) /* where to go when done */ |
| 194 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 195 | lis r12,reenable_mmu@h | ||
| 196 | ori r12,r12,reenable_mmu@l | ||
| 197 | mtspr SPRN_SRR0,r12 | ||
| 198 | mtspr SPRN_SRR1,r10 | ||
| 199 | SYNC | ||
| 200 | RFI | ||
| 201 | reenable_mmu: /* re-enable mmu so we can */ | ||
| 202 | mfmsr r10 | ||
| 203 | lwz r12,_MSR(r1) | ||
| 204 | xor r10,r10,r12 | ||
| 205 | andi. r10,r10,MSR_EE /* Did EE change? */ | ||
| 206 | beq 1f | ||
| 207 | |||
| 208 | /* Save handler and return address into the 2 unused words | ||
| 209 | * of the STACK_FRAME_OVERHEAD (sneak sneak sneak). Everything | ||
| 210 | * else can be recovered from the pt_regs except r3 which for | ||
| 211 | * normal interrupts has been set to pt_regs and for syscalls | ||
| 212 | * is an argument, so we temporarily use ORIG_GPR3 to save it | ||
| 213 | */ | ||
| 214 | stw r9,8(r1) | ||
| 215 | stw r11,12(r1) | ||
| 216 | stw r3,ORIG_GPR3(r1) | ||
| 217 | bl trace_hardirqs_off | ||
| 218 | lwz r0,GPR0(r1) | ||
| 219 | lwz r3,ORIG_GPR3(r1) | ||
| 220 | lwz r4,GPR4(r1) | ||
| 221 | lwz r5,GPR5(r1) | ||
| 222 | lwz r6,GPR6(r1) | ||
| 223 | lwz r7,GPR7(r1) | ||
| 224 | lwz r8,GPR8(r1) | ||
| 225 | lwz r9,8(r1) | ||
| 226 | lwz r11,12(r1) | ||
| 227 | 1: mtctr r11 | ||
| 228 | mtlr r9 | ||
| 229 | bctr /* jump to handler */ | ||
| 230 | #else /* CONFIG_TRACE_IRQFLAGS */ | ||
| 194 | mtspr SPRN_SRR0,r11 | 231 | mtspr SPRN_SRR0,r11 |
| 195 | mtspr SPRN_SRR1,r10 | 232 | mtspr SPRN_SRR1,r10 |
| 196 | mtlr r9 | 233 | mtlr r9 |
| 197 | SYNC | 234 | SYNC |
| 198 | RFI /* jump to handler, enable MMU */ | 235 | RFI /* jump to handler, enable MMU */ |
| 236 | #endif /* CONFIG_TRACE_IRQFLAGS */ | ||
| 199 | 237 | ||
| 200 | #if defined (CONFIG_6xx) || defined(CONFIG_E500) | 238 | #if defined (CONFIG_6xx) || defined(CONFIG_E500) |
| 201 | 4: rlwinm r12,r12,0,~_TLF_NAPPING | 239 | 4: rlwinm r12,r12,0,~_TLF_NAPPING |
| @@ -251,6 +289,31 @@ _GLOBAL(DoSyscall) | |||
| 251 | #ifdef SHOW_SYSCALLS | 289 | #ifdef SHOW_SYSCALLS |
| 252 | bl do_show_syscall | 290 | bl do_show_syscall |
| 253 | #endif /* SHOW_SYSCALLS */ | 291 | #endif /* SHOW_SYSCALLS */ |
| 292 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 293 | /* Return from syscalls can (and generally will) hard enable | ||
| 294 | * interrupts. You aren't supposed to call a syscall with | ||
| 295 | * interrupts disabled in the first place. However, to ensure | ||
| 296 | * that we get it right vs. lockdep if it happens, we force | ||
| 297 | * that hard enable here with appropriate tracing if we see | ||
| 298 | * that we have been called with interrupts off | ||
| 299 | */ | ||
| 300 | mfmsr r11 | ||
| 301 | andi. r12,r11,MSR_EE | ||
| 302 | bne+ 1f | ||
| 303 | /* We came in with interrupts disabled, we enable them now */ | ||
| 304 | bl trace_hardirqs_on | ||
| 305 | mfmsr r11 | ||
| 306 | lwz r0,GPR0(r1) | ||
| 307 | lwz r3,GPR3(r1) | ||
| 308 | lwz r4,GPR4(r1) | ||
| 309 | ori r11,r11,MSR_EE | ||
| 310 | lwz r5,GPR5(r1) | ||
| 311 | lwz r6,GPR6(r1) | ||
| 312 | lwz r7,GPR7(r1) | ||
| 313 | lwz r8,GPR8(r1) | ||
| 314 | mtmsr r11 | ||
| 315 | 1: | ||
| 316 | #endif /* CONFIG_TRACE_IRQFLAGS */ | ||
| 254 | rlwinm r10,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ | 317 | rlwinm r10,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ |
| 255 | lwz r11,TI_FLAGS(r10) | 318 | lwz r11,TI_FLAGS(r10) |
| 256 | andi. r11,r11,_TIF_SYSCALL_T_OR_A | 319 | andi. r11,r11,_TIF_SYSCALL_T_OR_A |
| @@ -275,6 +338,7 @@ ret_from_syscall: | |||
| 275 | rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ | 338 | rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ |
| 276 | /* disable interrupts so current_thread_info()->flags can't change */ | 339 | /* disable interrupts so current_thread_info()->flags can't change */ |
| 277 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */ | 340 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */ |
| 341 | /* Note: We don't bother telling lockdep about it */ | ||
| 278 | SYNC | 342 | SYNC |
| 279 | MTMSRD(r10) | 343 | MTMSRD(r10) |
| 280 | lwz r9,TI_FLAGS(r12) | 344 | lwz r9,TI_FLAGS(r12) |
| @@ -288,6 +352,19 @@ ret_from_syscall: | |||
| 288 | oris r11,r11,0x1000 /* Set SO bit in CR */ | 352 | oris r11,r11,0x1000 /* Set SO bit in CR */ |
| 289 | stw r11,_CCR(r1) | 353 | stw r11,_CCR(r1) |
| 290 | syscall_exit_cont: | 354 | syscall_exit_cont: |
| 355 | lwz r8,_MSR(r1) | ||
| 356 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 357 | /* If we are going to return from the syscall with interrupts | ||
| 358 | * off, we trace that here. It shouldn't happen though but we | ||
| 359 | * want to catch the bugger if it does right ? | ||
| 360 | */ | ||
| 361 | andi. r10,r8,MSR_EE | ||
| 362 | bne+ 1f | ||
| 363 | stw r3,GPR3(r1) | ||
| 364 | bl trace_hardirqs_off | ||
| 365 | lwz r3,GPR3(r1) | ||
| 366 | 1: | ||
| 367 | #endif /* CONFIG_TRACE_IRQFLAGS */ | ||
| 291 | #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) | 368 | #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) |
| 292 | /* If the process has its own DBCR0 value, load it up. The internal | 369 | /* If the process has its own DBCR0 value, load it up. The internal |
| 293 | debug mode bit tells us that dbcr0 should be loaded. */ | 370 | debug mode bit tells us that dbcr0 should be loaded. */ |
| @@ -311,7 +388,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX) | |||
| 311 | mtlr r4 | 388 | mtlr r4 |
| 312 | mtcr r5 | 389 | mtcr r5 |
| 313 | lwz r7,_NIP(r1) | 390 | lwz r7,_NIP(r1) |
| 314 | lwz r8,_MSR(r1) | ||
| 315 | FIX_SRR1(r8, r0) | 391 | FIX_SRR1(r8, r0) |
| 316 | lwz r2,GPR2(r1) | 392 | lwz r2,GPR2(r1) |
| 317 | lwz r1,GPR1(r1) | 393 | lwz r1,GPR1(r1) |
| @@ -394,7 +470,9 @@ syscall_exit_work: | |||
| 394 | andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) | 470 | andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) |
| 395 | beq ret_from_except | 471 | beq ret_from_except |
| 396 | 472 | ||
| 397 | /* Re-enable interrupts */ | 473 | /* Re-enable interrupts. There is no need to trace that with |
| 474 | * lockdep as we are supposed to have IRQs on at this point | ||
| 475 | */ | ||
| 398 | ori r10,r10,MSR_EE | 476 | ori r10,r10,MSR_EE |
| 399 | SYNC | 477 | SYNC |
| 400 | MTMSRD(r10) | 478 | MTMSRD(r10) |
| @@ -705,6 +783,7 @@ ret_from_except: | |||
| 705 | /* Hard-disable interrupts so that current_thread_info()->flags | 783 | /* Hard-disable interrupts so that current_thread_info()->flags |
| 706 | * can't change between when we test it and when we return | 784 | * can't change between when we test it and when we return |
| 707 | * from the interrupt. */ | 785 | * from the interrupt. */ |
| 786 | /* Note: We don't bother telling lockdep about it */ | ||
| 708 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) | 787 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) |
| 709 | SYNC /* Some chip revs have problems here... */ | 788 | SYNC /* Some chip revs have problems here... */ |
| 710 | MTMSRD(r10) /* disable interrupts */ | 789 | MTMSRD(r10) /* disable interrupts */ |
| @@ -744,11 +823,24 @@ resume_kernel: | |||
| 744 | beq+ restore | 823 | beq+ restore |
| 745 | andi. r0,r3,MSR_EE /* interrupts off? */ | 824 | andi. r0,r3,MSR_EE /* interrupts off? */ |
| 746 | beq restore /* don't schedule if so */ | 825 | beq restore /* don't schedule if so */ |
| 826 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 827 | /* Lockdep thinks irqs are enabled, we need to call | ||
| 828 | * preempt_schedule_irq with IRQs off, so we inform lockdep | ||
| 829 | * now that we -did- turn them off already | ||
| 830 | */ | ||
| 831 | bl trace_hardirqs_off | ||
| 832 | #endif | ||
| 747 | 1: bl preempt_schedule_irq | 833 | 1: bl preempt_schedule_irq |
| 748 | rlwinm r9,r1,0,0,(31-THREAD_SHIFT) | 834 | rlwinm r9,r1,0,0,(31-THREAD_SHIFT) |
| 749 | lwz r3,TI_FLAGS(r9) | 835 | lwz r3,TI_FLAGS(r9) |
| 750 | andi. r0,r3,_TIF_NEED_RESCHED | 836 | andi. r0,r3,_TIF_NEED_RESCHED |
| 751 | bne- 1b | 837 | bne- 1b |
| 838 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 839 | /* And now, to properly rebalance the above, we tell lockdep they | ||
| 840 | * are being turned back on, which will happen when we return | ||
| 841 | */ | ||
| 842 | bl trace_hardirqs_on | ||
| 843 | #endif | ||
| 752 | #else | 844 | #else |
| 753 | resume_kernel: | 845 | resume_kernel: |
| 754 | #endif /* CONFIG_PREEMPT */ | 846 | #endif /* CONFIG_PREEMPT */ |
| @@ -765,6 +857,28 @@ restore: | |||
| 765 | stw r6,icache_44x_need_flush@l(r4) | 857 | stw r6,icache_44x_need_flush@l(r4) |
| 766 | 1: | 858 | 1: |
| 767 | #endif /* CONFIG_44x */ | 859 | #endif /* CONFIG_44x */ |
| 860 | |||
| 861 | lwz r9,_MSR(r1) | ||
| 862 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 863 | /* Lockdep doesn't know about the fact that IRQs are temporarily turned | ||
| 864 | * off in this assembly code while peeking at TI_FLAGS() and such. However | ||
| 865 | * we need to inform it if the exception turned interrupts off, and we | ||
| 866 | * are about to trun them back on. | ||
| 867 | * | ||
| 868 | * The problem here sadly is that we don't know whether the exceptions was | ||
| 869 | * one that turned interrupts off or not. So we always tell lockdep about | ||
| 870 | * turning them on here when we go back to wherever we came from with EE | ||
| 871 | * on, even if that may meen some redudant calls being tracked. Maybe later | ||
| 872 | * we could encode what the exception did somewhere or test the exception | ||
| 873 | * type in the pt_regs but that sounds overkill | ||
| 874 | */ | ||
| 875 | andi. r10,r9,MSR_EE | ||
| 876 | beq 1f | ||
| 877 | bl trace_hardirqs_on | ||
| 878 | lwz r9,_MSR(r1) | ||
| 879 | 1: | ||
| 880 | #endif /* CONFIG_TRACE_IRQFLAGS */ | ||
| 881 | |||
| 768 | lwz r0,GPR0(r1) | 882 | lwz r0,GPR0(r1) |
| 769 | lwz r2,GPR2(r1) | 883 | lwz r2,GPR2(r1) |
| 770 | REST_4GPRS(3, r1) | 884 | REST_4GPRS(3, r1) |
| @@ -782,7 +896,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX) | |||
| 782 | stwcx. r0,0,r1 /* to clear the reservation */ | 896 | stwcx. r0,0,r1 /* to clear the reservation */ |
| 783 | 897 | ||
| 784 | #if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE)) | 898 | #if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE)) |
| 785 | lwz r9,_MSR(r1) | ||
| 786 | andi. r10,r9,MSR_RI /* check if this exception occurred */ | 899 | andi. r10,r9,MSR_RI /* check if this exception occurred */ |
| 787 | beql nonrecoverable /* at a bad place (MSR:RI = 0) */ | 900 | beql nonrecoverable /* at a bad place (MSR:RI = 0) */ |
| 788 | 901 | ||
| @@ -805,7 +918,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX) | |||
| 805 | MTMSRD(r10) /* clear the RI bit */ | 918 | MTMSRD(r10) /* clear the RI bit */ |
| 806 | .globl exc_exit_restart | 919 | .globl exc_exit_restart |
| 807 | exc_exit_restart: | 920 | exc_exit_restart: |
| 808 | lwz r9,_MSR(r1) | ||
| 809 | lwz r12,_NIP(r1) | 921 | lwz r12,_NIP(r1) |
| 810 | FIX_SRR1(r9,r10) | 922 | FIX_SRR1(r9,r10) |
| 811 | mtspr SPRN_SRR0,r12 | 923 | mtspr SPRN_SRR0,r12 |
| @@ -1035,11 +1147,18 @@ do_work: /* r10 contains MSR_KERNEL here */ | |||
| 1035 | beq do_user_signal | 1147 | beq do_user_signal |
| 1036 | 1148 | ||
| 1037 | do_resched: /* r10 contains MSR_KERNEL here */ | 1149 | do_resched: /* r10 contains MSR_KERNEL here */ |
| 1150 | /* Note: We don't need to inform lockdep that we are enabling | ||
| 1151 | * interrupts here. As far as it knows, they are already enabled | ||
| 1152 | */ | ||
| 1038 | ori r10,r10,MSR_EE | 1153 | ori r10,r10,MSR_EE |
| 1039 | SYNC | 1154 | SYNC |
| 1040 | MTMSRD(r10) /* hard-enable interrupts */ | 1155 | MTMSRD(r10) /* hard-enable interrupts */ |
| 1041 | bl schedule | 1156 | bl schedule |
| 1042 | recheck: | 1157 | recheck: |
| 1158 | /* Note: And we don't tell it we are disabling them again | ||
| 1159 | * neither. Those disable/enable cycles used to peek at | ||
| 1160 | * TI_FLAGS aren't advertised. | ||
| 1161 | */ | ||
| 1043 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) | 1162 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) |
| 1044 | SYNC | 1163 | SYNC |
| 1045 | MTMSRD(r10) /* disable interrupts */ | 1164 | MTMSRD(r10) /* disable interrupts */ |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 48469463f89e..fc2132942754 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
| @@ -1124,9 +1124,8 @@ mmu_off: | |||
| 1124 | RFI | 1124 | RFI |
| 1125 | 1125 | ||
| 1126 | /* | 1126 | /* |
| 1127 | * Use the first pair of BAT registers to map the 1st 16MB | 1127 | * On 601, we use 3 BATs to map up to 24M of RAM at _PAGE_OFFSET |
| 1128 | * of RAM to PAGE_OFFSET. From this point on we can't safely | 1128 | * (we keep one for debugging) and on others, we use one 256M BAT. |
| 1129 | * call OF any more. | ||
| 1130 | */ | 1129 | */ |
| 1131 | initial_bats: | 1130 | initial_bats: |
| 1132 | lis r11,PAGE_OFFSET@h | 1131 | lis r11,PAGE_OFFSET@h |
| @@ -1136,12 +1135,16 @@ initial_bats: | |||
| 1136 | bne 4f | 1135 | bne 4f |
| 1137 | ori r11,r11,4 /* set up BAT registers for 601 */ | 1136 | ori r11,r11,4 /* set up BAT registers for 601 */ |
| 1138 | li r8,0x7f /* valid, block length = 8MB */ | 1137 | li r8,0x7f /* valid, block length = 8MB */ |
| 1139 | oris r9,r11,0x800000@h /* set up BAT reg for 2nd 8M */ | ||
| 1140 | oris r10,r8,0x800000@h /* set up BAT reg for 2nd 8M */ | ||
| 1141 | mtspr SPRN_IBAT0U,r11 /* N.B. 601 has valid bit in */ | 1138 | mtspr SPRN_IBAT0U,r11 /* N.B. 601 has valid bit in */ |
| 1142 | mtspr SPRN_IBAT0L,r8 /* lower BAT register */ | 1139 | mtspr SPRN_IBAT0L,r8 /* lower BAT register */ |
| 1143 | mtspr SPRN_IBAT1U,r9 | 1140 | addis r11,r11,0x800000@h |
| 1144 | mtspr SPRN_IBAT1L,r10 | 1141 | addis r8,r8,0x800000@h |
| 1142 | mtspr SPRN_IBAT1U,r11 | ||
| 1143 | mtspr SPRN_IBAT1L,r8 | ||
| 1144 | addis r11,r11,0x800000@h | ||
| 1145 | addis r8,r8,0x800000@h | ||
| 1146 | mtspr SPRN_IBAT2U,r11 | ||
| 1147 | mtspr SPRN_IBAT2L,r8 | ||
| 1145 | isync | 1148 | isync |
| 1146 | blr | 1149 | blr |
| 1147 | 1150 | ||
diff --git a/arch/powerpc/kernel/of_device.c b/arch/powerpc/kernel/of_device.c index fa983a59c4ce..a359cb08e900 100644 --- a/arch/powerpc/kernel/of_device.c +++ b/arch/powerpc/kernel/of_device.c | |||
| @@ -76,7 +76,7 @@ struct of_device *of_device_alloc(struct device_node *np, | |||
| 76 | dev->dev.archdata.of_node = np; | 76 | dev->dev.archdata.of_node = np; |
| 77 | 77 | ||
| 78 | if (bus_id) | 78 | if (bus_id) |
| 79 | dev_set_name(&dev->dev, bus_id); | 79 | dev_set_name(&dev->dev, "%s", bus_id); |
| 80 | else | 80 | else |
| 81 | of_device_make_bus_id(dev); | 81 | of_device_make_bus_id(dev); |
| 82 | 82 | ||
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 3e7135bbe40f..892a9f2e6d76 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -528,7 +528,7 @@ void show_regs(struct pt_regs * regs) | |||
| 528 | 528 | ||
| 529 | for (i = 0; i < 32; i++) { | 529 | for (i = 0; i < 32; i++) { |
| 530 | if ((i % REGS_PER_LINE) == 0) | 530 | if ((i % REGS_PER_LINE) == 0) |
| 531 | printk("\n" KERN_INFO "GPR%02d: ", i); | 531 | printk("\nGPR%02d: ", i); |
| 532 | printk(REG " ", regs->gpr[i]); | 532 | printk(REG " ", regs->gpr[i]); |
| 533 | if (i == LAST_VOLATILE && !FULL_REGS(regs)) | 533 | if (i == LAST_VOLATILE && !FULL_REGS(regs)) |
| 534 | break; | 534 | break; |
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index ee4c7609b649..c434823b8c83 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
| @@ -38,9 +38,10 @@ | |||
| 38 | #include <asm/syscalls.h> | 38 | #include <asm/syscalls.h> |
| 39 | #include <asm/smp.h> | 39 | #include <asm/smp.h> |
| 40 | #include <asm/atomic.h> | 40 | #include <asm/atomic.h> |
| 41 | #include <asm/time.h> | ||
| 41 | 42 | ||
| 42 | struct rtas_t rtas = { | 43 | struct rtas_t rtas = { |
| 43 | .lock = SPIN_LOCK_UNLOCKED | 44 | .lock = __RAW_SPIN_LOCK_UNLOCKED |
| 44 | }; | 45 | }; |
| 45 | EXPORT_SYMBOL(rtas); | 46 | EXPORT_SYMBOL(rtas); |
| 46 | 47 | ||
| @@ -67,6 +68,28 @@ unsigned long rtas_rmo_buf; | |||
| 67 | void (*rtas_flash_term_hook)(int); | 68 | void (*rtas_flash_term_hook)(int); |
| 68 | EXPORT_SYMBOL(rtas_flash_term_hook); | 69 | EXPORT_SYMBOL(rtas_flash_term_hook); |
| 69 | 70 | ||
| 71 | /* RTAS use home made raw locking instead of spin_lock_irqsave | ||
| 72 | * because those can be called from within really nasty contexts | ||
| 73 | * such as having the timebase stopped which would lockup with | ||
| 74 | * normal locks and spinlock debugging enabled | ||
| 75 | */ | ||
| 76 | static unsigned long lock_rtas(void) | ||
| 77 | { | ||
| 78 | unsigned long flags; | ||
| 79 | |||
| 80 | local_irq_save(flags); | ||
| 81 | preempt_disable(); | ||
| 82 | __raw_spin_lock_flags(&rtas.lock, flags); | ||
| 83 | return flags; | ||
| 84 | } | ||
| 85 | |||
| 86 | static void unlock_rtas(unsigned long flags) | ||
| 87 | { | ||
| 88 | __raw_spin_unlock(&rtas.lock); | ||
| 89 | local_irq_restore(flags); | ||
| 90 | preempt_enable(); | ||
| 91 | } | ||
| 92 | |||
| 70 | /* | 93 | /* |
| 71 | * call_rtas_display_status and call_rtas_display_status_delay | 94 | * call_rtas_display_status and call_rtas_display_status_delay |
| 72 | * are designed only for very early low-level debugging, which | 95 | * are designed only for very early low-level debugging, which |
| @@ -79,7 +102,7 @@ static void call_rtas_display_status(char c) | |||
| 79 | 102 | ||
| 80 | if (!rtas.base) | 103 | if (!rtas.base) |
| 81 | return; | 104 | return; |
| 82 | spin_lock_irqsave(&rtas.lock, s); | 105 | s = lock_rtas(); |
| 83 | 106 | ||
| 84 | args->token = 10; | 107 | args->token = 10; |
| 85 | args->nargs = 1; | 108 | args->nargs = 1; |
| @@ -89,7 +112,7 @@ static void call_rtas_display_status(char c) | |||
| 89 | 112 | ||
| 90 | enter_rtas(__pa(args)); | 113 | enter_rtas(__pa(args)); |
| 91 | 114 | ||
| 92 | spin_unlock_irqrestore(&rtas.lock, s); | 115 | unlock_rtas(s); |
| 93 | } | 116 | } |
| 94 | 117 | ||
| 95 | static void call_rtas_display_status_delay(char c) | 118 | static void call_rtas_display_status_delay(char c) |
| @@ -411,8 +434,7 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...) | |||
| 411 | if (!rtas.entry || token == RTAS_UNKNOWN_SERVICE) | 434 | if (!rtas.entry || token == RTAS_UNKNOWN_SERVICE) |
| 412 | return -1; | 435 | return -1; |
| 413 | 436 | ||
| 414 | /* Gotta do something different here, use global lock for now... */ | 437 | s = lock_rtas(); |
| 415 | spin_lock_irqsave(&rtas.lock, s); | ||
| 416 | rtas_args = &rtas.args; | 438 | rtas_args = &rtas.args; |
| 417 | 439 | ||
| 418 | rtas_args->token = token; | 440 | rtas_args->token = token; |
| @@ -439,8 +461,7 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...) | |||
| 439 | outputs[i] = rtas_args->rets[i+1]; | 461 | outputs[i] = rtas_args->rets[i+1]; |
| 440 | ret = (nret > 0)? rtas_args->rets[0]: 0; | 462 | ret = (nret > 0)? rtas_args->rets[0]: 0; |
| 441 | 463 | ||
| 442 | /* Gotta do something different here, use global lock for now... */ | 464 | unlock_rtas(s); |
| 443 | spin_unlock_irqrestore(&rtas.lock, s); | ||
| 444 | 465 | ||
| 445 | if (buff_copy) { | 466 | if (buff_copy) { |
| 446 | log_error(buff_copy, ERR_TYPE_RTAS_LOG, 0); | 467 | log_error(buff_copy, ERR_TYPE_RTAS_LOG, 0); |
| @@ -837,7 +858,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs) | |||
| 837 | 858 | ||
| 838 | buff_copy = get_errorlog_buffer(); | 859 | buff_copy = get_errorlog_buffer(); |
| 839 | 860 | ||
| 840 | spin_lock_irqsave(&rtas.lock, flags); | 861 | flags = lock_rtas(); |
| 841 | 862 | ||
| 842 | rtas.args = args; | 863 | rtas.args = args; |
| 843 | enter_rtas(__pa(&rtas.args)); | 864 | enter_rtas(__pa(&rtas.args)); |
| @@ -848,7 +869,7 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs) | |||
| 848 | if (args.rets[0] == -1) | 869 | if (args.rets[0] == -1) |
| 849 | errbuf = __fetch_rtas_last_error(buff_copy); | 870 | errbuf = __fetch_rtas_last_error(buff_copy); |
| 850 | 871 | ||
| 851 | spin_unlock_irqrestore(&rtas.lock, flags); | 872 | unlock_rtas(flags); |
| 852 | 873 | ||
| 853 | if (buff_copy) { | 874 | if (buff_copy) { |
| 854 | if (errbuf) | 875 | if (errbuf) |
| @@ -951,3 +972,33 @@ int __init early_init_dt_scan_rtas(unsigned long node, | |||
| 951 | /* break now */ | 972 | /* break now */ |
| 952 | return 1; | 973 | return 1; |
| 953 | } | 974 | } |
| 975 | |||
| 976 | static raw_spinlock_t timebase_lock; | ||
| 977 | static u64 timebase = 0; | ||
| 978 | |||
| 979 | void __cpuinit rtas_give_timebase(void) | ||
| 980 | { | ||
| 981 | unsigned long flags; | ||
| 982 | |||
| 983 | local_irq_save(flags); | ||
| 984 | hard_irq_disable(); | ||
| 985 | __raw_spin_lock(&timebase_lock); | ||
| 986 | rtas_call(rtas_token("freeze-time-base"), 0, 1, NULL); | ||
| 987 | timebase = get_tb(); | ||
| 988 | __raw_spin_unlock(&timebase_lock); | ||
| 989 | |||
| 990 | while (timebase) | ||
| 991 | barrier(); | ||
| 992 | rtas_call(rtas_token("thaw-time-base"), 0, 1, NULL); | ||
| 993 | local_irq_restore(flags); | ||
| 994 | } | ||
| 995 | |||
| 996 | void __cpuinit rtas_take_timebase(void) | ||
| 997 | { | ||
| 998 | while (!timebase) | ||
| 999 | barrier(); | ||
| 1000 | __raw_spin_lock(&timebase_lock); | ||
| 1001 | set_tb(timebase >> 32, timebase & 0xffffffff); | ||
| 1002 | timebase = 0; | ||
| 1003 | __raw_spin_unlock(&timebase_lock); | ||
| 1004 | } | ||
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index 1d154248cf40..e1e3059cf34b 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
| @@ -119,6 +119,8 @@ notrace unsigned long __init early_init(unsigned long dt_ptr) | |||
| 119 | */ | 119 | */ |
| 120 | notrace void __init machine_init(unsigned long dt_ptr) | 120 | notrace void __init machine_init(unsigned long dt_ptr) |
| 121 | { | 121 | { |
| 122 | lockdep_init(); | ||
| 123 | |||
| 122 | /* Enable early debugging if any specified (see udbg.h) */ | 124 | /* Enable early debugging if any specified (see udbg.h) */ |
| 123 | udbg_early_init(); | 125 | udbg_early_init(); |
| 124 | 126 | ||
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 65484b2200b3..0b47de07302d 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
| @@ -68,7 +68,8 @@ EXPORT_PER_CPU_SYMBOL(cpu_core_map); | |||
| 68 | /* SMP operations for this machine */ | 68 | /* SMP operations for this machine */ |
| 69 | struct smp_ops_t *smp_ops; | 69 | struct smp_ops_t *smp_ops; |
| 70 | 70 | ||
| 71 | static volatile unsigned int cpu_callin_map[NR_CPUS]; | 71 | /* Can't be static due to PowerMac hackery */ |
| 72 | volatile unsigned int cpu_callin_map[NR_CPUS]; | ||
| 72 | 73 | ||
| 73 | int smt_enabled_at_boot = 1; | 74 | int smt_enabled_at_boot = 1; |
| 74 | 75 | ||
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c index 0362a891e54e..acb74a17bbbf 100644 --- a/arch/powerpc/kernel/udbg_16550.c +++ b/arch/powerpc/kernel/udbg_16550.c | |||
| @@ -219,7 +219,7 @@ void udbg_init_pas_realmode(void) | |||
| 219 | #ifdef CONFIG_PPC_EARLY_DEBUG_44x | 219 | #ifdef CONFIG_PPC_EARLY_DEBUG_44x |
| 220 | #include <platforms/44x/44x.h> | 220 | #include <platforms/44x/44x.h> |
| 221 | 221 | ||
| 222 | static int udbg_44x_as1_flush(void) | 222 | static void udbg_44x_as1_flush(void) |
| 223 | { | 223 | { |
| 224 | if (udbg_comport) { | 224 | if (udbg_comport) { |
| 225 | while ((as1_readb(&udbg_comport->lsr) & LSR_THRE) == 0) | 225 | while ((as1_readb(&udbg_comport->lsr) & LSR_THRE) == 0) |
diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index 2d2192e48de7..3e68363405b7 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile | |||
| @@ -30,3 +30,4 @@ obj-$(CONFIG_PPC_MM_SLICES) += slice.o | |||
| 30 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 30 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
| 31 | obj-$(CONFIG_PPC_SUBPAGE_PROT) += subpage-prot.o | 31 | obj-$(CONFIG_PPC_SUBPAGE_PROT) += subpage-prot.o |
| 32 | obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o | 32 | obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o |
| 33 | obj-$(CONFIG_HIGHMEM) += highmem.o | ||
diff --git a/arch/powerpc/mm/highmem.c b/arch/powerpc/mm/highmem.c new file mode 100644 index 000000000000..c2186c74c85a --- /dev/null +++ b/arch/powerpc/mm/highmem.c | |||
| @@ -0,0 +1,77 @@ | |||
| 1 | /* | ||
| 2 | * highmem.c: virtual kernel memory mappings for high memory | ||
| 3 | * | ||
| 4 | * PowerPC version, stolen from the i386 version. | ||
| 5 | * | ||
| 6 | * Used in CONFIG_HIGHMEM systems for memory pages which | ||
| 7 | * are not addressable by direct kernel virtual addresses. | ||
| 8 | * | ||
| 9 | * Copyright (C) 1999 Gerhard Wichert, Siemens AG | ||
| 10 | * Gerhard.Wichert@pdb.siemens.de | ||
| 11 | * | ||
| 12 | * | ||
| 13 | * Redesigned the x86 32-bit VM architecture to deal with | ||
| 14 | * up to 16 Terrabyte physical memory. With current x86 CPUs | ||
| 15 | * we now support up to 64 Gigabytes physical RAM. | ||
| 16 | * | ||
| 17 | * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> | ||
| 18 | * | ||
| 19 | * Reworked for PowerPC by various contributors. Moved from | ||
| 20 | * highmem.h by Benjamin Herrenschmidt (c) 2009 IBM Corp. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/highmem.h> | ||
| 24 | #include <linux/module.h> | ||
| 25 | |||
| 26 | /* | ||
| 27 | * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap | ||
| 28 | * gives a more generic (and caching) interface. But kmap_atomic can | ||
| 29 | * be used in IRQ contexts, so in some (very limited) cases we need | ||
| 30 | * it. | ||
| 31 | */ | ||
| 32 | void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot) | ||
| 33 | { | ||
| 34 | unsigned int idx; | ||
| 35 | unsigned long vaddr; | ||
| 36 | |||
| 37 | /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ | ||
| 38 | pagefault_disable(); | ||
| 39 | if (!PageHighMem(page)) | ||
| 40 | return page_address(page); | ||
| 41 | |||
| 42 | debug_kmap_atomic(type); | ||
| 43 | idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 44 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | ||
| 45 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
| 46 | BUG_ON(!pte_none(*(kmap_pte-idx))); | ||
| 47 | #endif | ||
| 48 | __set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot), 1); | ||
| 49 | local_flush_tlb_page(NULL, vaddr); | ||
| 50 | |||
| 51 | return (void*) vaddr; | ||
| 52 | } | ||
| 53 | EXPORT_SYMBOL(kmap_atomic_prot); | ||
| 54 | |||
| 55 | void kunmap_atomic(void *kvaddr, enum km_type type) | ||
| 56 | { | ||
| 57 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
| 58 | unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; | ||
| 59 | enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 60 | |||
| 61 | if (vaddr < __fix_to_virt(FIX_KMAP_END)) { | ||
| 62 | pagefault_enable(); | ||
| 63 | return; | ||
| 64 | } | ||
| 65 | |||
| 66 | BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); | ||
| 67 | |||
| 68 | /* | ||
| 69 | * force other mappings to Oops if they'll try to access | ||
| 70 | * this pte without first remap it | ||
| 71 | */ | ||
| 72 | pte_clear(&init_mm, vaddr, kmap_pte-idx); | ||
| 73 | local_flush_tlb_page(NULL, vaddr); | ||
| 74 | #endif | ||
| 75 | pagefault_enable(); | ||
| 76 | } | ||
| 77 | EXPORT_SYMBOL(kunmap_atomic); | ||
diff --git a/arch/powerpc/platforms/44x/warp.c b/arch/powerpc/platforms/44x/warp.c index 42e09a9f77e2..0362c88f47d7 100644 --- a/arch/powerpc/platforms/44x/warp.c +++ b/arch/powerpc/platforms/44x/warp.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/of_gpio.h> | 18 | #include <linux/of_gpio.h> |
| 19 | #include <linux/of_i2c.h> | ||
| 19 | 20 | ||
| 20 | #include <asm/machdep.h> | 21 | #include <asm/machdep.h> |
| 21 | #include <asm/prom.h> | 22 | #include <asm/prom.h> |
| @@ -65,7 +66,6 @@ define_machine(warp) { | |||
| 65 | 66 | ||
| 66 | static u32 post_info; | 67 | static u32 post_info; |
| 67 | 68 | ||
| 68 | /* I am not sure this is the best place for this... */ | ||
| 69 | static int __init warp_post_info(void) | 69 | static int __init warp_post_info(void) |
| 70 | { | 70 | { |
| 71 | struct device_node *np; | 71 | struct device_node *np; |
| @@ -194,9 +194,9 @@ static int pika_setup_leds(void) | |||
| 194 | return 0; | 194 | return 0; |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | static void pika_setup_critical_temp(struct i2c_client *client) | 197 | static void pika_setup_critical_temp(struct device_node *np, |
| 198 | struct i2c_client *client) | ||
| 198 | { | 199 | { |
| 199 | struct device_node *np; | ||
| 200 | int irq, rc; | 200 | int irq, rc; |
| 201 | 201 | ||
| 202 | /* Do this before enabling critical temp interrupt since we | 202 | /* Do this before enabling critical temp interrupt since we |
| @@ -208,14 +208,7 @@ static void pika_setup_critical_temp(struct i2c_client *client) | |||
| 208 | i2c_smbus_write_byte_data(client, 2, 65); /* Thigh */ | 208 | i2c_smbus_write_byte_data(client, 2, 65); /* Thigh */ |
| 209 | i2c_smbus_write_byte_data(client, 3, 0); /* Tlow */ | 209 | i2c_smbus_write_byte_data(client, 3, 0); /* Tlow */ |
| 210 | 210 | ||
| 211 | np = of_find_compatible_node(NULL, NULL, "adi,ad7414"); | ||
| 212 | if (np == NULL) { | ||
| 213 | printk(KERN_ERR __FILE__ ": Unable to find ad7414\n"); | ||
| 214 | return; | ||
| 215 | } | ||
| 216 | |||
| 217 | irq = irq_of_parse_and_map(np, 0); | 211 | irq = irq_of_parse_and_map(np, 0); |
| 218 | of_node_put(np); | ||
| 219 | if (irq == NO_IRQ) { | 212 | if (irq == NO_IRQ) { |
| 220 | printk(KERN_ERR __FILE__ ": Unable to get ad7414 irq\n"); | 213 | printk(KERN_ERR __FILE__ ": Unable to get ad7414 irq\n"); |
| 221 | return; | 214 | return; |
| @@ -244,32 +237,24 @@ static inline void pika_dtm_check_fan(void __iomem *fpga) | |||
| 244 | 237 | ||
| 245 | static int pika_dtm_thread(void __iomem *fpga) | 238 | static int pika_dtm_thread(void __iomem *fpga) |
| 246 | { | 239 | { |
| 247 | struct i2c_adapter *adap; | 240 | struct device_node *np; |
| 248 | struct i2c_client *client; | 241 | struct i2c_client *client; |
| 249 | 242 | ||
| 250 | /* We loop in case either driver was compiled as a module and | 243 | np = of_find_compatible_node(NULL, NULL, "adi,ad7414"); |
| 251 | * has not been insmoded yet. | 244 | if (np == NULL) |
| 252 | */ | 245 | return -ENOENT; |
| 253 | while (!(adap = i2c_get_adapter(0))) { | ||
| 254 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 255 | schedule_timeout(HZ); | ||
| 256 | } | ||
| 257 | |||
| 258 | while (1) { | ||
| 259 | list_for_each_entry(client, &adap->clients, list) | ||
| 260 | if (client->addr == 0x4a) | ||
| 261 | goto found_it; | ||
| 262 | 246 | ||
| 263 | set_current_state(TASK_INTERRUPTIBLE); | 247 | client = of_find_i2c_device_by_node(np); |
| 264 | schedule_timeout(HZ); | 248 | if (client == NULL) { |
| 249 | of_node_put(np); | ||
| 250 | return -ENOENT; | ||
| 265 | } | 251 | } |
| 266 | 252 | ||
| 267 | found_it: | 253 | pika_setup_critical_temp(np, client); |
| 268 | pika_setup_critical_temp(client); | ||
| 269 | 254 | ||
| 270 | i2c_put_adapter(adap); | 255 | of_node_put(np); |
| 271 | 256 | ||
| 272 | printk(KERN_INFO "PIKA DTM thread running.\n"); | 257 | printk(KERN_INFO "Warp DTM thread running.\n"); |
| 273 | 258 | ||
| 274 | while (!kthread_should_stop()) { | 259 | while (!kthread_should_stop()) { |
| 275 | int val; | 260 | int val; |
| @@ -291,7 +276,6 @@ found_it: | |||
| 291 | return 0; | 276 | return 0; |
| 292 | } | 277 | } |
| 293 | 278 | ||
| 294 | |||
| 295 | static int __init pika_dtm_start(void) | 279 | static int __init pika_dtm_start(void) |
| 296 | { | 280 | { |
| 297 | struct task_struct *dtm_thread; | 281 | struct task_struct *dtm_thread; |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c index 77f90b356356..60ed9c067b1d 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c | |||
| @@ -285,6 +285,7 @@ static struct of_device_id mpc85xx_ids[] = { | |||
| 285 | { .type = "qe", }, | 285 | { .type = "qe", }, |
| 286 | { .compatible = "fsl,qe", }, | 286 | { .compatible = "fsl,qe", }, |
| 287 | { .compatible = "gianfar", }, | 287 | { .compatible = "gianfar", }, |
| 288 | { .compatible = "fsl,rapidio-delta", }, | ||
| 288 | {}, | 289 | {}, |
| 289 | }; | 290 | }; |
| 290 | 291 | ||
diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index cc0b0db8a6f3..62c592ede641 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c | |||
| @@ -52,20 +52,19 @@ smp_85xx_kick_cpu(int nr) | |||
| 52 | 52 | ||
| 53 | pr_debug("smp_85xx_kick_cpu: kick CPU #%d\n", nr); | 53 | pr_debug("smp_85xx_kick_cpu: kick CPU #%d\n", nr); |
| 54 | 54 | ||
| 55 | local_irq_save(flags); | ||
| 56 | |||
| 57 | np = of_get_cpu_node(nr, NULL); | 55 | np = of_get_cpu_node(nr, NULL); |
| 58 | cpu_rel_addr = of_get_property(np, "cpu-release-addr", NULL); | 56 | cpu_rel_addr = of_get_property(np, "cpu-release-addr", NULL); |
| 59 | 57 | ||
| 60 | if (cpu_rel_addr == NULL) { | 58 | if (cpu_rel_addr == NULL) { |
| 61 | printk(KERN_ERR "No cpu-release-addr for cpu %d\n", nr); | 59 | printk(KERN_ERR "No cpu-release-addr for cpu %d\n", nr); |
| 62 | local_irq_restore(flags); | ||
| 63 | return; | 60 | return; |
| 64 | } | 61 | } |
| 65 | 62 | ||
| 66 | /* Map the spin table */ | 63 | /* Map the spin table */ |
| 67 | bptr_vaddr = ioremap(*cpu_rel_addr, SIZE_BOOT_ENTRY); | 64 | bptr_vaddr = ioremap(*cpu_rel_addr, SIZE_BOOT_ENTRY); |
| 68 | 65 | ||
| 66 | local_irq_save(flags); | ||
| 67 | |||
| 69 | out_be32(bptr_vaddr + BOOT_ENTRY_PIR, nr); | 68 | out_be32(bptr_vaddr + BOOT_ENTRY_PIR, nr); |
| 70 | out_be32(bptr_vaddr + BOOT_ENTRY_ADDR_LOWER, __pa(__early_start)); | 69 | out_be32(bptr_vaddr + BOOT_ENTRY_ADDR_LOWER, __pa(__early_start)); |
| 71 | 70 | ||
| @@ -73,10 +72,10 @@ smp_85xx_kick_cpu(int nr) | |||
| 73 | while ((__secondary_hold_acknowledge != nr) && (++n < 1000)) | 72 | while ((__secondary_hold_acknowledge != nr) && (++n < 1000)) |
| 74 | mdelay(1); | 73 | mdelay(1); |
| 75 | 74 | ||
| 76 | iounmap(bptr_vaddr); | ||
| 77 | |||
| 78 | local_irq_restore(flags); | 75 | local_irq_restore(flags); |
| 79 | 76 | ||
| 77 | iounmap(bptr_vaddr); | ||
| 78 | |||
| 80 | pr_debug("waited %d msecs for CPU #%d.\n", n, nr); | 79 | pr_debug("waited %d msecs for CPU #%d.\n", n, nr); |
| 81 | } | 80 | } |
| 82 | 81 | ||
diff --git a/arch/powerpc/platforms/85xx/socrates.c b/arch/powerpc/platforms/85xx/socrates.c index d0e8443b12c6..747d8fb3ab82 100644 --- a/arch/powerpc/platforms/85xx/socrates.c +++ b/arch/powerpc/platforms/85xx/socrates.c | |||
| @@ -102,10 +102,11 @@ static struct of_device_id __initdata socrates_of_bus_ids[] = { | |||
| 102 | {}, | 102 | {}, |
| 103 | }; | 103 | }; |
| 104 | 104 | ||
| 105 | static void __init socrates_init(void) | 105 | static int __init socrates_publish_devices(void) |
| 106 | { | 106 | { |
| 107 | of_platform_bus_probe(NULL, socrates_of_bus_ids, NULL); | 107 | return of_platform_bus_probe(NULL, socrates_of_bus_ids, NULL); |
| 108 | } | 108 | } |
| 109 | machine_device_initcall(socrates, socrates_publish_devices); | ||
| 109 | 110 | ||
| 110 | /* | 111 | /* |
| 111 | * Called very early, device-tree isn't unflattened | 112 | * Called very early, device-tree isn't unflattened |
| @@ -124,7 +125,6 @@ define_machine(socrates) { | |||
| 124 | .name = "Socrates", | 125 | .name = "Socrates", |
| 125 | .probe = socrates_probe, | 126 | .probe = socrates_probe, |
| 126 | .setup_arch = socrates_setup_arch, | 127 | .setup_arch = socrates_setup_arch, |
| 127 | .init = socrates_init, | ||
| 128 | .init_IRQ = socrates_pic_init, | 128 | .init_IRQ = socrates_pic_init, |
| 129 | .get_irq = mpic_get_irq, | 129 | .get_irq = mpic_get_irq, |
| 130 | .restart = fsl_rstcr_restart, | 130 | .restart = fsl_rstcr_restart, |
diff --git a/arch/powerpc/platforms/85xx/xes_mpc85xx.c b/arch/powerpc/platforms/85xx/xes_mpc85xx.c index ee01532786e4..1b426050a2f9 100644 --- a/arch/powerpc/platforms/85xx/xes_mpc85xx.c +++ b/arch/powerpc/platforms/85xx/xes_mpc85xx.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | 32 | ||
| 33 | #include <sysdev/fsl_soc.h> | 33 | #include <sysdev/fsl_soc.h> |
| 34 | #include <sysdev/fsl_pci.h> | 34 | #include <sysdev/fsl_pci.h> |
| 35 | #include <linux/of_platform.h> | ||
| 36 | 35 | ||
| 37 | /* A few bit definitions needed for fixups on some boards */ | 36 | /* A few bit definitions needed for fixups on some boards */ |
| 38 | #define MPC85xx_L2CTL_L2E 0x80000000 /* L2 enable */ | 37 | #define MPC85xx_L2CTL_L2E 0x80000000 /* L2 enable */ |
diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c index 9046803c8276..bc97fada48c6 100644 --- a/arch/powerpc/platforms/cell/smp.c +++ b/arch/powerpc/platforms/cell/smp.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #include <asm/prom.h> | 36 | #include <asm/prom.h> |
| 37 | #include <asm/smp.h> | 37 | #include <asm/smp.h> |
| 38 | #include <asm/paca.h> | 38 | #include <asm/paca.h> |
| 39 | #include <asm/time.h> | ||
| 40 | #include <asm/machdep.h> | 39 | #include <asm/machdep.h> |
| 41 | #include <asm/cputable.h> | 40 | #include <asm/cputable.h> |
| 42 | #include <asm/firmware.h> | 41 | #include <asm/firmware.h> |
| @@ -140,31 +139,6 @@ static void __devinit smp_cell_setup_cpu(int cpu) | |||
| 140 | mtspr(SPRN_DABRX, DABRX_KERNEL | DABRX_USER); | 139 | mtspr(SPRN_DABRX, DABRX_KERNEL | DABRX_USER); |
| 141 | } | 140 | } |
| 142 | 141 | ||
| 143 | static DEFINE_SPINLOCK(timebase_lock); | ||
| 144 | static unsigned long timebase = 0; | ||
| 145 | |||
| 146 | static void __devinit cell_give_timebase(void) | ||
| 147 | { | ||
| 148 | spin_lock(&timebase_lock); | ||
| 149 | rtas_call(rtas_token("freeze-time-base"), 0, 1, NULL); | ||
| 150 | timebase = get_tb(); | ||
| 151 | spin_unlock(&timebase_lock); | ||
| 152 | |||
| 153 | while (timebase) | ||
| 154 | barrier(); | ||
| 155 | rtas_call(rtas_token("thaw-time-base"), 0, 1, NULL); | ||
| 156 | } | ||
| 157 | |||
| 158 | static void __devinit cell_take_timebase(void) | ||
| 159 | { | ||
| 160 | while (!timebase) | ||
| 161 | barrier(); | ||
| 162 | spin_lock(&timebase_lock); | ||
| 163 | set_tb(timebase >> 32, timebase & 0xffffffff); | ||
| 164 | timebase = 0; | ||
| 165 | spin_unlock(&timebase_lock); | ||
| 166 | } | ||
| 167 | |||
| 168 | static void __devinit smp_cell_kick_cpu(int nr) | 142 | static void __devinit smp_cell_kick_cpu(int nr) |
| 169 | { | 143 | { |
| 170 | BUG_ON(nr < 0 || nr >= NR_CPUS); | 144 | BUG_ON(nr < 0 || nr >= NR_CPUS); |
| @@ -224,8 +198,8 @@ void __init smp_init_cell(void) | |||
| 224 | 198 | ||
| 225 | /* Non-lpar has additional take/give timebase */ | 199 | /* Non-lpar has additional take/give timebase */ |
| 226 | if (rtas_token("freeze-time-base") != RTAS_UNKNOWN_SERVICE) { | 200 | if (rtas_token("freeze-time-base") != RTAS_UNKNOWN_SERVICE) { |
| 227 | smp_ops->give_timebase = cell_give_timebase; | 201 | smp_ops->give_timebase = rtas_give_timebase; |
| 228 | smp_ops->take_timebase = cell_take_timebase; | 202 | smp_ops->take_timebase = rtas_take_timebase; |
| 229 | } | 203 | } |
| 230 | 204 | ||
| 231 | DBG(" <- smp_init_cell()\n"); | 205 | DBG(" <- smp_init_cell()\n"); |
diff --git a/arch/powerpc/platforms/chrp/smp.c b/arch/powerpc/platforms/chrp/smp.c index 10a4a4d063b6..02cafecc90e3 100644 --- a/arch/powerpc/platforms/chrp/smp.c +++ b/arch/powerpc/platforms/chrp/smp.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | #include <asm/io.h> | 26 | #include <asm/io.h> |
| 27 | #include <asm/prom.h> | 27 | #include <asm/prom.h> |
| 28 | #include <asm/smp.h> | 28 | #include <asm/smp.h> |
| 29 | #include <asm/time.h> | ||
| 30 | #include <asm/machdep.h> | 29 | #include <asm/machdep.h> |
| 31 | #include <asm/mpic.h> | 30 | #include <asm/mpic.h> |
| 32 | #include <asm/rtas.h> | 31 | #include <asm/rtas.h> |
| @@ -42,40 +41,12 @@ static void __devinit smp_chrp_setup_cpu(int cpu_nr) | |||
| 42 | mpic_setup_this_cpu(); | 41 | mpic_setup_this_cpu(); |
| 43 | } | 42 | } |
| 44 | 43 | ||
| 45 | static DEFINE_SPINLOCK(timebase_lock); | ||
| 46 | static unsigned int timebase_upper = 0, timebase_lower = 0; | ||
| 47 | |||
| 48 | void __devinit smp_chrp_give_timebase(void) | ||
| 49 | { | ||
| 50 | spin_lock(&timebase_lock); | ||
| 51 | rtas_call(rtas_token("freeze-time-base"), 0, 1, NULL); | ||
| 52 | timebase_upper = get_tbu(); | ||
| 53 | timebase_lower = get_tbl(); | ||
| 54 | spin_unlock(&timebase_lock); | ||
| 55 | |||
| 56 | while (timebase_upper || timebase_lower) | ||
| 57 | barrier(); | ||
| 58 | rtas_call(rtas_token("thaw-time-base"), 0, 1, NULL); | ||
| 59 | } | ||
| 60 | |||
| 61 | void __devinit smp_chrp_take_timebase(void) | ||
| 62 | { | ||
| 63 | while (!(timebase_upper || timebase_lower)) | ||
| 64 | barrier(); | ||
| 65 | spin_lock(&timebase_lock); | ||
| 66 | set_tb(timebase_upper, timebase_lower); | ||
| 67 | timebase_upper = 0; | ||
| 68 | timebase_lower = 0; | ||
| 69 | spin_unlock(&timebase_lock); | ||
| 70 | printk("CPU %i taken timebase\n", smp_processor_id()); | ||
| 71 | } | ||
| 72 | |||
| 73 | /* CHRP with openpic */ | 44 | /* CHRP with openpic */ |
| 74 | struct smp_ops_t chrp_smp_ops = { | 45 | struct smp_ops_t chrp_smp_ops = { |
| 75 | .message_pass = smp_mpic_message_pass, | 46 | .message_pass = smp_mpic_message_pass, |
| 76 | .probe = smp_mpic_probe, | 47 | .probe = smp_mpic_probe, |
| 77 | .kick_cpu = smp_chrp_kick_cpu, | 48 | .kick_cpu = smp_chrp_kick_cpu, |
| 78 | .setup_cpu = smp_chrp_setup_cpu, | 49 | .setup_cpu = smp_chrp_setup_cpu, |
| 79 | .give_timebase = smp_chrp_give_timebase, | 50 | .give_timebase = rtas_give_timebase, |
| 80 | .take_timebase = smp_chrp_take_timebase, | 51 | .take_timebase = rtas_take_timebase, |
| 81 | }; | 52 | }; |
diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c index 153051eb6d93..a4619347aa7e 100644 --- a/arch/powerpc/platforms/pasemi/setup.c +++ b/arch/powerpc/platforms/pasemi/setup.c | |||
| @@ -71,20 +71,25 @@ static void pas_restart(char *cmd) | |||
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | #ifdef CONFIG_SMP | 73 | #ifdef CONFIG_SMP |
| 74 | static DEFINE_SPINLOCK(timebase_lock); | 74 | static raw_spinlock_t timebase_lock; |
| 75 | static unsigned long timebase; | 75 | static unsigned long timebase; |
| 76 | 76 | ||
| 77 | static void __devinit pas_give_timebase(void) | 77 | static void __devinit pas_give_timebase(void) |
| 78 | { | 78 | { |
| 79 | spin_lock(&timebase_lock); | 79 | unsigned long flags; |
| 80 | |||
| 81 | local_irq_save(flags); | ||
| 82 | hard_irq_disable(); | ||
| 83 | __raw_spin_lock(&timebase_lock); | ||
| 80 | mtspr(SPRN_TBCTL, TBCTL_FREEZE); | 84 | mtspr(SPRN_TBCTL, TBCTL_FREEZE); |
| 81 | isync(); | 85 | isync(); |
| 82 | timebase = get_tb(); | 86 | timebase = get_tb(); |
| 83 | spin_unlock(&timebase_lock); | 87 | __raw_spin_unlock(&timebase_lock); |
| 84 | 88 | ||
| 85 | while (timebase) | 89 | while (timebase) |
| 86 | barrier(); | 90 | barrier(); |
| 87 | mtspr(SPRN_TBCTL, TBCTL_RESTART); | 91 | mtspr(SPRN_TBCTL, TBCTL_RESTART); |
| 92 | local_irq_restore(flags); | ||
| 88 | } | 93 | } |
| 89 | 94 | ||
| 90 | static void __devinit pas_take_timebase(void) | 95 | static void __devinit pas_take_timebase(void) |
| @@ -92,10 +97,10 @@ static void __devinit pas_take_timebase(void) | |||
| 92 | while (!timebase) | 97 | while (!timebase) |
| 93 | smp_rmb(); | 98 | smp_rmb(); |
| 94 | 99 | ||
| 95 | spin_lock(&timebase_lock); | 100 | __raw_spin_lock(&timebase_lock); |
| 96 | set_tb(timebase >> 32, timebase & 0xffffffff); | 101 | set_tb(timebase >> 32, timebase & 0xffffffff); |
| 97 | timebase = 0; | 102 | timebase = 0; |
| 98 | spin_unlock(&timebase_lock); | 103 | __raw_spin_unlock(&timebase_lock); |
| 99 | } | 104 | } |
| 100 | 105 | ||
| 101 | struct smp_ops_t pas_smp_ops = { | 106 | struct smp_ops_t pas_smp_ops = { |
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c index 86f69a4eb49b..c20522656367 100644 --- a/arch/powerpc/platforms/powermac/setup.c +++ b/arch/powerpc/platforms/powermac/setup.c | |||
| @@ -103,11 +103,6 @@ unsigned long smu_cmdbuf_abs; | |||
| 103 | EXPORT_SYMBOL(smu_cmdbuf_abs); | 103 | EXPORT_SYMBOL(smu_cmdbuf_abs); |
| 104 | #endif | 104 | #endif |
| 105 | 105 | ||
| 106 | #ifdef CONFIG_SMP | ||
| 107 | extern struct smp_ops_t psurge_smp_ops; | ||
| 108 | extern struct smp_ops_t core99_smp_ops; | ||
| 109 | #endif /* CONFIG_SMP */ | ||
| 110 | |||
| 111 | static void pmac_show_cpuinfo(struct seq_file *m) | 106 | static void pmac_show_cpuinfo(struct seq_file *m) |
| 112 | { | 107 | { |
| 113 | struct device_node *np; | 108 | struct device_node *np; |
| @@ -341,34 +336,6 @@ static void __init pmac_setup_arch(void) | |||
| 341 | ROOT_DEV = DEFAULT_ROOT_DEVICE; | 336 | ROOT_DEV = DEFAULT_ROOT_DEVICE; |
| 342 | #endif | 337 | #endif |
| 343 | 338 | ||
| 344 | #ifdef CONFIG_SMP | ||
| 345 | /* Check for Core99 */ | ||
| 346 | ic = of_find_node_by_name(NULL, "uni-n"); | ||
| 347 | if (!ic) | ||
| 348 | ic = of_find_node_by_name(NULL, "u3"); | ||
| 349 | if (!ic) | ||
| 350 | ic = of_find_node_by_name(NULL, "u4"); | ||
| 351 | if (ic) { | ||
| 352 | of_node_put(ic); | ||
| 353 | smp_ops = &core99_smp_ops; | ||
| 354 | } | ||
| 355 | #ifdef CONFIG_PPC32 | ||
| 356 | else { | ||
| 357 | /* | ||
| 358 | * We have to set bits in cpu_possible_map here since the | ||
| 359 | * secondary CPU(s) aren't in the device tree, and | ||
| 360 | * setup_per_cpu_areas only allocates per-cpu data for | ||
| 361 | * CPUs in the cpu_possible_map. | ||
| 362 | */ | ||
| 363 | int cpu; | ||
| 364 | |||
| 365 | for (cpu = 1; cpu < 4 && cpu < NR_CPUS; ++cpu) | ||
| 366 | cpu_set(cpu, cpu_possible_map); | ||
| 367 | smp_ops = &psurge_smp_ops; | ||
| 368 | } | ||
| 369 | #endif | ||
| 370 | #endif /* CONFIG_SMP */ | ||
| 371 | |||
| 372 | #ifdef CONFIG_ADB | 339 | #ifdef CONFIG_ADB |
| 373 | if (strstr(cmd_line, "adb_sync")) { | 340 | if (strstr(cmd_line, "adb_sync")) { |
| 374 | extern int __adb_probe_sync; | 341 | extern int __adb_probe_sync; |
| @@ -512,6 +479,14 @@ static void __init pmac_init_early(void) | |||
| 512 | #ifdef CONFIG_PPC64 | 479 | #ifdef CONFIG_PPC64 |
| 513 | iommu_init_early_dart(); | 480 | iommu_init_early_dart(); |
| 514 | #endif | 481 | #endif |
| 482 | |||
| 483 | /* SMP Init has to be done early as we need to patch up | ||
| 484 | * cpu_possible_map before interrupt stacks are allocated | ||
| 485 | * or kaboom... | ||
| 486 | */ | ||
| 487 | #ifdef CONFIG_SMP | ||
| 488 | pmac_setup_smp(); | ||
| 489 | #endif | ||
| 515 | } | 490 | } |
| 516 | 491 | ||
| 517 | static int __init pmac_declare_of_platform_devices(void) | 492 | static int __init pmac_declare_of_platform_devices(void) |
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index cf1dbe758890..6d4da7b46b41 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
| @@ -64,10 +64,11 @@ | |||
| 64 | extern void __secondary_start_pmac_0(void); | 64 | extern void __secondary_start_pmac_0(void); |
| 65 | extern int pmac_pfunc_base_install(void); | 65 | extern int pmac_pfunc_base_install(void); |
| 66 | 66 | ||
| 67 | #ifdef CONFIG_PPC32 | 67 | static void (*pmac_tb_freeze)(int freeze); |
| 68 | static u64 timebase; | ||
| 69 | static int tb_req; | ||
| 68 | 70 | ||
| 69 | /* Sync flag for HW tb sync */ | 71 | #ifdef CONFIG_PPC32 |
| 70 | static volatile int sec_tb_reset = 0; | ||
| 71 | 72 | ||
| 72 | /* | 73 | /* |
| 73 | * Powersurge (old powermac SMP) support. | 74 | * Powersurge (old powermac SMP) support. |
| @@ -294,6 +295,9 @@ static int __init smp_psurge_probe(void) | |||
| 294 | psurge_quad_init(); | 295 | psurge_quad_init(); |
| 295 | /* All released cards using this HW design have 4 CPUs */ | 296 | /* All released cards using this HW design have 4 CPUs */ |
| 296 | ncpus = 4; | 297 | ncpus = 4; |
| 298 | /* No sure how timebase sync works on those, let's use SW */ | ||
| 299 | smp_ops->give_timebase = smp_generic_give_timebase; | ||
| 300 | smp_ops->take_timebase = smp_generic_take_timebase; | ||
| 297 | } else { | 301 | } else { |
| 298 | iounmap(quad_base); | 302 | iounmap(quad_base); |
| 299 | if ((in_8(hhead_base + HHEAD_CONFIG) & 0x02) == 0) { | 303 | if ((in_8(hhead_base + HHEAD_CONFIG) & 0x02) == 0) { |
| @@ -308,18 +312,15 @@ static int __init smp_psurge_probe(void) | |||
| 308 | psurge_start = ioremap(PSURGE_START, 4); | 312 | psurge_start = ioremap(PSURGE_START, 4); |
| 309 | psurge_pri_intr = ioremap(PSURGE_PRI_INTR, 4); | 313 | psurge_pri_intr = ioremap(PSURGE_PRI_INTR, 4); |
| 310 | 314 | ||
| 311 | /* | 315 | /* This is necessary because OF doesn't know about the |
| 312 | * This is necessary because OF doesn't know about the | ||
| 313 | * secondary cpu(s), and thus there aren't nodes in the | 316 | * secondary cpu(s), and thus there aren't nodes in the |
| 314 | * device tree for them, and smp_setup_cpu_maps hasn't | 317 | * device tree for them, and smp_setup_cpu_maps hasn't |
| 315 | * set their bits in cpu_possible_map and cpu_present_map. | 318 | * set their bits in cpu_present_map. |
| 316 | */ | 319 | */ |
| 317 | if (ncpus > NR_CPUS) | 320 | if (ncpus > NR_CPUS) |
| 318 | ncpus = NR_CPUS; | 321 | ncpus = NR_CPUS; |
| 319 | for (i = 1; i < ncpus ; ++i) { | 322 | for (i = 1; i < ncpus ; ++i) |
| 320 | cpu_set(i, cpu_present_map); | 323 | cpu_set(i, cpu_present_map); |
| 321 | set_hard_smp_processor_id(i, i); | ||
| 322 | } | ||
| 323 | 324 | ||
| 324 | if (ppc_md.progress) ppc_md.progress("smp_psurge_probe - done", 0x352); | 325 | if (ppc_md.progress) ppc_md.progress("smp_psurge_probe - done", 0x352); |
| 325 | 326 | ||
| @@ -329,8 +330,14 @@ static int __init smp_psurge_probe(void) | |||
| 329 | static void __init smp_psurge_kick_cpu(int nr) | 330 | static void __init smp_psurge_kick_cpu(int nr) |
| 330 | { | 331 | { |
| 331 | unsigned long start = __pa(__secondary_start_pmac_0) + nr * 8; | 332 | unsigned long start = __pa(__secondary_start_pmac_0) + nr * 8; |
| 332 | unsigned long a; | 333 | unsigned long a, flags; |
| 333 | int i; | 334 | int i, j; |
| 335 | |||
| 336 | /* Defining this here is evil ... but I prefer hiding that | ||
| 337 | * crap to avoid giving people ideas that they can do the | ||
| 338 | * same. | ||
| 339 | */ | ||
| 340 | extern volatile unsigned int cpu_callin_map[NR_CPUS]; | ||
| 334 | 341 | ||
| 335 | /* may need to flush here if secondary bats aren't setup */ | 342 | /* may need to flush here if secondary bats aren't setup */ |
| 336 | for (a = KERNELBASE; a < KERNELBASE + 0x800000; a += 32) | 343 | for (a = KERNELBASE; a < KERNELBASE + 0x800000; a += 32) |
| @@ -339,47 +346,52 @@ static void __init smp_psurge_kick_cpu(int nr) | |||
| 339 | 346 | ||
| 340 | if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu", 0x353); | 347 | if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu", 0x353); |
| 341 | 348 | ||
| 349 | /* This is going to freeze the timeebase, we disable interrupts */ | ||
| 350 | local_irq_save(flags); | ||
| 351 | |||
| 342 | out_be32(psurge_start, start); | 352 | out_be32(psurge_start, start); |
| 343 | mb(); | 353 | mb(); |
| 344 | 354 | ||
| 345 | psurge_set_ipi(nr); | 355 | psurge_set_ipi(nr); |
| 356 | |||
| 346 | /* | 357 | /* |
| 347 | * We can't use udelay here because the timebase is now frozen. | 358 | * We can't use udelay here because the timebase is now frozen. |
| 348 | */ | 359 | */ |
| 349 | for (i = 0; i < 2000; ++i) | 360 | for (i = 0; i < 2000; ++i) |
| 350 | barrier(); | 361 | asm volatile("nop" : : : "memory"); |
| 351 | psurge_clr_ipi(nr); | 362 | psurge_clr_ipi(nr); |
| 352 | 363 | ||
| 353 | if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu - done", 0x354); | 364 | /* |
| 354 | } | 365 | * Also, because the timebase is frozen, we must not return to the |
| 355 | 366 | * caller which will try to do udelay's etc... Instead, we wait -here- | |
| 356 | /* | 367 | * for the CPU to callin. |
| 357 | * With the dual-cpu powersurge board, the decrementers and timebases | 368 | */ |
| 358 | * of both cpus are frozen after the secondary cpu is started up, | 369 | for (i = 0; i < 100000 && !cpu_callin_map[nr]; ++i) { |
| 359 | * until we give the secondary cpu another interrupt. This routine | 370 | for (j = 1; j < 10000; j++) |
| 360 | * uses this to get the timebases synchronized. | 371 | asm volatile("nop" : : : "memory"); |
| 361 | * -- paulus. | 372 | asm volatile("sync" : : : "memory"); |
| 362 | */ | 373 | } |
| 363 | static void __init psurge_dual_sync_tb(int cpu_nr) | 374 | if (!cpu_callin_map[nr]) |
| 364 | { | 375 | goto stuck; |
| 365 | int t; | 376 | |
| 366 | 377 | /* And we do the TB sync here too for standard dual CPU cards */ | |
| 367 | set_dec(tb_ticks_per_jiffy); | 378 | if (psurge_type == PSURGE_DUAL) { |
| 368 | /* XXX fixme */ | 379 | while(!tb_req) |
| 369 | set_tb(0, 0); | 380 | barrier(); |
| 370 | 381 | tb_req = 0; | |
| 371 | if (cpu_nr > 0) { | 382 | mb(); |
| 383 | timebase = get_tb(); | ||
| 384 | mb(); | ||
| 385 | while (timebase) | ||
| 386 | barrier(); | ||
| 372 | mb(); | 387 | mb(); |
| 373 | sec_tb_reset = 1; | ||
| 374 | return; | ||
| 375 | } | 388 | } |
| 389 | stuck: | ||
| 390 | /* now interrupt the secondary, restarting both TBs */ | ||
| 391 | if (psurge_type == PSURGE_DUAL) | ||
| 392 | psurge_set_ipi(1); | ||
| 376 | 393 | ||
| 377 | /* wait for the secondary to have reset its TB before proceeding */ | 394 | if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu - done", 0x354); |
| 378 | for (t = 10000000; t > 0 && !sec_tb_reset; --t) | ||
| 379 | ; | ||
| 380 | |||
| 381 | /* now interrupt the secondary, starting both TBs */ | ||
| 382 | psurge_set_ipi(1); | ||
| 383 | } | 395 | } |
| 384 | 396 | ||
| 385 | static struct irqaction psurge_irqaction = { | 397 | static struct irqaction psurge_irqaction = { |
| @@ -390,36 +402,35 @@ static struct irqaction psurge_irqaction = { | |||
| 390 | 402 | ||
| 391 | static void __init smp_psurge_setup_cpu(int cpu_nr) | 403 | static void __init smp_psurge_setup_cpu(int cpu_nr) |
| 392 | { | 404 | { |
| 405 | if (cpu_nr != 0) | ||
| 406 | return; | ||
| 393 | 407 | ||
| 394 | if (cpu_nr == 0) { | 408 | /* reset the entry point so if we get another intr we won't |
| 395 | /* If we failed to start the second CPU, we should still | 409 | * try to startup again */ |
| 396 | * send it an IPI to start the timebase & DEC or we might | 410 | out_be32(psurge_start, 0x100); |
| 397 | * have them stuck. | 411 | if (setup_irq(30, &psurge_irqaction)) |
| 398 | */ | 412 | printk(KERN_ERR "Couldn't get primary IPI interrupt"); |
| 399 | if (num_online_cpus() < 2) { | ||
| 400 | if (psurge_type == PSURGE_DUAL) | ||
| 401 | psurge_set_ipi(1); | ||
| 402 | return; | ||
| 403 | } | ||
| 404 | /* reset the entry point so if we get another intr we won't | ||
| 405 | * try to startup again */ | ||
| 406 | out_be32(psurge_start, 0x100); | ||
| 407 | if (setup_irq(30, &psurge_irqaction)) | ||
| 408 | printk(KERN_ERR "Couldn't get primary IPI interrupt"); | ||
| 409 | } | ||
| 410 | |||
| 411 | if (psurge_type == PSURGE_DUAL) | ||
| 412 | psurge_dual_sync_tb(cpu_nr); | ||
| 413 | } | 413 | } |
| 414 | 414 | ||
| 415 | void __init smp_psurge_take_timebase(void) | 415 | void __init smp_psurge_take_timebase(void) |
| 416 | { | 416 | { |
| 417 | /* Dummy implementation */ | 417 | if (psurge_type != PSURGE_DUAL) |
| 418 | return; | ||
| 419 | |||
| 420 | tb_req = 1; | ||
| 421 | mb(); | ||
| 422 | while (!timebase) | ||
| 423 | barrier(); | ||
| 424 | mb(); | ||
| 425 | set_tb(timebase >> 32, timebase & 0xffffffff); | ||
| 426 | timebase = 0; | ||
| 427 | mb(); | ||
| 428 | set_dec(tb_ticks_per_jiffy/2); | ||
| 418 | } | 429 | } |
| 419 | 430 | ||
| 420 | void __init smp_psurge_give_timebase(void) | 431 | void __init smp_psurge_give_timebase(void) |
| 421 | { | 432 | { |
| 422 | /* Dummy implementation */ | 433 | /* Nothing to do here */ |
| 423 | } | 434 | } |
| 424 | 435 | ||
| 425 | /* PowerSurge-style Macs */ | 436 | /* PowerSurge-style Macs */ |
| @@ -437,9 +448,6 @@ struct smp_ops_t psurge_smp_ops = { | |||
| 437 | * Core 99 and later support | 448 | * Core 99 and later support |
| 438 | */ | 449 | */ |
| 439 | 450 | ||
| 440 | static void (*pmac_tb_freeze)(int freeze); | ||
| 441 | static u64 timebase; | ||
| 442 | static int tb_req; | ||
| 443 | 451 | ||
| 444 | static void smp_core99_give_timebase(void) | 452 | static void smp_core99_give_timebase(void) |
| 445 | { | 453 | { |
| @@ -478,7 +486,6 @@ static void __devinit smp_core99_take_timebase(void) | |||
| 478 | set_tb(timebase >> 32, timebase & 0xffffffff); | 486 | set_tb(timebase >> 32, timebase & 0xffffffff); |
| 479 | timebase = 0; | 487 | timebase = 0; |
| 480 | mb(); | 488 | mb(); |
| 481 | set_dec(tb_ticks_per_jiffy/2); | ||
| 482 | 489 | ||
| 483 | local_irq_restore(flags); | 490 | local_irq_restore(flags); |
| 484 | } | 491 | } |
| @@ -920,3 +927,34 @@ struct smp_ops_t core99_smp_ops = { | |||
| 920 | # endif | 927 | # endif |
| 921 | #endif | 928 | #endif |
| 922 | }; | 929 | }; |
| 930 | |||
| 931 | void __init pmac_setup_smp(void) | ||
| 932 | { | ||
| 933 | struct device_node *np; | ||
| 934 | |||
| 935 | /* Check for Core99 */ | ||
| 936 | np = of_find_node_by_name(NULL, "uni-n"); | ||
| 937 | if (!np) | ||
| 938 | np = of_find_node_by_name(NULL, "u3"); | ||
| 939 | if (!np) | ||
| 940 | np = of_find_node_by_name(NULL, "u4"); | ||
| 941 | if (np) { | ||
| 942 | of_node_put(np); | ||
| 943 | smp_ops = &core99_smp_ops; | ||
| 944 | } | ||
| 945 | #ifdef CONFIG_PPC32 | ||
| 946 | else { | ||
| 947 | /* We have to set bits in cpu_possible_map here since the | ||
| 948 | * secondary CPU(s) aren't in the device tree. Various | ||
| 949 | * things won't be initialized for CPUs not in the possible | ||
| 950 | * map, so we really need to fix it up here. | ||
| 951 | */ | ||
| 952 | int cpu; | ||
| 953 | |||
| 954 | for (cpu = 1; cpu < 4 && cpu < NR_CPUS; ++cpu) | ||
| 955 | cpu_set(cpu, cpu_possible_map); | ||
| 956 | smp_ops = &psurge_smp_ops; | ||
| 957 | } | ||
| 958 | #endif /* CONFIG_PPC32 */ | ||
| 959 | } | ||
| 960 | |||
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 1a231c389ba0..1f8f6cfb94f7 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include <asm/prom.h> | 35 | #include <asm/prom.h> |
| 36 | #include <asm/smp.h> | 36 | #include <asm/smp.h> |
| 37 | #include <asm/paca.h> | 37 | #include <asm/paca.h> |
| 38 | #include <asm/time.h> | ||
| 39 | #include <asm/machdep.h> | 38 | #include <asm/machdep.h> |
| 40 | #include <asm/cputable.h> | 39 | #include <asm/cputable.h> |
| 41 | #include <asm/firmware.h> | 40 | #include <asm/firmware.h> |
| @@ -118,31 +117,6 @@ static void __devinit smp_xics_setup_cpu(int cpu) | |||
| 118 | } | 117 | } |
| 119 | #endif /* CONFIG_XICS */ | 118 | #endif /* CONFIG_XICS */ |
| 120 | 119 | ||
| 121 | static DEFINE_SPINLOCK(timebase_lock); | ||
| 122 | static unsigned long timebase = 0; | ||
| 123 | |||
| 124 | static void __devinit pSeries_give_timebase(void) | ||
| 125 | { | ||
| 126 | spin_lock(&timebase_lock); | ||
| 127 | rtas_call(rtas_token("freeze-time-base"), 0, 1, NULL); | ||
| 128 | timebase = get_tb(); | ||
| 129 | spin_unlock(&timebase_lock); | ||
| 130 | |||
| 131 | while (timebase) | ||
| 132 | barrier(); | ||
| 133 | rtas_call(rtas_token("thaw-time-base"), 0, 1, NULL); | ||
| 134 | } | ||
| 135 | |||
| 136 | static void __devinit pSeries_take_timebase(void) | ||
| 137 | { | ||
| 138 | while (!timebase) | ||
| 139 | barrier(); | ||
| 140 | spin_lock(&timebase_lock); | ||
| 141 | set_tb(timebase >> 32, timebase & 0xffffffff); | ||
| 142 | timebase = 0; | ||
| 143 | spin_unlock(&timebase_lock); | ||
| 144 | } | ||
| 145 | |||
| 146 | static void __devinit smp_pSeries_kick_cpu(int nr) | 120 | static void __devinit smp_pSeries_kick_cpu(int nr) |
| 147 | { | 121 | { |
| 148 | BUG_ON(nr < 0 || nr >= NR_CPUS); | 122 | BUG_ON(nr < 0 || nr >= NR_CPUS); |
| @@ -209,8 +183,8 @@ static void __init smp_init_pseries(void) | |||
| 209 | 183 | ||
| 210 | /* Non-lpar has additional take/give timebase */ | 184 | /* Non-lpar has additional take/give timebase */ |
| 211 | if (rtas_token("freeze-time-base") != RTAS_UNKNOWN_SERVICE) { | 185 | if (rtas_token("freeze-time-base") != RTAS_UNKNOWN_SERVICE) { |
| 212 | smp_ops->give_timebase = pSeries_give_timebase; | 186 | smp_ops->give_timebase = rtas_give_timebase; |
| 213 | smp_ops->take_timebase = pSeries_take_timebase; | 187 | smp_ops->take_timebase = rtas_take_timebase; |
| 214 | } | 188 | } |
| 215 | 189 | ||
| 216 | pr_debug(" <- smp_init_pSeries()\n"); | 190 | pr_debug(" <- smp_init_pSeries()\n"); |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 9c3af5045495..d46de1f0f3ee 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
| @@ -279,28 +279,29 @@ static void _mpic_map_mmio(struct mpic *mpic, phys_addr_t phys_addr, | |||
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | #ifdef CONFIG_PPC_DCR | 281 | #ifdef CONFIG_PPC_DCR |
| 282 | static void _mpic_map_dcr(struct mpic *mpic, struct mpic_reg_bank *rb, | 282 | static void _mpic_map_dcr(struct mpic *mpic, struct device_node *node, |
| 283 | struct mpic_reg_bank *rb, | ||
| 283 | unsigned int offset, unsigned int size) | 284 | unsigned int offset, unsigned int size) |
| 284 | { | 285 | { |
| 285 | const u32 *dbasep; | 286 | const u32 *dbasep; |
| 286 | 287 | ||
| 287 | dbasep = of_get_property(mpic->irqhost->of_node, "dcr-reg", NULL); | 288 | dbasep = of_get_property(node, "dcr-reg", NULL); |
| 288 | 289 | ||
| 289 | rb->dhost = dcr_map(mpic->irqhost->of_node, *dbasep + offset, size); | 290 | rb->dhost = dcr_map(node, *dbasep + offset, size); |
| 290 | BUG_ON(!DCR_MAP_OK(rb->dhost)); | 291 | BUG_ON(!DCR_MAP_OK(rb->dhost)); |
| 291 | } | 292 | } |
| 292 | 293 | ||
| 293 | static inline void mpic_map(struct mpic *mpic, phys_addr_t phys_addr, | 294 | static inline void mpic_map(struct mpic *mpic, struct device_node *node, |
| 294 | struct mpic_reg_bank *rb, unsigned int offset, | 295 | phys_addr_t phys_addr, struct mpic_reg_bank *rb, |
| 295 | unsigned int size) | 296 | unsigned int offset, unsigned int size) |
| 296 | { | 297 | { |
| 297 | if (mpic->flags & MPIC_USES_DCR) | 298 | if (mpic->flags & MPIC_USES_DCR) |
| 298 | _mpic_map_dcr(mpic, rb, offset, size); | 299 | _mpic_map_dcr(mpic, node, rb, offset, size); |
| 299 | else | 300 | else |
| 300 | _mpic_map_mmio(mpic, phys_addr, rb, offset, size); | 301 | _mpic_map_mmio(mpic, phys_addr, rb, offset, size); |
| 301 | } | 302 | } |
| 302 | #else /* CONFIG_PPC_DCR */ | 303 | #else /* CONFIG_PPC_DCR */ |
| 303 | #define mpic_map(m,p,b,o,s) _mpic_map_mmio(m,p,b,o,s) | 304 | #define mpic_map(m,n,p,b,o,s) _mpic_map_mmio(m,p,b,o,s) |
| 304 | #endif /* !CONFIG_PPC_DCR */ | 305 | #endif /* !CONFIG_PPC_DCR */ |
| 305 | 306 | ||
| 306 | 307 | ||
| @@ -1052,11 +1053,10 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
| 1052 | int intvec_top; | 1053 | int intvec_top; |
| 1053 | u64 paddr = phys_addr; | 1054 | u64 paddr = phys_addr; |
| 1054 | 1055 | ||
| 1055 | mpic = alloc_bootmem(sizeof(struct mpic)); | 1056 | mpic = kzalloc(sizeof(struct mpic), GFP_KERNEL); |
| 1056 | if (mpic == NULL) | 1057 | if (mpic == NULL) |
| 1057 | return NULL; | 1058 | return NULL; |
| 1058 | 1059 | ||
| 1059 | memset(mpic, 0, sizeof(struct mpic)); | ||
| 1060 | mpic->name = name; | 1060 | mpic->name = name; |
| 1061 | 1061 | ||
| 1062 | mpic->hc_irq = mpic_irq_chip; | 1062 | mpic->hc_irq = mpic_irq_chip; |
| @@ -1152,8 +1152,8 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
| 1152 | } | 1152 | } |
| 1153 | 1153 | ||
| 1154 | /* Map the global registers */ | 1154 | /* Map the global registers */ |
| 1155 | mpic_map(mpic, paddr, &mpic->gregs, MPIC_INFO(GREG_BASE), 0x1000); | 1155 | mpic_map(mpic, node, paddr, &mpic->gregs, MPIC_INFO(GREG_BASE), 0x1000); |
| 1156 | mpic_map(mpic, paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000); | 1156 | mpic_map(mpic, node, paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000); |
| 1157 | 1157 | ||
| 1158 | /* Reset */ | 1158 | /* Reset */ |
| 1159 | if (flags & MPIC_WANTS_RESET) { | 1159 | if (flags & MPIC_WANTS_RESET) { |
| @@ -1194,7 +1194,7 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
| 1194 | 1194 | ||
| 1195 | /* Map the per-CPU registers */ | 1195 | /* Map the per-CPU registers */ |
| 1196 | for (i = 0; i < mpic->num_cpus; i++) { | 1196 | for (i = 0; i < mpic->num_cpus; i++) { |
| 1197 | mpic_map(mpic, paddr, &mpic->cpuregs[i], | 1197 | mpic_map(mpic, node, paddr, &mpic->cpuregs[i], |
| 1198 | MPIC_INFO(CPU_BASE) + i * MPIC_INFO(CPU_STRIDE), | 1198 | MPIC_INFO(CPU_BASE) + i * MPIC_INFO(CPU_STRIDE), |
| 1199 | 0x1000); | 1199 | 0x1000); |
| 1200 | } | 1200 | } |
| @@ -1202,7 +1202,7 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
| 1202 | /* Initialize main ISU if none provided */ | 1202 | /* Initialize main ISU if none provided */ |
| 1203 | if (mpic->isu_size == 0) { | 1203 | if (mpic->isu_size == 0) { |
| 1204 | mpic->isu_size = mpic->num_sources; | 1204 | mpic->isu_size = mpic->num_sources; |
| 1205 | mpic_map(mpic, paddr, &mpic->isus[0], | 1205 | mpic_map(mpic, node, paddr, &mpic->isus[0], |
| 1206 | MPIC_INFO(IRQ_BASE), MPIC_INFO(IRQ_STRIDE) * mpic->isu_size); | 1206 | MPIC_INFO(IRQ_BASE), MPIC_INFO(IRQ_STRIDE) * mpic->isu_size); |
| 1207 | } | 1207 | } |
| 1208 | mpic->isu_shift = 1 + __ilog2(mpic->isu_size - 1); | 1208 | mpic->isu_shift = 1 + __ilog2(mpic->isu_size - 1); |
| @@ -1256,8 +1256,10 @@ void __init mpic_assign_isu(struct mpic *mpic, unsigned int isu_num, | |||
| 1256 | 1256 | ||
| 1257 | BUG_ON(isu_num >= MPIC_MAX_ISU); | 1257 | BUG_ON(isu_num >= MPIC_MAX_ISU); |
| 1258 | 1258 | ||
| 1259 | mpic_map(mpic, paddr, &mpic->isus[isu_num], 0, | 1259 | mpic_map(mpic, mpic->irqhost->of_node, |
| 1260 | paddr, &mpic->isus[isu_num], 0, | ||
| 1260 | MPIC_INFO(IRQ_STRIDE) * mpic->isu_size); | 1261 | MPIC_INFO(IRQ_STRIDE) * mpic->isu_size); |
| 1262 | |||
| 1261 | if ((isu_first + mpic->isu_size) > mpic->num_sources) | 1263 | if ((isu_first + mpic->isu_size) > mpic->num_sources) |
| 1262 | mpic->num_sources = isu_first + mpic->isu_size; | 1264 | mpic->num_sources = isu_first + mpic->isu_size; |
| 1263 | } | 1265 | } |
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c index b28b0e512d67..237e3654f48c 100644 --- a/arch/powerpc/sysdev/qe_lib/qe.c +++ b/arch/powerpc/sysdev/qe_lib/qe.c | |||
| @@ -112,6 +112,7 @@ int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input) | |||
| 112 | { | 112 | { |
| 113 | unsigned long flags; | 113 | unsigned long flags; |
| 114 | u8 mcn_shift = 0, dev_shift = 0; | 114 | u8 mcn_shift = 0, dev_shift = 0; |
| 115 | u32 ret; | ||
| 115 | 116 | ||
| 116 | spin_lock_irqsave(&qe_lock, flags); | 117 | spin_lock_irqsave(&qe_lock, flags); |
| 117 | if (cmd == QE_RESET) { | 118 | if (cmd == QE_RESET) { |
| @@ -139,11 +140,13 @@ int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input) | |||
| 139 | } | 140 | } |
| 140 | 141 | ||
| 141 | /* wait for the QE_CR_FLG to clear */ | 142 | /* wait for the QE_CR_FLG to clear */ |
| 142 | while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG) | 143 | ret = spin_event_timeout((in_be32(&qe_immr->cp.cecr) & QE_CR_FLG) == 0, |
| 143 | cpu_relax(); | 144 | 100, 0); |
| 145 | /* On timeout (e.g. failure), the expression will be false (ret == 0), | ||
| 146 | otherwise it will be true (ret == 1). */ | ||
| 144 | spin_unlock_irqrestore(&qe_lock, flags); | 147 | spin_unlock_irqrestore(&qe_lock, flags); |
| 145 | 148 | ||
| 146 | return 0; | 149 | return ret == 1; |
| 147 | } | 150 | } |
| 148 | EXPORT_SYMBOL(qe_issue_cmd); | 151 | EXPORT_SYMBOL(qe_issue_cmd); |
| 149 | 152 | ||
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index a27d0d5a6f86..1cd02f6073a0 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
| @@ -99,7 +99,9 @@ struct kvm_s390_sie_block { | |||
| 99 | __u8 reservedd0[48]; /* 0x00d0 */ | 99 | __u8 reservedd0[48]; /* 0x00d0 */ |
| 100 | __u64 gcr[16]; /* 0x0100 */ | 100 | __u64 gcr[16]; /* 0x0100 */ |
| 101 | __u64 gbea; /* 0x0180 */ | 101 | __u64 gbea; /* 0x0180 */ |
| 102 | __u8 reserved188[120]; /* 0x0188 */ | 102 | __u8 reserved188[24]; /* 0x0188 */ |
| 103 | __u32 fac; /* 0x01a0 */ | ||
| 104 | __u8 reserved1a4[92]; /* 0x01a4 */ | ||
| 103 | } __attribute__((packed)); | 105 | } __attribute__((packed)); |
| 104 | 106 | ||
| 105 | struct kvm_vcpu_stat { | 107 | struct kvm_vcpu_stat { |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index c18b21d6991c..90d9d1ba258b 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <asm/lowcore.h> | 25 | #include <asm/lowcore.h> |
| 26 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
| 27 | #include <asm/nmi.h> | 27 | #include <asm/nmi.h> |
| 28 | #include <asm/system.h> | ||
| 28 | #include "kvm-s390.h" | 29 | #include "kvm-s390.h" |
| 29 | #include "gaccess.h" | 30 | #include "gaccess.h" |
| 30 | 31 | ||
| @@ -69,6 +70,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
| 69 | { NULL } | 70 | { NULL } |
| 70 | }; | 71 | }; |
| 71 | 72 | ||
| 73 | static unsigned long long *facilities; | ||
| 72 | 74 | ||
| 73 | /* Section: not file related */ | 75 | /* Section: not file related */ |
| 74 | void kvm_arch_hardware_enable(void *garbage) | 76 | void kvm_arch_hardware_enable(void *garbage) |
| @@ -288,6 +290,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | |||
| 288 | vcpu->arch.sie_block->gmsor = vcpu->kvm->arch.guest_origin; | 290 | vcpu->arch.sie_block->gmsor = vcpu->kvm->arch.guest_origin; |
| 289 | vcpu->arch.sie_block->ecb = 2; | 291 | vcpu->arch.sie_block->ecb = 2; |
| 290 | vcpu->arch.sie_block->eca = 0xC1002001U; | 292 | vcpu->arch.sie_block->eca = 0xC1002001U; |
| 293 | vcpu->arch.sie_block->fac = (int) (long) facilities; | ||
| 291 | hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); | 294 | hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); |
| 292 | tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet, | 295 | tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet, |
| 293 | (unsigned long) vcpu); | 296 | (unsigned long) vcpu); |
| @@ -739,11 +742,29 @@ gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn) | |||
| 739 | 742 | ||
| 740 | static int __init kvm_s390_init(void) | 743 | static int __init kvm_s390_init(void) |
| 741 | { | 744 | { |
| 742 | return kvm_init(NULL, sizeof(struct kvm_vcpu), THIS_MODULE); | 745 | int ret; |
| 746 | ret = kvm_init(NULL, sizeof(struct kvm_vcpu), THIS_MODULE); | ||
| 747 | if (ret) | ||
| 748 | return ret; | ||
| 749 | |||
| 750 | /* | ||
| 751 | * guests can ask for up to 255+1 double words, we need a full page | ||
| 752 | * to hold the maximum amount of facilites. On the other hand, we | ||
| 753 | * only set facilities that are known to work in KVM. | ||
| 754 | */ | ||
| 755 | facilities = (unsigned long long *) get_zeroed_page(GFP_DMA); | ||
| 756 | if (!facilities) { | ||
| 757 | kvm_exit(); | ||
| 758 | return -ENOMEM; | ||
| 759 | } | ||
| 760 | stfle(facilities, 1); | ||
| 761 | facilities[0] &= 0xff00fff3f0700000ULL; | ||
| 762 | return 0; | ||
| 743 | } | 763 | } |
| 744 | 764 | ||
| 745 | static void __exit kvm_s390_exit(void) | 765 | static void __exit kvm_s390_exit(void) |
| 746 | { | 766 | { |
| 767 | free_page((unsigned long) facilities); | ||
| 747 | kvm_exit(); | 768 | kvm_exit(); |
| 748 | } | 769 | } |
| 749 | 770 | ||
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 93ecd06e1a74..d426aac8095d 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
| @@ -158,7 +158,7 @@ static int handle_stfl(struct kvm_vcpu *vcpu) | |||
| 158 | 158 | ||
| 159 | vcpu->stat.instruction_stfl++; | 159 | vcpu->stat.instruction_stfl++; |
| 160 | /* only pass the facility bits, which we can handle */ | 160 | /* only pass the facility bits, which we can handle */ |
| 161 | facility_list &= 0xfe00fff3; | 161 | facility_list &= 0xff00fff3; |
| 162 | 162 | ||
| 163 | rc = copy_to_guest(vcpu, offsetof(struct _lowcore, stfl_fac_list), | 163 | rc = copy_to_guest(vcpu, offsetof(struct _lowcore, stfl_fac_list), |
| 164 | &facility_list, sizeof(facility_list)); | 164 | &facility_list, sizeof(facility_list)); |
diff --git a/arch/sh/Kconfig.debug b/arch/sh/Kconfig.debug index 8ece0b5bd028..39224b57c6ef 100644 --- a/arch/sh/Kconfig.debug +++ b/arch/sh/Kconfig.debug | |||
| @@ -61,10 +61,6 @@ config EARLY_PRINTK | |||
| 61 | select both the EARLY_SCIF_CONSOLE and SH_STANDARD_BIOS, using | 61 | select both the EARLY_SCIF_CONSOLE and SH_STANDARD_BIOS, using |
| 62 | the kernel command line option to toggle back and forth. | 62 | the kernel command line option to toggle back and forth. |
| 63 | 63 | ||
| 64 | config DEBUG_BOOTMEM | ||
| 65 | depends on DEBUG_KERNEL | ||
| 66 | bool "Debug BOOTMEM initialization" | ||
| 67 | |||
| 68 | config DEBUG_STACKOVERFLOW | 64 | config DEBUG_STACKOVERFLOW |
| 69 | bool "Check for stack overflows" | 65 | bool "Check for stack overflows" |
| 70 | depends on DEBUG_KERNEL && SUPERH32 | 66 | depends on DEBUG_KERNEL && SUPERH32 |
diff --git a/arch/sh/boards/mach-se/7206/io.c b/arch/sh/boards/mach-se/7206/io.c index 9c3a33210d61..180455642a43 100644 --- a/arch/sh/boards/mach-se/7206/io.c +++ b/arch/sh/boards/mach-se/7206/io.c | |||
| @@ -50,7 +50,7 @@ unsigned char se7206_inb_p(unsigned long port) | |||
| 50 | 50 | ||
| 51 | unsigned short se7206_inw(unsigned long port) | 51 | unsigned short se7206_inw(unsigned long port) |
| 52 | { | 52 | { |
| 53 | return *port2adr(port);; | 53 | return *port2adr(port); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | void se7206_outb(unsigned char value, unsigned long port) | 56 | void se7206_outb(unsigned char value, unsigned long port) |
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 9cd04bd558b8..c050a8d76dfd 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | #include <media/sh_mobile_ceu.h> | 23 | #include <media/sh_mobile_ceu.h> |
| 24 | #include <asm/io.h> | 24 | #include <asm/io.h> |
| 25 | #include <asm/heartbeat.h> | 25 | #include <asm/heartbeat.h> |
| 26 | #include <asm/sh_eth.h> | ||
| 27 | #include <asm/clock.h> | ||
| 26 | #include <asm/sh_keysc.h> | 28 | #include <asm/sh_keysc.h> |
| 27 | #include <cpu/sh7724.h> | 29 | #include <cpu/sh7724.h> |
| 28 | #include <mach-se/mach/se7724.h> | 30 | #include <mach-se/mach/se7724.h> |
| @@ -272,6 +274,34 @@ static struct platform_device keysc_device = { | |||
| 272 | }, | 274 | }, |
| 273 | }; | 275 | }; |
| 274 | 276 | ||
| 277 | /* SH Eth */ | ||
| 278 | static struct resource sh_eth_resources[] = { | ||
| 279 | [0] = { | ||
| 280 | .start = SH_ETH_ADDR, | ||
| 281 | .end = SH_ETH_ADDR + 0x1FC, | ||
| 282 | .flags = IORESOURCE_MEM, | ||
| 283 | }, | ||
| 284 | [1] = { | ||
| 285 | .start = 91, | ||
| 286 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
| 287 | }, | ||
| 288 | }; | ||
| 289 | |||
| 290 | struct sh_eth_plat_data sh_eth_plat = { | ||
| 291 | .phy = 0x1f, /* SMSC LAN8187 */ | ||
| 292 | .edmac_endian = EDMAC_LITTLE_ENDIAN, | ||
| 293 | }; | ||
| 294 | |||
| 295 | static struct platform_device sh_eth_device = { | ||
| 296 | .name = "sh-eth", | ||
| 297 | .id = 0, | ||
| 298 | .dev = { | ||
| 299 | .platform_data = &sh_eth_plat, | ||
| 300 | }, | ||
| 301 | .num_resources = ARRAY_SIZE(sh_eth_resources), | ||
| 302 | .resource = sh_eth_resources, | ||
| 303 | }; | ||
| 304 | |||
| 275 | static struct platform_device *ms7724se_devices[] __initdata = { | 305 | static struct platform_device *ms7724se_devices[] __initdata = { |
| 276 | &heartbeat_device, | 306 | &heartbeat_device, |
| 277 | &smc91x_eth_device, | 307 | &smc91x_eth_device, |
| @@ -280,8 +310,57 @@ static struct platform_device *ms7724se_devices[] __initdata = { | |||
| 280 | &ceu0_device, | 310 | &ceu0_device, |
| 281 | &ceu1_device, | 311 | &ceu1_device, |
| 282 | &keysc_device, | 312 | &keysc_device, |
| 313 | &sh_eth_device, | ||
| 283 | }; | 314 | }; |
| 284 | 315 | ||
| 316 | #define EEPROM_OP 0xBA206000 | ||
| 317 | #define EEPROM_ADR 0xBA206004 | ||
| 318 | #define EEPROM_DATA 0xBA20600C | ||
| 319 | #define EEPROM_STAT 0xBA206010 | ||
| 320 | #define EEPROM_STRT 0xBA206014 | ||
| 321 | static int __init sh_eth_is_eeprom_ready(void) | ||
| 322 | { | ||
| 323 | int t = 10000; | ||
| 324 | |||
| 325 | while (t--) { | ||
| 326 | if (!ctrl_inw(EEPROM_STAT)) | ||
| 327 | return 1; | ||
| 328 | cpu_relax(); | ||
| 329 | } | ||
| 330 | |||
| 331 | printk(KERN_ERR "ms7724se can not access to eeprom\n"); | ||
| 332 | return 0; | ||
| 333 | } | ||
| 334 | |||
| 335 | static void __init sh_eth_init(void) | ||
| 336 | { | ||
| 337 | int i; | ||
| 338 | u16 mac[3]; | ||
| 339 | |||
| 340 | /* check EEPROM status */ | ||
| 341 | if (!sh_eth_is_eeprom_ready()) | ||
| 342 | return; | ||
| 343 | |||
| 344 | /* read MAC addr from EEPROM */ | ||
| 345 | for (i = 0 ; i < 3 ; i++) { | ||
| 346 | ctrl_outw(0x0, EEPROM_OP); /* read */ | ||
| 347 | ctrl_outw(i*2, EEPROM_ADR); | ||
| 348 | ctrl_outw(0x1, EEPROM_STRT); | ||
| 349 | if (!sh_eth_is_eeprom_ready()) | ||
| 350 | return; | ||
| 351 | |||
| 352 | mac[i] = ctrl_inw(EEPROM_DATA); | ||
| 353 | mac[i] = ((mac[i] & 0xFF) << 8) | (mac[i] >> 8); /* swap */ | ||
| 354 | } | ||
| 355 | |||
| 356 | /* reset sh-eth */ | ||
| 357 | ctrl_outl(0x1, SH_ETH_ADDR + 0x0); | ||
| 358 | |||
| 359 | /* set MAC addr */ | ||
| 360 | ctrl_outl(((mac[0] << 16) | (mac[1])), SH_ETH_MAHR); | ||
| 361 | ctrl_outl((mac[2]), SH_ETH_MALR); | ||
| 362 | } | ||
| 363 | |||
| 285 | #define SW4140 0xBA201000 | 364 | #define SW4140 0xBA201000 |
| 286 | #define FPGA_OUT 0xBA200400 | 365 | #define FPGA_OUT 0xBA200400 |
| 287 | #define PORT_HIZA 0xA4050158 | 366 | #define PORT_HIZA 0xA4050158 |
| @@ -302,7 +381,8 @@ static int __init devices_setup(void) | |||
| 302 | ctrl_outw(ctrl_inw(FPGA_OUT) & | 381 | ctrl_outw(ctrl_inw(FPGA_OUT) & |
| 303 | ~((1 << 1) | /* LAN */ | 382 | ~((1 << 1) | /* LAN */ |
| 304 | (1 << 6) | /* VIDEO DAC */ | 383 | (1 << 6) | /* VIDEO DAC */ |
| 305 | (1 << 12)), /* USB0 */ | 384 | (1 << 12) | /* USB0 */ |
| 385 | (1 << 14)), /* RMII */ | ||
| 306 | FPGA_OUT); | 386 | FPGA_OUT); |
| 307 | 387 | ||
| 308 | /* enable IRQ 0,1,2 */ | 388 | /* enable IRQ 0,1,2 */ |
| @@ -374,7 +454,7 @@ static int __init devices_setup(void) | |||
| 374 | gpio_request(GPIO_FN_VIO0_CLK, NULL); | 454 | gpio_request(GPIO_FN_VIO0_CLK, NULL); |
| 375 | gpio_request(GPIO_FN_VIO0_FLD, NULL); | 455 | gpio_request(GPIO_FN_VIO0_FLD, NULL); |
| 376 | gpio_request(GPIO_FN_VIO0_HD, NULL); | 456 | gpio_request(GPIO_FN_VIO0_HD, NULL); |
| 377 | platform_resource_setup_memory(&ceu0_device, "ceu", 4 << 20); | 457 | platform_resource_setup_memory(&ceu0_device, "ceu0", 4 << 20); |
| 378 | 458 | ||
| 379 | /* enable CEU1 */ | 459 | /* enable CEU1 */ |
| 380 | gpio_request(GPIO_FN_VIO1_D7, NULL); | 460 | gpio_request(GPIO_FN_VIO1_D7, NULL); |
| @@ -389,7 +469,7 @@ static int __init devices_setup(void) | |||
| 389 | gpio_request(GPIO_FN_VIO1_HD, NULL); | 469 | gpio_request(GPIO_FN_VIO1_HD, NULL); |
| 390 | gpio_request(GPIO_FN_VIO1_VD, NULL); | 470 | gpio_request(GPIO_FN_VIO1_VD, NULL); |
| 391 | gpio_request(GPIO_FN_VIO1_CLK, NULL); | 471 | gpio_request(GPIO_FN_VIO1_CLK, NULL); |
| 392 | platform_resource_setup_memory(&ceu1_device, "ceu", 4 << 20); | 472 | platform_resource_setup_memory(&ceu1_device, "ceu1", 4 << 20); |
| 393 | 473 | ||
| 394 | /* KEYSC */ | 474 | /* KEYSC */ |
| 395 | gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); | 475 | gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); |
| @@ -404,6 +484,28 @@ static int __init devices_setup(void) | |||
| 404 | gpio_request(GPIO_FN_KEYOUT1, NULL); | 484 | gpio_request(GPIO_FN_KEYOUT1, NULL); |
| 405 | gpio_request(GPIO_FN_KEYOUT0, NULL); | 485 | gpio_request(GPIO_FN_KEYOUT0, NULL); |
| 406 | 486 | ||
| 487 | /* | ||
| 488 | * enable SH-Eth | ||
| 489 | * | ||
| 490 | * please remove J33 pin from your board !! | ||
| 491 | * | ||
| 492 | * ms7724 board should not use GPIO_FN_LNKSTA pin | ||
| 493 | * So, This time PTX5 is set to input pin | ||
| 494 | */ | ||
| 495 | gpio_request(GPIO_FN_RMII_RXD0, NULL); | ||
| 496 | gpio_request(GPIO_FN_RMII_RXD1, NULL); | ||
| 497 | gpio_request(GPIO_FN_RMII_TXD0, NULL); | ||
| 498 | gpio_request(GPIO_FN_RMII_TXD1, NULL); | ||
| 499 | gpio_request(GPIO_FN_RMII_REF_CLK, NULL); | ||
| 500 | gpio_request(GPIO_FN_RMII_TX_EN, NULL); | ||
| 501 | gpio_request(GPIO_FN_RMII_RX_ER, NULL); | ||
| 502 | gpio_request(GPIO_FN_RMII_CRS_DV, NULL); | ||
| 503 | gpio_request(GPIO_FN_MDIO, NULL); | ||
| 504 | gpio_request(GPIO_FN_MDC, NULL); | ||
| 505 | gpio_request(GPIO_PTX5, NULL); | ||
| 506 | gpio_direction_input(GPIO_PTX5); | ||
| 507 | sh_eth_init(); | ||
| 508 | |||
| 407 | if (sw & SW41_B) { | 509 | if (sw & SW41_B) { |
| 408 | /* SVGA */ | 510 | /* SVGA */ |
| 409 | lcdc_info.ch[0].lcd_cfg.xres = 800; | 511 | lcdc_info.ch[0].lcd_cfg.xres = 800; |
| @@ -437,7 +539,7 @@ static int __init devices_setup(void) | |||
| 437 | } | 539 | } |
| 438 | 540 | ||
| 439 | return platform_add_devices(ms7724se_devices, | 541 | return platform_add_devices(ms7724se_devices, |
| 440 | ARRAY_SIZE(ms7724se_devices)); | 542 | ARRAY_SIZE(ms7724se_devices)); |
| 441 | } | 543 | } |
| 442 | device_initcall(devices_setup); | 544 | device_initcall(devices_setup); |
| 443 | 545 | ||
diff --git a/arch/sh/configs/migor_defconfig b/arch/sh/configs/migor_defconfig index da627d22c009..b18cfd39cac6 100644 --- a/arch/sh/configs/migor_defconfig +++ b/arch/sh/configs/migor_defconfig | |||
| @@ -309,7 +309,7 @@ CONFIG_ZERO_PAGE_OFFSET=0x00001000 | |||
| 309 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | 309 | CONFIG_BOOT_LINK_OFFSET=0x00800000 |
| 310 | CONFIG_ENTRY_OFFSET=0x00001000 | 310 | CONFIG_ENTRY_OFFSET=0x00001000 |
| 311 | CONFIG_CMDLINE_BOOL=y | 311 | CONFIG_CMDLINE_BOOL=y |
| 312 | CONFIG_CMDLINE="console=ttySC0,115200 earlyprintk=serial ip=on root=/dev/nfs ip=dhcp" | 312 | CONFIG_CMDLINE="console=tty0 console=ttySC0,115200 earlyprintk=serial ip=on root=/dev/nfs ip=dhcp" |
| 313 | 313 | ||
| 314 | # | 314 | # |
| 315 | # Bus options | 315 | # Bus options |
| @@ -858,7 +858,35 @@ CONFIG_VIDEO_SH_MOBILE_CEU=y | |||
| 858 | # | 858 | # |
| 859 | # CONFIG_VGASTATE is not set | 859 | # CONFIG_VGASTATE is not set |
| 860 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | 860 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set |
| 861 | # CONFIG_FB is not set | 861 | CONFIG_FB=y |
| 862 | # CONFIG_FIRMWARE_EDID is not set | ||
| 863 | # CONFIG_FB_DDC is not set | ||
| 864 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
| 865 | # CONFIG_FB_CFB_FILLRECT is not set | ||
| 866 | # CONFIG_FB_CFB_COPYAREA is not set | ||
| 867 | # CONFIG_FB_CFB_IMAGEBLIT is not set | ||
| 868 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 869 | CONFIG_FB_SYS_FILLRECT=y | ||
| 870 | CONFIG_FB_SYS_COPYAREA=y | ||
| 871 | CONFIG_FB_SYS_IMAGEBLIT=y | ||
| 872 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
| 873 | CONFIG_FB_SYS_FOPS=y | ||
| 874 | CONFIG_FB_DEFERRED_IO=y | ||
| 875 | # CONFIG_FB_SVGALIB is not set | ||
| 876 | # CONFIG_FB_MACMODES is not set | ||
| 877 | # CONFIG_FB_BACKLIGHT is not set | ||
| 878 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 879 | # CONFIG_FB_TILEBLITTING is not set | ||
| 880 | |||
| 881 | # | ||
| 882 | # Frame buffer hardware drivers | ||
| 883 | # | ||
| 884 | # CONFIG_FB_S1D13XXX is not set | ||
| 885 | CONFIG_FB_SH_MOBILE_LCDC=y | ||
| 886 | # CONFIG_FB_VIRTUAL is not set | ||
| 887 | # CONFIG_FB_METRONOME is not set | ||
| 888 | # CONFIG_FB_MB862XX is not set | ||
| 889 | # CONFIG_FB_BROADSHEET is not set | ||
| 862 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 890 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
| 863 | 891 | ||
| 864 | # | 892 | # |
| @@ -870,6 +898,27 @@ CONFIG_VIDEO_SH_MOBILE_CEU=y | |||
| 870 | # Console display driver support | 898 | # Console display driver support |
| 871 | # | 899 | # |
| 872 | CONFIG_DUMMY_CONSOLE=y | 900 | CONFIG_DUMMY_CONSOLE=y |
| 901 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 902 | CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y | ||
| 903 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
| 904 | CONFIG_FONTS=y | ||
| 905 | # CONFIG_FONT_8x8 is not set | ||
| 906 | # CONFIG_FONT_8x16 is not set | ||
| 907 | # CONFIG_FONT_6x11 is not set | ||
| 908 | # CONFIG_FONT_7x14 is not set | ||
| 909 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 910 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 911 | CONFIG_FONT_MINI_4x6=y | ||
| 912 | # CONFIG_FONT_SUN8x16 is not set | ||
| 913 | # CONFIG_FONT_SUN12x22 is not set | ||
| 914 | # CONFIG_FONT_10x18 is not set | ||
| 915 | CONFIG_LOGO=y | ||
| 916 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 917 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 918 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 919 | # CONFIG_LOGO_SUPERH_MONO is not set | ||
| 920 | CONFIG_LOGO_SUPERH_VGA16=y | ||
| 921 | # CONFIG_LOGO_SUPERH_CLUT224 is not set | ||
| 873 | # CONFIG_SOUND is not set | 922 | # CONFIG_SOUND is not set |
| 874 | CONFIG_HID_SUPPORT=y | 923 | CONFIG_HID_SUPPORT=y |
| 875 | CONFIG_HID=y | 924 | CONFIG_HID=y |
diff --git a/arch/sh/configs/se7724_defconfig b/arch/sh/configs/se7724_defconfig index 3840270283e4..3ee783a0a075 100644 --- a/arch/sh/configs/se7724_defconfig +++ b/arch/sh/configs/se7724_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.30 | 3 | # Linux kernel version: 2.6.30 |
| 4 | # Thu Jun 18 16:09:05 2009 | 4 | # Mon Jun 29 16:28:43 2009 |
| 5 | # | 5 | # |
| 6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
| 7 | CONFIG_SUPERH32=y | 7 | CONFIG_SUPERH32=y |
| @@ -14,6 +14,7 @@ CONFIG_GENERIC_HWEIGHT=y | |||
| 14 | CONFIG_GENERIC_HARDIRQS=y | 14 | CONFIG_GENERIC_HARDIRQS=y |
| 15 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 15 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
| 16 | CONFIG_GENERIC_IRQ_PROBE=y | 16 | CONFIG_GENERIC_IRQ_PROBE=y |
| 17 | CONFIG_IRQ_PER_CPU=y | ||
| 17 | CONFIG_GENERIC_GPIO=y | 18 | CONFIG_GENERIC_GPIO=y |
| 18 | CONFIG_GENERIC_TIME=y | 19 | CONFIG_GENERIC_TIME=y |
| 19 | CONFIG_GENERIC_CLOCKEVENTS=y | 20 | CONFIG_GENERIC_CLOCKEVENTS=y |
| @@ -28,7 +29,9 @@ CONFIG_HAVE_LATENCYTOP_SUPPORT=y | |||
| 28 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 29 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
| 29 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 30 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
| 30 | CONFIG_ARCH_HAS_DEFAULT_IDLE=y | 31 | CONFIG_ARCH_HAS_DEFAULT_IDLE=y |
| 32 | CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y | ||
| 31 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 33 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 34 | CONFIG_CONSTRUCTORS=y | ||
| 32 | 35 | ||
| 33 | # | 36 | # |
| 34 | # General setup | 37 | # General setup |
| @@ -88,10 +91,12 @@ CONFIG_TIMERFD=y | |||
| 88 | CONFIG_EVENTFD=y | 91 | CONFIG_EVENTFD=y |
| 89 | CONFIG_SHMEM=y | 92 | CONFIG_SHMEM=y |
| 90 | CONFIG_AIO=y | 93 | CONFIG_AIO=y |
| 94 | CONFIG_HAVE_PERF_COUNTERS=y | ||
| 91 | 95 | ||
| 92 | # | 96 | # |
| 93 | # Performance Counters | 97 | # Performance Counters |
| 94 | # | 98 | # |
| 99 | # CONFIG_PERF_COUNTERS is not set | ||
| 95 | CONFIG_VM_EVENT_COUNTERS=y | 100 | CONFIG_VM_EVENT_COUNTERS=y |
| 96 | # CONFIG_STRIP_ASM_SYMS is not set | 101 | # CONFIG_STRIP_ASM_SYMS is not set |
| 97 | CONFIG_COMPAT_BRK=y | 102 | CONFIG_COMPAT_BRK=y |
| @@ -107,6 +112,10 @@ CONFIG_HAVE_KRETPROBES=y | |||
| 107 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 112 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
| 108 | CONFIG_HAVE_CLK=y | 113 | CONFIG_HAVE_CLK=y |
| 109 | CONFIG_HAVE_DMA_API_DEBUG=y | 114 | CONFIG_HAVE_DMA_API_DEBUG=y |
| 115 | |||
| 116 | # | ||
| 117 | # GCOV-based kernel profiling | ||
| 118 | # | ||
| 110 | # CONFIG_SLOW_WORK is not set | 119 | # CONFIG_SLOW_WORK is not set |
| 111 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | 120 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y |
| 112 | CONFIG_SLABINFO=y | 121 | CONFIG_SLABINFO=y |
| @@ -119,7 +128,7 @@ CONFIG_MODULE_UNLOAD=y | |||
| 119 | # CONFIG_MODVERSIONS is not set | 128 | # CONFIG_MODVERSIONS is not set |
| 120 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 129 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
| 121 | CONFIG_BLOCK=y | 130 | CONFIG_BLOCK=y |
| 122 | # CONFIG_LBD is not set | 131 | CONFIG_LBDAF=y |
| 123 | # CONFIG_BLK_DEV_BSG is not set | 132 | # CONFIG_BLK_DEV_BSG is not set |
| 124 | # CONFIG_BLK_DEV_INTEGRITY is not set | 133 | # CONFIG_BLK_DEV_INTEGRITY is not set |
| 125 | 134 | ||
| @@ -584,7 +593,6 @@ CONFIG_SCSI_WAIT_SCAN=m | |||
| 584 | # CONFIG_SCSI_SRP_ATTRS is not set | 593 | # CONFIG_SCSI_SRP_ATTRS is not set |
| 585 | CONFIG_SCSI_LOWLEVEL=y | 594 | CONFIG_SCSI_LOWLEVEL=y |
| 586 | # CONFIG_ISCSI_TCP is not set | 595 | # CONFIG_ISCSI_TCP is not set |
| 587 | # CONFIG_SCSI_BNX2_ISCSI is not set | ||
| 588 | # CONFIG_LIBFC is not set | 596 | # CONFIG_LIBFC is not set |
| 589 | # CONFIG_LIBFCOE is not set | 597 | # CONFIG_LIBFCOE is not set |
| 590 | # CONFIG_SCSI_DEBUG is not set | 598 | # CONFIG_SCSI_DEBUG is not set |
| @@ -624,7 +632,7 @@ CONFIG_NET_ETHERNET=y | |||
| 624 | CONFIG_MII=y | 632 | CONFIG_MII=y |
| 625 | # CONFIG_AX88796 is not set | 633 | # CONFIG_AX88796 is not set |
| 626 | # CONFIG_STNIC is not set | 634 | # CONFIG_STNIC is not set |
| 627 | # CONFIG_SH_ETH is not set | 635 | CONFIG_SH_ETH=y |
| 628 | CONFIG_SMC91X=y | 636 | CONFIG_SMC91X=y |
| 629 | # CONFIG_ENC28J60 is not set | 637 | # CONFIG_ENC28J60 is not set |
| 630 | # CONFIG_ETHOC is not set | 638 | # CONFIG_ETHOC is not set |
| @@ -801,6 +809,11 @@ CONFIG_SPI_BITBANG=y | |||
| 801 | # | 809 | # |
| 802 | # CONFIG_SPI_SPIDEV is not set | 810 | # CONFIG_SPI_SPIDEV is not set |
| 803 | # CONFIG_SPI_TLE62X0 is not set | 811 | # CONFIG_SPI_TLE62X0 is not set |
| 812 | |||
| 813 | # | ||
| 814 | # PPS support | ||
| 815 | # | ||
| 816 | # CONFIG_PPS is not set | ||
| 804 | CONFIG_ARCH_REQUIRE_GPIOLIB=y | 817 | CONFIG_ARCH_REQUIRE_GPIOLIB=y |
| 805 | CONFIG_GPIOLIB=y | 818 | CONFIG_GPIOLIB=y |
| 806 | # CONFIG_GPIO_SYSFS is not set | 819 | # CONFIG_GPIO_SYSFS is not set |
| @@ -851,6 +864,8 @@ CONFIG_SSB_POSSIBLE=y | |||
| 851 | # CONFIG_MFD_WM8400 is not set | 864 | # CONFIG_MFD_WM8400 is not set |
| 852 | # CONFIG_MFD_WM8350_I2C is not set | 865 | # CONFIG_MFD_WM8350_I2C is not set |
| 853 | # CONFIG_MFD_PCF50633 is not set | 866 | # CONFIG_MFD_PCF50633 is not set |
| 867 | # CONFIG_AB3100_CORE is not set | ||
| 868 | # CONFIG_EZX_PCAP is not set | ||
| 854 | # CONFIG_REGULATOR is not set | 869 | # CONFIG_REGULATOR is not set |
| 855 | CONFIG_MEDIA_SUPPORT=y | 870 | CONFIG_MEDIA_SUPPORT=y |
| 856 | 871 | ||
| @@ -1196,6 +1211,7 @@ CONFIG_RTC_DRV_PCF8563=y | |||
| 1196 | # CONFIG_RTC_DRV_S35390A is not set | 1211 | # CONFIG_RTC_DRV_S35390A is not set |
| 1197 | # CONFIG_RTC_DRV_FM3130 is not set | 1212 | # CONFIG_RTC_DRV_FM3130 is not set |
| 1198 | # CONFIG_RTC_DRV_RX8581 is not set | 1213 | # CONFIG_RTC_DRV_RX8581 is not set |
| 1214 | # CONFIG_RTC_DRV_RX8025 is not set | ||
| 1199 | 1215 | ||
| 1200 | # | 1216 | # |
| 1201 | # SPI RTC drivers | 1217 | # SPI RTC drivers |
| @@ -1260,6 +1276,7 @@ CONFIG_FS_MBCACHE=y | |||
| 1260 | # CONFIG_JFS_FS is not set | 1276 | # CONFIG_JFS_FS is not set |
| 1261 | CONFIG_FS_POSIX_ACL=y | 1277 | CONFIG_FS_POSIX_ACL=y |
| 1262 | # CONFIG_XFS_FS is not set | 1278 | # CONFIG_XFS_FS is not set |
| 1279 | # CONFIG_GFS2_FS is not set | ||
| 1263 | # CONFIG_OCFS2_FS is not set | 1280 | # CONFIG_OCFS2_FS is not set |
| 1264 | # CONFIG_BTRFS_FS is not set | 1281 | # CONFIG_BTRFS_FS is not set |
| 1265 | CONFIG_FILE_LOCKING=y | 1282 | CONFIG_FILE_LOCKING=y |
diff --git a/arch/sh/include/asm/perf_counter.h b/arch/sh/include/asm/perf_counter.h index a8153c2aa6fa..61c2b40c802c 100644 --- a/arch/sh/include/asm/perf_counter.h +++ b/arch/sh/include/asm/perf_counter.h | |||
| @@ -2,6 +2,6 @@ | |||
| 2 | #define __ASM_SH_PERF_COUNTER_H | 2 | #define __ASM_SH_PERF_COUNTER_H |
| 3 | 3 | ||
| 4 | /* SH only supports software counters through this interface. */ | 4 | /* SH only supports software counters through this interface. */ |
| 5 | #define set_perf_counter_pending() do { } while (0) | 5 | static inline void set_perf_counter_pending(void) {} |
| 6 | 6 | ||
| 7 | #endif /* __ASM_SH_PERF_COUNTER_H */ | 7 | #endif /* __ASM_SH_PERF_COUNTER_H */ |
diff --git a/arch/sh/include/asm/syscall_32.h b/arch/sh/include/asm/syscall_32.h index 5bc34681d994..6f83f2cc45c1 100644 --- a/arch/sh/include/asm/syscall_32.h +++ b/arch/sh/include/asm/syscall_32.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/kernel.h> | 4 | #include <linux/kernel.h> |
| 5 | #include <linux/sched.h> | 5 | #include <linux/sched.h> |
| 6 | #include <linux/err.h> | ||
| 6 | #include <asm/ptrace.h> | 7 | #include <asm/ptrace.h> |
| 7 | 8 | ||
| 8 | /* The system call number is given by the user in R3 */ | 9 | /* The system call number is given by the user in R3 */ |
diff --git a/arch/sh/include/mach-se/mach/se7724.h b/arch/sh/include/mach-se/mach/se7724.h index 74164b60d0db..29514a39d0f5 100644 --- a/arch/sh/include/mach-se/mach/se7724.h +++ b/arch/sh/include/mach-se/mach/se7724.h | |||
| @@ -20,6 +20,11 @@ | |||
| 20 | */ | 20 | */ |
| 21 | #include <asm/addrspace.h> | 21 | #include <asm/addrspace.h> |
| 22 | 22 | ||
| 23 | /* SH Eth */ | ||
| 24 | #define SH_ETH_ADDR (0xA4600000) | ||
| 25 | #define SH_ETH_MAHR (SH_ETH_ADDR + 0x1C0) | ||
| 26 | #define SH_ETH_MALR (SH_ETH_ADDR + 0x1C8) | ||
| 27 | |||
| 23 | #define PA_LED (0xba203000) /* 8bit LED */ | 28 | #define PA_LED (0xba203000) /* 8bit LED */ |
| 24 | #define IRQ_MODE (0xba200010) | 29 | #define IRQ_MODE (0xba200010) |
| 25 | #define IRQ0_SR (0xba200014) | 30 | #define IRQ0_SR (0xba200014) |
diff --git a/arch/sh/mm/fault_32.c b/arch/sh/mm/fault_32.c index cc8ddbdf3d7a..71925946f1e1 100644 --- a/arch/sh/mm/fault_32.c +++ b/arch/sh/mm/fault_32.c | |||
| @@ -15,12 +15,28 @@ | |||
| 15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
| 16 | #include <linux/hardirq.h> | 16 | #include <linux/hardirq.h> |
| 17 | #include <linux/kprobes.h> | 17 | #include <linux/kprobes.h> |
| 18 | #include <linux/marker.h> | 18 | #include <linux/perf_counter.h> |
| 19 | #include <asm/io_trapped.h> | 19 | #include <asm/io_trapped.h> |
| 20 | #include <asm/system.h> | 20 | #include <asm/system.h> |
| 21 | #include <asm/mmu_context.h> | 21 | #include <asm/mmu_context.h> |
| 22 | #include <asm/tlbflush.h> | 22 | #include <asm/tlbflush.h> |
| 23 | 23 | ||
| 24 | static inline int notify_page_fault(struct pt_regs *regs, int trap) | ||
| 25 | { | ||
| 26 | int ret = 0; | ||
| 27 | |||
| 28 | #ifdef CONFIG_KPROBES | ||
| 29 | if (!user_mode(regs)) { | ||
| 30 | preempt_disable(); | ||
| 31 | if (kprobe_running() && kprobe_fault_handler(regs, trap)) | ||
| 32 | ret = 1; | ||
| 33 | preempt_enable(); | ||
| 34 | } | ||
| 35 | #endif | ||
| 36 | |||
| 37 | return ret; | ||
| 38 | } | ||
| 39 | |||
| 24 | /* | 40 | /* |
| 25 | * This routine handles page faults. It determines the address, | 41 | * This routine handles page faults. It determines the address, |
| 26 | * and the problem, and then passes it off to one of the appropriate | 42 | * and the problem, and then passes it off to one of the appropriate |
| @@ -87,13 +103,16 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
| 87 | return; | 103 | return; |
| 88 | } | 104 | } |
| 89 | 105 | ||
| 106 | mm = tsk->mm; | ||
| 107 | |||
| 108 | if (unlikely(notify_page_fault(regs, lookup_exception_vector()))) | ||
| 109 | return; | ||
| 110 | |||
| 90 | /* Only enable interrupts if they were on before the fault */ | 111 | /* Only enable interrupts if they were on before the fault */ |
| 91 | if ((regs->sr & SR_IMASK) != SR_IMASK) { | 112 | if ((regs->sr & SR_IMASK) != SR_IMASK) |
| 92 | trace_hardirqs_on(); | ||
| 93 | local_irq_enable(); | 113 | local_irq_enable(); |
| 94 | } | ||
| 95 | 114 | ||
| 96 | mm = tsk->mm; | 115 | perf_swcounter_event(PERF_COUNT_SW_PAGE_FAULTS, 1, 0, regs, address); |
| 97 | 116 | ||
| 98 | /* | 117 | /* |
| 99 | * If we're in an interrupt or have no user | 118 | * If we're in an interrupt or have no user |
| @@ -141,10 +160,15 @@ survive: | |||
| 141 | goto do_sigbus; | 160 | goto do_sigbus; |
| 142 | BUG(); | 161 | BUG(); |
| 143 | } | 162 | } |
| 144 | if (fault & VM_FAULT_MAJOR) | 163 | if (fault & VM_FAULT_MAJOR) { |
| 145 | tsk->maj_flt++; | 164 | tsk->maj_flt++; |
| 146 | else | 165 | perf_swcounter_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, 0, |
| 166 | regs, address); | ||
| 167 | } else { | ||
| 147 | tsk->min_flt++; | 168 | tsk->min_flt++; |
| 169 | perf_swcounter_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, 0, | ||
| 170 | regs, address); | ||
| 171 | } | ||
| 148 | 172 | ||
| 149 | up_read(&mm->mmap_sem); | 173 | up_read(&mm->mmap_sem); |
| 150 | return; | 174 | return; |
| @@ -245,22 +269,6 @@ do_sigbus: | |||
| 245 | goto no_context; | 269 | goto no_context; |
| 246 | } | 270 | } |
| 247 | 271 | ||
| 248 | static inline int notify_page_fault(struct pt_regs *regs, int trap) | ||
| 249 | { | ||
| 250 | int ret = 0; | ||
| 251 | |||
| 252 | #ifdef CONFIG_KPROBES | ||
| 253 | if (!user_mode(regs)) { | ||
| 254 | preempt_disable(); | ||
| 255 | if (kprobe_running() && kprobe_fault_handler(regs, trap)) | ||
| 256 | ret = 1; | ||
| 257 | preempt_enable(); | ||
| 258 | } | ||
| 259 | #endif | ||
| 260 | |||
| 261 | return ret; | ||
| 262 | } | ||
| 263 | |||
| 264 | /* | 272 | /* |
| 265 | * Called with interrupts disabled. | 273 | * Called with interrupts disabled. |
| 266 | */ | 274 | */ |
| @@ -273,12 +281,7 @@ asmlinkage int __kprobes __do_page_fault(struct pt_regs *regs, | |||
| 273 | pmd_t *pmd; | 281 | pmd_t *pmd; |
| 274 | pte_t *pte; | 282 | pte_t *pte; |
| 275 | pte_t entry; | 283 | pte_t entry; |
| 276 | int ret = 0; | 284 | int ret = 1; |
| 277 | |||
| 278 | if (notify_page_fault(regs, lookup_exception_vector())) | ||
| 279 | goto out; | ||
| 280 | |||
| 281 | ret = 1; | ||
| 282 | 285 | ||
| 283 | /* | 286 | /* |
| 284 | * We don't take page faults for P1, P2, and parts of P4, these | 287 | * We don't take page faults for P1, P2, and parts of P4, these |
diff --git a/arch/sh/mm/tlbflush_64.c b/arch/sh/mm/tlbflush_64.c index fcbb6e135cef..3ce40ea34824 100644 --- a/arch/sh/mm/tlbflush_64.c +++ b/arch/sh/mm/tlbflush_64.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2000, 2001 Paolo Alberelli | 4 | * Copyright (C) 2000, 2001 Paolo Alberelli |
| 5 | * Copyright (C) 2003 Richard Curnow (/proc/tlb, bug fixes) | 5 | * Copyright (C) 2003 Richard Curnow (/proc/tlb, bug fixes) |
| 6 | * Copyright (C) 2003 Paul Mundt | 6 | * Copyright (C) 2003 - 2009 Paul Mundt |
| 7 | * | 7 | * |
| 8 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
| 9 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/mman.h> | 20 | #include <linux/mman.h> |
| 21 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
| 22 | #include <linux/smp.h> | 22 | #include <linux/smp.h> |
| 23 | #include <linux/perf_counter.h> | ||
| 23 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
| 24 | #include <asm/system.h> | 25 | #include <asm/system.h> |
| 25 | #include <asm/io.h> | 26 | #include <asm/io.h> |
| @@ -115,6 +116,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess, | |||
| 115 | /* Not an IO address, so reenable interrupts */ | 116 | /* Not an IO address, so reenable interrupts */ |
| 116 | local_irq_enable(); | 117 | local_irq_enable(); |
| 117 | 118 | ||
| 119 | perf_swcounter_event(PERF_COUNT_SW_PAGE_FAULTS, 1, 0, regs, address); | ||
| 120 | |||
| 118 | /* | 121 | /* |
| 119 | * If we're in an interrupt or have no user | 122 | * If we're in an interrupt or have no user |
| 120 | * context, we must not take the fault.. | 123 | * context, we must not take the fault.. |
| @@ -195,10 +198,16 @@ survive: | |||
| 195 | goto do_sigbus; | 198 | goto do_sigbus; |
| 196 | BUG(); | 199 | BUG(); |
| 197 | } | 200 | } |
| 198 | if (fault & VM_FAULT_MAJOR) | 201 | |
| 202 | if (fault & VM_FAULT_MAJOR) { | ||
| 199 | tsk->maj_flt++; | 203 | tsk->maj_flt++; |
| 200 | else | 204 | perf_swcounter_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, 0, |
| 205 | regs, address); | ||
| 206 | } else { | ||
| 201 | tsk->min_flt++; | 207 | tsk->min_flt++; |
| 208 | perf_swcounter_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, 0, | ||
| 209 | regs, address); | ||
| 210 | } | ||
| 202 | 211 | ||
| 203 | /* If we get here, the page fault has been handled. Do the TLB refill | 212 | /* If we get here, the page fault has been handled. Do the TLB refill |
| 204 | now from the newly-setup PTE, to avoid having to fault again right | 213 | now from the newly-setup PTE, to avoid having to fault again right |
diff --git a/arch/sparc/boot/Makefile b/arch/sparc/boot/Makefile index 96041a8d39e8..1ff0fd924756 100644 --- a/arch/sparc/boot/Makefile +++ b/arch/sparc/boot/Makefile | |||
| @@ -15,7 +15,7 @@ quiet_cmd_elftoaout = ELFTOAOUT $@ | |||
| 15 | 15 | ||
| 16 | ifeq ($(CONFIG_SPARC32),y) | 16 | ifeq ($(CONFIG_SPARC32),y) |
| 17 | quiet_cmd_piggy = PIGGY $@ | 17 | quiet_cmd_piggy = PIGGY $@ |
| 18 | cmd_piggy = $(obj)/piggyback_32 $@ $(obj)/System.map $(ROOT_IMG) | 18 | cmd_piggy = $(obj)/piggyback_32 $@ System.map $(ROOT_IMG) |
| 19 | quiet_cmd_btfix = BTFIX $@ | 19 | quiet_cmd_btfix = BTFIX $@ |
| 20 | cmd_btfix = $(OBJDUMP) -x vmlinux | $(obj)/btfixupprep > $@ | 20 | cmd_btfix = $(OBJDUMP) -x vmlinux | $(obj)/btfixupprep > $@ |
| 21 | quiet_cmd_sysmap = SYSMAP $(obj)/System.map | 21 | quiet_cmd_sysmap = SYSMAP $(obj)/System.map |
| @@ -58,7 +58,7 @@ $(obj)/image: $(obj)/btfix.o FORCE | |||
| 58 | $(obj)/zImage: $(obj)/image | 58 | $(obj)/zImage: $(obj)/image |
| 59 | $(call if_changed,strip) | 59 | $(call if_changed,strip) |
| 60 | 60 | ||
| 61 | $(obj)/tftpboot.img: $(obj)/piggyback $(obj)/System.map $(obj)/image FORCE | 61 | $(obj)/tftpboot.img: $(obj)/image $(obj)/piggyback_32 System.map $(ROOT_IMG) FORCE |
| 62 | $(call if_changed,elftoaout) | 62 | $(call if_changed,elftoaout) |
| 63 | $(call if_changed,piggy) | 63 | $(call if_changed,piggy) |
| 64 | 64 | ||
| @@ -79,7 +79,7 @@ $(obj)/image: vmlinux FORCE | |||
| 79 | $(call if_changed,strip) | 79 | $(call if_changed,strip) |
| 80 | @echo ' kernel: $@ is ready' | 80 | @echo ' kernel: $@ is ready' |
| 81 | 81 | ||
| 82 | $(obj)/tftpboot.img: vmlinux $(obj)/piggyback_64 System.map $(ROOT_IMG) FORCE | 82 | $(obj)/tftpboot.img: $(obj)/image $(obj)/piggyback_64 System.map $(ROOT_IMG) FORCE |
| 83 | $(call if_changed,elftoaout) | 83 | $(call if_changed,elftoaout) |
| 84 | $(call if_changed,piggy) | 84 | $(call if_changed,piggy) |
| 85 | @echo ' kernel: $@ is ready' | 85 | @echo ' kernel: $@ is ready' |
diff --git a/arch/sparc/boot/piggyback_32.c b/arch/sparc/boot/piggyback_32.c index c9f500c1a8b2..e8dc9adfcd61 100644 --- a/arch/sparc/boot/piggyback_32.c +++ b/arch/sparc/boot/piggyback_32.c | |||
| @@ -70,7 +70,7 @@ void die(char *str) | |||
| 70 | int main(int argc,char **argv) | 70 | int main(int argc,char **argv) |
| 71 | { | 71 | { |
| 72 | static char aout_magic[] = { 0x01, 0x03, 0x01, 0x07 }; | 72 | static char aout_magic[] = { 0x01, 0x03, 0x01, 0x07 }; |
| 73 | unsigned char buffer[1024], *q, *r; | 73 | char buffer[1024], *q, *r; |
| 74 | unsigned int i, j, k, start, end, offset; | 74 | unsigned int i, j, k, start, end, offset; |
| 75 | FILE *map; | 75 | FILE *map; |
| 76 | struct stat s; | 76 | struct stat s; |
| @@ -84,7 +84,7 @@ int main(int argc,char **argv) | |||
| 84 | while (fgets (buffer, 1024, map)) { | 84 | while (fgets (buffer, 1024, map)) { |
| 85 | if (!strcmp (buffer + 8, " T start\n") || !strcmp (buffer + 16, " T start\n")) | 85 | if (!strcmp (buffer + 8, " T start\n") || !strcmp (buffer + 16, " T start\n")) |
| 86 | start = strtoul (buffer, NULL, 16); | 86 | start = strtoul (buffer, NULL, 16); |
| 87 | else if (!strcmp (buffer + 8, " A end\n") || !strcmp (buffer + 16, " A end\n")) | 87 | else if (!strcmp (buffer + 8, " A _end\n") || !strcmp (buffer + 16, " A _end\n")) |
| 88 | end = strtoul (buffer, NULL, 16); | 88 | end = strtoul (buffer, NULL, 16); |
| 89 | } | 89 | } |
| 90 | fclose (map); | 90 | fclose (map); |
diff --git a/arch/sparc/boot/piggyback_64.c b/arch/sparc/boot/piggyback_64.c index de364bfed0bb..c63fd1b6bdd4 100644 --- a/arch/sparc/boot/piggyback_64.c +++ b/arch/sparc/boot/piggyback_64.c | |||
| @@ -46,6 +46,7 @@ int main(int argc,char **argv) | |||
| 46 | struct stat s; | 46 | struct stat s; |
| 47 | int image, tail; | 47 | int image, tail; |
| 48 | 48 | ||
| 49 | start = end = 0; | ||
| 49 | if (stat (argv[3], &s) < 0) die (argv[3]); | 50 | if (stat (argv[3], &s) < 0) die (argv[3]); |
| 50 | map = fopen (argv[2], "r"); | 51 | map = fopen (argv[2], "r"); |
| 51 | if (!map) die(argv[2]); | 52 | if (!map) die(argv[2]); |
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index bd075054942b..f0ee79055409 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
| @@ -20,7 +20,6 @@ | |||
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <linux/proc_fs.h> | 21 | #include <linux/proc_fs.h> |
| 22 | #include <linux/seq_file.h> | 22 | #include <linux/seq_file.h> |
| 23 | #include <linux/bootmem.h> | ||
| 24 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
| 25 | 24 | ||
| 26 | #include <asm/ptrace.h> | 25 | #include <asm/ptrace.h> |
| @@ -914,25 +913,19 @@ void __cpuinit notrace sun4v_register_mondo_queues(int this_cpu) | |||
| 914 | tb->nonresum_qmask); | 913 | tb->nonresum_qmask); |
| 915 | } | 914 | } |
| 916 | 915 | ||
| 917 | static void __init alloc_one_mondo(unsigned long *pa_ptr, unsigned long qmask) | 916 | /* Each queue region must be a power of 2 multiple of 64 bytes in |
| 918 | { | 917 | * size. The base real address must be aligned to the size of the |
| 919 | unsigned long size = PAGE_ALIGN(qmask + 1); | 918 | * region. Thus, an 8KB queue must be 8KB aligned, for example. |
| 920 | void *p = __alloc_bootmem(size, size, 0); | 919 | */ |
| 921 | if (!p) { | 920 | static void __init alloc_one_queue(unsigned long *pa_ptr, unsigned long qmask) |
| 922 | prom_printf("SUN4V: Error, cannot allocate mondo queue.\n"); | ||
| 923 | prom_halt(); | ||
| 924 | } | ||
| 925 | |||
| 926 | *pa_ptr = __pa(p); | ||
| 927 | } | ||
| 928 | |||
| 929 | static void __init alloc_one_kbuf(unsigned long *pa_ptr, unsigned long qmask) | ||
| 930 | { | 921 | { |
| 931 | unsigned long size = PAGE_ALIGN(qmask + 1); | 922 | unsigned long size = PAGE_ALIGN(qmask + 1); |
| 932 | void *p = __alloc_bootmem(size, size, 0); | 923 | unsigned long order = get_order(size); |
| 924 | unsigned long p; | ||
| 933 | 925 | ||
| 926 | p = __get_free_pages(GFP_KERNEL, order); | ||
| 934 | if (!p) { | 927 | if (!p) { |
| 935 | prom_printf("SUN4V: Error, cannot allocate kbuf page.\n"); | 928 | prom_printf("SUN4V: Error, cannot allocate queue.\n"); |
| 936 | prom_halt(); | 929 | prom_halt(); |
| 937 | } | 930 | } |
| 938 | 931 | ||
| @@ -942,11 +935,11 @@ static void __init alloc_one_kbuf(unsigned long *pa_ptr, unsigned long qmask) | |||
| 942 | static void __init init_cpu_send_mondo_info(struct trap_per_cpu *tb) | 935 | static void __init init_cpu_send_mondo_info(struct trap_per_cpu *tb) |
| 943 | { | 936 | { |
| 944 | #ifdef CONFIG_SMP | 937 | #ifdef CONFIG_SMP |
| 945 | void *page; | 938 | unsigned long page; |
| 946 | 939 | ||
| 947 | BUILD_BUG_ON((NR_CPUS * sizeof(u16)) > (PAGE_SIZE - 64)); | 940 | BUILD_BUG_ON((NR_CPUS * sizeof(u16)) > (PAGE_SIZE - 64)); |
| 948 | 941 | ||
| 949 | page = alloc_bootmem_pages(PAGE_SIZE); | 942 | page = get_zeroed_page(GFP_KERNEL); |
| 950 | if (!page) { | 943 | if (!page) { |
| 951 | prom_printf("SUN4V: Error, cannot allocate cpu mondo page.\n"); | 944 | prom_printf("SUN4V: Error, cannot allocate cpu mondo page.\n"); |
| 952 | prom_halt(); | 945 | prom_halt(); |
| @@ -965,13 +958,13 @@ static void __init sun4v_init_mondo_queues(void) | |||
| 965 | for_each_possible_cpu(cpu) { | 958 | for_each_possible_cpu(cpu) { |
| 966 | struct trap_per_cpu *tb = &trap_block[cpu]; | 959 | struct trap_per_cpu *tb = &trap_block[cpu]; |
| 967 | 960 | ||
| 968 | alloc_one_mondo(&tb->cpu_mondo_pa, tb->cpu_mondo_qmask); | 961 | alloc_one_queue(&tb->cpu_mondo_pa, tb->cpu_mondo_qmask); |
| 969 | alloc_one_mondo(&tb->dev_mondo_pa, tb->dev_mondo_qmask); | 962 | alloc_one_queue(&tb->dev_mondo_pa, tb->dev_mondo_qmask); |
| 970 | alloc_one_mondo(&tb->resum_mondo_pa, tb->resum_qmask); | 963 | alloc_one_queue(&tb->resum_mondo_pa, tb->resum_qmask); |
| 971 | alloc_one_kbuf(&tb->resum_kernel_buf_pa, tb->resum_qmask); | 964 | alloc_one_queue(&tb->resum_kernel_buf_pa, tb->resum_qmask); |
| 972 | alloc_one_mondo(&tb->nonresum_mondo_pa, tb->nonresum_qmask); | 965 | alloc_one_queue(&tb->nonresum_mondo_pa, tb->nonresum_qmask); |
| 973 | alloc_one_kbuf(&tb->nonresum_kernel_buf_pa, | 966 | alloc_one_queue(&tb->nonresum_kernel_buf_pa, |
| 974 | tb->nonresum_qmask); | 967 | tb->nonresum_qmask); |
| 975 | } | 968 | } |
| 976 | } | 969 | } |
| 977 | 970 | ||
| @@ -999,7 +992,7 @@ void __init init_IRQ(void) | |||
| 999 | kill_prom_timer(); | 992 | kill_prom_timer(); |
| 1000 | 993 | ||
| 1001 | size = sizeof(struct ino_bucket) * NUM_IVECS; | 994 | size = sizeof(struct ino_bucket) * NUM_IVECS; |
| 1002 | ivector_table = alloc_bootmem(size); | 995 | ivector_table = kzalloc(size, GFP_KERNEL); |
| 1003 | if (!ivector_table) { | 996 | if (!ivector_table) { |
| 1004 | prom_printf("Fatal error, cannot allocate ivector_table\n"); | 997 | prom_printf("Fatal error, cannot allocate ivector_table\n"); |
| 1005 | prom_halt(); | 998 | prom_halt(); |
diff --git a/arch/um/drivers/slip_kern.c b/arch/um/drivers/slip_kern.c index 5ec17563142e..dd2aadc14af0 100644 --- a/arch/um/drivers/slip_kern.c +++ b/arch/um/drivers/slip_kern.c | |||
| @@ -30,7 +30,6 @@ static void slip_init(struct net_device *dev, void *data) | |||
| 30 | 30 | ||
| 31 | slip_proto_init(&spri->slip); | 31 | slip_proto_init(&spri->slip); |
| 32 | 32 | ||
| 33 | dev->init = NULL; | ||
| 34 | dev->hard_header_len = 0; | 33 | dev->hard_header_len = 0; |
| 35 | dev->header_ops = NULL; | 34 | dev->header_ops = NULL; |
| 36 | dev->addr_len = 0; | 35 | dev->addr_len = 0; |
diff --git a/arch/um/drivers/slirp_kern.c b/arch/um/drivers/slirp_kern.c index f15a6e7654f3..e376284f0fb7 100644 --- a/arch/um/drivers/slirp_kern.c +++ b/arch/um/drivers/slirp_kern.c | |||
| @@ -32,7 +32,6 @@ void slirp_init(struct net_device *dev, void *data) | |||
| 32 | 32 | ||
| 33 | slip_proto_init(&spri->slip); | 33 | slip_proto_init(&spri->slip); |
| 34 | 34 | ||
| 35 | dev->init = NULL; | ||
| 36 | dev->hard_header_len = 0; | 35 | dev->hard_header_len = 0; |
| 37 | dev->header_ops = NULL; | 36 | dev->header_ops = NULL; |
| 38 | dev->addr_len = 0; | 37 | dev->addr_len = 0; |
diff --git a/arch/um/include/asm/dma-mapping.h b/arch/um/include/asm/dma-mapping.h index 90fc708b320e..378de4bbf49f 100644 --- a/arch/um/include/asm/dma-mapping.h +++ b/arch/um/include/asm/dma-mapping.h | |||
| @@ -79,14 +79,14 @@ dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, | |||
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | static inline void | 81 | static inline void |
| 82 | dma_sync_single(struct device *dev, dma_addr_t dma_handle, size_t size, | 82 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, |
| 83 | enum dma_data_direction direction) | 83 | enum dma_data_direction direction) |
| 84 | { | 84 | { |
| 85 | BUG(); | 85 | BUG(); |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | static inline void | 88 | static inline void |
| 89 | dma_sync_sg(struct device *dev, struct scatterlist *sg, int nelems, | 89 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, |
| 90 | enum dma_data_direction direction) | 90 | enum dma_data_direction direction) |
| 91 | { | 91 | { |
| 92 | BUG(); | 92 | BUG(); |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index d1430ef6b4f9..c07f72205909 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -1913,25 +1913,14 @@ config DMAR_DEFAULT_ON | |||
| 1913 | recommended you say N here while the DMAR code remains | 1913 | recommended you say N here while the DMAR code remains |
| 1914 | experimental. | 1914 | experimental. |
| 1915 | 1915 | ||
| 1916 | config DMAR_GFX_WA | ||
| 1917 | def_bool y | ||
| 1918 | prompt "Support for Graphics workaround" | ||
| 1919 | depends on DMAR | ||
| 1920 | ---help--- | ||
| 1921 | Current Graphics drivers tend to use physical address | ||
| 1922 | for DMA and avoid using DMA APIs. Setting this config | ||
| 1923 | option permits the IOMMU driver to set a unity map for | ||
| 1924 | all the OS-visible memory. Hence the driver can continue | ||
| 1925 | to use physical addresses for DMA. | ||
| 1926 | |||
| 1927 | config DMAR_FLOPPY_WA | 1916 | config DMAR_FLOPPY_WA |
| 1928 | def_bool y | 1917 | def_bool y |
| 1929 | depends on DMAR | 1918 | depends on DMAR |
| 1930 | ---help--- | 1919 | ---help--- |
| 1931 | Floppy disk drivers are know to bypass DMA API calls | 1920 | Floppy disk drivers are known to bypass DMA API calls |
| 1932 | thereby failing to work when IOMMU is enabled. This | 1921 | thereby failing to work when IOMMU is enabled. This |
| 1933 | workaround will setup a 1:1 mapping for the first | 1922 | workaround will setup a 1:1 mapping for the first |
| 1934 | 16M to make floppy (an ISA device) work. | 1923 | 16MiB to make floppy (an ISA device) work. |
| 1935 | 1924 | ||
| 1936 | config INTR_REMAP | 1925 | config INTR_REMAP |
| 1937 | bool "Support for Interrupt Remapping (EXPERIMENTAL)" | 1926 | bool "Support for Interrupt Remapping (EXPERIMENTAL)" |
diff --git a/arch/x86/include/asm/boot.h b/arch/x86/include/asm/boot.h index 418e632d4a80..7a1065958ba9 100644 --- a/arch/x86/include/asm/boot.h +++ b/arch/x86/include/asm/boot.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | 8 | ||
| 9 | #ifdef __KERNEL__ | 9 | #ifdef __KERNEL__ |
| 10 | 10 | ||
| 11 | #include <asm/page_types.h> | 11 | #include <asm/pgtable_types.h> |
| 12 | 12 | ||
| 13 | /* Physical address where kernel should be loaded. */ | 13 | /* Physical address where kernel should be loaded. */ |
| 14 | #define LOAD_PHYSICAL_ADDR ((CONFIG_PHYSICAL_START \ | 14 | #define LOAD_PHYSICAL_ADDR ((CONFIG_PHYSICAL_START \ |
| @@ -16,10 +16,10 @@ | |||
| 16 | & ~(CONFIG_PHYSICAL_ALIGN - 1)) | 16 | & ~(CONFIG_PHYSICAL_ALIGN - 1)) |
| 17 | 17 | ||
| 18 | /* Minimum kernel alignment, as a power of two */ | 18 | /* Minimum kernel alignment, as a power of two */ |
| 19 | #ifdef CONFIG_x86_64 | 19 | #ifdef CONFIG_X86_64 |
| 20 | #define MIN_KERNEL_ALIGN_LG2 PMD_SHIFT | 20 | #define MIN_KERNEL_ALIGN_LG2 PMD_SHIFT |
| 21 | #else | 21 | #else |
| 22 | #define MIN_KERNEL_ALIGN_LG2 (PAGE_SHIFT+1) | 22 | #define MIN_KERNEL_ALIGN_LG2 (PAGE_SHIFT + THREAD_ORDER) |
| 23 | #endif | 23 | #endif |
| 24 | #define MIN_KERNEL_ALIGN (_AC(1, UL) << MIN_KERNEL_ALIGN_LG2) | 24 | #define MIN_KERNEL_ALIGN (_AC(1, UL) << MIN_KERNEL_ALIGN_LG2) |
| 25 | 25 | ||
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h index 927958d13c19..1ff685ca221c 100644 --- a/arch/x86/include/asm/pci.h +++ b/arch/x86/include/asm/pci.h | |||
| @@ -91,7 +91,7 @@ extern void pci_iommu_alloc(void); | |||
| 91 | 91 | ||
| 92 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | 92 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) |
| 93 | 93 | ||
| 94 | #if defined(CONFIG_X86_64) || defined(CONFIG_DMA_API_DEBUG) | 94 | #if defined(CONFIG_X86_64) || defined(CONFIG_DMAR) || defined(CONFIG_DMA_API_DEBUG) |
| 95 | 95 | ||
| 96 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ | 96 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ |
| 97 | dma_addr_t ADDR_NAME; | 97 | dma_addr_t ADDR_NAME; |
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 02ecb30982a3..103f1ddb0d85 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | 42 | ||
| 43 | #else /* ...!ASSEMBLY */ | 43 | #else /* ...!ASSEMBLY */ |
| 44 | 44 | ||
| 45 | #include <linux/kernel.h> | ||
| 45 | #include <linux/stringify.h> | 46 | #include <linux/stringify.h> |
| 46 | 47 | ||
| 47 | #ifdef CONFIG_SMP | 48 | #ifdef CONFIG_SMP |
| @@ -155,6 +156,15 @@ do { \ | |||
| 155 | /* We can use this directly for local CPU (faster). */ | 156 | /* We can use this directly for local CPU (faster). */ |
| 156 | DECLARE_PER_CPU(unsigned long, this_cpu_off); | 157 | DECLARE_PER_CPU(unsigned long, this_cpu_off); |
| 157 | 158 | ||
| 159 | #ifdef CONFIG_NEED_MULTIPLE_NODES | ||
| 160 | void *pcpu_lpage_remapped(void *kaddr); | ||
| 161 | #else | ||
| 162 | static inline void *pcpu_lpage_remapped(void *kaddr) | ||
| 163 | { | ||
| 164 | return NULL; | ||
| 165 | } | ||
| 166 | #endif | ||
| 167 | |||
| 158 | #endif /* !__ASSEMBLY__ */ | 168 | #endif /* !__ASSEMBLY__ */ |
| 159 | 169 | ||
| 160 | #ifdef CONFIG_SMP | 170 | #ifdef CONFIG_SMP |
diff --git a/arch/x86/include/asm/perf_counter.h b/arch/x86/include/asm/perf_counter.h index 5fb33e160ea0..fa64e401589d 100644 --- a/arch/x86/include/asm/perf_counter.h +++ b/arch/x86/include/asm/perf_counter.h | |||
| @@ -87,6 +87,9 @@ union cpuid10_edx { | |||
| 87 | #ifdef CONFIG_PERF_COUNTERS | 87 | #ifdef CONFIG_PERF_COUNTERS |
| 88 | extern void init_hw_perf_counters(void); | 88 | extern void init_hw_perf_counters(void); |
| 89 | extern void perf_counters_lapic_init(void); | 89 | extern void perf_counters_lapic_init(void); |
| 90 | |||
| 91 | #define PERF_COUNTER_INDEX_OFFSET 0 | ||
| 92 | |||
| 90 | #else | 93 | #else |
| 91 | static inline void init_hw_perf_counters(void) { } | 94 | static inline void init_hw_perf_counters(void) { } |
| 92 | static inline void perf_counters_lapic_init(void) { } | 95 | static inline void perf_counters_lapic_init(void) { } |
diff --git a/arch/x86/include/asm/proto.h b/arch/x86/include/asm/proto.h index 49fb3ecf3bb3..621f56d73121 100644 --- a/arch/x86/include/asm/proto.h +++ b/arch/x86/include/asm/proto.h | |||
| @@ -22,7 +22,14 @@ extern int reboot_force; | |||
| 22 | 22 | ||
| 23 | long do_arch_prctl(struct task_struct *task, int code, unsigned long addr); | 23 | long do_arch_prctl(struct task_struct *task, int code, unsigned long addr); |
| 24 | 24 | ||
| 25 | #define round_up(x, y) (((x) + (y) - 1) & ~((y) - 1)) | 25 | /* |
| 26 | #define round_down(x, y) ((x) & ~((y) - 1)) | 26 | * This looks more complex than it should be. But we need to |
| 27 | * get the type for the ~ right in round_down (it needs to be | ||
| 28 | * as wide as the result!), and we want to evaluate the macro | ||
| 29 | * arguments just once each. | ||
| 30 | */ | ||
| 31 | #define __round_mask(x,y) ((__typeof__(x))((y)-1)) | ||
| 32 | #define round_up(x,y) ((((x)-1) | __round_mask(x,y))+1) | ||
| 33 | #define round_down(x,y) ((x) & ~__round_mask(x,y)) | ||
| 27 | 34 | ||
| 28 | #endif /* _ASM_X86_PROTO_H */ | 35 | #endif /* _ASM_X86_PROTO_H */ |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index e5b27d8f1b47..28e5f5956042 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -258,13 +258,15 @@ static void __cpuinit amd_detect_cmp(struct cpuinfo_x86 *c) | |||
| 258 | { | 258 | { |
| 259 | #ifdef CONFIG_X86_HT | 259 | #ifdef CONFIG_X86_HT |
| 260 | unsigned bits; | 260 | unsigned bits; |
| 261 | int cpu = smp_processor_id(); | ||
| 261 | 262 | ||
| 262 | bits = c->x86_coreid_bits; | 263 | bits = c->x86_coreid_bits; |
| 263 | |||
| 264 | /* Low order bits define the core id (index of core in socket) */ | 264 | /* Low order bits define the core id (index of core in socket) */ |
| 265 | c->cpu_core_id = c->initial_apicid & ((1 << bits)-1); | 265 | c->cpu_core_id = c->initial_apicid & ((1 << bits)-1); |
| 266 | /* Convert the initial APIC ID into the socket ID */ | 266 | /* Convert the initial APIC ID into the socket ID */ |
| 267 | c->phys_proc_id = c->initial_apicid >> bits; | 267 | c->phys_proc_id = c->initial_apicid >> bits; |
| 268 | /* use socket ID also for last level cache */ | ||
| 269 | per_cpu(cpu_llc_id, cpu) = c->phys_proc_id; | ||
| 268 | #endif | 270 | #endif |
| 269 | } | 271 | } |
| 270 | 272 | ||
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 6b26d4deada0..f1961c07af9a 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -848,9 +848,6 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
| 848 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64) | 848 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64) |
| 849 | numa_add_cpu(smp_processor_id()); | 849 | numa_add_cpu(smp_processor_id()); |
| 850 | #endif | 850 | #endif |
| 851 | |||
| 852 | /* Cap the iomem address space to what is addressable on all CPUs */ | ||
| 853 | iomem_resource.end &= (1ULL << c->x86_phys_bits) - 1; | ||
| 854 | } | 851 | } |
| 855 | 852 | ||
| 856 | #ifdef CONFIG_X86_64 | 853 | #ifdef CONFIG_X86_64 |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 284d1de968bc..af425b83202b 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -1117,7 +1117,7 @@ static void mcheck_timer(unsigned long data) | |||
| 1117 | *n = min(*n*2, (int)round_jiffies_relative(check_interval*HZ)); | 1117 | *n = min(*n*2, (int)round_jiffies_relative(check_interval*HZ)); |
| 1118 | 1118 | ||
| 1119 | t->expires = jiffies + *n; | 1119 | t->expires = jiffies + *n; |
| 1120 | add_timer(t); | 1120 | add_timer_on(t, smp_processor_id()); |
| 1121 | } | 1121 | } |
| 1122 | 1122 | ||
| 1123 | static void mce_do_trigger(struct work_struct *work) | 1123 | static void mce_do_trigger(struct work_struct *work) |
| @@ -1321,7 +1321,7 @@ static void mce_init_timer(void) | |||
| 1321 | return; | 1321 | return; |
| 1322 | setup_timer(t, mcheck_timer, smp_processor_id()); | 1322 | setup_timer(t, mcheck_timer, smp_processor_id()); |
| 1323 | t->expires = round_jiffies(jiffies + *n); | 1323 | t->expires = round_jiffies(jiffies + *n); |
| 1324 | add_timer(t); | 1324 | add_timer_on(t, smp_processor_id()); |
| 1325 | } | 1325 | } |
| 1326 | 1326 | ||
| 1327 | /* | 1327 | /* |
diff --git a/arch/x86/kernel/cpu/perf_counter.c b/arch/x86/kernel/cpu/perf_counter.c index 76dfef23f789..d4cf4ce19aac 100644 --- a/arch/x86/kernel/cpu/perf_counter.c +++ b/arch/x86/kernel/cpu/perf_counter.c | |||
| @@ -401,7 +401,7 @@ static const u64 amd_hw_cache_event_ids | |||
| 401 | [ C(RESULT_MISS) ] = 0x0041, /* Data Cache Misses */ | 401 | [ C(RESULT_MISS) ] = 0x0041, /* Data Cache Misses */ |
| 402 | }, | 402 | }, |
| 403 | [ C(OP_WRITE) ] = { | 403 | [ C(OP_WRITE) ] = { |
| 404 | [ C(RESULT_ACCESS) ] = 0x0042, /* Data Cache Refills from L2 */ | 404 | [ C(RESULT_ACCESS) ] = 0x0142, /* Data Cache Refills :system */ |
| 405 | [ C(RESULT_MISS) ] = 0, | 405 | [ C(RESULT_MISS) ] = 0, |
| 406 | }, | 406 | }, |
| 407 | [ C(OP_PREFETCH) ] = { | 407 | [ C(OP_PREFETCH) ] = { |
| @@ -912,6 +912,8 @@ x86_perf_counter_set_period(struct perf_counter *counter, | |||
| 912 | err = checking_wrmsrl(hwc->counter_base + idx, | 912 | err = checking_wrmsrl(hwc->counter_base + idx, |
| 913 | (u64)(-left) & x86_pmu.counter_mask); | 913 | (u64)(-left) & x86_pmu.counter_mask); |
| 914 | 914 | ||
| 915 | perf_counter_update_userpage(counter); | ||
| 916 | |||
| 915 | return ret; | 917 | return ret; |
| 916 | } | 918 | } |
| 917 | 919 | ||
| @@ -969,13 +971,6 @@ fixed_mode_idx(struct perf_counter *counter, struct hw_perf_counter *hwc) | |||
| 969 | if (!x86_pmu.num_counters_fixed) | 971 | if (!x86_pmu.num_counters_fixed) |
| 970 | return -1; | 972 | return -1; |
| 971 | 973 | ||
| 972 | /* | ||
| 973 | * Quirk, IA32_FIXED_CTRs do not work on current Atom processors: | ||
| 974 | */ | ||
| 975 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && | ||
| 976 | boot_cpu_data.x86_model == 28) | ||
| 977 | return -1; | ||
| 978 | |||
| 979 | event = hwc->config & ARCH_PERFMON_EVENT_MASK; | 974 | event = hwc->config & ARCH_PERFMON_EVENT_MASK; |
| 980 | 975 | ||
| 981 | if (unlikely(event == x86_pmu.event_map(PERF_COUNT_HW_INSTRUCTIONS))) | 976 | if (unlikely(event == x86_pmu.event_map(PERF_COUNT_HW_INSTRUCTIONS))) |
| @@ -1041,6 +1036,8 @@ try_generic: | |||
| 1041 | x86_perf_counter_set_period(counter, hwc, idx); | 1036 | x86_perf_counter_set_period(counter, hwc, idx); |
| 1042 | x86_pmu.enable(hwc, idx); | 1037 | x86_pmu.enable(hwc, idx); |
| 1043 | 1038 | ||
| 1039 | perf_counter_update_userpage(counter); | ||
| 1040 | |||
| 1044 | return 0; | 1041 | return 0; |
| 1045 | } | 1042 | } |
| 1046 | 1043 | ||
| @@ -1133,6 +1130,8 @@ static void x86_pmu_disable(struct perf_counter *counter) | |||
| 1133 | x86_perf_counter_update(counter, hwc, idx); | 1130 | x86_perf_counter_update(counter, hwc, idx); |
| 1134 | cpuc->counters[idx] = NULL; | 1131 | cpuc->counters[idx] = NULL; |
| 1135 | clear_bit(idx, cpuc->used_mask); | 1132 | clear_bit(idx, cpuc->used_mask); |
| 1133 | |||
| 1134 | perf_counter_update_userpage(counter); | ||
| 1136 | } | 1135 | } |
| 1137 | 1136 | ||
| 1138 | /* | 1137 | /* |
| @@ -1428,8 +1427,6 @@ static int intel_pmu_init(void) | |||
| 1428 | */ | 1427 | */ |
| 1429 | x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); | 1428 | x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); |
| 1430 | 1429 | ||
| 1431 | rdmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl); | ||
| 1432 | |||
| 1433 | /* | 1430 | /* |
| 1434 | * Install the hw-cache-events table: | 1431 | * Install the hw-cache-events table: |
| 1435 | */ | 1432 | */ |
| @@ -1499,21 +1496,22 @@ void __init init_hw_perf_counters(void) | |||
| 1499 | pr_cont("%s PMU driver.\n", x86_pmu.name); | 1496 | pr_cont("%s PMU driver.\n", x86_pmu.name); |
| 1500 | 1497 | ||
| 1501 | if (x86_pmu.num_counters > X86_PMC_MAX_GENERIC) { | 1498 | if (x86_pmu.num_counters > X86_PMC_MAX_GENERIC) { |
| 1502 | x86_pmu.num_counters = X86_PMC_MAX_GENERIC; | ||
| 1503 | WARN(1, KERN_ERR "hw perf counters %d > max(%d), clipping!", | 1499 | WARN(1, KERN_ERR "hw perf counters %d > max(%d), clipping!", |
| 1504 | x86_pmu.num_counters, X86_PMC_MAX_GENERIC); | 1500 | x86_pmu.num_counters, X86_PMC_MAX_GENERIC); |
| 1501 | x86_pmu.num_counters = X86_PMC_MAX_GENERIC; | ||
| 1505 | } | 1502 | } |
| 1506 | perf_counter_mask = (1 << x86_pmu.num_counters) - 1; | 1503 | perf_counter_mask = (1 << x86_pmu.num_counters) - 1; |
| 1507 | perf_max_counters = x86_pmu.num_counters; | 1504 | perf_max_counters = x86_pmu.num_counters; |
| 1508 | 1505 | ||
| 1509 | if (x86_pmu.num_counters_fixed > X86_PMC_MAX_FIXED) { | 1506 | if (x86_pmu.num_counters_fixed > X86_PMC_MAX_FIXED) { |
| 1510 | x86_pmu.num_counters_fixed = X86_PMC_MAX_FIXED; | ||
| 1511 | WARN(1, KERN_ERR "hw perf counters fixed %d > max(%d), clipping!", | 1507 | WARN(1, KERN_ERR "hw perf counters fixed %d > max(%d), clipping!", |
| 1512 | x86_pmu.num_counters_fixed, X86_PMC_MAX_FIXED); | 1508 | x86_pmu.num_counters_fixed, X86_PMC_MAX_FIXED); |
| 1509 | x86_pmu.num_counters_fixed = X86_PMC_MAX_FIXED; | ||
| 1513 | } | 1510 | } |
| 1514 | 1511 | ||
| 1515 | perf_counter_mask |= | 1512 | perf_counter_mask |= |
| 1516 | ((1LL << x86_pmu.num_counters_fixed)-1) << X86_PMC_IDX_FIXED; | 1513 | ((1LL << x86_pmu.num_counters_fixed)-1) << X86_PMC_IDX_FIXED; |
| 1514 | x86_pmu.intel_ctrl = perf_counter_mask; | ||
| 1517 | 1515 | ||
| 1518 | perf_counters_lapic_init(); | 1516 | perf_counters_lapic_init(); |
| 1519 | register_die_notifier(&perf_counter_nmi_notifier); | 1517 | register_die_notifier(&perf_counter_nmi_notifier); |
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index 95ea5fa7d444..c8405718a4c3 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include "dumpstack.h" | 22 | #include "dumpstack.h" |
| 23 | 23 | ||
| 24 | int panic_on_unrecovered_nmi; | 24 | int panic_on_unrecovered_nmi; |
| 25 | int panic_on_io_nmi; | ||
| 25 | unsigned int code_bytes = 64; | 26 | unsigned int code_bytes = 64; |
| 26 | int kstack_depth_to_print = 3 * STACKSLOTS_PER_LINE; | 27 | int kstack_depth_to_print = 3 * STACKSLOTS_PER_LINE; |
| 27 | static int die_counter; | 28 | static int die_counter; |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 7271fa33d791..c4ca89d9aaf4 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
| @@ -1383,6 +1383,8 @@ static unsigned long ram_alignment(resource_size_t pos) | |||
| 1383 | return 32*1024*1024; | 1383 | return 32*1024*1024; |
| 1384 | } | 1384 | } |
| 1385 | 1385 | ||
| 1386 | #define MAX_RESOURCE_SIZE ((resource_size_t)-1) | ||
| 1387 | |||
| 1386 | void __init e820_reserve_resources_late(void) | 1388 | void __init e820_reserve_resources_late(void) |
| 1387 | { | 1389 | { |
| 1388 | int i; | 1390 | int i; |
| @@ -1400,17 +1402,19 @@ void __init e820_reserve_resources_late(void) | |||
| 1400 | * avoid stolen RAM: | 1402 | * avoid stolen RAM: |
| 1401 | */ | 1403 | */ |
| 1402 | for (i = 0; i < e820.nr_map; i++) { | 1404 | for (i = 0; i < e820.nr_map; i++) { |
| 1403 | struct e820entry *entry = &e820_saved.map[i]; | 1405 | struct e820entry *entry = &e820.map[i]; |
| 1404 | resource_size_t start, end; | 1406 | u64 start, end; |
| 1405 | 1407 | ||
| 1406 | if (entry->type != E820_RAM) | 1408 | if (entry->type != E820_RAM) |
| 1407 | continue; | 1409 | continue; |
| 1408 | start = entry->addr + entry->size; | 1410 | start = entry->addr + entry->size; |
| 1409 | end = round_up(start, ram_alignment(start)); | 1411 | end = round_up(start, ram_alignment(start)) - 1; |
| 1410 | if (start == end) | 1412 | if (end > MAX_RESOURCE_SIZE) |
| 1413 | end = MAX_RESOURCE_SIZE; | ||
| 1414 | if (start >= end) | ||
| 1411 | continue; | 1415 | continue; |
| 1412 | reserve_region_with_split(&iomem_resource, start, | 1416 | reserve_region_with_split(&iomem_resource, start, end, |
| 1413 | end - 1, "RAM buffer"); | 1417 | "RAM buffer"); |
| 1414 | } | 1418 | } |
| 1415 | } | 1419 | } |
| 1416 | 1420 | ||
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 47630479b067..1a041bcf506b 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -211,11 +211,11 @@ static __init int iommu_setup(char *p) | |||
| 211 | #ifdef CONFIG_SWIOTLB | 211 | #ifdef CONFIG_SWIOTLB |
| 212 | if (!strncmp(p, "soft", 4)) | 212 | if (!strncmp(p, "soft", 4)) |
| 213 | swiotlb = 1; | 213 | swiotlb = 1; |
| 214 | #endif | ||
| 214 | if (!strncmp(p, "pt", 2)) { | 215 | if (!strncmp(p, "pt", 2)) { |
| 215 | iommu_pass_through = 1; | 216 | iommu_pass_through = 1; |
| 216 | return 1; | 217 | return 1; |
| 217 | } | 218 | } |
| 218 | #endif | ||
| 219 | 219 | ||
| 220 | gart_parse_options(p); | 220 | gart_parse_options(p); |
| 221 | 221 | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index be5ae80f897f..de2cab132844 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -289,6 +289,20 @@ void * __init extend_brk(size_t size, size_t align) | |||
| 289 | return ret; | 289 | return ret; |
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | #ifdef CONFIG_X86_64 | ||
| 293 | static void __init init_gbpages(void) | ||
| 294 | { | ||
| 295 | if (direct_gbpages && cpu_has_gbpages) | ||
| 296 | printk(KERN_INFO "Using GB pages for direct mapping\n"); | ||
| 297 | else | ||
| 298 | direct_gbpages = 0; | ||
| 299 | } | ||
| 300 | #else | ||
| 301 | static inline void init_gbpages(void) | ||
| 302 | { | ||
| 303 | } | ||
| 304 | #endif | ||
| 305 | |||
| 292 | static void __init reserve_brk(void) | 306 | static void __init reserve_brk(void) |
| 293 | { | 307 | { |
| 294 | if (_brk_end > _brk_start) | 308 | if (_brk_end > _brk_start) |
| @@ -871,6 +885,8 @@ void __init setup_arch(char **cmdline_p) | |||
| 871 | 885 | ||
| 872 | reserve_brk(); | 886 | reserve_brk(); |
| 873 | 887 | ||
| 888 | init_gbpages(); | ||
| 889 | |||
| 874 | /* max_pfn_mapped is updated here */ | 890 | /* max_pfn_mapped is updated here */ |
| 875 | max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT); | 891 | max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT); |
| 876 | max_pfn_mapped = max_low_pfn_mapped; | 892 | max_pfn_mapped = max_low_pfn_mapped; |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index 9c3f0823e6aa..29a3eef7cf4a 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
| @@ -124,7 +124,7 @@ static void * __init pcpu_alloc_bootmem(unsigned int cpu, unsigned long size, | |||
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | /* | 126 | /* |
| 127 | * Remap allocator | 127 | * Large page remap allocator |
| 128 | * | 128 | * |
| 129 | * This allocator uses PMD page as unit. A PMD page is allocated for | 129 | * This allocator uses PMD page as unit. A PMD page is allocated for |
| 130 | * each cpu and each is remapped into vmalloc area using PMD mapping. | 130 | * each cpu and each is remapped into vmalloc area using PMD mapping. |
| @@ -137,105 +137,185 @@ static void * __init pcpu_alloc_bootmem(unsigned int cpu, unsigned long size, | |||
| 137 | * better than only using 4k mappings while still being NUMA friendly. | 137 | * better than only using 4k mappings while still being NUMA friendly. |
| 138 | */ | 138 | */ |
| 139 | #ifdef CONFIG_NEED_MULTIPLE_NODES | 139 | #ifdef CONFIG_NEED_MULTIPLE_NODES |
| 140 | static size_t pcpur_size __initdata; | 140 | struct pcpul_ent { |
| 141 | static void **pcpur_ptrs __initdata; | 141 | unsigned int cpu; |
| 142 | void *ptr; | ||
| 143 | }; | ||
| 144 | |||
| 145 | static size_t pcpul_size; | ||
| 146 | static struct pcpul_ent *pcpul_map; | ||
| 147 | static struct vm_struct pcpul_vm; | ||
| 142 | 148 | ||
| 143 | static struct page * __init pcpur_get_page(unsigned int cpu, int pageno) | 149 | static struct page * __init pcpul_get_page(unsigned int cpu, int pageno) |
| 144 | { | 150 | { |
| 145 | size_t off = (size_t)pageno << PAGE_SHIFT; | 151 | size_t off = (size_t)pageno << PAGE_SHIFT; |
| 146 | 152 | ||
| 147 | if (off >= pcpur_size) | 153 | if (off >= pcpul_size) |
| 148 | return NULL; | 154 | return NULL; |
| 149 | 155 | ||
| 150 | return virt_to_page(pcpur_ptrs[cpu] + off); | 156 | return virt_to_page(pcpul_map[cpu].ptr + off); |
| 151 | } | 157 | } |
| 152 | 158 | ||
| 153 | static ssize_t __init setup_pcpu_remap(size_t static_size) | 159 | static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen) |
| 154 | { | 160 | { |
| 155 | static struct vm_struct vm; | 161 | size_t map_size, dyn_size; |
| 156 | size_t ptrs_size, dyn_size; | ||
| 157 | unsigned int cpu; | 162 | unsigned int cpu; |
| 163 | int i, j; | ||
| 158 | ssize_t ret; | 164 | ssize_t ret; |
| 159 | 165 | ||
| 160 | /* | 166 | if (!chosen) { |
| 161 | * If large page isn't supported, there's no benefit in doing | 167 | size_t vm_size = VMALLOC_END - VMALLOC_START; |
| 162 | * this. Also, on non-NUMA, embedding is better. | 168 | size_t tot_size = num_possible_cpus() * PMD_SIZE; |
| 163 | * | 169 | |
| 164 | * NOTE: disabled for now. | 170 | /* on non-NUMA, embedding is better */ |
| 165 | */ | 171 | if (!pcpu_need_numa()) |
| 166 | if (true || !cpu_has_pse || !pcpu_need_numa()) | 172 | return -EINVAL; |
| 173 | |||
| 174 | /* don't consume more than 20% of vmalloc area */ | ||
| 175 | if (tot_size > vm_size / 5) { | ||
| 176 | pr_info("PERCPU: too large chunk size %zuMB for " | ||
| 177 | "large page remap\n", tot_size >> 20); | ||
| 178 | return -EINVAL; | ||
| 179 | } | ||
| 180 | } | ||
| 181 | |||
| 182 | /* need PSE */ | ||
| 183 | if (!cpu_has_pse) { | ||
| 184 | pr_warning("PERCPU: lpage allocator requires PSE\n"); | ||
| 167 | return -EINVAL; | 185 | return -EINVAL; |
| 186 | } | ||
| 168 | 187 | ||
| 169 | /* | 188 | /* |
| 170 | * Currently supports only single page. Supporting multiple | 189 | * Currently supports only single page. Supporting multiple |
| 171 | * pages won't be too difficult if it ever becomes necessary. | 190 | * pages won't be too difficult if it ever becomes necessary. |
| 172 | */ | 191 | */ |
| 173 | pcpur_size = PFN_ALIGN(static_size + PERCPU_MODULE_RESERVE + | 192 | pcpul_size = PFN_ALIGN(static_size + PERCPU_MODULE_RESERVE + |
| 174 | PERCPU_DYNAMIC_RESERVE); | 193 | PERCPU_DYNAMIC_RESERVE); |
| 175 | if (pcpur_size > PMD_SIZE) { | 194 | if (pcpul_size > PMD_SIZE) { |
| 176 | pr_warning("PERCPU: static data is larger than large page, " | 195 | pr_warning("PERCPU: static data is larger than large page, " |
| 177 | "can't use large page\n"); | 196 | "can't use large page\n"); |
| 178 | return -EINVAL; | 197 | return -EINVAL; |
| 179 | } | 198 | } |
| 180 | dyn_size = pcpur_size - static_size - PERCPU_FIRST_CHUNK_RESERVE; | 199 | dyn_size = pcpul_size - static_size - PERCPU_FIRST_CHUNK_RESERVE; |
| 181 | 200 | ||
| 182 | /* allocate pointer array and alloc large pages */ | 201 | /* allocate pointer array and alloc large pages */ |
| 183 | ptrs_size = PFN_ALIGN(num_possible_cpus() * sizeof(pcpur_ptrs[0])); | 202 | map_size = PFN_ALIGN(num_possible_cpus() * sizeof(pcpul_map[0])); |
| 184 | pcpur_ptrs = alloc_bootmem(ptrs_size); | 203 | pcpul_map = alloc_bootmem(map_size); |
| 185 | 204 | ||
| 186 | for_each_possible_cpu(cpu) { | 205 | for_each_possible_cpu(cpu) { |
| 187 | pcpur_ptrs[cpu] = pcpu_alloc_bootmem(cpu, PMD_SIZE, PMD_SIZE); | 206 | pcpul_map[cpu].cpu = cpu; |
| 188 | if (!pcpur_ptrs[cpu]) | 207 | pcpul_map[cpu].ptr = pcpu_alloc_bootmem(cpu, PMD_SIZE, |
| 208 | PMD_SIZE); | ||
| 209 | if (!pcpul_map[cpu].ptr) { | ||
| 210 | pr_warning("PERCPU: failed to allocate large page " | ||
| 211 | "for cpu%u\n", cpu); | ||
| 189 | goto enomem; | 212 | goto enomem; |
| 213 | } | ||
| 190 | 214 | ||
| 191 | /* | 215 | /* |
| 192 | * Only use pcpur_size bytes and give back the rest. | 216 | * Only use pcpul_size bytes and give back the rest. |
| 193 | * | 217 | * |
| 194 | * Ingo: The 2MB up-rounding bootmem is needed to make | 218 | * Ingo: The 2MB up-rounding bootmem is needed to make |
| 195 | * sure the partial 2MB page is still fully RAM - it's | 219 | * sure the partial 2MB page is still fully RAM - it's |
| 196 | * not well-specified to have a PAT-incompatible area | 220 | * not well-specified to have a PAT-incompatible area |
| 197 | * (unmapped RAM, device memory, etc.) in that hole. | 221 | * (unmapped RAM, device memory, etc.) in that hole. |
| 198 | */ | 222 | */ |
| 199 | free_bootmem(__pa(pcpur_ptrs[cpu] + pcpur_size), | 223 | free_bootmem(__pa(pcpul_map[cpu].ptr + pcpul_size), |
| 200 | PMD_SIZE - pcpur_size); | 224 | PMD_SIZE - pcpul_size); |
| 201 | 225 | ||
| 202 | memcpy(pcpur_ptrs[cpu], __per_cpu_load, static_size); | 226 | memcpy(pcpul_map[cpu].ptr, __per_cpu_load, static_size); |
| 203 | } | 227 | } |
| 204 | 228 | ||
| 205 | /* allocate address and map */ | 229 | /* allocate address and map */ |
| 206 | vm.flags = VM_ALLOC; | 230 | pcpul_vm.flags = VM_ALLOC; |
| 207 | vm.size = num_possible_cpus() * PMD_SIZE; | 231 | pcpul_vm.size = num_possible_cpus() * PMD_SIZE; |
| 208 | vm_area_register_early(&vm, PMD_SIZE); | 232 | vm_area_register_early(&pcpul_vm, PMD_SIZE); |
| 209 | 233 | ||
| 210 | for_each_possible_cpu(cpu) { | 234 | for_each_possible_cpu(cpu) { |
| 211 | pmd_t *pmd; | 235 | pmd_t *pmd, pmd_v; |
| 212 | 236 | ||
| 213 | pmd = populate_extra_pmd((unsigned long)vm.addr | 237 | pmd = populate_extra_pmd((unsigned long)pcpul_vm.addr + |
| 214 | + cpu * PMD_SIZE); | 238 | cpu * PMD_SIZE); |
| 215 | set_pmd(pmd, pfn_pmd(page_to_pfn(virt_to_page(pcpur_ptrs[cpu])), | 239 | pmd_v = pfn_pmd(page_to_pfn(virt_to_page(pcpul_map[cpu].ptr)), |
| 216 | PAGE_KERNEL_LARGE)); | 240 | PAGE_KERNEL_LARGE); |
| 241 | set_pmd(pmd, pmd_v); | ||
| 217 | } | 242 | } |
| 218 | 243 | ||
| 219 | /* we're ready, commit */ | 244 | /* we're ready, commit */ |
| 220 | pr_info("PERCPU: Remapped at %p with large pages, static data " | 245 | pr_info("PERCPU: Remapped at %p with large pages, static data " |
| 221 | "%zu bytes\n", vm.addr, static_size); | 246 | "%zu bytes\n", pcpul_vm.addr, static_size); |
| 222 | 247 | ||
| 223 | ret = pcpu_setup_first_chunk(pcpur_get_page, static_size, | 248 | ret = pcpu_setup_first_chunk(pcpul_get_page, static_size, |
| 224 | PERCPU_FIRST_CHUNK_RESERVE, dyn_size, | 249 | PERCPU_FIRST_CHUNK_RESERVE, dyn_size, |
| 225 | PMD_SIZE, vm.addr, NULL); | 250 | PMD_SIZE, pcpul_vm.addr, NULL); |
| 226 | goto out_free_ar; | 251 | |
| 252 | /* sort pcpul_map array for pcpu_lpage_remapped() */ | ||
| 253 | for (i = 0; i < num_possible_cpus() - 1; i++) | ||
| 254 | for (j = i + 1; j < num_possible_cpus(); j++) | ||
| 255 | if (pcpul_map[i].ptr > pcpul_map[j].ptr) { | ||
| 256 | struct pcpul_ent tmp = pcpul_map[i]; | ||
| 257 | pcpul_map[i] = pcpul_map[j]; | ||
| 258 | pcpul_map[j] = tmp; | ||
| 259 | } | ||
| 260 | |||
| 261 | return ret; | ||
| 227 | 262 | ||
| 228 | enomem: | 263 | enomem: |
| 229 | for_each_possible_cpu(cpu) | 264 | for_each_possible_cpu(cpu) |
| 230 | if (pcpur_ptrs[cpu]) | 265 | if (pcpul_map[cpu].ptr) |
| 231 | free_bootmem(__pa(pcpur_ptrs[cpu]), PMD_SIZE); | 266 | free_bootmem(__pa(pcpul_map[cpu].ptr), pcpul_size); |
| 232 | ret = -ENOMEM; | 267 | free_bootmem(__pa(pcpul_map), map_size); |
| 233 | out_free_ar: | 268 | return -ENOMEM; |
| 234 | free_bootmem(__pa(pcpur_ptrs), ptrs_size); | 269 | } |
| 235 | return ret; | 270 | |
| 271 | /** | ||
| 272 | * pcpu_lpage_remapped - determine whether a kaddr is in pcpul recycled area | ||
| 273 | * @kaddr: the kernel address in question | ||
| 274 | * | ||
| 275 | * Determine whether @kaddr falls in the pcpul recycled area. This is | ||
| 276 | * used by pageattr to detect VM aliases and break up the pcpu PMD | ||
| 277 | * mapping such that the same physical page is not mapped under | ||
| 278 | * different attributes. | ||
| 279 | * | ||
| 280 | * The recycled area is always at the tail of a partially used PMD | ||
| 281 | * page. | ||
| 282 | * | ||
| 283 | * RETURNS: | ||
| 284 | * Address of corresponding remapped pcpu address if match is found; | ||
| 285 | * otherwise, NULL. | ||
| 286 | */ | ||
| 287 | void *pcpu_lpage_remapped(void *kaddr) | ||
| 288 | { | ||
| 289 | void *pmd_addr = (void *)((unsigned long)kaddr & PMD_MASK); | ||
| 290 | unsigned long offset = (unsigned long)kaddr & ~PMD_MASK; | ||
| 291 | int left = 0, right = num_possible_cpus() - 1; | ||
| 292 | int pos; | ||
| 293 | |||
| 294 | /* pcpul in use at all? */ | ||
| 295 | if (!pcpul_map) | ||
| 296 | return NULL; | ||
| 297 | |||
| 298 | /* okay, perform binary search */ | ||
| 299 | while (left <= right) { | ||
| 300 | pos = (left + right) / 2; | ||
| 301 | |||
| 302 | if (pcpul_map[pos].ptr < pmd_addr) | ||
| 303 | left = pos + 1; | ||
| 304 | else if (pcpul_map[pos].ptr > pmd_addr) | ||
| 305 | right = pos - 1; | ||
| 306 | else { | ||
| 307 | /* it shouldn't be in the area for the first chunk */ | ||
| 308 | WARN_ON(offset < pcpul_size); | ||
| 309 | |||
| 310 | return pcpul_vm.addr + | ||
| 311 | pcpul_map[pos].cpu * PMD_SIZE + offset; | ||
| 312 | } | ||
| 313 | } | ||
| 314 | |||
| 315 | return NULL; | ||
| 236 | } | 316 | } |
| 237 | #else | 317 | #else |
| 238 | static ssize_t __init setup_pcpu_remap(size_t static_size) | 318 | static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen) |
| 239 | { | 319 | { |
| 240 | return -EINVAL; | 320 | return -EINVAL; |
| 241 | } | 321 | } |
| @@ -249,7 +329,7 @@ static ssize_t __init setup_pcpu_remap(size_t static_size) | |||
| 249 | * mapping so that it can use PMD mapping without additional TLB | 329 | * mapping so that it can use PMD mapping without additional TLB |
| 250 | * pressure. | 330 | * pressure. |
| 251 | */ | 331 | */ |
| 252 | static ssize_t __init setup_pcpu_embed(size_t static_size) | 332 | static ssize_t __init setup_pcpu_embed(size_t static_size, bool chosen) |
| 253 | { | 333 | { |
| 254 | size_t reserve = PERCPU_MODULE_RESERVE + PERCPU_DYNAMIC_RESERVE; | 334 | size_t reserve = PERCPU_MODULE_RESERVE + PERCPU_DYNAMIC_RESERVE; |
| 255 | 335 | ||
| @@ -258,7 +338,7 @@ static ssize_t __init setup_pcpu_embed(size_t static_size) | |||
| 258 | * this. Also, embedding allocation doesn't play well with | 338 | * this. Also, embedding allocation doesn't play well with |
| 259 | * NUMA. | 339 | * NUMA. |
| 260 | */ | 340 | */ |
| 261 | if (!cpu_has_pse || pcpu_need_numa()) | 341 | if (!chosen && (!cpu_has_pse || pcpu_need_numa())) |
| 262 | return -EINVAL; | 342 | return -EINVAL; |
| 263 | 343 | ||
| 264 | return pcpu_embed_first_chunk(static_size, PERCPU_FIRST_CHUNK_RESERVE, | 344 | return pcpu_embed_first_chunk(static_size, PERCPU_FIRST_CHUNK_RESERVE, |
| @@ -308,8 +388,11 @@ static ssize_t __init setup_pcpu_4k(size_t static_size) | |||
| 308 | void *ptr; | 388 | void *ptr; |
| 309 | 389 | ||
| 310 | ptr = pcpu_alloc_bootmem(cpu, PAGE_SIZE, PAGE_SIZE); | 390 | ptr = pcpu_alloc_bootmem(cpu, PAGE_SIZE, PAGE_SIZE); |
| 311 | if (!ptr) | 391 | if (!ptr) { |
| 392 | pr_warning("PERCPU: failed to allocate " | ||
| 393 | "4k page for cpu%u\n", cpu); | ||
| 312 | goto enomem; | 394 | goto enomem; |
| 395 | } | ||
| 313 | 396 | ||
| 314 | memcpy(ptr, __per_cpu_load + i * PAGE_SIZE, PAGE_SIZE); | 397 | memcpy(ptr, __per_cpu_load + i * PAGE_SIZE, PAGE_SIZE); |
| 315 | pcpu4k_pages[j++] = virt_to_page(ptr); | 398 | pcpu4k_pages[j++] = virt_to_page(ptr); |
| @@ -333,6 +416,16 @@ out_free_ar: | |||
| 333 | return ret; | 416 | return ret; |
| 334 | } | 417 | } |
| 335 | 418 | ||
| 419 | /* for explicit first chunk allocator selection */ | ||
| 420 | static char pcpu_chosen_alloc[16] __initdata; | ||
| 421 | |||
| 422 | static int __init percpu_alloc_setup(char *str) | ||
| 423 | { | ||
| 424 | strncpy(pcpu_chosen_alloc, str, sizeof(pcpu_chosen_alloc) - 1); | ||
| 425 | return 0; | ||
| 426 | } | ||
| 427 | early_param("percpu_alloc", percpu_alloc_setup); | ||
| 428 | |||
| 336 | static inline void setup_percpu_segment(int cpu) | 429 | static inline void setup_percpu_segment(int cpu) |
| 337 | { | 430 | { |
| 338 | #ifdef CONFIG_X86_32 | 431 | #ifdef CONFIG_X86_32 |
| @@ -346,11 +439,6 @@ static inline void setup_percpu_segment(int cpu) | |||
| 346 | #endif | 439 | #endif |
| 347 | } | 440 | } |
| 348 | 441 | ||
| 349 | /* | ||
| 350 | * Great future plan: | ||
| 351 | * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data. | ||
| 352 | * Always point %gs to its beginning | ||
| 353 | */ | ||
| 354 | void __init setup_per_cpu_areas(void) | 442 | void __init setup_per_cpu_areas(void) |
| 355 | { | 443 | { |
| 356 | size_t static_size = __per_cpu_end - __per_cpu_start; | 444 | size_t static_size = __per_cpu_end - __per_cpu_start; |
| @@ -367,9 +455,26 @@ void __init setup_per_cpu_areas(void) | |||
| 367 | * of large page mappings. Please read comments on top of | 455 | * of large page mappings. Please read comments on top of |
| 368 | * each allocator for details. | 456 | * each allocator for details. |
| 369 | */ | 457 | */ |
| 370 | ret = setup_pcpu_remap(static_size); | 458 | ret = -EINVAL; |
| 371 | if (ret < 0) | 459 | if (strlen(pcpu_chosen_alloc)) { |
| 372 | ret = setup_pcpu_embed(static_size); | 460 | if (strcmp(pcpu_chosen_alloc, "4k")) { |
| 461 | if (!strcmp(pcpu_chosen_alloc, "lpage")) | ||
| 462 | ret = setup_pcpu_lpage(static_size, true); | ||
| 463 | else if (!strcmp(pcpu_chosen_alloc, "embed")) | ||
| 464 | ret = setup_pcpu_embed(static_size, true); | ||
| 465 | else | ||
| 466 | pr_warning("PERCPU: unknown allocator %s " | ||
| 467 | "specified\n", pcpu_chosen_alloc); | ||
| 468 | if (ret < 0) | ||
| 469 | pr_warning("PERCPU: %s allocator failed (%zd), " | ||
| 470 | "falling back to 4k\n", | ||
| 471 | pcpu_chosen_alloc, ret); | ||
| 472 | } | ||
| 473 | } else { | ||
| 474 | ret = setup_pcpu_lpage(static_size, false); | ||
| 475 | if (ret < 0) | ||
| 476 | ret = setup_pcpu_embed(static_size, false); | ||
| 477 | } | ||
| 373 | if (ret < 0) | 478 | if (ret < 0) |
| 374 | ret = setup_pcpu_4k(static_size); | 479 | ret = setup_pcpu_4k(static_size); |
| 375 | if (ret < 0) | 480 | if (ret < 0) |
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 124d40c575df..8ccabb8a2f6a 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -711,7 +711,6 @@ uv_activation_descriptor_init(int node, int pnode) | |||
| 711 | unsigned long pa; | 711 | unsigned long pa; |
| 712 | unsigned long m; | 712 | unsigned long m; |
| 713 | unsigned long n; | 713 | unsigned long n; |
| 714 | unsigned long mmr_image; | ||
| 715 | struct bau_desc *adp; | 714 | struct bau_desc *adp; |
| 716 | struct bau_desc *ad2; | 715 | struct bau_desc *ad2; |
| 717 | 716 | ||
| @@ -727,12 +726,8 @@ uv_activation_descriptor_init(int node, int pnode) | |||
| 727 | n = pa >> uv_nshift; | 726 | n = pa >> uv_nshift; |
| 728 | m = pa & uv_mmask; | 727 | m = pa & uv_mmask; |
| 729 | 728 | ||
| 730 | mmr_image = uv_read_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE); | 729 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, |
| 731 | if (mmr_image) { | 730 | (n << UV_DESC_BASE_PNODE_SHIFT | m)); |
| 732 | uv_write_global_mmr64(pnode, (unsigned long) | ||
| 733 | UVH_LB_BAU_SB_DESCRIPTOR_BASE, | ||
| 734 | (n << UV_DESC_BASE_PNODE_SHIFT | m)); | ||
| 735 | } | ||
| 736 | 731 | ||
| 737 | /* | 732 | /* |
| 738 | * initializing all 8 (UV_ITEMS_PER_DESCRIPTOR) descriptors for each | 733 | * initializing all 8 (UV_ITEMS_PER_DESCRIPTOR) descriptors for each |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index a0f48f5671c0..5204332f475d 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -346,6 +346,9 @@ io_check_error(unsigned char reason, struct pt_regs *regs) | |||
| 346 | printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n"); | 346 | printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n"); |
| 347 | show_registers(regs); | 347 | show_registers(regs); |
| 348 | 348 | ||
| 349 | if (panic_on_io_nmi) | ||
| 350 | panic("NMI IOCK error: Not continuing"); | ||
| 351 | |||
| 349 | /* Re-enable the IOCK line, wait for a few seconds */ | 352 | /* Re-enable the IOCK line, wait for a few seconds */ |
| 350 | reason = (reason & 0xf) | 8; | 353 | reason = (reason & 0xf) | 8; |
| 351 | outb(reason, 0x61); | 354 | outb(reason, 0x61); |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 5c3d6e81a7dc..7030b5f911bf 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2157,7 +2157,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level) | |||
| 2157 | else | 2157 | else |
| 2158 | /* 32 bits PSE 4MB page */ | 2158 | /* 32 bits PSE 4MB page */ |
| 2159 | context->rsvd_bits_mask[1][1] = rsvd_bits(13, 21); | 2159 | context->rsvd_bits_mask[1][1] = rsvd_bits(13, 21); |
| 2160 | context->rsvd_bits_mask[1][0] = ~0ull; | 2160 | context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[1][0]; |
| 2161 | break; | 2161 | break; |
| 2162 | case PT32E_ROOT_LEVEL: | 2162 | case PT32E_ROOT_LEVEL: |
| 2163 | context->rsvd_bits_mask[0][2] = | 2163 | context->rsvd_bits_mask[0][2] = |
| @@ -2170,7 +2170,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level) | |||
| 2170 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | | 2170 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | |
| 2171 | rsvd_bits(maxphyaddr, 62) | | 2171 | rsvd_bits(maxphyaddr, 62) | |
| 2172 | rsvd_bits(13, 20); /* large page */ | 2172 | rsvd_bits(13, 20); /* large page */ |
| 2173 | context->rsvd_bits_mask[1][0] = ~0ull; | 2173 | context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[1][0]; |
| 2174 | break; | 2174 | break; |
| 2175 | case PT64_ROOT_LEVEL: | 2175 | case PT64_ROOT_LEVEL: |
| 2176 | context->rsvd_bits_mask[0][3] = exb_bit_rsvd | | 2176 | context->rsvd_bits_mask[0][3] = exb_bit_rsvd | |
| @@ -2186,7 +2186,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level) | |||
| 2186 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | | 2186 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | |
| 2187 | rsvd_bits(maxphyaddr, 51) | | 2187 | rsvd_bits(maxphyaddr, 51) | |
| 2188 | rsvd_bits(13, 20); /* large page */ | 2188 | rsvd_bits(13, 20); /* large page */ |
| 2189 | context->rsvd_bits_mask[1][0] = ~0ull; | 2189 | context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[1][0]; |
| 2190 | break; | 2190 | break; |
| 2191 | } | 2191 | } |
| 2192 | } | 2192 | } |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 258e4591e1ca..67785f635399 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
| @@ -281,7 +281,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
| 281 | { | 281 | { |
| 282 | unsigned access = gw->pt_access; | 282 | unsigned access = gw->pt_access; |
| 283 | struct kvm_mmu_page *shadow_page; | 283 | struct kvm_mmu_page *shadow_page; |
| 284 | u64 spte, *sptep; | 284 | u64 spte, *sptep = NULL; |
| 285 | int direct; | 285 | int direct; |
| 286 | gfn_t table_gfn; | 286 | gfn_t table_gfn; |
| 287 | int r; | 287 | int r; |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index e770bf349ec4..356a0ce85c68 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -3012,6 +3012,12 @@ static int handle_vmcall(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 3012 | return 1; | 3012 | return 1; |
| 3013 | } | 3013 | } |
| 3014 | 3014 | ||
| 3015 | static int handle_vmx_insn(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | ||
| 3016 | { | ||
| 3017 | kvm_queue_exception(vcpu, UD_VECTOR); | ||
| 3018 | return 1; | ||
| 3019 | } | ||
| 3020 | |||
| 3015 | static int handle_invlpg(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 3021 | static int handle_invlpg(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
| 3016 | { | 3022 | { |
| 3017 | unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); | 3023 | unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
| @@ -3198,6 +3204,15 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu, | |||
| 3198 | [EXIT_REASON_HLT] = handle_halt, | 3204 | [EXIT_REASON_HLT] = handle_halt, |
| 3199 | [EXIT_REASON_INVLPG] = handle_invlpg, | 3205 | [EXIT_REASON_INVLPG] = handle_invlpg, |
| 3200 | [EXIT_REASON_VMCALL] = handle_vmcall, | 3206 | [EXIT_REASON_VMCALL] = handle_vmcall, |
| 3207 | [EXIT_REASON_VMCLEAR] = handle_vmx_insn, | ||
| 3208 | [EXIT_REASON_VMLAUNCH] = handle_vmx_insn, | ||
| 3209 | [EXIT_REASON_VMPTRLD] = handle_vmx_insn, | ||
| 3210 | [EXIT_REASON_VMPTRST] = handle_vmx_insn, | ||
| 3211 | [EXIT_REASON_VMREAD] = handle_vmx_insn, | ||
| 3212 | [EXIT_REASON_VMRESUME] = handle_vmx_insn, | ||
| 3213 | [EXIT_REASON_VMWRITE] = handle_vmx_insn, | ||
| 3214 | [EXIT_REASON_VMOFF] = handle_vmx_insn, | ||
| 3215 | [EXIT_REASON_VMON] = handle_vmx_insn, | ||
| 3201 | [EXIT_REASON_TPR_BELOW_THRESHOLD] = handle_tpr_below_threshold, | 3216 | [EXIT_REASON_TPR_BELOW_THRESHOLD] = handle_tpr_below_threshold, |
| 3202 | [EXIT_REASON_APIC_ACCESS] = handle_apic_access, | 3217 | [EXIT_REASON_APIC_ACCESS] = handle_apic_access, |
| 3203 | [EXIT_REASON_WBINVD] = handle_wbinvd, | 3218 | [EXIT_REASON_WBINVD] = handle_wbinvd, |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 249540f98513..fe5474aec41a 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -898,6 +898,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
| 898 | case MSR_VM_HSAVE_PA: | 898 | case MSR_VM_HSAVE_PA: |
| 899 | case MSR_P6_EVNTSEL0: | 899 | case MSR_P6_EVNTSEL0: |
| 900 | case MSR_P6_EVNTSEL1: | 900 | case MSR_P6_EVNTSEL1: |
| 901 | case MSR_K7_EVNTSEL0: | ||
| 901 | data = 0; | 902 | data = 0; |
| 902 | break; | 903 | break; |
| 903 | case MSR_MTRRcap: | 904 | case MSR_MTRRcap: |
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index c1b6c232e02b..616de4628d60 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c | |||
| @@ -1361,7 +1361,7 @@ static inline int writeback(struct x86_emulate_ctxt *ctxt, | |||
| 1361 | return 0; | 1361 | return 0; |
| 1362 | } | 1362 | } |
| 1363 | 1363 | ||
| 1364 | void toggle_interruptibility(struct x86_emulate_ctxt *ctxt, u32 mask) | 1364 | static void toggle_interruptibility(struct x86_emulate_ctxt *ctxt, u32 mask) |
| 1365 | { | 1365 | { |
| 1366 | u32 int_shadow = kvm_x86_ops->get_interrupt_shadow(ctxt->vcpu, mask); | 1366 | u32 int_shadow = kvm_x86_ops->get_interrupt_shadow(ctxt->vcpu, mask); |
| 1367 | /* | 1367 | /* |
diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c index f4568605d7d5..ff485d361182 100644 --- a/arch/x86/lib/delay.c +++ b/arch/x86/lib/delay.c | |||
| @@ -55,8 +55,10 @@ static void delay_tsc(unsigned long loops) | |||
| 55 | 55 | ||
| 56 | preempt_disable(); | 56 | preempt_disable(); |
| 57 | cpu = smp_processor_id(); | 57 | cpu = smp_processor_id(); |
| 58 | rdtsc_barrier(); | ||
| 58 | rdtscl(bclock); | 59 | rdtscl(bclock); |
| 59 | for (;;) { | 60 | for (;;) { |
| 61 | rdtsc_barrier(); | ||
| 60 | rdtscl(now); | 62 | rdtscl(now); |
| 61 | if ((now - bclock) >= loops) | 63 | if ((now - bclock) >= loops) |
| 62 | break; | 64 | break; |
| @@ -78,6 +80,7 @@ static void delay_tsc(unsigned long loops) | |||
| 78 | if (unlikely(cpu != smp_processor_id())) { | 80 | if (unlikely(cpu != smp_processor_id())) { |
| 79 | loops -= (now - bclock); | 81 | loops -= (now - bclock); |
| 80 | cpu = smp_processor_id(); | 82 | cpu = smp_processor_id(); |
| 83 | rdtsc_barrier(); | ||
| 81 | rdtscl(bclock); | 84 | rdtscl(bclock); |
| 82 | } | 85 | } |
| 83 | } | 86 | } |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index f53b57e4086f..47ce9a2ce5e7 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
| @@ -177,20 +177,6 @@ static int __meminit save_mr(struct map_range *mr, int nr_range, | |||
| 177 | return nr_range; | 177 | return nr_range; |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | #ifdef CONFIG_X86_64 | ||
| 181 | static void __init init_gbpages(void) | ||
| 182 | { | ||
| 183 | if (direct_gbpages && cpu_has_gbpages) | ||
| 184 | printk(KERN_INFO "Using GB pages for direct mapping\n"); | ||
| 185 | else | ||
| 186 | direct_gbpages = 0; | ||
| 187 | } | ||
| 188 | #else | ||
| 189 | static inline void init_gbpages(void) | ||
| 190 | { | ||
| 191 | } | ||
| 192 | #endif | ||
| 193 | |||
| 194 | /* | 180 | /* |
| 195 | * Setup the direct mapping of the physical memory at PAGE_OFFSET. | 181 | * Setup the direct mapping of the physical memory at PAGE_OFFSET. |
| 196 | * This runs before bootmem is initialized and gets pages directly from | 182 | * This runs before bootmem is initialized and gets pages directly from |
| @@ -210,9 +196,6 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, | |||
| 210 | 196 | ||
| 211 | printk(KERN_INFO "init_memory_mapping: %016lx-%016lx\n", start, end); | 197 | printk(KERN_INFO "init_memory_mapping: %016lx-%016lx\n", start, end); |
| 212 | 198 | ||
| 213 | if (!after_bootmem) | ||
| 214 | init_gbpages(); | ||
| 215 | |||
| 216 | #if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KMEMCHECK) | 199 | #if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KMEMCHECK) |
| 217 | /* | 200 | /* |
| 218 | * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages. | 201 | * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages. |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index c4378f4fd4a5..b177652251a4 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -598,6 +598,8 @@ void __init paging_init(void) | |||
| 598 | 598 | ||
| 599 | sparse_memory_present_with_active_regions(MAX_NUMNODES); | 599 | sparse_memory_present_with_active_regions(MAX_NUMNODES); |
| 600 | sparse_init(); | 600 | sparse_init(); |
| 601 | /* clear the default setting with node 0 */ | ||
| 602 | nodes_clear(node_states[N_NORMAL_MEMORY]); | ||
| 601 | free_area_init_nodes(max_zone_pfns); | 603 | free_area_init_nodes(max_zone_pfns); |
| 602 | } | 604 | } |
| 603 | 605 | ||
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 3cfe9ced8a4c..1b734d7a8966 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
| 12 | #include <linux/seq_file.h> | 12 | #include <linux/seq_file.h> |
| 13 | #include <linux/debugfs.h> | 13 | #include <linux/debugfs.h> |
| 14 | #include <linux/pfn.h> | ||
| 14 | 15 | ||
| 15 | #include <asm/e820.h> | 16 | #include <asm/e820.h> |
| 16 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
| @@ -681,8 +682,9 @@ static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias); | |||
| 681 | static int cpa_process_alias(struct cpa_data *cpa) | 682 | static int cpa_process_alias(struct cpa_data *cpa) |
| 682 | { | 683 | { |
| 683 | struct cpa_data alias_cpa; | 684 | struct cpa_data alias_cpa; |
| 684 | int ret = 0; | 685 | unsigned long laddr = (unsigned long)__va(cpa->pfn << PAGE_SHIFT); |
| 685 | unsigned long temp_cpa_vaddr, vaddr; | 686 | unsigned long vaddr, remapped; |
| 687 | int ret; | ||
| 686 | 688 | ||
| 687 | if (cpa->pfn >= max_pfn_mapped) | 689 | if (cpa->pfn >= max_pfn_mapped) |
| 688 | return 0; | 690 | return 0; |
| @@ -706,42 +708,55 @@ static int cpa_process_alias(struct cpa_data *cpa) | |||
| 706 | PAGE_OFFSET + (max_pfn_mapped << PAGE_SHIFT)))) { | 708 | PAGE_OFFSET + (max_pfn_mapped << PAGE_SHIFT)))) { |
| 707 | 709 | ||
| 708 | alias_cpa = *cpa; | 710 | alias_cpa = *cpa; |
| 709 | temp_cpa_vaddr = (unsigned long) __va(cpa->pfn << PAGE_SHIFT); | 711 | alias_cpa.vaddr = &laddr; |
| 710 | alias_cpa.vaddr = &temp_cpa_vaddr; | ||
| 711 | alias_cpa.flags &= ~(CPA_PAGES_ARRAY | CPA_ARRAY); | 712 | alias_cpa.flags &= ~(CPA_PAGES_ARRAY | CPA_ARRAY); |
| 712 | 713 | ||
| 713 | |||
| 714 | ret = __change_page_attr_set_clr(&alias_cpa, 0); | 714 | ret = __change_page_attr_set_clr(&alias_cpa, 0); |
| 715 | if (ret) | ||
| 716 | return ret; | ||
| 715 | } | 717 | } |
| 716 | 718 | ||
| 717 | #ifdef CONFIG_X86_64 | 719 | #ifdef CONFIG_X86_64 |
| 718 | if (ret) | ||
| 719 | return ret; | ||
| 720 | /* | 720 | /* |
| 721 | * No need to redo, when the primary call touched the high | 721 | * If the primary call didn't touch the high mapping already |
| 722 | * mapping already: | 722 | * and the physical address is inside the kernel map, we need |
| 723 | */ | ||
| 724 | if (within(vaddr, (unsigned long) _text, _brk_end)) | ||
| 725 | return 0; | ||
| 726 | |||
| 727 | /* | ||
| 728 | * If the physical address is inside the kernel map, we need | ||
| 729 | * to touch the high mapped kernel as well: | 723 | * to touch the high mapped kernel as well: |
| 730 | */ | 724 | */ |
| 731 | if (!within(cpa->pfn, highmap_start_pfn(), highmap_end_pfn())) | 725 | if (!within(vaddr, (unsigned long)_text, _brk_end) && |
| 732 | return 0; | 726 | within(cpa->pfn, highmap_start_pfn(), highmap_end_pfn())) { |
| 727 | unsigned long temp_cpa_vaddr = (cpa->pfn << PAGE_SHIFT) + | ||
| 728 | __START_KERNEL_map - phys_base; | ||
| 729 | alias_cpa = *cpa; | ||
| 730 | alias_cpa.vaddr = &temp_cpa_vaddr; | ||
| 731 | alias_cpa.flags &= ~(CPA_PAGES_ARRAY | CPA_ARRAY); | ||
| 733 | 732 | ||
| 734 | alias_cpa = *cpa; | 733 | /* |
| 735 | temp_cpa_vaddr = (cpa->pfn << PAGE_SHIFT) + __START_KERNEL_map - phys_base; | 734 | * The high mapping range is imprecise, so ignore the |
| 736 | alias_cpa.vaddr = &temp_cpa_vaddr; | 735 | * return value. |
| 737 | alias_cpa.flags &= ~(CPA_PAGES_ARRAY | CPA_ARRAY); | 736 | */ |
| 737 | __change_page_attr_set_clr(&alias_cpa, 0); | ||
| 738 | } | ||
| 739 | #endif | ||
| 738 | 740 | ||
| 739 | /* | 741 | /* |
| 740 | * The high mapping range is imprecise, so ignore the return value. | 742 | * If the PMD page was partially used for per-cpu remapping, |
| 743 | * the recycled area needs to be split and modified. Because | ||
| 744 | * the area is always proper subset of a PMD page | ||
| 745 | * cpa->numpages is guaranteed to be 1 for these areas, so | ||
| 746 | * there's no need to loop over and check for further remaps. | ||
| 741 | */ | 747 | */ |
| 742 | __change_page_attr_set_clr(&alias_cpa, 0); | 748 | remapped = (unsigned long)pcpu_lpage_remapped((void *)laddr); |
| 743 | #endif | 749 | if (remapped) { |
| 744 | return ret; | 750 | WARN_ON(cpa->numpages > 1); |
| 751 | alias_cpa = *cpa; | ||
| 752 | alias_cpa.vaddr = &remapped; | ||
| 753 | alias_cpa.flags &= ~(CPA_PAGES_ARRAY | CPA_ARRAY); | ||
| 754 | ret = __change_page_attr_set_clr(&alias_cpa, 0); | ||
| 755 | if (ret) | ||
| 756 | return ret; | ||
| 757 | } | ||
| 758 | |||
| 759 | return 0; | ||
| 745 | } | 760 | } |
| 746 | 761 | ||
| 747 | static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias) | 762 | static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias) |
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index d277ef1eea51..b3d20b9cac63 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c | |||
| @@ -244,7 +244,7 @@ static void __restore_processor_state(struct saved_context *ctxt) | |||
| 244 | do_fpu_end(); | 244 | do_fpu_end(); |
| 245 | mtrr_ap_init(); | 245 | mtrr_ap_init(); |
| 246 | 246 | ||
| 247 | #ifdef CONFIG_X86_32 | 247 | #ifdef CONFIG_X86_OLD_MCE |
| 248 | mcheck_init(&boot_cpu_data); | 248 | mcheck_init(&boot_cpu_data); |
| 249 | #endif | 249 | #endif |
| 250 | } | 250 | } |
