diff options
Diffstat (limited to 'arch')
43 files changed, 362 insertions, 181 deletions
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index d1273c1a1364..6d159cee5f2f 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
| @@ -915,15 +915,6 @@ sys_execve: | |||
| 915 | .end sys_execve | 915 | .end sys_execve |
| 916 | 916 | ||
| 917 | .align 4 | 917 | .align 4 |
| 918 | .globl osf_sigprocmask | ||
| 919 | .ent osf_sigprocmask | ||
| 920 | osf_sigprocmask: | ||
| 921 | .prologue 0 | ||
| 922 | mov $sp, $18 | ||
| 923 | jmp $31, sys_osf_sigprocmask | ||
| 924 | .end osf_sigprocmask | ||
| 925 | |||
| 926 | .align 4 | ||
| 927 | .globl alpha_ni_syscall | 918 | .globl alpha_ni_syscall |
| 928 | .ent alpha_ni_syscall | 919 | .ent alpha_ni_syscall |
| 929 | alpha_ni_syscall: | 920 | alpha_ni_syscall: |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 0f6b51ae865a..6f7feb5db271 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -41,46 +41,20 @@ static void do_signal(struct pt_regs *, struct switch_stack *, | |||
| 41 | /* | 41 | /* |
| 42 | * The OSF/1 sigprocmask calling sequence is different from the | 42 | * The OSF/1 sigprocmask calling sequence is different from the |
| 43 | * C sigprocmask() sequence.. | 43 | * C sigprocmask() sequence.. |
| 44 | * | ||
| 45 | * how: | ||
| 46 | * 1 - SIG_BLOCK | ||
| 47 | * 2 - SIG_UNBLOCK | ||
| 48 | * 3 - SIG_SETMASK | ||
| 49 | * | ||
| 50 | * We change the range to -1 .. 1 in order to let gcc easily | ||
| 51 | * use the conditional move instructions. | ||
| 52 | * | ||
| 53 | * Note that we don't need to acquire the kernel lock for SMP | ||
| 54 | * operation, as all of this is local to this thread. | ||
| 55 | */ | 44 | */ |
| 56 | SYSCALL_DEFINE3(osf_sigprocmask, int, how, unsigned long, newmask, | 45 | SYSCALL_DEFINE2(osf_sigprocmask, int, how, unsigned long, newmask) |
| 57 | struct pt_regs *, regs) | ||
| 58 | { | 46 | { |
| 59 | unsigned long oldmask = -EINVAL; | 47 | sigset_t oldmask; |
| 60 | 48 | sigset_t mask; | |
| 61 | if ((unsigned long)how-1 <= 2) { | 49 | unsigned long res; |
| 62 | long sign = how-2; /* -1 .. 1 */ | 50 | |
| 63 | unsigned long block, unblock; | 51 | siginitset(&mask, newmask & _BLOCKABLE); |
| 64 | 52 | res = sigprocmask(how, &mask, &oldmask); | |
| 65 | newmask &= _BLOCKABLE; | 53 | if (!res) { |
| 66 | spin_lock_irq(¤t->sighand->siglock); | 54 | force_successful_syscall_return(); |
| 67 | oldmask = current->blocked.sig[0]; | 55 | res = oldmask.sig[0]; |
| 68 | |||
| 69 | unblock = oldmask & ~newmask; | ||
| 70 | block = oldmask | newmask; | ||
| 71 | if (!sign) | ||
| 72 | block = unblock; | ||
| 73 | if (sign <= 0) | ||
| 74 | newmask = block; | ||
| 75 | if (_NSIG_WORDS > 1 && sign > 0) | ||
| 76 | sigemptyset(¤t->blocked); | ||
| 77 | current->blocked.sig[0] = newmask; | ||
| 78 | recalc_sigpending(); | ||
| 79 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 80 | |||
| 81 | regs->r0 = 0; /* special no error return */ | ||
| 82 | } | 56 | } |
| 83 | return oldmask; | 57 | return res; |
| 84 | } | 58 | } |
| 85 | 59 | ||
| 86 | SYSCALL_DEFINE3(osf_sigaction, int, sig, | 60 | SYSCALL_DEFINE3(osf_sigaction, int, sig, |
| @@ -94,9 +68,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig, | |||
| 94 | old_sigset_t mask; | 68 | old_sigset_t mask; |
| 95 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 69 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
| 96 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 70 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
| 97 | __get_user(new_ka.sa.sa_flags, &act->sa_flags)) | 71 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || |
| 72 | __get_user(mask, &act->sa_mask)) | ||
| 98 | return -EFAULT; | 73 | return -EFAULT; |
| 99 | __get_user(mask, &act->sa_mask); | ||
| 100 | siginitset(&new_ka.sa.sa_mask, mask); | 74 | siginitset(&new_ka.sa.sa_mask, mask); |
| 101 | new_ka.ka_restorer = NULL; | 75 | new_ka.ka_restorer = NULL; |
| 102 | } | 76 | } |
| @@ -106,9 +80,9 @@ SYSCALL_DEFINE3(osf_sigaction, int, sig, | |||
| 106 | if (!ret && oact) { | 80 | if (!ret && oact) { |
| 107 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 81 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
| 108 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 82 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
| 109 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags)) | 83 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || |
| 84 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 110 | return -EFAULT; | 85 | return -EFAULT; |
| 111 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 112 | } | 86 | } |
| 113 | 87 | ||
| 114 | return ret; | 88 | return ret; |
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index ce594ef533cc..a6a1de9db16f 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S | |||
| @@ -58,7 +58,7 @@ sys_call_table: | |||
| 58 | .quad sys_open /* 45 */ | 58 | .quad sys_open /* 45 */ |
| 59 | .quad alpha_ni_syscall | 59 | .quad alpha_ni_syscall |
| 60 | .quad sys_getxgid | 60 | .quad sys_getxgid |
| 61 | .quad osf_sigprocmask | 61 | .quad sys_osf_sigprocmask |
| 62 | .quad alpha_ni_syscall | 62 | .quad alpha_ni_syscall |
| 63 | .quad alpha_ni_syscall /* 50 */ | 63 | .quad alpha_ni_syscall /* 50 */ |
| 64 | .quad sys_acct | 64 | .quad sys_acct |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 553b7cf17bfb..88c97bc7a6f5 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -271,7 +271,6 @@ config ARCH_AT91 | |||
| 271 | bool "Atmel AT91" | 271 | bool "Atmel AT91" |
| 272 | select ARCH_REQUIRE_GPIOLIB | 272 | select ARCH_REQUIRE_GPIOLIB |
| 273 | select HAVE_CLK | 273 | select HAVE_CLK |
| 274 | select ARCH_USES_GETTIMEOFFSET | ||
| 275 | help | 274 | help |
| 276 | This enables support for systems based on the Atmel AT91RM9200, | 275 | This enables support for systems based on the Atmel AT91RM9200, |
| 277 | AT91SAM9 and AT91CAP9 processors. | 276 | AT91SAM9 and AT91CAP9 processors. |
| @@ -1051,6 +1050,32 @@ config ARM_ERRATA_460075 | |||
| 1051 | ACTLR register. Note that setting specific bits in the ACTLR register | 1050 | ACTLR register. Note that setting specific bits in the ACTLR register |
| 1052 | may not be available in non-secure mode. | 1051 | may not be available in non-secure mode. |
| 1053 | 1052 | ||
| 1053 | config ARM_ERRATA_742230 | ||
| 1054 | bool "ARM errata: DMB operation may be faulty" | ||
| 1055 | depends on CPU_V7 && SMP | ||
| 1056 | help | ||
| 1057 | This option enables the workaround for the 742230 Cortex-A9 | ||
| 1058 | (r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction | ||
| 1059 | between two write operations may not ensure the correct visibility | ||
| 1060 | ordering of the two writes. This workaround sets a specific bit in | ||
| 1061 | the diagnostic register of the Cortex-A9 which causes the DMB | ||
| 1062 | instruction to behave as a DSB, ensuring the correct behaviour of | ||
| 1063 | the two writes. | ||
| 1064 | |||
| 1065 | config ARM_ERRATA_742231 | ||
| 1066 | bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption" | ||
| 1067 | depends on CPU_V7 && SMP | ||
| 1068 | help | ||
| 1069 | This option enables the workaround for the 742231 Cortex-A9 | ||
| 1070 | (r2p0..r2p2) erratum. Under certain conditions, specific to the | ||
| 1071 | Cortex-A9 MPCore micro-architecture, two CPUs working in SMP mode, | ||
| 1072 | accessing some data located in the same cache line, may get corrupted | ||
| 1073 | data due to bad handling of the address hazard when the line gets | ||
| 1074 | replaced from one of the CPUs at the same time as another CPU is | ||
| 1075 | accessing it. This workaround sets specific bits in the diagnostic | ||
| 1076 | register of the Cortex-A9 which reduces the linefill issuing | ||
| 1077 | capabilities of the processor. | ||
| 1078 | |||
| 1054 | config PL310_ERRATA_588369 | 1079 | config PL310_ERRATA_588369 |
| 1055 | bool "Clean & Invalidate maintenance operations do not invalidate clean lines" | 1080 | bool "Clean & Invalidate maintenance operations do not invalidate clean lines" |
| 1056 | depends on CACHE_L2X0 && ARCH_OMAP4 | 1081 | depends on CACHE_L2X0 && ARCH_OMAP4 |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index b23f6bc46cfa..65a7c1c588a9 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile | |||
| @@ -116,5 +116,5 @@ CFLAGS_font.o := -Dstatic= | |||
| 116 | $(obj)/font.c: $(FONTC) | 116 | $(obj)/font.c: $(FONTC) |
| 117 | $(call cmd,shipped) | 117 | $(call cmd,shipped) |
| 118 | 118 | ||
| 119 | $(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile .config | 119 | $(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG) |
| 120 | @sed "$(SEDFLAGS)" < $< > $@ | 120 | @sed "$(SEDFLAGS)" < $< > $@ |
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index ab68cf1ef80f..e90b167ea848 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
| @@ -317,6 +317,10 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; } | |||
| 317 | #ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE | 317 | #ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE |
| 318 | #define pgprot_dmacoherent(prot) \ | 318 | #define pgprot_dmacoherent(prot) \ |
| 319 | __pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE) | 319 | __pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE) |
| 320 | #define __HAVE_PHYS_MEM_ACCESS_PROT | ||
| 321 | struct file; | ||
| 322 | extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | ||
| 323 | unsigned long size, pgprot_t vma_prot); | ||
| 320 | #else | 324 | #else |
| 321 | #define pgprot_dmacoherent(prot) \ | 325 | #define pgprot_dmacoherent(prot) \ |
| 322 | __pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_UNCACHED) | 326 | __pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_UNCACHED) |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 1b560825e1cf..7885722bdf4e 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -48,6 +48,8 @@ work_pending: | |||
| 48 | beq no_work_pending | 48 | beq no_work_pending |
| 49 | mov r0, sp @ 'regs' | 49 | mov r0, sp @ 'regs' |
| 50 | mov r2, why @ 'syscall' | 50 | mov r2, why @ 'syscall' |
| 51 | tst r1, #_TIF_SIGPENDING @ delivering a signal? | ||
| 52 | movne why, #0 @ prevent further restarts | ||
| 51 | bl do_notify_resume | 53 | bl do_notify_resume |
| 52 | b ret_slow_syscall @ Check work again | 54 | b ret_slow_syscall @ Check work again |
| 53 | 55 | ||
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 5e71ccd5e7d3..1276babf84d5 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
| @@ -426,7 +426,7 @@ static struct i2c_gpio_platform_data pdata_i2c0 = { | |||
| 426 | .sda_is_open_drain = 1, | 426 | .sda_is_open_drain = 1, |
| 427 | .scl_pin = AT91_PIN_PA21, | 427 | .scl_pin = AT91_PIN_PA21, |
| 428 | .scl_is_open_drain = 1, | 428 | .scl_is_open_drain = 1, |
| 429 | .udelay = 2, /* ~100 kHz */ | 429 | .udelay = 5, /* ~100 kHz */ |
| 430 | }; | 430 | }; |
| 431 | 431 | ||
| 432 | static struct platform_device at91sam9g45_twi0_device = { | 432 | static struct platform_device at91sam9g45_twi0_device = { |
| @@ -440,7 +440,7 @@ static struct i2c_gpio_platform_data pdata_i2c1 = { | |||
| 440 | .sda_is_open_drain = 1, | 440 | .sda_is_open_drain = 1, |
| 441 | .scl_pin = AT91_PIN_PB11, | 441 | .scl_pin = AT91_PIN_PB11, |
| 442 | .scl_is_open_drain = 1, | 442 | .scl_is_open_drain = 1, |
| 443 | .udelay = 2, /* ~100 kHz */ | 443 | .udelay = 5, /* ~100 kHz */ |
| 444 | }; | 444 | }; |
| 445 | 445 | ||
| 446 | static struct platform_device at91sam9g45_twi1_device = { | 446 | static struct platform_device at91sam9g45_twi1_device = { |
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index 3d996b659ff4..9be261beae7d 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c | |||
| @@ -769,8 +769,7 @@ static struct map_desc dm355_io_desc[] = { | |||
| 769 | .virtual = SRAM_VIRT, | 769 | .virtual = SRAM_VIRT, |
| 770 | .pfn = __phys_to_pfn(0x00010000), | 770 | .pfn = __phys_to_pfn(0x00010000), |
| 771 | .length = SZ_32K, | 771 | .length = SZ_32K, |
| 772 | /* MT_MEMORY_NONCACHED requires supersection alignment */ | 772 | .type = MT_MEMORY_NONCACHED, |
| 773 | .type = MT_DEVICE, | ||
| 774 | }, | 773 | }, |
| 775 | }; | 774 | }; |
| 776 | 775 | ||
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index 6b6f4c643709..7781e35daec3 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c | |||
| @@ -969,8 +969,7 @@ static struct map_desc dm365_io_desc[] = { | |||
| 969 | .virtual = SRAM_VIRT, | 969 | .virtual = SRAM_VIRT, |
| 970 | .pfn = __phys_to_pfn(0x00010000), | 970 | .pfn = __phys_to_pfn(0x00010000), |
| 971 | .length = SZ_32K, | 971 | .length = SZ_32K, |
| 972 | /* MT_MEMORY_NONCACHED requires supersection alignment */ | 972 | .type = MT_MEMORY_NONCACHED, |
| 973 | .type = MT_DEVICE, | ||
| 974 | }, | 973 | }, |
| 975 | }; | 974 | }; |
| 976 | 975 | ||
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 40fec315c99a..5e5b0a7831fb 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c | |||
| @@ -653,8 +653,7 @@ static struct map_desc dm644x_io_desc[] = { | |||
| 653 | .virtual = SRAM_VIRT, | 653 | .virtual = SRAM_VIRT, |
| 654 | .pfn = __phys_to_pfn(0x00008000), | 654 | .pfn = __phys_to_pfn(0x00008000), |
| 655 | .length = SZ_16K, | 655 | .length = SZ_16K, |
| 656 | /* MT_MEMORY_NONCACHED requires supersection alignment */ | 656 | .type = MT_MEMORY_NONCACHED, |
| 657 | .type = MT_DEVICE, | ||
| 658 | }, | 657 | }, |
| 659 | }; | 658 | }; |
| 660 | 659 | ||
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index e4a3df1872ac..26e8a9c7f50b 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c | |||
| @@ -737,8 +737,7 @@ static struct map_desc dm646x_io_desc[] = { | |||
| 737 | .virtual = SRAM_VIRT, | 737 | .virtual = SRAM_VIRT, |
| 738 | .pfn = __phys_to_pfn(0x00010000), | 738 | .pfn = __phys_to_pfn(0x00010000), |
| 739 | .length = SZ_32K, | 739 | .length = SZ_32K, |
| 740 | /* MT_MEMORY_NONCACHED requires supersection alignment */ | 740 | .type = MT_MEMORY_NONCACHED, |
| 741 | .type = MT_DEVICE, | ||
| 742 | }, | 741 | }, |
| 743 | }; | 742 | }; |
| 744 | 743 | ||
diff --git a/arch/arm/mach-dove/include/mach/io.h b/arch/arm/mach-dove/include/mach/io.h index 3b3e4721ce2e..eb4936ff90ad 100644 --- a/arch/arm/mach-dove/include/mach/io.h +++ b/arch/arm/mach-dove/include/mach/io.h | |||
| @@ -13,8 +13,8 @@ | |||
| 13 | 13 | ||
| 14 | #define IO_SPACE_LIMIT 0xffffffff | 14 | #define IO_SPACE_LIMIT 0xffffffff |
| 15 | 15 | ||
| 16 | #define __io(a) ((void __iomem *)(((a) - DOVE_PCIE0_IO_PHYS_BASE) +\ | 16 | #define __io(a) ((void __iomem *)(((a) - DOVE_PCIE0_IO_BUS_BASE) + \ |
| 17 | DOVE_PCIE0_IO_VIRT_BASE)) | 17 | DOVE_PCIE0_IO_VIRT_BASE)) |
| 18 | #define __mem_pci(a) (a) | 18 | #define __mem_pci(a) (a) |
| 19 | 19 | ||
| 20 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h index 93fc2ec95e76..6e924b398919 100644 --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h | |||
| @@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | #define KIRKWOOD_PCIE1_IO_PHYS_BASE 0xf3000000 | 39 | #define KIRKWOOD_PCIE1_IO_PHYS_BASE 0xf3000000 |
| 40 | #define KIRKWOOD_PCIE1_IO_VIRT_BASE 0xfef00000 | 40 | #define KIRKWOOD_PCIE1_IO_VIRT_BASE 0xfef00000 |
| 41 | #define KIRKWOOD_PCIE1_IO_BUS_BASE 0x00000000 | 41 | #define KIRKWOOD_PCIE1_IO_BUS_BASE 0x00100000 |
| 42 | #define KIRKWOOD_PCIE1_IO_SIZE SZ_1M | 42 | #define KIRKWOOD_PCIE1_IO_SIZE SZ_1M |
| 43 | 43 | ||
| 44 | #define KIRKWOOD_PCIE_IO_PHYS_BASE 0xf2000000 | 44 | #define KIRKWOOD_PCIE_IO_PHYS_BASE 0xf2000000 |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index 55e7f00836b7..513ad3102d7c 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
| @@ -117,7 +117,7 @@ static void __init pcie0_ioresources_init(struct pcie_port *pp) | |||
| 117 | * IORESOURCE_IO | 117 | * IORESOURCE_IO |
| 118 | */ | 118 | */ |
| 119 | pp->res[0].name = "PCIe 0 I/O Space"; | 119 | pp->res[0].name = "PCIe 0 I/O Space"; |
| 120 | pp->res[0].start = KIRKWOOD_PCIE_IO_PHYS_BASE; | 120 | pp->res[0].start = KIRKWOOD_PCIE_IO_BUS_BASE; |
| 121 | pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE_IO_SIZE - 1; | 121 | pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE_IO_SIZE - 1; |
| 122 | pp->res[0].flags = IORESOURCE_IO; | 122 | pp->res[0].flags = IORESOURCE_IO; |
| 123 | 123 | ||
| @@ -139,7 +139,7 @@ static void __init pcie1_ioresources_init(struct pcie_port *pp) | |||
| 139 | * IORESOURCE_IO | 139 | * IORESOURCE_IO |
| 140 | */ | 140 | */ |
| 141 | pp->res[0].name = "PCIe 1 I/O Space"; | 141 | pp->res[0].name = "PCIe 1 I/O Space"; |
| 142 | pp->res[0].start = KIRKWOOD_PCIE1_IO_PHYS_BASE; | 142 | pp->res[0].start = KIRKWOOD_PCIE1_IO_BUS_BASE; |
| 143 | pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE1_IO_SIZE - 1; | 143 | pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE1_IO_SIZE - 1; |
| 144 | pp->res[0].flags = IORESOURCE_IO; | 144 | pp->res[0].flags = IORESOURCE_IO; |
| 145 | 145 | ||
diff --git a/arch/arm/mach-mmp/include/mach/system.h b/arch/arm/mach-mmp/include/mach/system.h index 4f5b0e0ce6cf..1a8a25edb1b4 100644 --- a/arch/arm/mach-mmp/include/mach/system.h +++ b/arch/arm/mach-mmp/include/mach/system.h | |||
| @@ -9,6 +9,8 @@ | |||
| 9 | #ifndef __ASM_MACH_SYSTEM_H | 9 | #ifndef __ASM_MACH_SYSTEM_H |
| 10 | #define __ASM_MACH_SYSTEM_H | 10 | #define __ASM_MACH_SYSTEM_H |
| 11 | 11 | ||
| 12 | #include <mach/cputype.h> | ||
| 13 | |||
| 12 | static inline void arch_idle(void) | 14 | static inline void arch_idle(void) |
| 13 | { | 15 | { |
| 14 | cpu_do_idle(); | 16 | cpu_do_idle(); |
| @@ -16,6 +18,9 @@ static inline void arch_idle(void) | |||
| 16 | 18 | ||
| 17 | static inline void arch_reset(char mode, const char *cmd) | 19 | static inline void arch_reset(char mode, const char *cmd) |
| 18 | { | 20 | { |
| 19 | cpu_reset(0); | 21 | if (cpu_is_pxa168()) |
| 22 | cpu_reset(0xffff0000); | ||
| 23 | else | ||
| 24 | cpu_reset(0); | ||
| 20 | } | 25 | } |
| 21 | #endif /* __ASM_MACH_SYSTEM_H */ | 26 | #endif /* __ASM_MACH_SYSTEM_H */ |
diff --git a/arch/arm/mach-pxa/cpufreq-pxa2xx.c b/arch/arm/mach-pxa/cpufreq-pxa2xx.c index 50d5939a78f1..58093d9e07be 100644 --- a/arch/arm/mach-pxa/cpufreq-pxa2xx.c +++ b/arch/arm/mach-pxa/cpufreq-pxa2xx.c | |||
| @@ -312,8 +312,7 @@ static int pxa_set_target(struct cpufreq_policy *policy, | |||
| 312 | freqs.cpu = policy->cpu; | 312 | freqs.cpu = policy->cpu; |
| 313 | 313 | ||
| 314 | if (freq_debug) | 314 | if (freq_debug) |
| 315 | pr_debug(KERN_INFO "Changing CPU frequency to %d Mhz, " | 315 | pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", |
| 316 | "(SDRAM %d Mhz)\n", | ||
| 317 | freqs.new / 1000, (pxa_freq_settings[idx].div2) ? | 316 | freqs.new / 1000, (pxa_freq_settings[idx].div2) ? |
| 318 | (new_freq_mem / 2000) : (new_freq_mem / 1000)); | 317 | (new_freq_mem / 2000) : (new_freq_mem / 1000)); |
| 319 | 318 | ||
diff --git a/arch/arm/mach-pxa/include/mach/hardware.h b/arch/arm/mach-pxa/include/mach/hardware.h index 428cc7bda9a4..814f1458a06a 100644 --- a/arch/arm/mach-pxa/include/mach/hardware.h +++ b/arch/arm/mach-pxa/include/mach/hardware.h | |||
| @@ -264,23 +264,35 @@ | |||
| 264 | * <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x | 264 | * <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x |
| 265 | * == 0x3 for pxa300/pxa310/pxa320 | 265 | * == 0x3 for pxa300/pxa310/pxa320 |
| 266 | */ | 266 | */ |
| 267 | #if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x) | ||
| 267 | #define __cpu_is_pxa2xx(id) \ | 268 | #define __cpu_is_pxa2xx(id) \ |
| 268 | ({ \ | 269 | ({ \ |
| 269 | unsigned int _id = (id) >> 13 & 0x7; \ | 270 | unsigned int _id = (id) >> 13 & 0x7; \ |
| 270 | _id <= 0x2; \ | 271 | _id <= 0x2; \ |
| 271 | }) | 272 | }) |
| 273 | #else | ||
| 274 | #define __cpu_is_pxa2xx(id) (0) | ||
| 275 | #endif | ||
| 272 | 276 | ||
| 277 | #ifdef CONFIG_PXA3xx | ||
| 273 | #define __cpu_is_pxa3xx(id) \ | 278 | #define __cpu_is_pxa3xx(id) \ |
| 274 | ({ \ | 279 | ({ \ |
| 275 | unsigned int _id = (id) >> 13 & 0x7; \ | 280 | unsigned int _id = (id) >> 13 & 0x7; \ |
| 276 | _id == 0x3; \ | 281 | _id == 0x3; \ |
| 277 | }) | 282 | }) |
| 283 | #else | ||
| 284 | #define __cpu_is_pxa3xx(id) (0) | ||
| 285 | #endif | ||
| 278 | 286 | ||
| 287 | #if defined(CONFIG_CPU_PXA930) || defined(CONFIG_CPU_PXA935) | ||
| 279 | #define __cpu_is_pxa93x(id) \ | 288 | #define __cpu_is_pxa93x(id) \ |
| 280 | ({ \ | 289 | ({ \ |
| 281 | unsigned int _id = (id) >> 4 & 0xfff; \ | 290 | unsigned int _id = (id) >> 4 & 0xfff; \ |
| 282 | _id == 0x683 || _id == 0x693; \ | 291 | _id == 0x683 || _id == 0x693; \ |
| 283 | }) | 292 | }) |
| 293 | #else | ||
| 294 | #define __cpu_is_pxa93x(id) (0) | ||
| 295 | #endif | ||
| 284 | 296 | ||
| 285 | #define cpu_is_pxa2xx() \ | 297 | #define cpu_is_pxa2xx() \ |
| 286 | ({ \ | 298 | ({ \ |
diff --git a/arch/arm/mach-pxa/palm27x.c b/arch/arm/mach-pxa/palm27x.c index 77ad6d34ab5b..405b92a29793 100644 --- a/arch/arm/mach-pxa/palm27x.c +++ b/arch/arm/mach-pxa/palm27x.c | |||
| @@ -469,9 +469,13 @@ static struct i2c_board_info __initdata palm27x_pi2c_board_info[] = { | |||
| 469 | }, | 469 | }, |
| 470 | }; | 470 | }; |
| 471 | 471 | ||
| 472 | static struct i2c_pxa_platform_data palm27x_i2c_power_info = { | ||
| 473 | .use_pio = 1, | ||
| 474 | }; | ||
| 475 | |||
| 472 | void __init palm27x_pmic_init(void) | 476 | void __init palm27x_pmic_init(void) |
| 473 | { | 477 | { |
| 474 | i2c_register_board_info(1, ARRAY_AND_SIZE(palm27x_pi2c_board_info)); | 478 | i2c_register_board_info(1, ARRAY_AND_SIZE(palm27x_pi2c_board_info)); |
| 475 | pxa27x_set_i2c_power_info(NULL); | 479 | pxa27x_set_i2c_power_info(&palm27x_i2c_power_info); |
| 476 | } | 480 | } |
| 477 | #endif | 481 | #endif |
diff --git a/arch/arm/mach-pxa/vpac270.c b/arch/arm/mach-pxa/vpac270.c index c9b747cedea8..37d6173bbb66 100644 --- a/arch/arm/mach-pxa/vpac270.c +++ b/arch/arm/mach-pxa/vpac270.c | |||
| @@ -240,6 +240,7 @@ static void __init vpac270_onenand_init(void) {} | |||
| 240 | #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) | 240 | #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) |
| 241 | static struct pxamci_platform_data vpac270_mci_platform_data = { | 241 | static struct pxamci_platform_data vpac270_mci_platform_data = { |
| 242 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, | 242 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, |
| 243 | .gpio_power = -1, | ||
| 243 | .gpio_card_detect = GPIO53_VPAC270_SD_DETECT_N, | 244 | .gpio_card_detect = GPIO53_VPAC270_SD_DETECT_N, |
| 244 | .gpio_card_ro = GPIO52_VPAC270_SD_READONLY, | 245 | .gpio_card_ro = GPIO52_VPAC270_SD_READONLY, |
| 245 | .detect_delay_ms = 200, | 246 | .detect_delay_ms = 200, |
diff --git a/arch/arm/mach-u300/include/mach/gpio.h b/arch/arm/mach-u300/include/mach/gpio.h index 7b1fc984abb6..d5a71abcbaea 100644 --- a/arch/arm/mach-u300/include/mach/gpio.h +++ b/arch/arm/mach-u300/include/mach/gpio.h | |||
| @@ -273,6 +273,9 @@ extern void gpio_pullup(unsigned gpio, int value); | |||
| 273 | extern int gpio_get_value(unsigned gpio); | 273 | extern int gpio_get_value(unsigned gpio); |
| 274 | extern void gpio_set_value(unsigned gpio, int value); | 274 | extern void gpio_set_value(unsigned gpio, int value); |
| 275 | 275 | ||
| 276 | #define gpio_get_value_cansleep gpio_get_value | ||
| 277 | #define gpio_set_value_cansleep gpio_set_value | ||
| 278 | |||
| 276 | /* wrappers to sleep-enable the previous two functions */ | 279 | /* wrappers to sleep-enable the previous two functions */ |
| 277 | static inline unsigned gpio_to_irq(unsigned gpio) | 280 | static inline unsigned gpio_to_irq(unsigned gpio) |
| 278 | { | 281 | { |
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index 577df6cccb08..efb127022d42 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c | |||
| @@ -227,7 +227,13 @@ static void ct_ca9x4_init(void) | |||
| 227 | int i; | 227 | int i; |
| 228 | 228 | ||
| 229 | #ifdef CONFIG_CACHE_L2X0 | 229 | #ifdef CONFIG_CACHE_L2X0 |
| 230 | l2x0_init(MMIO_P2V(CT_CA9X4_L2CC), 0x00000000, 0xfe0fffff); | 230 | void __iomem *l2x0_base = MMIO_P2V(CT_CA9X4_L2CC); |
| 231 | |||
| 232 | /* set RAM latencies to 1 cycle for this core tile. */ | ||
| 233 | writel(0, l2x0_base + L2X0_TAG_LATENCY_CTRL); | ||
| 234 | writel(0, l2x0_base + L2X0_DATA_LATENCY_CTRL); | ||
| 235 | |||
| 236 | l2x0_init(l2x0_base, 0x00400000, 0xfe0fffff); | ||
| 231 | #endif | 237 | #endif |
| 232 | 238 | ||
| 233 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 239 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index d073b64ae87e..724ba3bce72c 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
| @@ -885,8 +885,23 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
| 885 | 885 | ||
| 886 | if (ai_usermode & UM_SIGNAL) | 886 | if (ai_usermode & UM_SIGNAL) |
| 887 | force_sig(SIGBUS, current); | 887 | force_sig(SIGBUS, current); |
| 888 | else | 888 | else { |
| 889 | set_cr(cr_no_alignment); | 889 | /* |
| 890 | * We're about to disable the alignment trap and return to | ||
| 891 | * user space. But if an interrupt occurs before actually | ||
| 892 | * reaching user space, then the IRQ vector entry code will | ||
| 893 | * notice that we were still in kernel space and therefore | ||
| 894 | * the alignment trap won't be re-enabled in that case as it | ||
| 895 | * is presumed to be always on from kernel space. | ||
| 896 | * Let's prevent that race by disabling interrupts here (they | ||
| 897 | * are disabled on the way back to user space anyway in | ||
| 898 | * entry-common.S) and disable the alignment trap only if | ||
| 899 | * there is no work pending for this thread. | ||
| 900 | */ | ||
| 901 | raw_local_irq_disable(); | ||
| 902 | if (!(current_thread_info()->flags & _TIF_WORK_MASK)) | ||
| 903 | set_cr(cr_no_alignment); | ||
| 904 | } | ||
| 890 | 905 | ||
| 891 | return 0; | 906 | return 0; |
| 892 | } | 907 | } |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 6e1c4f6a2b3f..6a3a2d0cd6db 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/nodemask.h> | 15 | #include <linux/nodemask.h> |
| 16 | #include <linux/memblock.h> | 16 | #include <linux/memblock.h> |
| 17 | #include <linux/sort.h> | 17 | #include <linux/sort.h> |
| 18 | #include <linux/fs.h> | ||
| 18 | 19 | ||
| 19 | #include <asm/cputype.h> | 20 | #include <asm/cputype.h> |
| 20 | #include <asm/sections.h> | 21 | #include <asm/sections.h> |
| @@ -246,6 +247,9 @@ static struct mem_type mem_types[] = { | |||
| 246 | .domain = DOMAIN_USER, | 247 | .domain = DOMAIN_USER, |
| 247 | }, | 248 | }, |
| 248 | [MT_MEMORY] = { | 249 | [MT_MEMORY] = { |
| 250 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | | ||
| 251 | L_PTE_USER | L_PTE_EXEC, | ||
| 252 | .prot_l1 = PMD_TYPE_TABLE, | ||
| 249 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, | 253 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, |
| 250 | .domain = DOMAIN_KERNEL, | 254 | .domain = DOMAIN_KERNEL, |
| 251 | }, | 255 | }, |
| @@ -254,6 +258,9 @@ static struct mem_type mem_types[] = { | |||
| 254 | .domain = DOMAIN_KERNEL, | 258 | .domain = DOMAIN_KERNEL, |
| 255 | }, | 259 | }, |
| 256 | [MT_MEMORY_NONCACHED] = { | 260 | [MT_MEMORY_NONCACHED] = { |
| 261 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | | ||
| 262 | L_PTE_USER | L_PTE_EXEC | L_PTE_MT_BUFFERABLE, | ||
| 263 | .prot_l1 = PMD_TYPE_TABLE, | ||
| 257 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, | 264 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, |
| 258 | .domain = DOMAIN_KERNEL, | 265 | .domain = DOMAIN_KERNEL, |
| 259 | }, | 266 | }, |
| @@ -411,9 +418,12 @@ static void __init build_mem_type_table(void) | |||
| 411 | * Enable CPU-specific coherency if supported. | 418 | * Enable CPU-specific coherency if supported. |
| 412 | * (Only available on XSC3 at the moment.) | 419 | * (Only available on XSC3 at the moment.) |
| 413 | */ | 420 | */ |
| 414 | if (arch_is_coherent() && cpu_is_xsc3()) | 421 | if (arch_is_coherent() && cpu_is_xsc3()) { |
| 415 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; | 422 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; |
| 416 | 423 | mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED; | |
| 424 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S; | ||
| 425 | mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED; | ||
| 426 | } | ||
| 417 | /* | 427 | /* |
| 418 | * ARMv6 and above have extended page tables. | 428 | * ARMv6 and above have extended page tables. |
| 419 | */ | 429 | */ |
| @@ -438,7 +448,9 @@ static void __init build_mem_type_table(void) | |||
| 438 | mem_types[MT_DEVICE_CACHED].prot_sect |= PMD_SECT_S; | 448 | mem_types[MT_DEVICE_CACHED].prot_sect |= PMD_SECT_S; |
| 439 | mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED; | 449 | mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED; |
| 440 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; | 450 | mem_types[MT_MEMORY].prot_sect |= PMD_SECT_S; |
| 451 | mem_types[MT_MEMORY].prot_pte |= L_PTE_SHARED; | ||
| 441 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S; | 452 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_S; |
| 453 | mem_types[MT_MEMORY_NONCACHED].prot_pte |= L_PTE_SHARED; | ||
| 442 | #endif | 454 | #endif |
| 443 | } | 455 | } |
| 444 | 456 | ||
| @@ -475,6 +487,8 @@ static void __init build_mem_type_table(void) | |||
| 475 | mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask; | 487 | mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask; |
| 476 | mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask; | 488 | mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask; |
| 477 | mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd; | 489 | mem_types[MT_MEMORY].prot_sect |= ecc_mask | cp->pmd; |
| 490 | mem_types[MT_MEMORY].prot_pte |= kern_pgprot; | ||
| 491 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= ecc_mask; | ||
| 478 | mem_types[MT_ROM].prot_sect |= cp->pmd; | 492 | mem_types[MT_ROM].prot_sect |= cp->pmd; |
| 479 | 493 | ||
| 480 | switch (cp->pmd) { | 494 | switch (cp->pmd) { |
| @@ -498,6 +512,19 @@ static void __init build_mem_type_table(void) | |||
| 498 | } | 512 | } |
| 499 | } | 513 | } |
| 500 | 514 | ||
| 515 | #ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE | ||
| 516 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | ||
| 517 | unsigned long size, pgprot_t vma_prot) | ||
| 518 | { | ||
| 519 | if (!pfn_valid(pfn)) | ||
| 520 | return pgprot_noncached(vma_prot); | ||
| 521 | else if (file->f_flags & O_SYNC) | ||
| 522 | return pgprot_writecombine(vma_prot); | ||
| 523 | return vma_prot; | ||
| 524 | } | ||
| 525 | EXPORT_SYMBOL(phys_mem_access_prot); | ||
| 526 | #endif | ||
| 527 | |||
| 501 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) | 528 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) |
| 502 | 529 | ||
| 503 | static void __init *early_alloc(unsigned long sz) | 530 | static void __init *early_alloc(unsigned long sz) |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 6a8506d99ee9..7563ff0141bd 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -186,13 +186,14 @@ cpu_v7_name: | |||
| 186 | * It is assumed that: | 186 | * It is assumed that: |
| 187 | * - cache type register is implemented | 187 | * - cache type register is implemented |
| 188 | */ | 188 | */ |
| 189 | __v7_setup: | 189 | __v7_ca9mp_setup: |
| 190 | #ifdef CONFIG_SMP | 190 | #ifdef CONFIG_SMP |
| 191 | mrc p15, 0, r0, c1, c0, 1 | 191 | mrc p15, 0, r0, c1, c0, 1 |
| 192 | tst r0, #(1 << 6) @ SMP/nAMP mode enabled? | 192 | tst r0, #(1 << 6) @ SMP/nAMP mode enabled? |
| 193 | orreq r0, r0, #(1 << 6) | (1 << 0) @ Enable SMP/nAMP mode and | 193 | orreq r0, r0, #(1 << 6) | (1 << 0) @ Enable SMP/nAMP mode and |
| 194 | mcreq p15, 0, r0, c1, c0, 1 @ TLB ops broadcasting | 194 | mcreq p15, 0, r0, c1, c0, 1 @ TLB ops broadcasting |
| 195 | #endif | 195 | #endif |
| 196 | __v7_setup: | ||
| 196 | adr r12, __v7_setup_stack @ the local stack | 197 | adr r12, __v7_setup_stack @ the local stack |
| 197 | stmia r12, {r0-r5, r7, r9, r11, lr} | 198 | stmia r12, {r0-r5, r7, r9, r11, lr} |
| 198 | bl v7_flush_dcache_all | 199 | bl v7_flush_dcache_all |
| @@ -201,11 +202,16 @@ __v7_setup: | |||
| 201 | mrc p15, 0, r0, c0, c0, 0 @ read main ID register | 202 | mrc p15, 0, r0, c0, c0, 0 @ read main ID register |
| 202 | and r10, r0, #0xff000000 @ ARM? | 203 | and r10, r0, #0xff000000 @ ARM? |
| 203 | teq r10, #0x41000000 | 204 | teq r10, #0x41000000 |
| 204 | bne 2f | 205 | bne 3f |
| 205 | and r5, r0, #0x00f00000 @ variant | 206 | and r5, r0, #0x00f00000 @ variant |
| 206 | and r6, r0, #0x0000000f @ revision | 207 | and r6, r0, #0x0000000f @ revision |
| 207 | orr r0, r6, r5, lsr #20-4 @ combine variant and revision | 208 | orr r6, r6, r5, lsr #20-4 @ combine variant and revision |
| 209 | ubfx r0, r0, #4, #12 @ primary part number | ||
| 208 | 210 | ||
| 211 | /* Cortex-A8 Errata */ | ||
| 212 | ldr r10, =0x00000c08 @ Cortex-A8 primary part number | ||
| 213 | teq r0, r10 | ||
| 214 | bne 2f | ||
| 209 | #ifdef CONFIG_ARM_ERRATA_430973 | 215 | #ifdef CONFIG_ARM_ERRATA_430973 |
| 210 | teq r5, #0x00100000 @ only present in r1p* | 216 | teq r5, #0x00100000 @ only present in r1p* |
| 211 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register | 217 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register |
| @@ -213,21 +219,42 @@ __v7_setup: | |||
| 213 | mcreq p15, 0, r10, c1, c0, 1 @ write aux control register | 219 | mcreq p15, 0, r10, c1, c0, 1 @ write aux control register |
| 214 | #endif | 220 | #endif |
| 215 | #ifdef CONFIG_ARM_ERRATA_458693 | 221 | #ifdef CONFIG_ARM_ERRATA_458693 |
| 216 | teq r0, #0x20 @ only present in r2p0 | 222 | teq r6, #0x20 @ only present in r2p0 |
| 217 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register | 223 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register |
| 218 | orreq r10, r10, #(1 << 5) @ set L1NEON to 1 | 224 | orreq r10, r10, #(1 << 5) @ set L1NEON to 1 |
| 219 | orreq r10, r10, #(1 << 9) @ set PLDNOP to 1 | 225 | orreq r10, r10, #(1 << 9) @ set PLDNOP to 1 |
| 220 | mcreq p15, 0, r10, c1, c0, 1 @ write aux control register | 226 | mcreq p15, 0, r10, c1, c0, 1 @ write aux control register |
| 221 | #endif | 227 | #endif |
| 222 | #ifdef CONFIG_ARM_ERRATA_460075 | 228 | #ifdef CONFIG_ARM_ERRATA_460075 |
| 223 | teq r0, #0x20 @ only present in r2p0 | 229 | teq r6, #0x20 @ only present in r2p0 |
| 224 | mrceq p15, 1, r10, c9, c0, 2 @ read L2 cache aux ctrl register | 230 | mrceq p15, 1, r10, c9, c0, 2 @ read L2 cache aux ctrl register |
| 225 | tsteq r10, #1 << 22 | 231 | tsteq r10, #1 << 22 |
| 226 | orreq r10, r10, #(1 << 22) @ set the Write Allocate disable bit | 232 | orreq r10, r10, #(1 << 22) @ set the Write Allocate disable bit |
| 227 | mcreq p15, 1, r10, c9, c0, 2 @ write the L2 cache aux ctrl register | 233 | mcreq p15, 1, r10, c9, c0, 2 @ write the L2 cache aux ctrl register |
| 228 | #endif | 234 | #endif |
| 235 | b 3f | ||
| 236 | |||
| 237 | /* Cortex-A9 Errata */ | ||
| 238 | 2: ldr r10, =0x00000c09 @ Cortex-A9 primary part number | ||
| 239 | teq r0, r10 | ||
| 240 | bne 3f | ||
| 241 | #ifdef CONFIG_ARM_ERRATA_742230 | ||
| 242 | cmp r6, #0x22 @ only present up to r2p2 | ||
| 243 | mrcle p15, 0, r10, c15, c0, 1 @ read diagnostic register | ||
| 244 | orrle r10, r10, #1 << 4 @ set bit #4 | ||
| 245 | mcrle p15, 0, r10, c15, c0, 1 @ write diagnostic register | ||
| 246 | #endif | ||
| 247 | #ifdef CONFIG_ARM_ERRATA_742231 | ||
| 248 | teq r6, #0x20 @ present in r2p0 | ||
| 249 | teqne r6, #0x21 @ present in r2p1 | ||
| 250 | teqne r6, #0x22 @ present in r2p2 | ||
| 251 | mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register | ||
| 252 | orreq r10, r10, #1 << 12 @ set bit #12 | ||
| 253 | orreq r10, r10, #1 << 22 @ set bit #22 | ||
| 254 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register | ||
| 255 | #endif | ||
| 229 | 256 | ||
| 230 | 2: mov r10, #0 | 257 | 3: mov r10, #0 |
| 231 | #ifdef HARVARD_CACHE | 258 | #ifdef HARVARD_CACHE |
| 232 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate | 259 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate |
| 233 | #endif | 260 | #endif |
| @@ -323,6 +350,29 @@ cpu_elf_name: | |||
| 323 | 350 | ||
| 324 | .section ".proc.info.init", #alloc, #execinstr | 351 | .section ".proc.info.init", #alloc, #execinstr |
| 325 | 352 | ||
| 353 | .type __v7_ca9mp_proc_info, #object | ||
| 354 | __v7_ca9mp_proc_info: | ||
| 355 | .long 0x410fc090 @ Required ID value | ||
| 356 | .long 0xff0ffff0 @ Mask for ID | ||
| 357 | .long PMD_TYPE_SECT | \ | ||
| 358 | PMD_SECT_AP_WRITE | \ | ||
| 359 | PMD_SECT_AP_READ | \ | ||
| 360 | PMD_FLAGS | ||
| 361 | .long PMD_TYPE_SECT | \ | ||
| 362 | PMD_SECT_XN | \ | ||
| 363 | PMD_SECT_AP_WRITE | \ | ||
| 364 | PMD_SECT_AP_READ | ||
| 365 | b __v7_ca9mp_setup | ||
| 366 | .long cpu_arch_name | ||
| 367 | .long cpu_elf_name | ||
| 368 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP | ||
| 369 | .long cpu_v7_name | ||
| 370 | .long v7_processor_functions | ||
| 371 | .long v7wbi_tlb_fns | ||
| 372 | .long v6_user_fns | ||
| 373 | .long v7_cache_fns | ||
| 374 | .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info | ||
| 375 | |||
| 326 | /* | 376 | /* |
| 327 | * Match any ARMv7 processor core. | 377 | * Match any ARMv7 processor core. |
| 328 | */ | 378 | */ |
diff --git a/arch/arm/plat-nomadik/timer.c b/arch/arm/plat-nomadik/timer.c index ea3ca86c5283..aedf9c1d645e 100644 --- a/arch/arm/plat-nomadik/timer.c +++ b/arch/arm/plat-nomadik/timer.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-nomadik/timer.c | 2 | * linux/arch/arm/plat-nomadik/timer.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 STMicroelectronics | 4 | * Copyright (C) 2008 STMicroelectronics |
| 5 | * Copyright (C) 2010 Alessandro Rubini | 5 | * Copyright (C) 2010 Alessandro Rubini |
| @@ -75,7 +75,7 @@ static void nmdk_clkevt_mode(enum clock_event_mode mode, | |||
| 75 | cr = readl(mtu_base + MTU_CR(1)); | 75 | cr = readl(mtu_base + MTU_CR(1)); |
| 76 | writel(0, mtu_base + MTU_LR(1)); | 76 | writel(0, mtu_base + MTU_LR(1)); |
| 77 | writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(1)); | 77 | writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(1)); |
| 78 | writel(0x2, mtu_base + MTU_IMSC); | 78 | writel(1 << 1, mtu_base + MTU_IMSC); |
| 79 | break; | 79 | break; |
| 80 | case CLOCK_EVT_MODE_SHUTDOWN: | 80 | case CLOCK_EVT_MODE_SHUTDOWN: |
| 81 | case CLOCK_EVT_MODE_UNUSED: | 81 | case CLOCK_EVT_MODE_UNUSED: |
| @@ -131,25 +131,23 @@ void __init nmdk_timer_init(void) | |||
| 131 | { | 131 | { |
| 132 | unsigned long rate; | 132 | unsigned long rate; |
| 133 | struct clk *clk0; | 133 | struct clk *clk0; |
| 134 | struct clk *clk1; | 134 | u32 cr = MTU_CRn_32BITS; |
| 135 | u32 cr; | ||
| 136 | 135 | ||
| 137 | clk0 = clk_get_sys("mtu0", NULL); | 136 | clk0 = clk_get_sys("mtu0", NULL); |
| 138 | BUG_ON(IS_ERR(clk0)); | 137 | BUG_ON(IS_ERR(clk0)); |
| 139 | 138 | ||
| 140 | clk1 = clk_get_sys("mtu1", NULL); | ||
| 141 | BUG_ON(IS_ERR(clk1)); | ||
| 142 | |||
| 143 | clk_enable(clk0); | 139 | clk_enable(clk0); |
| 144 | clk_enable(clk1); | ||
| 145 | 140 | ||
| 146 | /* | 141 | /* |
| 147 | * Tick rate is 2.4MHz for Nomadik and 110MHz for ux500: | 142 | * Tick rate is 2.4MHz for Nomadik and 2.4Mhz, 100MHz or 133 MHz |
| 148 | * use a divide-by-16 counter if it's more than 16MHz | 143 | * for ux500. |
| 144 | * Use a divide-by-16 counter if the tick rate is more than 32MHz. | ||
| 145 | * At 32 MHz, the timer (with 32 bit counter) can be programmed | ||
| 146 | * to wake-up at a max 127s a head in time. Dividing a 2.4 MHz timer | ||
| 147 | * with 16 gives too low timer resolution. | ||
| 149 | */ | 148 | */ |
| 150 | cr = MTU_CRn_32BITS;; | ||
| 151 | rate = clk_get_rate(clk0); | 149 | rate = clk_get_rate(clk0); |
| 152 | if (rate > 16 << 20) { | 150 | if (rate > 32000000) { |
| 153 | rate /= 16; | 151 | rate /= 16; |
| 154 | cr |= MTU_CRn_PRESCALE_16; | 152 | cr |= MTU_CRn_PRESCALE_16; |
| 155 | } else { | 153 | } else { |
| @@ -170,15 +168,8 @@ void __init nmdk_timer_init(void) | |||
| 170 | pr_err("timer: failed to initialize clock source %s\n", | 168 | pr_err("timer: failed to initialize clock source %s\n", |
| 171 | nmdk_clksrc.name); | 169 | nmdk_clksrc.name); |
| 172 | 170 | ||
| 173 | /* Timer 1 is used for events, fix according to rate */ | 171 | /* Timer 1 is used for events */ |
| 174 | cr = MTU_CRn_32BITS; | 172 | |
| 175 | rate = clk_get_rate(clk1); | ||
| 176 | if (rate > 16 << 20) { | ||
| 177 | rate /= 16; | ||
| 178 | cr |= MTU_CRn_PRESCALE_16; | ||
| 179 | } else { | ||
| 180 | cr |= MTU_CRn_PRESCALE_1; | ||
| 181 | } | ||
| 182 | clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE); | 173 | clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE); |
| 183 | 174 | ||
| 184 | writel(cr | MTU_CRn_ONESHOT, mtu_base + MTU_CR(1)); /* off, currently */ | 175 | writel(cr | MTU_CRn_ONESHOT, mtu_base + MTU_CR(1)); /* off, currently */ |
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index e39a417a368d..a92cb499313f 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig | |||
| @@ -33,7 +33,7 @@ config OMAP_DEBUG_DEVICES | |||
| 33 | config OMAP_DEBUG_LEDS | 33 | config OMAP_DEBUG_LEDS |
| 34 | bool | 34 | bool |
| 35 | depends on OMAP_DEBUG_DEVICES | 35 | depends on OMAP_DEBUG_DEVICES |
| 36 | default y if LEDS | 36 | default y if LEDS_CLASS |
| 37 | 37 | ||
| 38 | config OMAP_RESET_CLOCKS | 38 | config OMAP_RESET_CLOCKS |
| 39 | bool "Reset unused clocks during boot" | 39 | bool "Reset unused clocks during boot" |
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index e31496e35b0f..0c8612fd8312 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
| @@ -156,7 +156,7 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id) | |||
| 156 | /* Writing zero to RSYNC_ERR clears the IRQ */ | 156 | /* Writing zero to RSYNC_ERR clears the IRQ */ |
| 157 | MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1)); | 157 | MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1)); |
| 158 | } else { | 158 | } else { |
| 159 | complete(&mcbsp_rx->tx_irq_completion); | 159 | complete(&mcbsp_rx->rx_irq_completion); |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | return IRQ_HANDLED; | 162 | return IRQ_HANDLED; |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 226b2e858d6c..10b3b4c63372 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
| @@ -220,20 +220,7 @@ void __init omap_map_sram(void) | |||
| 220 | if (omap_sram_size == 0) | 220 | if (omap_sram_size == 0) |
| 221 | return; | 221 | return; |
| 222 | 222 | ||
| 223 | if (cpu_is_omap24xx()) { | ||
| 224 | omap_sram_io_desc[0].virtual = OMAP2_SRAM_VA; | ||
| 225 | |||
| 226 | base = OMAP2_SRAM_PA; | ||
| 227 | base = ROUND_DOWN(base, PAGE_SIZE); | ||
| 228 | omap_sram_io_desc[0].pfn = __phys_to_pfn(base); | ||
| 229 | } | ||
| 230 | |||
| 231 | if (cpu_is_omap34xx()) { | 223 | if (cpu_is_omap34xx()) { |
| 232 | omap_sram_io_desc[0].virtual = OMAP3_SRAM_VA; | ||
| 233 | base = OMAP3_SRAM_PA; | ||
| 234 | base = ROUND_DOWN(base, PAGE_SIZE); | ||
| 235 | omap_sram_io_desc[0].pfn = __phys_to_pfn(base); | ||
| 236 | |||
| 237 | /* | 224 | /* |
| 238 | * SRAM must be marked as non-cached on OMAP3 since the | 225 | * SRAM must be marked as non-cached on OMAP3 since the |
| 239 | * CORE DPLL M2 divider change code (in SRAM) runs with the | 226 | * CORE DPLL M2 divider change code (in SRAM) runs with the |
| @@ -244,13 +231,11 @@ void __init omap_map_sram(void) | |||
| 244 | omap_sram_io_desc[0].type = MT_MEMORY_NONCACHED; | 231 | omap_sram_io_desc[0].type = MT_MEMORY_NONCACHED; |
| 245 | } | 232 | } |
| 246 | 233 | ||
| 247 | if (cpu_is_omap44xx()) { | 234 | omap_sram_io_desc[0].virtual = omap_sram_base; |
| 248 | omap_sram_io_desc[0].virtual = OMAP4_SRAM_VA; | 235 | base = omap_sram_start; |
| 249 | base = OMAP4_SRAM_PA; | 236 | base = ROUND_DOWN(base, PAGE_SIZE); |
| 250 | base = ROUND_DOWN(base, PAGE_SIZE); | 237 | omap_sram_io_desc[0].pfn = __phys_to_pfn(base); |
| 251 | omap_sram_io_desc[0].pfn = __phys_to_pfn(base); | 238 | omap_sram_io_desc[0].length = ROUND_DOWN(omap_sram_size, PAGE_SIZE); |
| 252 | } | ||
| 253 | omap_sram_io_desc[0].length = 1024 * 1024; /* Use section desc */ | ||
| 254 | iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc)); | 239 | iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc)); |
| 255 | 240 | ||
| 256 | printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n", | 241 | printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n", |
diff --git a/arch/m68k/mac/macboing.c b/arch/m68k/mac/macboing.c index 8f0640847ad2..05285d08e547 100644 --- a/arch/m68k/mac/macboing.c +++ b/arch/m68k/mac/macboing.c | |||
| @@ -162,7 +162,7 @@ static void mac_init_asc( void ) | |||
| 162 | void mac_mksound( unsigned int freq, unsigned int length ) | 162 | void mac_mksound( unsigned int freq, unsigned int length ) |
| 163 | { | 163 | { |
| 164 | __u32 cfreq = ( freq << 5 ) / 468; | 164 | __u32 cfreq = ( freq << 5 ) / 468; |
| 165 | __u32 flags; | 165 | unsigned long flags; |
| 166 | int i; | 166 | int i; |
| 167 | 167 | ||
| 168 | if ( mac_special_bell == NULL ) | 168 | if ( mac_special_bell == NULL ) |
| @@ -224,7 +224,7 @@ static void mac_nosound( unsigned long ignored ) | |||
| 224 | */ | 224 | */ |
| 225 | static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsigned int volume ) | 225 | static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsigned int volume ) |
| 226 | { | 226 | { |
| 227 | __u32 flags; | 227 | unsigned long flags; |
| 228 | 228 | ||
| 229 | /* if the bell is already ringing, ring longer */ | 229 | /* if the bell is already ringing, ring longer */ |
| 230 | if ( mac_bell_duration > 0 ) | 230 | if ( mac_bell_duration > 0 ) |
| @@ -271,7 +271,7 @@ static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsig | |||
| 271 | static void mac_quadra_ring_bell( unsigned long ignored ) | 271 | static void mac_quadra_ring_bell( unsigned long ignored ) |
| 272 | { | 272 | { |
| 273 | int i, count = mac_asc_samplespersec / HZ; | 273 | int i, count = mac_asc_samplespersec / HZ; |
| 274 | __u32 flags; | 274 | unsigned long flags; |
| 275 | 275 | ||
| 276 | /* | 276 | /* |
| 277 | * we neither want a sound buffer overflow nor underflow, so we need to match | 277 | * we neither want a sound buffer overflow nor underflow, so we need to match |
diff --git a/arch/mn10300/Kconfig.debug b/arch/mn10300/Kconfig.debug index ff80e86b9bd2..ce83c74b3fd7 100644 --- a/arch/mn10300/Kconfig.debug +++ b/arch/mn10300/Kconfig.debug | |||
| @@ -101,7 +101,7 @@ config GDBSTUB_DEBUG_BREAKPOINT | |||
| 101 | 101 | ||
| 102 | choice | 102 | choice |
| 103 | prompt "GDB stub port" | 103 | prompt "GDB stub port" |
| 104 | default GDBSTUB_TTYSM0 | 104 | default GDBSTUB_ON_TTYSM0 |
| 105 | depends on GDBSTUB | 105 | depends on GDBSTUB |
| 106 | help | 106 | help |
| 107 | Select the serial port used for GDB-stub. | 107 | Select the serial port used for GDB-stub. |
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index 717db14c2cc3..d4de05ab7864 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c | |||
| @@ -65,10 +65,10 @@ asmlinkage long sys_sigaction(int sig, | |||
| 65 | old_sigset_t mask; | 65 | old_sigset_t mask; |
| 66 | if (verify_area(VERIFY_READ, act, sizeof(*act)) || | 66 | if (verify_area(VERIFY_READ, act, sizeof(*act)) || |
| 67 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 67 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
| 68 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | 68 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || |
| 69 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 70 | __get_user(mask, &act->sa_mask)) | ||
| 69 | return -EFAULT; | 71 | return -EFAULT; |
| 70 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 71 | __get_user(mask, &act->sa_mask); | ||
| 72 | siginitset(&new_ka.sa.sa_mask, mask); | 72 | siginitset(&new_ka.sa.sa_mask, mask); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| @@ -77,10 +77,10 @@ asmlinkage long sys_sigaction(int sig, | |||
| 77 | if (!ret && oact) { | 77 | if (!ret && oact) { |
| 78 | if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || | 78 | if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || |
| 79 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 79 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
| 80 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | 80 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || |
| 81 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 82 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 81 | return -EFAULT; | 83 | return -EFAULT; |
| 82 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 83 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | return ret; | 86 | return ret; |
| @@ -102,6 +102,9 @@ static int restore_sigcontext(struct pt_regs *regs, | |||
| 102 | { | 102 | { |
| 103 | unsigned int err = 0; | 103 | unsigned int err = 0; |
| 104 | 104 | ||
| 105 | /* Always make any pending restarted system calls return -EINTR */ | ||
| 106 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
| 107 | |||
| 105 | if (is_using_fpu(current)) | 108 | if (is_using_fpu(current)) |
| 106 | fpu_kill_state(current); | 109 | fpu_kill_state(current); |
| 107 | 110 | ||
| @@ -330,8 +333,6 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 330 | regs->d0 = sig; | 333 | regs->d0 = sig; |
| 331 | regs->d1 = (unsigned long) &frame->sc; | 334 | regs->d1 = (unsigned long) &frame->sc; |
| 332 | 335 | ||
| 333 | set_fs(USER_DS); | ||
| 334 | |||
| 335 | /* the tracer may want to single-step inside the handler */ | 336 | /* the tracer may want to single-step inside the handler */ |
| 336 | if (test_thread_flag(TIF_SINGLESTEP)) | 337 | if (test_thread_flag(TIF_SINGLESTEP)) |
| 337 | ptrace_notify(SIGTRAP); | 338 | ptrace_notify(SIGTRAP); |
| @@ -345,7 +346,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 345 | return 0; | 346 | return 0; |
| 346 | 347 | ||
| 347 | give_sigsegv: | 348 | give_sigsegv: |
| 348 | force_sig(SIGSEGV, current); | 349 | force_sigsegv(sig, current); |
| 349 | return -EFAULT; | 350 | return -EFAULT; |
| 350 | } | 351 | } |
| 351 | 352 | ||
| @@ -413,8 +414,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 413 | regs->d0 = sig; | 414 | regs->d0 = sig; |
| 414 | regs->d1 = (long) &frame->info; | 415 | regs->d1 = (long) &frame->info; |
| 415 | 416 | ||
| 416 | set_fs(USER_DS); | ||
| 417 | |||
| 418 | /* the tracer may want to single-step inside the handler */ | 417 | /* the tracer may want to single-step inside the handler */ |
| 419 | if (test_thread_flag(TIF_SINGLESTEP)) | 418 | if (test_thread_flag(TIF_SINGLESTEP)) |
| 420 | ptrace_notify(SIGTRAP); | 419 | ptrace_notify(SIGTRAP); |
| @@ -428,10 +427,16 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 428 | return 0; | 427 | return 0; |
| 429 | 428 | ||
| 430 | give_sigsegv: | 429 | give_sigsegv: |
| 431 | force_sig(SIGSEGV, current); | 430 | force_sigsegv(sig, current); |
| 432 | return -EFAULT; | 431 | return -EFAULT; |
| 433 | } | 432 | } |
| 434 | 433 | ||
| 434 | static inline void stepback(struct pt_regs *regs) | ||
| 435 | { | ||
| 436 | regs->pc -= 2; | ||
| 437 | regs->orig_d0 = -1; | ||
| 438 | } | ||
| 439 | |||
| 435 | /* | 440 | /* |
| 436 | * handle the actual delivery of a signal to userspace | 441 | * handle the actual delivery of a signal to userspace |
| 437 | */ | 442 | */ |
| @@ -459,7 +464,7 @@ static int handle_signal(int sig, | |||
| 459 | /* fallthrough */ | 464 | /* fallthrough */ |
| 460 | case -ERESTARTNOINTR: | 465 | case -ERESTARTNOINTR: |
| 461 | regs->d0 = regs->orig_d0; | 466 | regs->d0 = regs->orig_d0; |
| 462 | regs->pc -= 2; | 467 | stepback(regs); |
| 463 | } | 468 | } |
| 464 | } | 469 | } |
| 465 | 470 | ||
| @@ -527,12 +532,12 @@ static void do_signal(struct pt_regs *regs) | |||
| 527 | case -ERESTARTSYS: | 532 | case -ERESTARTSYS: |
| 528 | case -ERESTARTNOINTR: | 533 | case -ERESTARTNOINTR: |
| 529 | regs->d0 = regs->orig_d0; | 534 | regs->d0 = regs->orig_d0; |
| 530 | regs->pc -= 2; | 535 | stepback(regs); |
| 531 | break; | 536 | break; |
| 532 | 537 | ||
| 533 | case -ERESTART_RESTARTBLOCK: | 538 | case -ERESTART_RESTARTBLOCK: |
| 534 | regs->d0 = __NR_restart_syscall; | 539 | regs->d0 = __NR_restart_syscall; |
| 535 | regs->pc -= 2; | 540 | stepback(regs); |
| 536 | break; | 541 | break; |
| 537 | } | 542 | } |
| 538 | } | 543 | } |
diff --git a/arch/mn10300/mm/Makefile b/arch/mn10300/mm/Makefile index 28b9d983db0c..1557277fbc5c 100644 --- a/arch/mn10300/mm/Makefile +++ b/arch/mn10300/mm/Makefile | |||
| @@ -2,13 +2,11 @@ | |||
| 2 | # Makefile for the MN10300-specific memory management code | 2 | # Makefile for the MN10300-specific memory management code |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | cacheflush-y := cache.o cache-mn10300.o | ||
| 6 | cacheflush-$(CONFIG_MN10300_CACHE_WBACK) += cache-flush-mn10300.o | ||
| 7 | |||
| 8 | cacheflush-$(CONFIG_MN10300_CACHE_DISABLED) := cache-disabled.o | ||
| 9 | |||
| 5 | obj-y := \ | 10 | obj-y := \ |
| 6 | init.o fault.o pgtable.o extable.o tlb-mn10300.o mmu-context.o \ | 11 | init.o fault.o pgtable.o extable.o tlb-mn10300.o mmu-context.o \ |
| 7 | misalignment.o dma-alloc.o | 12 | misalignment.o dma-alloc.o $(cacheflush-y) |
| 8 | |||
| 9 | ifneq ($(CONFIG_MN10300_CACHE_DISABLED),y) | ||
| 10 | obj-y += cache.o cache-mn10300.o | ||
| 11 | ifeq ($(CONFIG_MN10300_CACHE_WBACK),y) | ||
| 12 | obj-y += cache-flush-mn10300.o | ||
| 13 | endif | ||
| 14 | endif | ||
diff --git a/arch/mn10300/mm/cache-disabled.c b/arch/mn10300/mm/cache-disabled.c new file mode 100644 index 000000000000..f669ea42aba6 --- /dev/null +++ b/arch/mn10300/mm/cache-disabled.c | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | /* Handle the cache being disabled | ||
| 2 | * | ||
| 3 | * Copyright (C) 2010 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 | #include <linux/mm.h> | ||
| 12 | |||
| 13 | /* | ||
| 14 | * allow userspace to flush the instruction cache | ||
| 15 | */ | ||
| 16 | asmlinkage long sys_cacheflush(unsigned long start, unsigned long end) | ||
| 17 | { | ||
| 18 | if (end < start) | ||
| 19 | return -EINVAL; | ||
| 20 | return 0; | ||
| 21 | } | ||
diff --git a/arch/x86/boot/early_serial_console.c b/arch/x86/boot/early_serial_console.c index 030f4b93e255..5df2869c874b 100644 --- a/arch/x86/boot/early_serial_console.c +++ b/arch/x86/boot/early_serial_console.c | |||
| @@ -58,7 +58,19 @@ static void parse_earlyprintk(void) | |||
| 58 | if (arg[pos] == ',') | 58 | if (arg[pos] == ',') |
| 59 | pos++; | 59 | pos++; |
| 60 | 60 | ||
| 61 | if (!strncmp(arg, "ttyS", 4)) { | 61 | /* |
| 62 | * make sure we have | ||
| 63 | * "serial,0x3f8,115200" | ||
| 64 | * "serial,ttyS0,115200" | ||
| 65 | * "ttyS0,115200" | ||
| 66 | */ | ||
| 67 | if (pos == 7 && !strncmp(arg + pos, "0x", 2)) { | ||
| 68 | port = simple_strtoull(arg + pos, &e, 16); | ||
| 69 | if (port == 0 || arg + pos == e) | ||
| 70 | port = DEFAULT_SERIAL_PORT; | ||
| 71 | else | ||
| 72 | pos = e - arg; | ||
| 73 | } else if (!strncmp(arg + pos, "ttyS", 4)) { | ||
| 62 | static const int bases[] = { 0x3f8, 0x2f8 }; | 74 | static const int bases[] = { 0x3f8, 0x2f8 }; |
| 63 | int idx = 0; | 75 | int idx = 0; |
| 64 | 76 | ||
diff --git a/arch/x86/include/asm/amd_iommu_proto.h b/arch/x86/include/asm/amd_iommu_proto.h index d2544f1d705d..cb030374b90a 100644 --- a/arch/x86/include/asm/amd_iommu_proto.h +++ b/arch/x86/include/asm/amd_iommu_proto.h | |||
| @@ -38,4 +38,10 @@ static inline void amd_iommu_stats_init(void) { } | |||
| 38 | 38 | ||
| 39 | #endif /* !CONFIG_AMD_IOMMU_STATS */ | 39 | #endif /* !CONFIG_AMD_IOMMU_STATS */ |
| 40 | 40 | ||
| 41 | static inline bool is_rd890_iommu(struct pci_dev *pdev) | ||
| 42 | { | ||
| 43 | return (pdev->vendor == PCI_VENDOR_ID_ATI) && | ||
| 44 | (pdev->device == PCI_DEVICE_ID_RD890_IOMMU); | ||
| 45 | } | ||
| 46 | |||
| 41 | #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ | 47 | #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ |
diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h index 7014e88bc779..08616180deaf 100644 --- a/arch/x86/include/asm/amd_iommu_types.h +++ b/arch/x86/include/asm/amd_iommu_types.h | |||
| @@ -368,6 +368,9 @@ struct amd_iommu { | |||
| 368 | /* capabilities of that IOMMU read from ACPI */ | 368 | /* capabilities of that IOMMU read from ACPI */ |
| 369 | u32 cap; | 369 | u32 cap; |
| 370 | 370 | ||
| 371 | /* flags read from acpi table */ | ||
| 372 | u8 acpi_flags; | ||
| 373 | |||
| 371 | /* | 374 | /* |
| 372 | * Capability pointer. There could be more than one IOMMU per PCI | 375 | * Capability pointer. There could be more than one IOMMU per PCI |
| 373 | * device function if there are more than one AMD IOMMU capability | 376 | * device function if there are more than one AMD IOMMU capability |
| @@ -411,6 +414,15 @@ struct amd_iommu { | |||
| 411 | 414 | ||
| 412 | /* default dma_ops domain for that IOMMU */ | 415 | /* default dma_ops domain for that IOMMU */ |
| 413 | struct dma_ops_domain *default_dom; | 416 | struct dma_ops_domain *default_dom; |
| 417 | |||
| 418 | /* | ||
| 419 | * This array is required to work around a potential BIOS bug. | ||
| 420 | * The BIOS may miss to restore parts of the PCI configuration | ||
| 421 | * space when the system resumes from S3. The result is that the | ||
| 422 | * IOMMU does not execute commands anymore which leads to system | ||
| 423 | * failure. | ||
| 424 | */ | ||
| 425 | u32 cache_cfg[4]; | ||
| 414 | }; | 426 | }; |
| 415 | 427 | ||
| 416 | /* | 428 | /* |
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index 545776efeb16..bafd80defa43 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h | |||
| @@ -309,7 +309,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr) | |||
| 309 | static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr) | 309 | static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr) |
| 310 | { | 310 | { |
| 311 | return ((1UL << (nr % BITS_PER_LONG)) & | 311 | return ((1UL << (nr % BITS_PER_LONG)) & |
| 312 | (((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0; | 312 | (addr[nr / BITS_PER_LONG])) != 0; |
| 313 | } | 313 | } |
| 314 | 314 | ||
| 315 | static inline int variable_test_bit(int nr, volatile const unsigned long *addr) | 315 | static inline int variable_test_bit(int nr, volatile const unsigned long *addr) |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 0925676266bd..fedf32a8c3ec 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
| @@ -11,6 +11,8 @@ ifdef CONFIG_FUNCTION_TRACER | |||
| 11 | CFLAGS_REMOVE_tsc.o = -pg | 11 | CFLAGS_REMOVE_tsc.o = -pg |
| 12 | CFLAGS_REMOVE_rtc.o = -pg | 12 | CFLAGS_REMOVE_rtc.o = -pg |
| 13 | CFLAGS_REMOVE_paravirt-spinlocks.o = -pg | 13 | CFLAGS_REMOVE_paravirt-spinlocks.o = -pg |
| 14 | CFLAGS_REMOVE_pvclock.o = -pg | ||
| 15 | CFLAGS_REMOVE_kvmclock.o = -pg | ||
| 14 | CFLAGS_REMOVE_ftrace.o = -pg | 16 | CFLAGS_REMOVE_ftrace.o = -pg |
| 15 | CFLAGS_REMOVE_early_printk.o = -pg | 17 | CFLAGS_REMOVE_early_printk.o = -pg |
| 16 | endif | 18 | endif |
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c index fb7a5f052e2b..fb16f17e59be 100644 --- a/arch/x86/kernel/acpi/cstate.c +++ b/arch/x86/kernel/acpi/cstate.c | |||
| @@ -61,7 +61,7 @@ struct cstate_entry { | |||
| 61 | unsigned int ecx; | 61 | unsigned int ecx; |
| 62 | } states[ACPI_PROCESSOR_MAX_POWER]; | 62 | } states[ACPI_PROCESSOR_MAX_POWER]; |
| 63 | }; | 63 | }; |
| 64 | static struct cstate_entry *cpu_cstate_entry; /* per CPU ptr */ | 64 | static struct cstate_entry __percpu *cpu_cstate_entry; /* per CPU ptr */ |
| 65 | 65 | ||
| 66 | static short mwait_supported[ACPI_PROCESSOR_MAX_POWER]; | 66 | static short mwait_supported[ACPI_PROCESSOR_MAX_POWER]; |
| 67 | 67 | ||
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index fa044e1e30a2..679b6450382b 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -1953,6 +1953,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, | |||
| 1953 | size_t size, | 1953 | size_t size, |
| 1954 | int dir) | 1954 | int dir) |
| 1955 | { | 1955 | { |
| 1956 | dma_addr_t flush_addr; | ||
| 1956 | dma_addr_t i, start; | 1957 | dma_addr_t i, start; |
| 1957 | unsigned int pages; | 1958 | unsigned int pages; |
| 1958 | 1959 | ||
| @@ -1960,6 +1961,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, | |||
| 1960 | (dma_addr + size > dma_dom->aperture_size)) | 1961 | (dma_addr + size > dma_dom->aperture_size)) |
| 1961 | return; | 1962 | return; |
| 1962 | 1963 | ||
| 1964 | flush_addr = dma_addr; | ||
| 1963 | pages = iommu_num_pages(dma_addr, size, PAGE_SIZE); | 1965 | pages = iommu_num_pages(dma_addr, size, PAGE_SIZE); |
| 1964 | dma_addr &= PAGE_MASK; | 1966 | dma_addr &= PAGE_MASK; |
| 1965 | start = dma_addr; | 1967 | start = dma_addr; |
| @@ -1974,7 +1976,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, | |||
| 1974 | dma_ops_free_addresses(dma_dom, dma_addr, pages); | 1976 | dma_ops_free_addresses(dma_dom, dma_addr, pages); |
| 1975 | 1977 | ||
| 1976 | if (amd_iommu_unmap_flush || dma_dom->need_flush) { | 1978 | if (amd_iommu_unmap_flush || dma_dom->need_flush) { |
| 1977 | iommu_flush_pages(&dma_dom->domain, dma_addr, size); | 1979 | iommu_flush_pages(&dma_dom->domain, flush_addr, size); |
| 1978 | dma_dom->need_flush = false; | 1980 | dma_dom->need_flush = false; |
| 1979 | } | 1981 | } |
| 1980 | } | 1982 | } |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 3cc63e2b8dd4..5a170cbbbed8 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -632,6 +632,13 @@ static void __init init_iommu_from_pci(struct amd_iommu *iommu) | |||
| 632 | iommu->last_device = calc_devid(MMIO_GET_BUS(range), | 632 | iommu->last_device = calc_devid(MMIO_GET_BUS(range), |
| 633 | MMIO_GET_LD(range)); | 633 | MMIO_GET_LD(range)); |
| 634 | iommu->evt_msi_num = MMIO_MSI_NUM(misc); | 634 | iommu->evt_msi_num = MMIO_MSI_NUM(misc); |
| 635 | |||
| 636 | if (is_rd890_iommu(iommu->dev)) { | ||
| 637 | pci_read_config_dword(iommu->dev, 0xf0, &iommu->cache_cfg[0]); | ||
| 638 | pci_read_config_dword(iommu->dev, 0xf4, &iommu->cache_cfg[1]); | ||
| 639 | pci_read_config_dword(iommu->dev, 0xf8, &iommu->cache_cfg[2]); | ||
| 640 | pci_read_config_dword(iommu->dev, 0xfc, &iommu->cache_cfg[3]); | ||
| 641 | } | ||
| 635 | } | 642 | } |
| 636 | 643 | ||
| 637 | /* | 644 | /* |
| @@ -649,29 +656,9 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu, | |||
| 649 | struct ivhd_entry *e; | 656 | struct ivhd_entry *e; |
| 650 | 657 | ||
| 651 | /* | 658 | /* |
| 652 | * First set the recommended feature enable bits from ACPI | 659 | * First save the recommended feature enable bits from ACPI |
| 653 | * into the IOMMU control registers | ||
| 654 | */ | 660 | */ |
| 655 | h->flags & IVHD_FLAG_HT_TUN_EN_MASK ? | 661 | iommu->acpi_flags = h->flags; |
| 656 | iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) : | ||
| 657 | iommu_feature_disable(iommu, CONTROL_HT_TUN_EN); | ||
| 658 | |||
| 659 | h->flags & IVHD_FLAG_PASSPW_EN_MASK ? | ||
| 660 | iommu_feature_enable(iommu, CONTROL_PASSPW_EN) : | ||
| 661 | iommu_feature_disable(iommu, CONTROL_PASSPW_EN); | ||
| 662 | |||
| 663 | h->flags & IVHD_FLAG_RESPASSPW_EN_MASK ? | ||
| 664 | iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) : | ||
| 665 | iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN); | ||
| 666 | |||
| 667 | h->flags & IVHD_FLAG_ISOC_EN_MASK ? | ||
| 668 | iommu_feature_enable(iommu, CONTROL_ISOC_EN) : | ||
| 669 | iommu_feature_disable(iommu, CONTROL_ISOC_EN); | ||
| 670 | |||
| 671 | /* | ||
| 672 | * make IOMMU memory accesses cache coherent | ||
| 673 | */ | ||
| 674 | iommu_feature_enable(iommu, CONTROL_COHERENT_EN); | ||
| 675 | 662 | ||
| 676 | /* | 663 | /* |
| 677 | * Done. Now parse the device entries | 664 | * Done. Now parse the device entries |
| @@ -1116,6 +1103,40 @@ static void init_device_table(void) | |||
| 1116 | } | 1103 | } |
| 1117 | } | 1104 | } |
| 1118 | 1105 | ||
| 1106 | static void iommu_init_flags(struct amd_iommu *iommu) | ||
| 1107 | { | ||
| 1108 | iommu->acpi_flags & IVHD_FLAG_HT_TUN_EN_MASK ? | ||
| 1109 | iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) : | ||
| 1110 | iommu_feature_disable(iommu, CONTROL_HT_TUN_EN); | ||
| 1111 | |||
| 1112 | iommu->acpi_flags & IVHD_FLAG_PASSPW_EN_MASK ? | ||
| 1113 | iommu_feature_enable(iommu, CONTROL_PASSPW_EN) : | ||
| 1114 | iommu_feature_disable(iommu, CONTROL_PASSPW_EN); | ||
| 1115 | |||
| 1116 | iommu->acpi_flags & IVHD_FLAG_RESPASSPW_EN_MASK ? | ||
| 1117 | iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) : | ||
| 1118 | iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN); | ||
| 1119 | |||
| 1120 | iommu->acpi_flags & IVHD_FLAG_ISOC_EN_MASK ? | ||
| 1121 | iommu_feature_enable(iommu, CONTROL_ISOC_EN) : | ||
| 1122 | iommu_feature_disable(iommu, CONTROL_ISOC_EN); | ||
| 1123 | |||
| 1124 | /* | ||
| 1125 | * make IOMMU memory accesses cache coherent | ||
| 1126 | */ | ||
| 1127 | iommu_feature_enable(iommu, CONTROL_COHERENT_EN); | ||
| 1128 | } | ||
| 1129 | |||
| 1130 | static void iommu_apply_quirks(struct amd_iommu *iommu) | ||
| 1131 | { | ||
| 1132 | if (is_rd890_iommu(iommu->dev)) { | ||
| 1133 | pci_write_config_dword(iommu->dev, 0xf0, iommu->cache_cfg[0]); | ||
| 1134 | pci_write_config_dword(iommu->dev, 0xf4, iommu->cache_cfg[1]); | ||
| 1135 | pci_write_config_dword(iommu->dev, 0xf8, iommu->cache_cfg[2]); | ||
| 1136 | pci_write_config_dword(iommu->dev, 0xfc, iommu->cache_cfg[3]); | ||
| 1137 | } | ||
| 1138 | } | ||
| 1139 | |||
| 1119 | /* | 1140 | /* |
| 1120 | * This function finally enables all IOMMUs found in the system after | 1141 | * This function finally enables all IOMMUs found in the system after |
| 1121 | * they have been initialized | 1142 | * they have been initialized |
| @@ -1126,6 +1147,8 @@ static void enable_iommus(void) | |||
| 1126 | 1147 | ||
| 1127 | for_each_iommu(iommu) { | 1148 | for_each_iommu(iommu) { |
| 1128 | iommu_disable(iommu); | 1149 | iommu_disable(iommu); |
| 1150 | iommu_apply_quirks(iommu); | ||
| 1151 | iommu_init_flags(iommu); | ||
| 1129 | iommu_set_device_table(iommu); | 1152 | iommu_set_device_table(iommu); |
| 1130 | iommu_enable_command_buffer(iommu); | 1153 | iommu_enable_command_buffer(iommu); |
| 1131 | iommu_enable_event_buffer(iommu); | 1154 | iommu_enable_event_buffer(iommu); |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 3efdf2870a35..03a5b0385ad6 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -102,6 +102,7 @@ struct cpu_hw_events { | |||
| 102 | */ | 102 | */ |
| 103 | struct perf_event *events[X86_PMC_IDX_MAX]; /* in counter order */ | 103 | struct perf_event *events[X86_PMC_IDX_MAX]; /* in counter order */ |
| 104 | unsigned long active_mask[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; | 104 | unsigned long active_mask[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; |
| 105 | unsigned long running[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; | ||
| 105 | int enabled; | 106 | int enabled; |
| 106 | 107 | ||
| 107 | int n_events; | 108 | int n_events; |
| @@ -1010,6 +1011,7 @@ static int x86_pmu_start(struct perf_event *event) | |||
| 1010 | x86_perf_event_set_period(event); | 1011 | x86_perf_event_set_period(event); |
| 1011 | cpuc->events[idx] = event; | 1012 | cpuc->events[idx] = event; |
| 1012 | __set_bit(idx, cpuc->active_mask); | 1013 | __set_bit(idx, cpuc->active_mask); |
| 1014 | __set_bit(idx, cpuc->running); | ||
| 1013 | x86_pmu.enable(event); | 1015 | x86_pmu.enable(event); |
| 1014 | perf_event_update_userpage(event); | 1016 | perf_event_update_userpage(event); |
| 1015 | 1017 | ||
| @@ -1141,8 +1143,16 @@ static int x86_pmu_handle_irq(struct pt_regs *regs) | |||
| 1141 | cpuc = &__get_cpu_var(cpu_hw_events); | 1143 | cpuc = &__get_cpu_var(cpu_hw_events); |
| 1142 | 1144 | ||
| 1143 | for (idx = 0; idx < x86_pmu.num_counters; idx++) { | 1145 | for (idx = 0; idx < x86_pmu.num_counters; idx++) { |
| 1144 | if (!test_bit(idx, cpuc->active_mask)) | 1146 | if (!test_bit(idx, cpuc->active_mask)) { |
| 1147 | /* | ||
| 1148 | * Though we deactivated the counter some cpus | ||
| 1149 | * might still deliver spurious interrupts still | ||
| 1150 | * in flight. Catch them: | ||
| 1151 | */ | ||
| 1152 | if (__test_and_clear_bit(idx, cpuc->running)) | ||
| 1153 | handled++; | ||
| 1145 | continue; | 1154 | continue; |
| 1155 | } | ||
| 1146 | 1156 | ||
| 1147 | event = cpuc->events[idx]; | 1157 | event = cpuc->events[idx]; |
| 1148 | hwc = &event->hw; | 1158 | hwc = &event->hw; |
