diff options
208 files changed, 2078 insertions, 715 deletions
diff --git a/Documentation/arm/Booting b/Documentation/arm/Booting index 0c1f475fdf36..371814a36719 100644 --- a/Documentation/arm/Booting +++ b/Documentation/arm/Booting | |||
@@ -18,7 +18,8 @@ following: | |||
18 | 2. Initialise one serial port. | 18 | 2. Initialise one serial port. |
19 | 3. Detect the machine type. | 19 | 3. Detect the machine type. |
20 | 4. Setup the kernel tagged list. | 20 | 4. Setup the kernel tagged list. |
21 | 5. Call the kernel image. | 21 | 5. Load initramfs. |
22 | 6. Call the kernel image. | ||
22 | 23 | ||
23 | 24 | ||
24 | 1. Setup and initialise RAM | 25 | 1. Setup and initialise RAM |
@@ -120,12 +121,27 @@ tagged list. | |||
120 | The boot loader must pass at a minimum the size and location of the | 121 | The boot loader must pass at a minimum the size and location of the |
121 | system memory, and the root filesystem location. The dtb must be | 122 | system memory, and the root filesystem location. The dtb must be |
122 | placed in a region of memory where the kernel decompressor will not | 123 | placed in a region of memory where the kernel decompressor will not |
123 | overwrite it. The recommended placement is in the first 16KiB of RAM | 124 | overwrite it, whilst remaining within the region which will be covered |
124 | with the caveat that it may not be located at physical address 0 since | 125 | by the kernel's low-memory mapping. |
125 | the kernel interprets a value of 0 in r2 to mean neither a tagged list | ||
126 | nor a dtb were passed. | ||
127 | 126 | ||
128 | 5. Calling the kernel image | 127 | A safe location is just above the 128MiB boundary from start of RAM. |
128 | |||
129 | 5. Load initramfs. | ||
130 | ------------------ | ||
131 | |||
132 | Existing boot loaders: OPTIONAL | ||
133 | New boot loaders: OPTIONAL | ||
134 | |||
135 | If an initramfs is in use then, as with the dtb, it must be placed in | ||
136 | a region of memory where the kernel decompressor will not overwrite it | ||
137 | while also with the region which will be covered by the kernel's | ||
138 | low-memory mapping. | ||
139 | |||
140 | A safe location is just above the device tree blob which itself will | ||
141 | be loaded just above the 128MiB boundary from the start of RAM as | ||
142 | recommended above. | ||
143 | |||
144 | 6. Calling the kernel image | ||
129 | --------------------------- | 145 | --------------------------- |
130 | 146 | ||
131 | Existing boot loaders: MANDATORY | 147 | Existing boot loaders: MANDATORY |
@@ -136,11 +152,17 @@ is stored in flash, and is linked correctly to be run from flash, | |||
136 | then it is legal for the boot loader to call the zImage in flash | 152 | then it is legal for the boot loader to call the zImage in flash |
137 | directly. | 153 | directly. |
138 | 154 | ||
139 | The zImage may also be placed in system RAM (at any location) and | 155 | The zImage may also be placed in system RAM and called there. The |
140 | called there. Note that the kernel uses 16K of RAM below the image | 156 | kernel should be placed in the first 128MiB of RAM. It is recommended |
141 | to store page tables. The recommended placement is 32KiB into RAM. | 157 | that it is loaded above 32MiB in order to avoid the need to relocate |
158 | prior to decompression, which will make the boot process slightly | ||
159 | faster. | ||
160 | |||
161 | When booting a raw (non-zImage) kernel the constraints are tighter. | ||
162 | In this case the kernel must be loaded at an offset into system equal | ||
163 | to TEXT_OFFSET - PAGE_OFFSET. | ||
142 | 164 | ||
143 | In either case, the following conditions must be met: | 165 | In any case, the following conditions must be met: |
144 | 166 | ||
145 | - Quiesce all DMA capable devices so that memory does not get | 167 | - Quiesce all DMA capable devices so that memory does not get |
146 | corrupted by bogus network packets or disk data. This will save | 168 | corrupted by bogus network packets or disk data. This will save |
diff --git a/Documentation/arm/kernel_mode_neon.txt b/Documentation/arm/kernel_mode_neon.txt new file mode 100644 index 000000000000..525452726d31 --- /dev/null +++ b/Documentation/arm/kernel_mode_neon.txt | |||
@@ -0,0 +1,121 @@ | |||
1 | Kernel mode NEON | ||
2 | ================ | ||
3 | |||
4 | TL;DR summary | ||
5 | ------------- | ||
6 | * Use only NEON instructions, or VFP instructions that don't rely on support | ||
7 | code | ||
8 | * Isolate your NEON code in a separate compilation unit, and compile it with | ||
9 | '-mfpu=neon -mfloat-abi=softfp' | ||
10 | * Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your | ||
11 | NEON code | ||
12 | * Don't sleep in your NEON code, and be aware that it will be executed with | ||
13 | preemption disabled | ||
14 | |||
15 | |||
16 | Introduction | ||
17 | ------------ | ||
18 | It is possible to use NEON instructions (and in some cases, VFP instructions) in | ||
19 | code that runs in kernel mode. However, for performance reasons, the NEON/VFP | ||
20 | register file is not preserved and restored at every context switch or taken | ||
21 | exception like the normal register file is, so some manual intervention is | ||
22 | required. Furthermore, special care is required for code that may sleep [i.e., | ||
23 | may call schedule()], as NEON or VFP instructions will be executed in a | ||
24 | non-preemptible section for reasons outlined below. | ||
25 | |||
26 | |||
27 | Lazy preserve and restore | ||
28 | ------------------------- | ||
29 | The NEON/VFP register file is managed using lazy preserve (on UP systems) and | ||
30 | lazy restore (on both SMP and UP systems). This means that the register file is | ||
31 | kept 'live', and is only preserved and restored when multiple tasks are | ||
32 | contending for the NEON/VFP unit (or, in the SMP case, when a task migrates to | ||
33 | another core). Lazy restore is implemented by disabling the NEON/VFP unit after | ||
34 | every context switch, resulting in a trap when subsequently a NEON/VFP | ||
35 | instruction is issued, allowing the kernel to step in and perform the restore if | ||
36 | necessary. | ||
37 | |||
38 | Any use of the NEON/VFP unit in kernel mode should not interfere with this, so | ||
39 | it is required to do an 'eager' preserve of the NEON/VFP register file, and | ||
40 | enable the NEON/VFP unit explicitly so no exceptions are generated on first | ||
41 | subsequent use. This is handled by the function kernel_neon_begin(), which | ||
42 | should be called before any kernel mode NEON or VFP instructions are issued. | ||
43 | Likewise, the NEON/VFP unit should be disabled again after use to make sure user | ||
44 | mode will hit the lazy restore trap upon next use. This is handled by the | ||
45 | function kernel_neon_end(). | ||
46 | |||
47 | |||
48 | Interruptions in kernel mode | ||
49 | ---------------------------- | ||
50 | For reasons of performance and simplicity, it was decided that there shall be no | ||
51 | preserve/restore mechanism for the kernel mode NEON/VFP register contents. This | ||
52 | implies that interruptions of a kernel mode NEON section can only be allowed if | ||
53 | they are guaranteed not to touch the NEON/VFP registers. For this reason, the | ||
54 | following rules and restrictions apply in the kernel: | ||
55 | * NEON/VFP code is not allowed in interrupt context; | ||
56 | * NEON/VFP code is not allowed to sleep; | ||
57 | * NEON/VFP code is executed with preemption disabled. | ||
58 | |||
59 | If latency is a concern, it is possible to put back to back calls to | ||
60 | kernel_neon_end() and kernel_neon_begin() in places in your code where none of | ||
61 | the NEON registers are live. (Additional calls to kernel_neon_begin() should be | ||
62 | reasonably cheap if no context switch occurred in the meantime) | ||
63 | |||
64 | |||
65 | VFP and support code | ||
66 | -------------------- | ||
67 | Earlier versions of VFP (prior to version 3) rely on software support for things | ||
68 | like IEEE-754 compliant underflow handling etc. When the VFP unit needs such | ||
69 | software assistance, it signals the kernel by raising an undefined instruction | ||
70 | exception. The kernel responds by inspecting the VFP control registers and the | ||
71 | current instruction and arguments, and emulates the instruction in software. | ||
72 | |||
73 | Such software assistance is currently not implemented for VFP instructions | ||
74 | executed in kernel mode. If such a condition is encountered, the kernel will | ||
75 | fail and generate an OOPS. | ||
76 | |||
77 | |||
78 | Separating NEON code from ordinary code | ||
79 | --------------------------------------- | ||
80 | The compiler is not aware of the special significance of kernel_neon_begin() and | ||
81 | kernel_neon_end(), i.e., that it is only allowed to issue NEON/VFP instructions | ||
82 | between calls to these respective functions. Furthermore, GCC may generate NEON | ||
83 | instructions of its own at -O3 level if -mfpu=neon is selected, and even if the | ||
84 | kernel is currently compiled at -O2, future changes may result in NEON/VFP | ||
85 | instructions appearing in unexpected places if no special care is taken. | ||
86 | |||
87 | Therefore, the recommended and only supported way of using NEON/VFP in the | ||
88 | kernel is by adhering to the following rules: | ||
89 | * isolate the NEON code in a separate compilation unit and compile it with | ||
90 | '-mfpu=neon -mfloat-abi=softfp'; | ||
91 | * issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls | ||
92 | into the unit containing the NEON code from a compilation unit which is *not* | ||
93 | built with the GCC flag '-mfpu=neon' set. | ||
94 | |||
95 | As the kernel is compiled with '-msoft-float', the above will guarantee that | ||
96 | both NEON and VFP instructions will only ever appear in designated compilation | ||
97 | units at any optimization level. | ||
98 | |||
99 | |||
100 | NEON assembler | ||
101 | -------------- | ||
102 | NEON assembler is supported with no additional caveats as long as the rules | ||
103 | above are followed. | ||
104 | |||
105 | |||
106 | NEON code generated by GCC | ||
107 | -------------------------- | ||
108 | The GCC option -ftree-vectorize (implied by -O3) tries to exploit implicit | ||
109 | parallelism, and generates NEON code from ordinary C source code. This is fully | ||
110 | supported as long as the rules above are followed. | ||
111 | |||
112 | |||
113 | NEON intrinsics | ||
114 | --------------- | ||
115 | NEON intrinsics are also supported. However, as code using NEON intrinsics | ||
116 | relies on the GCC header <arm_neon.h>, (which #includes <stdint.h>), you should | ||
117 | observe the following in addition to the rules above: | ||
118 | * Compile the unit containing the NEON intrinsics with '-ffreestanding' so GCC | ||
119 | uses its builtin version of <stdint.h> (this is a C99 header which the kernel | ||
120 | does not supply); | ||
121 | * Include <arm_neon.h> last, or at least after <linux/types.h> | ||
diff --git a/Documentation/devicetree/bindings/arm/l2cc.txt b/Documentation/devicetree/bindings/arm/l2cc.txt index 69ddf9fad2dc..c0c7626fd0ff 100644 --- a/Documentation/devicetree/bindings/arm/l2cc.txt +++ b/Documentation/devicetree/bindings/arm/l2cc.txt | |||
@@ -16,9 +16,11 @@ Required properties: | |||
16 | performs the same operation). | 16 | performs the same operation). |
17 | "marvell,"aurora-outer-cache: Marvell Controller designed to be | 17 | "marvell,"aurora-outer-cache: Marvell Controller designed to be |
18 | compatible with the ARM one with outer cache mode. | 18 | compatible with the ARM one with outer cache mode. |
19 | "bcm,bcm11351-a2-pl310-cache": For Broadcom bcm11351 chipset where an | 19 | "brcm,bcm11351-a2-pl310-cache": For Broadcom bcm11351 chipset where an |
20 | offset needs to be added to the address before passing down to the L2 | 20 | offset needs to be added to the address before passing down to the L2 |
21 | cache controller | 21 | cache controller |
22 | "bcm,bcm11351-a2-pl310-cache": DEPRECATED by | ||
23 | "brcm,bcm11351-a2-pl310-cache" | ||
22 | - cache-unified : Specifies the cache is a unified cache. | 24 | - cache-unified : Specifies the cache is a unified cache. |
23 | - cache-level : Should be set to 2 for a level 2 cache. | 25 | - cache-level : Should be set to 2 for a level 2 cache. |
24 | - reg : Physical base address and size of cache controller's memory mapped | 26 | - reg : Physical base address and size of cache controller's memory mapped |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 15356aca938c..7f9d4f53882c 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -2953,7 +2953,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
2953 | improve throughput, but will also increase the | 2953 | improve throughput, but will also increase the |
2954 | amount of memory reserved for use by the client. | 2954 | amount of memory reserved for use by the client. |
2955 | 2955 | ||
2956 | swapaccount[=0|1] | 2956 | swapaccount=[0|1] |
2957 | [KNL] Enable accounting of swap in memory resource | 2957 | [KNL] Enable accounting of swap in memory resource |
2958 | controller if no parameter or 1 is given or disable | 2958 | controller if no parameter or 1 is given or disable |
2959 | it if 0 is given (See Documentation/cgroups/memory.txt) | 2959 | it if 0 is given (See Documentation/cgroups/memory.txt) |
diff --git a/MAINTAINERS b/MAINTAINERS index 229c66b12cc2..8197fbd70a3e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -5884,7 +5884,7 @@ F: drivers/i2c/busses/i2c-omap.c | |||
5884 | F: include/linux/i2c-omap.h | 5884 | F: include/linux/i2c-omap.h |
5885 | 5885 | ||
5886 | OMAP DEVICE TREE SUPPORT | 5886 | OMAP DEVICE TREE SUPPORT |
5887 | M: Benoît Cousson <b-cousson@ti.com> | 5887 | M: Benoît Cousson <bcousson@baylibre.com> |
5888 | M: Tony Lindgren <tony@atomide.com> | 5888 | M: Tony Lindgren <tony@atomide.com> |
5889 | L: linux-omap@vger.kernel.org | 5889 | L: linux-omap@vger.kernel.org |
5890 | L: devicetree@vger.kernel.org | 5890 | L: devicetree@vger.kernel.org |
@@ -5964,14 +5964,14 @@ S: Maintained | |||
5964 | F: drivers/char/hw_random/omap-rng.c | 5964 | F: drivers/char/hw_random/omap-rng.c |
5965 | 5965 | ||
5966 | OMAP HWMOD SUPPORT | 5966 | OMAP HWMOD SUPPORT |
5967 | M: Benoît Cousson <b-cousson@ti.com> | 5967 | M: Benoît Cousson <bcousson@baylibre.com> |
5968 | M: Paul Walmsley <paul@pwsan.com> | 5968 | M: Paul Walmsley <paul@pwsan.com> |
5969 | L: linux-omap@vger.kernel.org | 5969 | L: linux-omap@vger.kernel.org |
5970 | S: Maintained | 5970 | S: Maintained |
5971 | F: arch/arm/mach-omap2/omap_hwmod.* | 5971 | F: arch/arm/mach-omap2/omap_hwmod.* |
5972 | 5972 | ||
5973 | OMAP HWMOD DATA FOR OMAP4-BASED DEVICES | 5973 | OMAP HWMOD DATA FOR OMAP4-BASED DEVICES |
5974 | M: Benoît Cousson <b-cousson@ti.com> | 5974 | M: Benoît Cousson <bcousson@baylibre.com> |
5975 | L: linux-omap@vger.kernel.org | 5975 | L: linux-omap@vger.kernel.org |
5976 | S: Maintained | 5976 | S: Maintained |
5977 | F: arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 5977 | F: arch/arm/mach-omap2/omap_hwmod_44xx_data.c |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 11 | 2 | PATCHLEVEL = 11 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc6 | 4 | EXTRAVERSION = -rc7 |
5 | NAME = Linux for Workgroups | 5 | NAME = Linux for Workgroups |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arc/lib/strchr-700.S b/arch/arc/lib/strchr-700.S index 99c10475d477..9c548c7cf001 100644 --- a/arch/arc/lib/strchr-700.S +++ b/arch/arc/lib/strchr-700.S | |||
@@ -39,9 +39,18 @@ ARC_ENTRY strchr | |||
39 | ld.a r2,[r0,4] | 39 | ld.a r2,[r0,4] |
40 | sub r12,r6,r7 | 40 | sub r12,r6,r7 |
41 | bic r12,r12,r6 | 41 | bic r12,r12,r6 |
42 | #ifdef __LITTLE_ENDIAN__ | ||
42 | and r7,r12,r4 | 43 | and r7,r12,r4 |
43 | breq r7,0,.Loop ; For speed, we want this branch to be unaligned. | 44 | breq r7,0,.Loop ; For speed, we want this branch to be unaligned. |
44 | b .Lfound_char ; Likewise this one. | 45 | b .Lfound_char ; Likewise this one. |
46 | #else | ||
47 | and r12,r12,r4 | ||
48 | breq r12,0,.Loop ; For speed, we want this branch to be unaligned. | ||
49 | lsr_s r12,r12,7 | ||
50 | bic r2,r7,r6 | ||
51 | b.d .Lfound_char_b | ||
52 | and_s r2,r2,r12 | ||
53 | #endif | ||
45 | ; /* We require this code address to be unaligned for speed... */ | 54 | ; /* We require this code address to be unaligned for speed... */ |
46 | .Laligned: | 55 | .Laligned: |
47 | ld_s r2,[r0] | 56 | ld_s r2,[r0] |
@@ -95,6 +104,7 @@ ARC_ENTRY strchr | |||
95 | lsr r7,r7,7 | 104 | lsr r7,r7,7 |
96 | 105 | ||
97 | bic r2,r7,r6 | 106 | bic r2,r7,r6 |
107 | .Lfound_char_b: | ||
98 | norm r2,r2 | 108 | norm r2,r2 |
99 | sub_s r0,r0,4 | 109 | sub_s r0,r0,4 |
100 | asr_s r2,r2,3 | 110 | asr_s r2,r2,3 |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 43594d5116ef..053c78cb0fad 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -52,6 +52,7 @@ config ARM | |||
52 | select HAVE_REGS_AND_STACK_ACCESS_API | 52 | select HAVE_REGS_AND_STACK_ACCESS_API |
53 | select HAVE_SYSCALL_TRACEPOINTS | 53 | select HAVE_SYSCALL_TRACEPOINTS |
54 | select HAVE_UID16 | 54 | select HAVE_UID16 |
55 | select IRQ_FORCED_THREADING | ||
55 | select KTIME_SCALAR | 56 | select KTIME_SCALAR |
56 | select PERF_USE_VMALLOC | 57 | select PERF_USE_VMALLOC |
57 | select RTC_LIB | 58 | select RTC_LIB |
@@ -1372,6 +1373,15 @@ config ARM_ERRATA_798181 | |||
1372 | which sends an IPI to the CPUs that are running the same ASID | 1373 | which sends an IPI to the CPUs that are running the same ASID |
1373 | as the one being invalidated. | 1374 | as the one being invalidated. |
1374 | 1375 | ||
1376 | config ARM_ERRATA_773022 | ||
1377 | bool "ARM errata: incorrect instructions may be executed from loop buffer" | ||
1378 | depends on CPU_V7 | ||
1379 | help | ||
1380 | This option enables the workaround for the 773022 Cortex-A15 | ||
1381 | (up to r0p4) erratum. In certain rare sequences of code, the | ||
1382 | loop buffer may deliver incorrect instructions. This | ||
1383 | workaround disables the loop buffer to avoid the erratum. | ||
1384 | |||
1375 | endmenu | 1385 | endmenu |
1376 | 1386 | ||
1377 | source "arch/arm/common/Kconfig" | 1387 | source "arch/arm/common/Kconfig" |
@@ -1613,13 +1623,49 @@ config ARCH_NR_GPIO | |||
1613 | 1623 | ||
1614 | source kernel/Kconfig.preempt | 1624 | source kernel/Kconfig.preempt |
1615 | 1625 | ||
1616 | config HZ | 1626 | config HZ_FIXED |
1617 | int | 1627 | int |
1618 | default 200 if ARCH_EBSA110 || ARCH_S3C24XX || ARCH_S5P64X0 || \ | 1628 | default 200 if ARCH_EBSA110 || ARCH_S3C24XX || ARCH_S5P64X0 || \ |
1619 | ARCH_S5PV210 || ARCH_EXYNOS4 | 1629 | ARCH_S5PV210 || ARCH_EXYNOS4 |
1620 | default AT91_TIMER_HZ if ARCH_AT91 | 1630 | default AT91_TIMER_HZ if ARCH_AT91 |
1621 | default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE | 1631 | default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE |
1622 | default 100 | 1632 | |
1633 | choice | ||
1634 | depends on !HZ_FIXED | ||
1635 | prompt "Timer frequency" | ||
1636 | |||
1637 | config HZ_100 | ||
1638 | bool "100 Hz" | ||
1639 | |||
1640 | config HZ_200 | ||
1641 | bool "200 Hz" | ||
1642 | |||
1643 | config HZ_250 | ||
1644 | bool "250 Hz" | ||
1645 | |||
1646 | config HZ_300 | ||
1647 | bool "300 Hz" | ||
1648 | |||
1649 | config HZ_500 | ||
1650 | bool "500 Hz" | ||
1651 | |||
1652 | config HZ_1000 | ||
1653 | bool "1000 Hz" | ||
1654 | |||
1655 | endchoice | ||
1656 | |||
1657 | config HZ | ||
1658 | int | ||
1659 | default HZ_FIXED if HZ_FIXED | ||
1660 | default 100 if HZ_100 | ||
1661 | default 200 if HZ_200 | ||
1662 | default 250 if HZ_250 | ||
1663 | default 300 if HZ_300 | ||
1664 | default 500 if HZ_500 | ||
1665 | default 1000 | ||
1666 | |||
1667 | config SCHED_HRTICK | ||
1668 | def_bool HIGH_RES_TIMERS | ||
1623 | 1669 | ||
1624 | config SCHED_HRTICK | 1670 | config SCHED_HRTICK |
1625 | def_bool HIGH_RES_TIMERS | 1671 | def_bool HIGH_RES_TIMERS |
@@ -1756,6 +1802,9 @@ config HAVE_ARCH_TRANSPARENT_HUGEPAGE | |||
1756 | def_bool y | 1802 | def_bool y |
1757 | depends on ARM_LPAE | 1803 | depends on ARM_LPAE |
1758 | 1804 | ||
1805 | config ARCH_WANT_GENERAL_HUGETLB | ||
1806 | def_bool y | ||
1807 | |||
1759 | source "mm/Kconfig" | 1808 | source "mm/Kconfig" |
1760 | 1809 | ||
1761 | config FORCE_MAX_ZONEORDER | 1810 | config FORCE_MAX_ZONEORDER |
@@ -2175,6 +2224,13 @@ config NEON | |||
2175 | Say Y to include support code for NEON, the ARMv7 Advanced SIMD | 2224 | Say Y to include support code for NEON, the ARMv7 Advanced SIMD |
2176 | Extension. | 2225 | Extension. |
2177 | 2226 | ||
2227 | config KERNEL_MODE_NEON | ||
2228 | bool "Support for NEON in kernel mode" | ||
2229 | default n | ||
2230 | depends on NEON | ||
2231 | help | ||
2232 | Say Y to include support for NEON in kernel mode. | ||
2233 | |||
2178 | endmenu | 2234 | endmenu |
2179 | 2235 | ||
2180 | menu "Userspace binary formats" | 2236 | menu "Userspace binary formats" |
@@ -2199,7 +2255,7 @@ source "kernel/power/Kconfig" | |||
2199 | 2255 | ||
2200 | config ARCH_SUSPEND_POSSIBLE | 2256 | config ARCH_SUSPEND_POSSIBLE |
2201 | depends on !ARCH_S5PC100 | 2257 | depends on !ARCH_S5PC100 |
2202 | depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \ | 2258 | depends on CPU_ARM920T || CPU_ARM926T || CPU_FEROCEON || CPU_SA1100 || \ |
2203 | CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE || CPU_MOHAWK | 2259 | CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE || CPU_MOHAWK |
2204 | def_bool y | 2260 | def_bool y |
2205 | 2261 | ||
diff --git a/arch/arm/boot/dts/at91sam9n12ek.dts b/arch/arm/boot/dts/at91sam9n12ek.dts index d59b70c6a6a0..3d77dbe406f4 100644 --- a/arch/arm/boot/dts/at91sam9n12ek.dts +++ b/arch/arm/boot/dts/at91sam9n12ek.dts | |||
@@ -14,11 +14,11 @@ | |||
14 | compatible = "atmel,at91sam9n12ek", "atmel,at91sam9n12", "atmel,at91sam9"; | 14 | compatible = "atmel,at91sam9n12ek", "atmel,at91sam9n12", "atmel,at91sam9"; |
15 | 15 | ||
16 | chosen { | 16 | chosen { |
17 | bootargs = "mem=128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"; | 17 | bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"; |
18 | }; | 18 | }; |
19 | 19 | ||
20 | memory { | 20 | memory { |
21 | reg = <0x20000000 0x10000000>; | 21 | reg = <0x20000000 0x8000000>; |
22 | }; | 22 | }; |
23 | 23 | ||
24 | clocks { | 24 | clocks { |
diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi index b753855b2058..49e3c45818c2 100644 --- a/arch/arm/boot/dts/at91sam9x5ek.dtsi +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi | |||
@@ -94,8 +94,9 @@ | |||
94 | 94 | ||
95 | usb0: ohci@00600000 { | 95 | usb0: ohci@00600000 { |
96 | status = "okay"; | 96 | status = "okay"; |
97 | num-ports = <2>; | 97 | num-ports = <3>; |
98 | atmel,vbus-gpio = <&pioD 19 GPIO_ACTIVE_LOW | 98 | atmel,vbus-gpio = <0 /* &pioD 18 GPIO_ACTIVE_LOW *//* Activate to have access to port A */ |
99 | &pioD 19 GPIO_ACTIVE_LOW | ||
99 | &pioD 20 GPIO_ACTIVE_LOW | 100 | &pioD 20 GPIO_ACTIVE_LOW |
100 | >; | 101 | >; |
101 | }; | 102 | }; |
diff --git a/arch/arm/boot/dts/tegra20-seaboard.dts b/arch/arm/boot/dts/tegra20-seaboard.dts index 365760b33a26..40e6fb280333 100644 --- a/arch/arm/boot/dts/tegra20-seaboard.dts +++ b/arch/arm/boot/dts/tegra20-seaboard.dts | |||
@@ -830,6 +830,8 @@ | |||
830 | regulator-max-microvolt = <5000000>; | 830 | regulator-max-microvolt = <5000000>; |
831 | enable-active-high; | 831 | enable-active-high; |
832 | gpio = <&gpio 24 0>; /* PD0 */ | 832 | gpio = <&gpio 24 0>; /* PD0 */ |
833 | regulator-always-on; | ||
834 | regulator-boot-on; | ||
833 | }; | 835 | }; |
834 | }; | 836 | }; |
835 | 837 | ||
diff --git a/arch/arm/boot/dts/tegra20-trimslice.dts b/arch/arm/boot/dts/tegra20-trimslice.dts index ed4b901b0227..37c93d3c4812 100644 --- a/arch/arm/boot/dts/tegra20-trimslice.dts +++ b/arch/arm/boot/dts/tegra20-trimslice.dts | |||
@@ -412,6 +412,8 @@ | |||
412 | regulator-max-microvolt = <5000000>; | 412 | regulator-max-microvolt = <5000000>; |
413 | enable-active-high; | 413 | enable-active-high; |
414 | gpio = <&gpio 170 0>; /* PV2 */ | 414 | gpio = <&gpio 170 0>; /* PV2 */ |
415 | regulator-always-on; | ||
416 | regulator-boot-on; | ||
415 | }; | 417 | }; |
416 | }; | 418 | }; |
417 | 419 | ||
diff --git a/arch/arm/boot/dts/tegra20-whistler.dts b/arch/arm/boot/dts/tegra20-whistler.dts index ab67c94db280..a3d0ebad78a1 100644 --- a/arch/arm/boot/dts/tegra20-whistler.dts +++ b/arch/arm/boot/dts/tegra20-whistler.dts | |||
@@ -588,6 +588,8 @@ | |||
588 | regulator-max-microvolt = <5000000>; | 588 | regulator-max-microvolt = <5000000>; |
589 | enable-active-high; | 589 | enable-active-high; |
590 | gpio = <&tca6416 0 0>; /* GPIO_PMU0 */ | 590 | gpio = <&tca6416 0 0>; /* GPIO_PMU0 */ |
591 | regulator-always-on; | ||
592 | regulator-boot-on; | ||
591 | }; | 593 | }; |
592 | 594 | ||
593 | vbus3_reg: regulator@3 { | 595 | vbus3_reg: regulator@3 { |
@@ -598,6 +600,8 @@ | |||
598 | regulator-max-microvolt = <5000000>; | 600 | regulator-max-microvolt = <5000000>; |
599 | enable-active-high; | 601 | enable-active-high; |
600 | gpio = <&tca6416 1 0>; /* GPIO_PMU1 */ | 602 | gpio = <&tca6416 1 0>; /* GPIO_PMU1 */ |
603 | regulator-always-on; | ||
604 | regulator-boot-on; | ||
601 | }; | 605 | }; |
602 | }; | 606 | }; |
603 | 607 | ||
diff --git a/arch/arm/common/mcpm_head.S b/arch/arm/common/mcpm_head.S index 80f033614a1f..39c96df3477a 100644 --- a/arch/arm/common/mcpm_head.S +++ b/arch/arm/common/mcpm_head.S | |||
@@ -151,7 +151,7 @@ mcpm_setup_leave: | |||
151 | 151 | ||
152 | mov r0, #INBOUND_NOT_COMING_UP | 152 | mov r0, #INBOUND_NOT_COMING_UP |
153 | strb r0, [r8, #MCPM_SYNC_CLUSTER_INBOUND] | 153 | strb r0, [r8, #MCPM_SYNC_CLUSTER_INBOUND] |
154 | dsb | 154 | dsb st |
155 | sev | 155 | sev |
156 | 156 | ||
157 | mov r0, r11 | 157 | mov r0, r11 |
diff --git a/arch/arm/common/vlock.S b/arch/arm/common/vlock.S index ff198583f683..8b7df283fedf 100644 --- a/arch/arm/common/vlock.S +++ b/arch/arm/common/vlock.S | |||
@@ -42,7 +42,7 @@ | |||
42 | dmb | 42 | dmb |
43 | mov \rscratch, #0 | 43 | mov \rscratch, #0 |
44 | strb \rscratch, [\rbase, \rcpu] | 44 | strb \rscratch, [\rbase, \rcpu] |
45 | dsb | 45 | dsb st |
46 | sev | 46 | sev |
47 | .endm | 47 | .endm |
48 | 48 | ||
@@ -102,7 +102,7 @@ ENTRY(vlock_unlock) | |||
102 | dmb | 102 | dmb |
103 | mov r1, #VLOCK_OWNER_NONE | 103 | mov r1, #VLOCK_OWNER_NONE |
104 | strb r1, [r0, #VLOCK_OWNER_OFFSET] | 104 | strb r1, [r0, #VLOCK_OWNER_OFFSET] |
105 | dsb | 105 | dsb st |
106 | sev | 106 | sev |
107 | bx lr | 107 | bx lr |
108 | ENDPROC(vlock_unlock) | 108 | ENDPROC(vlock_unlock) |
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index a5fef710af32..fcc1b5bf6979 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -220,9 +220,9 @@ | |||
220 | #ifdef CONFIG_SMP | 220 | #ifdef CONFIG_SMP |
221 | #if __LINUX_ARM_ARCH__ >= 7 | 221 | #if __LINUX_ARM_ARCH__ >= 7 |
222 | .ifeqs "\mode","arm" | 222 | .ifeqs "\mode","arm" |
223 | ALT_SMP(dmb) | 223 | ALT_SMP(dmb ish) |
224 | .else | 224 | .else |
225 | ALT_SMP(W(dmb)) | 225 | ALT_SMP(W(dmb) ish) |
226 | .endif | 226 | .endif |
227 | #elif __LINUX_ARM_ARCH__ == 6 | 227 | #elif __LINUX_ARM_ARCH__ == 6 |
228 | ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb | 228 | ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb |
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index 8dcd9c702d90..60f15e274e6d 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h | |||
@@ -14,27 +14,27 @@ | |||
14 | #endif | 14 | #endif |
15 | 15 | ||
16 | #if __LINUX_ARM_ARCH__ >= 7 | 16 | #if __LINUX_ARM_ARCH__ >= 7 |
17 | #define isb() __asm__ __volatile__ ("isb" : : : "memory") | 17 | #define isb(option) __asm__ __volatile__ ("isb " #option : : : "memory") |
18 | #define dsb() __asm__ __volatile__ ("dsb" : : : "memory") | 18 | #define dsb(option) __asm__ __volatile__ ("dsb " #option : : : "memory") |
19 | #define dmb() __asm__ __volatile__ ("dmb" : : : "memory") | 19 | #define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory") |
20 | #elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6 | 20 | #elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6 |
21 | #define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ | 21 | #define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ |
22 | : : "r" (0) : "memory") | 22 | : : "r" (0) : "memory") |
23 | #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ | 23 | #define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ |
24 | : : "r" (0) : "memory") | 24 | : : "r" (0) : "memory") |
25 | #define dmb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ | 25 | #define dmb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ |
26 | : : "r" (0) : "memory") | 26 | : : "r" (0) : "memory") |
27 | #elif defined(CONFIG_CPU_FA526) | 27 | #elif defined(CONFIG_CPU_FA526) |
28 | #define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ | 28 | #define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ |
29 | : : "r" (0) : "memory") | 29 | : : "r" (0) : "memory") |
30 | #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ | 30 | #define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ |
31 | : : "r" (0) : "memory") | 31 | : : "r" (0) : "memory") |
32 | #define dmb() __asm__ __volatile__ ("" : : : "memory") | 32 | #define dmb(x) __asm__ __volatile__ ("" : : : "memory") |
33 | #else | 33 | #else |
34 | #define isb() __asm__ __volatile__ ("" : : : "memory") | 34 | #define isb(x) __asm__ __volatile__ ("" : : : "memory") |
35 | #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ | 35 | #define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ |
36 | : : "r" (0) : "memory") | 36 | : : "r" (0) : "memory") |
37 | #define dmb() __asm__ __volatile__ ("" : : : "memory") | 37 | #define dmb(x) __asm__ __volatile__ ("" : : : "memory") |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | #ifdef CONFIG_ARCH_HAS_BARRIERS | 40 | #ifdef CONFIG_ARCH_HAS_BARRIERS |
@@ -42,7 +42,7 @@ | |||
42 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) | 42 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) |
43 | #define mb() do { dsb(); outer_sync(); } while (0) | 43 | #define mb() do { dsb(); outer_sync(); } while (0) |
44 | #define rmb() dsb() | 44 | #define rmb() dsb() |
45 | #define wmb() mb() | 45 | #define wmb() do { dsb(st); outer_sync(); } while (0) |
46 | #else | 46 | #else |
47 | #define mb() barrier() | 47 | #define mb() barrier() |
48 | #define rmb() barrier() | 48 | #define rmb() barrier() |
@@ -54,9 +54,9 @@ | |||
54 | #define smp_rmb() barrier() | 54 | #define smp_rmb() barrier() |
55 | #define smp_wmb() barrier() | 55 | #define smp_wmb() barrier() |
56 | #else | 56 | #else |
57 | #define smp_mb() dmb() | 57 | #define smp_mb() dmb(ish) |
58 | #define smp_rmb() dmb() | 58 | #define smp_rmb() smp_mb() |
59 | #define smp_wmb() dmb() | 59 | #define smp_wmb() dmb(ishst) |
60 | #endif | 60 | #endif |
61 | 61 | ||
62 | #define read_barrier_depends() do { } while(0) | 62 | #define read_barrier_depends() do { } while(0) |
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 17d0ae8672fa..15f2d5bf8875 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
@@ -268,8 +268,7 @@ extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr | |||
268 | * Harvard caches are synchronised for the user space address range. | 268 | * Harvard caches are synchronised for the user space address range. |
269 | * This is used for the ARM private sys_cacheflush system call. | 269 | * This is used for the ARM private sys_cacheflush system call. |
270 | */ | 270 | */ |
271 | #define flush_cache_user_range(start,end) \ | 271 | #define flush_cache_user_range(s,e) __cpuc_coherent_user_range(s,e) |
272 | __cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end)) | ||
273 | 272 | ||
274 | /* | 273 | /* |
275 | * Perform necessary cache operations to ensure that data previously | 274 | * Perform necessary cache operations to ensure that data previously |
@@ -352,7 +351,7 @@ static inline void flush_cache_vmap(unsigned long start, unsigned long end) | |||
352 | * set_pte_at() called from vmap_pte_range() does not | 351 | * set_pte_at() called from vmap_pte_range() does not |
353 | * have a DSB after cleaning the cache line. | 352 | * have a DSB after cleaning the cache line. |
354 | */ | 353 | */ |
355 | dsb(); | 354 | dsb(ishst); |
356 | } | 355 | } |
357 | 356 | ||
358 | static inline void flush_cache_vunmap(unsigned long start, unsigned long end) | 357 | static inline void flush_cache_vunmap(unsigned long start, unsigned long end) |
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index 441efc491b50..69b879ac0289 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
@@ -65,12 +65,12 @@ struct machine_desc { | |||
65 | /* | 65 | /* |
66 | * Current machine - only accessible during boot. | 66 | * Current machine - only accessible during boot. |
67 | */ | 67 | */ |
68 | extern struct machine_desc *machine_desc; | 68 | extern const struct machine_desc *machine_desc; |
69 | 69 | ||
70 | /* | 70 | /* |
71 | * Machine type table - also only accessible during boot | 71 | * Machine type table - also only accessible during boot |
72 | */ | 72 | */ |
73 | extern struct machine_desc __arch_info_begin[], __arch_info_end[]; | 73 | extern const struct machine_desc __arch_info_begin[], __arch_info_end[]; |
74 | #define for_each_machine_desc(p) \ | 74 | #define for_each_machine_desc(p) \ |
75 | for (p = __arch_info_begin; p < __arch_info_end; p++) | 75 | for (p = __arch_info_begin; p < __arch_info_end; p++) |
76 | 76 | ||
diff --git a/arch/arm/include/asm/memblock.h b/arch/arm/include/asm/memblock.h index 00ca5f92648e..c2f5102ae659 100644 --- a/arch/arm/include/asm/memblock.h +++ b/arch/arm/include/asm/memblock.h | |||
@@ -4,8 +4,7 @@ | |||
4 | struct meminfo; | 4 | struct meminfo; |
5 | struct machine_desc; | 5 | struct machine_desc; |
6 | 6 | ||
7 | extern void arm_memblock_init(struct meminfo *, struct machine_desc *); | 7 | void arm_memblock_init(struct meminfo *, const struct machine_desc *); |
8 | |||
9 | phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align); | 8 | phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align); |
10 | 9 | ||
11 | #endif | 10 | #endif |
diff --git a/arch/arm/include/asm/module.h b/arch/arm/include/asm/module.h index 0d3a28dbc8e5..ed690c49ef93 100644 --- a/arch/arm/include/asm/module.h +++ b/arch/arm/include/asm/module.h | |||
@@ -12,6 +12,8 @@ enum { | |||
12 | ARM_SEC_CORE, | 12 | ARM_SEC_CORE, |
13 | ARM_SEC_EXIT, | 13 | ARM_SEC_EXIT, |
14 | ARM_SEC_DEVEXIT, | 14 | ARM_SEC_DEVEXIT, |
15 | ARM_SEC_HOT, | ||
16 | ARM_SEC_UNLIKELY, | ||
15 | ARM_SEC_MAX, | 17 | ARM_SEC_MAX, |
16 | }; | 18 | }; |
17 | 19 | ||
diff --git a/arch/arm/include/asm/neon.h b/arch/arm/include/asm/neon.h new file mode 100644 index 000000000000..8f730fe70093 --- /dev/null +++ b/arch/arm/include/asm/neon.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/include/asm/neon.h | ||
3 | * | ||
4 | * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <asm/hwcap.h> | ||
12 | |||
13 | #define cpu_has_neon() (!!(elf_hwcap & HWCAP_NEON)) | ||
14 | |||
15 | #ifdef __ARM_NEON__ | ||
16 | |||
17 | /* | ||
18 | * If you are affected by the BUILD_BUG below, it probably means that you are | ||
19 | * using NEON code /and/ calling the kernel_neon_begin() function from the same | ||
20 | * compilation unit. To prevent issues that may arise from GCC reordering or | ||
21 | * generating(1) NEON instructions outside of these begin/end functions, the | ||
22 | * only supported way of using NEON code in the kernel is by isolating it in a | ||
23 | * separate compilation unit, and calling it from another unit from inside a | ||
24 | * kernel_neon_begin/kernel_neon_end pair. | ||
25 | * | ||
26 | * (1) Current GCC (4.7) might generate NEON instructions at O3 level if | ||
27 | * -mpfu=neon is set. | ||
28 | */ | ||
29 | |||
30 | #define kernel_neon_begin() \ | ||
31 | BUILD_BUG_ON_MSG(1, "kernel_neon_begin() called from NEON code") | ||
32 | |||
33 | #else | ||
34 | void kernel_neon_begin(void); | ||
35 | #endif | ||
36 | void kernel_neon_end(void); | ||
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 04aeb02d2e11..be956dbf6bae 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
@@ -100,7 +100,7 @@ extern pgprot_t pgprot_s2_device; | |||
100 | #define PAGE_HYP _MOD_PROT(pgprot_kernel, L_PTE_HYP) | 100 | #define PAGE_HYP _MOD_PROT(pgprot_kernel, L_PTE_HYP) |
101 | #define PAGE_HYP_DEVICE _MOD_PROT(pgprot_hyp_device, L_PTE_HYP) | 101 | #define PAGE_HYP_DEVICE _MOD_PROT(pgprot_hyp_device, L_PTE_HYP) |
102 | #define PAGE_S2 _MOD_PROT(pgprot_s2, L_PTE_S2_RDONLY) | 102 | #define PAGE_S2 _MOD_PROT(pgprot_s2, L_PTE_S2_RDONLY) |
103 | #define PAGE_S2_DEVICE _MOD_PROT(pgprot_s2_device, L_PTE_USER | L_PTE_S2_RDONLY) | 103 | #define PAGE_S2_DEVICE _MOD_PROT(pgprot_s2_device, L_PTE_S2_RDWR) |
104 | 104 | ||
105 | #define __PAGE_NONE __pgprot(_L_PTE_DEFAULT | L_PTE_RDONLY | L_PTE_XN | L_PTE_NONE) | 105 | #define __PAGE_NONE __pgprot(_L_PTE_DEFAULT | L_PTE_RDONLY | L_PTE_XN | L_PTE_NONE) |
106 | #define __PAGE_SHARED __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_XN) | 106 | #define __PAGE_SHARED __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_XN) |
diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h index a219227c3e43..4a2985e21969 100644 --- a/arch/arm/include/asm/prom.h +++ b/arch/arm/include/asm/prom.h | |||
@@ -15,13 +15,13 @@ | |||
15 | 15 | ||
16 | #ifdef CONFIG_OF | 16 | #ifdef CONFIG_OF |
17 | 17 | ||
18 | extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys); | 18 | extern const struct machine_desc *setup_machine_fdt(unsigned int dt_phys); |
19 | extern void arm_dt_memblock_reserve(void); | 19 | extern void arm_dt_memblock_reserve(void); |
20 | extern void __init arm_dt_init_cpu_maps(void); | 20 | extern void __init arm_dt_init_cpu_maps(void); |
21 | 21 | ||
22 | #else /* CONFIG_OF */ | 22 | #else /* CONFIG_OF */ |
23 | 23 | ||
24 | static inline struct machine_desc *setup_machine_fdt(unsigned int dt_phys) | 24 | static inline const struct machine_desc *setup_machine_fdt(unsigned int dt_phys) |
25 | { | 25 | { |
26 | return NULL; | 26 | return NULL; |
27 | } | 27 | } |
diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index b07c09e5a0ac..4f2c28060c9a 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h | |||
@@ -46,7 +46,7 @@ static inline void dsb_sev(void) | |||
46 | { | 46 | { |
47 | #if __LINUX_ARM_ARCH__ >= 7 | 47 | #if __LINUX_ARM_ARCH__ >= 7 |
48 | __asm__ __volatile__ ( | 48 | __asm__ __volatile__ ( |
49 | "dsb\n" | 49 | "dsb ishst\n" |
50 | SEV | 50 | SEV |
51 | ); | 51 | ); |
52 | #else | 52 | #else |
diff --git a/arch/arm/include/asm/switch_to.h b/arch/arm/include/asm/switch_to.h index fa09e6b49bf1..c99e259469f7 100644 --- a/arch/arm/include/asm/switch_to.h +++ b/arch/arm/include/asm/switch_to.h | |||
@@ -4,6 +4,16 @@ | |||
4 | #include <linux/thread_info.h> | 4 | #include <linux/thread_info.h> |
5 | 5 | ||
6 | /* | 6 | /* |
7 | * For v7 SMP cores running a preemptible kernel we may be pre-empted | ||
8 | * during a TLB maintenance operation, so execute an inner-shareable dsb | ||
9 | * to ensure that the maintenance completes in case we migrate to another | ||
10 | * CPU. | ||
11 | */ | ||
12 | #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) && defined(CONFIG_CPU_V7) | ||
13 | #define finish_arch_switch(prev) dsb(ish) | ||
14 | #endif | ||
15 | |||
16 | /* | ||
7 | * switch_to(prev, next) should switch from task `prev' to `next' | 17 | * switch_to(prev, next) should switch from task `prev' to `next' |
8 | * `prev' will never be the same as `next'. schedule() itself | 18 | * `prev' will never be the same as `next'. schedule() itself |
9 | * contains the memory barrier to tell GCC not to cache `current'. | 19 | * contains the memory barrier to tell GCC not to cache `current'. |
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 2b8114fcba09..df5e13d64f2c 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h | |||
@@ -43,6 +43,16 @@ struct cpu_context_save { | |||
43 | __u32 extra[2]; /* Xscale 'acc' register, etc */ | 43 | __u32 extra[2]; /* Xscale 'acc' register, etc */ |
44 | }; | 44 | }; |
45 | 45 | ||
46 | struct arm_restart_block { | ||
47 | union { | ||
48 | /* For user cache flushing */ | ||
49 | struct { | ||
50 | unsigned long start; | ||
51 | unsigned long end; | ||
52 | } cache; | ||
53 | }; | ||
54 | }; | ||
55 | |||
46 | /* | 56 | /* |
47 | * low level task data that entry.S needs immediate access to. | 57 | * low level task data that entry.S needs immediate access to. |
48 | * __switch_to() assumes cpu_context follows immediately after cpu_domain. | 58 | * __switch_to() assumes cpu_context follows immediately after cpu_domain. |
@@ -68,6 +78,7 @@ struct thread_info { | |||
68 | unsigned long thumbee_state; /* ThumbEE Handler Base register */ | 78 | unsigned long thumbee_state; /* ThumbEE Handler Base register */ |
69 | #endif | 79 | #endif |
70 | struct restart_block restart_block; | 80 | struct restart_block restart_block; |
81 | struct arm_restart_block arm_restart_block; | ||
71 | }; | 82 | }; |
72 | 83 | ||
73 | #define INIT_THREAD_INFO(tsk) \ | 84 | #define INIT_THREAD_INFO(tsk) \ |
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index f467e9b3f8d5..38960264040c 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
@@ -319,67 +319,110 @@ extern struct cpu_tlb_fns cpu_tlb; | |||
319 | #define tlb_op(f, regs, arg) __tlb_op(f, "p15, 0, %0, " regs, arg) | 319 | #define tlb_op(f, regs, arg) __tlb_op(f, "p15, 0, %0, " regs, arg) |
320 | #define tlb_l2_op(f, regs, arg) __tlb_op(f, "p15, 1, %0, " regs, arg) | 320 | #define tlb_l2_op(f, regs, arg) __tlb_op(f, "p15, 1, %0, " regs, arg) |
321 | 321 | ||
322 | static inline void local_flush_tlb_all(void) | 322 | static inline void __local_flush_tlb_all(void) |
323 | { | 323 | { |
324 | const int zero = 0; | 324 | const int zero = 0; |
325 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 325 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
326 | 326 | ||
327 | if (tlb_flag(TLB_WB)) | ||
328 | dsb(); | ||
329 | |||
330 | tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero); | 327 | tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero); |
331 | tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero); | 328 | tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero); |
332 | tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero); | 329 | tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero); |
333 | tlb_op(TLB_V7_UIS_FULL, "c8, c3, 0", zero); | 330 | } |
331 | |||
332 | static inline void local_flush_tlb_all(void) | ||
333 | { | ||
334 | const int zero = 0; | ||
335 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
336 | |||
337 | if (tlb_flag(TLB_WB)) | ||
338 | dsb(nshst); | ||
339 | |||
340 | __local_flush_tlb_all(); | ||
341 | tlb_op(TLB_V7_UIS_FULL, "c8, c7, 0", zero); | ||
334 | 342 | ||
335 | if (tlb_flag(TLB_BARRIER)) { | 343 | if (tlb_flag(TLB_BARRIER)) { |
336 | dsb(); | 344 | dsb(nsh); |
337 | isb(); | 345 | isb(); |
338 | } | 346 | } |
339 | } | 347 | } |
340 | 348 | ||
341 | static inline void local_flush_tlb_mm(struct mm_struct *mm) | 349 | static inline void __flush_tlb_all(void) |
342 | { | 350 | { |
343 | const int zero = 0; | 351 | const int zero = 0; |
344 | const int asid = ASID(mm); | ||
345 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 352 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
346 | 353 | ||
347 | if (tlb_flag(TLB_WB)) | 354 | if (tlb_flag(TLB_WB)) |
348 | dsb(); | 355 | dsb(ishst); |
356 | |||
357 | __local_flush_tlb_all(); | ||
358 | tlb_op(TLB_V7_UIS_FULL, "c8, c3, 0", zero); | ||
359 | |||
360 | if (tlb_flag(TLB_BARRIER)) { | ||
361 | dsb(ish); | ||
362 | isb(); | ||
363 | } | ||
364 | } | ||
365 | |||
366 | static inline void __local_flush_tlb_mm(struct mm_struct *mm) | ||
367 | { | ||
368 | const int zero = 0; | ||
369 | const int asid = ASID(mm); | ||
370 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
349 | 371 | ||
350 | if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) { | 372 | if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) { |
351 | if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) { | 373 | if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) { |
352 | tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero); | 374 | tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero); |
353 | tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero); | 375 | tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero); |
354 | tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero); | 376 | tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero); |
355 | } | 377 | } |
356 | put_cpu(); | ||
357 | } | 378 | } |
358 | 379 | ||
359 | tlb_op(TLB_V6_U_ASID, "c8, c7, 2", asid); | 380 | tlb_op(TLB_V6_U_ASID, "c8, c7, 2", asid); |
360 | tlb_op(TLB_V6_D_ASID, "c8, c6, 2", asid); | 381 | tlb_op(TLB_V6_D_ASID, "c8, c6, 2", asid); |
361 | tlb_op(TLB_V6_I_ASID, "c8, c5, 2", asid); | 382 | tlb_op(TLB_V6_I_ASID, "c8, c5, 2", asid); |
383 | } | ||
384 | |||
385 | static inline void local_flush_tlb_mm(struct mm_struct *mm) | ||
386 | { | ||
387 | const int asid = ASID(mm); | ||
388 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
389 | |||
390 | if (tlb_flag(TLB_WB)) | ||
391 | dsb(nshst); | ||
392 | |||
393 | __local_flush_tlb_mm(mm); | ||
394 | tlb_op(TLB_V7_UIS_ASID, "c8, c7, 2", asid); | ||
395 | |||
396 | if (tlb_flag(TLB_BARRIER)) | ||
397 | dsb(nsh); | ||
398 | } | ||
399 | |||
400 | static inline void __flush_tlb_mm(struct mm_struct *mm) | ||
401 | { | ||
402 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
403 | |||
404 | if (tlb_flag(TLB_WB)) | ||
405 | dsb(ishst); | ||
406 | |||
407 | __local_flush_tlb_mm(mm); | ||
362 | #ifdef CONFIG_ARM_ERRATA_720789 | 408 | #ifdef CONFIG_ARM_ERRATA_720789 |
363 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 0", zero); | 409 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 0", 0); |
364 | #else | 410 | #else |
365 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 2", asid); | 411 | tlb_op(TLB_V7_UIS_ASID, "c8, c3, 2", ASID(mm)); |
366 | #endif | 412 | #endif |
367 | 413 | ||
368 | if (tlb_flag(TLB_BARRIER)) | 414 | if (tlb_flag(TLB_BARRIER)) |
369 | dsb(); | 415 | dsb(ish); |
370 | } | 416 | } |
371 | 417 | ||
372 | static inline void | 418 | static inline void |
373 | local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | 419 | __local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) |
374 | { | 420 | { |
375 | const int zero = 0; | 421 | const int zero = 0; |
376 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 422 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
377 | 423 | ||
378 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); | 424 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); |
379 | 425 | ||
380 | if (tlb_flag(TLB_WB)) | ||
381 | dsb(); | ||
382 | |||
383 | if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) && | 426 | if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) && |
384 | cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { | 427 | cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { |
385 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr); | 428 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr); |
@@ -392,6 +435,36 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
392 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", uaddr); | 435 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", uaddr); |
393 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", uaddr); | 436 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", uaddr); |
394 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", uaddr); | 437 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", uaddr); |
438 | } | ||
439 | |||
440 | static inline void | ||
441 | local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | ||
442 | { | ||
443 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
444 | |||
445 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); | ||
446 | |||
447 | if (tlb_flag(TLB_WB)) | ||
448 | dsb(nshst); | ||
449 | |||
450 | __local_flush_tlb_page(vma, uaddr); | ||
451 | tlb_op(TLB_V7_UIS_PAGE, "c8, c7, 1", uaddr); | ||
452 | |||
453 | if (tlb_flag(TLB_BARRIER)) | ||
454 | dsb(nsh); | ||
455 | } | ||
456 | |||
457 | static inline void | ||
458 | __flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | ||
459 | { | ||
460 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
461 | |||
462 | uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); | ||
463 | |||
464 | if (tlb_flag(TLB_WB)) | ||
465 | dsb(ishst); | ||
466 | |||
467 | __local_flush_tlb_page(vma, uaddr); | ||
395 | #ifdef CONFIG_ARM_ERRATA_720789 | 468 | #ifdef CONFIG_ARM_ERRATA_720789 |
396 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 3", uaddr & PAGE_MASK); | 469 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 3", uaddr & PAGE_MASK); |
397 | #else | 470 | #else |
@@ -399,19 +472,14 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
399 | #endif | 472 | #endif |
400 | 473 | ||
401 | if (tlb_flag(TLB_BARRIER)) | 474 | if (tlb_flag(TLB_BARRIER)) |
402 | dsb(); | 475 | dsb(ish); |
403 | } | 476 | } |
404 | 477 | ||
405 | static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | 478 | static inline void __local_flush_tlb_kernel_page(unsigned long kaddr) |
406 | { | 479 | { |
407 | const int zero = 0; | 480 | const int zero = 0; |
408 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 481 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
409 | 482 | ||
410 | kaddr &= PAGE_MASK; | ||
411 | |||
412 | if (tlb_flag(TLB_WB)) | ||
413 | dsb(); | ||
414 | |||
415 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr); | 483 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr); |
416 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr); | 484 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr); |
417 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr); | 485 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr); |
@@ -421,26 +489,75 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | |||
421 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", kaddr); | 489 | tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", kaddr); |
422 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", kaddr); | 490 | tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", kaddr); |
423 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", kaddr); | 491 | tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", kaddr); |
492 | } | ||
493 | |||
494 | static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | ||
495 | { | ||
496 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
497 | |||
498 | kaddr &= PAGE_MASK; | ||
499 | |||
500 | if (tlb_flag(TLB_WB)) | ||
501 | dsb(nshst); | ||
502 | |||
503 | __local_flush_tlb_kernel_page(kaddr); | ||
504 | tlb_op(TLB_V7_UIS_PAGE, "c8, c7, 1", kaddr); | ||
505 | |||
506 | if (tlb_flag(TLB_BARRIER)) { | ||
507 | dsb(nsh); | ||
508 | isb(); | ||
509 | } | ||
510 | } | ||
511 | |||
512 | static inline void __flush_tlb_kernel_page(unsigned long kaddr) | ||
513 | { | ||
514 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
515 | |||
516 | kaddr &= PAGE_MASK; | ||
517 | |||
518 | if (tlb_flag(TLB_WB)) | ||
519 | dsb(ishst); | ||
520 | |||
521 | __local_flush_tlb_kernel_page(kaddr); | ||
424 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 1", kaddr); | 522 | tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 1", kaddr); |
425 | 523 | ||
426 | if (tlb_flag(TLB_BARRIER)) { | 524 | if (tlb_flag(TLB_BARRIER)) { |
427 | dsb(); | 525 | dsb(ish); |
428 | isb(); | 526 | isb(); |
429 | } | 527 | } |
430 | } | 528 | } |
431 | 529 | ||
530 | /* | ||
531 | * Branch predictor maintenance is paired with full TLB invalidation, so | ||
532 | * there is no need for any barriers here. | ||
533 | */ | ||
534 | static inline void __local_flush_bp_all(void) | ||
535 | { | ||
536 | const int zero = 0; | ||
537 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
538 | |||
539 | if (tlb_flag(TLB_V6_BP)) | ||
540 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero)); | ||
541 | } | ||
542 | |||
432 | static inline void local_flush_bp_all(void) | 543 | static inline void local_flush_bp_all(void) |
433 | { | 544 | { |
434 | const int zero = 0; | 545 | const int zero = 0; |
435 | const unsigned int __tlb_flag = __cpu_tlb_flags; | 546 | const unsigned int __tlb_flag = __cpu_tlb_flags; |
436 | 547 | ||
548 | __local_flush_bp_all(); | ||
437 | if (tlb_flag(TLB_V7_UIS_BP)) | 549 | if (tlb_flag(TLB_V7_UIS_BP)) |
438 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero)); | ||
439 | else if (tlb_flag(TLB_V6_BP)) | ||
440 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero)); | 550 | asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero)); |
551 | } | ||
441 | 552 | ||
442 | if (tlb_flag(TLB_BARRIER)) | 553 | static inline void __flush_bp_all(void) |
443 | isb(); | 554 | { |
555 | const int zero = 0; | ||
556 | const unsigned int __tlb_flag = __cpu_tlb_flags; | ||
557 | |||
558 | __local_flush_bp_all(); | ||
559 | if (tlb_flag(TLB_V7_UIS_BP)) | ||
560 | asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero)); | ||
444 | } | 561 | } |
445 | 562 | ||
446 | #include <asm/cputype.h> | 563 | #include <asm/cputype.h> |
@@ -461,7 +578,7 @@ static inline void dummy_flush_tlb_a15_erratum(void) | |||
461 | * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0. | 578 | * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0. |
462 | */ | 579 | */ |
463 | asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0)); | 580 | asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0)); |
464 | dsb(); | 581 | dsb(ish); |
465 | } | 582 | } |
466 | #else | 583 | #else |
467 | static inline int erratum_a15_798181(void) | 584 | static inline int erratum_a15_798181(void) |
@@ -495,7 +612,7 @@ static inline void flush_pmd_entry(void *pmd) | |||
495 | tlb_l2_op(TLB_L2CLEAN_FR, "c15, c9, 1 @ L2 flush_pmd", pmd); | 612 | tlb_l2_op(TLB_L2CLEAN_FR, "c15, c9, 1 @ L2 flush_pmd", pmd); |
496 | 613 | ||
497 | if (tlb_flag(TLB_WB)) | 614 | if (tlb_flag(TLB_WB)) |
498 | dsb(); | 615 | dsb(ishst); |
499 | } | 616 | } |
500 | 617 | ||
501 | static inline void clean_pmd_entry(void *pmd) | 618 | static inline void clean_pmd_entry(void *pmd) |
diff --git a/arch/arm/include/asm/types.h b/arch/arm/include/asm/types.h new file mode 100644 index 000000000000..a53cdb8f068c --- /dev/null +++ b/arch/arm/include/asm/types.h | |||
@@ -0,0 +1,40 @@ | |||
1 | #ifndef _ASM_TYPES_H | ||
2 | #define _ASM_TYPES_H | ||
3 | |||
4 | #include <asm-generic/int-ll64.h> | ||
5 | |||
6 | /* | ||
7 | * The C99 types uintXX_t that are usually defined in 'stdint.h' are not as | ||
8 | * unambiguous on ARM as you would expect. For the types below, there is a | ||
9 | * difference on ARM between GCC built for bare metal ARM, GCC built for glibc | ||
10 | * and the kernel itself, which results in build errors if you try to build with | ||
11 | * -ffreestanding and include 'stdint.h' (such as when you include 'arm_neon.h' | ||
12 | * in order to use NEON intrinsics) | ||
13 | * | ||
14 | * As the typedefs for these types in 'stdint.h' are based on builtin defines | ||
15 | * supplied by GCC, we can tweak these to align with the kernel's idea of those | ||
16 | * types, so 'linux/types.h' and 'stdint.h' can be safely included from the same | ||
17 | * source file (provided that -ffreestanding is used). | ||
18 | * | ||
19 | * int32_t uint32_t uintptr_t | ||
20 | * bare metal GCC long unsigned long unsigned int | ||
21 | * glibc GCC int unsigned int unsigned int | ||
22 | * kernel int unsigned int unsigned long | ||
23 | */ | ||
24 | |||
25 | #ifdef __INT32_TYPE__ | ||
26 | #undef __INT32_TYPE__ | ||
27 | #define __INT32_TYPE__ int | ||
28 | #endif | ||
29 | |||
30 | #ifdef __UINT32_TYPE__ | ||
31 | #undef __UINT32_TYPE__ | ||
32 | #define __UINT32_TYPE__ unsigned int | ||
33 | #endif | ||
34 | |||
35 | #ifdef __UINTPTR_TYPE__ | ||
36 | #undef __UINTPTR_TYPE__ | ||
37 | #define __UINTPTR_TYPE__ unsigned long | ||
38 | #endif | ||
39 | |||
40 | #endif /* _ASM_TYPES_H */ | ||
diff --git a/arch/arm/include/asm/v7m.h b/arch/arm/include/asm/v7m.h index fa88d09fa3d9..615781c61627 100644 --- a/arch/arm/include/asm/v7m.h +++ b/arch/arm/include/asm/v7m.h | |||
@@ -15,6 +15,10 @@ | |||
15 | 15 | ||
16 | #define V7M_SCB_VTOR 0x08 | 16 | #define V7M_SCB_VTOR 0x08 |
17 | 17 | ||
18 | #define V7M_SCB_AIRCR 0x0c | ||
19 | #define V7M_SCB_AIRCR_VECTKEY (0x05fa << 16) | ||
20 | #define V7M_SCB_AIRCR_SYSRESETREQ (1 << 2) | ||
21 | |||
18 | #define V7M_SCB_SCR 0x10 | 22 | #define V7M_SCB_SCR 0x10 |
19 | #define V7M_SCB_SCR_SLEEPDEEP (1 << 2) | 23 | #define V7M_SCB_SCR_SLEEPDEEP (1 << 2) |
20 | 24 | ||
@@ -42,3 +46,11 @@ | |||
42 | */ | 46 | */ |
43 | #define EXC_RET_STACK_MASK 0x00000004 | 47 | #define EXC_RET_STACK_MASK 0x00000004 |
44 | #define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd | 48 | #define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd |
49 | |||
50 | #ifndef __ASSEMBLY__ | ||
51 | |||
52 | enum reboot_mode; | ||
53 | |||
54 | void armv7m_restart(enum reboot_mode mode, const char *cmd); | ||
55 | |||
56 | #endif /* __ASSEMBLY__ */ | ||
diff --git a/arch/arm/include/asm/xor.h b/arch/arm/include/asm/xor.h index 7604673dc427..4ffb26d4cad8 100644 --- a/arch/arm/include/asm/xor.h +++ b/arch/arm/include/asm/xor.h | |||
@@ -7,7 +7,10 @@ | |||
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/hardirq.h> | ||
10 | #include <asm-generic/xor.h> | 11 | #include <asm-generic/xor.h> |
12 | #include <asm/hwcap.h> | ||
13 | #include <asm/neon.h> | ||
11 | 14 | ||
12 | #define __XOR(a1, a2) a1 ^= a2 | 15 | #define __XOR(a1, a2) a1 ^= a2 |
13 | 16 | ||
@@ -138,4 +141,74 @@ static struct xor_block_template xor_block_arm4regs = { | |||
138 | xor_speed(&xor_block_arm4regs); \ | 141 | xor_speed(&xor_block_arm4regs); \ |
139 | xor_speed(&xor_block_8regs); \ | 142 | xor_speed(&xor_block_8regs); \ |
140 | xor_speed(&xor_block_32regs); \ | 143 | xor_speed(&xor_block_32regs); \ |
144 | NEON_TEMPLATES; \ | ||
141 | } while (0) | 145 | } while (0) |
146 | |||
147 | #ifdef CONFIG_KERNEL_MODE_NEON | ||
148 | |||
149 | extern struct xor_block_template const xor_block_neon_inner; | ||
150 | |||
151 | static void | ||
152 | xor_neon_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) | ||
153 | { | ||
154 | if (in_interrupt()) { | ||
155 | xor_arm4regs_2(bytes, p1, p2); | ||
156 | } else { | ||
157 | kernel_neon_begin(); | ||
158 | xor_block_neon_inner.do_2(bytes, p1, p2); | ||
159 | kernel_neon_end(); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | static void | ||
164 | xor_neon_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, | ||
165 | unsigned long *p3) | ||
166 | { | ||
167 | if (in_interrupt()) { | ||
168 | xor_arm4regs_3(bytes, p1, p2, p3); | ||
169 | } else { | ||
170 | kernel_neon_begin(); | ||
171 | xor_block_neon_inner.do_3(bytes, p1, p2, p3); | ||
172 | kernel_neon_end(); | ||
173 | } | ||
174 | } | ||
175 | |||
176 | static void | ||
177 | xor_neon_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, | ||
178 | unsigned long *p3, unsigned long *p4) | ||
179 | { | ||
180 | if (in_interrupt()) { | ||
181 | xor_arm4regs_4(bytes, p1, p2, p3, p4); | ||
182 | } else { | ||
183 | kernel_neon_begin(); | ||
184 | xor_block_neon_inner.do_4(bytes, p1, p2, p3, p4); | ||
185 | kernel_neon_end(); | ||
186 | } | ||
187 | } | ||
188 | |||
189 | static void | ||
190 | xor_neon_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, | ||
191 | unsigned long *p3, unsigned long *p4, unsigned long *p5) | ||
192 | { | ||
193 | if (in_interrupt()) { | ||
194 | xor_arm4regs_5(bytes, p1, p2, p3, p4, p5); | ||
195 | } else { | ||
196 | kernel_neon_begin(); | ||
197 | xor_block_neon_inner.do_5(bytes, p1, p2, p3, p4, p5); | ||
198 | kernel_neon_end(); | ||
199 | } | ||
200 | } | ||
201 | |||
202 | static struct xor_block_template xor_block_neon = { | ||
203 | .name = "neon", | ||
204 | .do_2 = xor_neon_2, | ||
205 | .do_3 = xor_neon_3, | ||
206 | .do_4 = xor_neon_4, | ||
207 | .do_5 = xor_neon_5 | ||
208 | }; | ||
209 | |||
210 | #define NEON_TEMPLATES \ | ||
211 | do { if (cpu_has_neon()) xor_speed(&xor_block_neon); } while (0) | ||
212 | #else | ||
213 | #define NEON_TEMPLATES | ||
214 | #endif | ||
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 86d10dd47dc4..5140df5f23aa 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -24,7 +24,7 @@ obj-$(CONFIG_ATAGS_PROC) += atags_proc.o | |||
24 | obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o | 24 | obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o |
25 | 25 | ||
26 | ifeq ($(CONFIG_CPU_V7M),y) | 26 | ifeq ($(CONFIG_CPU_V7M),y) |
27 | obj-y += entry-v7m.o | 27 | obj-y += entry-v7m.o v7m.o |
28 | else | 28 | else |
29 | obj-y += entry-armv.o | 29 | obj-y += entry-armv.o |
30 | endif | 30 | endif |
diff --git a/arch/arm/kernel/atags.h b/arch/arm/kernel/atags.h index 9edc9692332d..ec4164da6e30 100644 --- a/arch/arm/kernel/atags.h +++ b/arch/arm/kernel/atags.h | |||
@@ -7,9 +7,10 @@ static inline void save_atags(struct tag *tags) { } | |||
7 | void convert_to_tag_list(struct tag *tags); | 7 | void convert_to_tag_list(struct tag *tags); |
8 | 8 | ||
9 | #ifdef CONFIG_ATAGS | 9 | #ifdef CONFIG_ATAGS |
10 | struct machine_desc *setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr); | 10 | const struct machine_desc *setup_machine_tags(phys_addr_t __atags_pointer, |
11 | unsigned int machine_nr); | ||
11 | #else | 12 | #else |
12 | static inline struct machine_desc * | 13 | static inline const struct machine_desc * |
13 | setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr) | 14 | setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr) |
14 | { | 15 | { |
15 | early_print("no ATAGS support: can't continue\n"); | 16 | early_print("no ATAGS support: can't continue\n"); |
diff --git a/arch/arm/kernel/atags_parse.c b/arch/arm/kernel/atags_parse.c index 14512e6931d8..8c14de8180c0 100644 --- a/arch/arm/kernel/atags_parse.c +++ b/arch/arm/kernel/atags_parse.c | |||
@@ -178,11 +178,11 @@ static void __init squash_mem_tags(struct tag *tag) | |||
178 | tag->hdr.tag = ATAG_NONE; | 178 | tag->hdr.tag = ATAG_NONE; |
179 | } | 179 | } |
180 | 180 | ||
181 | struct machine_desc * __init setup_machine_tags(phys_addr_t __atags_pointer, | 181 | const struct machine_desc * __init |
182 | unsigned int machine_nr) | 182 | setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr) |
183 | { | 183 | { |
184 | struct tag *tags = (struct tag *)&default_tags; | 184 | struct tag *tags = (struct tag *)&default_tags; |
185 | struct machine_desc *mdesc = NULL, *p; | 185 | const struct machine_desc *mdesc = NULL, *p; |
186 | char *from = default_command_line; | 186 | char *from = default_command_line; |
187 | 187 | ||
188 | default_tags.mem.start = PHYS_OFFSET; | 188 | default_tags.mem.start = PHYS_OFFSET; |
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index 5859c8bc727c..eae1976f859d 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c | |||
@@ -176,10 +176,10 @@ void __init arm_dt_init_cpu_maps(void) | |||
176 | * If a dtb was passed to the kernel in r2, then use it to choose the | 176 | * If a dtb was passed to the kernel in r2, then use it to choose the |
177 | * correct machine_desc and to setup the system. | 177 | * correct machine_desc and to setup the system. |
178 | */ | 178 | */ |
179 | struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) | 179 | const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) |
180 | { | 180 | { |
181 | struct boot_param_header *devtree; | 181 | struct boot_param_header *devtree; |
182 | struct machine_desc *mdesc, *mdesc_best = NULL; | 182 | const struct machine_desc *mdesc, *mdesc_best = NULL; |
183 | unsigned int score, mdesc_score = ~1; | 183 | unsigned int score, mdesc_score = ~1; |
184 | unsigned long dt_root; | 184 | unsigned long dt_root; |
185 | const char *model; | 185 | const char *model; |
@@ -188,7 +188,7 @@ struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) | |||
188 | DT_MACHINE_START(GENERIC_DT, "Generic DT based system") | 188 | DT_MACHINE_START(GENERIC_DT, "Generic DT based system") |
189 | MACHINE_END | 189 | MACHINE_END |
190 | 190 | ||
191 | mdesc_best = (struct machine_desc *)&__mach_desc_GENERIC_DT; | 191 | mdesc_best = &__mach_desc_GENERIC_DT; |
192 | #endif | 192 | #endif |
193 | 193 | ||
194 | if (!dt_phys) | 194 | if (!dt_phys) |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 94104bf69719..74ad15d1a065 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -442,10 +442,10 @@ local_restart: | |||
442 | ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine | 442 | ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine |
443 | 443 | ||
444 | add r1, sp, #S_OFF | 444 | add r1, sp, #S_OFF |
445 | 2: mov why, #0 @ no longer a real syscall | ||
446 | cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) | 445 | cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) |
447 | eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back | 446 | eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back |
448 | bcs arm_syscall | 447 | bcs arm_syscall |
448 | 2: mov why, #0 @ no longer a real syscall | ||
449 | b sys_ni_syscall @ not private func | 449 | b sys_ni_syscall @ not private func |
450 | 450 | ||
451 | #if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI) | 451 | #if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI) |
diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index fc7920288a3d..918875d96d5d 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c | |||
@@ -89,7 +89,8 @@ void set_fiq_handler(void *start, unsigned int length) | |||
89 | 89 | ||
90 | memcpy(base + offset, start, length); | 90 | memcpy(base + offset, start, length); |
91 | if (!cache_is_vipt_nonaliasing()) | 91 | if (!cache_is_vipt_nonaliasing()) |
92 | flush_icache_range(base + offset, offset + length); | 92 | flush_icache_range((unsigned long)base + offset, offset + |
93 | length); | ||
93 | flush_icache_range(0xffff0000 + offset, 0xffff0000 + offset + length); | 94 | flush_icache_range(0xffff0000 + offset, 0xffff0000 + offset + length); |
94 | } | 95 | } |
95 | 96 | ||
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index d7c82df69243..57221e349a7c 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -82,6 +82,7 @@ void machine_crash_nonpanic_core(void *unused) | |||
82 | crash_save_cpu(®s, smp_processor_id()); | 82 | crash_save_cpu(®s, smp_processor_id()); |
83 | flush_cache_all(); | 83 | flush_cache_all(); |
84 | 84 | ||
85 | set_cpu_online(smp_processor_id(), false); | ||
85 | atomic_dec(&waiting_for_crash_ipi); | 86 | atomic_dec(&waiting_for_crash_ipi); |
86 | while (1) | 87 | while (1) |
87 | cpu_relax(); | 88 | cpu_relax(); |
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c index 85c3fb6c93c2..084dc8896986 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c | |||
@@ -292,12 +292,20 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, | |||
292 | maps[ARM_SEC_CORE].unw_sec = s; | 292 | maps[ARM_SEC_CORE].unw_sec = s; |
293 | else if (strcmp(".ARM.exidx.exit.text", secname) == 0) | 293 | else if (strcmp(".ARM.exidx.exit.text", secname) == 0) |
294 | maps[ARM_SEC_EXIT].unw_sec = s; | 294 | maps[ARM_SEC_EXIT].unw_sec = s; |
295 | else if (strcmp(".ARM.exidx.text.unlikely", secname) == 0) | ||
296 | maps[ARM_SEC_UNLIKELY].unw_sec = s; | ||
297 | else if (strcmp(".ARM.exidx.text.hot", secname) == 0) | ||
298 | maps[ARM_SEC_HOT].unw_sec = s; | ||
295 | else if (strcmp(".init.text", secname) == 0) | 299 | else if (strcmp(".init.text", secname) == 0) |
296 | maps[ARM_SEC_INIT].txt_sec = s; | 300 | maps[ARM_SEC_INIT].txt_sec = s; |
297 | else if (strcmp(".text", secname) == 0) | 301 | else if (strcmp(".text", secname) == 0) |
298 | maps[ARM_SEC_CORE].txt_sec = s; | 302 | maps[ARM_SEC_CORE].txt_sec = s; |
299 | else if (strcmp(".exit.text", secname) == 0) | 303 | else if (strcmp(".exit.text", secname) == 0) |
300 | maps[ARM_SEC_EXIT].txt_sec = s; | 304 | maps[ARM_SEC_EXIT].txt_sec = s; |
305 | else if (strcmp(".text.unlikely", secname) == 0) | ||
306 | maps[ARM_SEC_UNLIKELY].txt_sec = s; | ||
307 | else if (strcmp(".text.hot", secname) == 0) | ||
308 | maps[ARM_SEC_HOT].txt_sec = s; | ||
301 | } | 309 | } |
302 | 310 | ||
303 | for (i = 0; i < ARM_SEC_MAX; i++) | 311 | for (i = 0; i < ARM_SEC_MAX; i++) |
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index aebe0e99c153..8d6147b2001f 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c | |||
@@ -118,7 +118,8 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler) | |||
118 | continue; | 118 | continue; |
119 | } | 119 | } |
120 | 120 | ||
121 | err = request_irq(irq, handler, IRQF_NOBALANCING, "arm-pmu", | 121 | err = request_irq(irq, handler, |
122 | IRQF_NOBALANCING | IRQF_NO_THREAD, "arm-pmu", | ||
122 | cpu_pmu); | 123 | cpu_pmu); |
123 | if (err) { | 124 | if (err) { |
124 | pr_err("unable to request IRQ%d for ARM PMU counters\n", | 125 | pr_err("unable to request IRQ%d for ARM PMU counters\n", |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index afc2489ee13b..0e1e2b3afa45 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -72,10 +72,10 @@ static int __init fpe_setup(char *line) | |||
72 | __setup("fpe=", fpe_setup); | 72 | __setup("fpe=", fpe_setup); |
73 | #endif | 73 | #endif |
74 | 74 | ||
75 | extern void paging_init(struct machine_desc *desc); | 75 | extern void paging_init(const struct machine_desc *desc); |
76 | extern void sanity_check_meminfo(void); | 76 | extern void sanity_check_meminfo(void); |
77 | extern enum reboot_mode reboot_mode; | 77 | extern enum reboot_mode reboot_mode; |
78 | extern void setup_dma_zone(struct machine_desc *desc); | 78 | extern void setup_dma_zone(const struct machine_desc *desc); |
79 | 79 | ||
80 | unsigned int processor_id; | 80 | unsigned int processor_id; |
81 | EXPORT_SYMBOL(processor_id); | 81 | EXPORT_SYMBOL(processor_id); |
@@ -139,7 +139,7 @@ EXPORT_SYMBOL(elf_platform); | |||
139 | static const char *cpu_name; | 139 | static const char *cpu_name; |
140 | static const char *machine_name; | 140 | static const char *machine_name; |
141 | static char __initdata cmd_line[COMMAND_LINE_SIZE]; | 141 | static char __initdata cmd_line[COMMAND_LINE_SIZE]; |
142 | struct machine_desc *machine_desc __initdata; | 142 | const struct machine_desc *machine_desc __initdata; |
143 | 143 | ||
144 | static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } }; | 144 | static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } }; |
145 | #define ENDIANNESS ((char)endian_test.l) | 145 | #define ENDIANNESS ((char)endian_test.l) |
@@ -607,7 +607,7 @@ static void __init setup_processor(void) | |||
607 | 607 | ||
608 | void __init dump_machine_table(void) | 608 | void __init dump_machine_table(void) |
609 | { | 609 | { |
610 | struct machine_desc *p; | 610 | const struct machine_desc *p; |
611 | 611 | ||
612 | early_print("Available machine support:\n\nID (hex)\tNAME\n"); | 612 | early_print("Available machine support:\n\nID (hex)\tNAME\n"); |
613 | for_each_machine_desc(p) | 613 | for_each_machine_desc(p) |
@@ -694,7 +694,7 @@ static int __init early_mem(char *p) | |||
694 | } | 694 | } |
695 | early_param("mem", early_mem); | 695 | early_param("mem", early_mem); |
696 | 696 | ||
697 | static void __init request_standard_resources(struct machine_desc *mdesc) | 697 | static void __init request_standard_resources(const struct machine_desc *mdesc) |
698 | { | 698 | { |
699 | struct memblock_region *region; | 699 | struct memblock_region *region; |
700 | struct resource *res; | 700 | struct resource *res; |
@@ -852,7 +852,7 @@ void __init hyp_mode_check(void) | |||
852 | 852 | ||
853 | void __init setup_arch(char **cmdline_p) | 853 | void __init setup_arch(char **cmdline_p) |
854 | { | 854 | { |
855 | struct machine_desc *mdesc; | 855 | const struct machine_desc *mdesc; |
856 | 856 | ||
857 | setup_processor(); | 857 | setup_processor(); |
858 | mdesc = setup_machine_fdt(__atags_pointer); | 858 | mdesc = setup_machine_fdt(__atags_pointer); |
@@ -994,15 +994,6 @@ static int c_show(struct seq_file *m, void *v) | |||
994 | seq_printf(m, "model name\t: %s rev %d (%s)\n", | 994 | seq_printf(m, "model name\t: %s rev %d (%s)\n", |
995 | cpu_name, cpuid & 15, elf_platform); | 995 | cpu_name, cpuid & 15, elf_platform); |
996 | 996 | ||
997 | #if defined(CONFIG_SMP) | ||
998 | seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", | ||
999 | per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ), | ||
1000 | (per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100); | ||
1001 | #else | ||
1002 | seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", | ||
1003 | loops_per_jiffy / (500000/HZ), | ||
1004 | (loops_per_jiffy / (5000/HZ)) % 100); | ||
1005 | #endif | ||
1006 | /* dump out the processor features */ | 997 | /* dump out the processor features */ |
1007 | seq_puts(m, "Features\t: "); | 998 | seq_puts(m, "Features\t: "); |
1008 | 999 | ||
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 2dc19349eb19..92d10e503746 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -398,17 +398,8 @@ asmlinkage void secondary_start_kernel(void) | |||
398 | 398 | ||
399 | void __init smp_cpus_done(unsigned int max_cpus) | 399 | void __init smp_cpus_done(unsigned int max_cpus) |
400 | { | 400 | { |
401 | int cpu; | 401 | printk(KERN_INFO "SMP: Total of %d processors activated.\n", |
402 | unsigned long bogosum = 0; | 402 | num_online_cpus()); |
403 | |||
404 | for_each_online_cpu(cpu) | ||
405 | bogosum += per_cpu(cpu_data, cpu).loops_per_jiffy; | ||
406 | |||
407 | printk(KERN_INFO "SMP: Total of %d processors activated " | ||
408 | "(%lu.%02lu BogoMIPS).\n", | ||
409 | num_online_cpus(), | ||
410 | bogosum / (500000/HZ), | ||
411 | (bogosum / (5000/HZ)) % 100); | ||
412 | 403 | ||
413 | hyp_mode_check(); | 404 | hyp_mode_check(); |
414 | } | 405 | } |
diff --git a/arch/arm/kernel/smp_tlb.c b/arch/arm/kernel/smp_tlb.c index c2edfff573c2..83ccca303df8 100644 --- a/arch/arm/kernel/smp_tlb.c +++ b/arch/arm/kernel/smp_tlb.c | |||
@@ -104,7 +104,7 @@ void flush_tlb_all(void) | |||
104 | if (tlb_ops_need_broadcast()) | 104 | if (tlb_ops_need_broadcast()) |
105 | on_each_cpu(ipi_flush_tlb_all, NULL, 1); | 105 | on_each_cpu(ipi_flush_tlb_all, NULL, 1); |
106 | else | 106 | else |
107 | local_flush_tlb_all(); | 107 | __flush_tlb_all(); |
108 | broadcast_tlb_a15_erratum(); | 108 | broadcast_tlb_a15_erratum(); |
109 | } | 109 | } |
110 | 110 | ||
@@ -113,7 +113,7 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
113 | if (tlb_ops_need_broadcast()) | 113 | if (tlb_ops_need_broadcast()) |
114 | on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1); | 114 | on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1); |
115 | else | 115 | else |
116 | local_flush_tlb_mm(mm); | 116 | __flush_tlb_mm(mm); |
117 | broadcast_tlb_mm_a15_erratum(mm); | 117 | broadcast_tlb_mm_a15_erratum(mm); |
118 | } | 118 | } |
119 | 119 | ||
@@ -126,7 +126,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
126 | on_each_cpu_mask(mm_cpumask(vma->vm_mm), ipi_flush_tlb_page, | 126 | on_each_cpu_mask(mm_cpumask(vma->vm_mm), ipi_flush_tlb_page, |
127 | &ta, 1); | 127 | &ta, 1); |
128 | } else | 128 | } else |
129 | local_flush_tlb_page(vma, uaddr); | 129 | __flush_tlb_page(vma, uaddr); |
130 | broadcast_tlb_mm_a15_erratum(vma->vm_mm); | 130 | broadcast_tlb_mm_a15_erratum(vma->vm_mm); |
131 | } | 131 | } |
132 | 132 | ||
@@ -137,7 +137,7 @@ void flush_tlb_kernel_page(unsigned long kaddr) | |||
137 | ta.ta_start = kaddr; | 137 | ta.ta_start = kaddr; |
138 | on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1); | 138 | on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1); |
139 | } else | 139 | } else |
140 | local_flush_tlb_kernel_page(kaddr); | 140 | __flush_tlb_kernel_page(kaddr); |
141 | broadcast_tlb_a15_erratum(); | 141 | broadcast_tlb_a15_erratum(); |
142 | } | 142 | } |
143 | 143 | ||
@@ -173,5 +173,5 @@ void flush_bp_all(void) | |||
173 | if (tlb_ops_need_broadcast()) | 173 | if (tlb_ops_need_broadcast()) |
174 | on_each_cpu(ipi_flush_bp_all, NULL, 1); | 174 | on_each_cpu(ipi_flush_bp_all, NULL, 1); |
175 | else | 175 | else |
176 | local_flush_bp_all(); | 176 | __flush_bp_all(); |
177 | } | 177 | } |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index ab517fcce21b..8fcda140358d 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -497,28 +497,64 @@ static int bad_syscall(int n, struct pt_regs *regs) | |||
497 | return regs->ARM_r0; | 497 | return regs->ARM_r0; |
498 | } | 498 | } |
499 | 499 | ||
500 | static long do_cache_op_restart(struct restart_block *); | ||
501 | |||
500 | static inline int | 502 | static inline int |
501 | do_cache_op(unsigned long start, unsigned long end, int flags) | 503 | __do_cache_op(unsigned long start, unsigned long end) |
502 | { | 504 | { |
503 | struct mm_struct *mm = current->active_mm; | 505 | int ret; |
504 | struct vm_area_struct *vma; | 506 | unsigned long chunk = PAGE_SIZE; |
507 | |||
508 | do { | ||
509 | if (signal_pending(current)) { | ||
510 | struct thread_info *ti = current_thread_info(); | ||
511 | |||
512 | ti->restart_block = (struct restart_block) { | ||
513 | .fn = do_cache_op_restart, | ||
514 | }; | ||
515 | |||
516 | ti->arm_restart_block = (struct arm_restart_block) { | ||
517 | { | ||
518 | .cache = { | ||
519 | .start = start, | ||
520 | .end = end, | ||
521 | }, | ||
522 | }, | ||
523 | }; | ||
524 | |||
525 | return -ERESTART_RESTARTBLOCK; | ||
526 | } | ||
527 | |||
528 | ret = flush_cache_user_range(start, start + chunk); | ||
529 | if (ret) | ||
530 | return ret; | ||
505 | 531 | ||
532 | cond_resched(); | ||
533 | start += chunk; | ||
534 | } while (start < end); | ||
535 | |||
536 | return 0; | ||
537 | } | ||
538 | |||
539 | static long do_cache_op_restart(struct restart_block *unused) | ||
540 | { | ||
541 | struct arm_restart_block *restart_block; | ||
542 | |||
543 | restart_block = ¤t_thread_info()->arm_restart_block; | ||
544 | return __do_cache_op(restart_block->cache.start, | ||
545 | restart_block->cache.end); | ||
546 | } | ||
547 | |||
548 | static inline int | ||
549 | do_cache_op(unsigned long start, unsigned long end, int flags) | ||
550 | { | ||
506 | if (end < start || flags) | 551 | if (end < start || flags) |
507 | return -EINVAL; | 552 | return -EINVAL; |
508 | 553 | ||
509 | down_read(&mm->mmap_sem); | 554 | if (!access_ok(VERIFY_READ, start, end - start)) |
510 | vma = find_vma(mm, start); | 555 | return -EFAULT; |
511 | if (vma && vma->vm_start < end) { | ||
512 | if (start < vma->vm_start) | ||
513 | start = vma->vm_start; | ||
514 | if (end > vma->vm_end) | ||
515 | end = vma->vm_end; | ||
516 | 556 | ||
517 | up_read(&mm->mmap_sem); | 557 | return __do_cache_op(start, end); |
518 | return flush_cache_user_range(start, end); | ||
519 | } | ||
520 | up_read(&mm->mmap_sem); | ||
521 | return -EINVAL; | ||
522 | } | 558 | } |
523 | 559 | ||
524 | /* | 560 | /* |
diff --git a/arch/arm/kernel/v7m.c b/arch/arm/kernel/v7m.c new file mode 100644 index 000000000000..4d2cba94f5cc --- /dev/null +++ b/arch/arm/kernel/v7m.c | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 Uwe Kleine-Koenig for Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it under | ||
5 | * the terms of the GNU General Public License version 2 as published by the | ||
6 | * Free Software Foundation. | ||
7 | */ | ||
8 | #include <linux/io.h> | ||
9 | #include <linux/reboot.h> | ||
10 | #include <asm/barrier.h> | ||
11 | #include <asm/v7m.h> | ||
12 | |||
13 | void armv7m_restart(enum reboot_mode mode, const char *cmd) | ||
14 | { | ||
15 | dsb(); | ||
16 | __raw_writel(V7M_SCB_AIRCR_VECTKEY | V7M_SCB_AIRCR_SYSRESETREQ, | ||
17 | BASEADDR_V7M_SCB + V7M_SCB_AIRCR); | ||
18 | dsb(); | ||
19 | } | ||
diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c index 4a5199070430..db9cf692d4dd 100644 --- a/arch/arm/kvm/coproc.c +++ b/arch/arm/kvm/coproc.c | |||
@@ -146,7 +146,11 @@ static bool pm_fake(struct kvm_vcpu *vcpu, | |||
146 | #define access_pmintenclr pm_fake | 146 | #define access_pmintenclr pm_fake |
147 | 147 | ||
148 | /* Architected CP15 registers. | 148 | /* Architected CP15 registers. |
149 | * Important: Must be sorted ascending by CRn, CRM, Op1, Op2 | 149 | * CRn denotes the primary register number, but is copied to the CRm in the |
150 | * user space API for 64-bit register access in line with the terminology used | ||
151 | * in the ARM ARM. | ||
152 | * Important: Must be sorted ascending by CRn, CRM, Op1, Op2 and with 64-bit | ||
153 | * registers preceding 32-bit ones. | ||
150 | */ | 154 | */ |
151 | static const struct coproc_reg cp15_regs[] = { | 155 | static const struct coproc_reg cp15_regs[] = { |
152 | /* CSSELR: swapped by interrupt.S. */ | 156 | /* CSSELR: swapped by interrupt.S. */ |
@@ -154,8 +158,8 @@ static const struct coproc_reg cp15_regs[] = { | |||
154 | NULL, reset_unknown, c0_CSSELR }, | 158 | NULL, reset_unknown, c0_CSSELR }, |
155 | 159 | ||
156 | /* TTBR0/TTBR1: swapped by interrupt.S. */ | 160 | /* TTBR0/TTBR1: swapped by interrupt.S. */ |
157 | { CRm( 2), Op1( 0), is64, NULL, reset_unknown64, c2_TTBR0 }, | 161 | { CRm64( 2), Op1( 0), is64, NULL, reset_unknown64, c2_TTBR0 }, |
158 | { CRm( 2), Op1( 1), is64, NULL, reset_unknown64, c2_TTBR1 }, | 162 | { CRm64( 2), Op1( 1), is64, NULL, reset_unknown64, c2_TTBR1 }, |
159 | 163 | ||
160 | /* TTBCR: swapped by interrupt.S. */ | 164 | /* TTBCR: swapped by interrupt.S. */ |
161 | { CRn( 2), CRm( 0), Op1( 0), Op2( 2), is32, | 165 | { CRn( 2), CRm( 0), Op1( 0), Op2( 2), is32, |
@@ -182,7 +186,7 @@ static const struct coproc_reg cp15_regs[] = { | |||
182 | NULL, reset_unknown, c6_IFAR }, | 186 | NULL, reset_unknown, c6_IFAR }, |
183 | 187 | ||
184 | /* PAR swapped by interrupt.S */ | 188 | /* PAR swapped by interrupt.S */ |
185 | { CRn( 7), Op1( 0), is64, NULL, reset_unknown64, c7_PAR }, | 189 | { CRm64( 7), Op1( 0), is64, NULL, reset_unknown64, c7_PAR }, |
186 | 190 | ||
187 | /* | 191 | /* |
188 | * DC{C,I,CI}SW operations: | 192 | * DC{C,I,CI}SW operations: |
@@ -399,12 +403,13 @@ static bool index_to_params(u64 id, struct coproc_params *params) | |||
399 | | KVM_REG_ARM_OPC1_MASK)) | 403 | | KVM_REG_ARM_OPC1_MASK)) |
400 | return false; | 404 | return false; |
401 | params->is_64bit = true; | 405 | params->is_64bit = true; |
402 | params->CRm = ((id & KVM_REG_ARM_CRM_MASK) | 406 | /* CRm to CRn: see cp15_to_index for details */ |
407 | params->CRn = ((id & KVM_REG_ARM_CRM_MASK) | ||
403 | >> KVM_REG_ARM_CRM_SHIFT); | 408 | >> KVM_REG_ARM_CRM_SHIFT); |
404 | params->Op1 = ((id & KVM_REG_ARM_OPC1_MASK) | 409 | params->Op1 = ((id & KVM_REG_ARM_OPC1_MASK) |
405 | >> KVM_REG_ARM_OPC1_SHIFT); | 410 | >> KVM_REG_ARM_OPC1_SHIFT); |
406 | params->Op2 = 0; | 411 | params->Op2 = 0; |
407 | params->CRn = 0; | 412 | params->CRm = 0; |
408 | return true; | 413 | return true; |
409 | default: | 414 | default: |
410 | return false; | 415 | return false; |
@@ -898,7 +903,14 @@ static u64 cp15_to_index(const struct coproc_reg *reg) | |||
898 | if (reg->is_64) { | 903 | if (reg->is_64) { |
899 | val |= KVM_REG_SIZE_U64; | 904 | val |= KVM_REG_SIZE_U64; |
900 | val |= (reg->Op1 << KVM_REG_ARM_OPC1_SHIFT); | 905 | val |= (reg->Op1 << KVM_REG_ARM_OPC1_SHIFT); |
901 | val |= (reg->CRm << KVM_REG_ARM_CRM_SHIFT); | 906 | /* |
907 | * CRn always denotes the primary coproc. reg. nr. for the | ||
908 | * in-kernel representation, but the user space API uses the | ||
909 | * CRm for the encoding, because it is modelled after the | ||
910 | * MRRC/MCRR instructions: see the ARM ARM rev. c page | ||
911 | * B3-1445 | ||
912 | */ | ||
913 | val |= (reg->CRn << KVM_REG_ARM_CRM_SHIFT); | ||
902 | } else { | 914 | } else { |
903 | val |= KVM_REG_SIZE_U32; | 915 | val |= KVM_REG_SIZE_U32; |
904 | val |= (reg->Op1 << KVM_REG_ARM_OPC1_SHIFT); | 916 | val |= (reg->Op1 << KVM_REG_ARM_OPC1_SHIFT); |
diff --git a/arch/arm/kvm/coproc.h b/arch/arm/kvm/coproc.h index b7301d3e4799..0461d5c8d3de 100644 --- a/arch/arm/kvm/coproc.h +++ b/arch/arm/kvm/coproc.h | |||
@@ -135,6 +135,8 @@ static inline int cmp_reg(const struct coproc_reg *i1, | |||
135 | return -1; | 135 | return -1; |
136 | if (i1->CRn != i2->CRn) | 136 | if (i1->CRn != i2->CRn) |
137 | return i1->CRn - i2->CRn; | 137 | return i1->CRn - i2->CRn; |
138 | if (i1->is_64 != i2->is_64) | ||
139 | return i2->is_64 - i1->is_64; | ||
138 | if (i1->CRm != i2->CRm) | 140 | if (i1->CRm != i2->CRm) |
139 | return i1->CRm - i2->CRm; | 141 | return i1->CRm - i2->CRm; |
140 | if (i1->Op1 != i2->Op1) | 142 | if (i1->Op1 != i2->Op1) |
@@ -145,6 +147,7 @@ static inline int cmp_reg(const struct coproc_reg *i1, | |||
145 | 147 | ||
146 | #define CRn(_x) .CRn = _x | 148 | #define CRn(_x) .CRn = _x |
147 | #define CRm(_x) .CRm = _x | 149 | #define CRm(_x) .CRm = _x |
150 | #define CRm64(_x) .CRn = _x, .CRm = 0 | ||
148 | #define Op1(_x) .Op1 = _x | 151 | #define Op1(_x) .Op1 = _x |
149 | #define Op2(_x) .Op2 = _x | 152 | #define Op2(_x) .Op2 = _x |
150 | #define is64 .is_64 = true | 153 | #define is64 .is_64 = true |
diff --git a/arch/arm/kvm/coproc_a15.c b/arch/arm/kvm/coproc_a15.c index 685063a6d0cf..cf93472b9dd6 100644 --- a/arch/arm/kvm/coproc_a15.c +++ b/arch/arm/kvm/coproc_a15.c | |||
@@ -114,7 +114,11 @@ static bool access_l2ectlr(struct kvm_vcpu *vcpu, | |||
114 | 114 | ||
115 | /* | 115 | /* |
116 | * A15-specific CP15 registers. | 116 | * A15-specific CP15 registers. |
117 | * Important: Must be sorted ascending by CRn, CRM, Op1, Op2 | 117 | * CRn denotes the primary register number, but is copied to the CRm in the |
118 | * user space API for 64-bit register access in line with the terminology used | ||
119 | * in the ARM ARM. | ||
120 | * Important: Must be sorted ascending by CRn, CRM, Op1, Op2 and with 64-bit | ||
121 | * registers preceding 32-bit ones. | ||
118 | */ | 122 | */ |
119 | static const struct coproc_reg a15_regs[] = { | 123 | static const struct coproc_reg a15_regs[] = { |
120 | /* MPIDR: we use VMPIDR for guest access. */ | 124 | /* MPIDR: we use VMPIDR for guest access. */ |
diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S index f048338135f7..1b9844d369cc 100644 --- a/arch/arm/kvm/init.S +++ b/arch/arm/kvm/init.S | |||
@@ -142,7 +142,7 @@ target: @ We're now in the trampoline code, switch page tables | |||
142 | 142 | ||
143 | @ Invalidate the old TLBs | 143 | @ Invalidate the old TLBs |
144 | mcr p15, 4, r0, c8, c7, 0 @ TLBIALLH | 144 | mcr p15, 4, r0, c8, c7, 0 @ TLBIALLH |
145 | dsb | 145 | dsb ish |
146 | 146 | ||
147 | eret | 147 | eret |
148 | 148 | ||
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S index 16cd4ba5d7fd..f85052facffc 100644 --- a/arch/arm/kvm/interrupts.S +++ b/arch/arm/kvm/interrupts.S | |||
@@ -55,7 +55,7 @@ ENTRY(__kvm_tlb_flush_vmid_ipa) | |||
55 | mcrr p15, 6, r2, r3, c2 @ Write VTTBR | 55 | mcrr p15, 6, r2, r3, c2 @ Write VTTBR |
56 | isb | 56 | isb |
57 | mcr p15, 0, r0, c8, c3, 0 @ TLBIALLIS (rt ignored) | 57 | mcr p15, 0, r0, c8, c3, 0 @ TLBIALLIS (rt ignored) |
58 | dsb | 58 | dsb ish |
59 | isb | 59 | isb |
60 | mov r2, #0 | 60 | mov r2, #0 |
61 | mov r3, #0 | 61 | mov r3, #0 |
@@ -79,7 +79,7 @@ ENTRY(__kvm_flush_vm_context) | |||
79 | mcr p15, 4, r0, c8, c3, 4 | 79 | mcr p15, 4, r0, c8, c3, 4 |
80 | /* Invalidate instruction caches Inner Shareable (ICIALLUIS) */ | 80 | /* Invalidate instruction caches Inner Shareable (ICIALLUIS) */ |
81 | mcr p15, 0, r0, c7, c1, 0 | 81 | mcr p15, 0, r0, c7, c1, 0 |
82 | dsb | 82 | dsb ish |
83 | isb @ Not necessary if followed by eret | 83 | isb @ Not necessary if followed by eret |
84 | 84 | ||
85 | bx lr | 85 | bx lr |
diff --git a/arch/arm/kvm/mmio.c b/arch/arm/kvm/mmio.c index b8e06b7a2833..0c25d9487d53 100644 --- a/arch/arm/kvm/mmio.c +++ b/arch/arm/kvm/mmio.c | |||
@@ -63,7 +63,8 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
63 | static int decode_hsr(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | 63 | static int decode_hsr(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
64 | struct kvm_exit_mmio *mmio) | 64 | struct kvm_exit_mmio *mmio) |
65 | { | 65 | { |
66 | unsigned long rt, len; | 66 | unsigned long rt; |
67 | int len; | ||
67 | bool is_write, sign_extend; | 68 | bool is_write, sign_extend; |
68 | 69 | ||
69 | if (kvm_vcpu_dabt_isextabt(vcpu)) { | 70 | if (kvm_vcpu_dabt_isextabt(vcpu)) { |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index ca6bea4859b4..b0de86b56c13 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
@@ -85,6 +85,12 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc) | |||
85 | return p; | 85 | return p; |
86 | } | 86 | } |
87 | 87 | ||
88 | static bool page_empty(void *ptr) | ||
89 | { | ||
90 | struct page *ptr_page = virt_to_page(ptr); | ||
91 | return page_count(ptr_page) == 1; | ||
92 | } | ||
93 | |||
88 | static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr) | 94 | static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr) |
89 | { | 95 | { |
90 | pmd_t *pmd_table = pmd_offset(pud, 0); | 96 | pmd_t *pmd_table = pmd_offset(pud, 0); |
@@ -103,12 +109,6 @@ static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr) | |||
103 | put_page(virt_to_page(pmd)); | 109 | put_page(virt_to_page(pmd)); |
104 | } | 110 | } |
105 | 111 | ||
106 | static bool pmd_empty(pmd_t *pmd) | ||
107 | { | ||
108 | struct page *pmd_page = virt_to_page(pmd); | ||
109 | return page_count(pmd_page) == 1; | ||
110 | } | ||
111 | |||
112 | static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr) | 112 | static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr) |
113 | { | 113 | { |
114 | if (pte_present(*pte)) { | 114 | if (pte_present(*pte)) { |
@@ -118,12 +118,6 @@ static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr) | |||
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
121 | static bool pte_empty(pte_t *pte) | ||
122 | { | ||
123 | struct page *pte_page = virt_to_page(pte); | ||
124 | return page_count(pte_page) == 1; | ||
125 | } | ||
126 | |||
127 | static void unmap_range(struct kvm *kvm, pgd_t *pgdp, | 121 | static void unmap_range(struct kvm *kvm, pgd_t *pgdp, |
128 | unsigned long long start, u64 size) | 122 | unsigned long long start, u64 size) |
129 | { | 123 | { |
@@ -132,37 +126,37 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp, | |||
132 | pmd_t *pmd; | 126 | pmd_t *pmd; |
133 | pte_t *pte; | 127 | pte_t *pte; |
134 | unsigned long long addr = start, end = start + size; | 128 | unsigned long long addr = start, end = start + size; |
135 | u64 range; | 129 | u64 next; |
136 | 130 | ||
137 | while (addr < end) { | 131 | while (addr < end) { |
138 | pgd = pgdp + pgd_index(addr); | 132 | pgd = pgdp + pgd_index(addr); |
139 | pud = pud_offset(pgd, addr); | 133 | pud = pud_offset(pgd, addr); |
140 | if (pud_none(*pud)) { | 134 | if (pud_none(*pud)) { |
141 | addr += PUD_SIZE; | 135 | addr = pud_addr_end(addr, end); |
142 | continue; | 136 | continue; |
143 | } | 137 | } |
144 | 138 | ||
145 | pmd = pmd_offset(pud, addr); | 139 | pmd = pmd_offset(pud, addr); |
146 | if (pmd_none(*pmd)) { | 140 | if (pmd_none(*pmd)) { |
147 | addr += PMD_SIZE; | 141 | addr = pmd_addr_end(addr, end); |
148 | continue; | 142 | continue; |
149 | } | 143 | } |
150 | 144 | ||
151 | pte = pte_offset_kernel(pmd, addr); | 145 | pte = pte_offset_kernel(pmd, addr); |
152 | clear_pte_entry(kvm, pte, addr); | 146 | clear_pte_entry(kvm, pte, addr); |
153 | range = PAGE_SIZE; | 147 | next = addr + PAGE_SIZE; |
154 | 148 | ||
155 | /* If we emptied the pte, walk back up the ladder */ | 149 | /* If we emptied the pte, walk back up the ladder */ |
156 | if (pte_empty(pte)) { | 150 | if (page_empty(pte)) { |
157 | clear_pmd_entry(kvm, pmd, addr); | 151 | clear_pmd_entry(kvm, pmd, addr); |
158 | range = PMD_SIZE; | 152 | next = pmd_addr_end(addr, end); |
159 | if (pmd_empty(pmd)) { | 153 | if (page_empty(pmd) && !page_empty(pud)) { |
160 | clear_pud_entry(kvm, pud, addr); | 154 | clear_pud_entry(kvm, pud, addr); |
161 | range = PUD_SIZE; | 155 | next = pud_addr_end(addr, end); |
162 | } | 156 | } |
163 | } | 157 | } |
164 | 158 | ||
165 | addr += range; | 159 | addr = next; |
166 | } | 160 | } |
167 | } | 161 | } |
168 | 162 | ||
@@ -495,7 +489,6 @@ int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa, | |||
495 | 489 | ||
496 | for (addr = guest_ipa; addr < end; addr += PAGE_SIZE) { | 490 | for (addr = guest_ipa; addr < end; addr += PAGE_SIZE) { |
497 | pte_t pte = pfn_pte(pfn, PAGE_S2_DEVICE); | 491 | pte_t pte = pfn_pte(pfn, PAGE_S2_DEVICE); |
498 | kvm_set_s2pte_writable(&pte); | ||
499 | 492 | ||
500 | ret = mmu_topup_memory_cache(&cache, 2, 2); | 493 | ret = mmu_topup_memory_cache(&cache, 2, 2); |
501 | if (ret) | 494 | if (ret) |
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index af72969820b4..aaf3a8731136 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -45,3 +45,9 @@ lib-$(CONFIG_ARCH_SHARK) += io-shark.o | |||
45 | 45 | ||
46 | $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S | 46 | $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S |
47 | $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S | 47 | $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S |
48 | |||
49 | ifeq ($(CONFIG_KERNEL_MODE_NEON),y) | ||
50 | NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon | ||
51 | CFLAGS_xor-neon.o += $(NEON_FLAGS) | ||
52 | lib-$(CONFIG_XOR_BLOCKS) += xor-neon.o | ||
53 | endif | ||
diff --git a/arch/arm/lib/xor-neon.c b/arch/arm/lib/xor-neon.c new file mode 100644 index 000000000000..f485e5a2af4b --- /dev/null +++ b/arch/arm/lib/xor-neon.c | |||
@@ -0,0 +1,42 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/xor-neon.c | ||
3 | * | ||
4 | * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/raid/xor.h> | ||
12 | |||
13 | #ifndef __ARM_NEON__ | ||
14 | #error You should compile this file with '-mfloat-abi=softfp -mfpu=neon' | ||
15 | #endif | ||
16 | |||
17 | /* | ||
18 | * Pull in the reference implementations while instructing GCC (through | ||
19 | * -ftree-vectorize) to attempt to exploit implicit parallelism and emit | ||
20 | * NEON instructions. | ||
21 | */ | ||
22 | #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) | ||
23 | #pragma GCC optimize "tree-vectorize" | ||
24 | #else | ||
25 | /* | ||
26 | * While older versions of GCC do not generate incorrect code, they fail to | ||
27 | * recognize the parallel nature of these functions, and emit plain ARM code, | ||
28 | * which is known to be slower than the optimized ARM code in asm-arm/xor.h. | ||
29 | */ | ||
30 | #warning This code requires at least version 4.6 of GCC | ||
31 | #endif | ||
32 | |||
33 | #pragma GCC diagnostic ignored "-Wunused-variable" | ||
34 | #include <asm-generic/xor.h> | ||
35 | |||
36 | struct xor_block_template const xor_block_neon_inner = { | ||
37 | .name = "__inner_neon__", | ||
38 | .do_2 = xor_8regs_2, | ||
39 | .do_3 = xor_8regs_3, | ||
40 | .do_4 = xor_8regs_4, | ||
41 | .do_5 = xor_8regs_5, | ||
42 | }; | ||
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index 2abee6626aac..916e5a142917 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c | |||
@@ -227,6 +227,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
227 | CLKDEV_CON_DEV_ID("usart", "f8020000.serial", &usart1_clk), | 227 | CLKDEV_CON_DEV_ID("usart", "f8020000.serial", &usart1_clk), |
228 | CLKDEV_CON_DEV_ID("usart", "f8024000.serial", &usart2_clk), | 228 | CLKDEV_CON_DEV_ID("usart", "f8024000.serial", &usart2_clk), |
229 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), | 229 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), |
230 | CLKDEV_CON_DEV_ID("usart", "f8040000.serial", &uart0_clk), | ||
231 | CLKDEV_CON_DEV_ID("usart", "f8044000.serial", &uart1_clk), | ||
230 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), | 232 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), |
231 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), | 233 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), |
232 | CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk), | 234 | CLKDEV_CON_DEV_ID("mci_clk", "f0008000.mmc", &mmc0_clk), |
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c index dff4ddc5ef81..139e42da25f0 100644 --- a/arch/arm/mach-davinci/board-dm355-leopard.c +++ b/arch/arm/mach-davinci/board-dm355-leopard.c | |||
@@ -75,6 +75,7 @@ static struct davinci_nand_pdata davinci_nand_data = { | |||
75 | .parts = davinci_nand_partitions, | 75 | .parts = davinci_nand_partitions, |
76 | .nr_parts = ARRAY_SIZE(davinci_nand_partitions), | 76 | .nr_parts = ARRAY_SIZE(davinci_nand_partitions), |
77 | .ecc_mode = NAND_ECC_HW_SYNDROME, | 77 | .ecc_mode = NAND_ECC_HW_SYNDROME, |
78 | .ecc_bits = 4, | ||
78 | .bbt_options = NAND_BBT_USE_FLASH, | 79 | .bbt_options = NAND_BBT_USE_FLASH, |
79 | }; | 80 | }; |
80 | 81 | ||
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index a33686a6fbb2..fa4bfaf952d8 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c | |||
@@ -153,6 +153,7 @@ static struct davinci_nand_pdata davinci_evm_nandflash_data = { | |||
153 | .parts = davinci_evm_nandflash_partition, | 153 | .parts = davinci_evm_nandflash_partition, |
154 | .nr_parts = ARRAY_SIZE(davinci_evm_nandflash_partition), | 154 | .nr_parts = ARRAY_SIZE(davinci_evm_nandflash_partition), |
155 | .ecc_mode = NAND_ECC_HW, | 155 | .ecc_mode = NAND_ECC_HW, |
156 | .ecc_bits = 1, | ||
156 | .bbt_options = NAND_BBT_USE_FLASH, | 157 | .bbt_options = NAND_BBT_USE_FLASH, |
157 | .timing = &davinci_evm_nandflash_timing, | 158 | .timing = &davinci_evm_nandflash_timing, |
158 | }; | 159 | }; |
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index fbb8e5ab1dc1..0c005e876cac 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c | |||
@@ -90,6 +90,7 @@ static struct davinci_nand_pdata davinci_nand_data = { | |||
90 | .parts = davinci_nand_partitions, | 90 | .parts = davinci_nand_partitions, |
91 | .nr_parts = ARRAY_SIZE(davinci_nand_partitions), | 91 | .nr_parts = ARRAY_SIZE(davinci_nand_partitions), |
92 | .ecc_mode = NAND_ECC_HW, | 92 | .ecc_mode = NAND_ECC_HW, |
93 | .ecc_bits = 1, | ||
93 | .options = 0, | 94 | .options = 0, |
94 | }; | 95 | }; |
95 | 96 | ||
diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c index 2bc112adf565..808233b60e3d 100644 --- a/arch/arm/mach-davinci/board-neuros-osd2.c +++ b/arch/arm/mach-davinci/board-neuros-osd2.c | |||
@@ -88,6 +88,7 @@ static struct davinci_nand_pdata davinci_ntosd2_nandflash_data = { | |||
88 | .parts = davinci_ntosd2_nandflash_partition, | 88 | .parts = davinci_ntosd2_nandflash_partition, |
89 | .nr_parts = ARRAY_SIZE(davinci_ntosd2_nandflash_partition), | 89 | .nr_parts = ARRAY_SIZE(davinci_ntosd2_nandflash_partition), |
90 | .ecc_mode = NAND_ECC_HW, | 90 | .ecc_mode = NAND_ECC_HW, |
91 | .ecc_bits = 1, | ||
91 | .bbt_options = NAND_BBT_USE_FLASH, | 92 | .bbt_options = NAND_BBT_USE_FLASH, |
92 | }; | 93 | }; |
93 | 94 | ||
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index f6eeb87e4e95..827d15009a86 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -122,11 +122,7 @@ static struct musb_hdrc_config musb_config = { | |||
122 | }; | 122 | }; |
123 | 123 | ||
124 | static struct musb_hdrc_platform_data tusb_data = { | 124 | static struct musb_hdrc_platform_data tusb_data = { |
125 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | ||
126 | .mode = MUSB_OTG, | 125 | .mode = MUSB_OTG, |
127 | #else | ||
128 | .mode = MUSB_HOST, | ||
129 | #endif | ||
130 | .set_power = tusb_set_power, | 126 | .set_power = tusb_set_power, |
131 | .min_power = 25, /* x2 = 50 mA drawn from VBUS as peripheral */ | 127 | .min_power = 25, /* x2 = 50 mA drawn from VBUS as peripheral */ |
132 | .power = 100, /* Max 100 mA VBUS for host mode */ | 128 | .power = 100, /* Max 100 mA VBUS for host mode */ |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index d2ea68ea678a..7735105561d8 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -85,7 +85,7 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
85 | 85 | ||
86 | static struct omap_musb_board_data musb_board_data = { | 86 | static struct omap_musb_board_data musb_board_data = { |
87 | .interface_type = MUSB_INTERFACE_ULPI, | 87 | .interface_type = MUSB_INTERFACE_ULPI, |
88 | .mode = MUSB_PERIPHERAL, | 88 | .mode = MUSB_OTG, |
89 | .power = 0, | 89 | .power = 0, |
90 | }; | 90 | }; |
91 | 91 | ||
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index 8c4de2708cf2..bc897231bd10 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c | |||
@@ -38,11 +38,8 @@ static struct musb_hdrc_config musb_config = { | |||
38 | }; | 38 | }; |
39 | 39 | ||
40 | static struct musb_hdrc_platform_data musb_plat = { | 40 | static struct musb_hdrc_platform_data musb_plat = { |
41 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | ||
42 | .mode = MUSB_OTG, | 41 | .mode = MUSB_OTG, |
43 | #else | 42 | |
44 | .mode = MUSB_HOST, | ||
45 | #endif | ||
46 | /* .clock is set dynamically */ | 43 | /* .clock is set dynamically */ |
47 | .config = &musb_config, | 44 | .config = &musb_config, |
48 | 45 | ||
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index db5c2cab8fda..cd2c88e7a8f7 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -809,15 +809,18 @@ config KUSER_HELPERS | |||
809 | the CPU type fitted to the system. This permits binaries to be | 809 | the CPU type fitted to the system. This permits binaries to be |
810 | run on ARMv4 through to ARMv7 without modification. | 810 | run on ARMv4 through to ARMv7 without modification. |
811 | 811 | ||
812 | See Documentation/arm/kernel_user_helpers.txt for details. | ||
813 | |||
812 | However, the fixed address nature of these helpers can be used | 814 | However, the fixed address nature of these helpers can be used |
813 | by ROP (return orientated programming) authors when creating | 815 | by ROP (return orientated programming) authors when creating |
814 | exploits. | 816 | exploits. |
815 | 817 | ||
816 | If all of the binaries and libraries which run on your platform | 818 | If all of the binaries and libraries which run on your platform |
817 | are built specifically for your platform, and make no use of | 819 | are built specifically for your platform, and make no use of |
818 | these helpers, then you can turn this option off. However, | 820 | these helpers, then you can turn this option off to hinder |
819 | when such an binary or library is run, it will receive a SIGILL | 821 | such exploits. However, in that case, if a binary or library |
820 | signal, which will terminate the program. | 822 | relying on those helpers is run, it will receive a SIGILL signal, |
823 | which will terminate the program. | ||
821 | 824 | ||
822 | Say N here only if you are absolutely certain that you do not | 825 | Say N here only if you are absolutely certain that you do not |
823 | need these helpers; otherwise, the safe option is to say Y. | 826 | need these helpers; otherwise, the safe option is to say Y. |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index d70e0aba0c9d..447da6ffadd5 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
@@ -290,7 +290,7 @@ static void l2x0_disable(void) | |||
290 | raw_spin_lock_irqsave(&l2x0_lock, flags); | 290 | raw_spin_lock_irqsave(&l2x0_lock, flags); |
291 | __l2x0_flush_all(); | 291 | __l2x0_flush_all(); |
292 | writel_relaxed(0, l2x0_base + L2X0_CTRL); | 292 | writel_relaxed(0, l2x0_base + L2X0_CTRL); |
293 | dsb(); | 293 | dsb(st); |
294 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | 294 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); |
295 | } | 295 | } |
296 | 296 | ||
@@ -417,9 +417,9 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) | |||
417 | outer_cache.disable = l2x0_disable; | 417 | outer_cache.disable = l2x0_disable; |
418 | } | 418 | } |
419 | 419 | ||
420 | printk(KERN_INFO "%s cache controller enabled\n", type); | 420 | pr_info("%s cache controller enabled\n", type); |
421 | printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n", | 421 | pr_info("l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d kB\n", |
422 | ways, cache_id, aux, l2x0_size); | 422 | ways, cache_id, aux, l2x0_size >> 10); |
423 | } | 423 | } |
424 | 424 | ||
425 | #ifdef CONFIG_OF | 425 | #ifdef CONFIG_OF |
@@ -929,7 +929,9 @@ static const struct of_device_id l2x0_ids[] __initconst = { | |||
929 | .data = (void *)&aurora_no_outer_data}, | 929 | .data = (void *)&aurora_no_outer_data}, |
930 | { .compatible = "marvell,aurora-outer-cache", | 930 | { .compatible = "marvell,aurora-outer-cache", |
931 | .data = (void *)&aurora_with_outer_data}, | 931 | .data = (void *)&aurora_with_outer_data}, |
932 | { .compatible = "bcm,bcm11351-a2-pl310-cache", | 932 | { .compatible = "brcm,bcm11351-a2-pl310-cache", |
933 | .data = (void *)&bcm_l2x0_data}, | ||
934 | { .compatible = "bcm,bcm11351-a2-pl310-cache", /* deprecated name */ | ||
933 | .data = (void *)&bcm_l2x0_data}, | 935 | .data = (void *)&bcm_l2x0_data}, |
934 | {} | 936 | {} |
935 | }; | 937 | }; |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index 515b00064da8..b5c467a65c27 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
@@ -282,7 +282,7 @@ ENTRY(v7_coherent_user_range) | |||
282 | add r12, r12, r2 | 282 | add r12, r12, r2 |
283 | cmp r12, r1 | 283 | cmp r12, r1 |
284 | blo 1b | 284 | blo 1b |
285 | dsb | 285 | dsb ishst |
286 | icache_line_size r2, r3 | 286 | icache_line_size r2, r3 |
287 | sub r3, r2, #1 | 287 | sub r3, r2, #1 |
288 | bic r12, r0, r3 | 288 | bic r12, r0, r3 |
@@ -294,7 +294,7 @@ ENTRY(v7_coherent_user_range) | |||
294 | mov r0, #0 | 294 | mov r0, #0 |
295 | ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable | 295 | ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable |
296 | ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB | 296 | ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB |
297 | dsb | 297 | dsb ishst |
298 | isb | 298 | isb |
299 | mov pc, lr | 299 | mov pc, lr |
300 | 300 | ||
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 4a0544492f10..84e6f772e204 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
@@ -162,10 +162,7 @@ static void flush_context(unsigned int cpu) | |||
162 | } | 162 | } |
163 | 163 | ||
164 | /* Queue a TLB invalidate and flush the I-cache if necessary. */ | 164 | /* Queue a TLB invalidate and flush the I-cache if necessary. */ |
165 | if (!tlb_ops_need_broadcast()) | 165 | cpumask_setall(&tlb_flush_pending); |
166 | cpumask_set_cpu(cpu, &tlb_flush_pending); | ||
167 | else | ||
168 | cpumask_setall(&tlb_flush_pending); | ||
169 | 166 | ||
170 | if (icache_is_vivt_asid_tagged()) | 167 | if (icache_is_vivt_asid_tagged()) |
171 | __flush_icache_all(); | 168 | __flush_icache_all(); |
@@ -245,8 +242,6 @@ void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk) | |||
245 | if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) { | 242 | if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) { |
246 | local_flush_bp_all(); | 243 | local_flush_bp_all(); |
247 | local_flush_tlb_all(); | 244 | local_flush_tlb_all(); |
248 | if (erratum_a15_798181()) | ||
249 | dummy_flush_tlb_a15_erratum(); | ||
250 | } | 245 | } |
251 | 246 | ||
252 | atomic64_set(&per_cpu(active_asids, cpu), asid); | 247 | atomic64_set(&per_cpu(active_asids, cpu), asid); |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 7f9b1798c6cf..0c17f69a8286 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -455,7 +455,6 @@ static void __dma_remap(struct page *page, size_t size, pgprot_t prot) | |||
455 | unsigned end = start + size; | 455 | unsigned end = start + size; |
456 | 456 | ||
457 | apply_to_page_range(&init_mm, start, size, __dma_update_pte, &prot); | 457 | apply_to_page_range(&init_mm, start, size, __dma_update_pte, &prot); |
458 | dsb(); | ||
459 | flush_tlb_kernel_range(start, end); | 458 | flush_tlb_kernel_range(start, end); |
460 | } | 459 | } |
461 | 460 | ||
diff --git a/arch/arm/mm/hugetlbpage.c b/arch/arm/mm/hugetlbpage.c index 3d1e4a205b0b..66781bf34077 100644 --- a/arch/arm/mm/hugetlbpage.c +++ b/arch/arm/mm/hugetlbpage.c | |||
@@ -36,22 +36,6 @@ | |||
36 | * of type casting from pmd_t * to pte_t *. | 36 | * of type casting from pmd_t * to pte_t *. |
37 | */ | 37 | */ |
38 | 38 | ||
39 | pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) | ||
40 | { | ||
41 | pgd_t *pgd; | ||
42 | pud_t *pud; | ||
43 | pmd_t *pmd = NULL; | ||
44 | |||
45 | pgd = pgd_offset(mm, addr); | ||
46 | if (pgd_present(*pgd)) { | ||
47 | pud = pud_offset(pgd, addr); | ||
48 | if (pud_present(*pud)) | ||
49 | pmd = pmd_offset(pud, addr); | ||
50 | } | ||
51 | |||
52 | return (pte_t *)pmd; | ||
53 | } | ||
54 | |||
55 | struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address, | 39 | struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address, |
56 | int write) | 40 | int write) |
57 | { | 41 | { |
@@ -68,33 +52,6 @@ int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep) | |||
68 | return 0; | 52 | return 0; |
69 | } | 53 | } |
70 | 54 | ||
71 | pte_t *huge_pte_alloc(struct mm_struct *mm, | ||
72 | unsigned long addr, unsigned long sz) | ||
73 | { | ||
74 | pgd_t *pgd; | ||
75 | pud_t *pud; | ||
76 | pte_t *pte = NULL; | ||
77 | |||
78 | pgd = pgd_offset(mm, addr); | ||
79 | pud = pud_alloc(mm, pgd, addr); | ||
80 | if (pud) | ||
81 | pte = (pte_t *)pmd_alloc(mm, pud, addr); | ||
82 | |||
83 | return pte; | ||
84 | } | ||
85 | |||
86 | struct page * | ||
87 | follow_huge_pmd(struct mm_struct *mm, unsigned long address, | ||
88 | pmd_t *pmd, int write) | ||
89 | { | ||
90 | struct page *page; | ||
91 | |||
92 | page = pte_page(*(pte_t *)pmd); | ||
93 | if (page) | ||
94 | page += ((address & ~PMD_MASK) >> PAGE_SHIFT); | ||
95 | return page; | ||
96 | } | ||
97 | |||
98 | int pmd_huge(pmd_t pmd) | 55 | int pmd_huge(pmd_t pmd) |
99 | { | 56 | { |
100 | return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT); | 57 | return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT); |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 15225d829d71..2958e74fc42c 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -231,7 +231,7 @@ static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole, | |||
231 | } | 231 | } |
232 | #endif | 232 | #endif |
233 | 233 | ||
234 | void __init setup_dma_zone(struct machine_desc *mdesc) | 234 | void __init setup_dma_zone(const struct machine_desc *mdesc) |
235 | { | 235 | { |
236 | #ifdef CONFIG_ZONE_DMA | 236 | #ifdef CONFIG_ZONE_DMA |
237 | if (mdesc->dma_zone_size) { | 237 | if (mdesc->dma_zone_size) { |
@@ -335,7 +335,8 @@ phys_addr_t __init arm_memblock_steal(phys_addr_t size, phys_addr_t align) | |||
335 | return phys; | 335 | return phys; |
336 | } | 336 | } |
337 | 337 | ||
338 | void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) | 338 | void __init arm_memblock_init(struct meminfo *mi, |
339 | const struct machine_desc *mdesc) | ||
339 | { | 340 | { |
340 | int i; | 341 | int i; |
341 | 342 | ||
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 53cdbd39ec8e..b1d17eeb59b8 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -1186,7 +1186,7 @@ void __init arm_mm_memblock_reserve(void) | |||
1186 | * called function. This means you can't use any function or debugging | 1186 | * called function. This means you can't use any function or debugging |
1187 | * method which may touch any device, otherwise the kernel _will_ crash. | 1187 | * method which may touch any device, otherwise the kernel _will_ crash. |
1188 | */ | 1188 | */ |
1189 | static void __init devicemaps_init(struct machine_desc *mdesc) | 1189 | static void __init devicemaps_init(const struct machine_desc *mdesc) |
1190 | { | 1190 | { |
1191 | struct map_desc map; | 1191 | struct map_desc map; |
1192 | unsigned long addr; | 1192 | unsigned long addr; |
@@ -1319,7 +1319,7 @@ static void __init map_lowmem(void) | |||
1319 | * paging_init() sets up the page tables, initialises the zone memory | 1319 | * paging_init() sets up the page tables, initialises the zone memory |
1320 | * maps, and sets up the zero page, bad page and bad page tables. | 1320 | * maps, and sets up the zero page, bad page and bad page tables. |
1321 | */ | 1321 | */ |
1322 | void __init paging_init(struct machine_desc *mdesc) | 1322 | void __init paging_init(const struct machine_desc *mdesc) |
1323 | { | 1323 | { |
1324 | void *zero_page; | 1324 | void *zero_page; |
1325 | 1325 | ||
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 1fa50100ab6a..34d4ab217bab 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c | |||
@@ -299,7 +299,7 @@ void __init sanity_check_meminfo(void) | |||
299 | * paging_init() sets up the page tables, initialises the zone memory | 299 | * paging_init() sets up the page tables, initialises the zone memory |
300 | * maps, and sets up the zero page, bad page and bad page tables. | 300 | * maps, and sets up the zero page, bad page and bad page tables. |
301 | */ | 301 | */ |
302 | void __init paging_init(struct machine_desc *mdesc) | 302 | void __init paging_init(const struct machine_desc *mdesc) |
303 | { | 303 | { |
304 | early_trap_init((void *)CONFIG_VECTORS_BASE); | 304 | early_trap_init((void *)CONFIG_VECTORS_BASE); |
305 | mpu_setup(); | 305 | mpu_setup(); |
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S index d5146b98c8d1..db79b62c92fb 100644 --- a/arch/arm/mm/proc-feroceon.S +++ b/arch/arm/mm/proc-feroceon.S | |||
@@ -514,6 +514,32 @@ ENTRY(cpu_feroceon_set_pte_ext) | |||
514 | #endif | 514 | #endif |
515 | mov pc, lr | 515 | mov pc, lr |
516 | 516 | ||
517 | /* Suspend/resume support: taken from arch/arm/mm/proc-arm926.S */ | ||
518 | .globl cpu_feroceon_suspend_size | ||
519 | .equ cpu_feroceon_suspend_size, 4 * 3 | ||
520 | #ifdef CONFIG_ARM_CPU_SUSPEND | ||
521 | ENTRY(cpu_feroceon_do_suspend) | ||
522 | stmfd sp!, {r4 - r6, lr} | ||
523 | mrc p15, 0, r4, c13, c0, 0 @ PID | ||
524 | mrc p15, 0, r5, c3, c0, 0 @ Domain ID | ||
525 | mrc p15, 0, r6, c1, c0, 0 @ Control register | ||
526 | stmia r0, {r4 - r6} | ||
527 | ldmfd sp!, {r4 - r6, pc} | ||
528 | ENDPROC(cpu_feroceon_do_suspend) | ||
529 | |||
530 | ENTRY(cpu_feroceon_do_resume) | ||
531 | mov ip, #0 | ||
532 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I+D TLBs | ||
533 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I+D caches | ||
534 | ldmia r0, {r4 - r6} | ||
535 | mcr p15, 0, r4, c13, c0, 0 @ PID | ||
536 | mcr p15, 0, r5, c3, c0, 0 @ Domain ID | ||
537 | mcr p15, 0, r1, c2, c0, 0 @ TTB address | ||
538 | mov r0, r6 @ control register | ||
539 | b cpu_resume_mmu | ||
540 | ENDPROC(cpu_feroceon_do_resume) | ||
541 | #endif | ||
542 | |||
517 | .type __feroceon_setup, #function | 543 | .type __feroceon_setup, #function |
518 | __feroceon_setup: | 544 | __feroceon_setup: |
519 | mov r0, #0 | 545 | mov r0, #0 |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 73398bcf9bd8..c63d9bdee51e 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -83,7 +83,7 @@ ENTRY(cpu_v7_dcache_clean_area) | |||
83 | add r0, r0, r2 | 83 | add r0, r0, r2 |
84 | subs r1, r1, r2 | 84 | subs r1, r1, r2 |
85 | bhi 2b | 85 | bhi 2b |
86 | dsb | 86 | dsb ishst |
87 | mov pc, lr | 87 | mov pc, lr |
88 | ENDPROC(cpu_v7_dcache_clean_area) | 88 | ENDPROC(cpu_v7_dcache_clean_area) |
89 | 89 | ||
@@ -330,7 +330,19 @@ __v7_setup: | |||
330 | 1: | 330 | 1: |
331 | #endif | 331 | #endif |
332 | 332 | ||
333 | 3: mov r10, #0 | 333 | /* Cortex-A15 Errata */ |
334 | 3: ldr r10, =0x00000c0f @ Cortex-A15 primary part number | ||
335 | teq r0, r10 | ||
336 | bne 4f | ||
337 | |||
338 | #ifdef CONFIG_ARM_ERRATA_773022 | ||
339 | cmp r6, #0x4 @ only present up to r0p4 | ||
340 | mrcle p15, 0, r10, c1, c0, 1 @ read aux control register | ||
341 | orrle r10, r10, #1 << 1 @ disable loop buffer | ||
342 | mcrle p15, 0, r10, c1, c0, 1 @ write aux control register | ||
343 | #endif | ||
344 | |||
345 | 4: mov r10, #0 | ||
334 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate | 346 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate |
335 | dsb | 347 | dsb |
336 | #ifdef CONFIG_MMU | 348 | #ifdef CONFIG_MMU |
diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S index ea94765acf9a..355308767bae 100644 --- a/arch/arm/mm/tlb-v7.S +++ b/arch/arm/mm/tlb-v7.S | |||
@@ -35,7 +35,7 @@ | |||
35 | ENTRY(v7wbi_flush_user_tlb_range) | 35 | ENTRY(v7wbi_flush_user_tlb_range) |
36 | vma_vm_mm r3, r2 @ get vma->vm_mm | 36 | vma_vm_mm r3, r2 @ get vma->vm_mm |
37 | mmid r3, r3 @ get vm_mm->context.id | 37 | mmid r3, r3 @ get vm_mm->context.id |
38 | dsb | 38 | dsb ish |
39 | mov r0, r0, lsr #PAGE_SHIFT @ align address | 39 | mov r0, r0, lsr #PAGE_SHIFT @ align address |
40 | mov r1, r1, lsr #PAGE_SHIFT | 40 | mov r1, r1, lsr #PAGE_SHIFT |
41 | asid r3, r3 @ mask ASID | 41 | asid r3, r3 @ mask ASID |
@@ -56,7 +56,7 @@ ENTRY(v7wbi_flush_user_tlb_range) | |||
56 | add r0, r0, #PAGE_SZ | 56 | add r0, r0, #PAGE_SZ |
57 | cmp r0, r1 | 57 | cmp r0, r1 |
58 | blo 1b | 58 | blo 1b |
59 | dsb | 59 | dsb ish |
60 | mov pc, lr | 60 | mov pc, lr |
61 | ENDPROC(v7wbi_flush_user_tlb_range) | 61 | ENDPROC(v7wbi_flush_user_tlb_range) |
62 | 62 | ||
@@ -69,7 +69,7 @@ ENDPROC(v7wbi_flush_user_tlb_range) | |||
69 | * - end - end address (exclusive, may not be aligned) | 69 | * - end - end address (exclusive, may not be aligned) |
70 | */ | 70 | */ |
71 | ENTRY(v7wbi_flush_kern_tlb_range) | 71 | ENTRY(v7wbi_flush_kern_tlb_range) |
72 | dsb | 72 | dsb ish |
73 | mov r0, r0, lsr #PAGE_SHIFT @ align address | 73 | mov r0, r0, lsr #PAGE_SHIFT @ align address |
74 | mov r1, r1, lsr #PAGE_SHIFT | 74 | mov r1, r1, lsr #PAGE_SHIFT |
75 | mov r0, r0, lsl #PAGE_SHIFT | 75 | mov r0, r0, lsl #PAGE_SHIFT |
@@ -84,7 +84,7 @@ ENTRY(v7wbi_flush_kern_tlb_range) | |||
84 | add r0, r0, #PAGE_SZ | 84 | add r0, r0, #PAGE_SZ |
85 | cmp r0, r1 | 85 | cmp r0, r1 |
86 | blo 1b | 86 | blo 1b |
87 | dsb | 87 | dsb ish |
88 | isb | 88 | isb |
89 | mov pc, lr | 89 | mov pc, lr |
90 | ENDPROC(v7wbi_flush_kern_tlb_range) | 90 | ENDPROC(v7wbi_flush_kern_tlb_range) |
diff --git a/arch/arm/plat-samsung/init.c b/arch/arm/plat-samsung/init.c index 3e5c4619caa5..50a3ea0037db 100644 --- a/arch/arm/plat-samsung/init.c +++ b/arch/arm/plat-samsung/init.c | |||
@@ -55,12 +55,13 @@ void __init s3c_init_cpu(unsigned long idcode, | |||
55 | 55 | ||
56 | printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode); | 56 | printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode); |
57 | 57 | ||
58 | if (cpu->map_io == NULL || cpu->init == NULL) { | 58 | if (cpu->init == NULL) { |
59 | printk(KERN_ERR "CPU %s support not enabled\n", cpu->name); | 59 | printk(KERN_ERR "CPU %s support not enabled\n", cpu->name); |
60 | panic("Unsupported Samsung CPU"); | 60 | panic("Unsupported Samsung CPU"); |
61 | } | 61 | } |
62 | 62 | ||
63 | cpu->map_io(); | 63 | if (cpu->map_io) |
64 | cpu->map_io(); | ||
64 | } | 65 | } |
65 | 66 | ||
66 | /* s3c24xx_init_clocks | 67 | /* s3c24xx_init_clocks |
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index 8d10dc8a1e17..3e5d3115a2a6 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S | |||
@@ -78,6 +78,11 @@ | |||
78 | ENTRY(vfp_support_entry) | 78 | ENTRY(vfp_support_entry) |
79 | DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 | 79 | DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 |
80 | 80 | ||
81 | ldr r3, [sp, #S_PSR] @ Neither lazy restore nor FP exceptions | ||
82 | and r3, r3, #MODE_MASK @ are supported in kernel mode | ||
83 | teq r3, #USR_MODE | ||
84 | bne vfp_kmode_exception @ Returns through lr | ||
85 | |||
81 | VFPFMRX r1, FPEXC @ Is the VFP enabled? | 86 | VFPFMRX r1, FPEXC @ Is the VFP enabled? |
82 | DBGSTR1 "fpexc %08x", r1 | 87 | DBGSTR1 "fpexc %08x", r1 |
83 | tst r1, #FPEXC_EN | 88 | tst r1, #FPEXC_EN |
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 5dfbb0b8e7f4..52b8f40b1c73 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/uaccess.h> | 21 | #include <linux/uaccess.h> |
22 | #include <linux/user.h> | 22 | #include <linux/user.h> |
23 | #include <linux/export.h> | ||
23 | 24 | ||
24 | #include <asm/cp15.h> | 25 | #include <asm/cp15.h> |
25 | #include <asm/cputype.h> | 26 | #include <asm/cputype.h> |
@@ -648,6 +649,72 @@ static int vfp_hotplug(struct notifier_block *b, unsigned long action, | |||
648 | return NOTIFY_OK; | 649 | return NOTIFY_OK; |
649 | } | 650 | } |
650 | 651 | ||
652 | void vfp_kmode_exception(void) | ||
653 | { | ||
654 | /* | ||
655 | * If we reach this point, a floating point exception has been raised | ||
656 | * while running in kernel mode. If the NEON/VFP unit was enabled at the | ||
657 | * time, it means a VFP instruction has been issued that requires | ||
658 | * software assistance to complete, something which is not currently | ||
659 | * supported in kernel mode. | ||
660 | * If the NEON/VFP unit was disabled, and the location pointed to below | ||
661 | * is properly preceded by a call to kernel_neon_begin(), something has | ||
662 | * caused the task to be scheduled out and back in again. In this case, | ||
663 | * rebuilding and running with CONFIG_DEBUG_ATOMIC_SLEEP enabled should | ||
664 | * be helpful in localizing the problem. | ||
665 | */ | ||
666 | if (fmrx(FPEXC) & FPEXC_EN) | ||
667 | pr_crit("BUG: unsupported FP instruction in kernel mode\n"); | ||
668 | else | ||
669 | pr_crit("BUG: FP instruction issued in kernel mode with FP unit disabled\n"); | ||
670 | } | ||
671 | |||
672 | #ifdef CONFIG_KERNEL_MODE_NEON | ||
673 | |||
674 | /* | ||
675 | * Kernel-side NEON support functions | ||
676 | */ | ||
677 | void kernel_neon_begin(void) | ||
678 | { | ||
679 | struct thread_info *thread = current_thread_info(); | ||
680 | unsigned int cpu; | ||
681 | u32 fpexc; | ||
682 | |||
683 | /* | ||
684 | * Kernel mode NEON is only allowed outside of interrupt context | ||
685 | * with preemption disabled. This will make sure that the kernel | ||
686 | * mode NEON register contents never need to be preserved. | ||
687 | */ | ||
688 | BUG_ON(in_interrupt()); | ||
689 | cpu = get_cpu(); | ||
690 | |||
691 | fpexc = fmrx(FPEXC) | FPEXC_EN; | ||
692 | fmxr(FPEXC, fpexc); | ||
693 | |||
694 | /* | ||
695 | * Save the userland NEON/VFP state. Under UP, | ||
696 | * the owner could be a task other than 'current' | ||
697 | */ | ||
698 | if (vfp_state_in_hw(cpu, thread)) | ||
699 | vfp_save_state(&thread->vfpstate, fpexc); | ||
700 | #ifndef CONFIG_SMP | ||
701 | else if (vfp_current_hw_state[cpu] != NULL) | ||
702 | vfp_save_state(vfp_current_hw_state[cpu], fpexc); | ||
703 | #endif | ||
704 | vfp_current_hw_state[cpu] = NULL; | ||
705 | } | ||
706 | EXPORT_SYMBOL(kernel_neon_begin); | ||
707 | |||
708 | void kernel_neon_end(void) | ||
709 | { | ||
710 | /* Disable the NEON/VFP unit. */ | ||
711 | fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN); | ||
712 | put_cpu(); | ||
713 | } | ||
714 | EXPORT_SYMBOL(kernel_neon_end); | ||
715 | |||
716 | #endif /* CONFIG_KERNEL_MODE_NEON */ | ||
717 | |||
651 | /* | 718 | /* |
652 | * VFP support code initialisation. | 719 | * VFP support code initialisation. |
653 | */ | 720 | */ |
@@ -731,4 +798,4 @@ static int __init vfp_init(void) | |||
731 | return 0; | 798 | return 0; |
732 | } | 799 | } |
733 | 800 | ||
734 | late_initcall(vfp_init); | 801 | core_initcall(vfp_init); |
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index c9770ba5c7df..8a6295c86209 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c | |||
@@ -170,6 +170,7 @@ static void __init xen_percpu_init(void *unused) | |||
170 | per_cpu(xen_vcpu, cpu) = vcpup; | 170 | per_cpu(xen_vcpu, cpu) = vcpup; |
171 | 171 | ||
172 | enable_percpu_irq(xen_events_irq, 0); | 172 | enable_percpu_irq(xen_events_irq, 0); |
173 | put_cpu(); | ||
173 | } | 174 | } |
174 | 175 | ||
175 | static void xen_restart(enum reboot_mode reboot_mode, const char *cmd) | 176 | static void xen_restart(enum reboot_mode reboot_mode, const char *cmd) |
diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h index c92de4163eba..b25763bc0ec4 100644 --- a/arch/arm64/include/asm/kvm_asm.h +++ b/arch/arm64/include/asm/kvm_asm.h | |||
@@ -42,14 +42,15 @@ | |||
42 | #define TPIDR_EL1 18 /* Thread ID, Privileged */ | 42 | #define TPIDR_EL1 18 /* Thread ID, Privileged */ |
43 | #define AMAIR_EL1 19 /* Aux Memory Attribute Indirection Register */ | 43 | #define AMAIR_EL1 19 /* Aux Memory Attribute Indirection Register */ |
44 | #define CNTKCTL_EL1 20 /* Timer Control Register (EL1) */ | 44 | #define CNTKCTL_EL1 20 /* Timer Control Register (EL1) */ |
45 | #define PAR_EL1 21 /* Physical Address Register */ | ||
45 | /* 32bit specific registers. Keep them at the end of the range */ | 46 | /* 32bit specific registers. Keep them at the end of the range */ |
46 | #define DACR32_EL2 21 /* Domain Access Control Register */ | 47 | #define DACR32_EL2 22 /* Domain Access Control Register */ |
47 | #define IFSR32_EL2 22 /* Instruction Fault Status Register */ | 48 | #define IFSR32_EL2 23 /* Instruction Fault Status Register */ |
48 | #define FPEXC32_EL2 23 /* Floating-Point Exception Control Register */ | 49 | #define FPEXC32_EL2 24 /* Floating-Point Exception Control Register */ |
49 | #define DBGVCR32_EL2 24 /* Debug Vector Catch Register */ | 50 | #define DBGVCR32_EL2 25 /* Debug Vector Catch Register */ |
50 | #define TEECR32_EL1 25 /* ThumbEE Configuration Register */ | 51 | #define TEECR32_EL1 26 /* ThumbEE Configuration Register */ |
51 | #define TEEHBR32_EL1 26 /* ThumbEE Handler Base Register */ | 52 | #define TEEHBR32_EL1 27 /* ThumbEE Handler Base Register */ |
52 | #define NR_SYS_REGS 27 | 53 | #define NR_SYS_REGS 28 |
53 | 54 | ||
54 | /* 32bit mapping */ | 55 | /* 32bit mapping */ |
55 | #define c0_MPIDR (MPIDR_EL1 * 2) /* MultiProcessor ID Register */ | 56 | #define c0_MPIDR (MPIDR_EL1 * 2) /* MultiProcessor ID Register */ |
@@ -69,6 +70,8 @@ | |||
69 | #define c5_AIFSR (AFSR1_EL1 * 2) /* Auxiliary Instr Fault Status R */ | 70 | #define c5_AIFSR (AFSR1_EL1 * 2) /* Auxiliary Instr Fault Status R */ |
70 | #define c6_DFAR (FAR_EL1 * 2) /* Data Fault Address Register */ | 71 | #define c6_DFAR (FAR_EL1 * 2) /* Data Fault Address Register */ |
71 | #define c6_IFAR (c6_DFAR + 1) /* Instruction Fault Address Register */ | 72 | #define c6_IFAR (c6_DFAR + 1) /* Instruction Fault Address Register */ |
73 | #define c7_PAR (PAR_EL1 * 2) /* Physical Address Register */ | ||
74 | #define c7_PAR_high (c7_PAR + 1) /* PAR top 32 bits */ | ||
72 | #define c10_PRRR (MAIR_EL1 * 2) /* Primary Region Remap Register */ | 75 | #define c10_PRRR (MAIR_EL1 * 2) /* Primary Region Remap Register */ |
73 | #define c10_NMRR (c10_PRRR + 1) /* Normal Memory Remap Register */ | 76 | #define c10_NMRR (c10_PRRR + 1) /* Normal Memory Remap Register */ |
74 | #define c12_VBAR (VBAR_EL1 * 2) /* Vector Base Address Register */ | 77 | #define c12_VBAR (VBAR_EL1 * 2) /* Vector Base Address Register */ |
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 644d73956864..0859a4ddd1e7 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h | |||
@@ -129,7 +129,7 @@ struct kvm_vcpu_arch { | |||
129 | struct kvm_mmu_memory_cache mmu_page_cache; | 129 | struct kvm_mmu_memory_cache mmu_page_cache; |
130 | 130 | ||
131 | /* Target CPU and feature flags */ | 131 | /* Target CPU and feature flags */ |
132 | u32 target; | 132 | int target; |
133 | DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES); | 133 | DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES); |
134 | 134 | ||
135 | /* Detect first run of a vcpu */ | 135 | /* Detect first run of a vcpu */ |
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 9ba33c40cdf8..12e6ccb88691 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c | |||
@@ -107,7 +107,12 @@ armpmu_map_cache_event(const unsigned (*cache_map) | |||
107 | static int | 107 | static int |
108 | armpmu_map_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config) | 108 | armpmu_map_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config) |
109 | { | 109 | { |
110 | int mapping = (*event_map)[config]; | 110 | int mapping; |
111 | |||
112 | if (config >= PERF_COUNT_HW_MAX) | ||
113 | return -EINVAL; | ||
114 | |||
115 | mapping = (*event_map)[config]; | ||
111 | return mapping == HW_OP_UNSUPPORTED ? -ENOENT : mapping; | 116 | return mapping == HW_OP_UNSUPPORTED ? -ENOENT : mapping; |
112 | } | 117 | } |
113 | 118 | ||
@@ -317,6 +322,9 @@ validate_event(struct pmu_hw_events *hw_events, | |||
317 | struct hw_perf_event fake_event = event->hw; | 322 | struct hw_perf_event fake_event = event->hw; |
318 | struct pmu *leader_pmu = event->group_leader->pmu; | 323 | struct pmu *leader_pmu = event->group_leader->pmu; |
319 | 324 | ||
325 | if (is_software_event(event)) | ||
326 | return 1; | ||
327 | |||
320 | if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF) | 328 | if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF) |
321 | return 1; | 329 | return 1; |
322 | 330 | ||
diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index ff985e3d8b72..1ac0bbbdddb2 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S | |||
@@ -214,6 +214,7 @@ __kvm_hyp_code_start: | |||
214 | mrs x21, tpidr_el1 | 214 | mrs x21, tpidr_el1 |
215 | mrs x22, amair_el1 | 215 | mrs x22, amair_el1 |
216 | mrs x23, cntkctl_el1 | 216 | mrs x23, cntkctl_el1 |
217 | mrs x24, par_el1 | ||
217 | 218 | ||
218 | stp x4, x5, [x3] | 219 | stp x4, x5, [x3] |
219 | stp x6, x7, [x3, #16] | 220 | stp x6, x7, [x3, #16] |
@@ -225,6 +226,7 @@ __kvm_hyp_code_start: | |||
225 | stp x18, x19, [x3, #112] | 226 | stp x18, x19, [x3, #112] |
226 | stp x20, x21, [x3, #128] | 227 | stp x20, x21, [x3, #128] |
227 | stp x22, x23, [x3, #144] | 228 | stp x22, x23, [x3, #144] |
229 | str x24, [x3, #160] | ||
228 | .endm | 230 | .endm |
229 | 231 | ||
230 | .macro restore_sysregs | 232 | .macro restore_sysregs |
@@ -243,6 +245,7 @@ __kvm_hyp_code_start: | |||
243 | ldp x18, x19, [x3, #112] | 245 | ldp x18, x19, [x3, #112] |
244 | ldp x20, x21, [x3, #128] | 246 | ldp x20, x21, [x3, #128] |
245 | ldp x22, x23, [x3, #144] | 247 | ldp x22, x23, [x3, #144] |
248 | ldr x24, [x3, #160] | ||
246 | 249 | ||
247 | msr vmpidr_el2, x4 | 250 | msr vmpidr_el2, x4 |
248 | msr csselr_el1, x5 | 251 | msr csselr_el1, x5 |
@@ -264,6 +267,7 @@ __kvm_hyp_code_start: | |||
264 | msr tpidr_el1, x21 | 267 | msr tpidr_el1, x21 |
265 | msr amair_el1, x22 | 268 | msr amair_el1, x22 |
266 | msr cntkctl_el1, x23 | 269 | msr cntkctl_el1, x23 |
270 | msr par_el1, x24 | ||
267 | .endm | 271 | .endm |
268 | 272 | ||
269 | .macro skip_32bit_state tmp, target | 273 | .macro skip_32bit_state tmp, target |
@@ -600,6 +604,8 @@ END(__kvm_vcpu_run) | |||
600 | 604 | ||
601 | // void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); | 605 | // void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); |
602 | ENTRY(__kvm_tlb_flush_vmid_ipa) | 606 | ENTRY(__kvm_tlb_flush_vmid_ipa) |
607 | dsb ishst | ||
608 | |||
603 | kern_hyp_va x0 | 609 | kern_hyp_va x0 |
604 | ldr x2, [x0, #KVM_VTTBR] | 610 | ldr x2, [x0, #KVM_VTTBR] |
605 | msr vttbr_el2, x2 | 611 | msr vttbr_el2, x2 |
@@ -621,6 +627,7 @@ ENTRY(__kvm_tlb_flush_vmid_ipa) | |||
621 | ENDPROC(__kvm_tlb_flush_vmid_ipa) | 627 | ENDPROC(__kvm_tlb_flush_vmid_ipa) |
622 | 628 | ||
623 | ENTRY(__kvm_flush_vm_context) | 629 | ENTRY(__kvm_flush_vm_context) |
630 | dsb ishst | ||
624 | tlbi alle1is | 631 | tlbi alle1is |
625 | ic ialluis | 632 | ic ialluis |
626 | dsb sy | 633 | dsb sy |
@@ -753,6 +760,10 @@ el1_trap: | |||
753 | */ | 760 | */ |
754 | tbnz x1, #7, 1f // S1PTW is set | 761 | tbnz x1, #7, 1f // S1PTW is set |
755 | 762 | ||
763 | /* Preserve PAR_EL1 */ | ||
764 | mrs x3, par_el1 | ||
765 | push x3, xzr | ||
766 | |||
756 | /* | 767 | /* |
757 | * Permission fault, HPFAR_EL2 is invalid. | 768 | * Permission fault, HPFAR_EL2 is invalid. |
758 | * Resolve the IPA the hard way using the guest VA. | 769 | * Resolve the IPA the hard way using the guest VA. |
@@ -766,6 +777,8 @@ el1_trap: | |||
766 | 777 | ||
767 | /* Read result */ | 778 | /* Read result */ |
768 | mrs x3, par_el1 | 779 | mrs x3, par_el1 |
780 | pop x0, xzr // Restore PAR_EL1 from the stack | ||
781 | msr par_el1, x0 | ||
769 | tbnz x3, #0, 3f // Bail out if we failed the translation | 782 | tbnz x3, #0, 3f // Bail out if we failed the translation |
770 | ubfx x3, x3, #12, #36 // Extract IPA | 783 | ubfx x3, x3, #12, #36 // Extract IPA |
771 | lsl x3, x3, #4 // and present it like HPFAR | 784 | lsl x3, x3, #4 // and present it like HPFAR |
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 94923609753b..02e9d09e1d80 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c | |||
@@ -211,6 +211,9 @@ static const struct sys_reg_desc sys_reg_descs[] = { | |||
211 | /* FAR_EL1 */ | 211 | /* FAR_EL1 */ |
212 | { Op0(0b11), Op1(0b000), CRn(0b0110), CRm(0b0000), Op2(0b000), | 212 | { Op0(0b11), Op1(0b000), CRn(0b0110), CRm(0b0000), Op2(0b000), |
213 | NULL, reset_unknown, FAR_EL1 }, | 213 | NULL, reset_unknown, FAR_EL1 }, |
214 | /* PAR_EL1 */ | ||
215 | { Op0(0b11), Op1(0b000), CRn(0b0111), CRm(0b0100), Op2(0b000), | ||
216 | NULL, reset_unknown, PAR_EL1 }, | ||
214 | 217 | ||
215 | /* PMINTENSET_EL1 */ | 218 | /* PMINTENSET_EL1 */ |
216 | { Op0(0b11), Op1(0b000), CRn(0b1001), CRm(0b1110), Op2(0b001), | 219 | { Op0(0b11), Op1(0b000), CRn(0b1001), CRm(0b1110), Op2(0b001), |
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index e773659ccf9f..46048d24328c 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c | |||
@@ -803,6 +803,32 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn, | |||
803 | dec_insn.next_pc_inc; | 803 | dec_insn.next_pc_inc; |
804 | return 1; | 804 | return 1; |
805 | break; | 805 | break; |
806 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
807 | case lwc2_op: /* This is bbit0 on Octeon */ | ||
808 | if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt)) == 0) | ||
809 | *contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2); | ||
810 | else | ||
811 | *contpc = regs->cp0_epc + 8; | ||
812 | return 1; | ||
813 | case ldc2_op: /* This is bbit032 on Octeon */ | ||
814 | if ((regs->regs[insn.i_format.rs] & (1ull<<(insn.i_format.rt + 32))) == 0) | ||
815 | *contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2); | ||
816 | else | ||
817 | *contpc = regs->cp0_epc + 8; | ||
818 | return 1; | ||
819 | case swc2_op: /* This is bbit1 on Octeon */ | ||
820 | if (regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt)) | ||
821 | *contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2); | ||
822 | else | ||
823 | *contpc = regs->cp0_epc + 8; | ||
824 | return 1; | ||
825 | case sdc2_op: /* This is bbit132 on Octeon */ | ||
826 | if (regs->regs[insn.i_format.rs] & (1ull<<(insn.i_format.rt + 32))) | ||
827 | *contpc = regs->cp0_epc + 4 + (insn.i_format.simmediate << 2); | ||
828 | else | ||
829 | *contpc = regs->cp0_epc + 8; | ||
830 | return 1; | ||
831 | #endif | ||
806 | case cop0_op: | 832 | case cop0_op: |
807 | case cop1_op: | 833 | case cop1_op: |
808 | case cop2_op: | 834 | case cop2_op: |
diff --git a/arch/x86/include/asm/bootparam_utils.h b/arch/x86/include/asm/bootparam_utils.h index 653668d140f9..4a8cb8d7cbd5 100644 --- a/arch/x86/include/asm/bootparam_utils.h +++ b/arch/x86/include/asm/bootparam_utils.h | |||
@@ -35,9 +35,9 @@ static void sanitize_boot_params(struct boot_params *boot_params) | |||
35 | */ | 35 | */ |
36 | if (boot_params->sentinel) { | 36 | if (boot_params->sentinel) { |
37 | /* fields in boot_params are left uninitialized, clear them */ | 37 | /* fields in boot_params are left uninitialized, clear them */ |
38 | memset(&boot_params->olpc_ofw_header, 0, | 38 | memset(&boot_params->ext_ramdisk_image, 0, |
39 | (char *)&boot_params->efi_info - | 39 | (char *)&boot_params->efi_info - |
40 | (char *)&boot_params->olpc_ofw_header); | 40 | (char *)&boot_params->ext_ramdisk_image); |
41 | memset(&boot_params->kbd_status, 0, | 41 | memset(&boot_params->kbd_status, 0, |
42 | (char *)&boot_params->hdr - | 42 | (char *)&boot_params->hdr - |
43 | (char *)&boot_params->kbd_status); | 43 | (char *)&boot_params->kbd_status); |
diff --git a/arch/x86/include/asm/microcode_amd.h b/arch/x86/include/asm/microcode_amd.h index 50e5c58ced23..4c019179a57d 100644 --- a/arch/x86/include/asm/microcode_amd.h +++ b/arch/x86/include/asm/microcode_amd.h | |||
@@ -59,7 +59,7 @@ static inline u16 find_equiv_id(struct equiv_cpu_entry *equiv_cpu_table, | |||
59 | 59 | ||
60 | extern int __apply_microcode_amd(struct microcode_amd *mc_amd); | 60 | extern int __apply_microcode_amd(struct microcode_amd *mc_amd); |
61 | extern int apply_microcode_amd(int cpu); | 61 | extern int apply_microcode_amd(int cpu); |
62 | extern enum ucode_state load_microcode_amd(int cpu, const u8 *data, size_t size); | 62 | extern enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size); |
63 | 63 | ||
64 | #ifdef CONFIG_MICROCODE_AMD_EARLY | 64 | #ifdef CONFIG_MICROCODE_AMD_EARLY |
65 | #ifdef CONFIG_X86_32 | 65 | #ifdef CONFIG_X86_32 |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index f654ecefea5b..08a089043ccf 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -512,7 +512,7 @@ static void early_init_amd(struct cpuinfo_x86 *c) | |||
512 | 512 | ||
513 | static const int amd_erratum_383[]; | 513 | static const int amd_erratum_383[]; |
514 | static const int amd_erratum_400[]; | 514 | static const int amd_erratum_400[]; |
515 | static bool cpu_has_amd_erratum(const int *erratum); | 515 | static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum); |
516 | 516 | ||
517 | static void init_amd(struct cpuinfo_x86 *c) | 517 | static void init_amd(struct cpuinfo_x86 *c) |
518 | { | 518 | { |
@@ -729,11 +729,11 @@ static void init_amd(struct cpuinfo_x86 *c) | |||
729 | value &= ~(1ULL << 24); | 729 | value &= ~(1ULL << 24); |
730 | wrmsrl_safe(MSR_AMD64_BU_CFG2, value); | 730 | wrmsrl_safe(MSR_AMD64_BU_CFG2, value); |
731 | 731 | ||
732 | if (cpu_has_amd_erratum(amd_erratum_383)) | 732 | if (cpu_has_amd_erratum(c, amd_erratum_383)) |
733 | set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH); | 733 | set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH); |
734 | } | 734 | } |
735 | 735 | ||
736 | if (cpu_has_amd_erratum(amd_erratum_400)) | 736 | if (cpu_has_amd_erratum(c, amd_erratum_400)) |
737 | set_cpu_bug(c, X86_BUG_AMD_APIC_C1E); | 737 | set_cpu_bug(c, X86_BUG_AMD_APIC_C1E); |
738 | 738 | ||
739 | rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy); | 739 | rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy); |
@@ -878,23 +878,13 @@ static const int amd_erratum_400[] = | |||
878 | static const int amd_erratum_383[] = | 878 | static const int amd_erratum_383[] = |
879 | AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0, 0, 0xff, 0xf)); | 879 | AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0, 0, 0xff, 0xf)); |
880 | 880 | ||
881 | static bool cpu_has_amd_erratum(const int *erratum) | 881 | |
882 | static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum) | ||
882 | { | 883 | { |
883 | struct cpuinfo_x86 *cpu = __this_cpu_ptr(&cpu_info); | ||
884 | int osvw_id = *erratum++; | 884 | int osvw_id = *erratum++; |
885 | u32 range; | 885 | u32 range; |
886 | u32 ms; | 886 | u32 ms; |
887 | 887 | ||
888 | /* | ||
889 | * If called early enough that current_cpu_data hasn't been initialized | ||
890 | * yet, fall back to boot_cpu_data. | ||
891 | */ | ||
892 | if (cpu->x86 == 0) | ||
893 | cpu = &boot_cpu_data; | ||
894 | |||
895 | if (cpu->x86_vendor != X86_VENDOR_AMD) | ||
896 | return false; | ||
897 | |||
898 | if (osvw_id >= 0 && osvw_id < 65536 && | 888 | if (osvw_id >= 0 && osvw_id < 65536 && |
899 | cpu_has(cpu, X86_FEATURE_OSVW)) { | 889 | cpu_has(cpu, X86_FEATURE_OSVW)) { |
900 | u64 osvw_len; | 890 | u64 osvw_len; |
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 7a0adb7ee433..7123b5df479d 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
@@ -145,10 +145,9 @@ static int collect_cpu_info_amd(int cpu, struct cpu_signature *csig) | |||
145 | return 0; | 145 | return 0; |
146 | } | 146 | } |
147 | 147 | ||
148 | static unsigned int verify_patch_size(int cpu, u32 patch_size, | 148 | static unsigned int verify_patch_size(u8 family, u32 patch_size, |
149 | unsigned int size) | 149 | unsigned int size) |
150 | { | 150 | { |
151 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
152 | u32 max_size; | 151 | u32 max_size; |
153 | 152 | ||
154 | #define F1XH_MPB_MAX_SIZE 2048 | 153 | #define F1XH_MPB_MAX_SIZE 2048 |
@@ -156,7 +155,7 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size, | |||
156 | #define F15H_MPB_MAX_SIZE 4096 | 155 | #define F15H_MPB_MAX_SIZE 4096 |
157 | #define F16H_MPB_MAX_SIZE 3458 | 156 | #define F16H_MPB_MAX_SIZE 3458 |
158 | 157 | ||
159 | switch (c->x86) { | 158 | switch (family) { |
160 | case 0x14: | 159 | case 0x14: |
161 | max_size = F14H_MPB_MAX_SIZE; | 160 | max_size = F14H_MPB_MAX_SIZE; |
162 | break; | 161 | break; |
@@ -277,9 +276,8 @@ static void cleanup(void) | |||
277 | * driver cannot continue functioning normally. In such cases, we tear | 276 | * driver cannot continue functioning normally. In such cases, we tear |
278 | * down everything we've used up so far and exit. | 277 | * down everything we've used up so far and exit. |
279 | */ | 278 | */ |
280 | static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | 279 | static int verify_and_add_patch(u8 family, u8 *fw, unsigned int leftover) |
281 | { | 280 | { |
282 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
283 | struct microcode_header_amd *mc_hdr; | 281 | struct microcode_header_amd *mc_hdr; |
284 | struct ucode_patch *patch; | 282 | struct ucode_patch *patch; |
285 | unsigned int patch_size, crnt_size, ret; | 283 | unsigned int patch_size, crnt_size, ret; |
@@ -299,7 +297,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | |||
299 | 297 | ||
300 | /* check if patch is for the current family */ | 298 | /* check if patch is for the current family */ |
301 | proc_fam = ((proc_fam >> 8) & 0xf) + ((proc_fam >> 20) & 0xff); | 299 | proc_fam = ((proc_fam >> 8) & 0xf) + ((proc_fam >> 20) & 0xff); |
302 | if (proc_fam != c->x86) | 300 | if (proc_fam != family) |
303 | return crnt_size; | 301 | return crnt_size; |
304 | 302 | ||
305 | if (mc_hdr->nb_dev_id || mc_hdr->sb_dev_id) { | 303 | if (mc_hdr->nb_dev_id || mc_hdr->sb_dev_id) { |
@@ -308,7 +306,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | |||
308 | return crnt_size; | 306 | return crnt_size; |
309 | } | 307 | } |
310 | 308 | ||
311 | ret = verify_patch_size(cpu, patch_size, leftover); | 309 | ret = verify_patch_size(family, patch_size, leftover); |
312 | if (!ret) { | 310 | if (!ret) { |
313 | pr_err("Patch-ID 0x%08x: size mismatch.\n", mc_hdr->patch_id); | 311 | pr_err("Patch-ID 0x%08x: size mismatch.\n", mc_hdr->patch_id); |
314 | return crnt_size; | 312 | return crnt_size; |
@@ -339,7 +337,8 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | |||
339 | return crnt_size; | 337 | return crnt_size; |
340 | } | 338 | } |
341 | 339 | ||
342 | static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t size) | 340 | static enum ucode_state __load_microcode_amd(u8 family, const u8 *data, |
341 | size_t size) | ||
343 | { | 342 | { |
344 | enum ucode_state ret = UCODE_ERROR; | 343 | enum ucode_state ret = UCODE_ERROR; |
345 | unsigned int leftover; | 344 | unsigned int leftover; |
@@ -362,7 +361,7 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz | |||
362 | } | 361 | } |
363 | 362 | ||
364 | while (leftover) { | 363 | while (leftover) { |
365 | crnt_size = verify_and_add_patch(cpu, fw, leftover); | 364 | crnt_size = verify_and_add_patch(family, fw, leftover); |
366 | if (crnt_size < 0) | 365 | if (crnt_size < 0) |
367 | return ret; | 366 | return ret; |
368 | 367 | ||
@@ -373,22 +372,22 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz | |||
373 | return UCODE_OK; | 372 | return UCODE_OK; |
374 | } | 373 | } |
375 | 374 | ||
376 | enum ucode_state load_microcode_amd(int cpu, const u8 *data, size_t size) | 375 | enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size) |
377 | { | 376 | { |
378 | enum ucode_state ret; | 377 | enum ucode_state ret; |
379 | 378 | ||
380 | /* free old equiv table */ | 379 | /* free old equiv table */ |
381 | free_equiv_cpu_table(); | 380 | free_equiv_cpu_table(); |
382 | 381 | ||
383 | ret = __load_microcode_amd(cpu, data, size); | 382 | ret = __load_microcode_amd(family, data, size); |
384 | 383 | ||
385 | if (ret != UCODE_OK) | 384 | if (ret != UCODE_OK) |
386 | cleanup(); | 385 | cleanup(); |
387 | 386 | ||
388 | #if defined(CONFIG_MICROCODE_AMD_EARLY) && defined(CONFIG_X86_32) | 387 | #if defined(CONFIG_MICROCODE_AMD_EARLY) && defined(CONFIG_X86_32) |
389 | /* save BSP's matching patch for early load */ | 388 | /* save BSP's matching patch for early load */ |
390 | if (cpu_data(cpu).cpu_index == boot_cpu_data.cpu_index) { | 389 | if (cpu_data(smp_processor_id()).cpu_index == boot_cpu_data.cpu_index) { |
391 | struct ucode_patch *p = find_patch(cpu); | 390 | struct ucode_patch *p = find_patch(smp_processor_id()); |
392 | if (p) { | 391 | if (p) { |
393 | memset(amd_bsp_mpb, 0, MPB_MAX_SIZE); | 392 | memset(amd_bsp_mpb, 0, MPB_MAX_SIZE); |
394 | memcpy(amd_bsp_mpb, p->data, min_t(u32, ksize(p->data), | 393 | memcpy(amd_bsp_mpb, p->data, min_t(u32, ksize(p->data), |
@@ -441,7 +440,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, | |||
441 | goto fw_release; | 440 | goto fw_release; |
442 | } | 441 | } |
443 | 442 | ||
444 | ret = load_microcode_amd(cpu, fw->data, fw->size); | 443 | ret = load_microcode_amd(c->x86, fw->data, fw->size); |
445 | 444 | ||
446 | fw_release: | 445 | fw_release: |
447 | release_firmware(fw); | 446 | release_firmware(fw); |
diff --git a/arch/x86/kernel/microcode_amd_early.c b/arch/x86/kernel/microcode_amd_early.c index 1d14ffee5749..6073104ccaa3 100644 --- a/arch/x86/kernel/microcode_amd_early.c +++ b/arch/x86/kernel/microcode_amd_early.c | |||
@@ -238,25 +238,17 @@ static void __init collect_cpu_sig_on_bsp(void *arg) | |||
238 | uci->cpu_sig.sig = cpuid_eax(0x00000001); | 238 | uci->cpu_sig.sig = cpuid_eax(0x00000001); |
239 | } | 239 | } |
240 | #else | 240 | #else |
241 | static void collect_cpu_info_amd_early(struct cpuinfo_x86 *c, | 241 | void load_ucode_amd_ap(void) |
242 | struct ucode_cpu_info *uci) | ||
243 | { | 242 | { |
243 | unsigned int cpu = smp_processor_id(); | ||
244 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu; | ||
244 | u32 rev, eax; | 245 | u32 rev, eax; |
245 | 246 | ||
246 | rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax); | 247 | rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax); |
247 | eax = cpuid_eax(0x00000001); | 248 | eax = cpuid_eax(0x00000001); |
248 | 249 | ||
249 | uci->cpu_sig.sig = eax; | ||
250 | uci->cpu_sig.rev = rev; | 250 | uci->cpu_sig.rev = rev; |
251 | c->microcode = rev; | 251 | uci->cpu_sig.sig = eax; |
252 | c->x86 = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); | ||
253 | } | ||
254 | |||
255 | void load_ucode_amd_ap(void) | ||
256 | { | ||
257 | unsigned int cpu = smp_processor_id(); | ||
258 | |||
259 | collect_cpu_info_amd_early(&cpu_data(cpu), ucode_cpu_info + cpu); | ||
260 | 252 | ||
261 | if (cpu && !ucode_loaded) { | 253 | if (cpu && !ucode_loaded) { |
262 | void *ucode; | 254 | void *ucode; |
@@ -265,8 +257,10 @@ void load_ucode_amd_ap(void) | |||
265 | return; | 257 | return; |
266 | 258 | ||
267 | ucode = (void *)(initrd_start + ucode_offset); | 259 | ucode = (void *)(initrd_start + ucode_offset); |
268 | if (load_microcode_amd(0, ucode, ucode_size) != UCODE_OK) | 260 | eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); |
261 | if (load_microcode_amd(eax, ucode, ucode_size) != UCODE_OK) | ||
269 | return; | 262 | return; |
263 | |||
270 | ucode_loaded = true; | 264 | ucode_loaded = true; |
271 | } | 265 | } |
272 | 266 | ||
@@ -278,6 +272,8 @@ int __init save_microcode_in_initrd_amd(void) | |||
278 | { | 272 | { |
279 | enum ucode_state ret; | 273 | enum ucode_state ret; |
280 | void *ucode; | 274 | void *ucode; |
275 | u32 eax; | ||
276 | |||
281 | #ifdef CONFIG_X86_32 | 277 | #ifdef CONFIG_X86_32 |
282 | unsigned int bsp = boot_cpu_data.cpu_index; | 278 | unsigned int bsp = boot_cpu_data.cpu_index; |
283 | struct ucode_cpu_info *uci = ucode_cpu_info + bsp; | 279 | struct ucode_cpu_info *uci = ucode_cpu_info + bsp; |
@@ -293,7 +289,10 @@ int __init save_microcode_in_initrd_amd(void) | |||
293 | return 0; | 289 | return 0; |
294 | 290 | ||
295 | ucode = (void *)(initrd_start + ucode_offset); | 291 | ucode = (void *)(initrd_start + ucode_offset); |
296 | ret = load_microcode_amd(0, ucode, ucode_size); | 292 | eax = cpuid_eax(0x00000001); |
293 | eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); | ||
294 | |||
295 | ret = load_microcode_amd(eax, ucode, ucode_size); | ||
297 | if (ret != UCODE_OK) | 296 | if (ret != UCODE_OK) |
298 | return -EINVAL; | 297 | return -EINVAL; |
299 | 298 | ||
diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index 48f8375e4c6b..30277e27431a 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c | |||
@@ -101,7 +101,7 @@ static void find_start_end(unsigned long flags, unsigned long *begin, | |||
101 | *begin = new_begin; | 101 | *begin = new_begin; |
102 | } | 102 | } |
103 | } else { | 103 | } else { |
104 | *begin = mmap_legacy_base(); | 104 | *begin = current->mm->mmap_legacy_base; |
105 | *end = TASK_SIZE; | 105 | *end = TASK_SIZE; |
106 | } | 106 | } |
107 | } | 107 | } |
diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index f63778cb2363..25e7e1372bb2 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c | |||
@@ -98,7 +98,7 @@ static unsigned long mmap_base(void) | |||
98 | * Bottom-up (legacy) layout on X86_32 did not support randomization, X86_64 | 98 | * Bottom-up (legacy) layout on X86_32 did not support randomization, X86_64 |
99 | * does, but not when emulating X86_32 | 99 | * does, but not when emulating X86_32 |
100 | */ | 100 | */ |
101 | unsigned long mmap_legacy_base(void) | 101 | static unsigned long mmap_legacy_base(void) |
102 | { | 102 | { |
103 | if (mmap_is_ia32()) | 103 | if (mmap_is_ia32()) |
104 | return TASK_UNMAPPED_BASE; | 104 | return TASK_UNMAPPED_BASE; |
@@ -112,11 +112,13 @@ unsigned long mmap_legacy_base(void) | |||
112 | */ | 112 | */ |
113 | void arch_pick_mmap_layout(struct mm_struct *mm) | 113 | void arch_pick_mmap_layout(struct mm_struct *mm) |
114 | { | 114 | { |
115 | mm->mmap_legacy_base = mmap_legacy_base(); | ||
116 | mm->mmap_base = mmap_base(); | ||
117 | |||
115 | if (mmap_is_legacy()) { | 118 | if (mmap_is_legacy()) { |
116 | mm->mmap_base = mmap_legacy_base(); | 119 | mm->mmap_base = mm->mmap_legacy_base; |
117 | mm->get_unmapped_area = arch_get_unmapped_area; | 120 | mm->get_unmapped_area = arch_get_unmapped_area; |
118 | } else { | 121 | } else { |
119 | mm->mmap_base = mmap_base(); | ||
120 | mm->get_unmapped_area = arch_get_unmapped_area_topdown; | 122 | mm->get_unmapped_area = arch_get_unmapped_area_topdown; |
121 | } | 123 | } |
122 | } | 124 | } |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 056d11faef21..8f3eea6b80c5 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -313,6 +313,17 @@ static void xen_align_and_add_e820_region(u64 start, u64 size, int type) | |||
313 | e820_add_region(start, end - start, type); | 313 | e820_add_region(start, end - start, type); |
314 | } | 314 | } |
315 | 315 | ||
316 | void xen_ignore_unusable(struct e820entry *list, size_t map_size) | ||
317 | { | ||
318 | struct e820entry *entry; | ||
319 | unsigned int i; | ||
320 | |||
321 | for (i = 0, entry = list; i < map_size; i++, entry++) { | ||
322 | if (entry->type == E820_UNUSABLE) | ||
323 | entry->type = E820_RAM; | ||
324 | } | ||
325 | } | ||
326 | |||
316 | /** | 327 | /** |
317 | * machine_specific_memory_setup - Hook for machine specific memory setup. | 328 | * machine_specific_memory_setup - Hook for machine specific memory setup. |
318 | **/ | 329 | **/ |
@@ -353,6 +364,17 @@ char * __init xen_memory_setup(void) | |||
353 | } | 364 | } |
354 | BUG_ON(rc); | 365 | BUG_ON(rc); |
355 | 366 | ||
367 | /* | ||
368 | * Xen won't allow a 1:1 mapping to be created to UNUSABLE | ||
369 | * regions, so if we're using the machine memory map leave the | ||
370 | * region as RAM as it is in the pseudo-physical map. | ||
371 | * | ||
372 | * UNUSABLE regions in domUs are not handled and will need | ||
373 | * a patch in the future. | ||
374 | */ | ||
375 | if (xen_initial_domain()) | ||
376 | xen_ignore_unusable(map, memmap.nr_entries); | ||
377 | |||
356 | /* Make sure the Xen-supplied memory map is well-ordered. */ | 378 | /* Make sure the Xen-supplied memory map is well-ordered. */ |
357 | sanitize_e820_map(map, memmap.nr_entries, &memmap.nr_entries); | 379 | sanitize_e820_map(map, memmap.nr_entries, &memmap.nr_entries); |
358 | 380 | ||
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index ca92754eb846..b81c88e51daa 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -694,8 +694,15 @@ static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus) | |||
694 | static int xen_hvm_cpu_up(unsigned int cpu, struct task_struct *tidle) | 694 | static int xen_hvm_cpu_up(unsigned int cpu, struct task_struct *tidle) |
695 | { | 695 | { |
696 | int rc; | 696 | int rc; |
697 | rc = native_cpu_up(cpu, tidle); | 697 | /* |
698 | WARN_ON (xen_smp_intr_init(cpu)); | 698 | * xen_smp_intr_init() needs to run before native_cpu_up() |
699 | * so that IPI vectors are set up on the booting CPU before | ||
700 | * it is marked online in native_cpu_up(). | ||
701 | */ | ||
702 | rc = xen_smp_intr_init(cpu); | ||
703 | WARN_ON(rc); | ||
704 | if (!rc) | ||
705 | rc = native_cpu_up(cpu, tidle); | ||
699 | return rc; | 706 | return rc; |
700 | } | 707 | } |
701 | 708 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index e1284b8dc6ee..3270d3c8ba4e 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -908,9 +908,6 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
908 | device->cap._DDC = 1; | 908 | device->cap._DDC = 1; |
909 | } | 909 | } |
910 | 910 | ||
911 | if (acpi_video_init_brightness(device)) | ||
912 | return; | ||
913 | |||
914 | if (acpi_video_backlight_support()) { | 911 | if (acpi_video_backlight_support()) { |
915 | struct backlight_properties props; | 912 | struct backlight_properties props; |
916 | struct pci_dev *pdev; | 913 | struct pci_dev *pdev; |
@@ -920,6 +917,9 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
920 | static int count = 0; | 917 | static int count = 0; |
921 | char *name; | 918 | char *name; |
922 | 919 | ||
920 | result = acpi_video_init_brightness(device); | ||
921 | if (result) | ||
922 | return; | ||
923 | name = kasprintf(GFP_KERNEL, "acpi_video%d", count); | 923 | name = kasprintf(GFP_KERNEL, "acpi_video%d", count); |
924 | if (!name) | 924 | if (!name) |
925 | return; | 925 | return; |
@@ -979,11 +979,6 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
979 | if (result) | 979 | if (result) |
980 | printk(KERN_ERR PREFIX "Create sysfs link\n"); | 980 | printk(KERN_ERR PREFIX "Create sysfs link\n"); |
981 | 981 | ||
982 | } else { | ||
983 | /* Remove the brightness object. */ | ||
984 | kfree(device->brightness->levels); | ||
985 | kfree(device->brightness); | ||
986 | device->brightness = NULL; | ||
987 | } | 982 | } |
988 | } | 983 | } |
989 | 984 | ||
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index 1c41722bb7e2..20fd337a5731 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
@@ -289,24 +289,24 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info) | |||
289 | 289 | ||
290 | /* Disable sending Early R_OK. | 290 | /* Disable sending Early R_OK. |
291 | * With "cached read" HDD testing and multiple ports busy on a SATA | 291 | * With "cached read" HDD testing and multiple ports busy on a SATA |
292 | * host controller, 3726 PMP will very rarely drop a deferred | 292 | * host controller, 3x26 PMP will very rarely drop a deferred |
293 | * R_OK that was intended for the host. Symptom will be all | 293 | * R_OK that was intended for the host. Symptom will be all |
294 | * 5 drives under test will timeout, get reset, and recover. | 294 | * 5 drives under test will timeout, get reset, and recover. |
295 | */ | 295 | */ |
296 | if (vendor == 0x1095 && devid == 0x3726) { | 296 | if (vendor == 0x1095 && (devid == 0x3726 || devid == 0x3826)) { |
297 | u32 reg; | 297 | u32 reg; |
298 | 298 | ||
299 | err_mask = sata_pmp_read(&ap->link, PMP_GSCR_SII_POL, ®); | 299 | err_mask = sata_pmp_read(&ap->link, PMP_GSCR_SII_POL, ®); |
300 | if (err_mask) { | 300 | if (err_mask) { |
301 | rc = -EIO; | 301 | rc = -EIO; |
302 | reason = "failed to read Sil3726 Private Register"; | 302 | reason = "failed to read Sil3x26 Private Register"; |
303 | goto fail; | 303 | goto fail; |
304 | } | 304 | } |
305 | reg &= ~0x1; | 305 | reg &= ~0x1; |
306 | err_mask = sata_pmp_write(&ap->link, PMP_GSCR_SII_POL, reg); | 306 | err_mask = sata_pmp_write(&ap->link, PMP_GSCR_SII_POL, reg); |
307 | if (err_mask) { | 307 | if (err_mask) { |
308 | rc = -EIO; | 308 | rc = -EIO; |
309 | reason = "failed to write Sil3726 Private Register"; | 309 | reason = "failed to write Sil3x26 Private Register"; |
310 | goto fail; | 310 | goto fail; |
311 | } | 311 | } |
312 | } | 312 | } |
@@ -383,8 +383,8 @@ static void sata_pmp_quirks(struct ata_port *ap) | |||
383 | u16 devid = sata_pmp_gscr_devid(gscr); | 383 | u16 devid = sata_pmp_gscr_devid(gscr); |
384 | struct ata_link *link; | 384 | struct ata_link *link; |
385 | 385 | ||
386 | if (vendor == 0x1095 && devid == 0x3726) { | 386 | if (vendor == 0x1095 && (devid == 0x3726 || devid == 0x3826)) { |
387 | /* sil3726 quirks */ | 387 | /* sil3x26 quirks */ |
388 | ata_for_each_link(link, ap, EDGE) { | 388 | ata_for_each_link(link, ap, EDGE) { |
389 | /* link reports offline after LPM */ | 389 | /* link reports offline after LPM */ |
390 | link->flags |= ATA_LFLAG_NO_LPM; | 390 | link->flags |= ATA_LFLAG_NO_LPM; |
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index 19720a0a4a65..851bd3f43ac6 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
@@ -293,6 +293,7 @@ static void fsl_sata_set_irq_coalescing(struct ata_host *host, | |||
293 | { | 293 | { |
294 | struct sata_fsl_host_priv *host_priv = host->private_data; | 294 | struct sata_fsl_host_priv *host_priv = host->private_data; |
295 | void __iomem *hcr_base = host_priv->hcr_base; | 295 | void __iomem *hcr_base = host_priv->hcr_base; |
296 | unsigned long flags; | ||
296 | 297 | ||
297 | if (count > ICC_MAX_INT_COUNT_THRESHOLD) | 298 | if (count > ICC_MAX_INT_COUNT_THRESHOLD) |
298 | count = ICC_MAX_INT_COUNT_THRESHOLD; | 299 | count = ICC_MAX_INT_COUNT_THRESHOLD; |
@@ -305,12 +306,12 @@ static void fsl_sata_set_irq_coalescing(struct ata_host *host, | |||
305 | (count > ICC_MIN_INT_COUNT_THRESHOLD)) | 306 | (count > ICC_MIN_INT_COUNT_THRESHOLD)) |
306 | ticks = ICC_SAFE_INT_TICKS; | 307 | ticks = ICC_SAFE_INT_TICKS; |
307 | 308 | ||
308 | spin_lock(&host->lock); | 309 | spin_lock_irqsave(&host->lock, flags); |
309 | iowrite32((count << 24 | ticks), hcr_base + ICC); | 310 | iowrite32((count << 24 | ticks), hcr_base + ICC); |
310 | 311 | ||
311 | intr_coalescing_count = count; | 312 | intr_coalescing_count = count; |
312 | intr_coalescing_ticks = ticks; | 313 | intr_coalescing_ticks = ticks; |
313 | spin_unlock(&host->lock); | 314 | spin_unlock_irqrestore(&host->lock, flags); |
314 | 315 | ||
315 | DPRINTK("interrupt coalescing, count = 0x%x, ticks = %x\n", | 316 | DPRINTK("interrupt coalescing, count = 0x%x, ticks = %x\n", |
316 | intr_coalescing_count, intr_coalescing_ticks); | 317 | intr_coalescing_count, intr_coalescing_ticks); |
diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c index d047d92a456f..e9a4f46d962e 100644 --- a/drivers/ata/sata_highbank.c +++ b/drivers/ata/sata_highbank.c | |||
@@ -86,11 +86,11 @@ struct ecx_plat_data { | |||
86 | 86 | ||
87 | #define SGPIO_SIGNALS 3 | 87 | #define SGPIO_SIGNALS 3 |
88 | #define ECX_ACTIVITY_BITS 0x300000 | 88 | #define ECX_ACTIVITY_BITS 0x300000 |
89 | #define ECX_ACTIVITY_SHIFT 2 | 89 | #define ECX_ACTIVITY_SHIFT 0 |
90 | #define ECX_LOCATE_BITS 0x80000 | 90 | #define ECX_LOCATE_BITS 0x80000 |
91 | #define ECX_LOCATE_SHIFT 1 | 91 | #define ECX_LOCATE_SHIFT 1 |
92 | #define ECX_FAULT_BITS 0x400000 | 92 | #define ECX_FAULT_BITS 0x400000 |
93 | #define ECX_FAULT_SHIFT 0 | 93 | #define ECX_FAULT_SHIFT 2 |
94 | static inline int sgpio_bit_shift(struct ecx_plat_data *pdata, u32 port, | 94 | static inline int sgpio_bit_shift(struct ecx_plat_data *pdata, u32 port, |
95 | u32 shift) | 95 | u32 shift) |
96 | { | 96 | { |
diff --git a/drivers/gpu/drm/gma500/psb_intel_sdvo.c b/drivers/gpu/drm/gma500/psb_intel_sdvo.c index 19e36603b23b..3bc8414533c9 100644 --- a/drivers/gpu/drm/gma500/psb_intel_sdvo.c +++ b/drivers/gpu/drm/gma500/psb_intel_sdvo.c | |||
@@ -500,7 +500,8 @@ static bool psb_intel_sdvo_read_response(struct psb_intel_sdvo *psb_intel_sdvo, | |||
500 | &status)) | 500 | &status)) |
501 | goto log_fail; | 501 | goto log_fail; |
502 | 502 | ||
503 | while (status == SDVO_CMD_STATUS_PENDING && retry--) { | 503 | while ((status == SDVO_CMD_STATUS_PENDING || |
504 | status == SDVO_CMD_STATUS_TARGET_NOT_SPECIFIED) && retry--) { | ||
504 | udelay(15); | 505 | udelay(15); |
505 | if (!psb_intel_sdvo_read_byte(psb_intel_sdvo, | 506 | if (!psb_intel_sdvo_read_byte(psb_intel_sdvo, |
506 | SDVO_I2C_CMD_STATUS, | 507 | SDVO_I2C_CMD_STATUS, |
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c index dc53a527126b..9e6578330801 100644 --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c | |||
@@ -85,9 +85,17 @@ static void i915_gem_unmap_dma_buf(struct dma_buf_attachment *attachment, | |||
85 | struct sg_table *sg, | 85 | struct sg_table *sg, |
86 | enum dma_data_direction dir) | 86 | enum dma_data_direction dir) |
87 | { | 87 | { |
88 | struct drm_i915_gem_object *obj = attachment->dmabuf->priv; | ||
89 | |||
90 | mutex_lock(&obj->base.dev->struct_mutex); | ||
91 | |||
88 | dma_unmap_sg(attachment->dev, sg->sgl, sg->nents, dir); | 92 | dma_unmap_sg(attachment->dev, sg->sgl, sg->nents, dir); |
89 | sg_free_table(sg); | 93 | sg_free_table(sg); |
90 | kfree(sg); | 94 | kfree(sg); |
95 | |||
96 | i915_gem_object_unpin_pages(obj); | ||
97 | |||
98 | mutex_unlock(&obj->base.dev->struct_mutex); | ||
91 | } | 99 | } |
92 | 100 | ||
93 | static void i915_gem_dmabuf_release(struct dma_buf *dma_buf) | 101 | static void i915_gem_dmabuf_release(struct dma_buf *dma_buf) |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 6f514297c483..53cddd985406 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -752,6 +752,8 @@ | |||
752 | will not assert AGPBUSY# and will only | 752 | will not assert AGPBUSY# and will only |
753 | be delivered when out of C3. */ | 753 | be delivered when out of C3. */ |
754 | #define INSTPM_FORCE_ORDERING (1<<7) /* GEN6+ */ | 754 | #define INSTPM_FORCE_ORDERING (1<<7) /* GEN6+ */ |
755 | #define INSTPM_TLB_INVALIDATE (1<<9) | ||
756 | #define INSTPM_SYNC_FLUSH (1<<5) | ||
755 | #define ACTHD 0x020c8 | 757 | #define ACTHD 0x020c8 |
756 | #define FW_BLC 0x020d8 | 758 | #define FW_BLC 0x020d8 |
757 | #define FW_BLC2 0x020dc | 759 | #define FW_BLC2 0x020dc |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e38b45786653..be79f477a38f 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -10042,6 +10042,8 @@ struct intel_display_error_state { | |||
10042 | 10042 | ||
10043 | u32 power_well_driver; | 10043 | u32 power_well_driver; |
10044 | 10044 | ||
10045 | int num_transcoders; | ||
10046 | |||
10045 | struct intel_cursor_error_state { | 10047 | struct intel_cursor_error_state { |
10046 | u32 control; | 10048 | u32 control; |
10047 | u32 position; | 10049 | u32 position; |
@@ -10050,16 +10052,7 @@ struct intel_display_error_state { | |||
10050 | } cursor[I915_MAX_PIPES]; | 10052 | } cursor[I915_MAX_PIPES]; |
10051 | 10053 | ||
10052 | struct intel_pipe_error_state { | 10054 | struct intel_pipe_error_state { |
10053 | enum transcoder cpu_transcoder; | ||
10054 | u32 conf; | ||
10055 | u32 source; | 10055 | u32 source; |
10056 | |||
10057 | u32 htotal; | ||
10058 | u32 hblank; | ||
10059 | u32 hsync; | ||
10060 | u32 vtotal; | ||
10061 | u32 vblank; | ||
10062 | u32 vsync; | ||
10063 | } pipe[I915_MAX_PIPES]; | 10056 | } pipe[I915_MAX_PIPES]; |
10064 | 10057 | ||
10065 | struct intel_plane_error_state { | 10058 | struct intel_plane_error_state { |
@@ -10071,6 +10064,19 @@ struct intel_display_error_state { | |||
10071 | u32 surface; | 10064 | u32 surface; |
10072 | u32 tile_offset; | 10065 | u32 tile_offset; |
10073 | } plane[I915_MAX_PIPES]; | 10066 | } plane[I915_MAX_PIPES]; |
10067 | |||
10068 | struct intel_transcoder_error_state { | ||
10069 | enum transcoder cpu_transcoder; | ||
10070 | |||
10071 | u32 conf; | ||
10072 | |||
10073 | u32 htotal; | ||
10074 | u32 hblank; | ||
10075 | u32 hsync; | ||
10076 | u32 vtotal; | ||
10077 | u32 vblank; | ||
10078 | u32 vsync; | ||
10079 | } transcoder[4]; | ||
10074 | }; | 10080 | }; |
10075 | 10081 | ||
10076 | struct intel_display_error_state * | 10082 | struct intel_display_error_state * |
@@ -10078,9 +10084,17 @@ intel_display_capture_error_state(struct drm_device *dev) | |||
10078 | { | 10084 | { |
10079 | drm_i915_private_t *dev_priv = dev->dev_private; | 10085 | drm_i915_private_t *dev_priv = dev->dev_private; |
10080 | struct intel_display_error_state *error; | 10086 | struct intel_display_error_state *error; |
10081 | enum transcoder cpu_transcoder; | 10087 | int transcoders[] = { |
10088 | TRANSCODER_A, | ||
10089 | TRANSCODER_B, | ||
10090 | TRANSCODER_C, | ||
10091 | TRANSCODER_EDP, | ||
10092 | }; | ||
10082 | int i; | 10093 | int i; |
10083 | 10094 | ||
10095 | if (INTEL_INFO(dev)->num_pipes == 0) | ||
10096 | return NULL; | ||
10097 | |||
10084 | error = kmalloc(sizeof(*error), GFP_ATOMIC); | 10098 | error = kmalloc(sizeof(*error), GFP_ATOMIC); |
10085 | if (error == NULL) | 10099 | if (error == NULL) |
10086 | return NULL; | 10100 | return NULL; |
@@ -10089,9 +10103,6 @@ intel_display_capture_error_state(struct drm_device *dev) | |||
10089 | error->power_well_driver = I915_READ(HSW_PWR_WELL_DRIVER); | 10103 | error->power_well_driver = I915_READ(HSW_PWR_WELL_DRIVER); |
10090 | 10104 | ||
10091 | for_each_pipe(i) { | 10105 | for_each_pipe(i) { |
10092 | cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv, i); | ||
10093 | error->pipe[i].cpu_transcoder = cpu_transcoder; | ||
10094 | |||
10095 | if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) { | 10106 | if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) { |
10096 | error->cursor[i].control = I915_READ(CURCNTR(i)); | 10107 | error->cursor[i].control = I915_READ(CURCNTR(i)); |
10097 | error->cursor[i].position = I915_READ(CURPOS(i)); | 10108 | error->cursor[i].position = I915_READ(CURPOS(i)); |
@@ -10115,14 +10126,25 @@ intel_display_capture_error_state(struct drm_device *dev) | |||
10115 | error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i)); | 10126 | error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i)); |
10116 | } | 10127 | } |
10117 | 10128 | ||
10118 | error->pipe[i].conf = I915_READ(PIPECONF(cpu_transcoder)); | ||
10119 | error->pipe[i].source = I915_READ(PIPESRC(i)); | 10129 | error->pipe[i].source = I915_READ(PIPESRC(i)); |
10120 | error->pipe[i].htotal = I915_READ(HTOTAL(cpu_transcoder)); | 10130 | } |
10121 | error->pipe[i].hblank = I915_READ(HBLANK(cpu_transcoder)); | 10131 | |
10122 | error->pipe[i].hsync = I915_READ(HSYNC(cpu_transcoder)); | 10132 | error->num_transcoders = INTEL_INFO(dev)->num_pipes; |
10123 | error->pipe[i].vtotal = I915_READ(VTOTAL(cpu_transcoder)); | 10133 | if (HAS_DDI(dev_priv->dev)) |
10124 | error->pipe[i].vblank = I915_READ(VBLANK(cpu_transcoder)); | 10134 | error->num_transcoders++; /* Account for eDP. */ |
10125 | error->pipe[i].vsync = I915_READ(VSYNC(cpu_transcoder)); | 10135 | |
10136 | for (i = 0; i < error->num_transcoders; i++) { | ||
10137 | enum transcoder cpu_transcoder = transcoders[i]; | ||
10138 | |||
10139 | error->transcoder[i].cpu_transcoder = cpu_transcoder; | ||
10140 | |||
10141 | error->transcoder[i].conf = I915_READ(PIPECONF(cpu_transcoder)); | ||
10142 | error->transcoder[i].htotal = I915_READ(HTOTAL(cpu_transcoder)); | ||
10143 | error->transcoder[i].hblank = I915_READ(HBLANK(cpu_transcoder)); | ||
10144 | error->transcoder[i].hsync = I915_READ(HSYNC(cpu_transcoder)); | ||
10145 | error->transcoder[i].vtotal = I915_READ(VTOTAL(cpu_transcoder)); | ||
10146 | error->transcoder[i].vblank = I915_READ(VBLANK(cpu_transcoder)); | ||
10147 | error->transcoder[i].vsync = I915_READ(VSYNC(cpu_transcoder)); | ||
10126 | } | 10148 | } |
10127 | 10149 | ||
10128 | /* In the code above we read the registers without checking if the power | 10150 | /* In the code above we read the registers without checking if the power |
@@ -10144,22 +10166,16 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m, | |||
10144 | { | 10166 | { |
10145 | int i; | 10167 | int i; |
10146 | 10168 | ||
10169 | if (!error) | ||
10170 | return; | ||
10171 | |||
10147 | err_printf(m, "Num Pipes: %d\n", INTEL_INFO(dev)->num_pipes); | 10172 | err_printf(m, "Num Pipes: %d\n", INTEL_INFO(dev)->num_pipes); |
10148 | if (HAS_POWER_WELL(dev)) | 10173 | if (HAS_POWER_WELL(dev)) |
10149 | err_printf(m, "PWR_WELL_CTL2: %08x\n", | 10174 | err_printf(m, "PWR_WELL_CTL2: %08x\n", |
10150 | error->power_well_driver); | 10175 | error->power_well_driver); |
10151 | for_each_pipe(i) { | 10176 | for_each_pipe(i) { |
10152 | err_printf(m, "Pipe [%d]:\n", i); | 10177 | err_printf(m, "Pipe [%d]:\n", i); |
10153 | err_printf(m, " CPU transcoder: %c\n", | ||
10154 | transcoder_name(error->pipe[i].cpu_transcoder)); | ||
10155 | err_printf(m, " CONF: %08x\n", error->pipe[i].conf); | ||
10156 | err_printf(m, " SRC: %08x\n", error->pipe[i].source); | 10178 | err_printf(m, " SRC: %08x\n", error->pipe[i].source); |
10157 | err_printf(m, " HTOTAL: %08x\n", error->pipe[i].htotal); | ||
10158 | err_printf(m, " HBLANK: %08x\n", error->pipe[i].hblank); | ||
10159 | err_printf(m, " HSYNC: %08x\n", error->pipe[i].hsync); | ||
10160 | err_printf(m, " VTOTAL: %08x\n", error->pipe[i].vtotal); | ||
10161 | err_printf(m, " VBLANK: %08x\n", error->pipe[i].vblank); | ||
10162 | err_printf(m, " VSYNC: %08x\n", error->pipe[i].vsync); | ||
10163 | 10179 | ||
10164 | err_printf(m, "Plane [%d]:\n", i); | 10180 | err_printf(m, "Plane [%d]:\n", i); |
10165 | err_printf(m, " CNTR: %08x\n", error->plane[i].control); | 10181 | err_printf(m, " CNTR: %08x\n", error->plane[i].control); |
@@ -10180,5 +10196,17 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m, | |||
10180 | err_printf(m, " POS: %08x\n", error->cursor[i].position); | 10196 | err_printf(m, " POS: %08x\n", error->cursor[i].position); |
10181 | err_printf(m, " BASE: %08x\n", error->cursor[i].base); | 10197 | err_printf(m, " BASE: %08x\n", error->cursor[i].base); |
10182 | } | 10198 | } |
10199 | |||
10200 | for (i = 0; i < error->num_transcoders; i++) { | ||
10201 | err_printf(m, " CPU transcoder: %c\n", | ||
10202 | transcoder_name(error->transcoder[i].cpu_transcoder)); | ||
10203 | err_printf(m, " CONF: %08x\n", error->transcoder[i].conf); | ||
10204 | err_printf(m, " HTOTAL: %08x\n", error->transcoder[i].htotal); | ||
10205 | err_printf(m, " HBLANK: %08x\n", error->transcoder[i].hblank); | ||
10206 | err_printf(m, " HSYNC: %08x\n", error->transcoder[i].hsync); | ||
10207 | err_printf(m, " VTOTAL: %08x\n", error->transcoder[i].vtotal); | ||
10208 | err_printf(m, " VBLANK: %08x\n", error->transcoder[i].vblank); | ||
10209 | err_printf(m, " VSYNC: %08x\n", error->transcoder[i].vsync); | ||
10210 | } | ||
10183 | } | 10211 | } |
10184 | #endif | 10212 | #endif |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 664118d8c1d6..079ef0129e74 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -968,6 +968,18 @@ void intel_ring_setup_status_page(struct intel_ring_buffer *ring) | |||
968 | 968 | ||
969 | I915_WRITE(mmio, (u32)ring->status_page.gfx_addr); | 969 | I915_WRITE(mmio, (u32)ring->status_page.gfx_addr); |
970 | POSTING_READ(mmio); | 970 | POSTING_READ(mmio); |
971 | |||
972 | /* Flush the TLB for this page */ | ||
973 | if (INTEL_INFO(dev)->gen >= 6) { | ||
974 | u32 reg = RING_INSTPM(ring->mmio_base); | ||
975 | I915_WRITE(reg, | ||
976 | _MASKED_BIT_ENABLE(INSTPM_TLB_INVALIDATE | | ||
977 | INSTPM_SYNC_FLUSH)); | ||
978 | if (wait_for((I915_READ(reg) & INSTPM_SYNC_FLUSH) == 0, | ||
979 | 1000)) | ||
980 | DRM_ERROR("%s: wait for SyncFlush to complete for TLB invalidation timed out\n", | ||
981 | ring->name); | ||
982 | } | ||
971 | } | 983 | } |
972 | 984 | ||
973 | static int | 985 | static int |
diff --git a/drivers/gpu/drm/nouveau/core/core/mm.c b/drivers/gpu/drm/nouveau/core/core/mm.c index d8291724dbd4..7a4e0891c5f8 100644 --- a/drivers/gpu/drm/nouveau/core/core/mm.c +++ b/drivers/gpu/drm/nouveau/core/core/mm.c | |||
@@ -98,6 +98,8 @@ nouveau_mm_head(struct nouveau_mm *mm, u8 type, u32 size_max, u32 size_min, | |||
98 | u32 splitoff; | 98 | u32 splitoff; |
99 | u32 s, e; | 99 | u32 s, e; |
100 | 100 | ||
101 | BUG_ON(!type); | ||
102 | |||
101 | list_for_each_entry(this, &mm->free, fl_entry) { | 103 | list_for_each_entry(this, &mm->free, fl_entry) { |
102 | e = this->offset + this->length; | 104 | e = this->offset + this->length; |
103 | s = this->offset; | 105 | s = this->offset; |
@@ -162,6 +164,8 @@ nouveau_mm_tail(struct nouveau_mm *mm, u8 type, u32 size_max, u32 size_min, | |||
162 | struct nouveau_mm_node *prev, *this, *next; | 164 | struct nouveau_mm_node *prev, *this, *next; |
163 | u32 mask = align - 1; | 165 | u32 mask = align - 1; |
164 | 166 | ||
167 | BUG_ON(!type); | ||
168 | |||
165 | list_for_each_entry_reverse(this, &mm->free, fl_entry) { | 169 | list_for_each_entry_reverse(this, &mm->free, fl_entry) { |
166 | u32 e = this->offset + this->length; | 170 | u32 e = this->offset + this->length; |
167 | u32 s = this->offset; | 171 | u32 s = this->offset; |
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/mc.h b/drivers/gpu/drm/nouveau/core/include/subdev/mc.h index d5502267c30f..9d2cd2006250 100644 --- a/drivers/gpu/drm/nouveau/core/include/subdev/mc.h +++ b/drivers/gpu/drm/nouveau/core/include/subdev/mc.h | |||
@@ -20,8 +20,8 @@ nouveau_mc(void *obj) | |||
20 | return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_MC]; | 20 | return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_MC]; |
21 | } | 21 | } |
22 | 22 | ||
23 | #define nouveau_mc_create(p,e,o,d) \ | 23 | #define nouveau_mc_create(p,e,o,m,d) \ |
24 | nouveau_mc_create_((p), (e), (o), sizeof(**d), (void **)d) | 24 | nouveau_mc_create_((p), (e), (o), (m), sizeof(**d), (void **)d) |
25 | #define nouveau_mc_destroy(p) ({ \ | 25 | #define nouveau_mc_destroy(p) ({ \ |
26 | struct nouveau_mc *pmc = (p); _nouveau_mc_dtor(nv_object(pmc)); \ | 26 | struct nouveau_mc *pmc = (p); _nouveau_mc_dtor(nv_object(pmc)); \ |
27 | }) | 27 | }) |
@@ -33,7 +33,8 @@ nouveau_mc(void *obj) | |||
33 | }) | 33 | }) |
34 | 34 | ||
35 | int nouveau_mc_create_(struct nouveau_object *, struct nouveau_object *, | 35 | int nouveau_mc_create_(struct nouveau_object *, struct nouveau_object *, |
36 | struct nouveau_oclass *, int, void **); | 36 | struct nouveau_oclass *, const struct nouveau_mc_intr *, |
37 | int, void **); | ||
37 | void _nouveau_mc_dtor(struct nouveau_object *); | 38 | void _nouveau_mc_dtor(struct nouveau_object *); |
38 | int _nouveau_mc_init(struct nouveau_object *); | 39 | int _nouveau_mc_init(struct nouveau_object *); |
39 | int _nouveau_mc_fini(struct nouveau_object *, bool); | 40 | int _nouveau_mc_fini(struct nouveau_object *, bool); |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c index 19e3a9a63a02..ab7ef0ac9e34 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c | |||
@@ -40,15 +40,15 @@ nv49_ram_create(struct nouveau_object *parent, struct nouveau_object *engine, | |||
40 | return ret; | 40 | return ret; |
41 | 41 | ||
42 | switch (pfb914 & 0x00000003) { | 42 | switch (pfb914 & 0x00000003) { |
43 | case 0x00000000: pfb->ram->type = NV_MEM_TYPE_DDR1; break; | 43 | case 0x00000000: ram->type = NV_MEM_TYPE_DDR1; break; |
44 | case 0x00000001: pfb->ram->type = NV_MEM_TYPE_DDR2; break; | 44 | case 0x00000001: ram->type = NV_MEM_TYPE_DDR2; break; |
45 | case 0x00000002: pfb->ram->type = NV_MEM_TYPE_GDDR3; break; | 45 | case 0x00000002: ram->type = NV_MEM_TYPE_GDDR3; break; |
46 | case 0x00000003: break; | 46 | case 0x00000003: break; |
47 | } | 47 | } |
48 | 48 | ||
49 | pfb->ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000; | 49 | ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000; |
50 | pfb->ram->parts = (nv_rd32(pfb, 0x100200) & 0x00000003) + 1; | 50 | ram->parts = (nv_rd32(pfb, 0x100200) & 0x00000003) + 1; |
51 | pfb->ram->tags = nv_rd32(pfb, 0x100320); | 51 | ram->tags = nv_rd32(pfb, 0x100320); |
52 | return 0; | 52 | return 0; |
53 | } | 53 | } |
54 | 54 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c index 7192aa6e5577..63a6aab86028 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c | |||
@@ -38,8 +38,8 @@ nv4e_ram_create(struct nouveau_object *parent, struct nouveau_object *engine, | |||
38 | if (ret) | 38 | if (ret) |
39 | return ret; | 39 | return ret; |
40 | 40 | ||
41 | pfb->ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000; | 41 | ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000; |
42 | pfb->ram->type = NV_MEM_TYPE_STOLEN; | 42 | ram->type = NV_MEM_TYPE_STOLEN; |
43 | return 0; | 43 | return 0; |
44 | } | 44 | } |
45 | 45 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c index bcca883018f4..cce65cc56514 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c | |||
@@ -30,8 +30,9 @@ struct nvc0_ltcg_priv { | |||
30 | struct nouveau_ltcg base; | 30 | struct nouveau_ltcg base; |
31 | u32 part_nr; | 31 | u32 part_nr; |
32 | u32 subp_nr; | 32 | u32 subp_nr; |
33 | struct nouveau_mm tags; | ||
34 | u32 num_tags; | 33 | u32 num_tags; |
34 | u32 tag_base; | ||
35 | struct nouveau_mm tags; | ||
35 | struct nouveau_mm_node *tag_ram; | 36 | struct nouveau_mm_node *tag_ram; |
36 | }; | 37 | }; |
37 | 38 | ||
@@ -117,10 +118,6 @@ nvc0_ltcg_init_tag_ram(struct nouveau_fb *pfb, struct nvc0_ltcg_priv *priv) | |||
117 | u32 tag_size, tag_margin, tag_align; | 118 | u32 tag_size, tag_margin, tag_align; |
118 | int ret; | 119 | int ret; |
119 | 120 | ||
120 | nv_wr32(priv, 0x17e8d8, priv->part_nr); | ||
121 | if (nv_device(pfb)->card_type >= NV_E0) | ||
122 | nv_wr32(priv, 0x17e000, priv->part_nr); | ||
123 | |||
124 | /* tags for 1/4 of VRAM should be enough (8192/4 per GiB of VRAM) */ | 121 | /* tags for 1/4 of VRAM should be enough (8192/4 per GiB of VRAM) */ |
125 | priv->num_tags = (pfb->ram->size >> 17) / 4; | 122 | priv->num_tags = (pfb->ram->size >> 17) / 4; |
126 | if (priv->num_tags > (1 << 17)) | 123 | if (priv->num_tags > (1 << 17)) |
@@ -142,7 +139,7 @@ nvc0_ltcg_init_tag_ram(struct nouveau_fb *pfb, struct nvc0_ltcg_priv *priv) | |||
142 | tag_size += tag_align; | 139 | tag_size += tag_align; |
143 | tag_size = (tag_size + 0xfff) >> 12; /* round up */ | 140 | tag_size = (tag_size + 0xfff) >> 12; /* round up */ |
144 | 141 | ||
145 | ret = nouveau_mm_tail(&pfb->vram, 0, tag_size, tag_size, 1, | 142 | ret = nouveau_mm_tail(&pfb->vram, 1, tag_size, tag_size, 1, |
146 | &priv->tag_ram); | 143 | &priv->tag_ram); |
147 | if (ret) { | 144 | if (ret) { |
148 | priv->num_tags = 0; | 145 | priv->num_tags = 0; |
@@ -152,7 +149,7 @@ nvc0_ltcg_init_tag_ram(struct nouveau_fb *pfb, struct nvc0_ltcg_priv *priv) | |||
152 | tag_base += tag_align - 1; | 149 | tag_base += tag_align - 1; |
153 | ret = do_div(tag_base, tag_align); | 150 | ret = do_div(tag_base, tag_align); |
154 | 151 | ||
155 | nv_wr32(priv, 0x17e8d4, tag_base); | 152 | priv->tag_base = tag_base; |
156 | } | 153 | } |
157 | ret = nouveau_mm_init(&priv->tags, 0, priv->num_tags, 1); | 154 | ret = nouveau_mm_init(&priv->tags, 0, priv->num_tags, 1); |
158 | 155 | ||
@@ -182,8 +179,6 @@ nvc0_ltcg_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
182 | } | 179 | } |
183 | priv->subp_nr = nv_rd32(priv, 0x17e8dc) >> 28; | 180 | priv->subp_nr = nv_rd32(priv, 0x17e8dc) >> 28; |
184 | 181 | ||
185 | nv_mask(priv, 0x17e820, 0x00100000, 0x00000000); /* INTR_EN &= ~0x10 */ | ||
186 | |||
187 | ret = nvc0_ltcg_init_tag_ram(pfb, priv); | 182 | ret = nvc0_ltcg_init_tag_ram(pfb, priv); |
188 | if (ret) | 183 | if (ret) |
189 | return ret; | 184 | return ret; |
@@ -209,13 +204,32 @@ nvc0_ltcg_dtor(struct nouveau_object *object) | |||
209 | nouveau_ltcg_destroy(ltcg); | 204 | nouveau_ltcg_destroy(ltcg); |
210 | } | 205 | } |
211 | 206 | ||
207 | static int | ||
208 | nvc0_ltcg_init(struct nouveau_object *object) | ||
209 | { | ||
210 | struct nouveau_ltcg *ltcg = (struct nouveau_ltcg *)object; | ||
211 | struct nvc0_ltcg_priv *priv = (struct nvc0_ltcg_priv *)ltcg; | ||
212 | int ret; | ||
213 | |||
214 | ret = nouveau_ltcg_init(ltcg); | ||
215 | if (ret) | ||
216 | return ret; | ||
217 | |||
218 | nv_mask(priv, 0x17e820, 0x00100000, 0x00000000); /* INTR_EN &= ~0x10 */ | ||
219 | nv_wr32(priv, 0x17e8d8, priv->part_nr); | ||
220 | if (nv_device(ltcg)->card_type >= NV_E0) | ||
221 | nv_wr32(priv, 0x17e000, priv->part_nr); | ||
222 | nv_wr32(priv, 0x17e8d4, priv->tag_base); | ||
223 | return 0; | ||
224 | } | ||
225 | |||
212 | struct nouveau_oclass | 226 | struct nouveau_oclass |
213 | nvc0_ltcg_oclass = { | 227 | nvc0_ltcg_oclass = { |
214 | .handle = NV_SUBDEV(LTCG, 0xc0), | 228 | .handle = NV_SUBDEV(LTCG, 0xc0), |
215 | .ofuncs = &(struct nouveau_ofuncs) { | 229 | .ofuncs = &(struct nouveau_ofuncs) { |
216 | .ctor = nvc0_ltcg_ctor, | 230 | .ctor = nvc0_ltcg_ctor, |
217 | .dtor = nvc0_ltcg_dtor, | 231 | .dtor = nvc0_ltcg_dtor, |
218 | .init = _nouveau_ltcg_init, | 232 | .init = nvc0_ltcg_init, |
219 | .fini = _nouveau_ltcg_fini, | 233 | .fini = _nouveau_ltcg_fini, |
220 | }, | 234 | }, |
221 | }; | 235 | }; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/base.c b/drivers/gpu/drm/nouveau/core/subdev/mc/base.c index 1c0330b8c9a4..ec9cd6f10f91 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mc/base.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/base.c | |||
@@ -80,7 +80,9 @@ _nouveau_mc_dtor(struct nouveau_object *object) | |||
80 | 80 | ||
81 | int | 81 | int |
82 | nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine, | 82 | nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine, |
83 | struct nouveau_oclass *oclass, int length, void **pobject) | 83 | struct nouveau_oclass *oclass, |
84 | const struct nouveau_mc_intr *intr_map, | ||
85 | int length, void **pobject) | ||
84 | { | 86 | { |
85 | struct nouveau_device *device = nv_device(parent); | 87 | struct nouveau_device *device = nv_device(parent); |
86 | struct nouveau_mc *pmc; | 88 | struct nouveau_mc *pmc; |
@@ -92,6 +94,8 @@ nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine, | |||
92 | if (ret) | 94 | if (ret) |
93 | return ret; | 95 | return ret; |
94 | 96 | ||
97 | pmc->intr_map = intr_map; | ||
98 | |||
95 | ret = request_irq(device->pdev->irq, nouveau_mc_intr, | 99 | ret = request_irq(device->pdev->irq, nouveau_mc_intr, |
96 | IRQF_SHARED, "nouveau", pmc); | 100 | IRQF_SHARED, "nouveau", pmc); |
97 | if (ret < 0) | 101 | if (ret < 0) |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c index 8c769715227b..64aa4edb0d9d 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c | |||
@@ -50,12 +50,11 @@ nv04_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
50 | struct nv04_mc_priv *priv; | 50 | struct nv04_mc_priv *priv; |
51 | int ret; | 51 | int ret; |
52 | 52 | ||
53 | ret = nouveau_mc_create(parent, engine, oclass, &priv); | 53 | ret = nouveau_mc_create(parent, engine, oclass, nv04_mc_intr, &priv); |
54 | *pobject = nv_object(priv); | 54 | *pobject = nv_object(priv); |
55 | if (ret) | 55 | if (ret) |
56 | return ret; | 56 | return ret; |
57 | 57 | ||
58 | priv->base.intr_map = nv04_mc_intr; | ||
59 | return 0; | 58 | return 0; |
60 | } | 59 | } |
61 | 60 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c index 51919371810f..d9891782bf28 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c | |||
@@ -36,12 +36,11 @@ nv44_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
36 | struct nv44_mc_priv *priv; | 36 | struct nv44_mc_priv *priv; |
37 | int ret; | 37 | int ret; |
38 | 38 | ||
39 | ret = nouveau_mc_create(parent, engine, oclass, &priv); | 39 | ret = nouveau_mc_create(parent, engine, oclass, nv04_mc_intr, &priv); |
40 | *pobject = nv_object(priv); | 40 | *pobject = nv_object(priv); |
41 | if (ret) | 41 | if (ret) |
42 | return ret; | 42 | return ret; |
43 | 43 | ||
44 | priv->base.intr_map = nv04_mc_intr; | ||
45 | return 0; | 44 | return 0; |
46 | } | 45 | } |
47 | 46 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c index f25fc5fc7dd1..2b1afe225db8 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c | |||
@@ -53,12 +53,11 @@ nv50_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
53 | struct nv50_mc_priv *priv; | 53 | struct nv50_mc_priv *priv; |
54 | int ret; | 54 | int ret; |
55 | 55 | ||
56 | ret = nouveau_mc_create(parent, engine, oclass, &priv); | 56 | ret = nouveau_mc_create(parent, engine, oclass, nv50_mc_intr, &priv); |
57 | *pobject = nv_object(priv); | 57 | *pobject = nv_object(priv); |
58 | if (ret) | 58 | if (ret) |
59 | return ret; | 59 | return ret; |
60 | 60 | ||
61 | priv->base.intr_map = nv50_mc_intr; | ||
62 | return 0; | 61 | return 0; |
63 | } | 62 | } |
64 | 63 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c index e82fd21b5041..0d57b4d3e001 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c | |||
@@ -54,12 +54,11 @@ nv98_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
54 | struct nv98_mc_priv *priv; | 54 | struct nv98_mc_priv *priv; |
55 | int ret; | 55 | int ret; |
56 | 56 | ||
57 | ret = nouveau_mc_create(parent, engine, oclass, &priv); | 57 | ret = nouveau_mc_create(parent, engine, oclass, nv98_mc_intr, &priv); |
58 | *pobject = nv_object(priv); | 58 | *pobject = nv_object(priv); |
59 | if (ret) | 59 | if (ret) |
60 | return ret; | 60 | return ret; |
61 | 61 | ||
62 | priv->base.intr_map = nv98_mc_intr; | ||
63 | return 0; | 62 | return 0; |
64 | } | 63 | } |
65 | 64 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c index c5da3babbc62..104175c5a2dd 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c | |||
@@ -57,12 +57,11 @@ nvc0_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
57 | struct nvc0_mc_priv *priv; | 57 | struct nvc0_mc_priv *priv; |
58 | int ret; | 58 | int ret; |
59 | 59 | ||
60 | ret = nouveau_mc_create(parent, engine, oclass, &priv); | 60 | ret = nouveau_mc_create(parent, engine, oclass, nvc0_mc_intr, &priv); |
61 | *pobject = nv_object(priv); | 61 | *pobject = nv_object(priv); |
62 | if (ret) | 62 | if (ret) |
63 | return ret; | 63 | return ret; |
64 | 64 | ||
65 | priv->base.intr_map = nvc0_mc_intr; | ||
66 | return 0; | 65 | return 0; |
67 | } | 66 | } |
68 | 67 | ||
diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c b/drivers/gpu/drm/nouveau/dispnv04/crtc.c index 0782bd2f1e04..6a13ffb53bdb 100644 --- a/drivers/gpu/drm/nouveau/dispnv04/crtc.c +++ b/drivers/gpu/drm/nouveau/dispnv04/crtc.c | |||
@@ -606,6 +606,24 @@ nv_crtc_mode_set_regs(struct drm_crtc *crtc, struct drm_display_mode * mode) | |||
606 | regp->ramdac_a34 = 0x1; | 606 | regp->ramdac_a34 = 0x1; |
607 | } | 607 | } |
608 | 608 | ||
609 | static int | ||
610 | nv_crtc_swap_fbs(struct drm_crtc *crtc, struct drm_framebuffer *old_fb) | ||
611 | { | ||
612 | struct nv04_display *disp = nv04_display(crtc->dev); | ||
613 | struct nouveau_framebuffer *nvfb = nouveau_framebuffer(crtc->fb); | ||
614 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); | ||
615 | int ret; | ||
616 | |||
617 | ret = nouveau_bo_pin(nvfb->nvbo, TTM_PL_FLAG_VRAM); | ||
618 | if (ret == 0) { | ||
619 | if (disp->image[nv_crtc->index]) | ||
620 | nouveau_bo_unpin(disp->image[nv_crtc->index]); | ||
621 | nouveau_bo_ref(nvfb->nvbo, &disp->image[nv_crtc->index]); | ||
622 | } | ||
623 | |||
624 | return ret; | ||
625 | } | ||
626 | |||
609 | /** | 627 | /** |
610 | * Sets up registers for the given mode/adjusted_mode pair. | 628 | * Sets up registers for the given mode/adjusted_mode pair. |
611 | * | 629 | * |
@@ -622,10 +640,15 @@ nv_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
622 | struct drm_device *dev = crtc->dev; | 640 | struct drm_device *dev = crtc->dev; |
623 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); | 641 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); |
624 | struct nouveau_drm *drm = nouveau_drm(dev); | 642 | struct nouveau_drm *drm = nouveau_drm(dev); |
643 | int ret; | ||
625 | 644 | ||
626 | NV_DEBUG(drm, "CTRC mode on CRTC %d:\n", nv_crtc->index); | 645 | NV_DEBUG(drm, "CTRC mode on CRTC %d:\n", nv_crtc->index); |
627 | drm_mode_debug_printmodeline(adjusted_mode); | 646 | drm_mode_debug_printmodeline(adjusted_mode); |
628 | 647 | ||
648 | ret = nv_crtc_swap_fbs(crtc, old_fb); | ||
649 | if (ret) | ||
650 | return ret; | ||
651 | |||
629 | /* unlock must come after turning off FP_TG_CONTROL in output_prepare */ | 652 | /* unlock must come after turning off FP_TG_CONTROL in output_prepare */ |
630 | nv_lock_vga_crtc_shadow(dev, nv_crtc->index, -1); | 653 | nv_lock_vga_crtc_shadow(dev, nv_crtc->index, -1); |
631 | 654 | ||
@@ -722,6 +745,7 @@ static void nv_crtc_commit(struct drm_crtc *crtc) | |||
722 | 745 | ||
723 | static void nv_crtc_destroy(struct drm_crtc *crtc) | 746 | static void nv_crtc_destroy(struct drm_crtc *crtc) |
724 | { | 747 | { |
748 | struct nv04_display *disp = nv04_display(crtc->dev); | ||
725 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); | 749 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); |
726 | 750 | ||
727 | if (!nv_crtc) | 751 | if (!nv_crtc) |
@@ -729,6 +753,10 @@ static void nv_crtc_destroy(struct drm_crtc *crtc) | |||
729 | 753 | ||
730 | drm_crtc_cleanup(crtc); | 754 | drm_crtc_cleanup(crtc); |
731 | 755 | ||
756 | if (disp->image[nv_crtc->index]) | ||
757 | nouveau_bo_unpin(disp->image[nv_crtc->index]); | ||
758 | nouveau_bo_ref(NULL, &disp->image[nv_crtc->index]); | ||
759 | |||
732 | nouveau_bo_unmap(nv_crtc->cursor.nvbo); | 760 | nouveau_bo_unmap(nv_crtc->cursor.nvbo); |
733 | nouveau_bo_unpin(nv_crtc->cursor.nvbo); | 761 | nouveau_bo_unpin(nv_crtc->cursor.nvbo); |
734 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); | 762 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); |
@@ -754,6 +782,16 @@ nv_crtc_gamma_load(struct drm_crtc *crtc) | |||
754 | } | 782 | } |
755 | 783 | ||
756 | static void | 784 | static void |
785 | nv_crtc_disable(struct drm_crtc *crtc) | ||
786 | { | ||
787 | struct nv04_display *disp = nv04_display(crtc->dev); | ||
788 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); | ||
789 | if (disp->image[nv_crtc->index]) | ||
790 | nouveau_bo_unpin(disp->image[nv_crtc->index]); | ||
791 | nouveau_bo_ref(NULL, &disp->image[nv_crtc->index]); | ||
792 | } | ||
793 | |||
794 | static void | ||
757 | nv_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, uint32_t start, | 795 | nv_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, uint32_t start, |
758 | uint32_t size) | 796 | uint32_t size) |
759 | { | 797 | { |
@@ -791,7 +829,6 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
791 | struct drm_framebuffer *drm_fb; | 829 | struct drm_framebuffer *drm_fb; |
792 | struct nouveau_framebuffer *fb; | 830 | struct nouveau_framebuffer *fb; |
793 | int arb_burst, arb_lwm; | 831 | int arb_burst, arb_lwm; |
794 | int ret; | ||
795 | 832 | ||
796 | NV_DEBUG(drm, "index %d\n", nv_crtc->index); | 833 | NV_DEBUG(drm, "index %d\n", nv_crtc->index); |
797 | 834 | ||
@@ -801,10 +838,8 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
801 | return 0; | 838 | return 0; |
802 | } | 839 | } |
803 | 840 | ||
804 | |||
805 | /* If atomic, we want to switch to the fb we were passed, so | 841 | /* If atomic, we want to switch to the fb we were passed, so |
806 | * now we update pointers to do that. (We don't pin; just | 842 | * now we update pointers to do that. |
807 | * assume we're already pinned and update the base address.) | ||
808 | */ | 843 | */ |
809 | if (atomic) { | 844 | if (atomic) { |
810 | drm_fb = passed_fb; | 845 | drm_fb = passed_fb; |
@@ -812,17 +847,6 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
812 | } else { | 847 | } else { |
813 | drm_fb = crtc->fb; | 848 | drm_fb = crtc->fb; |
814 | fb = nouveau_framebuffer(crtc->fb); | 849 | fb = nouveau_framebuffer(crtc->fb); |
815 | /* If not atomic, we can go ahead and pin, and unpin the | ||
816 | * old fb we were passed. | ||
817 | */ | ||
818 | ret = nouveau_bo_pin(fb->nvbo, TTM_PL_FLAG_VRAM); | ||
819 | if (ret) | ||
820 | return ret; | ||
821 | |||
822 | if (passed_fb) { | ||
823 | struct nouveau_framebuffer *ofb = nouveau_framebuffer(passed_fb); | ||
824 | nouveau_bo_unpin(ofb->nvbo); | ||
825 | } | ||
826 | } | 850 | } |
827 | 851 | ||
828 | nv_crtc->fb.offset = fb->nvbo->bo.offset; | 852 | nv_crtc->fb.offset = fb->nvbo->bo.offset; |
@@ -877,6 +901,9 @@ static int | |||
877 | nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, | 901 | nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, |
878 | struct drm_framebuffer *old_fb) | 902 | struct drm_framebuffer *old_fb) |
879 | { | 903 | { |
904 | int ret = nv_crtc_swap_fbs(crtc, old_fb); | ||
905 | if (ret) | ||
906 | return ret; | ||
880 | return nv04_crtc_do_mode_set_base(crtc, old_fb, x, y, false); | 907 | return nv04_crtc_do_mode_set_base(crtc, old_fb, x, y, false); |
881 | } | 908 | } |
882 | 909 | ||
@@ -1027,6 +1054,7 @@ static const struct drm_crtc_helper_funcs nv04_crtc_helper_funcs = { | |||
1027 | .mode_set_base = nv04_crtc_mode_set_base, | 1054 | .mode_set_base = nv04_crtc_mode_set_base, |
1028 | .mode_set_base_atomic = nv04_crtc_mode_set_base_atomic, | 1055 | .mode_set_base_atomic = nv04_crtc_mode_set_base_atomic, |
1029 | .load_lut = nv_crtc_gamma_load, | 1056 | .load_lut = nv_crtc_gamma_load, |
1057 | .disable = nv_crtc_disable, | ||
1030 | }; | 1058 | }; |
1031 | 1059 | ||
1032 | int | 1060 | int |
diff --git a/drivers/gpu/drm/nouveau/dispnv04/disp.h b/drivers/gpu/drm/nouveau/dispnv04/disp.h index a0a031dad13f..9928187f0a7d 100644 --- a/drivers/gpu/drm/nouveau/dispnv04/disp.h +++ b/drivers/gpu/drm/nouveau/dispnv04/disp.h | |||
@@ -81,6 +81,7 @@ struct nv04_display { | |||
81 | uint32_t saved_vga_font[4][16384]; | 81 | uint32_t saved_vga_font[4][16384]; |
82 | uint32_t dac_users[4]; | 82 | uint32_t dac_users[4]; |
83 | struct nouveau_object *core; | 83 | struct nouveau_object *core; |
84 | struct nouveau_bo *image[2]; | ||
84 | }; | 85 | }; |
85 | 86 | ||
86 | static inline struct nv04_display * | 87 | static inline struct nv04_display * |
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 907d20ef6d4d..a03e75deacaf 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
@@ -577,6 +577,9 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, | |||
577 | ret = nv50_display_flip_next(crtc, fb, chan, 0); | 577 | ret = nv50_display_flip_next(crtc, fb, chan, 0); |
578 | if (ret) | 578 | if (ret) |
579 | goto fail_unreserve; | 579 | goto fail_unreserve; |
580 | } else { | ||
581 | struct nv04_display *dispnv04 = nv04_display(dev); | ||
582 | nouveau_bo_ref(new_bo, &dispnv04->image[nouveau_crtc(crtc)->index]); | ||
580 | } | 583 | } |
581 | 584 | ||
582 | ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence); | 585 | ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence); |
diff --git a/drivers/gpu/drm/nouveau/nv40_pm.c b/drivers/gpu/drm/nouveau/nv40_pm.c index 3af5bcd0b203..625f80d53dc2 100644 --- a/drivers/gpu/drm/nouveau/nv40_pm.c +++ b/drivers/gpu/drm/nouveau/nv40_pm.c | |||
@@ -131,7 +131,7 @@ nv40_calc_pll(struct drm_device *dev, u32 reg, struct nvbios_pll *pll, | |||
131 | if (clk < pll->vco1.max_freq) | 131 | if (clk < pll->vco1.max_freq) |
132 | pll->vco2.max_freq = 0; | 132 | pll->vco2.max_freq = 0; |
133 | 133 | ||
134 | pclk->pll_calc(pclk, pll, clk, &coef); | 134 | ret = pclk->pll_calc(pclk, pll, clk, &coef); |
135 | if (ret == 0) | 135 | if (ret == 0) |
136 | return -ERANGE; | 136 | return -ERANGE; |
137 | 137 | ||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 274b8e1b889f..9f19259667df 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -2163,7 +2163,7 @@ void cik_mm_wdoorbell(struct radeon_device *rdev, u32 offset, u32 v); | |||
2163 | WREG32(reg, tmp_); \ | 2163 | WREG32(reg, tmp_); \ |
2164 | } while (0) | 2164 | } while (0) |
2165 | #define WREG32_AND(reg, and) WREG32_P(reg, 0, and) | 2165 | #define WREG32_AND(reg, and) WREG32_P(reg, 0, and) |
2166 | #define WREG32_OR(reg, or) WREG32_P(reg, or, ~or) | 2166 | #define WREG32_OR(reg, or) WREG32_P(reg, or, ~(or)) |
2167 | #define WREG32_PLL_P(reg, val, mask) \ | 2167 | #define WREG32_PLL_P(reg, val, mask) \ |
2168 | do { \ | 2168 | do { \ |
2169 | uint32_t tmp_ = RREG32_PLL(reg); \ | 2169 | uint32_t tmp_ = RREG32_PLL(reg); \ |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index f1c15754e73c..b79f4f5cdd62 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
@@ -356,6 +356,14 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo, | |||
356 | return -EINVAL; | 356 | return -EINVAL; |
357 | } | 357 | } |
358 | 358 | ||
359 | if (bo->tbo.sync_obj) { | ||
360 | r = radeon_fence_wait(bo->tbo.sync_obj, false); | ||
361 | if (r) { | ||
362 | DRM_ERROR("Failed waiting for UVD message (%d)!\n", r); | ||
363 | return r; | ||
364 | } | ||
365 | } | ||
366 | |||
359 | r = radeon_bo_kmap(bo, &ptr); | 367 | r = radeon_bo_kmap(bo, &ptr); |
360 | if (r) { | 368 | if (r) { |
361 | DRM_ERROR("Failed mapping the UVD message (%d)!\n", r); | 369 | DRM_ERROR("Failed mapping the UVD message (%d)!\n", r); |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index bcc68ec204ad..f5e92cfcc140 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -744,10 +744,10 @@ static void rv770_init_golden_registers(struct radeon_device *rdev) | |||
744 | (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); | 744 | (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); |
745 | radeon_program_register_sequence(rdev, | 745 | radeon_program_register_sequence(rdev, |
746 | rv730_golden_registers, | 746 | rv730_golden_registers, |
747 | (const u32)ARRAY_SIZE(rv770_golden_registers)); | 747 | (const u32)ARRAY_SIZE(rv730_golden_registers)); |
748 | radeon_program_register_sequence(rdev, | 748 | radeon_program_register_sequence(rdev, |
749 | rv730_mgcg_init, | 749 | rv730_mgcg_init, |
750 | (const u32)ARRAY_SIZE(rv770_mgcg_init)); | 750 | (const u32)ARRAY_SIZE(rv730_mgcg_init)); |
751 | break; | 751 | break; |
752 | case CHIP_RV710: | 752 | case CHIP_RV710: |
753 | radeon_program_register_sequence(rdev, | 753 | radeon_program_register_sequence(rdev, |
@@ -758,18 +758,18 @@ static void rv770_init_golden_registers(struct radeon_device *rdev) | |||
758 | (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); | 758 | (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); |
759 | radeon_program_register_sequence(rdev, | 759 | radeon_program_register_sequence(rdev, |
760 | rv710_golden_registers, | 760 | rv710_golden_registers, |
761 | (const u32)ARRAY_SIZE(rv770_golden_registers)); | 761 | (const u32)ARRAY_SIZE(rv710_golden_registers)); |
762 | radeon_program_register_sequence(rdev, | 762 | radeon_program_register_sequence(rdev, |
763 | rv710_mgcg_init, | 763 | rv710_mgcg_init, |
764 | (const u32)ARRAY_SIZE(rv770_mgcg_init)); | 764 | (const u32)ARRAY_SIZE(rv710_mgcg_init)); |
765 | break; | 765 | break; |
766 | case CHIP_RV740: | 766 | case CHIP_RV740: |
767 | radeon_program_register_sequence(rdev, | 767 | radeon_program_register_sequence(rdev, |
768 | rv740_golden_registers, | 768 | rv740_golden_registers, |
769 | (const u32)ARRAY_SIZE(rv770_golden_registers)); | 769 | (const u32)ARRAY_SIZE(rv740_golden_registers)); |
770 | radeon_program_register_sequence(rdev, | 770 | radeon_program_register_sequence(rdev, |
771 | rv740_mgcg_init, | 771 | rv740_mgcg_init, |
772 | (const u32)ARRAY_SIZE(rv770_mgcg_init)); | 772 | (const u32)ARRAY_SIZE(rv740_mgcg_init)); |
773 | break; | 773 | break; |
774 | default: | 774 | default: |
775 | break; | 775 | break; |
diff --git a/drivers/iio/light/adjd_s311.c b/drivers/iio/light/adjd_s311.c index 5f4749e60b04..c1cd5698b8ae 100644 --- a/drivers/iio/light/adjd_s311.c +++ b/drivers/iio/light/adjd_s311.c | |||
@@ -232,7 +232,8 @@ static int adjd_s311_read_raw(struct iio_dev *indio_dev, | |||
232 | 232 | ||
233 | switch (mask) { | 233 | switch (mask) { |
234 | case IIO_CHAN_INFO_RAW: | 234 | case IIO_CHAN_INFO_RAW: |
235 | ret = adjd_s311_read_data(indio_dev, chan->address, val); | 235 | ret = adjd_s311_read_data(indio_dev, |
236 | ADJD_S311_DATA_REG(chan->address), val); | ||
236 | if (ret < 0) | 237 | if (ret < 0) |
237 | return ret; | 238 | return ret; |
238 | return IIO_VAL_INT; | 239 | return IIO_VAL_INT; |
diff --git a/drivers/md/dm-cache-policy-mq.c b/drivers/md/dm-cache-policy-mq.c index dc112a7137fe..4296155090b2 100644 --- a/drivers/md/dm-cache-policy-mq.c +++ b/drivers/md/dm-cache-policy-mq.c | |||
@@ -959,23 +959,21 @@ out: | |||
959 | return r; | 959 | return r; |
960 | } | 960 | } |
961 | 961 | ||
962 | static void remove_mapping(struct mq_policy *mq, dm_oblock_t oblock) | 962 | static void mq_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock) |
963 | { | 963 | { |
964 | struct entry *e = hash_lookup(mq, oblock); | 964 | struct mq_policy *mq = to_mq_policy(p); |
965 | struct entry *e; | ||
966 | |||
967 | mutex_lock(&mq->lock); | ||
968 | |||
969 | e = hash_lookup(mq, oblock); | ||
965 | 970 | ||
966 | BUG_ON(!e || !e->in_cache); | 971 | BUG_ON(!e || !e->in_cache); |
967 | 972 | ||
968 | del(mq, e); | 973 | del(mq, e); |
969 | e->in_cache = false; | 974 | e->in_cache = false; |
970 | push(mq, e); | 975 | push(mq, e); |
971 | } | ||
972 | 976 | ||
973 | static void mq_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock) | ||
974 | { | ||
975 | struct mq_policy *mq = to_mq_policy(p); | ||
976 | |||
977 | mutex_lock(&mq->lock); | ||
978 | remove_mapping(mq, oblock); | ||
979 | mutex_unlock(&mq->lock); | 977 | mutex_unlock(&mq->lock); |
980 | } | 978 | } |
981 | 979 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index ce9b387b5a19..00b88cbfde25 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
@@ -1333,6 +1333,8 @@ enum { | |||
1333 | BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN, | 1333 | BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN, |
1334 | BNX2X_SP_RTNL_VFPF_STORM_RX_MODE, | 1334 | BNX2X_SP_RTNL_VFPF_STORM_RX_MODE, |
1335 | BNX2X_SP_RTNL_HYPERVISOR_VLAN, | 1335 | BNX2X_SP_RTNL_HYPERVISOR_VLAN, |
1336 | BNX2X_SP_RTNL_TX_STOP, | ||
1337 | BNX2X_SP_RTNL_TX_RESUME, | ||
1336 | }; | 1338 | }; |
1337 | 1339 | ||
1338 | struct bnx2x_prev_path_list { | 1340 | struct bnx2x_prev_path_list { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c index f9122f2d6b65..fcf2761d8828 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | |||
@@ -30,10 +30,8 @@ | |||
30 | #include "bnx2x_dcb.h" | 30 | #include "bnx2x_dcb.h" |
31 | 31 | ||
32 | /* forward declarations of dcbx related functions */ | 32 | /* forward declarations of dcbx related functions */ |
33 | static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp); | ||
34 | static void bnx2x_pfc_set_pfc(struct bnx2x *bp); | 33 | static void bnx2x_pfc_set_pfc(struct bnx2x *bp); |
35 | static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp); | 34 | static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp); |
36 | static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp); | ||
37 | static void bnx2x_dcbx_get_ets_pri_pg_tbl(struct bnx2x *bp, | 35 | static void bnx2x_dcbx_get_ets_pri_pg_tbl(struct bnx2x *bp, |
38 | u32 *set_configuration_ets_pg, | 36 | u32 *set_configuration_ets_pg, |
39 | u32 *pri_pg_tbl); | 37 | u32 *pri_pg_tbl); |
@@ -425,30 +423,52 @@ static void bnx2x_pfc_set_pfc(struct bnx2x *bp) | |||
425 | bnx2x_pfc_clear(bp); | 423 | bnx2x_pfc_clear(bp); |
426 | } | 424 | } |
427 | 425 | ||
428 | static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp) | 426 | int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp) |
429 | { | 427 | { |
430 | struct bnx2x_func_state_params func_params = {NULL}; | 428 | struct bnx2x_func_state_params func_params = {NULL}; |
429 | int rc; | ||
431 | 430 | ||
432 | func_params.f_obj = &bp->func_obj; | 431 | func_params.f_obj = &bp->func_obj; |
433 | func_params.cmd = BNX2X_F_CMD_TX_STOP; | 432 | func_params.cmd = BNX2X_F_CMD_TX_STOP; |
434 | 433 | ||
434 | __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags); | ||
435 | __set_bit(RAMROD_RETRY, &func_params.ramrod_flags); | ||
436 | |||
435 | DP(BNX2X_MSG_DCB, "STOP TRAFFIC\n"); | 437 | DP(BNX2X_MSG_DCB, "STOP TRAFFIC\n"); |
436 | return bnx2x_func_state_change(bp, &func_params); | 438 | |
439 | rc = bnx2x_func_state_change(bp, &func_params); | ||
440 | if (rc) { | ||
441 | BNX2X_ERR("Unable to hold traffic for HW configuration\n"); | ||
442 | bnx2x_panic(); | ||
443 | } | ||
444 | |||
445 | return rc; | ||
437 | } | 446 | } |
438 | 447 | ||
439 | static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp) | 448 | int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp) |
440 | { | 449 | { |
441 | struct bnx2x_func_state_params func_params = {NULL}; | 450 | struct bnx2x_func_state_params func_params = {NULL}; |
442 | struct bnx2x_func_tx_start_params *tx_params = | 451 | struct bnx2x_func_tx_start_params *tx_params = |
443 | &func_params.params.tx_start; | 452 | &func_params.params.tx_start; |
453 | int rc; | ||
444 | 454 | ||
445 | func_params.f_obj = &bp->func_obj; | 455 | func_params.f_obj = &bp->func_obj; |
446 | func_params.cmd = BNX2X_F_CMD_TX_START; | 456 | func_params.cmd = BNX2X_F_CMD_TX_START; |
447 | 457 | ||
458 | __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags); | ||
459 | __set_bit(RAMROD_RETRY, &func_params.ramrod_flags); | ||
460 | |||
448 | bnx2x_dcbx_fw_struct(bp, tx_params); | 461 | bnx2x_dcbx_fw_struct(bp, tx_params); |
449 | 462 | ||
450 | DP(BNX2X_MSG_DCB, "START TRAFFIC\n"); | 463 | DP(BNX2X_MSG_DCB, "START TRAFFIC\n"); |
451 | return bnx2x_func_state_change(bp, &func_params); | 464 | |
465 | rc = bnx2x_func_state_change(bp, &func_params); | ||
466 | if (rc) { | ||
467 | BNX2X_ERR("Unable to resume traffic after HW configuration\n"); | ||
468 | bnx2x_panic(); | ||
469 | } | ||
470 | |||
471 | return rc; | ||
452 | } | 472 | } |
453 | 473 | ||
454 | static void bnx2x_dcbx_2cos_limit_update_ets_config(struct bnx2x *bp) | 474 | static void bnx2x_dcbx_2cos_limit_update_ets_config(struct bnx2x *bp) |
@@ -744,7 +764,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) | |||
744 | if (IS_MF(bp)) | 764 | if (IS_MF(bp)) |
745 | bnx2x_link_sync_notify(bp); | 765 | bnx2x_link_sync_notify(bp); |
746 | 766 | ||
747 | bnx2x_dcbx_stop_hw_tx(bp); | 767 | set_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state); |
768 | |||
769 | schedule_delayed_work(&bp->sp_rtnl_task, 0); | ||
748 | 770 | ||
749 | return; | 771 | return; |
750 | } | 772 | } |
@@ -757,7 +779,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) | |||
757 | /* ets may affect cmng configuration: reinit it in hw */ | 779 | /* ets may affect cmng configuration: reinit it in hw */ |
758 | bnx2x_set_local_cmng(bp); | 780 | bnx2x_set_local_cmng(bp); |
759 | 781 | ||
760 | bnx2x_dcbx_resume_hw_tx(bp); | 782 | set_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state); |
783 | |||
784 | schedule_delayed_work(&bp->sp_rtnl_task, 0); | ||
761 | 785 | ||
762 | return; | 786 | return; |
763 | case BNX2X_DCBX_STATE_TX_RELEASED: | 787 | case BNX2X_DCBX_STATE_TX_RELEASED: |
@@ -2367,21 +2391,24 @@ static u8 bnx2x_dcbnl_get_featcfg(struct net_device *netdev, int featid, | |||
2367 | case DCB_FEATCFG_ATTR_PG: | 2391 | case DCB_FEATCFG_ATTR_PG: |
2368 | if (bp->dcbx_local_feat.ets.enabled) | 2392 | if (bp->dcbx_local_feat.ets.enabled) |
2369 | *flags |= DCB_FEATCFG_ENABLE; | 2393 | *flags |= DCB_FEATCFG_ENABLE; |
2370 | if (bp->dcbx_error & DCBX_LOCAL_ETS_ERROR) | 2394 | if (bp->dcbx_error & (DCBX_LOCAL_ETS_ERROR | |
2395 | DCBX_REMOTE_MIB_ERROR)) | ||
2371 | *flags |= DCB_FEATCFG_ERROR; | 2396 | *flags |= DCB_FEATCFG_ERROR; |
2372 | break; | 2397 | break; |
2373 | case DCB_FEATCFG_ATTR_PFC: | 2398 | case DCB_FEATCFG_ATTR_PFC: |
2374 | if (bp->dcbx_local_feat.pfc.enabled) | 2399 | if (bp->dcbx_local_feat.pfc.enabled) |
2375 | *flags |= DCB_FEATCFG_ENABLE; | 2400 | *flags |= DCB_FEATCFG_ENABLE; |
2376 | if (bp->dcbx_error & (DCBX_LOCAL_PFC_ERROR | | 2401 | if (bp->dcbx_error & (DCBX_LOCAL_PFC_ERROR | |
2377 | DCBX_LOCAL_PFC_MISMATCH)) | 2402 | DCBX_LOCAL_PFC_MISMATCH | |
2403 | DCBX_REMOTE_MIB_ERROR)) | ||
2378 | *flags |= DCB_FEATCFG_ERROR; | 2404 | *flags |= DCB_FEATCFG_ERROR; |
2379 | break; | 2405 | break; |
2380 | case DCB_FEATCFG_ATTR_APP: | 2406 | case DCB_FEATCFG_ATTR_APP: |
2381 | if (bp->dcbx_local_feat.app.enabled) | 2407 | if (bp->dcbx_local_feat.app.enabled) |
2382 | *flags |= DCB_FEATCFG_ENABLE; | 2408 | *flags |= DCB_FEATCFG_ENABLE; |
2383 | if (bp->dcbx_error & (DCBX_LOCAL_APP_ERROR | | 2409 | if (bp->dcbx_error & (DCBX_LOCAL_APP_ERROR | |
2384 | DCBX_LOCAL_APP_MISMATCH)) | 2410 | DCBX_LOCAL_APP_MISMATCH | |
2411 | DCBX_REMOTE_MIB_ERROR)) | ||
2385 | *flags |= DCB_FEATCFG_ERROR; | 2412 | *flags |= DCB_FEATCFG_ERROR; |
2386 | break; | 2413 | break; |
2387 | default: | 2414 | default: |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h index 125bd1b6586f..804b8f64463e 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h | |||
@@ -199,4 +199,7 @@ extern const struct dcbnl_rtnl_ops bnx2x_dcbnl_ops; | |||
199 | int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall); | 199 | int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall); |
200 | #endif /* BCM_DCBNL */ | 200 | #endif /* BCM_DCBNL */ |
201 | 201 | ||
202 | int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp); | ||
203 | int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp); | ||
204 | |||
202 | #endif /* BNX2X_DCB_H */ | 205 | #endif /* BNX2X_DCB_H */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 955d6cfd9cb7..8bdc8b973007 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -2261,6 +2261,23 @@ static void bnx2x_set_requested_fc(struct bnx2x *bp) | |||
2261 | bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH; | 2261 | bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH; |
2262 | } | 2262 | } |
2263 | 2263 | ||
2264 | static void bnx2x_init_dropless_fc(struct bnx2x *bp) | ||
2265 | { | ||
2266 | u32 pause_enabled = 0; | ||
2267 | |||
2268 | if (!CHIP_IS_E1(bp) && bp->dropless_fc && bp->link_vars.link_up) { | ||
2269 | if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX) | ||
2270 | pause_enabled = 1; | ||
2271 | |||
2272 | REG_WR(bp, BAR_USTRORM_INTMEM + | ||
2273 | USTORM_ETH_PAUSE_ENABLED_OFFSET(BP_PORT(bp)), | ||
2274 | pause_enabled); | ||
2275 | } | ||
2276 | |||
2277 | DP(NETIF_MSG_IFUP | NETIF_MSG_LINK, "dropless_fc is %s\n", | ||
2278 | pause_enabled ? "enabled" : "disabled"); | ||
2279 | } | ||
2280 | |||
2264 | int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode) | 2281 | int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode) |
2265 | { | 2282 | { |
2266 | int rc, cfx_idx = bnx2x_get_link_cfg_idx(bp); | 2283 | int rc, cfx_idx = bnx2x_get_link_cfg_idx(bp); |
@@ -2294,6 +2311,8 @@ int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode) | |||
2294 | 2311 | ||
2295 | bnx2x_release_phy_lock(bp); | 2312 | bnx2x_release_phy_lock(bp); |
2296 | 2313 | ||
2314 | bnx2x_init_dropless_fc(bp); | ||
2315 | |||
2297 | bnx2x_calc_fc_adv(bp); | 2316 | bnx2x_calc_fc_adv(bp); |
2298 | 2317 | ||
2299 | if (bp->link_vars.link_up) { | 2318 | if (bp->link_vars.link_up) { |
@@ -2315,6 +2334,8 @@ void bnx2x_link_set(struct bnx2x *bp) | |||
2315 | bnx2x_phy_init(&bp->link_params, &bp->link_vars); | 2334 | bnx2x_phy_init(&bp->link_params, &bp->link_vars); |
2316 | bnx2x_release_phy_lock(bp); | 2335 | bnx2x_release_phy_lock(bp); |
2317 | 2336 | ||
2337 | bnx2x_init_dropless_fc(bp); | ||
2338 | |||
2318 | bnx2x_calc_fc_adv(bp); | 2339 | bnx2x_calc_fc_adv(bp); |
2319 | } else | 2340 | } else |
2320 | BNX2X_ERR("Bootcode is missing - can not set link\n"); | 2341 | BNX2X_ERR("Bootcode is missing - can not set link\n"); |
@@ -2556,20 +2577,9 @@ static void bnx2x_link_attn(struct bnx2x *bp) | |||
2556 | 2577 | ||
2557 | bnx2x_link_update(&bp->link_params, &bp->link_vars); | 2578 | bnx2x_link_update(&bp->link_params, &bp->link_vars); |
2558 | 2579 | ||
2559 | if (bp->link_vars.link_up) { | 2580 | bnx2x_init_dropless_fc(bp); |
2560 | 2581 | ||
2561 | /* dropless flow control */ | 2582 | if (bp->link_vars.link_up) { |
2562 | if (!CHIP_IS_E1(bp) && bp->dropless_fc) { | ||
2563 | int port = BP_PORT(bp); | ||
2564 | u32 pause_enabled = 0; | ||
2565 | |||
2566 | if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX) | ||
2567 | pause_enabled = 1; | ||
2568 | |||
2569 | REG_WR(bp, BAR_USTRORM_INTMEM + | ||
2570 | USTORM_ETH_PAUSE_ENABLED_OFFSET(port), | ||
2571 | pause_enabled); | ||
2572 | } | ||
2573 | 2583 | ||
2574 | if (bp->link_vars.mac_type != MAC_TYPE_EMAC) { | 2584 | if (bp->link_vars.mac_type != MAC_TYPE_EMAC) { |
2575 | struct host_port_stats *pstats; | 2585 | struct host_port_stats *pstats; |
@@ -9645,6 +9655,12 @@ sp_rtnl_not_reset: | |||
9645 | &bp->sp_rtnl_state)) | 9655 | &bp->sp_rtnl_state)) |
9646 | bnx2x_pf_set_vfs_vlan(bp); | 9656 | bnx2x_pf_set_vfs_vlan(bp); |
9647 | 9657 | ||
9658 | if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state)) | ||
9659 | bnx2x_dcbx_stop_hw_tx(bp); | ||
9660 | |||
9661 | if (test_and_clear_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state)) | ||
9662 | bnx2x_dcbx_resume_hw_tx(bp); | ||
9663 | |||
9648 | /* work which needs rtnl lock not-taken (as it takes the lock itself and | 9664 | /* work which needs rtnl lock not-taken (as it takes the lock itself and |
9649 | * can be called from other contexts as well) | 9665 | * can be called from other contexts as well) |
9650 | */ | 9666 | */ |
@@ -11147,6 +11163,9 @@ static bool bnx2x_get_dropless_info(struct bnx2x *bp) | |||
11147 | int tmp; | 11163 | int tmp; |
11148 | u32 cfg; | 11164 | u32 cfg; |
11149 | 11165 | ||
11166 | if (IS_VF(bp)) | ||
11167 | return 0; | ||
11168 | |||
11150 | if (IS_MF(bp) && !CHIP_IS_E1x(bp)) { | 11169 | if (IS_MF(bp) && !CHIP_IS_E1x(bp)) { |
11151 | /* Take function: tmp = func */ | 11170 | /* Take function: tmp = func */ |
11152 | tmp = BP_ABS_FUNC(bp); | 11171 | tmp = BP_ABS_FUNC(bp); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c index 44104fb27947..ad83f4b48777 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | |||
@@ -1747,11 +1747,8 @@ void bnx2x_iov_init_dq(struct bnx2x *bp) | |||
1747 | 1747 | ||
1748 | void bnx2x_iov_init_dmae(struct bnx2x *bp) | 1748 | void bnx2x_iov_init_dmae(struct bnx2x *bp) |
1749 | { | 1749 | { |
1750 | DP(BNX2X_MSG_IOV, "SRIOV is %s\n", IS_SRIOV(bp) ? "ON" : "OFF"); | 1750 | if (pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV)) |
1751 | if (!IS_SRIOV(bp)) | 1751 | REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0); |
1752 | return; | ||
1753 | |||
1754 | REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0); | ||
1755 | } | 1752 | } |
1756 | 1753 | ||
1757 | static int bnx2x_vf_bus(struct bnx2x *bp, int vfid) | 1754 | static int bnx2x_vf_bus(struct bnx2x *bp, int vfid) |
@@ -3084,8 +3081,9 @@ void bnx2x_disable_sriov(struct bnx2x *bp) | |||
3084 | pci_disable_sriov(bp->pdev); | 3081 | pci_disable_sriov(bp->pdev); |
3085 | } | 3082 | } |
3086 | 3083 | ||
3087 | static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx, | 3084 | static int bnx2x_vf_ndo_prep(struct bnx2x *bp, int vfidx, |
3088 | struct bnx2x_virtf *vf) | 3085 | struct bnx2x_virtf **vf, |
3086 | struct pf_vf_bulletin_content **bulletin) | ||
3089 | { | 3087 | { |
3090 | if (bp->state != BNX2X_STATE_OPEN) { | 3088 | if (bp->state != BNX2X_STATE_OPEN) { |
3091 | BNX2X_ERR("vf ndo called though PF is down\n"); | 3089 | BNX2X_ERR("vf ndo called though PF is down\n"); |
@@ -3103,12 +3101,22 @@ static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx, | |||
3103 | return -EINVAL; | 3101 | return -EINVAL; |
3104 | } | 3102 | } |
3105 | 3103 | ||
3106 | if (!vf) { | 3104 | /* init members */ |
3105 | *vf = BP_VF(bp, vfidx); | ||
3106 | *bulletin = BP_VF_BULLETIN(bp, vfidx); | ||
3107 | |||
3108 | if (!*vf) { | ||
3107 | BNX2X_ERR("vf ndo called but vf was null. vfidx was %d\n", | 3109 | BNX2X_ERR("vf ndo called but vf was null. vfidx was %d\n", |
3108 | vfidx); | 3110 | vfidx); |
3109 | return -EINVAL; | 3111 | return -EINVAL; |
3110 | } | 3112 | } |
3111 | 3113 | ||
3114 | if (!*bulletin) { | ||
3115 | BNX2X_ERR("vf ndo called but Bulletin Board struct is null. vfidx was %d\n", | ||
3116 | vfidx); | ||
3117 | return -EINVAL; | ||
3118 | } | ||
3119 | |||
3112 | return 0; | 3120 | return 0; |
3113 | } | 3121 | } |
3114 | 3122 | ||
@@ -3116,17 +3124,19 @@ int bnx2x_get_vf_config(struct net_device *dev, int vfidx, | |||
3116 | struct ifla_vf_info *ivi) | 3124 | struct ifla_vf_info *ivi) |
3117 | { | 3125 | { |
3118 | struct bnx2x *bp = netdev_priv(dev); | 3126 | struct bnx2x *bp = netdev_priv(dev); |
3119 | struct bnx2x_virtf *vf = BP_VF(bp, vfidx); | 3127 | struct bnx2x_virtf *vf = NULL; |
3120 | struct bnx2x_vlan_mac_obj *mac_obj = &bnx2x_vfq(vf, 0, mac_obj); | 3128 | struct pf_vf_bulletin_content *bulletin = NULL; |
3121 | struct bnx2x_vlan_mac_obj *vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj); | 3129 | struct bnx2x_vlan_mac_obj *mac_obj; |
3122 | struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx); | 3130 | struct bnx2x_vlan_mac_obj *vlan_obj; |
3123 | int rc; | 3131 | int rc; |
3124 | 3132 | ||
3125 | /* sanity */ | 3133 | /* sanity and init */ |
3126 | rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf); | 3134 | rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin); |
3127 | if (rc) | 3135 | if (rc) |
3128 | return rc; | 3136 | return rc; |
3129 | if (!mac_obj || !vlan_obj || !bulletin) { | 3137 | mac_obj = &bnx2x_vfq(vf, 0, mac_obj); |
3138 | vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj); | ||
3139 | if (!mac_obj || !vlan_obj) { | ||
3130 | BNX2X_ERR("VF partially initialized\n"); | 3140 | BNX2X_ERR("VF partially initialized\n"); |
3131 | return -EINVAL; | 3141 | return -EINVAL; |
3132 | } | 3142 | } |
@@ -3183,11 +3193,11 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac) | |||
3183 | { | 3193 | { |
3184 | struct bnx2x *bp = netdev_priv(dev); | 3194 | struct bnx2x *bp = netdev_priv(dev); |
3185 | int rc, q_logical_state; | 3195 | int rc, q_logical_state; |
3186 | struct bnx2x_virtf *vf = BP_VF(bp, vfidx); | 3196 | struct bnx2x_virtf *vf = NULL; |
3187 | struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx); | 3197 | struct pf_vf_bulletin_content *bulletin = NULL; |
3188 | 3198 | ||
3189 | /* sanity */ | 3199 | /* sanity and init */ |
3190 | rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf); | 3200 | rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin); |
3191 | if (rc) | 3201 | if (rc) |
3192 | return rc; | 3202 | return rc; |
3193 | if (!is_valid_ether_addr(mac)) { | 3203 | if (!is_valid_ether_addr(mac)) { |
@@ -3249,11 +3259,11 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) | |||
3249 | { | 3259 | { |
3250 | struct bnx2x *bp = netdev_priv(dev); | 3260 | struct bnx2x *bp = netdev_priv(dev); |
3251 | int rc, q_logical_state; | 3261 | int rc, q_logical_state; |
3252 | struct bnx2x_virtf *vf = BP_VF(bp, vfidx); | 3262 | struct bnx2x_virtf *vf = NULL; |
3253 | struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx); | 3263 | struct pf_vf_bulletin_content *bulletin = NULL; |
3254 | 3264 | ||
3255 | /* sanity */ | 3265 | /* sanity and init */ |
3256 | rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf); | 3266 | rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin); |
3257 | if (rc) | 3267 | if (rc) |
3258 | return rc; | 3268 | return rc; |
3259 | 3269 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 181edb522450..4559c35eea13 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2563,8 +2563,8 @@ static int be_close(struct net_device *netdev) | |||
2563 | /* Wait for all pending tx completions to arrive so that | 2563 | /* Wait for all pending tx completions to arrive so that |
2564 | * all tx skbs are freed. | 2564 | * all tx skbs are freed. |
2565 | */ | 2565 | */ |
2566 | be_tx_compl_clean(adapter); | ||
2567 | netif_tx_disable(netdev); | 2566 | netif_tx_disable(netdev); |
2567 | be_tx_compl_clean(adapter); | ||
2568 | 2568 | ||
2569 | be_rx_qs_destroy(adapter); | 2569 | be_rx_qs_destroy(adapter); |
2570 | 2570 | ||
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index b5eb4195fc99..85e5c97191dd 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -7088,7 +7088,7 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
7088 | 7088 | ||
7089 | RTL_W8(Cfg9346, Cfg9346_Unlock); | 7089 | RTL_W8(Cfg9346, Cfg9346_Unlock); |
7090 | RTL_W8(Config1, RTL_R8(Config1) | PMEnable); | 7090 | RTL_W8(Config1, RTL_R8(Config1) | PMEnable); |
7091 | RTL_W8(Config5, RTL_R8(Config5) & PMEStatus); | 7091 | RTL_W8(Config5, RTL_R8(Config5) & (BWF | MWF | UWF | LanWake | PMEStatus)); |
7092 | if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0) | 7092 | if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0) |
7093 | tp->features |= RTL_FEATURE_WOL; | 7093 | tp->features |= RTL_FEATURE_WOL; |
7094 | if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0) | 7094 | if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0) |
diff --git a/drivers/net/ethernet/sfc/filter.c b/drivers/net/ethernet/sfc/filter.c index 2a469b27a506..30d744235d27 100644 --- a/drivers/net/ethernet/sfc/filter.c +++ b/drivers/net/ethernet/sfc/filter.c | |||
@@ -675,7 +675,7 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec, | |||
675 | BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0); | 675 | BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0); |
676 | BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF != | 676 | BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF != |
677 | EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF); | 677 | EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF); |
678 | rep_index = spec->type - EFX_FILTER_INDEX_UC_DEF; | 678 | rep_index = spec->type - EFX_FILTER_UC_DEF; |
679 | ins_index = rep_index; | 679 | ins_index = rep_index; |
680 | 680 | ||
681 | spin_lock_bh(&state->lock); | 681 | spin_lock_bh(&state->lock); |
diff --git a/drivers/net/irda/via-ircc.c b/drivers/net/irda/via-ircc.c index 51f2bc376101..2dcc60fb37f1 100644 --- a/drivers/net/irda/via-ircc.c +++ b/drivers/net/irda/via-ircc.c | |||
@@ -210,8 +210,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) | |||
210 | pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0)); | 210 | pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0)); |
211 | pci_write_config_byte(pcidev,0x5a,0xc0); | 211 | pci_write_config_byte(pcidev,0x5a,0xc0); |
212 | WriteLPCReg(0x28, 0x70 ); | 212 | WriteLPCReg(0x28, 0x70 ); |
213 | if (via_ircc_open(pcidev, &info, 0x3076) == 0) | 213 | rc = via_ircc_open(pcidev, &info, 0x3076); |
214 | rc=0; | ||
215 | } else | 214 | } else |
216 | rc = -ENODEV; //IR not turn on | 215 | rc = -ENODEV; //IR not turn on |
217 | } else { //Not VT1211 | 216 | } else { //Not VT1211 |
@@ -249,8 +248,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) | |||
249 | info.irq=FirIRQ; | 248 | info.irq=FirIRQ; |
250 | info.dma=FirDRQ1; | 249 | info.dma=FirDRQ1; |
251 | info.dma2=FirDRQ0; | 250 | info.dma2=FirDRQ0; |
252 | if (via_ircc_open(pcidev, &info, 0x3096) == 0) | 251 | rc = via_ircc_open(pcidev, &info, 0x3096); |
253 | rc=0; | ||
254 | } else | 252 | } else |
255 | rc = -ENODEV; //IR not turn on !!!!! | 253 | rc = -ENODEV; //IR not turn on !!!!! |
256 | }//Not VT1211 | 254 | }//Not VT1211 |
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index b51db2abfe44..ea53abb20988 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -68,6 +68,8 @@ static const struct proto_ops macvtap_socket_ops; | |||
68 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ | 68 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ |
69 | NETIF_F_TSO6 | NETIF_F_UFO) | 69 | NETIF_F_TSO6 | NETIF_F_UFO) |
70 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) | 70 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) |
71 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) | ||
72 | |||
71 | /* | 73 | /* |
72 | * RCU usage: | 74 | * RCU usage: |
73 | * The macvtap_queue and the macvlan_dev are loosely coupled, the | 75 | * The macvtap_queue and the macvlan_dev are loosely coupled, the |
@@ -278,7 +280,8 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) | |||
278 | { | 280 | { |
279 | struct macvlan_dev *vlan = netdev_priv(dev); | 281 | struct macvlan_dev *vlan = netdev_priv(dev); |
280 | struct macvtap_queue *q = macvtap_get_queue(dev, skb); | 282 | struct macvtap_queue *q = macvtap_get_queue(dev, skb); |
281 | netdev_features_t features; | 283 | netdev_features_t features = TAP_FEATURES; |
284 | |||
282 | if (!q) | 285 | if (!q) |
283 | goto drop; | 286 | goto drop; |
284 | 287 | ||
@@ -287,9 +290,11 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) | |||
287 | 290 | ||
288 | skb->dev = dev; | 291 | skb->dev = dev; |
289 | /* Apply the forward feature mask so that we perform segmentation | 292 | /* Apply the forward feature mask so that we perform segmentation |
290 | * according to users wishes. | 293 | * according to users wishes. This only works if VNET_HDR is |
294 | * enabled. | ||
291 | */ | 295 | */ |
292 | features = netif_skb_features(skb) & vlan->tap_features; | 296 | if (q->flags & IFF_VNET_HDR) |
297 | features |= vlan->tap_features; | ||
293 | if (netif_needs_gso(skb, features)) { | 298 | if (netif_needs_gso(skb, features)) { |
294 | struct sk_buff *segs = __skb_gso_segment(skb, features, false); | 299 | struct sk_buff *segs = __skb_gso_segment(skb, features, false); |
295 | 300 | ||
@@ -1064,8 +1069,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
1064 | /* tap_features are the same as features on tun/tap and | 1069 | /* tap_features are the same as features on tun/tap and |
1065 | * reflect user expectations. | 1070 | * reflect user expectations. |
1066 | */ | 1071 | */ |
1067 | vlan->tap_features = vlan->dev->features & | 1072 | vlan->tap_features = feature_mask; |
1068 | (feature_mask | ~TUN_OFFLOADS); | ||
1069 | vlan->set_features = features; | 1073 | vlan->set_features = features; |
1070 | netdev_update_features(vlan->dev); | 1074 | netdev_update_features(vlan->dev); |
1071 | 1075 | ||
@@ -1161,10 +1165,6 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, | |||
1161 | TUN_F_TSO_ECN | TUN_F_UFO)) | 1165 | TUN_F_TSO_ECN | TUN_F_UFO)) |
1162 | return -EINVAL; | 1166 | return -EINVAL; |
1163 | 1167 | ||
1164 | /* TODO: only accept frames with the features that | ||
1165 | got enabled for forwarded frames */ | ||
1166 | if (!(q->flags & IFF_VNET_HDR)) | ||
1167 | return -EINVAL; | ||
1168 | rtnl_lock(); | 1168 | rtnl_lock(); |
1169 | ret = set_offload(q, arg); | 1169 | ret = set_offload(q, arg); |
1170 | rtnl_unlock(); | 1170 | rtnl_unlock(); |
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index 8e7af8354342..138de837977f 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #define RTL821x_INER_INIT 0x6400 | 23 | #define RTL821x_INER_INIT 0x6400 |
24 | #define RTL821x_INSR 0x13 | 24 | #define RTL821x_INSR 0x13 |
25 | 25 | ||
26 | #define RTL8211E_INER_LINK_STAT 0x10 | 26 | #define RTL8211E_INER_LINK_STATUS 0x400 |
27 | 27 | ||
28 | MODULE_DESCRIPTION("Realtek PHY driver"); | 28 | MODULE_DESCRIPTION("Realtek PHY driver"); |
29 | MODULE_AUTHOR("Johnson Leung"); | 29 | MODULE_AUTHOR("Johnson Leung"); |
@@ -57,7 +57,7 @@ static int rtl8211e_config_intr(struct phy_device *phydev) | |||
57 | 57 | ||
58 | if (phydev->interrupts == PHY_INTERRUPT_ENABLED) | 58 | if (phydev->interrupts == PHY_INTERRUPT_ENABLED) |
59 | err = phy_write(phydev, RTL821x_INER, | 59 | err = phy_write(phydev, RTL821x_INER, |
60 | RTL8211E_INER_LINK_STAT); | 60 | RTL8211E_INER_LINK_STATUS); |
61 | else | 61 | else |
62 | err = phy_write(phydev, RTL821x_INER, 0); | 62 | err = phy_write(phydev, RTL821x_INER, 0); |
63 | 63 | ||
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index cba1d46e672e..86292e6aaf49 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -2816,13 +2816,16 @@ exit: | |||
2816 | static int hso_get_config_data(struct usb_interface *interface) | 2816 | static int hso_get_config_data(struct usb_interface *interface) |
2817 | { | 2817 | { |
2818 | struct usb_device *usbdev = interface_to_usbdev(interface); | 2818 | struct usb_device *usbdev = interface_to_usbdev(interface); |
2819 | u8 config_data[17]; | 2819 | u8 *config_data = kmalloc(17, GFP_KERNEL); |
2820 | u32 if_num = interface->altsetting->desc.bInterfaceNumber; | 2820 | u32 if_num = interface->altsetting->desc.bInterfaceNumber; |
2821 | s32 result; | 2821 | s32 result; |
2822 | 2822 | ||
2823 | if (!config_data) | ||
2824 | return -ENOMEM; | ||
2823 | if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), | 2825 | if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), |
2824 | 0x86, 0xC0, 0, 0, config_data, 17, | 2826 | 0x86, 0xC0, 0, 0, config_data, 17, |
2825 | USB_CTRL_SET_TIMEOUT) != 0x11) { | 2827 | USB_CTRL_SET_TIMEOUT) != 0x11) { |
2828 | kfree(config_data); | ||
2826 | return -EIO; | 2829 | return -EIO; |
2827 | } | 2830 | } |
2828 | 2831 | ||
@@ -2873,6 +2876,7 @@ static int hso_get_config_data(struct usb_interface *interface) | |||
2873 | if (config_data[16] & 0x1) | 2876 | if (config_data[16] & 0x1) |
2874 | result |= HSO_INFO_CRC_BUG; | 2877 | result |= HSO_INFO_CRC_BUG; |
2875 | 2878 | ||
2879 | kfree(config_data); | ||
2876 | return result; | 2880 | return result; |
2877 | } | 2881 | } |
2878 | 2882 | ||
@@ -2886,6 +2890,11 @@ static int hso_probe(struct usb_interface *interface, | |||
2886 | struct hso_shared_int *shared_int; | 2890 | struct hso_shared_int *shared_int; |
2887 | struct hso_device *tmp_dev = NULL; | 2891 | struct hso_device *tmp_dev = NULL; |
2888 | 2892 | ||
2893 | if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) { | ||
2894 | dev_err(&interface->dev, "Not our interface\n"); | ||
2895 | return -ENODEV; | ||
2896 | } | ||
2897 | |||
2889 | if_num = interface->altsetting->desc.bInterfaceNumber; | 2898 | if_num = interface->altsetting->desc.bInterfaceNumber; |
2890 | 2899 | ||
2891 | /* Get the interface/port specification from either driver_info or from | 2900 | /* Get the interface/port specification from either driver_info or from |
@@ -2895,10 +2904,6 @@ static int hso_probe(struct usb_interface *interface, | |||
2895 | else | 2904 | else |
2896 | port_spec = hso_get_config_data(interface); | 2905 | port_spec = hso_get_config_data(interface); |
2897 | 2906 | ||
2898 | if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) { | ||
2899 | dev_err(&interface->dev, "Not our interface\n"); | ||
2900 | return -ENODEV; | ||
2901 | } | ||
2902 | /* Check if we need to switch to alt interfaces prior to port | 2907 | /* Check if we need to switch to alt interfaces prior to port |
2903 | * configuration */ | 2908 | * configuration */ |
2904 | if (interface->num_altsetting > 1) | 2909 | if (interface->num_altsetting > 1) |
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c index ac074731335a..e5090309824e 100644 --- a/drivers/net/wireless/hostap/hostap_ioctl.c +++ b/drivers/net/wireless/hostap/hostap_ioctl.c | |||
@@ -523,9 +523,9 @@ static int prism2_ioctl_giwaplist(struct net_device *dev, | |||
523 | 523 | ||
524 | data->length = prism2_ap_get_sta_qual(local, addr, qual, IW_MAX_AP, 1); | 524 | data->length = prism2_ap_get_sta_qual(local, addr, qual, IW_MAX_AP, 1); |
525 | 525 | ||
526 | memcpy(extra, &addr, sizeof(struct sockaddr) * data->length); | 526 | memcpy(extra, addr, sizeof(struct sockaddr) * data->length); |
527 | data->flags = 1; /* has quality information */ | 527 | data->flags = 1; /* has quality information */ |
528 | memcpy(extra + sizeof(struct sockaddr) * data->length, &qual, | 528 | memcpy(extra + sizeof(struct sockaddr) * data->length, qual, |
529 | sizeof(struct iw_quality) * data->length); | 529 | sizeof(struct iw_quality) * data->length); |
530 | 530 | ||
531 | kfree(addr); | 531 | kfree(addr); |
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index 822f1a00efbb..319387263e12 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
@@ -1068,7 +1068,10 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success) | |||
1068 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 1068 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
1069 | return; | 1069 | return; |
1070 | 1070 | ||
1071 | if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) | 1071 | if (!test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
1072 | return; | ||
1073 | |||
1074 | if (ctx->vif) | ||
1072 | ieee80211_chswitch_done(ctx->vif, is_success); | 1075 | ieee80211_chswitch_done(ctx->vif, is_success); |
1073 | } | 1076 | } |
1074 | 1077 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index a70c7b9d9bad..ff8cc75c189d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
@@ -97,8 +97,6 @@ | |||
97 | 97 | ||
98 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) | 98 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) |
99 | 99 | ||
100 | #define APMG_RTC_INT_STT_RFKILL (0x10000000) | ||
101 | |||
102 | /* Device system time */ | 100 | /* Device system time */ |
103 | #define DEVICE_SYSTEM_TIME_REG 0xA0206C | 101 | #define DEVICE_SYSTEM_TIME_REG 0xA0206C |
104 | 102 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c index ad9bbca99213..7fd6fbfbc1b3 100644 --- a/drivers/net/wireless/iwlwifi/mvm/time-event.c +++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c | |||
@@ -138,6 +138,20 @@ static void iwl_mvm_roc_finished(struct iwl_mvm *mvm) | |||
138 | schedule_work(&mvm->roc_done_wk); | 138 | schedule_work(&mvm->roc_done_wk); |
139 | } | 139 | } |
140 | 140 | ||
141 | static bool iwl_mvm_te_check_disconnect(struct iwl_mvm *mvm, | ||
142 | struct ieee80211_vif *vif, | ||
143 | const char *errmsg) | ||
144 | { | ||
145 | if (vif->type != NL80211_IFTYPE_STATION) | ||
146 | return false; | ||
147 | if (vif->bss_conf.assoc && vif->bss_conf.dtim_period) | ||
148 | return false; | ||
149 | if (errmsg) | ||
150 | IWL_ERR(mvm, "%s\n", errmsg); | ||
151 | ieee80211_connection_loss(vif); | ||
152 | return true; | ||
153 | } | ||
154 | |||
141 | /* | 155 | /* |
142 | * Handles a FW notification for an event that is known to the driver. | 156 | * Handles a FW notification for an event that is known to the driver. |
143 | * | 157 | * |
@@ -163,8 +177,13 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm, | |||
163 | * P2P Device discoveribility, while there are other higher priority | 177 | * P2P Device discoveribility, while there are other higher priority |
164 | * events in the system). | 178 | * events in the system). |
165 | */ | 179 | */ |
166 | WARN_ONCE(!le32_to_cpu(notif->status), | 180 | if (WARN_ONCE(!le32_to_cpu(notif->status), |
167 | "Failed to schedule time event\n"); | 181 | "Failed to schedule time event\n")) { |
182 | if (iwl_mvm_te_check_disconnect(mvm, te_data->vif, NULL)) { | ||
183 | iwl_mvm_te_clear_data(mvm, te_data); | ||
184 | return; | ||
185 | } | ||
186 | } | ||
168 | 187 | ||
169 | if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_END) { | 188 | if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_END) { |
170 | IWL_DEBUG_TE(mvm, | 189 | IWL_DEBUG_TE(mvm, |
@@ -180,14 +199,8 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm, | |||
180 | * By now, we should have finished association | 199 | * By now, we should have finished association |
181 | * and know the dtim period. | 200 | * and know the dtim period. |
182 | */ | 201 | */ |
183 | if (te_data->vif->type == NL80211_IFTYPE_STATION && | 202 | iwl_mvm_te_check_disconnect(mvm, te_data->vif, |
184 | (!te_data->vif->bss_conf.assoc || | 203 | "No assocation and the time event is over already..."); |
185 | !te_data->vif->bss_conf.dtim_period)) { | ||
186 | IWL_ERR(mvm, | ||
187 | "No assocation and the time event is over already...\n"); | ||
188 | ieee80211_connection_loss(te_data->vif); | ||
189 | } | ||
190 | |||
191 | iwl_mvm_te_clear_data(mvm, te_data); | 204 | iwl_mvm_te_clear_data(mvm, te_data); |
192 | } else if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_START) { | 205 | } else if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_START) { |
193 | te_data->running = true; | 206 | te_data->running = true; |
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index f600e68a410a..fd848cd1583e 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
@@ -888,14 +888,6 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) | |||
888 | 888 | ||
889 | iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); | 889 | iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); |
890 | if (hw_rfkill) { | 890 | if (hw_rfkill) { |
891 | /* | ||
892 | * Clear the interrupt in APMG if the NIC is going down. | ||
893 | * Note that when the NIC exits RFkill (else branch), we | ||
894 | * can't access prph and the NIC will be reset in | ||
895 | * start_hw anyway. | ||
896 | */ | ||
897 | iwl_write_prph(trans, APMG_RTC_INT_STT_REG, | ||
898 | APMG_RTC_INT_STT_RFKILL); | ||
899 | set_bit(STATUS_RFKILL, &trans_pcie->status); | 891 | set_bit(STATUS_RFKILL, &trans_pcie->status); |
900 | if (test_and_clear_bit(STATUS_HCMD_ACTIVE, | 892 | if (test_and_clear_bit(STATUS_HCMD_ACTIVE, |
901 | &trans_pcie->status)) | 893 | &trans_pcie->status)) |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 96cfcdd39079..390e2f058aff 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -1502,16 +1502,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
1502 | spin_lock_init(&trans_pcie->reg_lock); | 1502 | spin_lock_init(&trans_pcie->reg_lock); |
1503 | init_waitqueue_head(&trans_pcie->ucode_write_waitq); | 1503 | init_waitqueue_head(&trans_pcie->ucode_write_waitq); |
1504 | 1504 | ||
1505 | /* W/A - seems to solve weird behavior. We need to remove this if we | ||
1506 | * don't want to stay in L1 all the time. This wastes a lot of power */ | ||
1507 | pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | | ||
1508 | PCIE_LINK_STATE_CLKPM); | ||
1509 | |||
1510 | if (pci_enable_device(pdev)) { | 1505 | if (pci_enable_device(pdev)) { |
1511 | err = -ENODEV; | 1506 | err = -ENODEV; |
1512 | goto out_no_pci; | 1507 | goto out_no_pci; |
1513 | } | 1508 | } |
1514 | 1509 | ||
1510 | /* W/A - seems to solve weird behavior. We need to remove this if we | ||
1511 | * don't want to stay in L1 all the time. This wastes a lot of power */ | ||
1512 | pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | | ||
1513 | PCIE_LINK_STATE_CLKPM); | ||
1514 | |||
1515 | pci_set_master(pdev); | 1515 | pci_set_master(pdev); |
1516 | 1516 | ||
1517 | err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36)); | 1517 | err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36)); |
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c index 4941f201d6c8..b8ba1f925e75 100644 --- a/drivers/net/wireless/zd1201.c +++ b/drivers/net/wireless/zd1201.c | |||
@@ -98,10 +98,12 @@ static int zd1201_fw_upload(struct usb_device *dev, int apfw) | |||
98 | goto exit; | 98 | goto exit; |
99 | 99 | ||
100 | err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4, | 100 | err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4, |
101 | USB_DIR_IN | 0x40, 0,0, &ret, sizeof(ret), ZD1201_FW_TIMEOUT); | 101 | USB_DIR_IN | 0x40, 0, 0, buf, sizeof(ret), ZD1201_FW_TIMEOUT); |
102 | if (err < 0) | 102 | if (err < 0) |
103 | goto exit; | 103 | goto exit; |
104 | 104 | ||
105 | memcpy(&ret, buf, sizeof(ret)); | ||
106 | |||
105 | if (ret & 0x80) { | 107 | if (ret & 0x80) { |
106 | err = -EIO; | 108 | err = -EIO; |
107 | goto exit; | 109 | goto exit; |
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 6bb7cf2de556..b10ba00cc3e6 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -392,6 +392,8 @@ static void __unflatten_device_tree(struct boot_param_header *blob, | |||
392 | mem = (unsigned long) | 392 | mem = (unsigned long) |
393 | dt_alloc(size + 4, __alignof__(struct device_node)); | 393 | dt_alloc(size + 4, __alignof__(struct device_node)); |
394 | 394 | ||
395 | memset((void *)mem, 0, size); | ||
396 | |||
395 | ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); | 397 | ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); |
396 | 398 | ||
397 | pr_debug(" unflattening %lx...\n", mem); | 399 | pr_debug(" unflattening %lx...\n", mem); |
diff --git a/drivers/pinctrl/pinctrl-sunxi.c b/drivers/pinctrl/pinctrl-sunxi.c index c47fd1e5450b..94716c779800 100644 --- a/drivers/pinctrl/pinctrl-sunxi.c +++ b/drivers/pinctrl/pinctrl-sunxi.c | |||
@@ -278,6 +278,7 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev, | |||
278 | { | 278 | { |
279 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | 279 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); |
280 | struct sunxi_pinctrl_group *g = &pctl->groups[group]; | 280 | struct sunxi_pinctrl_group *g = &pctl->groups[group]; |
281 | unsigned long flags; | ||
281 | u32 val, mask; | 282 | u32 val, mask; |
282 | u16 strength; | 283 | u16 strength; |
283 | u8 dlevel; | 284 | u8 dlevel; |
@@ -295,22 +296,35 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev, | |||
295 | * 3: 40mA | 296 | * 3: 40mA |
296 | */ | 297 | */ |
297 | dlevel = strength / 10 - 1; | 298 | dlevel = strength / 10 - 1; |
299 | |||
300 | spin_lock_irqsave(&pctl->lock, flags); | ||
301 | |||
298 | val = readl(pctl->membase + sunxi_dlevel_reg(g->pin)); | 302 | val = readl(pctl->membase + sunxi_dlevel_reg(g->pin)); |
299 | mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin); | 303 | mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin); |
300 | writel((val & ~mask) | dlevel << sunxi_dlevel_offset(g->pin), | 304 | writel((val & ~mask) | dlevel << sunxi_dlevel_offset(g->pin), |
301 | pctl->membase + sunxi_dlevel_reg(g->pin)); | 305 | pctl->membase + sunxi_dlevel_reg(g->pin)); |
306 | |||
307 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
302 | break; | 308 | break; |
303 | case PIN_CONFIG_BIAS_PULL_UP: | 309 | case PIN_CONFIG_BIAS_PULL_UP: |
310 | spin_lock_irqsave(&pctl->lock, flags); | ||
311 | |||
304 | val = readl(pctl->membase + sunxi_pull_reg(g->pin)); | 312 | val = readl(pctl->membase + sunxi_pull_reg(g->pin)); |
305 | mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); | 313 | mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); |
306 | writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin), | 314 | writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin), |
307 | pctl->membase + sunxi_pull_reg(g->pin)); | 315 | pctl->membase + sunxi_pull_reg(g->pin)); |
316 | |||
317 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
308 | break; | 318 | break; |
309 | case PIN_CONFIG_BIAS_PULL_DOWN: | 319 | case PIN_CONFIG_BIAS_PULL_DOWN: |
320 | spin_lock_irqsave(&pctl->lock, flags); | ||
321 | |||
310 | val = readl(pctl->membase + sunxi_pull_reg(g->pin)); | 322 | val = readl(pctl->membase + sunxi_pull_reg(g->pin)); |
311 | mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); | 323 | mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); |
312 | writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin), | 324 | writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin), |
313 | pctl->membase + sunxi_pull_reg(g->pin)); | 325 | pctl->membase + sunxi_pull_reg(g->pin)); |
326 | |||
327 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
314 | break; | 328 | break; |
315 | default: | 329 | default: |
316 | break; | 330 | break; |
@@ -360,11 +374,17 @@ static void sunxi_pmx_set(struct pinctrl_dev *pctldev, | |||
360 | u8 config) | 374 | u8 config) |
361 | { | 375 | { |
362 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | 376 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); |
377 | unsigned long flags; | ||
378 | u32 val, mask; | ||
379 | |||
380 | spin_lock_irqsave(&pctl->lock, flags); | ||
363 | 381 | ||
364 | u32 val = readl(pctl->membase + sunxi_mux_reg(pin)); | 382 | val = readl(pctl->membase + sunxi_mux_reg(pin)); |
365 | u32 mask = MUX_PINS_MASK << sunxi_mux_offset(pin); | 383 | mask = MUX_PINS_MASK << sunxi_mux_offset(pin); |
366 | writel((val & ~mask) | config << sunxi_mux_offset(pin), | 384 | writel((val & ~mask) | config << sunxi_mux_offset(pin), |
367 | pctl->membase + sunxi_mux_reg(pin)); | 385 | pctl->membase + sunxi_mux_reg(pin)); |
386 | |||
387 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
368 | } | 388 | } |
369 | 389 | ||
370 | static int sunxi_pmx_enable(struct pinctrl_dev *pctldev, | 390 | static int sunxi_pmx_enable(struct pinctrl_dev *pctldev, |
@@ -464,8 +484,21 @@ static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip, | |||
464 | struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); | 484 | struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); |
465 | u32 reg = sunxi_data_reg(offset); | 485 | u32 reg = sunxi_data_reg(offset); |
466 | u8 index = sunxi_data_offset(offset); | 486 | u8 index = sunxi_data_offset(offset); |
487 | unsigned long flags; | ||
488 | u32 regval; | ||
489 | |||
490 | spin_lock_irqsave(&pctl->lock, flags); | ||
491 | |||
492 | regval = readl(pctl->membase + reg); | ||
467 | 493 | ||
468 | writel((value & DATA_PINS_MASK) << index, pctl->membase + reg); | 494 | if (value) |
495 | regval |= BIT(index); | ||
496 | else | ||
497 | regval &= ~(BIT(index)); | ||
498 | |||
499 | writel(regval, pctl->membase + reg); | ||
500 | |||
501 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
469 | } | 502 | } |
470 | 503 | ||
471 | static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc, | 504 | static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc, |
@@ -526,6 +559,8 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d, | |||
526 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | 559 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); |
527 | u32 reg = sunxi_irq_cfg_reg(d->hwirq); | 560 | u32 reg = sunxi_irq_cfg_reg(d->hwirq); |
528 | u8 index = sunxi_irq_cfg_offset(d->hwirq); | 561 | u8 index = sunxi_irq_cfg_offset(d->hwirq); |
562 | unsigned long flags; | ||
563 | u32 regval; | ||
529 | u8 mode; | 564 | u8 mode; |
530 | 565 | ||
531 | switch (type) { | 566 | switch (type) { |
@@ -548,7 +583,13 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d, | |||
548 | return -EINVAL; | 583 | return -EINVAL; |
549 | } | 584 | } |
550 | 585 | ||
551 | writel((mode & IRQ_CFG_IRQ_MASK) << index, pctl->membase + reg); | 586 | spin_lock_irqsave(&pctl->lock, flags); |
587 | |||
588 | regval = readl(pctl->membase + reg); | ||
589 | regval &= ~IRQ_CFG_IRQ_MASK; | ||
590 | writel(regval | (mode << index), pctl->membase + reg); | ||
591 | |||
592 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
552 | 593 | ||
553 | return 0; | 594 | return 0; |
554 | } | 595 | } |
@@ -560,14 +601,19 @@ static void sunxi_pinctrl_irq_mask_ack(struct irq_data *d) | |||
560 | u8 ctrl_idx = sunxi_irq_ctrl_offset(d->hwirq); | 601 | u8 ctrl_idx = sunxi_irq_ctrl_offset(d->hwirq); |
561 | u32 status_reg = sunxi_irq_status_reg(d->hwirq); | 602 | u32 status_reg = sunxi_irq_status_reg(d->hwirq); |
562 | u8 status_idx = sunxi_irq_status_offset(d->hwirq); | 603 | u8 status_idx = sunxi_irq_status_offset(d->hwirq); |
604 | unsigned long flags; | ||
563 | u32 val; | 605 | u32 val; |
564 | 606 | ||
607 | spin_lock_irqsave(&pctl->lock, flags); | ||
608 | |||
565 | /* Mask the IRQ */ | 609 | /* Mask the IRQ */ |
566 | val = readl(pctl->membase + ctrl_reg); | 610 | val = readl(pctl->membase + ctrl_reg); |
567 | writel(val & ~(1 << ctrl_idx), pctl->membase + ctrl_reg); | 611 | writel(val & ~(1 << ctrl_idx), pctl->membase + ctrl_reg); |
568 | 612 | ||
569 | /* Clear the IRQ */ | 613 | /* Clear the IRQ */ |
570 | writel(1 << status_idx, pctl->membase + status_reg); | 614 | writel(1 << status_idx, pctl->membase + status_reg); |
615 | |||
616 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
571 | } | 617 | } |
572 | 618 | ||
573 | static void sunxi_pinctrl_irq_mask(struct irq_data *d) | 619 | static void sunxi_pinctrl_irq_mask(struct irq_data *d) |
@@ -575,11 +621,16 @@ static void sunxi_pinctrl_irq_mask(struct irq_data *d) | |||
575 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | 621 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); |
576 | u32 reg = sunxi_irq_ctrl_reg(d->hwirq); | 622 | u32 reg = sunxi_irq_ctrl_reg(d->hwirq); |
577 | u8 idx = sunxi_irq_ctrl_offset(d->hwirq); | 623 | u8 idx = sunxi_irq_ctrl_offset(d->hwirq); |
624 | unsigned long flags; | ||
578 | u32 val; | 625 | u32 val; |
579 | 626 | ||
627 | spin_lock_irqsave(&pctl->lock, flags); | ||
628 | |||
580 | /* Mask the IRQ */ | 629 | /* Mask the IRQ */ |
581 | val = readl(pctl->membase + reg); | 630 | val = readl(pctl->membase + reg); |
582 | writel(val & ~(1 << idx), pctl->membase + reg); | 631 | writel(val & ~(1 << idx), pctl->membase + reg); |
632 | |||
633 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
583 | } | 634 | } |
584 | 635 | ||
585 | static void sunxi_pinctrl_irq_unmask(struct irq_data *d) | 636 | static void sunxi_pinctrl_irq_unmask(struct irq_data *d) |
@@ -588,6 +639,7 @@ static void sunxi_pinctrl_irq_unmask(struct irq_data *d) | |||
588 | struct sunxi_desc_function *func; | 639 | struct sunxi_desc_function *func; |
589 | u32 reg = sunxi_irq_ctrl_reg(d->hwirq); | 640 | u32 reg = sunxi_irq_ctrl_reg(d->hwirq); |
590 | u8 idx = sunxi_irq_ctrl_offset(d->hwirq); | 641 | u8 idx = sunxi_irq_ctrl_offset(d->hwirq); |
642 | unsigned long flags; | ||
591 | u32 val; | 643 | u32 val; |
592 | 644 | ||
593 | func = sunxi_pinctrl_desc_find_function_by_pin(pctl, | 645 | func = sunxi_pinctrl_desc_find_function_by_pin(pctl, |
@@ -597,9 +649,13 @@ static void sunxi_pinctrl_irq_unmask(struct irq_data *d) | |||
597 | /* Change muxing to INT mode */ | 649 | /* Change muxing to INT mode */ |
598 | sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval); | 650 | sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval); |
599 | 651 | ||
652 | spin_lock_irqsave(&pctl->lock, flags); | ||
653 | |||
600 | /* Unmask the IRQ */ | 654 | /* Unmask the IRQ */ |
601 | val = readl(pctl->membase + reg); | 655 | val = readl(pctl->membase + reg); |
602 | writel(val | (1 << idx), pctl->membase + reg); | 656 | writel(val | (1 << idx), pctl->membase + reg); |
657 | |||
658 | spin_unlock_irqrestore(&pctl->lock, flags); | ||
603 | } | 659 | } |
604 | 660 | ||
605 | static struct irq_chip sunxi_pinctrl_irq_chip = { | 661 | static struct irq_chip sunxi_pinctrl_irq_chip = { |
@@ -752,6 +808,8 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev) | |||
752 | return -ENOMEM; | 808 | return -ENOMEM; |
753 | platform_set_drvdata(pdev, pctl); | 809 | platform_set_drvdata(pdev, pctl); |
754 | 810 | ||
811 | spin_lock_init(&pctl->lock); | ||
812 | |||
755 | pctl->membase = of_iomap(node, 0); | 813 | pctl->membase = of_iomap(node, 0); |
756 | if (!pctl->membase) | 814 | if (!pctl->membase) |
757 | return -ENOMEM; | 815 | return -ENOMEM; |
diff --git a/drivers/pinctrl/pinctrl-sunxi.h b/drivers/pinctrl/pinctrl-sunxi.h index d68047d8f699..01c494f8a14f 100644 --- a/drivers/pinctrl/pinctrl-sunxi.h +++ b/drivers/pinctrl/pinctrl-sunxi.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #define __PINCTRL_SUNXI_H | 14 | #define __PINCTRL_SUNXI_H |
15 | 15 | ||
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/spinlock.h> | ||
17 | 18 | ||
18 | #define PA_BASE 0 | 19 | #define PA_BASE 0 |
19 | #define PB_BASE 32 | 20 | #define PB_BASE 32 |
@@ -407,6 +408,7 @@ struct sunxi_pinctrl { | |||
407 | unsigned ngroups; | 408 | unsigned ngroups; |
408 | int irq; | 409 | int irq; |
409 | int irq_array[SUNXI_IRQ_NUMBER]; | 410 | int irq_array[SUNXI_IRQ_NUMBER]; |
411 | spinlock_t lock; | ||
410 | struct pinctrl_dev *pctl_dev; | 412 | struct pinctrl_dev *pctl_dev; |
411 | }; | 413 | }; |
412 | 414 | ||
diff --git a/drivers/platform/olpc/olpc-ec.c b/drivers/platform/olpc/olpc-ec.c index 0f9f8596b300..f9119525f557 100644 --- a/drivers/platform/olpc/olpc-ec.c +++ b/drivers/platform/olpc/olpc-ec.c | |||
@@ -330,7 +330,7 @@ static int __init olpc_ec_init_module(void) | |||
330 | return platform_driver_register(&olpc_ec_plat_driver); | 330 | return platform_driver_register(&olpc_ec_plat_driver); |
331 | } | 331 | } |
332 | 332 | ||
333 | module_init(olpc_ec_init_module); | 333 | arch_initcall(olpc_ec_init_module); |
334 | 334 | ||
335 | MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); | 335 | MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); |
336 | MODULE_LICENSE("GPL"); | 336 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 97bb05edcb5a..d6970f47ae72 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
@@ -53,7 +53,6 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4"); | |||
53 | #define HPWMI_ALS_QUERY 0x3 | 53 | #define HPWMI_ALS_QUERY 0x3 |
54 | #define HPWMI_HARDWARE_QUERY 0x4 | 54 | #define HPWMI_HARDWARE_QUERY 0x4 |
55 | #define HPWMI_WIRELESS_QUERY 0x5 | 55 | #define HPWMI_WIRELESS_QUERY 0x5 |
56 | #define HPWMI_BIOS_QUERY 0x9 | ||
57 | #define HPWMI_HOTKEY_QUERY 0xc | 56 | #define HPWMI_HOTKEY_QUERY 0xc |
58 | #define HPWMI_WIRELESS2_QUERY 0x1b | 57 | #define HPWMI_WIRELESS2_QUERY 0x1b |
59 | #define HPWMI_POSTCODEERROR_QUERY 0x2a | 58 | #define HPWMI_POSTCODEERROR_QUERY 0x2a |
@@ -293,19 +292,6 @@ static int hp_wmi_tablet_state(void) | |||
293 | return (state & 0x4) ? 1 : 0; | 292 | return (state & 0x4) ? 1 : 0; |
294 | } | 293 | } |
295 | 294 | ||
296 | static int hp_wmi_enable_hotkeys(void) | ||
297 | { | ||
298 | int ret; | ||
299 | int query = 0x6e; | ||
300 | |||
301 | ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query), | ||
302 | 0); | ||
303 | |||
304 | if (ret) | ||
305 | return -EINVAL; | ||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | static int hp_wmi_set_block(void *data, bool blocked) | 295 | static int hp_wmi_set_block(void *data, bool blocked) |
310 | { | 296 | { |
311 | enum hp_wmi_radio r = (enum hp_wmi_radio) data; | 297 | enum hp_wmi_radio r = (enum hp_wmi_radio) data; |
@@ -1009,8 +995,6 @@ static int __init hp_wmi_init(void) | |||
1009 | err = hp_wmi_input_setup(); | 995 | err = hp_wmi_input_setup(); |
1010 | if (err) | 996 | if (err) |
1011 | return err; | 997 | return err; |
1012 | |||
1013 | hp_wmi_enable_hotkeys(); | ||
1014 | } | 998 | } |
1015 | 999 | ||
1016 | if (bios_capable) { | 1000 | if (bios_capable) { |
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index 2ac045f27f10..3a1b6bf326a8 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
@@ -2440,7 +2440,10 @@ static ssize_t sony_nc_gfx_switch_status_show(struct device *dev, | |||
2440 | if (pos < 0) | 2440 | if (pos < 0) |
2441 | return pos; | 2441 | return pos; |
2442 | 2442 | ||
2443 | return snprintf(buffer, PAGE_SIZE, "%s\n", pos ? "speed" : "stamina"); | 2443 | return snprintf(buffer, PAGE_SIZE, "%s\n", |
2444 | pos == SPEED ? "speed" : | ||
2445 | pos == STAMINA ? "stamina" : | ||
2446 | pos == AUTO ? "auto" : "unknown"); | ||
2444 | } | 2447 | } |
2445 | 2448 | ||
2446 | static int sony_nc_gfx_switch_setup(struct platform_device *pd, | 2449 | static int sony_nc_gfx_switch_setup(struct platform_device *pd, |
@@ -4320,7 +4323,8 @@ static int sony_pic_add(struct acpi_device *device) | |||
4320 | goto err_free_resources; | 4323 | goto err_free_resources; |
4321 | } | 4324 | } |
4322 | 4325 | ||
4323 | if (sonypi_compat_init()) | 4326 | result = sonypi_compat_init(); |
4327 | if (result) | ||
4324 | goto err_remove_input; | 4328 | goto err_remove_input; |
4325 | 4329 | ||
4326 | /* request io port */ | 4330 | /* request io port */ |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 1d4c8fe72752..c82fe65c4128 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -102,10 +102,13 @@ static void zfcp_erp_action_dismiss_port(struct zfcp_port *port) | |||
102 | 102 | ||
103 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_INUSE) | 103 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_INUSE) |
104 | zfcp_erp_action_dismiss(&port->erp_action); | 104 | zfcp_erp_action_dismiss(&port->erp_action); |
105 | else | 105 | else { |
106 | shost_for_each_device(sdev, port->adapter->scsi_host) | 106 | spin_lock(port->adapter->scsi_host->host_lock); |
107 | __shost_for_each_device(sdev, port->adapter->scsi_host) | ||
107 | if (sdev_to_zfcp(sdev)->port == port) | 108 | if (sdev_to_zfcp(sdev)->port == port) |
108 | zfcp_erp_action_dismiss_lun(sdev); | 109 | zfcp_erp_action_dismiss_lun(sdev); |
110 | spin_unlock(port->adapter->scsi_host->host_lock); | ||
111 | } | ||
109 | } | 112 | } |
110 | 113 | ||
111 | static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) | 114 | static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) |
@@ -592,9 +595,11 @@ static void _zfcp_erp_lun_reopen_all(struct zfcp_port *port, int clear, | |||
592 | { | 595 | { |
593 | struct scsi_device *sdev; | 596 | struct scsi_device *sdev; |
594 | 597 | ||
595 | shost_for_each_device(sdev, port->adapter->scsi_host) | 598 | spin_lock(port->adapter->scsi_host->host_lock); |
599 | __shost_for_each_device(sdev, port->adapter->scsi_host) | ||
596 | if (sdev_to_zfcp(sdev)->port == port) | 600 | if (sdev_to_zfcp(sdev)->port == port) |
597 | _zfcp_erp_lun_reopen(sdev, clear, id, 0); | 601 | _zfcp_erp_lun_reopen(sdev, clear, id, 0); |
602 | spin_unlock(port->adapter->scsi_host->host_lock); | ||
598 | } | 603 | } |
599 | 604 | ||
600 | static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act) | 605 | static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act) |
@@ -1434,8 +1439,10 @@ void zfcp_erp_set_adapter_status(struct zfcp_adapter *adapter, u32 mask) | |||
1434 | atomic_set_mask(common_mask, &port->status); | 1439 | atomic_set_mask(common_mask, &port->status); |
1435 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 1440 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
1436 | 1441 | ||
1437 | shost_for_each_device(sdev, adapter->scsi_host) | 1442 | spin_lock_irqsave(adapter->scsi_host->host_lock, flags); |
1443 | __shost_for_each_device(sdev, adapter->scsi_host) | ||
1438 | atomic_set_mask(common_mask, &sdev_to_zfcp(sdev)->status); | 1444 | atomic_set_mask(common_mask, &sdev_to_zfcp(sdev)->status); |
1445 | spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags); | ||
1439 | } | 1446 | } |
1440 | 1447 | ||
1441 | /** | 1448 | /** |
@@ -1469,11 +1476,13 @@ void zfcp_erp_clear_adapter_status(struct zfcp_adapter *adapter, u32 mask) | |||
1469 | } | 1476 | } |
1470 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 1477 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
1471 | 1478 | ||
1472 | shost_for_each_device(sdev, adapter->scsi_host) { | 1479 | spin_lock_irqsave(adapter->scsi_host->host_lock, flags); |
1480 | __shost_for_each_device(sdev, adapter->scsi_host) { | ||
1473 | atomic_clear_mask(common_mask, &sdev_to_zfcp(sdev)->status); | 1481 | atomic_clear_mask(common_mask, &sdev_to_zfcp(sdev)->status); |
1474 | if (clear_counter) | 1482 | if (clear_counter) |
1475 | atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0); | 1483 | atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0); |
1476 | } | 1484 | } |
1485 | spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags); | ||
1477 | } | 1486 | } |
1478 | 1487 | ||
1479 | /** | 1488 | /** |
@@ -1487,16 +1496,19 @@ void zfcp_erp_set_port_status(struct zfcp_port *port, u32 mask) | |||
1487 | { | 1496 | { |
1488 | struct scsi_device *sdev; | 1497 | struct scsi_device *sdev; |
1489 | u32 common_mask = mask & ZFCP_COMMON_FLAGS; | 1498 | u32 common_mask = mask & ZFCP_COMMON_FLAGS; |
1499 | unsigned long flags; | ||
1490 | 1500 | ||
1491 | atomic_set_mask(mask, &port->status); | 1501 | atomic_set_mask(mask, &port->status); |
1492 | 1502 | ||
1493 | if (!common_mask) | 1503 | if (!common_mask) |
1494 | return; | 1504 | return; |
1495 | 1505 | ||
1496 | shost_for_each_device(sdev, port->adapter->scsi_host) | 1506 | spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags); |
1507 | __shost_for_each_device(sdev, port->adapter->scsi_host) | ||
1497 | if (sdev_to_zfcp(sdev)->port == port) | 1508 | if (sdev_to_zfcp(sdev)->port == port) |
1498 | atomic_set_mask(common_mask, | 1509 | atomic_set_mask(common_mask, |
1499 | &sdev_to_zfcp(sdev)->status); | 1510 | &sdev_to_zfcp(sdev)->status); |
1511 | spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags); | ||
1500 | } | 1512 | } |
1501 | 1513 | ||
1502 | /** | 1514 | /** |
@@ -1511,6 +1523,7 @@ void zfcp_erp_clear_port_status(struct zfcp_port *port, u32 mask) | |||
1511 | struct scsi_device *sdev; | 1523 | struct scsi_device *sdev; |
1512 | u32 common_mask = mask & ZFCP_COMMON_FLAGS; | 1524 | u32 common_mask = mask & ZFCP_COMMON_FLAGS; |
1513 | u32 clear_counter = mask & ZFCP_STATUS_COMMON_ERP_FAILED; | 1525 | u32 clear_counter = mask & ZFCP_STATUS_COMMON_ERP_FAILED; |
1526 | unsigned long flags; | ||
1514 | 1527 | ||
1515 | atomic_clear_mask(mask, &port->status); | 1528 | atomic_clear_mask(mask, &port->status); |
1516 | 1529 | ||
@@ -1520,13 +1533,15 @@ void zfcp_erp_clear_port_status(struct zfcp_port *port, u32 mask) | |||
1520 | if (clear_counter) | 1533 | if (clear_counter) |
1521 | atomic_set(&port->erp_counter, 0); | 1534 | atomic_set(&port->erp_counter, 0); |
1522 | 1535 | ||
1523 | shost_for_each_device(sdev, port->adapter->scsi_host) | 1536 | spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags); |
1537 | __shost_for_each_device(sdev, port->adapter->scsi_host) | ||
1524 | if (sdev_to_zfcp(sdev)->port == port) { | 1538 | if (sdev_to_zfcp(sdev)->port == port) { |
1525 | atomic_clear_mask(common_mask, | 1539 | atomic_clear_mask(common_mask, |
1526 | &sdev_to_zfcp(sdev)->status); | 1540 | &sdev_to_zfcp(sdev)->status); |
1527 | if (clear_counter) | 1541 | if (clear_counter) |
1528 | atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0); | 1542 | atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0); |
1529 | } | 1543 | } |
1544 | spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags); | ||
1530 | } | 1545 | } |
1531 | 1546 | ||
1532 | /** | 1547 | /** |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 665e3cfaaf85..de0598eaacd2 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -224,11 +224,9 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | |||
224 | 224 | ||
225 | static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio) | 225 | static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio) |
226 | { | 226 | { |
227 | spin_lock_irq(&qdio->req_q_lock); | ||
228 | if (atomic_read(&qdio->req_q_free) || | 227 | if (atomic_read(&qdio->req_q_free) || |
229 | !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) | 228 | !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) |
230 | return 1; | 229 | return 1; |
231 | spin_unlock_irq(&qdio->req_q_lock); | ||
232 | return 0; | 230 | return 0; |
233 | } | 231 | } |
234 | 232 | ||
@@ -246,9 +244,8 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio) | |||
246 | { | 244 | { |
247 | long ret; | 245 | long ret; |
248 | 246 | ||
249 | spin_unlock_irq(&qdio->req_q_lock); | 247 | ret = wait_event_interruptible_lock_irq_timeout(qdio->req_q_wq, |
250 | ret = wait_event_interruptible_timeout(qdio->req_q_wq, | 248 | zfcp_qdio_sbal_check(qdio), qdio->req_q_lock, 5 * HZ); |
251 | zfcp_qdio_sbal_check(qdio), 5 * HZ); | ||
252 | 249 | ||
253 | if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) | 250 | if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) |
254 | return -EIO; | 251 | return -EIO; |
@@ -262,7 +259,6 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio) | |||
262 | zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1"); | 259 | zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1"); |
263 | } | 260 | } |
264 | 261 | ||
265 | spin_lock_irq(&qdio->req_q_lock); | ||
266 | return -EIO; | 262 | return -EIO; |
267 | } | 263 | } |
268 | 264 | ||
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index 3f01bbf0609f..890639274bcf 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c | |||
@@ -27,6 +27,16 @@ static ssize_t zfcp_sysfs_##_feat##_##_name##_show(struct device *dev, \ | |||
27 | static ZFCP_DEV_ATTR(_feat, _name, S_IRUGO, \ | 27 | static ZFCP_DEV_ATTR(_feat, _name, S_IRUGO, \ |
28 | zfcp_sysfs_##_feat##_##_name##_show, NULL); | 28 | zfcp_sysfs_##_feat##_##_name##_show, NULL); |
29 | 29 | ||
30 | #define ZFCP_DEFINE_ATTR_CONST(_feat, _name, _format, _value) \ | ||
31 | static ssize_t zfcp_sysfs_##_feat##_##_name##_show(struct device *dev, \ | ||
32 | struct device_attribute *at,\ | ||
33 | char *buf) \ | ||
34 | { \ | ||
35 | return sprintf(buf, _format, _value); \ | ||
36 | } \ | ||
37 | static ZFCP_DEV_ATTR(_feat, _name, S_IRUGO, \ | ||
38 | zfcp_sysfs_##_feat##_##_name##_show, NULL); | ||
39 | |||
30 | #define ZFCP_DEFINE_A_ATTR(_name, _format, _value) \ | 40 | #define ZFCP_DEFINE_A_ATTR(_name, _format, _value) \ |
31 | static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, \ | 41 | static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, \ |
32 | struct device_attribute *at,\ | 42 | struct device_attribute *at,\ |
@@ -75,6 +85,8 @@ ZFCP_DEFINE_ATTR(zfcp_unit, unit, in_recovery, "%d\n", | |||
75 | ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_denied, "%d\n", | 85 | ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_denied, "%d\n", |
76 | (zfcp_unit_sdev_status(unit) & | 86 | (zfcp_unit_sdev_status(unit) & |
77 | ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0); | 87 | ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0); |
88 | ZFCP_DEFINE_ATTR_CONST(unit, access_shared, "%d\n", 0); | ||
89 | ZFCP_DEFINE_ATTR_CONST(unit, access_readonly, "%d\n", 0); | ||
78 | 90 | ||
79 | static ssize_t zfcp_sysfs_port_failed_show(struct device *dev, | 91 | static ssize_t zfcp_sysfs_port_failed_show(struct device *dev, |
80 | struct device_attribute *attr, | 92 | struct device_attribute *attr, |
@@ -347,6 +359,8 @@ static struct attribute *zfcp_unit_attrs[] = { | |||
347 | &dev_attr_unit_in_recovery.attr, | 359 | &dev_attr_unit_in_recovery.attr, |
348 | &dev_attr_unit_status.attr, | 360 | &dev_attr_unit_status.attr, |
349 | &dev_attr_unit_access_denied.attr, | 361 | &dev_attr_unit_access_denied.attr, |
362 | &dev_attr_unit_access_shared.attr, | ||
363 | &dev_attr_unit_access_readonly.attr, | ||
350 | NULL | 364 | NULL |
351 | }; | 365 | }; |
352 | static struct attribute_group zfcp_unit_attr_group = { | 366 | static struct attribute_group zfcp_unit_attr_group = { |
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 48b2918e0d65..92ff027746f2 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -1353,7 +1353,6 @@ config SCSI_LPFC | |||
1353 | tristate "Emulex LightPulse Fibre Channel Support" | 1353 | tristate "Emulex LightPulse Fibre Channel Support" |
1354 | depends on PCI && SCSI | 1354 | depends on PCI && SCSI |
1355 | select SCSI_FC_ATTRS | 1355 | select SCSI_FC_ATTRS |
1356 | select GENERIC_CSUM | ||
1357 | select CRC_T10DIF | 1356 | select CRC_T10DIF |
1358 | help | 1357 | help |
1359 | This lpfc driver supports the Emulex LightPulse | 1358 | This lpfc driver supports the Emulex LightPulse |
diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index e25eba5713c1..b3b5125faa72 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c | |||
@@ -482,7 +482,7 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it) | |||
482 | ret = comedi_device_postconfig(dev); | 482 | ret = comedi_device_postconfig(dev); |
483 | if (ret < 0) { | 483 | if (ret < 0) { |
484 | comedi_device_detach(dev); | 484 | comedi_device_detach(dev); |
485 | module_put(dev->driver->module); | 485 | module_put(driv->module); |
486 | } | 486 | } |
487 | /* On success, the driver module count has been incremented. */ | 487 | /* On success, the driver module count has been incremented. */ |
488 | return ret; | 488 | return ret; |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 08613e241894..0f1d193fef02 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
@@ -304,6 +304,11 @@ static int __init ohci_pci_init(void) | |||
304 | pr_info("%s: " DRIVER_DESC "\n", hcd_name); | 304 | pr_info("%s: " DRIVER_DESC "\n", hcd_name); |
305 | 305 | ||
306 | ohci_init_driver(&ohci_pci_hc_driver, &pci_overrides); | 306 | ohci_init_driver(&ohci_pci_hc_driver, &pci_overrides); |
307 | |||
308 | /* Entries for the PCI suspend/resume callbacks are special */ | ||
309 | ohci_pci_hc_driver.pci_suspend = ohci_suspend; | ||
310 | ohci_pci_hc_driver.pci_resume = ohci_resume; | ||
311 | |||
307 | return pci_register_driver(&ohci_pci_driver); | 312 | return pci_register_driver(&ohci_pci_driver); |
308 | } | 313 | } |
309 | module_init(ohci_pci_init); | 314 | module_init(ohci_pci_init); |
diff --git a/drivers/usb/phy/phy-fsl-usb.h b/drivers/usb/phy/phy-fsl-usb.h index ca266280895d..e1859b8ef567 100644 --- a/drivers/usb/phy/phy-fsl-usb.h +++ b/drivers/usb/phy/phy-fsl-usb.h | |||
@@ -15,7 +15,7 @@ | |||
15 | * 675 Mass Ave, Cambridge, MA 02139, USA. | 15 | * 675 Mass Ave, Cambridge, MA 02139, USA. |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include "otg_fsm.h" | 18 | #include "phy-fsm-usb.h" |
19 | #include <linux/usb/otg.h> | 19 | #include <linux/usb/otg.h> |
20 | #include <linux/ioctl.h> | 20 | #include <linux/ioctl.h> |
21 | 21 | ||
diff --git a/drivers/usb/phy/phy-fsm-usb.c b/drivers/usb/phy/phy-fsm-usb.c index c520b3548e7c..7f4596606e18 100644 --- a/drivers/usb/phy/phy-fsm-usb.c +++ b/drivers/usb/phy/phy-fsm-usb.c | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <linux/usb/gadget.h> | 29 | #include <linux/usb/gadget.h> |
30 | #include <linux/usb/otg.h> | 30 | #include <linux/usb/otg.h> |
31 | 31 | ||
32 | #include "phy-otg-fsm.h" | 32 | #include "phy-fsm-usb.h" |
33 | 33 | ||
34 | /* Change USB protocol when there is a protocol change */ | 34 | /* Change USB protocol when there is a protocol change */ |
35 | static int otg_set_protocol(struct otg_fsm *fsm, int protocol) | 35 | static int otg_set_protocol(struct otg_fsm *fsm, int protocol) |
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index a58ac435a9a4..5e8be462aed5 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
@@ -348,7 +348,7 @@ static void init_evtchn_cpu_bindings(void) | |||
348 | 348 | ||
349 | for_each_possible_cpu(i) | 349 | for_each_possible_cpu(i) |
350 | memset(per_cpu(cpu_evtchn_mask, i), | 350 | memset(per_cpu(cpu_evtchn_mask, i), |
351 | (i == 0) ? ~0 : 0, sizeof(*per_cpu(cpu_evtchn_mask, i))); | 351 | (i == 0) ? ~0 : 0, NR_EVENT_CHANNELS/8); |
352 | } | 352 | } |
353 | 353 | ||
354 | static inline void clear_evtchn(int port) | 354 | static inline void clear_evtchn(int port) |
@@ -1493,8 +1493,10 @@ void rebind_evtchn_irq(int evtchn, int irq) | |||
1493 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ | 1493 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ |
1494 | static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) | 1494 | static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) |
1495 | { | 1495 | { |
1496 | struct shared_info *s = HYPERVISOR_shared_info; | ||
1496 | struct evtchn_bind_vcpu bind_vcpu; | 1497 | struct evtchn_bind_vcpu bind_vcpu; |
1497 | int evtchn = evtchn_from_irq(irq); | 1498 | int evtchn = evtchn_from_irq(irq); |
1499 | int masked; | ||
1498 | 1500 | ||
1499 | if (!VALID_EVTCHN(evtchn)) | 1501 | if (!VALID_EVTCHN(evtchn)) |
1500 | return -1; | 1502 | return -1; |
@@ -1511,6 +1513,12 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) | |||
1511 | bind_vcpu.vcpu = tcpu; | 1513 | bind_vcpu.vcpu = tcpu; |
1512 | 1514 | ||
1513 | /* | 1515 | /* |
1516 | * Mask the event while changing the VCPU binding to prevent | ||
1517 | * it being delivered on an unexpected VCPU. | ||
1518 | */ | ||
1519 | masked = sync_test_and_set_bit(evtchn, BM(s->evtchn_mask)); | ||
1520 | |||
1521 | /* | ||
1514 | * If this fails, it usually just indicates that we're dealing with a | 1522 | * If this fails, it usually just indicates that we're dealing with a |
1515 | * virq or IPI channel, which don't actually need to be rebound. Ignore | 1523 | * virq or IPI channel, which don't actually need to be rebound. Ignore |
1516 | * it, but don't do the xenlinux-level rebind in that case. | 1524 | * it, but don't do the xenlinux-level rebind in that case. |
@@ -1518,6 +1526,9 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) | |||
1518 | if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0) | 1526 | if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0) |
1519 | bind_evtchn_to_cpu(evtchn, tcpu); | 1527 | bind_evtchn_to_cpu(evtchn, tcpu); |
1520 | 1528 | ||
1529 | if (!masked) | ||
1530 | unmask_evtchn(evtchn); | ||
1531 | |||
1521 | return 0; | 1532 | return 0; |
1522 | } | 1533 | } |
1523 | 1534 | ||
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index 5e376bb93419..8defc6b3f9a2 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c | |||
@@ -40,7 +40,7 @@ struct inode *bfs_iget(struct super_block *sb, unsigned long ino) | |||
40 | int block, off; | 40 | int block, off; |
41 | 41 | ||
42 | inode = iget_locked(sb, ino); | 42 | inode = iget_locked(sb, ino); |
43 | if (IS_ERR(inode)) | 43 | if (!inode) |
44 | return ERR_PTR(-ENOMEM); | 44 | return ERR_PTR(-ENOMEM); |
45 | if (!(inode->i_state & I_NEW)) | 45 | if (!(inode->i_state & I_NEW)) |
46 | return inode; | 46 | return inode; |
@@ -1045,12 +1045,22 @@ static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs, | |||
1045 | int bio_uncopy_user(struct bio *bio) | 1045 | int bio_uncopy_user(struct bio *bio) |
1046 | { | 1046 | { |
1047 | struct bio_map_data *bmd = bio->bi_private; | 1047 | struct bio_map_data *bmd = bio->bi_private; |
1048 | int ret = 0; | 1048 | struct bio_vec *bvec; |
1049 | int ret = 0, i; | ||
1049 | 1050 | ||
1050 | if (!bio_flagged(bio, BIO_NULL_MAPPED)) | 1051 | if (!bio_flagged(bio, BIO_NULL_MAPPED)) { |
1051 | ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs, | 1052 | /* |
1052 | bmd->nr_sgvecs, bio_data_dir(bio) == READ, | 1053 | * if we're in a workqueue, the request is orphaned, so |
1053 | 0, bmd->is_our_pages); | 1054 | * don't copy into a random user address space, just free. |
1055 | */ | ||
1056 | if (current->mm) | ||
1057 | ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs, | ||
1058 | bmd->nr_sgvecs, bio_data_dir(bio) == READ, | ||
1059 | 0, bmd->is_our_pages); | ||
1060 | else if (bmd->is_our_pages) | ||
1061 | bio_for_each_segment_all(bvec, bio, i) | ||
1062 | __free_page(bvec->bv_page); | ||
1063 | } | ||
1054 | bio_free_map_data(bmd); | 1064 | bio_free_map_data(bmd); |
1055 | bio_put(bio); | 1065 | bio_put(bio); |
1056 | return ret; | 1066 | return ret; |
diff --git a/fs/dcache.c b/fs/dcache.c index 87bdb5329c3c..83cfb834db03 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -2724,6 +2724,17 @@ char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen, | |||
2724 | return memcpy(buffer, temp, sz); | 2724 | return memcpy(buffer, temp, sz); |
2725 | } | 2725 | } |
2726 | 2726 | ||
2727 | char *simple_dname(struct dentry *dentry, char *buffer, int buflen) | ||
2728 | { | ||
2729 | char *end = buffer + buflen; | ||
2730 | /* these dentries are never renamed, so d_lock is not needed */ | ||
2731 | if (prepend(&end, &buflen, " (deleted)", 11) || | ||
2732 | prepend_name(&end, &buflen, &dentry->d_name) || | ||
2733 | prepend(&end, &buflen, "/", 1)) | ||
2734 | end = ERR_PTR(-ENAMETOOLONG); | ||
2735 | return end; | ||
2736 | } | ||
2737 | |||
2727 | /* | 2738 | /* |
2728 | * Write full pathname from the root of the filesystem into the buffer. | 2739 | * Write full pathname from the root of the filesystem into the buffer. |
2729 | */ | 2740 | */ |
diff --git a/fs/efs/inode.c b/fs/efs/inode.c index f3913eb2c474..d15ccf20f1b3 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c | |||
@@ -57,7 +57,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino) | |||
57 | struct inode *inode; | 57 | struct inode *inode; |
58 | 58 | ||
59 | inode = iget_locked(super, ino); | 59 | inode = iget_locked(super, ino); |
60 | if (IS_ERR(inode)) | 60 | if (!inode) |
61 | return ERR_PTR(-ENOMEM); | 61 | return ERR_PTR(-ENOMEM); |
62 | if (!(inode->i_state & I_NEW)) | 62 | if (!(inode->i_state & I_NEW)) |
63 | return inode; | 63 | return inode; |
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 9435384562a2..544a809819c3 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
@@ -1838,14 +1838,14 @@ int __init gfs2_glock_init(void) | |||
1838 | 1838 | ||
1839 | glock_workqueue = alloc_workqueue("glock_workqueue", WQ_MEM_RECLAIM | | 1839 | glock_workqueue = alloc_workqueue("glock_workqueue", WQ_MEM_RECLAIM | |
1840 | WQ_HIGHPRI | WQ_FREEZABLE, 0); | 1840 | WQ_HIGHPRI | WQ_FREEZABLE, 0); |
1841 | if (IS_ERR(glock_workqueue)) | 1841 | if (!glock_workqueue) |
1842 | return PTR_ERR(glock_workqueue); | 1842 | return -ENOMEM; |
1843 | gfs2_delete_workqueue = alloc_workqueue("delete_workqueue", | 1843 | gfs2_delete_workqueue = alloc_workqueue("delete_workqueue", |
1844 | WQ_MEM_RECLAIM | WQ_FREEZABLE, | 1844 | WQ_MEM_RECLAIM | WQ_FREEZABLE, |
1845 | 0); | 1845 | 0); |
1846 | if (IS_ERR(gfs2_delete_workqueue)) { | 1846 | if (!gfs2_delete_workqueue) { |
1847 | destroy_workqueue(glock_workqueue); | 1847 | destroy_workqueue(glock_workqueue); |
1848 | return PTR_ERR(gfs2_delete_workqueue); | 1848 | return -ENOMEM; |
1849 | } | 1849 | } |
1850 | 1850 | ||
1851 | register_shrinker(&glock_shrinker); | 1851 | register_shrinker(&glock_shrinker); |
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 5f2e5224c51c..e2e0a90396e7 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -47,7 +47,8 @@ static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh) | |||
47 | * None of the buffers should be dirty, locked, or pinned. | 47 | * None of the buffers should be dirty, locked, or pinned. |
48 | */ | 48 | */ |
49 | 49 | ||
50 | static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | 50 | static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync, |
51 | unsigned int nr_revokes) | ||
51 | { | 52 | { |
52 | struct gfs2_sbd *sdp = gl->gl_sbd; | 53 | struct gfs2_sbd *sdp = gl->gl_sbd; |
53 | struct list_head *head = &gl->gl_ail_list; | 54 | struct list_head *head = &gl->gl_ail_list; |
@@ -57,7 +58,9 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | |||
57 | 58 | ||
58 | gfs2_log_lock(sdp); | 59 | gfs2_log_lock(sdp); |
59 | spin_lock(&sdp->sd_ail_lock); | 60 | spin_lock(&sdp->sd_ail_lock); |
60 | list_for_each_entry_safe(bd, tmp, head, bd_ail_gl_list) { | 61 | list_for_each_entry_safe_reverse(bd, tmp, head, bd_ail_gl_list) { |
62 | if (nr_revokes == 0) | ||
63 | break; | ||
61 | bh = bd->bd_bh; | 64 | bh = bd->bd_bh; |
62 | if (bh->b_state & b_state) { | 65 | if (bh->b_state & b_state) { |
63 | if (fsync) | 66 | if (fsync) |
@@ -65,6 +68,7 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | |||
65 | gfs2_ail_error(gl, bh); | 68 | gfs2_ail_error(gl, bh); |
66 | } | 69 | } |
67 | gfs2_trans_add_revoke(sdp, bd); | 70 | gfs2_trans_add_revoke(sdp, bd); |
71 | nr_revokes--; | ||
68 | } | 72 | } |
69 | GLOCK_BUG_ON(gl, !fsync && atomic_read(&gl->gl_ail_count)); | 73 | GLOCK_BUG_ON(gl, !fsync && atomic_read(&gl->gl_ail_count)); |
70 | spin_unlock(&sdp->sd_ail_lock); | 74 | spin_unlock(&sdp->sd_ail_lock); |
@@ -91,7 +95,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl) | |||
91 | WARN_ON_ONCE(current->journal_info); | 95 | WARN_ON_ONCE(current->journal_info); |
92 | current->journal_info = &tr; | 96 | current->journal_info = &tr; |
93 | 97 | ||
94 | __gfs2_ail_flush(gl, 0); | 98 | __gfs2_ail_flush(gl, 0, tr.tr_revokes); |
95 | 99 | ||
96 | gfs2_trans_end(sdp); | 100 | gfs2_trans_end(sdp); |
97 | gfs2_log_flush(sdp, NULL); | 101 | gfs2_log_flush(sdp, NULL); |
@@ -101,15 +105,19 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) | |||
101 | { | 105 | { |
102 | struct gfs2_sbd *sdp = gl->gl_sbd; | 106 | struct gfs2_sbd *sdp = gl->gl_sbd; |
103 | unsigned int revokes = atomic_read(&gl->gl_ail_count); | 107 | unsigned int revokes = atomic_read(&gl->gl_ail_count); |
108 | unsigned int max_revokes = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / sizeof(u64); | ||
104 | int ret; | 109 | int ret; |
105 | 110 | ||
106 | if (!revokes) | 111 | if (!revokes) |
107 | return; | 112 | return; |
108 | 113 | ||
109 | ret = gfs2_trans_begin(sdp, 0, revokes); | 114 | while (revokes > max_revokes) |
115 | max_revokes += (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header)) / sizeof(u64); | ||
116 | |||
117 | ret = gfs2_trans_begin(sdp, 0, max_revokes); | ||
110 | if (ret) | 118 | if (ret) |
111 | return; | 119 | return; |
112 | __gfs2_ail_flush(gl, fsync); | 120 | __gfs2_ail_flush(gl, fsync, max_revokes); |
113 | gfs2_trans_end(sdp); | 121 | gfs2_trans_end(sdp); |
114 | gfs2_log_flush(sdp, NULL); | 122 | gfs2_log_flush(sdp, NULL); |
115 | } | 123 | } |
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index bbb2715171cd..64915eeae5a7 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
@@ -594,7 +594,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, | |||
594 | } | 594 | } |
595 | gfs2_glock_dq_uninit(ghs); | 595 | gfs2_glock_dq_uninit(ghs); |
596 | if (IS_ERR(d)) | 596 | if (IS_ERR(d)) |
597 | return PTR_RET(d); | 597 | return PTR_ERR(d); |
598 | return error; | 598 | return error; |
599 | } else if (error != -ENOENT) { | 599 | } else if (error != -ENOENT) { |
600 | goto fail_gunlock; | 600 | goto fail_gunlock; |
@@ -1750,6 +1750,10 @@ static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name, | |||
1750 | struct gfs2_holder gh; | 1750 | struct gfs2_holder gh; |
1751 | int ret; | 1751 | int ret; |
1752 | 1752 | ||
1753 | /* For selinux during lookup */ | ||
1754 | if (gfs2_glock_is_locked_by_me(ip->i_gl)) | ||
1755 | return generic_getxattr(dentry, name, data, size); | ||
1756 | |||
1753 | gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); | 1757 | gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); |
1754 | ret = gfs2_glock_nq(&gh); | 1758 | ret = gfs2_glock_nq(&gh); |
1755 | if (ret == 0) { | 1759 | if (ret == 0) { |
diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c index e04d0e09ee7b..7b0f5043cf24 100644 --- a/fs/gfs2/main.c +++ b/fs/gfs2/main.c | |||
@@ -155,7 +155,7 @@ static int __init init_gfs2_fs(void) | |||
155 | goto fail_wq; | 155 | goto fail_wq; |
156 | 156 | ||
157 | gfs2_control_wq = alloc_workqueue("gfs2_control", | 157 | gfs2_control_wq = alloc_workqueue("gfs2_control", |
158 | WQ_NON_REENTRANT | WQ_UNBOUND | WQ_FREEZABLE, 0); | 158 | WQ_UNBOUND | WQ_FREEZABLE, 0); |
159 | if (!gfs2_control_wq) | 159 | if (!gfs2_control_wq) |
160 | goto fail_recovery; | 160 | goto fail_recovery; |
161 | 161 | ||
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 34423978b170..d19b30ababf1 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -926,14 +926,8 @@ static int get_hstate_idx(int page_size_log) | |||
926 | return h - hstates; | 926 | return h - hstates; |
927 | } | 927 | } |
928 | 928 | ||
929 | static char *hugetlb_dname(struct dentry *dentry, char *buffer, int buflen) | ||
930 | { | ||
931 | return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)", | ||
932 | dentry->d_name.name); | ||
933 | } | ||
934 | |||
935 | static struct dentry_operations anon_ops = { | 929 | static struct dentry_operations anon_ops = { |
936 | .d_dname = hugetlb_dname | 930 | .d_dname = simple_dname |
937 | }; | 931 | }; |
938 | 932 | ||
939 | /* | 933 | /* |
diff --git a/fs/namespace.c b/fs/namespace.c index 7b1ca9ba0b0a..a45ba4f267fe 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -1429,7 +1429,7 @@ struct vfsmount *collect_mounts(struct path *path) | |||
1429 | CL_COPY_ALL | CL_PRIVATE); | 1429 | CL_COPY_ALL | CL_PRIVATE); |
1430 | namespace_unlock(); | 1430 | namespace_unlock(); |
1431 | if (IS_ERR(tree)) | 1431 | if (IS_ERR(tree)) |
1432 | return NULL; | 1432 | return ERR_CAST(tree); |
1433 | return &tree->mnt; | 1433 | return &tree->mnt; |
1434 | } | 1434 | } |
1435 | 1435 | ||
diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index dc9a913784ab..2d8be51f90dc 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c | |||
@@ -345,8 +345,7 @@ static void nilfs_end_bio_write(struct bio *bio, int err) | |||
345 | 345 | ||
346 | if (err == -EOPNOTSUPP) { | 346 | if (err == -EOPNOTSUPP) { |
347 | set_bit(BIO_EOPNOTSUPP, &bio->bi_flags); | 347 | set_bit(BIO_EOPNOTSUPP, &bio->bi_flags); |
348 | bio_put(bio); | 348 | /* to be detected by nilfs_segbuf_submit_bio() */ |
349 | /* to be detected by submit_seg_bio() */ | ||
350 | } | 349 | } |
351 | 350 | ||
352 | if (!uptodate) | 351 | if (!uptodate) |
@@ -377,12 +376,12 @@ static int nilfs_segbuf_submit_bio(struct nilfs_segment_buffer *segbuf, | |||
377 | bio->bi_private = segbuf; | 376 | bio->bi_private = segbuf; |
378 | bio_get(bio); | 377 | bio_get(bio); |
379 | submit_bio(mode, bio); | 378 | submit_bio(mode, bio); |
379 | segbuf->sb_nbio++; | ||
380 | if (bio_flagged(bio, BIO_EOPNOTSUPP)) { | 380 | if (bio_flagged(bio, BIO_EOPNOTSUPP)) { |
381 | bio_put(bio); | 381 | bio_put(bio); |
382 | err = -EOPNOTSUPP; | 382 | err = -EOPNOTSUPP; |
383 | goto failed; | 383 | goto failed; |
384 | } | 384 | } |
385 | segbuf->sb_nbio++; | ||
386 | bio_put(bio); | 385 | bio_put(bio); |
387 | 386 | ||
388 | wi->bio = NULL; | 387 | wi->bio = NULL; |
diff --git a/fs/proc/fd.c b/fs/proc/fd.c index 75f2890abbd8..0ff80f9b930f 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c | |||
@@ -230,8 +230,6 @@ static int proc_readfd_common(struct file *file, struct dir_context *ctx, | |||
230 | 230 | ||
231 | if (!dir_emit_dots(file, ctx)) | 231 | if (!dir_emit_dots(file, ctx)) |
232 | goto out; | 232 | goto out; |
233 | if (!dir_emit_dots(file, ctx)) | ||
234 | goto out; | ||
235 | files = get_files_struct(p); | 233 | files = get_files_struct(p); |
236 | if (!files) | 234 | if (!files) |
237 | goto out; | 235 | goto out; |
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 94441a407337..737e15615b04 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
@@ -271,7 +271,7 @@ int proc_readdir_de(struct proc_dir_entry *de, struct file *file, | |||
271 | de = next; | 271 | de = next; |
272 | } while (de); | 272 | } while (de); |
273 | spin_unlock(&proc_subdir_lock); | 273 | spin_unlock(&proc_subdir_lock); |
274 | return 0; | 274 | return 1; |
275 | } | 275 | } |
276 | 276 | ||
277 | int proc_readdir(struct file *file, struct dir_context *ctx) | 277 | int proc_readdir(struct file *file, struct dir_context *ctx) |
diff --git a/fs/proc/root.c b/fs/proc/root.c index 229e366598da..e0a790da726d 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c | |||
@@ -205,7 +205,9 @@ static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentr | |||
205 | static int proc_root_readdir(struct file *file, struct dir_context *ctx) | 205 | static int proc_root_readdir(struct file *file, struct dir_context *ctx) |
206 | { | 206 | { |
207 | if (ctx->pos < FIRST_PROCESS_ENTRY) { | 207 | if (ctx->pos < FIRST_PROCESS_ENTRY) { |
208 | proc_readdir(file, ctx); | 208 | int error = proc_readdir(file, ctx); |
209 | if (unlikely(error <= 0)) | ||
210 | return error; | ||
209 | ctx->pos = FIRST_PROCESS_ENTRY; | 211 | ctx->pos = FIRST_PROCESS_ENTRY; |
210 | } | 212 | } |
211 | 213 | ||
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index b90337c9d468..4a12532da8c4 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -336,6 +336,7 @@ extern int d_validate(struct dentry *, struct dentry *); | |||
336 | * helper function for dentry_operations.d_dname() members | 336 | * helper function for dentry_operations.d_dname() members |
337 | */ | 337 | */ |
338 | extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); | 338 | extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); |
339 | extern char *simple_dname(struct dentry *, char *, int); | ||
339 | 340 | ||
340 | extern char *__d_path(const struct path *, const struct path *, char *, int); | 341 | extern char *__d_path(const struct path *, const struct path *, char *, int); |
341 | extern char *d_absolute_path(const struct path *, char *, int); | 342 | extern char *d_absolute_path(const struct path *, char *, int); |
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index b99cd23f3474..79640e015a86 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h | |||
@@ -5,45 +5,13 @@ | |||
5 | 5 | ||
6 | #include <linux/bitmap.h> | 6 | #include <linux/bitmap.h> |
7 | #include <linux/if.h> | 7 | #include <linux/if.h> |
8 | #include <linux/ip.h> | ||
8 | #include <linux/netdevice.h> | 9 | #include <linux/netdevice.h> |
9 | #include <linux/rcupdate.h> | 10 | #include <linux/rcupdate.h> |
10 | #include <linux/timer.h> | 11 | #include <linux/timer.h> |
11 | #include <linux/sysctl.h> | 12 | #include <linux/sysctl.h> |
12 | #include <linux/rtnetlink.h> | 13 | #include <linux/rtnetlink.h> |
13 | 14 | ||
14 | enum | ||
15 | { | ||
16 | IPV4_DEVCONF_FORWARDING=1, | ||
17 | IPV4_DEVCONF_MC_FORWARDING, | ||
18 | IPV4_DEVCONF_PROXY_ARP, | ||
19 | IPV4_DEVCONF_ACCEPT_REDIRECTS, | ||
20 | IPV4_DEVCONF_SECURE_REDIRECTS, | ||
21 | IPV4_DEVCONF_SEND_REDIRECTS, | ||
22 | IPV4_DEVCONF_SHARED_MEDIA, | ||
23 | IPV4_DEVCONF_RP_FILTER, | ||
24 | IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE, | ||
25 | IPV4_DEVCONF_BOOTP_RELAY, | ||
26 | IPV4_DEVCONF_LOG_MARTIANS, | ||
27 | IPV4_DEVCONF_TAG, | ||
28 | IPV4_DEVCONF_ARPFILTER, | ||
29 | IPV4_DEVCONF_MEDIUM_ID, | ||
30 | IPV4_DEVCONF_NOXFRM, | ||
31 | IPV4_DEVCONF_NOPOLICY, | ||
32 | IPV4_DEVCONF_FORCE_IGMP_VERSION, | ||
33 | IPV4_DEVCONF_ARP_ANNOUNCE, | ||
34 | IPV4_DEVCONF_ARP_IGNORE, | ||
35 | IPV4_DEVCONF_PROMOTE_SECONDARIES, | ||
36 | IPV4_DEVCONF_ARP_ACCEPT, | ||
37 | IPV4_DEVCONF_ARP_NOTIFY, | ||
38 | IPV4_DEVCONF_ACCEPT_LOCAL, | ||
39 | IPV4_DEVCONF_SRC_VMARK, | ||
40 | IPV4_DEVCONF_PROXY_ARP_PVLAN, | ||
41 | IPV4_DEVCONF_ROUTE_LOCALNET, | ||
42 | __IPV4_DEVCONF_MAX | ||
43 | }; | ||
44 | |||
45 | #define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1) | ||
46 | |||
47 | struct ipv4_devconf { | 15 | struct ipv4_devconf { |
48 | void *sysctl; | 16 | void *sysctl; |
49 | int data[IPV4_DEVCONF_MAX]; | 17 | int data[IPV4_DEVCONF_MAX]; |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 850e95bc766c..b8b7dc755752 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
@@ -101,6 +101,7 @@ struct inet6_skb_parm { | |||
101 | #define IP6SKB_FORWARDED 2 | 101 | #define IP6SKB_FORWARDED 2 |
102 | #define IP6SKB_REROUTED 4 | 102 | #define IP6SKB_REROUTED 4 |
103 | #define IP6SKB_ROUTERALERT 8 | 103 | #define IP6SKB_ROUTERALERT 8 |
104 | #define IP6SKB_FRAGMENTED 16 | ||
104 | }; | 105 | }; |
105 | 106 | ||
106 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) | 107 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index fb425aa16c01..faf4b7c1ad12 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -332,6 +332,7 @@ struct mm_struct { | |||
332 | unsigned long pgoff, unsigned long flags); | 332 | unsigned long pgoff, unsigned long flags); |
333 | #endif | 333 | #endif |
334 | unsigned long mmap_base; /* base of mmap area */ | 334 | unsigned long mmap_base; /* base of mmap area */ |
335 | unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */ | ||
335 | unsigned long task_size; /* size of task vm space */ | 336 | unsigned long task_size; /* size of task vm space */ |
336 | unsigned long highest_vm_end; /* highest vma end address */ | 337 | unsigned long highest_vm_end; /* highest vma end address */ |
337 | pgd_t * pgd; | 338 | pgd_t * pgd; |
diff --git a/include/linux/raid/pq.h b/include/linux/raid/pq.h index 8dfaa2ce2e95..0f424698064f 100644 --- a/include/linux/raid/pq.h +++ b/include/linux/raid/pq.h | |||
@@ -114,6 +114,11 @@ extern const struct raid6_recov_calls raid6_recov_intx1; | |||
114 | extern const struct raid6_recov_calls raid6_recov_ssse3; | 114 | extern const struct raid6_recov_calls raid6_recov_ssse3; |
115 | extern const struct raid6_recov_calls raid6_recov_avx2; | 115 | extern const struct raid6_recov_calls raid6_recov_avx2; |
116 | 116 | ||
117 | extern const struct raid6_calls raid6_neonx1; | ||
118 | extern const struct raid6_calls raid6_neonx2; | ||
119 | extern const struct raid6_calls raid6_neonx4; | ||
120 | extern const struct raid6_calls raid6_neonx8; | ||
121 | |||
117 | /* Algorithm list */ | 122 | /* Algorithm list */ |
118 | extern const struct raid6_calls * const raid6_algos[]; | 123 | extern const struct raid6_calls * const raid6_algos[]; |
119 | extern const struct raid6_recov_calls *const raid6_recov_algos[]; | 124 | extern const struct raid6_recov_calls *const raid6_recov_algos[]; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index e9995eb5985c..078066daffd4 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -314,7 +314,6 @@ struct nsproxy; | |||
314 | struct user_namespace; | 314 | struct user_namespace; |
315 | 315 | ||
316 | #ifdef CONFIG_MMU | 316 | #ifdef CONFIG_MMU |
317 | extern unsigned long mmap_legacy_base(void); | ||
318 | extern void arch_pick_mmap_layout(struct mm_struct *mm); | 317 | extern void arch_pick_mmap_layout(struct mm_struct *mm); |
319 | extern unsigned long | 318 | extern unsigned long |
320 | arch_get_unmapped_area(struct file *, unsigned long, unsigned long, | 319 | arch_get_unmapped_area(struct file *, unsigned long, unsigned long, |
diff --git a/include/linux/wait.h b/include/linux/wait.h index f487a4750b7f..a67fc1635592 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
@@ -811,6 +811,63 @@ do { \ | |||
811 | __ret; \ | 811 | __ret; \ |
812 | }) | 812 | }) |
813 | 813 | ||
814 | #define __wait_event_interruptible_lock_irq_timeout(wq, condition, \ | ||
815 | lock, ret) \ | ||
816 | do { \ | ||
817 | DEFINE_WAIT(__wait); \ | ||
818 | \ | ||
819 | for (;;) { \ | ||
820 | prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \ | ||
821 | if (condition) \ | ||
822 | break; \ | ||
823 | if (signal_pending(current)) { \ | ||
824 | ret = -ERESTARTSYS; \ | ||
825 | break; \ | ||
826 | } \ | ||
827 | spin_unlock_irq(&lock); \ | ||
828 | ret = schedule_timeout(ret); \ | ||
829 | spin_lock_irq(&lock); \ | ||
830 | if (!ret) \ | ||
831 | break; \ | ||
832 | } \ | ||
833 | finish_wait(&wq, &__wait); \ | ||
834 | } while (0) | ||
835 | |||
836 | /** | ||
837 | * wait_event_interruptible_lock_irq_timeout - sleep until a condition gets true or a timeout elapses. | ||
838 | * The condition is checked under the lock. This is expected | ||
839 | * to be called with the lock taken. | ||
840 | * @wq: the waitqueue to wait on | ||
841 | * @condition: a C expression for the event to wait for | ||
842 | * @lock: a locked spinlock_t, which will be released before schedule() | ||
843 | * and reacquired afterwards. | ||
844 | * @timeout: timeout, in jiffies | ||
845 | * | ||
846 | * The process is put to sleep (TASK_INTERRUPTIBLE) until the | ||
847 | * @condition evaluates to true or signal is received. The @condition is | ||
848 | * checked each time the waitqueue @wq is woken up. | ||
849 | * | ||
850 | * wake_up() has to be called after changing any variable that could | ||
851 | * change the result of the wait condition. | ||
852 | * | ||
853 | * This is supposed to be called while holding the lock. The lock is | ||
854 | * dropped before going to sleep and is reacquired afterwards. | ||
855 | * | ||
856 | * The function returns 0 if the @timeout elapsed, -ERESTARTSYS if it | ||
857 | * was interrupted by a signal, and the remaining jiffies otherwise | ||
858 | * if the condition evaluated to true before the timeout elapsed. | ||
859 | */ | ||
860 | #define wait_event_interruptible_lock_irq_timeout(wq, condition, lock, \ | ||
861 | timeout) \ | ||
862 | ({ \ | ||
863 | int __ret = timeout; \ | ||
864 | \ | ||
865 | if (!(condition)) \ | ||
866 | __wait_event_interruptible_lock_irq_timeout( \ | ||
867 | wq, condition, lock, __ret); \ | ||
868 | __ret; \ | ||
869 | }) | ||
870 | |||
814 | 871 | ||
815 | /* | 872 | /* |
816 | * These are the old interfaces to sleep waiting for an event. | 873 | * These are the old interfaces to sleep waiting for an event. |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 260f83f16bcf..f667248202b6 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -135,6 +135,8 @@ extern void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu, | |||
135 | extern void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, | 135 | extern void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, |
136 | __be32 mtu); | 136 | __be32 mtu); |
137 | extern void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark); | 137 | extern void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark); |
138 | extern void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif, | ||
139 | u32 mark); | ||
138 | extern void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk); | 140 | extern void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk); |
139 | 141 | ||
140 | struct netlink_callback; | 142 | struct netlink_callback; |
diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h index 6cf06bfd841b..2fee45bdec0a 100644 --- a/include/uapi/linux/ip.h +++ b/include/uapi/linux/ip.h | |||
@@ -133,4 +133,38 @@ struct ip_beet_phdr { | |||
133 | __u8 reserved; | 133 | __u8 reserved; |
134 | }; | 134 | }; |
135 | 135 | ||
136 | /* index values for the variables in ipv4_devconf */ | ||
137 | enum | ||
138 | { | ||
139 | IPV4_DEVCONF_FORWARDING=1, | ||
140 | IPV4_DEVCONF_MC_FORWARDING, | ||
141 | IPV4_DEVCONF_PROXY_ARP, | ||
142 | IPV4_DEVCONF_ACCEPT_REDIRECTS, | ||
143 | IPV4_DEVCONF_SECURE_REDIRECTS, | ||
144 | IPV4_DEVCONF_SEND_REDIRECTS, | ||
145 | IPV4_DEVCONF_SHARED_MEDIA, | ||
146 | IPV4_DEVCONF_RP_FILTER, | ||
147 | IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE, | ||
148 | IPV4_DEVCONF_BOOTP_RELAY, | ||
149 | IPV4_DEVCONF_LOG_MARTIANS, | ||
150 | IPV4_DEVCONF_TAG, | ||
151 | IPV4_DEVCONF_ARPFILTER, | ||
152 | IPV4_DEVCONF_MEDIUM_ID, | ||
153 | IPV4_DEVCONF_NOXFRM, | ||
154 | IPV4_DEVCONF_NOPOLICY, | ||
155 | IPV4_DEVCONF_FORCE_IGMP_VERSION, | ||
156 | IPV4_DEVCONF_ARP_ANNOUNCE, | ||
157 | IPV4_DEVCONF_ARP_IGNORE, | ||
158 | IPV4_DEVCONF_PROMOTE_SECONDARIES, | ||
159 | IPV4_DEVCONF_ARP_ACCEPT, | ||
160 | IPV4_DEVCONF_ARP_NOTIFY, | ||
161 | IPV4_DEVCONF_ACCEPT_LOCAL, | ||
162 | IPV4_DEVCONF_SRC_VMARK, | ||
163 | IPV4_DEVCONF_PROXY_ARP_PVLAN, | ||
164 | IPV4_DEVCONF_ROUTE_LOCALNET, | ||
165 | __IPV4_DEVCONF_MAX | ||
166 | }; | ||
167 | |||
168 | #define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1) | ||
169 | |||
136 | #endif /* _UAPI_LINUX_IP_H */ | 170 | #endif /* _UAPI_LINUX_IP_H */ |
diff --git a/init/Kconfig b/init/Kconfig index 247084be0590..fed81b576f29 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -955,7 +955,7 @@ config MEMCG_SWAP_ENABLED | |||
955 | Memory Resource Controller Swap Extension comes with its price in | 955 | Memory Resource Controller Swap Extension comes with its price in |
956 | a bigger memory consumption. General purpose distribution kernels | 956 | a bigger memory consumption. General purpose distribution kernels |
957 | which want to enable the feature but keep it disabled by default | 957 | which want to enable the feature but keep it disabled by default |
958 | and let the user enable it by swapaccount boot command line | 958 | and let the user enable it by swapaccount=1 boot command line |
959 | parameter should have this option unselected. | 959 | parameter should have this option unselected. |
960 | For those who want to have the feature enabled by default should | 960 | For those who want to have the feature enabled by default should |
961 | select this option (if, for some reason, they need to disable it | 961 | select this option (if, for some reason, they need to disable it |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 010a0083c0ae..ea1966db34f2 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -475,13 +475,17 @@ static int validate_change(const struct cpuset *cur, const struct cpuset *trial) | |||
475 | 475 | ||
476 | /* | 476 | /* |
477 | * Cpusets with tasks - existing or newly being attached - can't | 477 | * Cpusets with tasks - existing or newly being attached - can't |
478 | * have empty cpus_allowed or mems_allowed. | 478 | * be changed to have empty cpus_allowed or mems_allowed. |
479 | */ | 479 | */ |
480 | ret = -ENOSPC; | 480 | ret = -ENOSPC; |
481 | if ((cgroup_task_count(cur->css.cgroup) || cur->attach_in_progress) && | 481 | if ((cgroup_task_count(cur->css.cgroup) || cur->attach_in_progress)) { |
482 | (cpumask_empty(trial->cpus_allowed) && | 482 | if (!cpumask_empty(cur->cpus_allowed) && |
483 | nodes_empty(trial->mems_allowed))) | 483 | cpumask_empty(trial->cpus_allowed)) |
484 | goto out; | 484 | goto out; |
485 | if (!nodes_empty(cur->mems_allowed) && | ||
486 | nodes_empty(trial->mems_allowed)) | ||
487 | goto out; | ||
488 | } | ||
485 | 489 | ||
486 | ret = 0; | 490 | ret = 0; |
487 | out: | 491 | out: |
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index a326f27d7f09..0b479a6a22bb 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c | |||
@@ -121,7 +121,7 @@ void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate) | |||
121 | BUG_ON(bits > 32); | 121 | BUG_ON(bits > 32); |
122 | WARN_ON(!irqs_disabled()); | 122 | WARN_ON(!irqs_disabled()); |
123 | read_sched_clock = read; | 123 | read_sched_clock = read; |
124 | sched_clock_mask = (1 << bits) - 1; | 124 | sched_clock_mask = (1ULL << bits) - 1; |
125 | cd.rate = rate; | 125 | cd.rate = rate; |
126 | 126 | ||
127 | /* calculate the mult/shift to convert counter ticks to ns. */ | 127 | /* calculate the mult/shift to convert counter ticks to ns. */ |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index e77edc97e036..e8a1516cc0a3 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -182,7 +182,8 @@ static bool can_stop_full_tick(void) | |||
182 | * Don't allow the user to think they can get | 182 | * Don't allow the user to think they can get |
183 | * full NO_HZ with this machine. | 183 | * full NO_HZ with this machine. |
184 | */ | 184 | */ |
185 | WARN_ONCE(1, "NO_HZ FULL will not work with unstable sched clock"); | 185 | WARN_ONCE(have_nohz_full_mask, |
186 | "NO_HZ FULL will not work with unstable sched clock"); | ||
186 | return false; | 187 | return false; |
187 | } | 188 | } |
188 | #endif | 189 | #endif |
@@ -343,8 +344,6 @@ static int tick_nohz_init_all(void) | |||
343 | 344 | ||
344 | void __init tick_nohz_init(void) | 345 | void __init tick_nohz_init(void) |
345 | { | 346 | { |
346 | int cpu; | ||
347 | |||
348 | if (!have_nohz_full_mask) { | 347 | if (!have_nohz_full_mask) { |
349 | if (tick_nohz_init_all() < 0) | 348 | if (tick_nohz_init_all() < 0) |
350 | return; | 349 | return; |
diff --git a/kernel/wait.c b/kernel/wait.c index dec68bd4e9d8..d550920e040c 100644 --- a/kernel/wait.c +++ b/kernel/wait.c | |||
@@ -363,8 +363,7 @@ EXPORT_SYMBOL(out_of_line_wait_on_atomic_t); | |||
363 | 363 | ||
364 | /** | 364 | /** |
365 | * wake_up_atomic_t - Wake up a waiter on a atomic_t | 365 | * wake_up_atomic_t - Wake up a waiter on a atomic_t |
366 | * @word: The word being waited on, a kernel virtual address | 366 | * @p: The atomic_t being waited on, a kernel virtual address |
367 | * @bit: The bit of the word being waited on | ||
368 | * | 367 | * |
369 | * Wake up anyone waiting for the atomic_t to go to zero. | 368 | * Wake up anyone waiting for the atomic_t to go to zero. |
370 | * | 369 | * |
diff --git a/lib/lz4/lz4_compress.c b/lib/lz4/lz4_compress.c index fd94058bd7f9..28321d8f75ef 100644 --- a/lib/lz4/lz4_compress.c +++ b/lib/lz4/lz4_compress.c | |||
@@ -437,7 +437,7 @@ int lz4_compress(const unsigned char *src, size_t src_len, | |||
437 | exit: | 437 | exit: |
438 | return ret; | 438 | return ret; |
439 | } | 439 | } |
440 | EXPORT_SYMBOL_GPL(lz4_compress); | 440 | EXPORT_SYMBOL(lz4_compress); |
441 | 441 | ||
442 | MODULE_LICENSE("GPL"); | 442 | MODULE_LICENSE("Dual BSD/GPL"); |
443 | MODULE_DESCRIPTION("LZ4 compressor"); | 443 | MODULE_DESCRIPTION("LZ4 compressor"); |
diff --git a/lib/lz4/lz4_decompress.c b/lib/lz4/lz4_decompress.c index d3414eae73a1..411be80ddb46 100644 --- a/lib/lz4/lz4_decompress.c +++ b/lib/lz4/lz4_decompress.c | |||
@@ -299,7 +299,7 @@ exit_0: | |||
299 | return ret; | 299 | return ret; |
300 | } | 300 | } |
301 | #ifndef STATIC | 301 | #ifndef STATIC |
302 | EXPORT_SYMBOL_GPL(lz4_decompress); | 302 | EXPORT_SYMBOL(lz4_decompress); |
303 | #endif | 303 | #endif |
304 | 304 | ||
305 | int lz4_decompress_unknownoutputsize(const char *src, size_t src_len, | 305 | int lz4_decompress_unknownoutputsize(const char *src, size_t src_len, |
@@ -319,8 +319,8 @@ exit_0: | |||
319 | return ret; | 319 | return ret; |
320 | } | 320 | } |
321 | #ifndef STATIC | 321 | #ifndef STATIC |
322 | EXPORT_SYMBOL_GPL(lz4_decompress_unknownoutputsize); | 322 | EXPORT_SYMBOL(lz4_decompress_unknownoutputsize); |
323 | 323 | ||
324 | MODULE_LICENSE("GPL"); | 324 | MODULE_LICENSE("Dual BSD/GPL"); |
325 | MODULE_DESCRIPTION("LZ4 Decompressor"); | 325 | MODULE_DESCRIPTION("LZ4 Decompressor"); |
326 | #endif | 326 | #endif |
diff --git a/lib/lz4/lz4hc_compress.c b/lib/lz4/lz4hc_compress.c index eb1a74f5e368..f344f76b6559 100644 --- a/lib/lz4/lz4hc_compress.c +++ b/lib/lz4/lz4hc_compress.c | |||
@@ -533,7 +533,7 @@ int lz4hc_compress(const unsigned char *src, size_t src_len, | |||
533 | exit: | 533 | exit: |
534 | return ret; | 534 | return ret; |
535 | } | 535 | } |
536 | EXPORT_SYMBOL_GPL(lz4hc_compress); | 536 | EXPORT_SYMBOL(lz4hc_compress); |
537 | 537 | ||
538 | MODULE_LICENSE("GPL"); | 538 | MODULE_LICENSE("Dual BSD/GPL"); |
539 | MODULE_DESCRIPTION("LZ4HC compressor"); | 539 | MODULE_DESCRIPTION("LZ4HC compressor"); |
diff --git a/lib/raid6/.gitignore b/lib/raid6/.gitignore index 162becacf97c..0a7e494b2bcd 100644 --- a/lib/raid6/.gitignore +++ b/lib/raid6/.gitignore | |||
@@ -2,3 +2,4 @@ mktables | |||
2 | altivec*.c | 2 | altivec*.c |
3 | int*.c | 3 | int*.c |
4 | tables.c | 4 | tables.c |
5 | neon?.c | ||
diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile index 9f7c184725d7..b4625787c7ee 100644 --- a/lib/raid6/Makefile +++ b/lib/raid6/Makefile | |||
@@ -5,6 +5,7 @@ raid6_pq-y += algos.o recov.o tables.o int1.o int2.o int4.o \ | |||
5 | 5 | ||
6 | raid6_pq-$(CONFIG_X86) += recov_ssse3.o recov_avx2.o mmx.o sse1.o sse2.o avx2.o | 6 | raid6_pq-$(CONFIG_X86) += recov_ssse3.o recov_avx2.o mmx.o sse1.o sse2.o avx2.o |
7 | raid6_pq-$(CONFIG_ALTIVEC) += altivec1.o altivec2.o altivec4.o altivec8.o | 7 | raid6_pq-$(CONFIG_ALTIVEC) += altivec1.o altivec2.o altivec4.o altivec8.o |
8 | raid6_pq-$(CONFIG_KERNEL_MODE_NEON) += neon.o neon1.o neon2.o neon4.o neon8.o | ||
8 | 9 | ||
9 | hostprogs-y += mktables | 10 | hostprogs-y += mktables |
10 | 11 | ||
@@ -16,6 +17,21 @@ ifeq ($(CONFIG_ALTIVEC),y) | |||
16 | altivec_flags := -maltivec -mabi=altivec | 17 | altivec_flags := -maltivec -mabi=altivec |
17 | endif | 18 | endif |
18 | 19 | ||
20 | # The GCC option -ffreestanding is required in order to compile code containing | ||
21 | # ARM/NEON intrinsics in a non C99-compliant environment (such as the kernel) | ||
22 | ifeq ($(CONFIG_KERNEL_MODE_NEON),y) | ||
23 | NEON_FLAGS := -ffreestanding | ||
24 | ifeq ($(ARCH),arm) | ||
25 | NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon | ||
26 | endif | ||
27 | ifeq ($(ARCH),arm64) | ||
28 | CFLAGS_REMOVE_neon1.o += -mgeneral-regs-only | ||
29 | CFLAGS_REMOVE_neon2.o += -mgeneral-regs-only | ||
30 | CFLAGS_REMOVE_neon4.o += -mgeneral-regs-only | ||
31 | CFLAGS_REMOVE_neon8.o += -mgeneral-regs-only | ||
32 | endif | ||
33 | endif | ||
34 | |||
19 | targets += int1.c | 35 | targets += int1.c |
20 | $(obj)/int1.c: UNROLL := 1 | 36 | $(obj)/int1.c: UNROLL := 1 |
21 | $(obj)/int1.c: $(src)/int.uc $(src)/unroll.awk FORCE | 37 | $(obj)/int1.c: $(src)/int.uc $(src)/unroll.awk FORCE |
@@ -70,6 +86,30 @@ $(obj)/altivec8.c: UNROLL := 8 | |||
70 | $(obj)/altivec8.c: $(src)/altivec.uc $(src)/unroll.awk FORCE | 86 | $(obj)/altivec8.c: $(src)/altivec.uc $(src)/unroll.awk FORCE |
71 | $(call if_changed,unroll) | 87 | $(call if_changed,unroll) |
72 | 88 | ||
89 | CFLAGS_neon1.o += $(NEON_FLAGS) | ||
90 | targets += neon1.c | ||
91 | $(obj)/neon1.c: UNROLL := 1 | ||
92 | $(obj)/neon1.c: $(src)/neon.uc $(src)/unroll.awk FORCE | ||
93 | $(call if_changed,unroll) | ||
94 | |||
95 | CFLAGS_neon2.o += $(NEON_FLAGS) | ||
96 | targets += neon2.c | ||
97 | $(obj)/neon2.c: UNROLL := 2 | ||
98 | $(obj)/neon2.c: $(src)/neon.uc $(src)/unroll.awk FORCE | ||
99 | $(call if_changed,unroll) | ||
100 | |||
101 | CFLAGS_neon4.o += $(NEON_FLAGS) | ||
102 | targets += neon4.c | ||
103 | $(obj)/neon4.c: UNROLL := 4 | ||
104 | $(obj)/neon4.c: $(src)/neon.uc $(src)/unroll.awk FORCE | ||
105 | $(call if_changed,unroll) | ||
106 | |||
107 | CFLAGS_neon8.o += $(NEON_FLAGS) | ||
108 | targets += neon8.c | ||
109 | $(obj)/neon8.c: UNROLL := 8 | ||
110 | $(obj)/neon8.c: $(src)/neon.uc $(src)/unroll.awk FORCE | ||
111 | $(call if_changed,unroll) | ||
112 | |||
73 | quiet_cmd_mktable = TABLE $@ | 113 | quiet_cmd_mktable = TABLE $@ |
74 | cmd_mktable = $(obj)/mktables > $@ || ( rm -f $@ && exit 1 ) | 114 | cmd_mktable = $(obj)/mktables > $@ || ( rm -f $@ && exit 1 ) |
75 | 115 | ||
diff --git a/lib/raid6/algos.c b/lib/raid6/algos.c index 6d7316fe9f30..74e6f5629dbc 100644 --- a/lib/raid6/algos.c +++ b/lib/raid6/algos.c | |||
@@ -70,6 +70,12 @@ const struct raid6_calls * const raid6_algos[] = { | |||
70 | &raid6_intx2, | 70 | &raid6_intx2, |
71 | &raid6_intx4, | 71 | &raid6_intx4, |
72 | &raid6_intx8, | 72 | &raid6_intx8, |
73 | #ifdef CONFIG_KERNEL_MODE_NEON | ||
74 | &raid6_neonx1, | ||
75 | &raid6_neonx2, | ||
76 | &raid6_neonx4, | ||
77 | &raid6_neonx8, | ||
78 | #endif | ||
73 | NULL | 79 | NULL |
74 | }; | 80 | }; |
75 | 81 | ||
diff --git a/lib/raid6/neon.c b/lib/raid6/neon.c new file mode 100644 index 000000000000..36ad4705df1a --- /dev/null +++ b/lib/raid6/neon.c | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * linux/lib/raid6/neon.c - RAID6 syndrome calculation using ARM NEON intrinsics | ||
3 | * | ||
4 | * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/raid/pq.h> | ||
12 | |||
13 | #ifdef __KERNEL__ | ||
14 | #include <asm/neon.h> | ||
15 | #else | ||
16 | #define kernel_neon_begin() | ||
17 | #define kernel_neon_end() | ||
18 | #define cpu_has_neon() (1) | ||
19 | #endif | ||
20 | |||
21 | /* | ||
22 | * There are 2 reasons these wrappers are kept in a separate compilation unit | ||
23 | * from the actual implementations in neonN.c (generated from neon.uc by | ||
24 | * unroll.awk): | ||
25 | * - the actual implementations use NEON intrinsics, and the GCC support header | ||
26 | * (arm_neon.h) is not fully compatible (type wise) with the kernel; | ||
27 | * - the neonN.c files are compiled with -mfpu=neon and optimization enabled, | ||
28 | * and we have to make sure that we never use *any* NEON/VFP instructions | ||
29 | * outside a kernel_neon_begin()/kernel_neon_end() pair. | ||
30 | */ | ||
31 | |||
32 | #define RAID6_NEON_WRAPPER(_n) \ | ||
33 | static void raid6_neon ## _n ## _gen_syndrome(int disks, \ | ||
34 | size_t bytes, void **ptrs) \ | ||
35 | { \ | ||
36 | void raid6_neon ## _n ## _gen_syndrome_real(int, \ | ||
37 | unsigned long, void**); \ | ||
38 | kernel_neon_begin(); \ | ||
39 | raid6_neon ## _n ## _gen_syndrome_real(disks, \ | ||
40 | (unsigned long)bytes, ptrs); \ | ||
41 | kernel_neon_end(); \ | ||
42 | } \ | ||
43 | struct raid6_calls const raid6_neonx ## _n = { \ | ||
44 | raid6_neon ## _n ## _gen_syndrome, \ | ||
45 | raid6_have_neon, \ | ||
46 | "neonx" #_n, \ | ||
47 | 0 \ | ||
48 | } | ||
49 | |||
50 | static int raid6_have_neon(void) | ||
51 | { | ||
52 | return cpu_has_neon(); | ||
53 | } | ||
54 | |||
55 | RAID6_NEON_WRAPPER(1); | ||
56 | RAID6_NEON_WRAPPER(2); | ||
57 | RAID6_NEON_WRAPPER(4); | ||
58 | RAID6_NEON_WRAPPER(8); | ||
diff --git a/lib/raid6/neon.uc b/lib/raid6/neon.uc new file mode 100644 index 000000000000..1b9ed793342d --- /dev/null +++ b/lib/raid6/neon.uc | |||
@@ -0,0 +1,80 @@ | |||
1 | /* ----------------------------------------------------------------------- | ||
2 | * | ||
3 | * neon.uc - RAID-6 syndrome calculation using ARM NEON instructions | ||
4 | * | ||
5 | * Copyright (C) 2012 Rob Herring | ||
6 | * | ||
7 | * Based on altivec.uc: | ||
8 | * Copyright 2002-2004 H. Peter Anvin - All Rights Reserved | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation, Inc., 53 Temple Place Ste 330, | ||
13 | * Boston MA 02111-1307, USA; either version 2 of the License, or | ||
14 | * (at your option) any later version; incorporated herein by reference. | ||
15 | * | ||
16 | * ----------------------------------------------------------------------- */ | ||
17 | |||
18 | /* | ||
19 | * neon$#.c | ||
20 | * | ||
21 | * $#-way unrolled NEON intrinsics math RAID-6 instruction set | ||
22 | * | ||
23 | * This file is postprocessed using unroll.awk | ||
24 | */ | ||
25 | |||
26 | #include <arm_neon.h> | ||
27 | |||
28 | typedef uint8x16_t unative_t; | ||
29 | |||
30 | #define NBYTES(x) ((unative_t){x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}) | ||
31 | #define NSIZE sizeof(unative_t) | ||
32 | |||
33 | /* | ||
34 | * The SHLBYTE() operation shifts each byte left by 1, *not* | ||
35 | * rolling over into the next byte | ||
36 | */ | ||
37 | static inline unative_t SHLBYTE(unative_t v) | ||
38 | { | ||
39 | return vshlq_n_u8(v, 1); | ||
40 | } | ||
41 | |||
42 | /* | ||
43 | * The MASK() operation returns 0xFF in any byte for which the high | ||
44 | * bit is 1, 0x00 for any byte for which the high bit is 0. | ||
45 | */ | ||
46 | static inline unative_t MASK(unative_t v) | ||
47 | { | ||
48 | const uint8x16_t temp = NBYTES(0); | ||
49 | return (unative_t)vcltq_s8((int8x16_t)v, (int8x16_t)temp); | ||
50 | } | ||
51 | |||
52 | void raid6_neon$#_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs) | ||
53 | { | ||
54 | uint8_t **dptr = (uint8_t **)ptrs; | ||
55 | uint8_t *p, *q; | ||
56 | int d, z, z0; | ||
57 | |||
58 | register unative_t wd$$, wq$$, wp$$, w1$$, w2$$; | ||
59 | const unative_t x1d = NBYTES(0x1d); | ||
60 | |||
61 | z0 = disks - 3; /* Highest data disk */ | ||
62 | p = dptr[z0+1]; /* XOR parity */ | ||
63 | q = dptr[z0+2]; /* RS syndrome */ | ||
64 | |||
65 | for ( d = 0 ; d < bytes ; d += NSIZE*$# ) { | ||
66 | wq$$ = wp$$ = vld1q_u8(&dptr[z0][d+$$*NSIZE]); | ||
67 | for ( z = z0-1 ; z >= 0 ; z-- ) { | ||
68 | wd$$ = vld1q_u8(&dptr[z][d+$$*NSIZE]); | ||
69 | wp$$ = veorq_u8(wp$$, wd$$); | ||
70 | w2$$ = MASK(wq$$); | ||
71 | w1$$ = SHLBYTE(wq$$); | ||
72 | |||
73 | w2$$ = vandq_u8(w2$$, x1d); | ||
74 | w1$$ = veorq_u8(w1$$, w2$$); | ||
75 | wq$$ = veorq_u8(w1$$, wd$$); | ||
76 | } | ||
77 | vst1q_u8(&p[d+NSIZE*$$], wp$$); | ||
78 | vst1q_u8(&q[d+NSIZE*$$], wq$$); | ||
79 | } | ||
80 | } | ||
diff --git a/lib/raid6/test/Makefile b/lib/raid6/test/Makefile index 087332dbf8aa..28afa1a06e03 100644 --- a/lib/raid6/test/Makefile +++ b/lib/raid6/test/Makefile | |||
@@ -22,11 +22,23 @@ ifeq ($(ARCH),x86_64) | |||
22 | IS_X86 = yes | 22 | IS_X86 = yes |
23 | endif | 23 | endif |
24 | 24 | ||
25 | ifeq ($(ARCH),arm) | ||
26 | CFLAGS += -I../../../arch/arm/include -mfpu=neon | ||
27 | HAS_NEON = yes | ||
28 | endif | ||
29 | ifeq ($(ARCH),arm64) | ||
30 | CFLAGS += -I../../../arch/arm64/include | ||
31 | HAS_NEON = yes | ||
32 | endif | ||
33 | |||
25 | ifeq ($(IS_X86),yes) | 34 | ifeq ($(IS_X86),yes) |
26 | OBJS += mmx.o sse1.o sse2.o avx2.o recov_ssse3.o recov_avx2.o | 35 | OBJS += mmx.o sse1.o sse2.o avx2.o recov_ssse3.o recov_avx2.o |
27 | CFLAGS += $(shell echo "vpbroadcastb %xmm0, %ymm1" | \ | 36 | CFLAGS += $(shell echo "vpbroadcastb %xmm0, %ymm1" | \ |
28 | gcc -c -x assembler - >&/dev/null && \ | 37 | gcc -c -x assembler - >&/dev/null && \ |
29 | rm ./-.o && echo -DCONFIG_AS_AVX2=1) | 38 | rm ./-.o && echo -DCONFIG_AS_AVX2=1) |
39 | else ifeq ($(HAS_NEON),yes) | ||
40 | OBJS += neon.o neon1.o neon2.o neon4.o neon8.o | ||
41 | CFLAGS += -DCONFIG_KERNEL_MODE_NEON=1 | ||
30 | else | 42 | else |
31 | HAS_ALTIVEC := $(shell echo -e '\#include <altivec.h>\nvector int a;' |\ | 43 | HAS_ALTIVEC := $(shell echo -e '\#include <altivec.h>\nvector int a;' |\ |
32 | gcc -c -x c - >&/dev/null && \ | 44 | gcc -c -x c - >&/dev/null && \ |
@@ -55,6 +67,18 @@ raid6.a: $(OBJS) | |||
55 | raid6test: test.c raid6.a | 67 | raid6test: test.c raid6.a |
56 | $(CC) $(CFLAGS) -o raid6test $^ | 68 | $(CC) $(CFLAGS) -o raid6test $^ |
57 | 69 | ||
70 | neon1.c: neon.uc ../unroll.awk | ||
71 | $(AWK) ../unroll.awk -vN=1 < neon.uc > $@ | ||
72 | |||
73 | neon2.c: neon.uc ../unroll.awk | ||
74 | $(AWK) ../unroll.awk -vN=2 < neon.uc > $@ | ||
75 | |||
76 | neon4.c: neon.uc ../unroll.awk | ||
77 | $(AWK) ../unroll.awk -vN=4 < neon.uc > $@ | ||
78 | |||
79 | neon8.c: neon.uc ../unroll.awk | ||
80 | $(AWK) ../unroll.awk -vN=8 < neon.uc > $@ | ||
81 | |||
58 | altivec1.c: altivec.uc ../unroll.awk | 82 | altivec1.c: altivec.uc ../unroll.awk |
59 | $(AWK) ../unroll.awk -vN=1 < altivec.uc > $@ | 83 | $(AWK) ../unroll.awk -vN=1 < altivec.uc > $@ |
60 | 84 | ||
@@ -89,7 +113,7 @@ tables.c: mktables | |||
89 | ./mktables > tables.c | 113 | ./mktables > tables.c |
90 | 114 | ||
91 | clean: | 115 | clean: |
92 | rm -f *.o *.a mktables mktables.c *.uc int*.c altivec*.c tables.c raid6test | 116 | rm -f *.o *.a mktables mktables.c *.uc int*.c altivec*.c neon*.c tables.c raid6test |
93 | 117 | ||
94 | spotless: clean | 118 | spotless: clean |
95 | rm -f *~ | 119 | rm -f *~ |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index c5792a5d87ce..0878ff7c26a9 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -6969,7 +6969,6 @@ struct cgroup_subsys mem_cgroup_subsys = { | |||
6969 | #ifdef CONFIG_MEMCG_SWAP | 6969 | #ifdef CONFIG_MEMCG_SWAP |
6970 | static int __init enable_swap_account(char *s) | 6970 | static int __init enable_swap_account(char *s) |
6971 | { | 6971 | { |
6972 | /* consider enabled if no parameter or 1 is given */ | ||
6973 | if (!strcmp(s, "1")) | 6972 | if (!strcmp(s, "1")) |
6974 | really_do_swap_account = 1; | 6973 | really_do_swap_account = 1; |
6975 | else if (!strcmp(s, "0")) | 6974 | else if (!strcmp(s, "0")) |
diff --git a/mm/shmem.c b/mm/shmem.c index 8335dbd3fc35..e43dc555069d 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -2909,14 +2909,8 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range); | |||
2909 | 2909 | ||
2910 | /* common code */ | 2910 | /* common code */ |
2911 | 2911 | ||
2912 | static char *shmem_dname(struct dentry *dentry, char *buffer, int buflen) | ||
2913 | { | ||
2914 | return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)", | ||
2915 | dentry->d_name.name); | ||
2916 | } | ||
2917 | |||
2918 | static struct dentry_operations anon_ops = { | 2912 | static struct dentry_operations anon_ops = { |
2919 | .d_dname = shmem_dname | 2913 | .d_dname = simple_dname |
2920 | }; | 2914 | }; |
2921 | 2915 | ||
2922 | /** | 2916 | /** |
diff --git a/net/batman-adv/unicast.c b/net/batman-adv/unicast.c index 688a0419756b..857e1b8349ee 100644 --- a/net/batman-adv/unicast.c +++ b/net/batman-adv/unicast.c | |||
@@ -432,12 +432,16 @@ find_router: | |||
432 | 432 | ||
433 | switch (packet_type) { | 433 | switch (packet_type) { |
434 | case BATADV_UNICAST: | 434 | case BATADV_UNICAST: |
435 | batadv_unicast_prepare_skb(skb, orig_node); | 435 | if (!batadv_unicast_prepare_skb(skb, orig_node)) |
436 | goto out; | ||
437 | |||
436 | header_len = sizeof(struct batadv_unicast_packet); | 438 | header_len = sizeof(struct batadv_unicast_packet); |
437 | break; | 439 | break; |
438 | case BATADV_UNICAST_4ADDR: | 440 | case BATADV_UNICAST_4ADDR: |
439 | batadv_unicast_4addr_prepare_skb(bat_priv, skb, orig_node, | 441 | if (!batadv_unicast_4addr_prepare_skb(bat_priv, skb, orig_node, |
440 | packet_subtype); | 442 | packet_subtype)) |
443 | goto out; | ||
444 | |||
441 | header_len = sizeof(struct batadv_unicast_4addr_packet); | 445 | header_len = sizeof(struct batadv_unicast_4addr_packet); |
442 | break; | 446 | break; |
443 | default: | 447 | default: |
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 60aca9109a50..ffd5874f2592 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
@@ -161,7 +161,7 @@ void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr) | |||
161 | if (!pv) | 161 | if (!pv) |
162 | return; | 162 | return; |
163 | 163 | ||
164 | for_each_set_bit_from(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) { | 164 | for_each_set_bit_from(vid, pv->vlan_bitmap, VLAN_N_VID) { |
165 | f = __br_fdb_get(br, br->dev->dev_addr, vid); | 165 | f = __br_fdb_get(br, br->dev->dev_addr, vid); |
166 | if (f && f->is_local && !f->dst) | 166 | if (f && f->is_local && !f->dst) |
167 | fdb_delete(br, f); | 167 | fdb_delete(br, f); |
@@ -730,7 +730,7 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], | |||
730 | /* VID was specified, so use it. */ | 730 | /* VID was specified, so use it. */ |
731 | err = __br_fdb_add(ndm, p, addr, nlh_flags, vid); | 731 | err = __br_fdb_add(ndm, p, addr, nlh_flags, vid); |
732 | } else { | 732 | } else { |
733 | if (!pv || bitmap_empty(pv->vlan_bitmap, BR_VLAN_BITMAP_LEN)) { | 733 | if (!pv || bitmap_empty(pv->vlan_bitmap, VLAN_N_VID)) { |
734 | err = __br_fdb_add(ndm, p, addr, nlh_flags, 0); | 734 | err = __br_fdb_add(ndm, p, addr, nlh_flags, 0); |
735 | goto out; | 735 | goto out; |
736 | } | 736 | } |
@@ -739,7 +739,7 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], | |||
739 | * specify a VLAN. To be nice, add/update entry for every | 739 | * specify a VLAN. To be nice, add/update entry for every |
740 | * vlan on this port. | 740 | * vlan on this port. |
741 | */ | 741 | */ |
742 | for_each_set_bit(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) { | 742 | for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) { |
743 | err = __br_fdb_add(ndm, p, addr, nlh_flags, vid); | 743 | err = __br_fdb_add(ndm, p, addr, nlh_flags, vid); |
744 | if (err) | 744 | if (err) |
745 | goto out; | 745 | goto out; |
@@ -817,7 +817,7 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[], | |||
817 | 817 | ||
818 | err = __br_fdb_delete(p, addr, vid); | 818 | err = __br_fdb_delete(p, addr, vid); |
819 | } else { | 819 | } else { |
820 | if (!pv || bitmap_empty(pv->vlan_bitmap, BR_VLAN_BITMAP_LEN)) { | 820 | if (!pv || bitmap_empty(pv->vlan_bitmap, VLAN_N_VID)) { |
821 | err = __br_fdb_delete(p, addr, 0); | 821 | err = __br_fdb_delete(p, addr, 0); |
822 | goto out; | 822 | goto out; |
823 | } | 823 | } |
@@ -827,7 +827,7 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[], | |||
827 | * vlan on this port. | 827 | * vlan on this port. |
828 | */ | 828 | */ |
829 | err = -ENOENT; | 829 | err = -ENOENT; |
830 | for_each_set_bit(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) { | 830 | for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) { |
831 | err &= __br_fdb_delete(p, addr, vid); | 831 | err &= __br_fdb_delete(p, addr, vid); |
832 | } | 832 | } |
833 | } | 833 | } |
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 1fc30abd3a52..b9259efa636e 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -132,7 +132,7 @@ static int br_fill_ifinfo(struct sk_buff *skb, | |||
132 | else | 132 | else |
133 | pv = br_get_vlan_info(br); | 133 | pv = br_get_vlan_info(br); |
134 | 134 | ||
135 | if (!pv || bitmap_empty(pv->vlan_bitmap, BR_VLAN_BITMAP_LEN)) | 135 | if (!pv || bitmap_empty(pv->vlan_bitmap, VLAN_N_VID)) |
136 | goto done; | 136 | goto done; |
137 | 137 | ||
138 | af = nla_nest_start(skb, IFLA_AF_SPEC); | 138 | af = nla_nest_start(skb, IFLA_AF_SPEC); |
@@ -140,7 +140,7 @@ static int br_fill_ifinfo(struct sk_buff *skb, | |||
140 | goto nla_put_failure; | 140 | goto nla_put_failure; |
141 | 141 | ||
142 | pvid = br_get_pvid(pv); | 142 | pvid = br_get_pvid(pv); |
143 | for_each_set_bit(vid, pv->vlan_bitmap, BR_VLAN_BITMAP_LEN) { | 143 | for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) { |
144 | vinfo.vid = vid; | 144 | vinfo.vid = vid; |
145 | vinfo.flags = 0; | 145 | vinfo.flags = 0; |
146 | if (vid == pvid) | 146 | if (vid == pvid) |
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index bd58b45f5f90..9a9ffe7e4019 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c | |||
@@ -108,7 +108,7 @@ static int __vlan_del(struct net_port_vlans *v, u16 vid) | |||
108 | 108 | ||
109 | clear_bit(vid, v->vlan_bitmap); | 109 | clear_bit(vid, v->vlan_bitmap); |
110 | v->num_vlans--; | 110 | v->num_vlans--; |
111 | if (bitmap_empty(v->vlan_bitmap, BR_VLAN_BITMAP_LEN)) { | 111 | if (bitmap_empty(v->vlan_bitmap, VLAN_N_VID)) { |
112 | if (v->port_idx) | 112 | if (v->port_idx) |
113 | rcu_assign_pointer(v->parent.port->vlan_info, NULL); | 113 | rcu_assign_pointer(v->parent.port->vlan_info, NULL); |
114 | else | 114 | else |
@@ -122,7 +122,7 @@ static void __vlan_flush(struct net_port_vlans *v) | |||
122 | { | 122 | { |
123 | smp_wmb(); | 123 | smp_wmb(); |
124 | v->pvid = 0; | 124 | v->pvid = 0; |
125 | bitmap_zero(v->vlan_bitmap, BR_VLAN_BITMAP_LEN); | 125 | bitmap_zero(v->vlan_bitmap, VLAN_N_VID); |
126 | if (v->port_idx) | 126 | if (v->port_idx) |
127 | rcu_assign_pointer(v->parent.port->vlan_info, NULL); | 127 | rcu_assign_pointer(v->parent.port->vlan_info, NULL); |
128 | else | 128 | else |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 5423223e93c2..b2f6c74861af 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1121,6 +1121,13 @@ new_segment: | |||
1121 | goto wait_for_memory; | 1121 | goto wait_for_memory; |
1122 | 1122 | ||
1123 | /* | 1123 | /* |
1124 | * All packets are restored as if they have | ||
1125 | * already been sent. | ||
1126 | */ | ||
1127 | if (tp->repair) | ||
1128 | TCP_SKB_CB(skb)->when = tcp_time_stamp; | ||
1129 | |||
1130 | /* | ||
1124 | * Check whether we can use HW checksum. | 1131 | * Check whether we can use HW checksum. |
1125 | */ | 1132 | */ |
1126 | if (sk->sk_route_caps & NETIF_F_ALL_CSUM) | 1133 | if (sk->sk_route_caps & NETIF_F_ALL_CSUM) |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index da4241c8c7da..498ea99194af 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1126,12 +1126,10 @@ retry: | |||
1126 | if (ifp->flags & IFA_F_OPTIMISTIC) | 1126 | if (ifp->flags & IFA_F_OPTIMISTIC) |
1127 | addr_flags |= IFA_F_OPTIMISTIC; | 1127 | addr_flags |= IFA_F_OPTIMISTIC; |
1128 | 1128 | ||
1129 | ift = !max_addresses || | 1129 | ift = ipv6_add_addr(idev, &addr, NULL, tmp_plen, |
1130 | ipv6_count_addresses(idev) < max_addresses ? | 1130 | ipv6_addr_scope(&addr), addr_flags, |
1131 | ipv6_add_addr(idev, &addr, NULL, tmp_plen, | 1131 | tmp_valid_lft, tmp_prefered_lft); |
1132 | ipv6_addr_scope(&addr), addr_flags, | 1132 | if (IS_ERR(ift)) { |
1133 | tmp_valid_lft, tmp_prefered_lft) : NULL; | ||
1134 | if (IS_ERR_OR_NULL(ift)) { | ||
1135 | in6_ifa_put(ifp); | 1133 | in6_ifa_put(ifp); |
1136 | in6_dev_put(idev); | 1134 | in6_dev_put(idev); |
1137 | pr_info("%s: retry temporary address regeneration\n", __func__); | 1135 | pr_info("%s: retry temporary address regeneration\n", __func__); |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 79aa9652ed86..04d31c2fbef1 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1369,8 +1369,10 @@ static void ndisc_redirect_rcv(struct sk_buff *skb) | |||
1369 | if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) | 1369 | if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) |
1370 | return; | 1370 | return; |
1371 | 1371 | ||
1372 | if (!ndopts.nd_opts_rh) | 1372 | if (!ndopts.nd_opts_rh) { |
1373 | ip6_redirect_no_header(skb, dev_net(skb->dev), 0, 0); | ||
1373 | return; | 1374 | return; |
1375 | } | ||
1374 | 1376 | ||
1375 | hdr = (u8 *)ndopts.nd_opts_rh; | 1377 | hdr = (u8 *)ndopts.nd_opts_rh; |
1376 | hdr += 8; | 1378 | hdr += 8; |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 790d9f4b8b0b..1aeb473b2cc6 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -490,6 +490,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | |||
490 | ipv6_hdr(head)->payload_len = htons(payload_len); | 490 | ipv6_hdr(head)->payload_len = htons(payload_len); |
491 | ipv6_change_dsfield(ipv6_hdr(head), 0xff, ecn); | 491 | ipv6_change_dsfield(ipv6_hdr(head), 0xff, ecn); |
492 | IP6CB(head)->nhoff = nhoff; | 492 | IP6CB(head)->nhoff = nhoff; |
493 | IP6CB(head)->flags |= IP6SKB_FRAGMENTED; | ||
493 | 494 | ||
494 | /* Yes, and fold redundant checksum back. 8) */ | 495 | /* Yes, and fold redundant checksum back. 8) */ |
495 | if (head->ip_summed == CHECKSUM_COMPLETE) | 496 | if (head->ip_summed == CHECKSUM_COMPLETE) |
@@ -524,6 +525,9 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
524 | struct net *net = dev_net(skb_dst(skb)->dev); | 525 | struct net *net = dev_net(skb_dst(skb)->dev); |
525 | int evicted; | 526 | int evicted; |
526 | 527 | ||
528 | if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED) | ||
529 | goto fail_hdr; | ||
530 | |||
527 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMREQDS); | 531 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMREQDS); |
528 | 532 | ||
529 | /* Jumbo payload inhibits frag. header */ | 533 | /* Jumbo payload inhibits frag. header */ |
@@ -544,6 +548,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
544 | ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMOKS); | 548 | ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMOKS); |
545 | 549 | ||
546 | IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb); | 550 | IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb); |
551 | IP6CB(skb)->flags |= IP6SKB_FRAGMENTED; | ||
547 | return 1; | 552 | return 1; |
548 | } | 553 | } |
549 | 554 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index b70f8979003b..8d9a93ed9c59 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1178,6 +1178,27 @@ void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark) | |||
1178 | } | 1178 | } |
1179 | EXPORT_SYMBOL_GPL(ip6_redirect); | 1179 | EXPORT_SYMBOL_GPL(ip6_redirect); |
1180 | 1180 | ||
1181 | void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif, | ||
1182 | u32 mark) | ||
1183 | { | ||
1184 | const struct ipv6hdr *iph = ipv6_hdr(skb); | ||
1185 | const struct rd_msg *msg = (struct rd_msg *)icmp6_hdr(skb); | ||
1186 | struct dst_entry *dst; | ||
1187 | struct flowi6 fl6; | ||
1188 | |||
1189 | memset(&fl6, 0, sizeof(fl6)); | ||
1190 | fl6.flowi6_oif = oif; | ||
1191 | fl6.flowi6_mark = mark; | ||
1192 | fl6.flowi6_flags = 0; | ||
1193 | fl6.daddr = msg->dest; | ||
1194 | fl6.saddr = iph->daddr; | ||
1195 | |||
1196 | dst = ip6_route_output(net, NULL, &fl6); | ||
1197 | if (!dst->error) | ||
1198 | rt6_do_redirect(dst, NULL, skb); | ||
1199 | dst_release(dst); | ||
1200 | } | ||
1201 | |||
1181 | void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk) | 1202 | void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk) |
1182 | { | 1203 | { |
1183 | ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark); | 1204 | ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark); |
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index f85f8a2ad6cf..512718adb0d5 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -789,10 +789,6 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) | |||
789 | struct net *net = sock_net(skb->sk); | 789 | struct net *net = sock_net(skb->sk); |
790 | int chains_to_skip = cb->args[0]; | 790 | int chains_to_skip = cb->args[0]; |
791 | int fams_to_skip = cb->args[1]; | 791 | int fams_to_skip = cb->args[1]; |
792 | bool need_locking = chains_to_skip || fams_to_skip; | ||
793 | |||
794 | if (need_locking) | ||
795 | genl_lock(); | ||
796 | 792 | ||
797 | for (i = chains_to_skip; i < GENL_FAM_TAB_SIZE; i++) { | 793 | for (i = chains_to_skip; i < GENL_FAM_TAB_SIZE; i++) { |
798 | n = 0; | 794 | n = 0; |
@@ -814,9 +810,6 @@ errout: | |||
814 | cb->args[0] = i; | 810 | cb->args[0] = i; |
815 | cb->args[1] = n; | 811 | cb->args[1] = n; |
816 | 812 | ||
817 | if (need_locking) | ||
818 | genl_unlock(); | ||
819 | |||
820 | return skb->len; | 813 | return skb->len; |
821 | } | 814 | } |
822 | 815 | ||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 4b66c752eae5..75c8bbf598c8 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -3259,9 +3259,11 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, | |||
3259 | 3259 | ||
3260 | if (po->tp_version == TPACKET_V3) { | 3260 | if (po->tp_version == TPACKET_V3) { |
3261 | lv = sizeof(struct tpacket_stats_v3); | 3261 | lv = sizeof(struct tpacket_stats_v3); |
3262 | st.stats3.tp_packets += st.stats3.tp_drops; | ||
3262 | data = &st.stats3; | 3263 | data = &st.stats3; |
3263 | } else { | 3264 | } else { |
3264 | lv = sizeof(struct tpacket_stats); | 3265 | lv = sizeof(struct tpacket_stats); |
3266 | st.stats1.tp_packets += st.stats1.tp_drops; | ||
3265 | data = &st.stats1; | 3267 | data = &st.stats1; |
3266 | } | 3268 | } |
3267 | 3269 | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 3fcba69817e5..5f6e982cdcf4 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2622,8 +2622,8 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | |||
2622 | 2622 | ||
2623 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, | 2623 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, |
2624 | NL80211_CMD_NEW_KEY); | 2624 | NL80211_CMD_NEW_KEY); |
2625 | if (IS_ERR(hdr)) | 2625 | if (!hdr) |
2626 | return PTR_ERR(hdr); | 2626 | return -ENOBUFS; |
2627 | 2627 | ||
2628 | cookie.msg = msg; | 2628 | cookie.msg = msg; |
2629 | cookie.idx = key_idx; | 2629 | cookie.idx = key_idx; |
@@ -6507,6 +6507,9 @@ static int nl80211_testmode_dump(struct sk_buff *skb, | |||
6507 | NL80211_CMD_TESTMODE); | 6507 | NL80211_CMD_TESTMODE); |
6508 | struct nlattr *tmdata; | 6508 | struct nlattr *tmdata; |
6509 | 6509 | ||
6510 | if (!hdr) | ||
6511 | break; | ||
6512 | |||
6510 | if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { | 6513 | if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { |
6511 | genlmsg_cancel(skb, hdr); | 6514 | genlmsg_cancel(skb, hdr); |
6512 | break; | 6515 | break; |
@@ -6951,9 +6954,8 @@ static int nl80211_remain_on_channel(struct sk_buff *skb, | |||
6951 | 6954 | ||
6952 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, | 6955 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, |
6953 | NL80211_CMD_REMAIN_ON_CHANNEL); | 6956 | NL80211_CMD_REMAIN_ON_CHANNEL); |
6954 | 6957 | if (!hdr) { | |
6955 | if (IS_ERR(hdr)) { | 6958 | err = -ENOBUFS; |
6956 | err = PTR_ERR(hdr); | ||
6957 | goto free_msg; | 6959 | goto free_msg; |
6958 | } | 6960 | } |
6959 | 6961 | ||
@@ -7251,9 +7253,8 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) | |||
7251 | 7253 | ||
7252 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, | 7254 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, |
7253 | NL80211_CMD_FRAME); | 7255 | NL80211_CMD_FRAME); |
7254 | 7256 | if (!hdr) { | |
7255 | if (IS_ERR(hdr)) { | 7257 | err = -ENOBUFS; |
7256 | err = PTR_ERR(hdr); | ||
7257 | goto free_msg; | 7258 | goto free_msg; |
7258 | } | 7259 | } |
7259 | } | 7260 | } |
@@ -8132,9 +8133,8 @@ static int nl80211_probe_client(struct sk_buff *skb, | |||
8132 | 8133 | ||
8133 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, | 8134 | hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, |
8134 | NL80211_CMD_PROBE_CLIENT); | 8135 | NL80211_CMD_PROBE_CLIENT); |
8135 | 8136 | if (!hdr) { | |
8136 | if (IS_ERR(hdr)) { | 8137 | err = -ENOBUFS; |
8137 | err = PTR_ERR(hdr); | ||
8138 | goto free_msg; | 8138 | goto free_msg; |
8139 | } | 8139 | } |
8140 | 8140 | ||
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 81c8a10d743c..20e86a95dc4e 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -976,21 +976,19 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev, | |||
976 | struct net_device *dev, u16 reason, bool wextev) | 976 | struct net_device *dev, u16 reason, bool wextev) |
977 | { | 977 | { |
978 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 978 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
979 | int err; | 979 | int err = 0; |
980 | 980 | ||
981 | ASSERT_WDEV_LOCK(wdev); | 981 | ASSERT_WDEV_LOCK(wdev); |
982 | 982 | ||
983 | kfree(wdev->connect_keys); | 983 | kfree(wdev->connect_keys); |
984 | wdev->connect_keys = NULL; | 984 | wdev->connect_keys = NULL; |
985 | 985 | ||
986 | if (wdev->conn) { | 986 | if (wdev->conn) |
987 | err = cfg80211_sme_disconnect(wdev, reason); | 987 | err = cfg80211_sme_disconnect(wdev, reason); |
988 | } else if (!rdev->ops->disconnect) { | 988 | else if (!rdev->ops->disconnect) |
989 | cfg80211_mlme_down(rdev, dev); | 989 | cfg80211_mlme_down(rdev, dev); |
990 | err = 0; | 990 | else if (wdev->current_bss) |
991 | } else { | ||
992 | err = rdev_disconnect(rdev, dev, reason); | 991 | err = rdev_disconnect(rdev, dev, reason); |
993 | } | ||
994 | 992 | ||
995 | return err; | 993 | return err; |
996 | } | 994 | } |