Annotation of /trunk/kernel-alx/patches-4.14/0130-4.14.31-all-fixes.patch
Parent Directory | Revision Log
Revision 3238 -
(hide annotations)
(download)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 134679 byte(s)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 134679 byte(s)
-added up to patches-4.14.79
1 | niro | 3238 | diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio |
2 | index 7eead5f97e02..64e65450f483 100644 | ||
3 | --- a/Documentation/ABI/testing/sysfs-bus-iio | ||
4 | +++ b/Documentation/ABI/testing/sysfs-bus-iio | ||
5 | @@ -32,7 +32,7 @@ Description: | ||
6 | Description of the physical chip / device for device X. | ||
7 | Typically a part number. | ||
8 | |||
9 | -What: /sys/bus/iio/devices/iio:deviceX/timestamp_clock | ||
10 | +What: /sys/bus/iio/devices/iio:deviceX/current_timestamp_clock | ||
11 | KernelVersion: 4.5 | ||
12 | Contact: linux-iio@vger.kernel.org | ||
13 | Description: | ||
14 | diff --git a/Makefile b/Makefile | ||
15 | index 29fc3c91f3e4..99e31da48422 100644 | ||
16 | --- a/Makefile | ||
17 | +++ b/Makefile | ||
18 | @@ -1,7 +1,7 @@ | ||
19 | # SPDX-License-Identifier: GPL-2.0 | ||
20 | VERSION = 4 | ||
21 | PATCHLEVEL = 14 | ||
22 | -SUBLEVEL = 30 | ||
23 | +SUBLEVEL = 31 | ||
24 | EXTRAVERSION = | ||
25 | NAME = Petit Gorille | ||
26 | |||
27 | @@ -805,6 +805,15 @@ KBUILD_CFLAGS += $(call cc-disable-warning, pointer-sign) | ||
28 | # disable invalid "can't wrap" optimizations for signed / pointers | ||
29 | KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow) | ||
30 | |||
31 | +# clang sets -fmerge-all-constants by default as optimization, but this | ||
32 | +# is non-conforming behavior for C and in fact breaks the kernel, so we | ||
33 | +# need to disable it here generally. | ||
34 | +KBUILD_CFLAGS += $(call cc-option,-fno-merge-all-constants) | ||
35 | + | ||
36 | +# for gcc -fno-merge-all-constants disables everything, but it is fine | ||
37 | +# to have actual conforming behavior enabled. | ||
38 | +KBUILD_CFLAGS += $(call cc-option,-fmerge-constants) | ||
39 | + | ||
40 | # Make sure -fstack-check isn't enabled (like gentoo apparently did) | ||
41 | KBUILD_CFLAGS += $(call cc-option,-fno-stack-check,) | ||
42 | |||
43 | diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c | ||
44 | index 01bc0688d47d..f6b877d2726d 100644 | ||
45 | --- a/arch/arm64/mm/mmu.c | ||
46 | +++ b/arch/arm64/mm/mmu.c | ||
47 | @@ -937,3 +937,13 @@ int pmd_clear_huge(pmd_t *pmd) | ||
48 | pmd_clear(pmd); | ||
49 | return 1; | ||
50 | } | ||
51 | + | ||
52 | +int pud_free_pmd_page(pud_t *pud) | ||
53 | +{ | ||
54 | + return pud_none(*pud); | ||
55 | +} | ||
56 | + | ||
57 | +int pmd_free_pte_page(pmd_t *pmd) | ||
58 | +{ | ||
59 | + return pmd_none(*pmd); | ||
60 | +} | ||
61 | diff --git a/arch/h8300/include/asm/byteorder.h b/arch/h8300/include/asm/byteorder.h | ||
62 | index ecff2d1ca5a3..6eaa7ad5fc2c 100644 | ||
63 | --- a/arch/h8300/include/asm/byteorder.h | ||
64 | +++ b/arch/h8300/include/asm/byteorder.h | ||
65 | @@ -2,7 +2,6 @@ | ||
66 | #ifndef __H8300_BYTEORDER_H__ | ||
67 | #define __H8300_BYTEORDER_H__ | ||
68 | |||
69 | -#define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ | ||
70 | #include <linux/byteorder/big_endian.h> | ||
71 | |||
72 | #endif | ||
73 | diff --git a/arch/mips/lantiq/Kconfig b/arch/mips/lantiq/Kconfig | ||
74 | index 692ae85a3e3d..8e3a1fc2bc39 100644 | ||
75 | --- a/arch/mips/lantiq/Kconfig | ||
76 | +++ b/arch/mips/lantiq/Kconfig | ||
77 | @@ -13,6 +13,8 @@ choice | ||
78 | config SOC_AMAZON_SE | ||
79 | bool "Amazon SE" | ||
80 | select SOC_TYPE_XWAY | ||
81 | + select MFD_SYSCON | ||
82 | + select MFD_CORE | ||
83 | |||
84 | config SOC_XWAY | ||
85 | bool "XWAY" | ||
86 | diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c | ||
87 | index 7611c3013793..c05bed624075 100644 | ||
88 | --- a/arch/mips/lantiq/xway/sysctrl.c | ||
89 | +++ b/arch/mips/lantiq/xway/sysctrl.c | ||
90 | @@ -551,9 +551,9 @@ void __init ltq_soc_init(void) | ||
91 | clkdev_add_static(ltq_ar9_cpu_hz(), ltq_ar9_fpi_hz(), | ||
92 | ltq_ar9_fpi_hz(), CLOCK_250M); | ||
93 | clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P); | ||
94 | - clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0); | ||
95 | + clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0 | PMU_AHBM); | ||
96 | clkdev_add_pmu("1f203034.usb2-phy", "phy", 1, 0, PMU_USB1_P); | ||
97 | - clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1); | ||
98 | + clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1 | PMU_AHBM); | ||
99 | clkdev_add_pmu("1e180000.etop", "switch", 1, 0, PMU_SWITCH); | ||
100 | clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO); | ||
101 | clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU); | ||
102 | @@ -562,7 +562,7 @@ void __init ltq_soc_init(void) | ||
103 | } else { | ||
104 | clkdev_add_static(ltq_danube_cpu_hz(), ltq_danube_fpi_hz(), | ||
105 | ltq_danube_fpi_hz(), ltq_danube_pp32_hz()); | ||
106 | - clkdev_add_pmu("1f203018.usb2-phy", "ctrl", 1, 0, PMU_USB0); | ||
107 | + clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0 | PMU_AHBM); | ||
108 | clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P); | ||
109 | clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO); | ||
110 | clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU); | ||
111 | diff --git a/arch/mips/ralink/mt7621.c b/arch/mips/ralink/mt7621.c | ||
112 | index 1b274742077d..d2718de60b9b 100644 | ||
113 | --- a/arch/mips/ralink/mt7621.c | ||
114 | +++ b/arch/mips/ralink/mt7621.c | ||
115 | @@ -170,6 +170,28 @@ void prom_soc_init(struct ralink_soc_info *soc_info) | ||
116 | u32 n1; | ||
117 | u32 rev; | ||
118 | |||
119 | + /* Early detection of CMP support */ | ||
120 | + mips_cm_probe(); | ||
121 | + mips_cpc_probe(); | ||
122 | + | ||
123 | + if (mips_cps_numiocu(0)) { | ||
124 | + /* | ||
125 | + * mips_cm_probe() wipes out bootloader | ||
126 | + * config for CM regions and we have to configure them | ||
127 | + * again. This SoC cannot talk to pamlbus devices | ||
128 | + * witout proper iocu region set up. | ||
129 | + * | ||
130 | + * FIXME: it would be better to do this with values | ||
131 | + * from DT, but we need this very early because | ||
132 | + * without this we cannot talk to pretty much anything | ||
133 | + * including serial. | ||
134 | + */ | ||
135 | + write_gcr_reg0_base(MT7621_PALMBUS_BASE); | ||
136 | + write_gcr_reg0_mask(~MT7621_PALMBUS_SIZE | | ||
137 | + CM_GCR_REGn_MASK_CMTGT_IOCU0); | ||
138 | + __sync(); | ||
139 | + } | ||
140 | + | ||
141 | n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0); | ||
142 | n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1); | ||
143 | |||
144 | @@ -194,26 +216,6 @@ void prom_soc_init(struct ralink_soc_info *soc_info) | ||
145 | |||
146 | rt2880_pinmux_data = mt7621_pinmux_data; | ||
147 | |||
148 | - /* Early detection of CMP support */ | ||
149 | - mips_cm_probe(); | ||
150 | - mips_cpc_probe(); | ||
151 | - | ||
152 | - if (mips_cps_numiocu(0)) { | ||
153 | - /* | ||
154 | - * mips_cm_probe() wipes out bootloader | ||
155 | - * config for CM regions and we have to configure them | ||
156 | - * again. This SoC cannot talk to pamlbus devices | ||
157 | - * witout proper iocu region set up. | ||
158 | - * | ||
159 | - * FIXME: it would be better to do this with values | ||
160 | - * from DT, but we need this very early because | ||
161 | - * without this we cannot talk to pretty much anything | ||
162 | - * including serial. | ||
163 | - */ | ||
164 | - write_gcr_reg0_base(MT7621_PALMBUS_BASE); | ||
165 | - write_gcr_reg0_mask(~MT7621_PALMBUS_SIZE | | ||
166 | - CM_GCR_REGn_MASK_CMTGT_IOCU0); | ||
167 | - } | ||
168 | |||
169 | if (!register_cps_smp_ops()) | ||
170 | return; | ||
171 | diff --git a/arch/mips/ralink/reset.c b/arch/mips/ralink/reset.c | ||
172 | index 64543d66e76b..e9531fea23a2 100644 | ||
173 | --- a/arch/mips/ralink/reset.c | ||
174 | +++ b/arch/mips/ralink/reset.c | ||
175 | @@ -96,16 +96,9 @@ static void ralink_restart(char *command) | ||
176 | unreachable(); | ||
177 | } | ||
178 | |||
179 | -static void ralink_halt(void) | ||
180 | -{ | ||
181 | - local_irq_disable(); | ||
182 | - unreachable(); | ||
183 | -} | ||
184 | - | ||
185 | static int __init mips_reboot_setup(void) | ||
186 | { | ||
187 | _machine_restart = ralink_restart; | ||
188 | - _machine_halt = ralink_halt; | ||
189 | |||
190 | return 0; | ||
191 | } | ||
192 | diff --git a/arch/x86/Makefile b/arch/x86/Makefile | ||
193 | index 498c1b812300..1c4d012550ec 100644 | ||
194 | --- a/arch/x86/Makefile | ||
195 | +++ b/arch/x86/Makefile | ||
196 | @@ -223,6 +223,15 @@ KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) | ||
197 | |||
198 | LDFLAGS := -m elf_$(UTS_MACHINE) | ||
199 | |||
200 | +# | ||
201 | +# The 64-bit kernel must be aligned to 2MB. Pass -z max-page-size=0x200000 to | ||
202 | +# the linker to force 2MB page size regardless of the default page size used | ||
203 | +# by the linker. | ||
204 | +# | ||
205 | +ifdef CONFIG_X86_64 | ||
206 | +LDFLAGS += $(call ld-option, -z max-page-size=0x200000) | ||
207 | +endif | ||
208 | + | ||
209 | # Speed up the build | ||
210 | KBUILD_CFLAGS += -pipe | ||
211 | # Workaround for a gcc prelease that unfortunately was shipped in a suse release | ||
212 | diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c | ||
213 | index 98761a1576ce..252fee320816 100644 | ||
214 | --- a/arch/x86/boot/compressed/misc.c | ||
215 | +++ b/arch/x86/boot/compressed/misc.c | ||
216 | @@ -309,6 +309,10 @@ static void parse_elf(void *output) | ||
217 | |||
218 | switch (phdr->p_type) { | ||
219 | case PT_LOAD: | ||
220 | +#ifdef CONFIG_X86_64 | ||
221 | + if ((phdr->p_align % 0x200000) != 0) | ||
222 | + error("Alignment of LOAD segment isn't multiple of 2MB"); | ||
223 | +#endif | ||
224 | #ifdef CONFIG_RELOCATABLE | ||
225 | dest = output; | ||
226 | dest += (phdr->p_paddr - LOAD_PHYSICAL_ADDR); | ||
227 | diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S | ||
228 | index 6f3cc15e0c73..f7bfa701219b 100644 | ||
229 | --- a/arch/x86/entry/entry_64.S | ||
230 | +++ b/arch/x86/entry/entry_64.S | ||
231 | @@ -1091,7 +1091,7 @@ apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \ | ||
232 | #endif /* CONFIG_HYPERV */ | ||
233 | |||
234 | idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK | ||
235 | -idtentry int3 do_int3 has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK | ||
236 | +idtentry int3 do_int3 has_error_code=0 | ||
237 | idtentry stack_segment do_stack_segment has_error_code=1 | ||
238 | |||
239 | #ifdef CONFIG_XEN | ||
240 | diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c | ||
241 | index 577fa8adb785..542392b6aab6 100644 | ||
242 | --- a/arch/x86/entry/vsyscall/vsyscall_64.c | ||
243 | +++ b/arch/x86/entry/vsyscall/vsyscall_64.c | ||
244 | @@ -355,7 +355,7 @@ void __init set_vsyscall_pgtable_user_bits(pgd_t *root) | ||
245 | set_pgd(pgd, __pgd(pgd_val(*pgd) | _PAGE_USER)); | ||
246 | p4d = p4d_offset(pgd, VSYSCALL_ADDR); | ||
247 | #if CONFIG_PGTABLE_LEVELS >= 5 | ||
248 | - p4d->p4d |= _PAGE_USER; | ||
249 | + set_p4d(p4d, __p4d(p4d_val(*p4d) | _PAGE_USER)); | ||
250 | #endif | ||
251 | pud = pud_offset(p4d, VSYSCALL_ADDR); | ||
252 | set_pud(pud, __pud(pud_val(*pud) | _PAGE_USER)); | ||
253 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c | ||
254 | index 56457cb73448..9b18a227fff7 100644 | ||
255 | --- a/arch/x86/events/intel/core.c | ||
256 | +++ b/arch/x86/events/intel/core.c | ||
257 | @@ -3194,7 +3194,7 @@ static unsigned bdw_limit_period(struct perf_event *event, unsigned left) | ||
258 | X86_CONFIG(.event=0xc0, .umask=0x01)) { | ||
259 | if (left < 128) | ||
260 | left = 128; | ||
261 | - left &= ~0x3fu; | ||
262 | + left &= ~0x3fULL; | ||
263 | } | ||
264 | return left; | ||
265 | } | ||
266 | diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c | ||
267 | index 95cb19f4e06f..8243fdbb9b9c 100644 | ||
268 | --- a/arch/x86/events/intel/uncore_snbep.c | ||
269 | +++ b/arch/x86/events/intel/uncore_snbep.c | ||
270 | @@ -3554,24 +3554,27 @@ static struct intel_uncore_type *skx_msr_uncores[] = { | ||
271 | NULL, | ||
272 | }; | ||
273 | |||
274 | +/* | ||
275 | + * To determine the number of CHAs, it should read bits 27:0 in the CAPID6 | ||
276 | + * register which located at Device 30, Function 3, Offset 0x9C. PCI ID 0x2083. | ||
277 | + */ | ||
278 | +#define SKX_CAPID6 0x9c | ||
279 | +#define SKX_CHA_BIT_MASK GENMASK(27, 0) | ||
280 | + | ||
281 | static int skx_count_chabox(void) | ||
282 | { | ||
283 | - struct pci_dev *chabox_dev = NULL; | ||
284 | - int bus, count = 0; | ||
285 | + struct pci_dev *dev = NULL; | ||
286 | + u32 val = 0; | ||
287 | |||
288 | - while (1) { | ||
289 | - chabox_dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x208d, chabox_dev); | ||
290 | - if (!chabox_dev) | ||
291 | - break; | ||
292 | - if (count == 0) | ||
293 | - bus = chabox_dev->bus->number; | ||
294 | - if (bus != chabox_dev->bus->number) | ||
295 | - break; | ||
296 | - count++; | ||
297 | - } | ||
298 | + dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x2083, dev); | ||
299 | + if (!dev) | ||
300 | + goto out; | ||
301 | |||
302 | - pci_dev_put(chabox_dev); | ||
303 | - return count; | ||
304 | + pci_read_config_dword(dev, SKX_CAPID6, &val); | ||
305 | + val &= SKX_CHA_BIT_MASK; | ||
306 | +out: | ||
307 | + pci_dev_put(dev); | ||
308 | + return hweight32(val); | ||
309 | } | ||
310 | |||
311 | void skx_uncore_cpu_init(void) | ||
312 | @@ -3598,7 +3601,7 @@ static struct intel_uncore_type skx_uncore_imc = { | ||
313 | }; | ||
314 | |||
315 | static struct attribute *skx_upi_uncore_formats_attr[] = { | ||
316 | - &format_attr_event_ext.attr, | ||
317 | + &format_attr_event.attr, | ||
318 | &format_attr_umask_ext.attr, | ||
319 | &format_attr_edge.attr, | ||
320 | &format_attr_inv.attr, | ||
321 | diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h | ||
322 | index caec8417539f..7c300299e12e 100644 | ||
323 | --- a/arch/x86/include/asm/vmx.h | ||
324 | +++ b/arch/x86/include/asm/vmx.h | ||
325 | @@ -352,6 +352,7 @@ enum vmcs_field { | ||
326 | #define INTR_TYPE_NMI_INTR (2 << 8) /* NMI */ | ||
327 | #define INTR_TYPE_HARD_EXCEPTION (3 << 8) /* processor exception */ | ||
328 | #define INTR_TYPE_SOFT_INTR (4 << 8) /* software interrupt */ | ||
329 | +#define INTR_TYPE_PRIV_SW_EXCEPTION (5 << 8) /* ICE breakpoint - undocumented */ | ||
330 | #define INTR_TYPE_SOFT_EXCEPTION (6 << 8) /* software exception */ | ||
331 | |||
332 | /* GUEST_INTERRUPTIBILITY_INFO flags. */ | ||
333 | diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c | ||
334 | index 236917bac5f2..a59624080015 100644 | ||
335 | --- a/arch/x86/kernel/idt.c | ||
336 | +++ b/arch/x86/kernel/idt.c | ||
337 | @@ -160,7 +160,6 @@ static const __initconst struct idt_data early_pf_idts[] = { | ||
338 | */ | ||
339 | static const __initconst struct idt_data dbg_idts[] = { | ||
340 | INTG(X86_TRAP_DB, debug), | ||
341 | - INTG(X86_TRAP_BP, int3), | ||
342 | }; | ||
343 | #endif | ||
344 | |||
345 | @@ -183,7 +182,6 @@ gate_desc debug_idt_table[IDT_ENTRIES] __page_aligned_bss; | ||
346 | static const __initconst struct idt_data ist_idts[] = { | ||
347 | ISTG(X86_TRAP_DB, debug, DEBUG_STACK), | ||
348 | ISTG(X86_TRAP_NMI, nmi, NMI_STACK), | ||
349 | - SISTG(X86_TRAP_BP, int3, DEBUG_STACK), | ||
350 | ISTG(X86_TRAP_DF, double_fault, DOUBLEFAULT_STACK), | ||
351 | #ifdef CONFIG_X86_MCE | ||
352 | ISTG(X86_TRAP_MC, &machine_check, MCE_STACK), | ||
353 | diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c | ||
354 | index a66428dc92ae..ef4efb931efa 100644 | ||
355 | --- a/arch/x86/kernel/traps.c | ||
356 | +++ b/arch/x86/kernel/traps.c | ||
357 | @@ -571,7 +571,6 @@ do_general_protection(struct pt_regs *regs, long error_code) | ||
358 | } | ||
359 | NOKPROBE_SYMBOL(do_general_protection); | ||
360 | |||
361 | -/* May run on IST stack. */ | ||
362 | dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code) | ||
363 | { | ||
364 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
365 | @@ -586,6 +585,13 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code) | ||
366 | if (poke_int3_handler(regs)) | ||
367 | return; | ||
368 | |||
369 | + /* | ||
370 | + * Use ist_enter despite the fact that we don't use an IST stack. | ||
371 | + * We can be called from a kprobe in non-CONTEXT_KERNEL kernel | ||
372 | + * mode or even during context tracking state changes. | ||
373 | + * | ||
374 | + * This means that we can't schedule. That's okay. | ||
375 | + */ | ||
376 | ist_enter(regs); | ||
377 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); | ||
378 | #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP | ||
379 | @@ -603,15 +609,10 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code) | ||
380 | SIGTRAP) == NOTIFY_STOP) | ||
381 | goto exit; | ||
382 | |||
383 | - /* | ||
384 | - * Let others (NMI) know that the debug stack is in use | ||
385 | - * as we may switch to the interrupt stack. | ||
386 | - */ | ||
387 | - debug_stack_usage_inc(); | ||
388 | cond_local_irq_enable(regs); | ||
389 | do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL); | ||
390 | cond_local_irq_disable(regs); | ||
391 | - debug_stack_usage_dec(); | ||
392 | + | ||
393 | exit: | ||
394 | ist_exit(regs); | ||
395 | } | ||
396 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
397 | index 315fccb2684b..ae4803b213d0 100644 | ||
398 | --- a/arch/x86/kvm/vmx.c | ||
399 | +++ b/arch/x86/kvm/vmx.c | ||
400 | @@ -1071,6 +1071,13 @@ static inline bool is_machine_check(u32 intr_info) | ||
401 | (INTR_TYPE_HARD_EXCEPTION | MC_VECTOR | INTR_INFO_VALID_MASK); | ||
402 | } | ||
403 | |||
404 | +/* Undocumented: icebp/int1 */ | ||
405 | +static inline bool is_icebp(u32 intr_info) | ||
406 | +{ | ||
407 | + return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK)) | ||
408 | + == (INTR_TYPE_PRIV_SW_EXCEPTION | INTR_INFO_VALID_MASK); | ||
409 | +} | ||
410 | + | ||
411 | static inline bool cpu_has_vmx_msr_bitmap(void) | ||
412 | { | ||
413 | return vmcs_config.cpu_based_exec_ctrl & CPU_BASED_USE_MSR_BITMAPS; | ||
414 | @@ -6169,7 +6176,7 @@ static int handle_exception(struct kvm_vcpu *vcpu) | ||
415 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))) { | ||
416 | vcpu->arch.dr6 &= ~15; | ||
417 | vcpu->arch.dr6 |= dr6 | DR6_RTM; | ||
418 | - if (!(dr6 & ~DR6_RESERVED)) /* icebp */ | ||
419 | + if (is_icebp(intr_info)) | ||
420 | skip_emulated_instruction(vcpu); | ||
421 | |||
422 | kvm_queue_exception(vcpu, DB_VECTOR); | ||
423 | diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c | ||
424 | index 004abf9ebf12..34cda7e0551b 100644 | ||
425 | --- a/arch/x86/mm/pgtable.c | ||
426 | +++ b/arch/x86/mm/pgtable.c | ||
427 | @@ -702,4 +702,52 @@ int pmd_clear_huge(pmd_t *pmd) | ||
428 | |||
429 | return 0; | ||
430 | } | ||
431 | + | ||
432 | +/** | ||
433 | + * pud_free_pmd_page - Clear pud entry and free pmd page. | ||
434 | + * @pud: Pointer to a PUD. | ||
435 | + * | ||
436 | + * Context: The pud range has been unmaped and TLB purged. | ||
437 | + * Return: 1 if clearing the entry succeeded. 0 otherwise. | ||
438 | + */ | ||
439 | +int pud_free_pmd_page(pud_t *pud) | ||
440 | +{ | ||
441 | + pmd_t *pmd; | ||
442 | + int i; | ||
443 | + | ||
444 | + if (pud_none(*pud)) | ||
445 | + return 1; | ||
446 | + | ||
447 | + pmd = (pmd_t *)pud_page_vaddr(*pud); | ||
448 | + | ||
449 | + for (i = 0; i < PTRS_PER_PMD; i++) | ||
450 | + if (!pmd_free_pte_page(&pmd[i])) | ||
451 | + return 0; | ||
452 | + | ||
453 | + pud_clear(pud); | ||
454 | + free_page((unsigned long)pmd); | ||
455 | + | ||
456 | + return 1; | ||
457 | +} | ||
458 | + | ||
459 | +/** | ||
460 | + * pmd_free_pte_page - Clear pmd entry and free pte page. | ||
461 | + * @pmd: Pointer to a PMD. | ||
462 | + * | ||
463 | + * Context: The pmd range has been unmaped and TLB purged. | ||
464 | + * Return: 1 if clearing the entry succeeded. 0 otherwise. | ||
465 | + */ | ||
466 | +int pmd_free_pte_page(pmd_t *pmd) | ||
467 | +{ | ||
468 | + pte_t *pte; | ||
469 | + | ||
470 | + if (pmd_none(*pmd)) | ||
471 | + return 1; | ||
472 | + | ||
473 | + pte = (pte_t *)pmd_page_vaddr(*pmd); | ||
474 | + pmd_clear(pmd); | ||
475 | + free_page((unsigned long)pte); | ||
476 | + | ||
477 | + return 1; | ||
478 | +} | ||
479 | #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */ | ||
480 | diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c | ||
481 | index 940aac70b4da..bb77606d04e0 100644 | ||
482 | --- a/arch/x86/net/bpf_jit_comp.c | ||
483 | +++ b/arch/x86/net/bpf_jit_comp.c | ||
484 | @@ -1156,7 +1156,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog) | ||
485 | * may converge on the last pass. In such case do one more | ||
486 | * pass to emit the final image | ||
487 | */ | ||
488 | - for (pass = 0; pass < 10 || image; pass++) { | ||
489 | + for (pass = 0; pass < 20 || image; pass++) { | ||
490 | proglen = do_jit(prog, addrs, image, oldproglen, &ctx); | ||
491 | if (proglen <= 0) { | ||
492 | image = NULL; | ||
493 | @@ -1183,6 +1183,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog) | ||
494 | } | ||
495 | } | ||
496 | oldproglen = proglen; | ||
497 | + cond_resched(); | ||
498 | } | ||
499 | |||
500 | if (bpf_jit_enable > 1) | ||
501 | diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c | ||
502 | index ad5d9538f0f9..f7af598c4f55 100644 | ||
503 | --- a/arch/x86/platform/efi/efi_64.c | ||
504 | +++ b/arch/x86/platform/efi/efi_64.c | ||
505 | @@ -227,7 +227,7 @@ int __init efi_alloc_page_tables(void) | ||
506 | if (!pud) { | ||
507 | if (CONFIG_PGTABLE_LEVELS > 4) | ||
508 | free_page((unsigned long) pgd_page_vaddr(*pgd)); | ||
509 | - free_page((unsigned long)efi_pgd); | ||
510 | + free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER); | ||
511 | return -ENOMEM; | ||
512 | } | ||
513 | |||
514 | diff --git a/drivers/acpi/acpi_watchdog.c b/drivers/acpi/acpi_watchdog.c | ||
515 | index 11b113f8e367..ebb626ffb5fa 100644 | ||
516 | --- a/drivers/acpi/acpi_watchdog.c | ||
517 | +++ b/drivers/acpi/acpi_watchdog.c | ||
518 | @@ -74,10 +74,10 @@ void __init acpi_watchdog_init(void) | ||
519 | res.start = gas->address; | ||
520 | if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { | ||
521 | res.flags = IORESOURCE_MEM; | ||
522 | - res.end = res.start + ALIGN(gas->access_width, 4); | ||
523 | + res.end = res.start + ALIGN(gas->access_width, 4) - 1; | ||
524 | } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { | ||
525 | res.flags = IORESOURCE_IO; | ||
526 | - res.end = res.start + gas->access_width; | ||
527 | + res.end = res.start + gas->access_width - 1; | ||
528 | } else { | ||
529 | pr_warn("Unsupported address space: %u\n", | ||
530 | gas->space_id); | ||
531 | diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c | ||
532 | index 917f1cc0fda4..8fb74d9011da 100644 | ||
533 | --- a/drivers/acpi/numa.c | ||
534 | +++ b/drivers/acpi/numa.c | ||
535 | @@ -103,25 +103,27 @@ int acpi_map_pxm_to_node(int pxm) | ||
536 | */ | ||
537 | int acpi_map_pxm_to_online_node(int pxm) | ||
538 | { | ||
539 | - int node, n, dist, min_dist; | ||
540 | + int node, min_node; | ||
541 | |||
542 | node = acpi_map_pxm_to_node(pxm); | ||
543 | |||
544 | if (node == NUMA_NO_NODE) | ||
545 | node = 0; | ||
546 | |||
547 | + min_node = node; | ||
548 | if (!node_online(node)) { | ||
549 | - min_dist = INT_MAX; | ||
550 | + int min_dist = INT_MAX, dist, n; | ||
551 | + | ||
552 | for_each_online_node(n) { | ||
553 | dist = node_distance(node, n); | ||
554 | if (dist < min_dist) { | ||
555 | min_dist = dist; | ||
556 | - node = n; | ||
557 | + min_node = n; | ||
558 | } | ||
559 | } | ||
560 | } | ||
561 | |||
562 | - return node; | ||
563 | + return min_node; | ||
564 | } | ||
565 | EXPORT_SYMBOL(acpi_map_pxm_to_online_node); | ||
566 | |||
567 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c | ||
568 | index bc013f757d5d..18391d0c0cd7 100644 | ||
569 | --- a/drivers/ata/ahci.c | ||
570 | +++ b/drivers/ata/ahci.c | ||
571 | @@ -541,7 +541,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { | ||
572 | .driver_data = board_ahci_yes_fbs }, | ||
573 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230), | ||
574 | .driver_data = board_ahci_yes_fbs }, | ||
575 | - { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642), | ||
576 | + { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642), /* highpoint rocketraid 642L */ | ||
577 | + .driver_data = board_ahci_yes_fbs }, | ||
578 | + { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0645), /* highpoint rocketraid 644L */ | ||
579 | .driver_data = board_ahci_yes_fbs }, | ||
580 | |||
581 | /* Promise */ | ||
582 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
583 | index e7ded346d94b..c6fe2974b336 100644 | ||
584 | --- a/drivers/ata/libata-core.c | ||
585 | +++ b/drivers/ata/libata-core.c | ||
586 | @@ -4520,6 +4520,25 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
587 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, | ||
588 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, | ||
589 | |||
590 | + /* Crucial BX100 SSD 500GB has broken LPM support */ | ||
591 | + { "CT500BX100SSD1", NULL, ATA_HORKAGE_NOLPM }, | ||
592 | + | ||
593 | + /* 512GB MX100 with MU01 firmware has both queued TRIM and LPM issues */ | ||
594 | + { "Crucial_CT512MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | | ||
595 | + ATA_HORKAGE_ZERO_AFTER_TRIM | | ||
596 | + ATA_HORKAGE_NOLPM, }, | ||
597 | + /* 512GB MX100 with newer firmware has only LPM issues */ | ||
598 | + { "Crucial_CT512MX100*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM | | ||
599 | + ATA_HORKAGE_NOLPM, }, | ||
600 | + | ||
601 | + /* 480GB+ M500 SSDs have both queued TRIM and LPM issues */ | ||
602 | + { "Crucial_CT480M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
603 | + ATA_HORKAGE_ZERO_AFTER_TRIM | | ||
604 | + ATA_HORKAGE_NOLPM, }, | ||
605 | + { "Crucial_CT960M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
606 | + ATA_HORKAGE_ZERO_AFTER_TRIM | | ||
607 | + ATA_HORKAGE_NOLPM, }, | ||
608 | + | ||
609 | /* devices that don't properly handle queued TRIM commands */ | ||
610 | { "Micron_M500_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
611 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
612 | @@ -4531,7 +4550,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
613 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
614 | { "Crucial_CT*MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | | ||
615 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
616 | - { "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
617 | + { "Samsung SSD 840*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
618 | + ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
619 | + { "Samsung SSD 850*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
620 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
621 | { "FCCT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
622 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
623 | @@ -5391,8 +5412,7 @@ void ata_qc_issue(struct ata_queued_cmd *qc) | ||
624 | * We guarantee to LLDs that they will have at least one | ||
625 | * non-zero sg if the command is a data command. | ||
626 | */ | ||
627 | - if (WARN_ON_ONCE(ata_is_data(prot) && | ||
628 | - (!qc->sg || !qc->n_elem || !qc->nbytes))) | ||
629 | + if (ata_is_data(prot) && (!qc->sg || !qc->n_elem || !qc->nbytes)) | ||
630 | goto sys_err; | ||
631 | |||
632 | if (ata_is_dma(prot) || (ata_is_pio(prot) && | ||
633 | diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c | ||
634 | index 44ba292f2cd7..4ff69f508e95 100644 | ||
635 | --- a/drivers/ata/libata-scsi.c | ||
636 | +++ b/drivers/ata/libata-scsi.c | ||
637 | @@ -3315,6 +3315,12 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) | ||
638 | goto invalid_fld; | ||
639 | } | ||
640 | |||
641 | + /* We may not issue NCQ commands to devices not supporting NCQ */ | ||
642 | + if (ata_is_ncq(tf->protocol) && !ata_ncq_enabled(dev)) { | ||
643 | + fp = 1; | ||
644 | + goto invalid_fld; | ||
645 | + } | ||
646 | + | ||
647 | /* sanity check for pio multi commands */ | ||
648 | if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf)) { | ||
649 | fp = 1; | ||
650 | @@ -4308,7 +4314,9 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, | ||
651 | if (likely((scsi_op != ATA_16) || !atapi_passthru16)) { | ||
652 | /* relay SCSI command to ATAPI device */ | ||
653 | int len = COMMAND_SIZE(scsi_op); | ||
654 | - if (unlikely(len > scmd->cmd_len || len > dev->cdb_len)) | ||
655 | + if (unlikely(len > scmd->cmd_len || | ||
656 | + len > dev->cdb_len || | ||
657 | + scmd->cmd_len > ATAPI_CDB_LEN)) | ||
658 | goto bad_cdb_len; | ||
659 | |||
660 | xlat_func = atapi_xlat; | ||
661 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
662 | index 673698c7b143..b2c0306f97ed 100644 | ||
663 | --- a/drivers/bluetooth/btusb.c | ||
664 | +++ b/drivers/bluetooth/btusb.c | ||
665 | @@ -235,7 +235,6 @@ static const struct usb_device_id blacklist_table[] = { | ||
666 | { USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 }, | ||
667 | { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 }, | ||
668 | { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 }, | ||
669 | - { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, | ||
670 | { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 }, | ||
671 | { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 }, | ||
672 | { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 }, | ||
673 | @@ -268,6 +267,7 @@ static const struct usb_device_id blacklist_table[] = { | ||
674 | { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 }, | ||
675 | |||
676 | /* QCA ROME chipset */ | ||
677 | + { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_QCA_ROME }, | ||
678 | { USB_DEVICE(0x0cf3, 0xe007), .driver_info = BTUSB_QCA_ROME }, | ||
679 | { USB_DEVICE(0x0cf3, 0xe009), .driver_info = BTUSB_QCA_ROME }, | ||
680 | { USB_DEVICE(0x0cf3, 0xe300), .driver_info = BTUSB_QCA_ROME }, | ||
681 | @@ -388,10 +388,10 @@ static const struct usb_device_id blacklist_table[] = { | ||
682 | */ | ||
683 | static const struct dmi_system_id btusb_needs_reset_resume_table[] = { | ||
684 | { | ||
685 | - /* Lenovo Yoga 920 (QCA Rome device 0cf3:e300) */ | ||
686 | + /* Dell OptiPlex 3060 (QCA ROME device 0cf3:e007) */ | ||
687 | .matches = { | ||
688 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
689 | - DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 920"), | ||
690 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
691 | + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 3060"), | ||
692 | }, | ||
693 | }, | ||
694 | {} | ||
695 | diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c | ||
696 | index 58ce6af8452d..eec52734d6ac 100644 | ||
697 | --- a/drivers/clk/bcm/clk-bcm2835.c | ||
698 | +++ b/drivers/clk/bcm/clk-bcm2835.c | ||
699 | @@ -479,17 +479,17 @@ struct bcm2835_pll_ana_bits { | ||
700 | static const struct bcm2835_pll_ana_bits bcm2835_ana_default = { | ||
701 | .mask0 = 0, | ||
702 | .set0 = 0, | ||
703 | - .mask1 = (u32)~(A2W_PLL_KI_MASK | A2W_PLL_KP_MASK), | ||
704 | + .mask1 = A2W_PLL_KI_MASK | A2W_PLL_KP_MASK, | ||
705 | .set1 = (2 << A2W_PLL_KI_SHIFT) | (8 << A2W_PLL_KP_SHIFT), | ||
706 | - .mask3 = (u32)~A2W_PLL_KA_MASK, | ||
707 | + .mask3 = A2W_PLL_KA_MASK, | ||
708 | .set3 = (2 << A2W_PLL_KA_SHIFT), | ||
709 | .fb_prediv_mask = BIT(14), | ||
710 | }; | ||
711 | |||
712 | static const struct bcm2835_pll_ana_bits bcm2835_ana_pllh = { | ||
713 | - .mask0 = (u32)~(A2W_PLLH_KA_MASK | A2W_PLLH_KI_LOW_MASK), | ||
714 | + .mask0 = A2W_PLLH_KA_MASK | A2W_PLLH_KI_LOW_MASK, | ||
715 | .set0 = (2 << A2W_PLLH_KA_SHIFT) | (2 << A2W_PLLH_KI_LOW_SHIFT), | ||
716 | - .mask1 = (u32)~(A2W_PLLH_KI_HIGH_MASK | A2W_PLLH_KP_MASK), | ||
717 | + .mask1 = A2W_PLLH_KI_HIGH_MASK | A2W_PLLH_KP_MASK, | ||
718 | .set1 = (6 << A2W_PLLH_KP_SHIFT), | ||
719 | .mask3 = 0, | ||
720 | .set3 = 0, | ||
721 | @@ -653,8 +653,10 @@ static int bcm2835_pll_on(struct clk_hw *hw) | ||
722 | ~A2W_PLL_CTRL_PWRDN); | ||
723 | |||
724 | /* Take the PLL out of reset. */ | ||
725 | + spin_lock(&cprman->regs_lock); | ||
726 | cprman_write(cprman, data->cm_ctrl_reg, | ||
727 | cprman_read(cprman, data->cm_ctrl_reg) & ~CM_PLL_ANARST); | ||
728 | + spin_unlock(&cprman->regs_lock); | ||
729 | |||
730 | /* Wait for the PLL to lock. */ | ||
731 | timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS); | ||
732 | @@ -731,9 +733,11 @@ static int bcm2835_pll_set_rate(struct clk_hw *hw, | ||
733 | } | ||
734 | |||
735 | /* Unmask the reference clock from the oscillator. */ | ||
736 | + spin_lock(&cprman->regs_lock); | ||
737 | cprman_write(cprman, A2W_XOSC_CTRL, | ||
738 | cprman_read(cprman, A2W_XOSC_CTRL) | | ||
739 | data->reference_enable_mask); | ||
740 | + spin_unlock(&cprman->regs_lock); | ||
741 | |||
742 | if (do_ana_setup_first) | ||
743 | bcm2835_pll_write_ana(cprman, data->ana_reg_base, ana); | ||
744 | diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c | ||
745 | index 241fb13f1c06..40d5f74cb2ac 100644 | ||
746 | --- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c | ||
747 | +++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c | ||
748 | @@ -750,7 +750,7 @@ static struct ccu_mp out_a_clk = { | ||
749 | .features = CCU_FEATURE_FIXED_PREDIV, | ||
750 | .hw.init = CLK_HW_INIT_PARENTS("out-a", | ||
751 | clk_out_parents, | ||
752 | - &ccu_div_ops, | ||
753 | + &ccu_mp_ops, | ||
754 | 0), | ||
755 | }, | ||
756 | }; | ||
757 | @@ -771,7 +771,7 @@ static struct ccu_mp out_b_clk = { | ||
758 | .features = CCU_FEATURE_FIXED_PREDIV, | ||
759 | .hw.init = CLK_HW_INIT_PARENTS("out-b", | ||
760 | clk_out_parents, | ||
761 | - &ccu_div_ops, | ||
762 | + &ccu_mp_ops, | ||
763 | 0), | ||
764 | }, | ||
765 | }; | ||
766 | @@ -792,7 +792,7 @@ static struct ccu_mp out_c_clk = { | ||
767 | .features = CCU_FEATURE_FIXED_PREDIV, | ||
768 | .hw.init = CLK_HW_INIT_PARENTS("out-c", | ||
769 | clk_out_parents, | ||
770 | - &ccu_div_ops, | ||
771 | + &ccu_mp_ops, | ||
772 | 0), | ||
773 | }, | ||
774 | }; | ||
775 | diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c | ||
776 | index dd4727489b84..c21e10c780ac 100644 | ||
777 | --- a/drivers/gpu/drm/drm_framebuffer.c | ||
778 | +++ b/drivers/gpu/drm/drm_framebuffer.c | ||
779 | @@ -458,6 +458,12 @@ int drm_mode_getfb(struct drm_device *dev, | ||
780 | if (!fb) | ||
781 | return -ENOENT; | ||
782 | |||
783 | + /* Multi-planar framebuffers need getfb2. */ | ||
784 | + if (fb->format->num_planes > 1) { | ||
785 | + ret = -EINVAL; | ||
786 | + goto out; | ||
787 | + } | ||
788 | + | ||
789 | r->height = fb->height; | ||
790 | r->width = fb->width; | ||
791 | r->depth = fb->format->depth; | ||
792 | @@ -481,6 +487,7 @@ int drm_mode_getfb(struct drm_device *dev, | ||
793 | ret = -ENODEV; | ||
794 | } | ||
795 | |||
796 | +out: | ||
797 | drm_framebuffer_put(fb); | ||
798 | |||
799 | return ret; | ||
800 | diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c | ||
801 | index 0422b8c2c2e7..7bcf5702c91c 100644 | ||
802 | --- a/drivers/gpu/drm/drm_syncobj.c | ||
803 | +++ b/drivers/gpu/drm/drm_syncobj.c | ||
804 | @@ -328,28 +328,11 @@ static const struct file_operations drm_syncobj_file_fops = { | ||
805 | .release = drm_syncobj_file_release, | ||
806 | }; | ||
807 | |||
808 | -static int drm_syncobj_alloc_file(struct drm_syncobj *syncobj) | ||
809 | -{ | ||
810 | - struct file *file = anon_inode_getfile("syncobj_file", | ||
811 | - &drm_syncobj_file_fops, | ||
812 | - syncobj, 0); | ||
813 | - if (IS_ERR(file)) | ||
814 | - return PTR_ERR(file); | ||
815 | - | ||
816 | - drm_syncobj_get(syncobj); | ||
817 | - if (cmpxchg(&syncobj->file, NULL, file)) { | ||
818 | - /* lost the race */ | ||
819 | - fput(file); | ||
820 | - } | ||
821 | - | ||
822 | - return 0; | ||
823 | -} | ||
824 | - | ||
825 | static int drm_syncobj_handle_to_fd(struct drm_file *file_private, | ||
826 | u32 handle, int *p_fd) | ||
827 | { | ||
828 | struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle); | ||
829 | - int ret; | ||
830 | + struct file *file; | ||
831 | int fd; | ||
832 | |||
833 | if (!syncobj) | ||
834 | @@ -361,46 +344,40 @@ static int drm_syncobj_handle_to_fd(struct drm_file *file_private, | ||
835 | return fd; | ||
836 | } | ||
837 | |||
838 | - if (!syncobj->file) { | ||
839 | - ret = drm_syncobj_alloc_file(syncobj); | ||
840 | - if (ret) | ||
841 | - goto out_put_fd; | ||
842 | + file = anon_inode_getfile("syncobj_file", | ||
843 | + &drm_syncobj_file_fops, | ||
844 | + syncobj, 0); | ||
845 | + if (IS_ERR(file)) { | ||
846 | + put_unused_fd(fd); | ||
847 | + drm_syncobj_put(syncobj); | ||
848 | + return PTR_ERR(file); | ||
849 | } | ||
850 | - fd_install(fd, syncobj->file); | ||
851 | - drm_syncobj_put(syncobj); | ||
852 | + | ||
853 | + drm_syncobj_get(syncobj); | ||
854 | + fd_install(fd, file); | ||
855 | + | ||
856 | *p_fd = fd; | ||
857 | return 0; | ||
858 | -out_put_fd: | ||
859 | - put_unused_fd(fd); | ||
860 | - drm_syncobj_put(syncobj); | ||
861 | - return ret; | ||
862 | } | ||
863 | |||
864 | -static struct drm_syncobj *drm_syncobj_fdget(int fd) | ||
865 | -{ | ||
866 | - struct file *file = fget(fd); | ||
867 | - | ||
868 | - if (!file) | ||
869 | - return NULL; | ||
870 | - if (file->f_op != &drm_syncobj_file_fops) | ||
871 | - goto err; | ||
872 | - | ||
873 | - return file->private_data; | ||
874 | -err: | ||
875 | - fput(file); | ||
876 | - return NULL; | ||
877 | -}; | ||
878 | - | ||
879 | static int drm_syncobj_fd_to_handle(struct drm_file *file_private, | ||
880 | int fd, u32 *handle) | ||
881 | { | ||
882 | - struct drm_syncobj *syncobj = drm_syncobj_fdget(fd); | ||
883 | + struct drm_syncobj *syncobj; | ||
884 | + struct file *file; | ||
885 | int ret; | ||
886 | |||
887 | - if (!syncobj) | ||
888 | + file = fget(fd); | ||
889 | + if (!file) | ||
890 | + return -EINVAL; | ||
891 | + | ||
892 | + if (file->f_op != &drm_syncobj_file_fops) { | ||
893 | + fput(file); | ||
894 | return -EINVAL; | ||
895 | + } | ||
896 | |||
897 | /* take a reference to put in the idr */ | ||
898 | + syncobj = file->private_data; | ||
899 | drm_syncobj_get(syncobj); | ||
900 | |||
901 | idr_preload(GFP_KERNEL); | ||
902 | @@ -409,12 +386,14 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private, | ||
903 | spin_unlock(&file_private->syncobj_table_lock); | ||
904 | idr_preload_end(); | ||
905 | |||
906 | - if (ret < 0) { | ||
907 | - fput(syncobj->file); | ||
908 | - return ret; | ||
909 | - } | ||
910 | - *handle = ret; | ||
911 | - return 0; | ||
912 | + if (ret > 0) { | ||
913 | + *handle = ret; | ||
914 | + ret = 0; | ||
915 | + } else | ||
916 | + drm_syncobj_put(syncobj); | ||
917 | + | ||
918 | + fput(file); | ||
919 | + return ret; | ||
920 | } | ||
921 | |||
922 | int drm_syncobj_import_sync_file_fence(struct drm_file *file_private, | ||
923 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
924 | index c0da44742988..424cd1b66575 100644 | ||
925 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
926 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
927 | @@ -90,25 +90,18 @@ void radeon_connector_hotplug(struct drm_connector *connector) | ||
928 | /* don't do anything if sink is not display port, i.e., | ||
929 | * passive dp->(dvi|hdmi) adaptor | ||
930 | */ | ||
931 | - if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { | ||
932 | - int saved_dpms = connector->dpms; | ||
933 | - /* Only turn off the display if it's physically disconnected */ | ||
934 | - if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { | ||
935 | - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | ||
936 | - } else if (radeon_dp_needs_link_train(radeon_connector)) { | ||
937 | - /* Don't try to start link training before we | ||
938 | - * have the dpcd */ | ||
939 | - if (!radeon_dp_getdpcd(radeon_connector)) | ||
940 | - return; | ||
941 | - | ||
942 | - /* set it to OFF so that drm_helper_connector_dpms() | ||
943 | - * won't return immediately since the current state | ||
944 | - * is ON at this point. | ||
945 | - */ | ||
946 | - connector->dpms = DRM_MODE_DPMS_OFF; | ||
947 | - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | ||
948 | - } | ||
949 | - connector->dpms = saved_dpms; | ||
950 | + if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT && | ||
951 | + radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) && | ||
952 | + radeon_dp_needs_link_train(radeon_connector)) { | ||
953 | + /* Don't start link training before we have the DPCD */ | ||
954 | + if (!radeon_dp_getdpcd(radeon_connector)) | ||
955 | + return; | ||
956 | + | ||
957 | + /* Turn the connector off and back on immediately, which | ||
958 | + * will trigger link training | ||
959 | + */ | ||
960 | + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | ||
961 | + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | ||
962 | } | ||
963 | } | ||
964 | } | ||
965 | diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c | ||
966 | index b5b335c9b2bb..2ebdc6d5a76e 100644 | ||
967 | --- a/drivers/gpu/drm/udl/udl_fb.c | ||
968 | +++ b/drivers/gpu/drm/udl/udl_fb.c | ||
969 | @@ -159,10 +159,15 @@ static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) | ||
970 | { | ||
971 | unsigned long start = vma->vm_start; | ||
972 | unsigned long size = vma->vm_end - vma->vm_start; | ||
973 | - unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; | ||
974 | + unsigned long offset; | ||
975 | unsigned long page, pos; | ||
976 | |||
977 | - if (offset + size > info->fix.smem_len) | ||
978 | + if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) | ||
979 | + return -EINVAL; | ||
980 | + | ||
981 | + offset = vma->vm_pgoff << PAGE_SHIFT; | ||
982 | + | ||
983 | + if (offset > info->fix.smem_len || size > info->fix.smem_len - offset) | ||
984 | return -EINVAL; | ||
985 | |||
986 | pos = (unsigned long)info->fix.smem_start + offset; | ||
987 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
988 | index 184340d486c3..86d25f18aa99 100644 | ||
989 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
990 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
991 | @@ -1337,6 +1337,19 @@ static void __vmw_svga_disable(struct vmw_private *dev_priv) | ||
992 | */ | ||
993 | void vmw_svga_disable(struct vmw_private *dev_priv) | ||
994 | { | ||
995 | + /* | ||
996 | + * Disabling SVGA will turn off device modesetting capabilities, so | ||
997 | + * notify KMS about that so that it doesn't cache atomic state that | ||
998 | + * isn't valid anymore, for example crtcs turned on. | ||
999 | + * Strictly we'd want to do this under the SVGA lock (or an SVGA mutex), | ||
1000 | + * but vmw_kms_lost_device() takes the reservation sem and thus we'll | ||
1001 | + * end up with lock order reversal. Thus, a master may actually perform | ||
1002 | + * a new modeset just after we call vmw_kms_lost_device() and race with | ||
1003 | + * vmw_svga_disable(), but that should at worst cause atomic KMS state | ||
1004 | + * to be inconsistent with the device, causing modesetting problems. | ||
1005 | + * | ||
1006 | + */ | ||
1007 | + vmw_kms_lost_device(dev_priv->dev); | ||
1008 | ttm_write_lock(&dev_priv->reservation_sem, false); | ||
1009 | spin_lock(&dev_priv->svga_lock); | ||
1010 | if (dev_priv->bdev.man[TTM_PL_VRAM].use_type) { | ||
1011 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | ||
1012 | index 7e5f30e234b1..8c65cc3b0dda 100644 | ||
1013 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | ||
1014 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | ||
1015 | @@ -938,6 +938,7 @@ int vmw_kms_present(struct vmw_private *dev_priv, | ||
1016 | int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, | ||
1017 | struct drm_file *file_priv); | ||
1018 | void vmw_kms_legacy_hotspot_clear(struct vmw_private *dev_priv); | ||
1019 | +void vmw_kms_lost_device(struct drm_device *dev); | ||
1020 | |||
1021 | int vmw_dumb_create(struct drm_file *file_priv, | ||
1022 | struct drm_device *dev, | ||
1023 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1024 | index 62c2f4be8012..9e010f8c36a1 100644 | ||
1025 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1026 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1027 | @@ -31,7 +31,6 @@ | ||
1028 | #include <drm/drm_atomic_helper.h> | ||
1029 | #include <drm/drm_rect.h> | ||
1030 | |||
1031 | - | ||
1032 | /* Might need a hrtimer here? */ | ||
1033 | #define VMWGFX_PRESENT_RATE ((HZ / 60 > 0) ? HZ / 60 : 1) | ||
1034 | |||
1035 | @@ -2531,9 +2530,12 @@ void vmw_kms_helper_buffer_finish(struct vmw_private *dev_priv, | ||
1036 | * Helper to be used if an error forces the caller to undo the actions of | ||
1037 | * vmw_kms_helper_resource_prepare. | ||
1038 | */ | ||
1039 | -void vmw_kms_helper_resource_revert(struct vmw_resource *res) | ||
1040 | +void vmw_kms_helper_resource_revert(struct vmw_validation_ctx *ctx) | ||
1041 | { | ||
1042 | - vmw_kms_helper_buffer_revert(res->backup); | ||
1043 | + struct vmw_resource *res = ctx->res; | ||
1044 | + | ||
1045 | + vmw_kms_helper_buffer_revert(ctx->buf); | ||
1046 | + vmw_dmabuf_unreference(&ctx->buf); | ||
1047 | vmw_resource_unreserve(res, false, NULL, 0); | ||
1048 | mutex_unlock(&res->dev_priv->cmdbuf_mutex); | ||
1049 | } | ||
1050 | @@ -2550,10 +2552,14 @@ void vmw_kms_helper_resource_revert(struct vmw_resource *res) | ||
1051 | * interrupted by a signal. | ||
1052 | */ | ||
1053 | int vmw_kms_helper_resource_prepare(struct vmw_resource *res, | ||
1054 | - bool interruptible) | ||
1055 | + bool interruptible, | ||
1056 | + struct vmw_validation_ctx *ctx) | ||
1057 | { | ||
1058 | int ret = 0; | ||
1059 | |||
1060 | + ctx->buf = NULL; | ||
1061 | + ctx->res = res; | ||
1062 | + | ||
1063 | if (interruptible) | ||
1064 | ret = mutex_lock_interruptible(&res->dev_priv->cmdbuf_mutex); | ||
1065 | else | ||
1066 | @@ -2572,6 +2578,8 @@ int vmw_kms_helper_resource_prepare(struct vmw_resource *res, | ||
1067 | res->dev_priv->has_mob); | ||
1068 | if (ret) | ||
1069 | goto out_unreserve; | ||
1070 | + | ||
1071 | + ctx->buf = vmw_dmabuf_reference(res->backup); | ||
1072 | } | ||
1073 | ret = vmw_resource_validate(res); | ||
1074 | if (ret) | ||
1075 | @@ -2579,7 +2587,7 @@ int vmw_kms_helper_resource_prepare(struct vmw_resource *res, | ||
1076 | return 0; | ||
1077 | |||
1078 | out_revert: | ||
1079 | - vmw_kms_helper_buffer_revert(res->backup); | ||
1080 | + vmw_kms_helper_buffer_revert(ctx->buf); | ||
1081 | out_unreserve: | ||
1082 | vmw_resource_unreserve(res, false, NULL, 0); | ||
1083 | out_unlock: | ||
1084 | @@ -2595,11 +2603,13 @@ int vmw_kms_helper_resource_prepare(struct vmw_resource *res, | ||
1085 | * @out_fence: Optional pointer to a fence pointer. If non-NULL, a | ||
1086 | * ref-counted fence pointer is returned here. | ||
1087 | */ | ||
1088 | -void vmw_kms_helper_resource_finish(struct vmw_resource *res, | ||
1089 | - struct vmw_fence_obj **out_fence) | ||
1090 | +void vmw_kms_helper_resource_finish(struct vmw_validation_ctx *ctx, | ||
1091 | + struct vmw_fence_obj **out_fence) | ||
1092 | { | ||
1093 | - if (res->backup || out_fence) | ||
1094 | - vmw_kms_helper_buffer_finish(res->dev_priv, NULL, res->backup, | ||
1095 | + struct vmw_resource *res = ctx->res; | ||
1096 | + | ||
1097 | + if (ctx->buf || out_fence) | ||
1098 | + vmw_kms_helper_buffer_finish(res->dev_priv, NULL, ctx->buf, | ||
1099 | out_fence, NULL); | ||
1100 | |||
1101 | vmw_resource_unreserve(res, false, NULL, 0); | ||
1102 | @@ -2865,3 +2875,14 @@ int vmw_kms_set_config(struct drm_mode_set *set, | ||
1103 | |||
1104 | return drm_atomic_helper_set_config(set, ctx); | ||
1105 | } | ||
1106 | + | ||
1107 | + | ||
1108 | +/** | ||
1109 | + * vmw_kms_lost_device - Notify kms that modesetting capabilities will be lost | ||
1110 | + * | ||
1111 | + * @dev: Pointer to the drm device | ||
1112 | + */ | ||
1113 | +void vmw_kms_lost_device(struct drm_device *dev) | ||
1114 | +{ | ||
1115 | + drm_atomic_helper_shutdown(dev); | ||
1116 | +} | ||
1117 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | ||
1118 | index cd9da2dd79af..3d2ca280eaa7 100644 | ||
1119 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | ||
1120 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | ||
1121 | @@ -240,6 +240,11 @@ struct vmw_display_unit { | ||
1122 | int set_gui_y; | ||
1123 | }; | ||
1124 | |||
1125 | +struct vmw_validation_ctx { | ||
1126 | + struct vmw_resource *res; | ||
1127 | + struct vmw_dma_buffer *buf; | ||
1128 | +}; | ||
1129 | + | ||
1130 | #define vmw_crtc_to_du(x) \ | ||
1131 | container_of(x, struct vmw_display_unit, crtc) | ||
1132 | #define vmw_connector_to_du(x) \ | ||
1133 | @@ -296,9 +301,10 @@ void vmw_kms_helper_buffer_finish(struct vmw_private *dev_priv, | ||
1134 | struct drm_vmw_fence_rep __user * | ||
1135 | user_fence_rep); | ||
1136 | int vmw_kms_helper_resource_prepare(struct vmw_resource *res, | ||
1137 | - bool interruptible); | ||
1138 | -void vmw_kms_helper_resource_revert(struct vmw_resource *res); | ||
1139 | -void vmw_kms_helper_resource_finish(struct vmw_resource *res, | ||
1140 | + bool interruptible, | ||
1141 | + struct vmw_validation_ctx *ctx); | ||
1142 | +void vmw_kms_helper_resource_revert(struct vmw_validation_ctx *ctx); | ||
1143 | +void vmw_kms_helper_resource_finish(struct vmw_validation_ctx *ctx, | ||
1144 | struct vmw_fence_obj **out_fence); | ||
1145 | int vmw_kms_readback(struct vmw_private *dev_priv, | ||
1146 | struct drm_file *file_priv, | ||
1147 | @@ -439,5 +445,4 @@ int vmw_kms_stdu_dma(struct vmw_private *dev_priv, | ||
1148 | |||
1149 | int vmw_kms_set_config(struct drm_mode_set *set, | ||
1150 | struct drm_modeset_acquire_ctx *ctx); | ||
1151 | - | ||
1152 | #endif | ||
1153 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | ||
1154 | index 7ae38a67388c..aacce4753a62 100644 | ||
1155 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | ||
1156 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | ||
1157 | @@ -909,12 +909,13 @@ int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv, | ||
1158 | struct vmw_framebuffer_surface *vfbs = | ||
1159 | container_of(framebuffer, typeof(*vfbs), base); | ||
1160 | struct vmw_kms_sou_surface_dirty sdirty; | ||
1161 | + struct vmw_validation_ctx ctx; | ||
1162 | int ret; | ||
1163 | |||
1164 | if (!srf) | ||
1165 | srf = &vfbs->surface->res; | ||
1166 | |||
1167 | - ret = vmw_kms_helper_resource_prepare(srf, true); | ||
1168 | + ret = vmw_kms_helper_resource_prepare(srf, true, &ctx); | ||
1169 | if (ret) | ||
1170 | return ret; | ||
1171 | |||
1172 | @@ -933,7 +934,7 @@ int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv, | ||
1173 | ret = vmw_kms_helper_dirty(dev_priv, framebuffer, clips, vclips, | ||
1174 | dest_x, dest_y, num_clips, inc, | ||
1175 | &sdirty.base); | ||
1176 | - vmw_kms_helper_resource_finish(srf, out_fence); | ||
1177 | + vmw_kms_helper_resource_finish(&ctx, out_fence); | ||
1178 | |||
1179 | return ret; | ||
1180 | } | ||
1181 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | ||
1182 | index 4dee05b15552..6c576f8df4b2 100644 | ||
1183 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | ||
1184 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | ||
1185 | @@ -980,12 +980,13 @@ int vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv, | ||
1186 | struct vmw_framebuffer_surface *vfbs = | ||
1187 | container_of(framebuffer, typeof(*vfbs), base); | ||
1188 | struct vmw_stdu_dirty sdirty; | ||
1189 | + struct vmw_validation_ctx ctx; | ||
1190 | int ret; | ||
1191 | |||
1192 | if (!srf) | ||
1193 | srf = &vfbs->surface->res; | ||
1194 | |||
1195 | - ret = vmw_kms_helper_resource_prepare(srf, true); | ||
1196 | + ret = vmw_kms_helper_resource_prepare(srf, true, &ctx); | ||
1197 | if (ret) | ||
1198 | return ret; | ||
1199 | |||
1200 | @@ -1008,7 +1009,7 @@ int vmw_kms_stdu_surface_dirty(struct vmw_private *dev_priv, | ||
1201 | dest_x, dest_y, num_clips, inc, | ||
1202 | &sdirty.base); | ||
1203 | out_finish: | ||
1204 | - vmw_kms_helper_resource_finish(srf, out_fence); | ||
1205 | + vmw_kms_helper_resource_finish(&ctx, out_fence); | ||
1206 | |||
1207 | return ret; | ||
1208 | } | ||
1209 | diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c | ||
1210 | index 12eb8caa4263..3f8dde8d59ba 100644 | ||
1211 | --- a/drivers/hv/ring_buffer.c | ||
1212 | +++ b/drivers/hv/ring_buffer.c | ||
1213 | @@ -394,13 +394,24 @@ __hv_pkt_iter_next(struct vmbus_channel *channel, | ||
1214 | } | ||
1215 | EXPORT_SYMBOL_GPL(__hv_pkt_iter_next); | ||
1216 | |||
1217 | +/* How many bytes were read in this iterator cycle */ | ||
1218 | +static u32 hv_pkt_iter_bytes_read(const struct hv_ring_buffer_info *rbi, | ||
1219 | + u32 start_read_index) | ||
1220 | +{ | ||
1221 | + if (rbi->priv_read_index >= start_read_index) | ||
1222 | + return rbi->priv_read_index - start_read_index; | ||
1223 | + else | ||
1224 | + return rbi->ring_datasize - start_read_index + | ||
1225 | + rbi->priv_read_index; | ||
1226 | +} | ||
1227 | + | ||
1228 | /* | ||
1229 | * Update host ring buffer after iterating over packets. | ||
1230 | */ | ||
1231 | void hv_pkt_iter_close(struct vmbus_channel *channel) | ||
1232 | { | ||
1233 | struct hv_ring_buffer_info *rbi = &channel->inbound; | ||
1234 | - u32 orig_write_sz = hv_get_bytes_to_write(rbi); | ||
1235 | + u32 curr_write_sz, pending_sz, bytes_read, start_read_index; | ||
1236 | |||
1237 | /* | ||
1238 | * Make sure all reads are done before we update the read index since | ||
1239 | @@ -408,8 +419,12 @@ void hv_pkt_iter_close(struct vmbus_channel *channel) | ||
1240 | * is updated. | ||
1241 | */ | ||
1242 | virt_rmb(); | ||
1243 | + start_read_index = rbi->ring_buffer->read_index; | ||
1244 | rbi->ring_buffer->read_index = rbi->priv_read_index; | ||
1245 | |||
1246 | + if (!rbi->ring_buffer->feature_bits.feat_pending_send_sz) | ||
1247 | + return; | ||
1248 | + | ||
1249 | /* | ||
1250 | * Issue a full memory barrier before making the signaling decision. | ||
1251 | * Here is the reason for having this barrier: | ||
1252 | @@ -423,26 +438,29 @@ void hv_pkt_iter_close(struct vmbus_channel *channel) | ||
1253 | */ | ||
1254 | virt_mb(); | ||
1255 | |||
1256 | - /* If host has disabled notifications then skip */ | ||
1257 | - if (rbi->ring_buffer->interrupt_mask) | ||
1258 | + pending_sz = READ_ONCE(rbi->ring_buffer->pending_send_sz); | ||
1259 | + if (!pending_sz) | ||
1260 | return; | ||
1261 | |||
1262 | - if (rbi->ring_buffer->feature_bits.feat_pending_send_sz) { | ||
1263 | - u32 pending_sz = READ_ONCE(rbi->ring_buffer->pending_send_sz); | ||
1264 | + /* | ||
1265 | + * Ensure the read of write_index in hv_get_bytes_to_write() | ||
1266 | + * happens after the read of pending_send_sz. | ||
1267 | + */ | ||
1268 | + virt_rmb(); | ||
1269 | + curr_write_sz = hv_get_bytes_to_write(rbi); | ||
1270 | + bytes_read = hv_pkt_iter_bytes_read(rbi, start_read_index); | ||
1271 | |||
1272 | - /* | ||
1273 | - * If there was space before we began iteration, | ||
1274 | - * then host was not blocked. Also handles case where | ||
1275 | - * pending_sz is zero then host has nothing pending | ||
1276 | - * and does not need to be signaled. | ||
1277 | - */ | ||
1278 | - if (orig_write_sz > pending_sz) | ||
1279 | - return; | ||
1280 | + /* | ||
1281 | + * If there was space before we began iteration, | ||
1282 | + * then host was not blocked. | ||
1283 | + */ | ||
1284 | |||
1285 | - /* If pending write will not fit, don't give false hope. */ | ||
1286 | - if (hv_get_bytes_to_write(rbi) < pending_sz) | ||
1287 | - return; | ||
1288 | - } | ||
1289 | + if (curr_write_sz - bytes_read > pending_sz) | ||
1290 | + return; | ||
1291 | + | ||
1292 | + /* If pending write will not fit, don't give false hope. */ | ||
1293 | + if (curr_write_sz <= pending_sz) | ||
1294 | + return; | ||
1295 | |||
1296 | vmbus_setevent(channel); | ||
1297 | } | ||
1298 | diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c | ||
1299 | index 379de1829cdb..bef1f96c177c 100644 | ||
1300 | --- a/drivers/iio/accel/st_accel_core.c | ||
1301 | +++ b/drivers/iio/accel/st_accel_core.c | ||
1302 | @@ -794,7 +794,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev) | ||
1303 | if (!pdata) | ||
1304 | pdata = (struct st_sensors_platform_data *)&default_accel_pdata; | ||
1305 | |||
1306 | - err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data); | ||
1307 | + err = st_sensors_init_sensor(indio_dev, pdata); | ||
1308 | if (err < 0) | ||
1309 | goto st_accel_power_off; | ||
1310 | |||
1311 | diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c | ||
1312 | index 7dc7d297a0fc..11484cb38b84 100644 | ||
1313 | --- a/drivers/iio/adc/meson_saradc.c | ||
1314 | +++ b/drivers/iio/adc/meson_saradc.c | ||
1315 | @@ -462,8 +462,10 @@ static int meson_sar_adc_lock(struct iio_dev *indio_dev) | ||
1316 | regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val); | ||
1317 | } while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--); | ||
1318 | |||
1319 | - if (timeout < 0) | ||
1320 | + if (timeout < 0) { | ||
1321 | + mutex_unlock(&indio_dev->mlock); | ||
1322 | return -ETIMEDOUT; | ||
1323 | + } | ||
1324 | } | ||
1325 | |||
1326 | return 0; | ||
1327 | diff --git a/drivers/iio/chemical/ccs811.c b/drivers/iio/chemical/ccs811.c | ||
1328 | index 8cfac6d1cec4..9dd0e1cd93dd 100644 | ||
1329 | --- a/drivers/iio/chemical/ccs811.c | ||
1330 | +++ b/drivers/iio/chemical/ccs811.c | ||
1331 | @@ -128,6 +128,9 @@ static int ccs811_start_sensor_application(struct i2c_client *client) | ||
1332 | if (ret < 0) | ||
1333 | return ret; | ||
1334 | |||
1335 | + if ((ret & CCS811_STATUS_FW_MODE_APPLICATION)) | ||
1336 | + return 0; | ||
1337 | + | ||
1338 | if ((ret & CCS811_STATUS_APP_VALID_MASK) != | ||
1339 | CCS811_STATUS_APP_VALID_LOADED) | ||
1340 | return -EIO; | ||
1341 | diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | ||
1342 | index b485540da89e..cce0c93accef 100644 | ||
1343 | --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | ||
1344 | +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | ||
1345 | @@ -392,7 +392,7 @@ static int st_lsm6dsx_read_oneshot(struct st_lsm6dsx_sensor *sensor, | ||
1346 | |||
1347 | st_lsm6dsx_sensor_disable(sensor); | ||
1348 | |||
1349 | - *val = (s16)data; | ||
1350 | + *val = (s16)le16_to_cpu(data); | ||
1351 | |||
1352 | return IIO_VAL_INT; | ||
1353 | } | ||
1354 | diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c | ||
1355 | index ea075fcd5a6f..ec5ca03529b5 100644 | ||
1356 | --- a/drivers/iio/pressure/st_pressure_core.c | ||
1357 | +++ b/drivers/iio/pressure/st_pressure_core.c | ||
1358 | @@ -617,7 +617,7 @@ int st_press_common_probe(struct iio_dev *indio_dev) | ||
1359 | if (!pdata && press_data->sensor_settings->drdy_irq.addr) | ||
1360 | pdata = (struct st_sensors_platform_data *)&default_press_pdata; | ||
1361 | |||
1362 | - err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data); | ||
1363 | + err = st_sensors_init_sensor(indio_dev, pdata); | ||
1364 | if (err < 0) | ||
1365 | goto st_press_power_off; | ||
1366 | |||
1367 | diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c | ||
1368 | index cef05ab83496..6d48d8a93b62 100644 | ||
1369 | --- a/drivers/infiniband/hw/mlx5/mr.c | ||
1370 | +++ b/drivers/infiniband/hw/mlx5/mr.c | ||
1371 | @@ -838,7 +838,8 @@ static int mr_umem_get(struct ib_pd *pd, u64 start, u64 length, | ||
1372 | *umem = ib_umem_get(pd->uobject->context, start, length, | ||
1373 | access_flags, 0); | ||
1374 | err = PTR_ERR_OR_ZERO(*umem); | ||
1375 | - if (err < 0) { | ||
1376 | + if (err) { | ||
1377 | + *umem = NULL; | ||
1378 | mlx5_ib_err(dev, "umem get failed (%d)\n", err); | ||
1379 | return err; | ||
1380 | } | ||
1381 | @@ -1415,6 +1416,7 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, | ||
1382 | if (err) { | ||
1383 | mlx5_ib_warn(dev, "Failed to rereg UMR\n"); | ||
1384 | ib_umem_release(mr->umem); | ||
1385 | + mr->umem = NULL; | ||
1386 | clean_mr(dev, mr); | ||
1387 | return err; | ||
1388 | } | ||
1389 | @@ -1498,14 +1500,11 @@ static int clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) | ||
1390 | u32 key = mr->mmkey.key; | ||
1391 | |||
1392 | err = destroy_mkey(dev, mr); | ||
1393 | - kfree(mr); | ||
1394 | if (err) { | ||
1395 | mlx5_ib_warn(dev, "failed to destroy mkey 0x%x (%d)\n", | ||
1396 | key, err); | ||
1397 | return err; | ||
1398 | } | ||
1399 | - } else { | ||
1400 | - mlx5_mr_cache_free(dev, mr); | ||
1401 | } | ||
1402 | |||
1403 | return 0; | ||
1404 | @@ -1548,6 +1547,11 @@ static int dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) | ||
1405 | atomic_sub(npages, &dev->mdev->priv.reg_pages); | ||
1406 | } | ||
1407 | |||
1408 | + if (!mr->allocated_from_cache) | ||
1409 | + kfree(mr); | ||
1410 | + else | ||
1411 | + mlx5_mr_cache_free(dev, mr); | ||
1412 | + | ||
1413 | return 0; | ||
1414 | } | ||
1415 | |||
1416 | diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c | ||
1417 | index 9c6f2ce3b710..4281fdc0a13c 100644 | ||
1418 | --- a/drivers/mmc/core/block.c | ||
1419 | +++ b/drivers/mmc/core/block.c | ||
1420 | @@ -65,6 +65,7 @@ MODULE_ALIAS("mmc:block"); | ||
1421 | #define MMC_BLK_TIMEOUT_MS (10 * 60 * 1000) /* 10 minute timeout */ | ||
1422 | #define MMC_SANITIZE_REQ_TIMEOUT 240000 | ||
1423 | #define MMC_EXTRACT_INDEX_FROM_ARG(x) ((x & 0x00FF0000) >> 16) | ||
1424 | +#define MMC_EXTRACT_VALUE_FROM_ARG(x) ((x & 0x0000FF00) >> 8) | ||
1425 | |||
1426 | #define mmc_req_rel_wr(req) ((req->cmd_flags & REQ_FUA) && \ | ||
1427 | (rq_data_dir(req) == WRITE)) | ||
1428 | @@ -538,6 +539,24 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md, | ||
1429 | return data.error; | ||
1430 | } | ||
1431 | |||
1432 | + /* | ||
1433 | + * Make sure the cache of the PARTITION_CONFIG register and | ||
1434 | + * PARTITION_ACCESS bits is updated in case the ioctl ext_csd write | ||
1435 | + * changed it successfully. | ||
1436 | + */ | ||
1437 | + if ((MMC_EXTRACT_INDEX_FROM_ARG(cmd.arg) == EXT_CSD_PART_CONFIG) && | ||
1438 | + (cmd.opcode == MMC_SWITCH)) { | ||
1439 | + struct mmc_blk_data *main_md = dev_get_drvdata(&card->dev); | ||
1440 | + u8 value = MMC_EXTRACT_VALUE_FROM_ARG(cmd.arg); | ||
1441 | + | ||
1442 | + /* | ||
1443 | + * Update cache so the next mmc_blk_part_switch call operates | ||
1444 | + * on up-to-date data. | ||
1445 | + */ | ||
1446 | + card->ext_csd.part_config = value; | ||
1447 | + main_md->part_curr = value & EXT_CSD_PART_CONFIG_ACC_MASK; | ||
1448 | + } | ||
1449 | + | ||
1450 | /* | ||
1451 | * According to the SD specs, some commands require a delay after | ||
1452 | * issuing the command. | ||
1453 | diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h | ||
1454 | index 79a5b985ccf5..9c821eedd156 100644 | ||
1455 | --- a/drivers/mmc/core/card.h | ||
1456 | +++ b/drivers/mmc/core/card.h | ||
1457 | @@ -82,6 +82,7 @@ struct mmc_fixup { | ||
1458 | #define CID_MANFID_APACER 0x27 | ||
1459 | #define CID_MANFID_KINGSTON 0x70 | ||
1460 | #define CID_MANFID_HYNIX 0x90 | ||
1461 | +#define CID_MANFID_NUMONYX 0xFE | ||
1462 | |||
1463 | #define END_FIXUP { NULL } | ||
1464 | |||
1465 | diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h | ||
1466 | index 75d317623852..5153577754f0 100644 | ||
1467 | --- a/drivers/mmc/core/quirks.h | ||
1468 | +++ b/drivers/mmc/core/quirks.h | ||
1469 | @@ -109,6 +109,12 @@ static const struct mmc_fixup mmc_ext_csd_fixups[] = { | ||
1470 | */ | ||
1471 | MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX, | ||
1472 | 0x014a, add_quirk, MMC_QUIRK_BROKEN_HPI, 5), | ||
1473 | + /* | ||
1474 | + * Certain Micron (Numonyx) eMMC 4.5 cards might get broken when HPI | ||
1475 | + * feature is used so disable the HPI feature for such buggy cards. | ||
1476 | + */ | ||
1477 | + MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_NUMONYX, | ||
1478 | + 0x014e, add_quirk, MMC_QUIRK_BROKEN_HPI, 6), | ||
1479 | |||
1480 | END_FIXUP | ||
1481 | }; | ||
1482 | diff --git a/drivers/mmc/host/dw_mmc-exynos.c b/drivers/mmc/host/dw_mmc-exynos.c | ||
1483 | index fa41d9422d57..a84aa3f1ae85 100644 | ||
1484 | --- a/drivers/mmc/host/dw_mmc-exynos.c | ||
1485 | +++ b/drivers/mmc/host/dw_mmc-exynos.c | ||
1486 | @@ -165,9 +165,15 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing) | ||
1487 | static int dw_mci_exynos_runtime_resume(struct device *dev) | ||
1488 | { | ||
1489 | struct dw_mci *host = dev_get_drvdata(dev); | ||
1490 | + int ret; | ||
1491 | + | ||
1492 | + ret = dw_mci_runtime_resume(dev); | ||
1493 | + if (ret) | ||
1494 | + return ret; | ||
1495 | |||
1496 | dw_mci_exynos_config_smu(host); | ||
1497 | - return dw_mci_runtime_resume(dev); | ||
1498 | + | ||
1499 | + return ret; | ||
1500 | } | ||
1501 | |||
1502 | /** | ||
1503 | diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c | ||
1504 | index 60341a814055..de31e20dc56c 100644 | ||
1505 | --- a/drivers/mmc/host/dw_mmc.c | ||
1506 | +++ b/drivers/mmc/host/dw_mmc.c | ||
1507 | @@ -413,7 +413,9 @@ static inline void dw_mci_set_cto(struct dw_mci *host) | ||
1508 | cto_div = (mci_readl(host, CLKDIV) & 0xff) * 2; | ||
1509 | if (cto_div == 0) | ||
1510 | cto_div = 1; | ||
1511 | - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); | ||
1512 | + | ||
1513 | + cto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * cto_clks * cto_div, | ||
1514 | + host->bus_hz); | ||
1515 | |||
1516 | /* add a bit spare time */ | ||
1517 | cto_ms += 10; | ||
1518 | @@ -562,6 +564,7 @@ static int dw_mci_idmac_init(struct dw_mci *host) | ||
1519 | (sizeof(struct idmac_desc_64addr) * | ||
1520 | (i + 1))) >> 32; | ||
1521 | /* Initialize reserved and buffer size fields to "0" */ | ||
1522 | + p->des0 = 0; | ||
1523 | p->des1 = 0; | ||
1524 | p->des2 = 0; | ||
1525 | p->des3 = 0; | ||
1526 | @@ -584,6 +587,7 @@ static int dw_mci_idmac_init(struct dw_mci *host) | ||
1527 | i++, p++) { | ||
1528 | p->des3 = cpu_to_le32(host->sg_dma + | ||
1529 | (sizeof(struct idmac_desc) * (i + 1))); | ||
1530 | + p->des0 = 0; | ||
1531 | p->des1 = 0; | ||
1532 | } | ||
1533 | |||
1534 | @@ -1799,8 +1803,8 @@ static bool dw_mci_reset(struct dw_mci *host) | ||
1535 | } | ||
1536 | |||
1537 | if (host->use_dma == TRANS_MODE_IDMAC) | ||
1538 | - /* It is also recommended that we reset and reprogram idmac */ | ||
1539 | - dw_mci_idmac_reset(host); | ||
1540 | + /* It is also required that we reinit idmac */ | ||
1541 | + dw_mci_idmac_init(host); | ||
1542 | |||
1543 | ret = true; | ||
1544 | |||
1545 | @@ -1947,8 +1951,9 @@ static void dw_mci_set_drto(struct dw_mci *host) | ||
1546 | drto_div = (mci_readl(host, CLKDIV) & 0xff) * 2; | ||
1547 | if (drto_div == 0) | ||
1548 | drto_div = 1; | ||
1549 | - drto_ms = DIV_ROUND_UP(MSEC_PER_SEC * drto_clks * drto_div, | ||
1550 | - host->bus_hz); | ||
1551 | + | ||
1552 | + drto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * drto_clks * drto_div, | ||
1553 | + host->bus_hz); | ||
1554 | |||
1555 | /* add a bit spare time */ | ||
1556 | drto_ms += 10; | ||
1557 | diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c | ||
1558 | index 3568294d4854..b25f444c5914 100644 | ||
1559 | --- a/drivers/mtd/mtdchar.c | ||
1560 | +++ b/drivers/mtd/mtdchar.c | ||
1561 | @@ -487,7 +487,7 @@ static int shrink_ecclayout(struct mtd_info *mtd, | ||
1562 | for (i = 0; i < MTD_MAX_ECCPOS_ENTRIES;) { | ||
1563 | u32 eccpos; | ||
1564 | |||
1565 | - ret = mtd_ooblayout_ecc(mtd, section, &oobregion); | ||
1566 | + ret = mtd_ooblayout_ecc(mtd, section++, &oobregion); | ||
1567 | if (ret < 0) { | ||
1568 | if (ret != -ERANGE) | ||
1569 | return ret; | ||
1570 | @@ -534,7 +534,7 @@ static int get_oobinfo(struct mtd_info *mtd, struct nand_oobinfo *to) | ||
1571 | for (i = 0; i < ARRAY_SIZE(to->eccpos);) { | ||
1572 | u32 eccpos; | ||
1573 | |||
1574 | - ret = mtd_ooblayout_ecc(mtd, section, &oobregion); | ||
1575 | + ret = mtd_ooblayout_ecc(mtd, section++, &oobregion); | ||
1576 | if (ret < 0) { | ||
1577 | if (ret != -ERANGE) | ||
1578 | return ret; | ||
1579 | diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c | ||
1580 | index bbdd68a54d68..4005b427023c 100644 | ||
1581 | --- a/drivers/mtd/nand/fsl_ifc_nand.c | ||
1582 | +++ b/drivers/mtd/nand/fsl_ifc_nand.c | ||
1583 | @@ -173,14 +173,9 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob) | ||
1584 | |||
1585 | /* returns nonzero if entire page is blank */ | ||
1586 | static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl, | ||
1587 | - u32 *eccstat, unsigned int bufnum) | ||
1588 | + u32 eccstat, unsigned int bufnum) | ||
1589 | { | ||
1590 | - u32 reg = eccstat[bufnum / 4]; | ||
1591 | - int errors; | ||
1592 | - | ||
1593 | - errors = (reg >> ((3 - bufnum % 4) * 8)) & 15; | ||
1594 | - | ||
1595 | - return errors; | ||
1596 | + return (eccstat >> ((3 - bufnum % 4) * 8)) & 15; | ||
1597 | } | ||
1598 | |||
1599 | /* | ||
1600 | @@ -193,7 +188,7 @@ static void fsl_ifc_run_command(struct mtd_info *mtd) | ||
1601 | struct fsl_ifc_ctrl *ctrl = priv->ctrl; | ||
1602 | struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl; | ||
1603 | struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs; | ||
1604 | - u32 eccstat[4]; | ||
1605 | + u32 eccstat; | ||
1606 | int i; | ||
1607 | |||
1608 | /* set the chip select for NAND Transaction */ | ||
1609 | @@ -228,19 +223,17 @@ static void fsl_ifc_run_command(struct mtd_info *mtd) | ||
1610 | if (nctrl->eccread) { | ||
1611 | int errors; | ||
1612 | int bufnum = nctrl->page & priv->bufnum_mask; | ||
1613 | - int sector = bufnum * chip->ecc.steps; | ||
1614 | - int sector_end = sector + chip->ecc.steps - 1; | ||
1615 | + int sector_start = bufnum * chip->ecc.steps; | ||
1616 | + int sector_end = sector_start + chip->ecc.steps - 1; | ||
1617 | __be32 *eccstat_regs; | ||
1618 | |||
1619 | - if (ctrl->version >= FSL_IFC_VERSION_2_0_0) | ||
1620 | - eccstat_regs = ifc->ifc_nand.v2_nand_eccstat; | ||
1621 | - else | ||
1622 | - eccstat_regs = ifc->ifc_nand.v1_nand_eccstat; | ||
1623 | + eccstat_regs = ifc->ifc_nand.nand_eccstat; | ||
1624 | + eccstat = ifc_in32(&eccstat_regs[sector_start / 4]); | ||
1625 | |||
1626 | - for (i = sector / 4; i <= sector_end / 4; i++) | ||
1627 | - eccstat[i] = ifc_in32(&eccstat_regs[i]); | ||
1628 | + for (i = sector_start; i <= sector_end; i++) { | ||
1629 | + if (i != sector_start && !(i % 4)) | ||
1630 | + eccstat = ifc_in32(&eccstat_regs[i / 4]); | ||
1631 | |||
1632 | - for (i = sector; i <= sector_end; i++) { | ||
1633 | errors = check_read_ecc(mtd, ctrl, eccstat, i); | ||
1634 | |||
1635 | if (errors == 15) { | ||
1636 | @@ -626,6 +619,7 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip) | ||
1637 | struct fsl_ifc_ctrl *ctrl = priv->ctrl; | ||
1638 | struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs; | ||
1639 | u32 nand_fsr; | ||
1640 | + int status; | ||
1641 | |||
1642 | /* Use READ_STATUS command, but wait for the device to be ready */ | ||
1643 | ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) | | ||
1644 | @@ -640,12 +634,12 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip) | ||
1645 | fsl_ifc_run_command(mtd); | ||
1646 | |||
1647 | nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr); | ||
1648 | - | ||
1649 | + status = nand_fsr >> 24; | ||
1650 | /* | ||
1651 | * The chip always seems to report that it is | ||
1652 | * write-protected, even when it is not. | ||
1653 | */ | ||
1654 | - return nand_fsr | NAND_STATUS_WP; | ||
1655 | + return status | NAND_STATUS_WP; | ||
1656 | } | ||
1657 | |||
1658 | /* | ||
1659 | diff --git a/drivers/net/can/cc770/cc770.c b/drivers/net/can/cc770/cc770.c | ||
1660 | index 1e37313054f3..6da69af103e6 100644 | ||
1661 | --- a/drivers/net/can/cc770/cc770.c | ||
1662 | +++ b/drivers/net/can/cc770/cc770.c | ||
1663 | @@ -390,37 +390,23 @@ static int cc770_get_berr_counter(const struct net_device *dev, | ||
1664 | return 0; | ||
1665 | } | ||
1666 | |||
1667 | -static netdev_tx_t cc770_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1668 | +static void cc770_tx(struct net_device *dev, int mo) | ||
1669 | { | ||
1670 | struct cc770_priv *priv = netdev_priv(dev); | ||
1671 | - struct net_device_stats *stats = &dev->stats; | ||
1672 | - struct can_frame *cf = (struct can_frame *)skb->data; | ||
1673 | - unsigned int mo = obj2msgobj(CC770_OBJ_TX); | ||
1674 | + struct can_frame *cf = (struct can_frame *)priv->tx_skb->data; | ||
1675 | u8 dlc, rtr; | ||
1676 | u32 id; | ||
1677 | int i; | ||
1678 | |||
1679 | - if (can_dropped_invalid_skb(dev, skb)) | ||
1680 | - return NETDEV_TX_OK; | ||
1681 | - | ||
1682 | - if ((cc770_read_reg(priv, | ||
1683 | - msgobj[mo].ctrl1) & TXRQST_UNC) == TXRQST_SET) { | ||
1684 | - netdev_err(dev, "TX register is still occupied!\n"); | ||
1685 | - return NETDEV_TX_BUSY; | ||
1686 | - } | ||
1687 | - | ||
1688 | - netif_stop_queue(dev); | ||
1689 | - | ||
1690 | dlc = cf->can_dlc; | ||
1691 | id = cf->can_id; | ||
1692 | - if (cf->can_id & CAN_RTR_FLAG) | ||
1693 | - rtr = 0; | ||
1694 | - else | ||
1695 | - rtr = MSGCFG_DIR; | ||
1696 | + rtr = cf->can_id & CAN_RTR_FLAG ? 0 : MSGCFG_DIR; | ||
1697 | + | ||
1698 | + cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
1699 | + MSGVAL_RES | TXIE_RES | RXIE_RES | INTPND_RES); | ||
1700 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
1701 | RMTPND_RES | TXRQST_RES | CPUUPD_SET | NEWDAT_RES); | ||
1702 | - cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
1703 | - MSGVAL_SET | TXIE_SET | RXIE_RES | INTPND_RES); | ||
1704 | + | ||
1705 | if (id & CAN_EFF_FLAG) { | ||
1706 | id &= CAN_EFF_MASK; | ||
1707 | cc770_write_reg(priv, msgobj[mo].config, | ||
1708 | @@ -439,22 +425,30 @@ static netdev_tx_t cc770_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1709 | for (i = 0; i < dlc; i++) | ||
1710 | cc770_write_reg(priv, msgobj[mo].data[i], cf->data[i]); | ||
1711 | |||
1712 | - /* Store echo skb before starting the transfer */ | ||
1713 | - can_put_echo_skb(skb, dev, 0); | ||
1714 | - | ||
1715 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
1716 | - RMTPND_RES | TXRQST_SET | CPUUPD_RES | NEWDAT_UNC); | ||
1717 | + RMTPND_UNC | TXRQST_SET | CPUUPD_RES | NEWDAT_UNC); | ||
1718 | + cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
1719 | + MSGVAL_SET | TXIE_SET | RXIE_SET | INTPND_UNC); | ||
1720 | +} | ||
1721 | |||
1722 | - stats->tx_bytes += dlc; | ||
1723 | +static netdev_tx_t cc770_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1724 | +{ | ||
1725 | + struct cc770_priv *priv = netdev_priv(dev); | ||
1726 | + unsigned int mo = obj2msgobj(CC770_OBJ_TX); | ||
1727 | |||
1728 | + if (can_dropped_invalid_skb(dev, skb)) | ||
1729 | + return NETDEV_TX_OK; | ||
1730 | |||
1731 | - /* | ||
1732 | - * HM: We had some cases of repeated IRQs so make sure the | ||
1733 | - * INT is acknowledged I know it's already further up, but | ||
1734 | - * doing again fixed the issue | ||
1735 | - */ | ||
1736 | - cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
1737 | - MSGVAL_UNC | TXIE_UNC | RXIE_UNC | INTPND_RES); | ||
1738 | + netif_stop_queue(dev); | ||
1739 | + | ||
1740 | + if ((cc770_read_reg(priv, | ||
1741 | + msgobj[mo].ctrl1) & TXRQST_UNC) == TXRQST_SET) { | ||
1742 | + netdev_err(dev, "TX register is still occupied!\n"); | ||
1743 | + return NETDEV_TX_BUSY; | ||
1744 | + } | ||
1745 | + | ||
1746 | + priv->tx_skb = skb; | ||
1747 | + cc770_tx(dev, mo); | ||
1748 | |||
1749 | return NETDEV_TX_OK; | ||
1750 | } | ||
1751 | @@ -680,19 +674,46 @@ static void cc770_tx_interrupt(struct net_device *dev, unsigned int o) | ||
1752 | struct cc770_priv *priv = netdev_priv(dev); | ||
1753 | struct net_device_stats *stats = &dev->stats; | ||
1754 | unsigned int mo = obj2msgobj(o); | ||
1755 | + struct can_frame *cf; | ||
1756 | + u8 ctrl1; | ||
1757 | + | ||
1758 | + ctrl1 = cc770_read_reg(priv, msgobj[mo].ctrl1); | ||
1759 | |||
1760 | - /* Nothing more to send, switch off interrupts */ | ||
1761 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
1762 | MSGVAL_RES | TXIE_RES | RXIE_RES | INTPND_RES); | ||
1763 | - /* | ||
1764 | - * We had some cases of repeated IRQ so make sure the | ||
1765 | - * INT is acknowledged | ||
1766 | + cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
1767 | + RMTPND_RES | TXRQST_RES | MSGLST_RES | NEWDAT_RES); | ||
1768 | + | ||
1769 | + if (unlikely(!priv->tx_skb)) { | ||
1770 | + netdev_err(dev, "missing tx skb in tx interrupt\n"); | ||
1771 | + return; | ||
1772 | + } | ||
1773 | + | ||
1774 | + if (unlikely(ctrl1 & MSGLST_SET)) { | ||
1775 | + stats->rx_over_errors++; | ||
1776 | + stats->rx_errors++; | ||
1777 | + } | ||
1778 | + | ||
1779 | + /* When the CC770 is sending an RTR message and it receives a regular | ||
1780 | + * message that matches the id of the RTR message, it will overwrite the | ||
1781 | + * outgoing message in the TX register. When this happens we must | ||
1782 | + * process the received message and try to transmit the outgoing skb | ||
1783 | + * again. | ||
1784 | */ | ||
1785 | - cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
1786 | - MSGVAL_UNC | TXIE_UNC | RXIE_UNC | INTPND_RES); | ||
1787 | + if (unlikely(ctrl1 & NEWDAT_SET)) { | ||
1788 | + cc770_rx(dev, mo, ctrl1); | ||
1789 | + cc770_tx(dev, mo); | ||
1790 | + return; | ||
1791 | + } | ||
1792 | |||
1793 | + cf = (struct can_frame *)priv->tx_skb->data; | ||
1794 | + stats->tx_bytes += cf->can_dlc; | ||
1795 | stats->tx_packets++; | ||
1796 | + | ||
1797 | + can_put_echo_skb(priv->tx_skb, dev, 0); | ||
1798 | can_get_echo_skb(dev, 0); | ||
1799 | + priv->tx_skb = NULL; | ||
1800 | + | ||
1801 | netif_wake_queue(dev); | ||
1802 | } | ||
1803 | |||
1804 | @@ -804,6 +825,7 @@ struct net_device *alloc_cc770dev(int sizeof_priv) | ||
1805 | priv->can.do_set_bittiming = cc770_set_bittiming; | ||
1806 | priv->can.do_set_mode = cc770_set_mode; | ||
1807 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | ||
1808 | + priv->tx_skb = NULL; | ||
1809 | |||
1810 | memcpy(priv->obj_flags, cc770_obj_flags, sizeof(cc770_obj_flags)); | ||
1811 | |||
1812 | diff --git a/drivers/net/can/cc770/cc770.h b/drivers/net/can/cc770/cc770.h | ||
1813 | index a1739db98d91..95752e1d1283 100644 | ||
1814 | --- a/drivers/net/can/cc770/cc770.h | ||
1815 | +++ b/drivers/net/can/cc770/cc770.h | ||
1816 | @@ -193,6 +193,8 @@ struct cc770_priv { | ||
1817 | u8 cpu_interface; /* CPU interface register */ | ||
1818 | u8 clkout; /* Clock out register */ | ||
1819 | u8 bus_config; /* Bus conffiguration register */ | ||
1820 | + | ||
1821 | + struct sk_buff *tx_skb; | ||
1822 | }; | ||
1823 | |||
1824 | struct net_device *alloc_cc770dev(int sizeof_priv); | ||
1825 | diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c b/drivers/net/can/ifi_canfd/ifi_canfd.c | ||
1826 | index 2772d05ff11c..fedd927ba6ed 100644 | ||
1827 | --- a/drivers/net/can/ifi_canfd/ifi_canfd.c | ||
1828 | +++ b/drivers/net/can/ifi_canfd/ifi_canfd.c | ||
1829 | @@ -30,6 +30,7 @@ | ||
1830 | #define IFI_CANFD_STCMD_ERROR_ACTIVE BIT(2) | ||
1831 | #define IFI_CANFD_STCMD_ERROR_PASSIVE BIT(3) | ||
1832 | #define IFI_CANFD_STCMD_BUSOFF BIT(4) | ||
1833 | +#define IFI_CANFD_STCMD_ERROR_WARNING BIT(5) | ||
1834 | #define IFI_CANFD_STCMD_BUSMONITOR BIT(16) | ||
1835 | #define IFI_CANFD_STCMD_LOOPBACK BIT(18) | ||
1836 | #define IFI_CANFD_STCMD_DISABLE_CANFD BIT(24) | ||
1837 | @@ -52,7 +53,10 @@ | ||
1838 | #define IFI_CANFD_TXSTCMD_OVERFLOW BIT(13) | ||
1839 | |||
1840 | #define IFI_CANFD_INTERRUPT 0xc | ||
1841 | +#define IFI_CANFD_INTERRUPT_ERROR_BUSOFF BIT(0) | ||
1842 | #define IFI_CANFD_INTERRUPT_ERROR_WARNING BIT(1) | ||
1843 | +#define IFI_CANFD_INTERRUPT_ERROR_STATE_CHG BIT(2) | ||
1844 | +#define IFI_CANFD_INTERRUPT_ERROR_REC_TEC_INC BIT(3) | ||
1845 | #define IFI_CANFD_INTERRUPT_ERROR_COUNTER BIT(10) | ||
1846 | #define IFI_CANFD_INTERRUPT_TXFIFO_EMPTY BIT(16) | ||
1847 | #define IFI_CANFD_INTERRUPT_TXFIFO_REMOVE BIT(22) | ||
1848 | @@ -61,6 +65,10 @@ | ||
1849 | #define IFI_CANFD_INTERRUPT_SET_IRQ ((u32)BIT(31)) | ||
1850 | |||
1851 | #define IFI_CANFD_IRQMASK 0x10 | ||
1852 | +#define IFI_CANFD_IRQMASK_ERROR_BUSOFF BIT(0) | ||
1853 | +#define IFI_CANFD_IRQMASK_ERROR_WARNING BIT(1) | ||
1854 | +#define IFI_CANFD_IRQMASK_ERROR_STATE_CHG BIT(2) | ||
1855 | +#define IFI_CANFD_IRQMASK_ERROR_REC_TEC_INC BIT(3) | ||
1856 | #define IFI_CANFD_IRQMASK_SET_ERR BIT(7) | ||
1857 | #define IFI_CANFD_IRQMASK_SET_TS BIT(15) | ||
1858 | #define IFI_CANFD_IRQMASK_TXFIFO_EMPTY BIT(16) | ||
1859 | @@ -136,6 +144,8 @@ | ||
1860 | #define IFI_CANFD_SYSCLOCK 0x50 | ||
1861 | |||
1862 | #define IFI_CANFD_VER 0x54 | ||
1863 | +#define IFI_CANFD_VER_REV_MASK 0xff | ||
1864 | +#define IFI_CANFD_VER_REV_MIN_SUPPORTED 0x15 | ||
1865 | |||
1866 | #define IFI_CANFD_IP_ID 0x58 | ||
1867 | #define IFI_CANFD_IP_ID_VALUE 0xD073CAFD | ||
1868 | @@ -220,7 +230,10 @@ static void ifi_canfd_irq_enable(struct net_device *ndev, bool enable) | ||
1869 | |||
1870 | if (enable) { | ||
1871 | enirq = IFI_CANFD_IRQMASK_TXFIFO_EMPTY | | ||
1872 | - IFI_CANFD_IRQMASK_RXFIFO_NEMPTY; | ||
1873 | + IFI_CANFD_IRQMASK_RXFIFO_NEMPTY | | ||
1874 | + IFI_CANFD_IRQMASK_ERROR_STATE_CHG | | ||
1875 | + IFI_CANFD_IRQMASK_ERROR_WARNING | | ||
1876 | + IFI_CANFD_IRQMASK_ERROR_BUSOFF; | ||
1877 | if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) | ||
1878 | enirq |= IFI_CANFD_INTERRUPT_ERROR_COUNTER; | ||
1879 | } | ||
1880 | @@ -361,12 +374,13 @@ static int ifi_canfd_handle_lost_msg(struct net_device *ndev) | ||
1881 | return 1; | ||
1882 | } | ||
1883 | |||
1884 | -static int ifi_canfd_handle_lec_err(struct net_device *ndev, const u32 errctr) | ||
1885 | +static int ifi_canfd_handle_lec_err(struct net_device *ndev) | ||
1886 | { | ||
1887 | struct ifi_canfd_priv *priv = netdev_priv(ndev); | ||
1888 | struct net_device_stats *stats = &ndev->stats; | ||
1889 | struct can_frame *cf; | ||
1890 | struct sk_buff *skb; | ||
1891 | + u32 errctr = readl(priv->base + IFI_CANFD_ERROR_CTR); | ||
1892 | const u32 errmask = IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST | | ||
1893 | IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST | | ||
1894 | IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST | | ||
1895 | @@ -449,6 +463,11 @@ static int ifi_canfd_handle_state_change(struct net_device *ndev, | ||
1896 | |||
1897 | switch (new_state) { | ||
1898 | case CAN_STATE_ERROR_ACTIVE: | ||
1899 | + /* error active state */ | ||
1900 | + priv->can.can_stats.error_warning++; | ||
1901 | + priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
1902 | + break; | ||
1903 | + case CAN_STATE_ERROR_WARNING: | ||
1904 | /* error warning state */ | ||
1905 | priv->can.can_stats.error_warning++; | ||
1906 | priv->can.state = CAN_STATE_ERROR_WARNING; | ||
1907 | @@ -477,7 +496,7 @@ static int ifi_canfd_handle_state_change(struct net_device *ndev, | ||
1908 | ifi_canfd_get_berr_counter(ndev, &bec); | ||
1909 | |||
1910 | switch (new_state) { | ||
1911 | - case CAN_STATE_ERROR_ACTIVE: | ||
1912 | + case CAN_STATE_ERROR_WARNING: | ||
1913 | /* error warning state */ | ||
1914 | cf->can_id |= CAN_ERR_CRTL; | ||
1915 | cf->data[1] = (bec.txerr > bec.rxerr) ? | ||
1916 | @@ -510,22 +529,21 @@ static int ifi_canfd_handle_state_change(struct net_device *ndev, | ||
1917 | return 1; | ||
1918 | } | ||
1919 | |||
1920 | -static int ifi_canfd_handle_state_errors(struct net_device *ndev, u32 stcmd) | ||
1921 | +static int ifi_canfd_handle_state_errors(struct net_device *ndev) | ||
1922 | { | ||
1923 | struct ifi_canfd_priv *priv = netdev_priv(ndev); | ||
1924 | + u32 stcmd = readl(priv->base + IFI_CANFD_STCMD); | ||
1925 | int work_done = 0; | ||
1926 | - u32 isr; | ||
1927 | |||
1928 | - /* | ||
1929 | - * The ErrWarn condition is a little special, since the bit is | ||
1930 | - * located in the INTERRUPT register instead of STCMD register. | ||
1931 | - */ | ||
1932 | - isr = readl(priv->base + IFI_CANFD_INTERRUPT); | ||
1933 | - if ((isr & IFI_CANFD_INTERRUPT_ERROR_WARNING) && | ||
1934 | + if ((stcmd & IFI_CANFD_STCMD_ERROR_ACTIVE) && | ||
1935 | + (priv->can.state != CAN_STATE_ERROR_ACTIVE)) { | ||
1936 | + netdev_dbg(ndev, "Error, entered active state\n"); | ||
1937 | + work_done += ifi_canfd_handle_state_change(ndev, | ||
1938 | + CAN_STATE_ERROR_ACTIVE); | ||
1939 | + } | ||
1940 | + | ||
1941 | + if ((stcmd & IFI_CANFD_STCMD_ERROR_WARNING) && | ||
1942 | (priv->can.state != CAN_STATE_ERROR_WARNING)) { | ||
1943 | - /* Clear the interrupt */ | ||
1944 | - writel(IFI_CANFD_INTERRUPT_ERROR_WARNING, | ||
1945 | - priv->base + IFI_CANFD_INTERRUPT); | ||
1946 | netdev_dbg(ndev, "Error, entered warning state\n"); | ||
1947 | work_done += ifi_canfd_handle_state_change(ndev, | ||
1948 | CAN_STATE_ERROR_WARNING); | ||
1949 | @@ -552,18 +570,11 @@ static int ifi_canfd_poll(struct napi_struct *napi, int quota) | ||
1950 | { | ||
1951 | struct net_device *ndev = napi->dev; | ||
1952 | struct ifi_canfd_priv *priv = netdev_priv(ndev); | ||
1953 | - const u32 stcmd_state_mask = IFI_CANFD_STCMD_ERROR_PASSIVE | | ||
1954 | - IFI_CANFD_STCMD_BUSOFF; | ||
1955 | - int work_done = 0; | ||
1956 | - | ||
1957 | - u32 stcmd = readl(priv->base + IFI_CANFD_STCMD); | ||
1958 | u32 rxstcmd = readl(priv->base + IFI_CANFD_RXSTCMD); | ||
1959 | - u32 errctr = readl(priv->base + IFI_CANFD_ERROR_CTR); | ||
1960 | + int work_done = 0; | ||
1961 | |||
1962 | /* Handle bus state changes */ | ||
1963 | - if ((stcmd & stcmd_state_mask) || | ||
1964 | - ((stcmd & IFI_CANFD_STCMD_ERROR_ACTIVE) == 0)) | ||
1965 | - work_done += ifi_canfd_handle_state_errors(ndev, stcmd); | ||
1966 | + work_done += ifi_canfd_handle_state_errors(ndev); | ||
1967 | |||
1968 | /* Handle lost messages on RX */ | ||
1969 | if (rxstcmd & IFI_CANFD_RXSTCMD_OVERFLOW) | ||
1970 | @@ -571,7 +582,7 @@ static int ifi_canfd_poll(struct napi_struct *napi, int quota) | ||
1971 | |||
1972 | /* Handle lec errors on the bus */ | ||
1973 | if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) | ||
1974 | - work_done += ifi_canfd_handle_lec_err(ndev, errctr); | ||
1975 | + work_done += ifi_canfd_handle_lec_err(ndev); | ||
1976 | |||
1977 | /* Handle normal messages on RX */ | ||
1978 | if (!(rxstcmd & IFI_CANFD_RXSTCMD_EMPTY)) | ||
1979 | @@ -592,12 +603,13 @@ static irqreturn_t ifi_canfd_isr(int irq, void *dev_id) | ||
1980 | struct net_device_stats *stats = &ndev->stats; | ||
1981 | const u32 rx_irq_mask = IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY | | ||
1982 | IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY_PER | | ||
1983 | + IFI_CANFD_INTERRUPT_ERROR_COUNTER | | ||
1984 | + IFI_CANFD_INTERRUPT_ERROR_STATE_CHG | | ||
1985 | IFI_CANFD_INTERRUPT_ERROR_WARNING | | ||
1986 | - IFI_CANFD_INTERRUPT_ERROR_COUNTER; | ||
1987 | + IFI_CANFD_INTERRUPT_ERROR_BUSOFF; | ||
1988 | const u32 tx_irq_mask = IFI_CANFD_INTERRUPT_TXFIFO_EMPTY | | ||
1989 | IFI_CANFD_INTERRUPT_TXFIFO_REMOVE; | ||
1990 | - const u32 clr_irq_mask = ~((u32)(IFI_CANFD_INTERRUPT_SET_IRQ | | ||
1991 | - IFI_CANFD_INTERRUPT_ERROR_WARNING)); | ||
1992 | + const u32 clr_irq_mask = ~((u32)IFI_CANFD_INTERRUPT_SET_IRQ); | ||
1993 | u32 isr; | ||
1994 | |||
1995 | isr = readl(priv->base + IFI_CANFD_INTERRUPT); | ||
1996 | @@ -933,7 +945,7 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev) | ||
1997 | struct resource *res; | ||
1998 | void __iomem *addr; | ||
1999 | int irq, ret; | ||
2000 | - u32 id; | ||
2001 | + u32 id, rev; | ||
2002 | |||
2003 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
2004 | addr = devm_ioremap_resource(dev, res); | ||
2005 | @@ -947,6 +959,13 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev) | ||
2006 | return -EINVAL; | ||
2007 | } | ||
2008 | |||
2009 | + rev = readl(addr + IFI_CANFD_VER) & IFI_CANFD_VER_REV_MASK; | ||
2010 | + if (rev < IFI_CANFD_VER_REV_MIN_SUPPORTED) { | ||
2011 | + dev_err(dev, "This block is too old (rev %i), minimum supported is rev %i\n", | ||
2012 | + rev, IFI_CANFD_VER_REV_MIN_SUPPORTED); | ||
2013 | + return -EINVAL; | ||
2014 | + } | ||
2015 | + | ||
2016 | ndev = alloc_candev(sizeof(*priv), 1); | ||
2017 | if (!ndev) | ||
2018 | return -ENOMEM; | ||
2019 | diff --git a/drivers/net/can/peak_canfd/peak_canfd.c b/drivers/net/can/peak_canfd/peak_canfd.c | ||
2020 | index 55513411a82e..ed8561d4a90f 100644 | ||
2021 | --- a/drivers/net/can/peak_canfd/peak_canfd.c | ||
2022 | +++ b/drivers/net/can/peak_canfd/peak_canfd.c | ||
2023 | @@ -262,7 +262,6 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv, | ||
2024 | |||
2025 | spin_lock_irqsave(&priv->echo_lock, flags); | ||
2026 | can_get_echo_skb(priv->ndev, msg->client); | ||
2027 | - spin_unlock_irqrestore(&priv->echo_lock, flags); | ||
2028 | |||
2029 | /* count bytes of the echo instead of skb */ | ||
2030 | stats->tx_bytes += cf_len; | ||
2031 | @@ -271,6 +270,7 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv, | ||
2032 | /* restart tx queue (a slot is free) */ | ||
2033 | netif_wake_queue(priv->ndev); | ||
2034 | |||
2035 | + spin_unlock_irqrestore(&priv->echo_lock, flags); | ||
2036 | return 0; | ||
2037 | } | ||
2038 | |||
2039 | @@ -333,7 +333,6 @@ static int pucan_handle_status(struct peak_canfd_priv *priv, | ||
2040 | |||
2041 | /* this STATUS is the CNF of the RX_BARRIER: Tx path can be setup */ | ||
2042 | if (pucan_status_is_rx_barrier(msg)) { | ||
2043 | - unsigned long flags; | ||
2044 | |||
2045 | if (priv->enable_tx_path) { | ||
2046 | int err = priv->enable_tx_path(priv); | ||
2047 | @@ -342,16 +341,8 @@ static int pucan_handle_status(struct peak_canfd_priv *priv, | ||
2048 | return err; | ||
2049 | } | ||
2050 | |||
2051 | - /* restart network queue only if echo skb array is free */ | ||
2052 | - spin_lock_irqsave(&priv->echo_lock, flags); | ||
2053 | - | ||
2054 | - if (!priv->can.echo_skb[priv->echo_idx]) { | ||
2055 | - spin_unlock_irqrestore(&priv->echo_lock, flags); | ||
2056 | - | ||
2057 | - netif_wake_queue(ndev); | ||
2058 | - } else { | ||
2059 | - spin_unlock_irqrestore(&priv->echo_lock, flags); | ||
2060 | - } | ||
2061 | + /* start network queue (echo_skb array is empty) */ | ||
2062 | + netif_start_queue(ndev); | ||
2063 | |||
2064 | return 0; | ||
2065 | } | ||
2066 | @@ -726,11 +717,6 @@ static netdev_tx_t peak_canfd_start_xmit(struct sk_buff *skb, | ||
2067 | */ | ||
2068 | should_stop_tx_queue = !!(priv->can.echo_skb[priv->echo_idx]); | ||
2069 | |||
2070 | - spin_unlock_irqrestore(&priv->echo_lock, flags); | ||
2071 | - | ||
2072 | - /* write the skb on the interface */ | ||
2073 | - priv->write_tx_msg(priv, msg); | ||
2074 | - | ||
2075 | /* stop network tx queue if not enough room to save one more msg too */ | ||
2076 | if (priv->can.ctrlmode & CAN_CTRLMODE_FD) | ||
2077 | should_stop_tx_queue |= (room_left < | ||
2078 | @@ -742,6 +728,11 @@ static netdev_tx_t peak_canfd_start_xmit(struct sk_buff *skb, | ||
2079 | if (should_stop_tx_queue) | ||
2080 | netif_stop_queue(ndev); | ||
2081 | |||
2082 | + spin_unlock_irqrestore(&priv->echo_lock, flags); | ||
2083 | + | ||
2084 | + /* write the skb on the interface */ | ||
2085 | + priv->write_tx_msg(priv, msg); | ||
2086 | + | ||
2087 | return NETDEV_TX_OK; | ||
2088 | } | ||
2089 | |||
2090 | diff --git a/drivers/net/can/peak_canfd/peak_pciefd_main.c b/drivers/net/can/peak_canfd/peak_pciefd_main.c | ||
2091 | index 788c3464a3b0..3c51a884db87 100644 | ||
2092 | --- a/drivers/net/can/peak_canfd/peak_pciefd_main.c | ||
2093 | +++ b/drivers/net/can/peak_canfd/peak_pciefd_main.c | ||
2094 | @@ -349,8 +349,12 @@ static irqreturn_t pciefd_irq_handler(int irq, void *arg) | ||
2095 | priv->tx_pages_free++; | ||
2096 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
2097 | |||
2098 | - /* wake producer up */ | ||
2099 | - netif_wake_queue(priv->ucan.ndev); | ||
2100 | + /* wake producer up (only if enough room in echo_skb array) */ | ||
2101 | + spin_lock_irqsave(&priv->ucan.echo_lock, flags); | ||
2102 | + if (!priv->ucan.can.echo_skb[priv->ucan.echo_idx]) | ||
2103 | + netif_wake_queue(priv->ucan.ndev); | ||
2104 | + | ||
2105 | + spin_unlock_irqrestore(&priv->ucan.echo_lock, flags); | ||
2106 | } | ||
2107 | |||
2108 | /* re-enable Rx DMA transfer for this CAN */ | ||
2109 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | ||
2110 | index 2ce675ab40ef..450f2216fac2 100644 | ||
2111 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | ||
2112 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | ||
2113 | @@ -462,25 +462,23 @@ static int brcmf_p2p_set_firmware(struct brcmf_if *ifp, u8 *p2p_mac) | ||
2114 | * @dev_addr: optional device address. | ||
2115 | * | ||
2116 | * P2P needs mac addresses for P2P device and interface. If no device | ||
2117 | - * address it specified, these are derived from the primary net device, ie. | ||
2118 | - * the permanent ethernet address of the device. | ||
2119 | + * address it specified, these are derived from a random ethernet | ||
2120 | + * address. | ||
2121 | */ | ||
2122 | static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr) | ||
2123 | { | ||
2124 | - struct brcmf_if *pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; | ||
2125 | - bool local_admin = false; | ||
2126 | + bool random_addr = false; | ||
2127 | |||
2128 | - if (!dev_addr || is_zero_ether_addr(dev_addr)) { | ||
2129 | - dev_addr = pri_ifp->mac_addr; | ||
2130 | - local_admin = true; | ||
2131 | - } | ||
2132 | + if (!dev_addr || is_zero_ether_addr(dev_addr)) | ||
2133 | + random_addr = true; | ||
2134 | |||
2135 | - /* Generate the P2P Device Address. This consists of the device's | ||
2136 | - * primary MAC address with the locally administered bit set. | ||
2137 | + /* Generate the P2P Device Address obtaining a random ethernet | ||
2138 | + * address with the locally administered bit set. | ||
2139 | */ | ||
2140 | - memcpy(p2p->dev_addr, dev_addr, ETH_ALEN); | ||
2141 | - if (local_admin) | ||
2142 | - p2p->dev_addr[0] |= 0x02; | ||
2143 | + if (random_addr) | ||
2144 | + eth_random_addr(p2p->dev_addr); | ||
2145 | + else | ||
2146 | + memcpy(p2p->dev_addr, dev_addr, ETH_ALEN); | ||
2147 | |||
2148 | /* Generate the P2P Interface Address. If the discovery and connection | ||
2149 | * BSSCFGs need to simultaneously co-exist, then this address must be | ||
2150 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | ||
2151 | index 4d47b97adfed..0034ebd3e5ba 100644 | ||
2152 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | ||
2153 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | ||
2154 | @@ -1123,7 +1123,8 @@ static void _rtl8723be_enable_aspm_back_door(struct ieee80211_hw *hw) | ||
2155 | |||
2156 | /* Configuration Space offset 0x70f BIT7 is used to control L0S */ | ||
2157 | tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x70f); | ||
2158 | - _rtl8723be_dbi_write(rtlpriv, 0x70f, tmp8 | BIT(7)); | ||
2159 | + _rtl8723be_dbi_write(rtlpriv, 0x70f, tmp8 | BIT(7) | | ||
2160 | + ASPM_L1_LATENCY << 3); | ||
2161 | |||
2162 | /* Configuration Space offset 0x719 Bit3 is for L1 | ||
2163 | * BIT4 is for clock request | ||
2164 | diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c | ||
2165 | index 345acca576b3..1bd7b3734751 100644 | ||
2166 | --- a/drivers/nvdimm/blk.c | ||
2167 | +++ b/drivers/nvdimm/blk.c | ||
2168 | @@ -278,8 +278,6 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk) | ||
2169 | disk->queue = q; | ||
2170 | disk->flags = GENHD_FL_EXT_DEVT; | ||
2171 | nvdimm_namespace_disk_name(&nsblk->common, disk->disk_name); | ||
2172 | - set_capacity(disk, 0); | ||
2173 | - device_add_disk(dev, disk); | ||
2174 | |||
2175 | if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk)) | ||
2176 | return -ENOMEM; | ||
2177 | @@ -292,6 +290,7 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk) | ||
2178 | } | ||
2179 | |||
2180 | set_capacity(disk, available_disk_size >> SECTOR_SHIFT); | ||
2181 | + device_add_disk(dev, disk); | ||
2182 | revalidate_disk(disk); | ||
2183 | return 0; | ||
2184 | } | ||
2185 | diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c | ||
2186 | index 09428ebd315b..b2feda35966b 100644 | ||
2187 | --- a/drivers/nvdimm/btt.c | ||
2188 | +++ b/drivers/nvdimm/btt.c | ||
2189 | @@ -1542,8 +1542,6 @@ static int btt_blk_init(struct btt *btt) | ||
2190 | queue_flag_set_unlocked(QUEUE_FLAG_NONROT, btt->btt_queue); | ||
2191 | btt->btt_queue->queuedata = btt; | ||
2192 | |||
2193 | - set_capacity(btt->btt_disk, 0); | ||
2194 | - device_add_disk(&btt->nd_btt->dev, btt->btt_disk); | ||
2195 | if (btt_meta_size(btt)) { | ||
2196 | int rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt)); | ||
2197 | |||
2198 | @@ -1555,6 +1553,7 @@ static int btt_blk_init(struct btt *btt) | ||
2199 | } | ||
2200 | } | ||
2201 | set_capacity(btt->btt_disk, btt->nlba * btt->sector_size >> 9); | ||
2202 | + device_add_disk(&btt->nd_btt->dev, btt->btt_disk); | ||
2203 | btt->nd_btt->size = btt->nlba * (u64)btt->sector_size; | ||
2204 | revalidate_disk(btt->btt_disk); | ||
2205 | |||
2206 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c | ||
2207 | index d18824772f6c..05fadcc4f9d2 100644 | ||
2208 | --- a/drivers/pci/quirks.c | ||
2209 | +++ b/drivers/pci/quirks.c | ||
2210 | @@ -3899,6 +3899,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9230, | ||
2211 | quirk_dma_func1_alias); | ||
2212 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0642, | ||
2213 | quirk_dma_func1_alias); | ||
2214 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0645, | ||
2215 | + quirk_dma_func1_alias); | ||
2216 | /* https://bugs.gentoo.org/show_bug.cgi?id=497630 */ | ||
2217 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_JMICRON, | ||
2218 | PCI_DEVICE_ID_JMICRON_JMB388_ESD, | ||
2219 | diff --git a/drivers/pinctrl/samsung/pinctrl-exynos-arm.c b/drivers/pinctrl/samsung/pinctrl-exynos-arm.c | ||
2220 | index 071084d3ee9c..92aeea174a56 100644 | ||
2221 | --- a/drivers/pinctrl/samsung/pinctrl-exynos-arm.c | ||
2222 | +++ b/drivers/pinctrl/samsung/pinctrl-exynos-arm.c | ||
2223 | @@ -129,7 +129,7 @@ static const struct samsung_pin_bank_data s5pv210_pin_bank[] __initconst = { | ||
2224 | EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c), | ||
2225 | }; | ||
2226 | |||
2227 | -const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = { | ||
2228 | +static const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = { | ||
2229 | { | ||
2230 | /* pin-controller instance 0 data */ | ||
2231 | .pin_banks = s5pv210_pin_bank, | ||
2232 | @@ -142,6 +142,11 @@ const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = { | ||
2233 | }, | ||
2234 | }; | ||
2235 | |||
2236 | +const struct samsung_pinctrl_of_match_data s5pv210_of_data __initconst = { | ||
2237 | + .ctrl = s5pv210_pin_ctrl, | ||
2238 | + .num_ctrl = ARRAY_SIZE(s5pv210_pin_ctrl), | ||
2239 | +}; | ||
2240 | + | ||
2241 | /* Pad retention control code for accessing PMU regmap */ | ||
2242 | static atomic_t exynos_shared_retention_refcnt; | ||
2243 | |||
2244 | @@ -204,7 +209,7 @@ static const struct samsung_retention_data exynos3250_retention_data __initconst | ||
2245 | * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes | ||
2246 | * two gpio/pin-mux/pinconfig controllers. | ||
2247 | */ | ||
2248 | -const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = { | ||
2249 | +static const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = { | ||
2250 | { | ||
2251 | /* pin-controller instance 0 data */ | ||
2252 | .pin_banks = exynos3250_pin_banks0, | ||
2253 | @@ -225,6 +230,11 @@ const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = { | ||
2254 | }, | ||
2255 | }; | ||
2256 | |||
2257 | +const struct samsung_pinctrl_of_match_data exynos3250_of_data __initconst = { | ||
2258 | + .ctrl = exynos3250_pin_ctrl, | ||
2259 | + .num_ctrl = ARRAY_SIZE(exynos3250_pin_ctrl), | ||
2260 | +}; | ||
2261 | + | ||
2262 | /* pin banks of exynos4210 pin-controller 0 */ | ||
2263 | static const struct samsung_pin_bank_data exynos4210_pin_banks0[] __initconst = { | ||
2264 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | ||
2265 | @@ -308,7 +318,7 @@ static const struct samsung_retention_data exynos4_audio_retention_data __initco | ||
2266 | * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes | ||
2267 | * three gpio/pin-mux/pinconfig controllers. | ||
2268 | */ | ||
2269 | -const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = { | ||
2270 | +static const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = { | ||
2271 | { | ||
2272 | /* pin-controller instance 0 data */ | ||
2273 | .pin_banks = exynos4210_pin_banks0, | ||
2274 | @@ -334,6 +344,11 @@ const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = { | ||
2275 | }, | ||
2276 | }; | ||
2277 | |||
2278 | +const struct samsung_pinctrl_of_match_data exynos4210_of_data __initconst = { | ||
2279 | + .ctrl = exynos4210_pin_ctrl, | ||
2280 | + .num_ctrl = ARRAY_SIZE(exynos4210_pin_ctrl), | ||
2281 | +}; | ||
2282 | + | ||
2283 | /* pin banks of exynos4x12 pin-controller 0 */ | ||
2284 | static const struct samsung_pin_bank_data exynos4x12_pin_banks0[] __initconst = { | ||
2285 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | ||
2286 | @@ -396,7 +411,7 @@ static const struct samsung_pin_bank_data exynos4x12_pin_banks3[] __initconst = | ||
2287 | * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes | ||
2288 | * four gpio/pin-mux/pinconfig controllers. | ||
2289 | */ | ||
2290 | -const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = { | ||
2291 | +static const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = { | ||
2292 | { | ||
2293 | /* pin-controller instance 0 data */ | ||
2294 | .pin_banks = exynos4x12_pin_banks0, | ||
2295 | @@ -432,6 +447,11 @@ const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = { | ||
2296 | }, | ||
2297 | }; | ||
2298 | |||
2299 | +const struct samsung_pinctrl_of_match_data exynos4x12_of_data __initconst = { | ||
2300 | + .ctrl = exynos4x12_pin_ctrl, | ||
2301 | + .num_ctrl = ARRAY_SIZE(exynos4x12_pin_ctrl), | ||
2302 | +}; | ||
2303 | + | ||
2304 | /* pin banks of exynos5250 pin-controller 0 */ | ||
2305 | static const struct samsung_pin_bank_data exynos5250_pin_banks0[] __initconst = { | ||
2306 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | ||
2307 | @@ -492,7 +512,7 @@ static const struct samsung_pin_bank_data exynos5250_pin_banks3[] __initconst = | ||
2308 | * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes | ||
2309 | * four gpio/pin-mux/pinconfig controllers. | ||
2310 | */ | ||
2311 | -const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = { | ||
2312 | +static const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = { | ||
2313 | { | ||
2314 | /* pin-controller instance 0 data */ | ||
2315 | .pin_banks = exynos5250_pin_banks0, | ||
2316 | @@ -528,6 +548,11 @@ const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = { | ||
2317 | }, | ||
2318 | }; | ||
2319 | |||
2320 | +const struct samsung_pinctrl_of_match_data exynos5250_of_data __initconst = { | ||
2321 | + .ctrl = exynos5250_pin_ctrl, | ||
2322 | + .num_ctrl = ARRAY_SIZE(exynos5250_pin_ctrl), | ||
2323 | +}; | ||
2324 | + | ||
2325 | /* pin banks of exynos5260 pin-controller 0 */ | ||
2326 | static const struct samsung_pin_bank_data exynos5260_pin_banks0[] __initconst = { | ||
2327 | EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00), | ||
2328 | @@ -572,7 +597,7 @@ static const struct samsung_pin_bank_data exynos5260_pin_banks2[] __initconst = | ||
2329 | * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes | ||
2330 | * three gpio/pin-mux/pinconfig controllers. | ||
2331 | */ | ||
2332 | -const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = { | ||
2333 | +static const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = { | ||
2334 | { | ||
2335 | /* pin-controller instance 0 data */ | ||
2336 | .pin_banks = exynos5260_pin_banks0, | ||
2337 | @@ -592,6 +617,11 @@ const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = { | ||
2338 | }, | ||
2339 | }; | ||
2340 | |||
2341 | +const struct samsung_pinctrl_of_match_data exynos5260_of_data __initconst = { | ||
2342 | + .ctrl = exynos5260_pin_ctrl, | ||
2343 | + .num_ctrl = ARRAY_SIZE(exynos5260_pin_ctrl), | ||
2344 | +}; | ||
2345 | + | ||
2346 | /* pin banks of exynos5410 pin-controller 0 */ | ||
2347 | static const struct samsung_pin_bank_data exynos5410_pin_banks0[] __initconst = { | ||
2348 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | ||
2349 | @@ -662,7 +692,7 @@ static const struct samsung_pin_bank_data exynos5410_pin_banks3[] __initconst = | ||
2350 | * Samsung pinctrl driver data for Exynos5410 SoC. Exynos5410 SoC includes | ||
2351 | * four gpio/pin-mux/pinconfig controllers. | ||
2352 | */ | ||
2353 | -const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = { | ||
2354 | +static const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = { | ||
2355 | { | ||
2356 | /* pin-controller instance 0 data */ | ||
2357 | .pin_banks = exynos5410_pin_banks0, | ||
2358 | @@ -695,6 +725,11 @@ const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = { | ||
2359 | }, | ||
2360 | }; | ||
2361 | |||
2362 | +const struct samsung_pinctrl_of_match_data exynos5410_of_data __initconst = { | ||
2363 | + .ctrl = exynos5410_pin_ctrl, | ||
2364 | + .num_ctrl = ARRAY_SIZE(exynos5410_pin_ctrl), | ||
2365 | +}; | ||
2366 | + | ||
2367 | /* pin banks of exynos5420 pin-controller 0 */ | ||
2368 | static const struct samsung_pin_bank_data exynos5420_pin_banks0[] __initconst = { | ||
2369 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00), | ||
2370 | @@ -779,7 +814,7 @@ static const struct samsung_retention_data exynos5420_retention_data __initconst | ||
2371 | * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes | ||
2372 | * four gpio/pin-mux/pinconfig controllers. | ||
2373 | */ | ||
2374 | -const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = { | ||
2375 | +static const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = { | ||
2376 | { | ||
2377 | /* pin-controller instance 0 data */ | ||
2378 | .pin_banks = exynos5420_pin_banks0, | ||
2379 | @@ -813,3 +848,8 @@ const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = { | ||
2380 | .retention_data = &exynos4_audio_retention_data, | ||
2381 | }, | ||
2382 | }; | ||
2383 | + | ||
2384 | +const struct samsung_pinctrl_of_match_data exynos5420_of_data __initconst = { | ||
2385 | + .ctrl = exynos5420_pin_ctrl, | ||
2386 | + .num_ctrl = ARRAY_SIZE(exynos5420_pin_ctrl), | ||
2387 | +}; | ||
2388 | diff --git a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c | ||
2389 | index 08e9fdb58fd2..0ab88fc268ea 100644 | ||
2390 | --- a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c | ||
2391 | +++ b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c | ||
2392 | @@ -180,7 +180,7 @@ static const struct samsung_retention_data exynos5433_fsys_retention_data __init | ||
2393 | * Samsung pinctrl driver data for Exynos5433 SoC. Exynos5433 SoC includes | ||
2394 | * ten gpio/pin-mux/pinconfig controllers. | ||
2395 | */ | ||
2396 | -const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = { | ||
2397 | +static const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = { | ||
2398 | { | ||
2399 | /* pin-controller instance 0 data */ | ||
2400 | .pin_banks = exynos5433_pin_banks0, | ||
2401 | @@ -265,6 +265,11 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = { | ||
2402 | }, | ||
2403 | }; | ||
2404 | |||
2405 | +const struct samsung_pinctrl_of_match_data exynos5433_of_data __initconst = { | ||
2406 | + .ctrl = exynos5433_pin_ctrl, | ||
2407 | + .num_ctrl = ARRAY_SIZE(exynos5433_pin_ctrl), | ||
2408 | +}; | ||
2409 | + | ||
2410 | /* pin banks of exynos7 pin-controller - ALIVE */ | ||
2411 | static const struct samsung_pin_bank_data exynos7_pin_banks0[] __initconst = { | ||
2412 | EXYNOS_PIN_BANK_EINTW(8, 0x000, "gpa0", 0x00), | ||
2413 | @@ -344,7 +349,7 @@ static const struct samsung_pin_bank_data exynos7_pin_banks9[] __initconst = { | ||
2414 | EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04), | ||
2415 | }; | ||
2416 | |||
2417 | -const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = { | ||
2418 | +static const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = { | ||
2419 | { | ||
2420 | /* pin-controller instance 0 Alive data */ | ||
2421 | .pin_banks = exynos7_pin_banks0, | ||
2422 | @@ -397,3 +402,8 @@ const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = { | ||
2423 | .eint_gpio_init = exynos_eint_gpio_init, | ||
2424 | }, | ||
2425 | }; | ||
2426 | + | ||
2427 | +const struct samsung_pinctrl_of_match_data exynos7_of_data __initconst = { | ||
2428 | + .ctrl = exynos7_pin_ctrl, | ||
2429 | + .num_ctrl = ARRAY_SIZE(exynos7_pin_ctrl), | ||
2430 | +}; | ||
2431 | diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c | ||
2432 | index edf27264b603..67da1cf18b68 100644 | ||
2433 | --- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c | ||
2434 | +++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c | ||
2435 | @@ -570,7 +570,7 @@ static const struct samsung_pin_bank_data s3c2412_pin_banks[] __initconst = { | ||
2436 | PIN_BANK_2BIT(13, 0x080, "gpj"), | ||
2437 | }; | ||
2438 | |||
2439 | -const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = { | ||
2440 | +static const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = { | ||
2441 | { | ||
2442 | .pin_banks = s3c2412_pin_banks, | ||
2443 | .nr_banks = ARRAY_SIZE(s3c2412_pin_banks), | ||
2444 | @@ -578,6 +578,11 @@ const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = { | ||
2445 | }, | ||
2446 | }; | ||
2447 | |||
2448 | +const struct samsung_pinctrl_of_match_data s3c2412_of_data __initconst = { | ||
2449 | + .ctrl = s3c2412_pin_ctrl, | ||
2450 | + .num_ctrl = ARRAY_SIZE(s3c2412_pin_ctrl), | ||
2451 | +}; | ||
2452 | + | ||
2453 | static const struct samsung_pin_bank_data s3c2416_pin_banks[] __initconst = { | ||
2454 | PIN_BANK_A(27, 0x000, "gpa"), | ||
2455 | PIN_BANK_2BIT(11, 0x010, "gpb"), | ||
2456 | @@ -592,7 +597,7 @@ static const struct samsung_pin_bank_data s3c2416_pin_banks[] __initconst = { | ||
2457 | PIN_BANK_2BIT(2, 0x100, "gpm"), | ||
2458 | }; | ||
2459 | |||
2460 | -const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = { | ||
2461 | +static const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = { | ||
2462 | { | ||
2463 | .pin_banks = s3c2416_pin_banks, | ||
2464 | .nr_banks = ARRAY_SIZE(s3c2416_pin_banks), | ||
2465 | @@ -600,6 +605,11 @@ const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = { | ||
2466 | }, | ||
2467 | }; | ||
2468 | |||
2469 | +const struct samsung_pinctrl_of_match_data s3c2416_of_data __initconst = { | ||
2470 | + .ctrl = s3c2416_pin_ctrl, | ||
2471 | + .num_ctrl = ARRAY_SIZE(s3c2416_pin_ctrl), | ||
2472 | +}; | ||
2473 | + | ||
2474 | static const struct samsung_pin_bank_data s3c2440_pin_banks[] __initconst = { | ||
2475 | PIN_BANK_A(25, 0x000, "gpa"), | ||
2476 | PIN_BANK_2BIT(11, 0x010, "gpb"), | ||
2477 | @@ -612,7 +622,7 @@ static const struct samsung_pin_bank_data s3c2440_pin_banks[] __initconst = { | ||
2478 | PIN_BANK_2BIT(13, 0x0d0, "gpj"), | ||
2479 | }; | ||
2480 | |||
2481 | -const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = { | ||
2482 | +static const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = { | ||
2483 | { | ||
2484 | .pin_banks = s3c2440_pin_banks, | ||
2485 | .nr_banks = ARRAY_SIZE(s3c2440_pin_banks), | ||
2486 | @@ -620,6 +630,11 @@ const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = { | ||
2487 | }, | ||
2488 | }; | ||
2489 | |||
2490 | +const struct samsung_pinctrl_of_match_data s3c2440_of_data __initconst = { | ||
2491 | + .ctrl = s3c2440_pin_ctrl, | ||
2492 | + .num_ctrl = ARRAY_SIZE(s3c2440_pin_ctrl), | ||
2493 | +}; | ||
2494 | + | ||
2495 | static const struct samsung_pin_bank_data s3c2450_pin_banks[] __initconst = { | ||
2496 | PIN_BANK_A(28, 0x000, "gpa"), | ||
2497 | PIN_BANK_2BIT(11, 0x010, "gpb"), | ||
2498 | @@ -635,10 +650,15 @@ static const struct samsung_pin_bank_data s3c2450_pin_banks[] __initconst = { | ||
2499 | PIN_BANK_2BIT(2, 0x100, "gpm"), | ||
2500 | }; | ||
2501 | |||
2502 | -const struct samsung_pin_ctrl s3c2450_pin_ctrl[] __initconst = { | ||
2503 | +static const struct samsung_pin_ctrl s3c2450_pin_ctrl[] __initconst = { | ||
2504 | { | ||
2505 | .pin_banks = s3c2450_pin_banks, | ||
2506 | .nr_banks = ARRAY_SIZE(s3c2450_pin_banks), | ||
2507 | .eint_wkup_init = s3c24xx_eint_init, | ||
2508 | }, | ||
2509 | }; | ||
2510 | + | ||
2511 | +const struct samsung_pinctrl_of_match_data s3c2450_of_data __initconst = { | ||
2512 | + .ctrl = s3c2450_pin_ctrl, | ||
2513 | + .num_ctrl = ARRAY_SIZE(s3c2450_pin_ctrl), | ||
2514 | +}; | ||
2515 | diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c | ||
2516 | index e63663b32907..0bdc1e683181 100644 | ||
2517 | --- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c | ||
2518 | +++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c | ||
2519 | @@ -794,7 +794,7 @@ static const struct samsung_pin_bank_data s3c64xx_pin_banks0[] __initconst = { | ||
2520 | * Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes | ||
2521 | * one gpio/pin-mux/pinconfig controller. | ||
2522 | */ | ||
2523 | -const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = { | ||
2524 | +static const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = { | ||
2525 | { | ||
2526 | /* pin-controller instance 1 data */ | ||
2527 | .pin_banks = s3c64xx_pin_banks0, | ||
2528 | @@ -803,3 +803,8 @@ const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = { | ||
2529 | .eint_wkup_init = s3c64xx_eint_eint0_init, | ||
2530 | }, | ||
2531 | }; | ||
2532 | + | ||
2533 | +const struct samsung_pinctrl_of_match_data s3c64xx_of_data __initconst = { | ||
2534 | + .ctrl = s3c64xx_pin_ctrl, | ||
2535 | + .num_ctrl = ARRAY_SIZE(s3c64xx_pin_ctrl), | ||
2536 | +}; | ||
2537 | diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c | ||
2538 | index e04f7fe0a65d..26e8fab736f1 100644 | ||
2539 | --- a/drivers/pinctrl/samsung/pinctrl-samsung.c | ||
2540 | +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c | ||
2541 | @@ -947,12 +947,33 @@ static int samsung_gpiolib_register(struct platform_device *pdev, | ||
2542 | return 0; | ||
2543 | } | ||
2544 | |||
2545 | +static const struct samsung_pin_ctrl * | ||
2546 | +samsung_pinctrl_get_soc_data_for_of_alias(struct platform_device *pdev) | ||
2547 | +{ | ||
2548 | + struct device_node *node = pdev->dev.of_node; | ||
2549 | + const struct samsung_pinctrl_of_match_data *of_data; | ||
2550 | + int id; | ||
2551 | + | ||
2552 | + id = of_alias_get_id(node, "pinctrl"); | ||
2553 | + if (id < 0) { | ||
2554 | + dev_err(&pdev->dev, "failed to get alias id\n"); | ||
2555 | + return NULL; | ||
2556 | + } | ||
2557 | + | ||
2558 | + of_data = of_device_get_match_data(&pdev->dev); | ||
2559 | + if (id >= of_data->num_ctrl) { | ||
2560 | + dev_err(&pdev->dev, "invalid alias id %d\n", id); | ||
2561 | + return NULL; | ||
2562 | + } | ||
2563 | + | ||
2564 | + return &(of_data->ctrl[id]); | ||
2565 | +} | ||
2566 | + | ||
2567 | /* retrieve the soc specific data */ | ||
2568 | static const struct samsung_pin_ctrl * | ||
2569 | samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, | ||
2570 | struct platform_device *pdev) | ||
2571 | { | ||
2572 | - int id; | ||
2573 | struct device_node *node = pdev->dev.of_node; | ||
2574 | struct device_node *np; | ||
2575 | const struct samsung_pin_bank_data *bdata; | ||
2576 | @@ -962,13 +983,9 @@ samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, | ||
2577 | void __iomem *virt_base[SAMSUNG_PINCTRL_NUM_RESOURCES]; | ||
2578 | unsigned int i; | ||
2579 | |||
2580 | - id = of_alias_get_id(node, "pinctrl"); | ||
2581 | - if (id < 0) { | ||
2582 | - dev_err(&pdev->dev, "failed to get alias id\n"); | ||
2583 | + ctrl = samsung_pinctrl_get_soc_data_for_of_alias(pdev); | ||
2584 | + if (!ctrl) | ||
2585 | return ERR_PTR(-ENOENT); | ||
2586 | - } | ||
2587 | - ctrl = of_device_get_match_data(&pdev->dev); | ||
2588 | - ctrl += id; | ||
2589 | |||
2590 | d->suspend = ctrl->suspend; | ||
2591 | d->resume = ctrl->resume; | ||
2592 | @@ -1193,41 +1210,41 @@ static int __maybe_unused samsung_pinctrl_resume(struct device *dev) | ||
2593 | static const struct of_device_id samsung_pinctrl_dt_match[] = { | ||
2594 | #ifdef CONFIG_PINCTRL_EXYNOS_ARM | ||
2595 | { .compatible = "samsung,exynos3250-pinctrl", | ||
2596 | - .data = exynos3250_pin_ctrl }, | ||
2597 | + .data = &exynos3250_of_data }, | ||
2598 | { .compatible = "samsung,exynos4210-pinctrl", | ||
2599 | - .data = exynos4210_pin_ctrl }, | ||
2600 | + .data = &exynos4210_of_data }, | ||
2601 | { .compatible = "samsung,exynos4x12-pinctrl", | ||
2602 | - .data = exynos4x12_pin_ctrl }, | ||
2603 | + .data = &exynos4x12_of_data }, | ||
2604 | { .compatible = "samsung,exynos5250-pinctrl", | ||
2605 | - .data = exynos5250_pin_ctrl }, | ||
2606 | + .data = &exynos5250_of_data }, | ||
2607 | { .compatible = "samsung,exynos5260-pinctrl", | ||
2608 | - .data = exynos5260_pin_ctrl }, | ||
2609 | + .data = &exynos5260_of_data }, | ||
2610 | { .compatible = "samsung,exynos5410-pinctrl", | ||
2611 | - .data = exynos5410_pin_ctrl }, | ||
2612 | + .data = &exynos5410_of_data }, | ||
2613 | { .compatible = "samsung,exynos5420-pinctrl", | ||
2614 | - .data = exynos5420_pin_ctrl }, | ||
2615 | + .data = &exynos5420_of_data }, | ||
2616 | { .compatible = "samsung,s5pv210-pinctrl", | ||
2617 | - .data = s5pv210_pin_ctrl }, | ||
2618 | + .data = &s5pv210_of_data }, | ||
2619 | #endif | ||
2620 | #ifdef CONFIG_PINCTRL_EXYNOS_ARM64 | ||
2621 | { .compatible = "samsung,exynos5433-pinctrl", | ||
2622 | - .data = exynos5433_pin_ctrl }, | ||
2623 | + .data = &exynos5433_of_data }, | ||
2624 | { .compatible = "samsung,exynos7-pinctrl", | ||
2625 | - .data = exynos7_pin_ctrl }, | ||
2626 | + .data = &exynos7_of_data }, | ||
2627 | #endif | ||
2628 | #ifdef CONFIG_PINCTRL_S3C64XX | ||
2629 | { .compatible = "samsung,s3c64xx-pinctrl", | ||
2630 | - .data = s3c64xx_pin_ctrl }, | ||
2631 | + .data = &s3c64xx_of_data }, | ||
2632 | #endif | ||
2633 | #ifdef CONFIG_PINCTRL_S3C24XX | ||
2634 | { .compatible = "samsung,s3c2412-pinctrl", | ||
2635 | - .data = s3c2412_pin_ctrl }, | ||
2636 | + .data = &s3c2412_of_data }, | ||
2637 | { .compatible = "samsung,s3c2416-pinctrl", | ||
2638 | - .data = s3c2416_pin_ctrl }, | ||
2639 | + .data = &s3c2416_of_data }, | ||
2640 | { .compatible = "samsung,s3c2440-pinctrl", | ||
2641 | - .data = s3c2440_pin_ctrl }, | ||
2642 | + .data = &s3c2440_of_data }, | ||
2643 | { .compatible = "samsung,s3c2450-pinctrl", | ||
2644 | - .data = s3c2450_pin_ctrl }, | ||
2645 | + .data = &s3c2450_of_data }, | ||
2646 | #endif | ||
2647 | {}, | ||
2648 | }; | ||
2649 | diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h | ||
2650 | index 9af07af6cad6..ae932e0c05f2 100644 | ||
2651 | --- a/drivers/pinctrl/samsung/pinctrl-samsung.h | ||
2652 | +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h | ||
2653 | @@ -285,6 +285,16 @@ struct samsung_pinctrl_drv_data { | ||
2654 | void (*resume)(struct samsung_pinctrl_drv_data *); | ||
2655 | }; | ||
2656 | |||
2657 | +/** | ||
2658 | + * struct samsung_pinctrl_of_match_data: OF match device specific configuration data. | ||
2659 | + * @ctrl: array of pin controller data. | ||
2660 | + * @num_ctrl: size of array @ctrl. | ||
2661 | + */ | ||
2662 | +struct samsung_pinctrl_of_match_data { | ||
2663 | + const struct samsung_pin_ctrl *ctrl; | ||
2664 | + unsigned int num_ctrl; | ||
2665 | +}; | ||
2666 | + | ||
2667 | /** | ||
2668 | * struct samsung_pin_group: represent group of pins of a pinmux function. | ||
2669 | * @name: name of the pin group, used to lookup the group. | ||
2670 | @@ -313,20 +323,20 @@ struct samsung_pmx_func { | ||
2671 | }; | ||
2672 | |||
2673 | /* list of all exported SoC specific data */ | ||
2674 | -extern const struct samsung_pin_ctrl exynos3250_pin_ctrl[]; | ||
2675 | -extern const struct samsung_pin_ctrl exynos4210_pin_ctrl[]; | ||
2676 | -extern const struct samsung_pin_ctrl exynos4x12_pin_ctrl[]; | ||
2677 | -extern const struct samsung_pin_ctrl exynos5250_pin_ctrl[]; | ||
2678 | -extern const struct samsung_pin_ctrl exynos5260_pin_ctrl[]; | ||
2679 | -extern const struct samsung_pin_ctrl exynos5410_pin_ctrl[]; | ||
2680 | -extern const struct samsung_pin_ctrl exynos5420_pin_ctrl[]; | ||
2681 | -extern const struct samsung_pin_ctrl exynos5433_pin_ctrl[]; | ||
2682 | -extern const struct samsung_pin_ctrl exynos7_pin_ctrl[]; | ||
2683 | -extern const struct samsung_pin_ctrl s3c64xx_pin_ctrl[]; | ||
2684 | -extern const struct samsung_pin_ctrl s3c2412_pin_ctrl[]; | ||
2685 | -extern const struct samsung_pin_ctrl s3c2416_pin_ctrl[]; | ||
2686 | -extern const struct samsung_pin_ctrl s3c2440_pin_ctrl[]; | ||
2687 | -extern const struct samsung_pin_ctrl s3c2450_pin_ctrl[]; | ||
2688 | -extern const struct samsung_pin_ctrl s5pv210_pin_ctrl[]; | ||
2689 | +extern const struct samsung_pinctrl_of_match_data exynos3250_of_data; | ||
2690 | +extern const struct samsung_pinctrl_of_match_data exynos4210_of_data; | ||
2691 | +extern const struct samsung_pinctrl_of_match_data exynos4x12_of_data; | ||
2692 | +extern const struct samsung_pinctrl_of_match_data exynos5250_of_data; | ||
2693 | +extern const struct samsung_pinctrl_of_match_data exynos5260_of_data; | ||
2694 | +extern const struct samsung_pinctrl_of_match_data exynos5410_of_data; | ||
2695 | +extern const struct samsung_pinctrl_of_match_data exynos5420_of_data; | ||
2696 | +extern const struct samsung_pinctrl_of_match_data exynos5433_of_data; | ||
2697 | +extern const struct samsung_pinctrl_of_match_data exynos7_of_data; | ||
2698 | +extern const struct samsung_pinctrl_of_match_data s3c64xx_of_data; | ||
2699 | +extern const struct samsung_pinctrl_of_match_data s3c2412_of_data; | ||
2700 | +extern const struct samsung_pinctrl_of_match_data s3c2416_of_data; | ||
2701 | +extern const struct samsung_pinctrl_of_match_data s3c2440_of_data; | ||
2702 | +extern const struct samsung_pinctrl_of_match_data s3c2450_of_data; | ||
2703 | +extern const struct samsung_pinctrl_of_match_data s5pv210_of_data; | ||
2704 | |||
2705 | #endif /* __PINCTRL_SAMSUNG_H */ | ||
2706 | diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c | ||
2707 | index 86196ffd2faf..fa3e4b7e0c9f 100644 | ||
2708 | --- a/drivers/staging/android/ion/ion_cma_heap.c | ||
2709 | +++ b/drivers/staging/android/ion/ion_cma_heap.c | ||
2710 | @@ -21,6 +21,7 @@ | ||
2711 | #include <linux/err.h> | ||
2712 | #include <linux/cma.h> | ||
2713 | #include <linux/scatterlist.h> | ||
2714 | +#include <linux/highmem.h> | ||
2715 | |||
2716 | #include "ion.h" | ||
2717 | |||
2718 | @@ -51,6 +52,22 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, | ||
2719 | if (!pages) | ||
2720 | return -ENOMEM; | ||
2721 | |||
2722 | + if (PageHighMem(pages)) { | ||
2723 | + unsigned long nr_clear_pages = nr_pages; | ||
2724 | + struct page *page = pages; | ||
2725 | + | ||
2726 | + while (nr_clear_pages > 0) { | ||
2727 | + void *vaddr = kmap_atomic(page); | ||
2728 | + | ||
2729 | + memset(vaddr, 0, PAGE_SIZE); | ||
2730 | + kunmap_atomic(vaddr); | ||
2731 | + page++; | ||
2732 | + nr_clear_pages--; | ||
2733 | + } | ||
2734 | + } else { | ||
2735 | + memset(page_address(pages), 0, size); | ||
2736 | + } | ||
2737 | + | ||
2738 | table = kmalloc(sizeof(*table), GFP_KERNEL); | ||
2739 | if (!table) | ||
2740 | goto err; | ||
2741 | diff --git a/drivers/staging/lustre/lustre/ptlrpc/sec.c b/drivers/staging/lustre/lustre/ptlrpc/sec.c | ||
2742 | index cd7a5391a574..0a3f832095ea 100644 | ||
2743 | --- a/drivers/staging/lustre/lustre/ptlrpc/sec.c | ||
2744 | +++ b/drivers/staging/lustre/lustre/ptlrpc/sec.c | ||
2745 | @@ -847,7 +847,7 @@ void sptlrpc_request_out_callback(struct ptlrpc_request *req) | ||
2746 | if (req->rq_pool || !req->rq_reqbuf) | ||
2747 | return; | ||
2748 | |||
2749 | - kfree(req->rq_reqbuf); | ||
2750 | + kvfree(req->rq_reqbuf); | ||
2751 | req->rq_reqbuf = NULL; | ||
2752 | req->rq_reqbuf_len = 0; | ||
2753 | } | ||
2754 | diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c | ||
2755 | index 2ebaba16f785..5a5813d01cf8 100644 | ||
2756 | --- a/drivers/tty/vt/vt.c | ||
2757 | +++ b/drivers/tty/vt/vt.c | ||
2758 | @@ -1725,7 +1725,7 @@ static void reset_terminal(struct vc_data *vc, int do_clear) | ||
2759 | default_attr(vc); | ||
2760 | update_attr(vc); | ||
2761 | |||
2762 | - vc->vc_tab_stop[0] = 0x01010100; | ||
2763 | + vc->vc_tab_stop[0] = | ||
2764 | vc->vc_tab_stop[1] = | ||
2765 | vc->vc_tab_stop[2] = | ||
2766 | vc->vc_tab_stop[3] = | ||
2767 | @@ -1769,7 +1769,7 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) | ||
2768 | vc->vc_pos -= (vc->vc_x << 1); | ||
2769 | while (vc->vc_x < vc->vc_cols - 1) { | ||
2770 | vc->vc_x++; | ||
2771 | - if (vc->vc_tab_stop[vc->vc_x >> 5] & (1 << (vc->vc_x & 31))) | ||
2772 | + if (vc->vc_tab_stop[7 & (vc->vc_x >> 5)] & (1 << (vc->vc_x & 31))) | ||
2773 | break; | ||
2774 | } | ||
2775 | vc->vc_pos += (vc->vc_x << 1); | ||
2776 | @@ -1829,7 +1829,7 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) | ||
2777 | lf(vc); | ||
2778 | return; | ||
2779 | case 'H': | ||
2780 | - vc->vc_tab_stop[vc->vc_x >> 5] |= (1 << (vc->vc_x & 31)); | ||
2781 | + vc->vc_tab_stop[7 & (vc->vc_x >> 5)] |= (1 << (vc->vc_x & 31)); | ||
2782 | return; | ||
2783 | case 'Z': | ||
2784 | respond_ID(tty); | ||
2785 | @@ -2022,7 +2022,7 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) | ||
2786 | return; | ||
2787 | case 'g': | ||
2788 | if (!vc->vc_par[0]) | ||
2789 | - vc->vc_tab_stop[vc->vc_x >> 5] &= ~(1 << (vc->vc_x & 31)); | ||
2790 | + vc->vc_tab_stop[7 & (vc->vc_x >> 5)] &= ~(1 << (vc->vc_x & 31)); | ||
2791 | else if (vc->vc_par[0] == 3) { | ||
2792 | vc->vc_tab_stop[0] = | ||
2793 | vc->vc_tab_stop[1] = | ||
2794 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c | ||
2795 | index a2336deb5e36..9762333d8d7f 100644 | ||
2796 | --- a/drivers/usb/host/xhci-hub.c | ||
2797 | +++ b/drivers/usb/host/xhci-hub.c | ||
2798 | @@ -634,7 +634,10 @@ static int xhci_enter_test_mode(struct xhci_hcd *xhci, | ||
2799 | xhci_dbg(xhci, "Disable all slots\n"); | ||
2800 | spin_unlock_irqrestore(&xhci->lock, *flags); | ||
2801 | for (i = 1; i <= HCS_MAX_SLOTS(xhci->hcs_params1); i++) { | ||
2802 | - retval = xhci_disable_slot(xhci, NULL, i); | ||
2803 | + if (!xhci->devs[i]) | ||
2804 | + continue; | ||
2805 | + | ||
2806 | + retval = xhci_disable_slot(xhci, i); | ||
2807 | if (retval) | ||
2808 | xhci_err(xhci, "Failed to disable slot %d, %d. Enter test mode anyway\n", | ||
2809 | i, retval); | ||
2810 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
2811 | index bad76a7c7f2f..bcf315b32bff 100644 | ||
2812 | --- a/drivers/usb/host/xhci.c | ||
2813 | +++ b/drivers/usb/host/xhci.c | ||
2814 | @@ -3523,11 +3523,6 @@ static void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) | ||
2815 | struct xhci_virt_device *virt_dev; | ||
2816 | struct xhci_slot_ctx *slot_ctx; | ||
2817 | int i, ret; | ||
2818 | - struct xhci_command *command; | ||
2819 | - | ||
2820 | - command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); | ||
2821 | - if (!command) | ||
2822 | - return; | ||
2823 | |||
2824 | #ifndef CONFIG_USB_DEFAULT_PERSIST | ||
2825 | /* | ||
2826 | @@ -3543,10 +3538,8 @@ static void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) | ||
2827 | /* If the host is halted due to driver unload, we still need to free the | ||
2828 | * device. | ||
2829 | */ | ||
2830 | - if (ret <= 0 && ret != -ENODEV) { | ||
2831 | - kfree(command); | ||
2832 | + if (ret <= 0 && ret != -ENODEV) | ||
2833 | return; | ||
2834 | - } | ||
2835 | |||
2836 | virt_dev = xhci->devs[udev->slot_id]; | ||
2837 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); | ||
2838 | @@ -3558,26 +3551,21 @@ static void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) | ||
2839 | del_timer_sync(&virt_dev->eps[i].stop_cmd_timer); | ||
2840 | } | ||
2841 | |||
2842 | - xhci_disable_slot(xhci, command, udev->slot_id); | ||
2843 | + xhci_disable_slot(xhci, udev->slot_id); | ||
2844 | /* | ||
2845 | * Event command completion handler will free any data structures | ||
2846 | * associated with the slot. XXX Can free sleep? | ||
2847 | */ | ||
2848 | } | ||
2849 | |||
2850 | -int xhci_disable_slot(struct xhci_hcd *xhci, struct xhci_command *command, | ||
2851 | - u32 slot_id) | ||
2852 | +int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id) | ||
2853 | { | ||
2854 | + struct xhci_command *command; | ||
2855 | unsigned long flags; | ||
2856 | u32 state; | ||
2857 | int ret = 0; | ||
2858 | - struct xhci_virt_device *virt_dev; | ||
2859 | |||
2860 | - virt_dev = xhci->devs[slot_id]; | ||
2861 | - if (!virt_dev) | ||
2862 | - return -EINVAL; | ||
2863 | - if (!command) | ||
2864 | - command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); | ||
2865 | + command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); | ||
2866 | if (!command) | ||
2867 | return -ENOMEM; | ||
2868 | |||
2869 | @@ -3595,7 +3583,7 @@ int xhci_disable_slot(struct xhci_hcd *xhci, struct xhci_command *command, | ||
2870 | slot_id); | ||
2871 | if (ret) { | ||
2872 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
2873 | - xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); | ||
2874 | + kfree(command); | ||
2875 | return ret; | ||
2876 | } | ||
2877 | xhci_ring_cmd_db(xhci); | ||
2878 | @@ -3670,6 +3658,8 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) | ||
2879 | return 0; | ||
2880 | } | ||
2881 | |||
2882 | + xhci_free_command(xhci, command); | ||
2883 | + | ||
2884 | if ((xhci->quirks & XHCI_EP_LIMIT_QUIRK)) { | ||
2885 | spin_lock_irqsave(&xhci->lock, flags); | ||
2886 | ret = xhci_reserve_host_control_ep_resources(xhci); | ||
2887 | @@ -3705,18 +3695,12 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) | ||
2888 | pm_runtime_get_noresume(hcd->self.controller); | ||
2889 | #endif | ||
2890 | |||
2891 | - | ||
2892 | - xhci_free_command(xhci, command); | ||
2893 | /* Is this a LS or FS device under a HS hub? */ | ||
2894 | /* Hub or peripherial? */ | ||
2895 | return 1; | ||
2896 | |||
2897 | disable_slot: | ||
2898 | - /* Disable slot, if we can do it without mem alloc */ | ||
2899 | - kfree(command->completion); | ||
2900 | - command->completion = NULL; | ||
2901 | - command->status = 0; | ||
2902 | - return xhci_disable_slot(xhci, command, udev->slot_id); | ||
2903 | + return xhci_disable_slot(xhci, udev->slot_id); | ||
2904 | } | ||
2905 | |||
2906 | /* | ||
2907 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
2908 | index 2eaf6e1f12ee..f5fb1f4a092c 100644 | ||
2909 | --- a/drivers/usb/host/xhci.h | ||
2910 | +++ b/drivers/usb/host/xhci.h | ||
2911 | @@ -2014,8 +2014,7 @@ int xhci_run(struct usb_hcd *hcd); | ||
2912 | int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks); | ||
2913 | void xhci_init_driver(struct hc_driver *drv, | ||
2914 | const struct xhci_driver_overrides *over); | ||
2915 | -int xhci_disable_slot(struct xhci_hcd *xhci, | ||
2916 | - struct xhci_command *command, u32 slot_id); | ||
2917 | +int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id); | ||
2918 | |||
2919 | int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup); | ||
2920 | int xhci_resume(struct xhci_hcd *xhci, bool hibernated); | ||
2921 | diff --git a/drivers/watchdog/wdat_wdt.c b/drivers/watchdog/wdat_wdt.c | ||
2922 | index 6d1fbda0f461..0da9943d405f 100644 | ||
2923 | --- a/drivers/watchdog/wdat_wdt.c | ||
2924 | +++ b/drivers/watchdog/wdat_wdt.c | ||
2925 | @@ -392,7 +392,7 @@ static int wdat_wdt_probe(struct platform_device *pdev) | ||
2926 | |||
2927 | memset(&r, 0, sizeof(r)); | ||
2928 | r.start = gas->address; | ||
2929 | - r.end = r.start + gas->access_width; | ||
2930 | + r.end = r.start + gas->access_width - 1; | ||
2931 | if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { | ||
2932 | r.flags = IORESOURCE_MEM; | ||
2933 | } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { | ||
2934 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c | ||
2935 | index ed113ea17aff..3b293d0d1785 100644 | ||
2936 | --- a/fs/hugetlbfs/inode.c | ||
2937 | +++ b/fs/hugetlbfs/inode.c | ||
2938 | @@ -118,6 +118,16 @@ static void huge_pagevec_release(struct pagevec *pvec) | ||
2939 | pagevec_reinit(pvec); | ||
2940 | } | ||
2941 | |||
2942 | +/* | ||
2943 | + * Mask used when checking the page offset value passed in via system | ||
2944 | + * calls. This value will be converted to a loff_t which is signed. | ||
2945 | + * Therefore, we want to check the upper PAGE_SHIFT + 1 bits of the | ||
2946 | + * value. The extra bit (- 1 in the shift value) is to take the sign | ||
2947 | + * bit into account. | ||
2948 | + */ | ||
2949 | +#define PGOFF_LOFFT_MAX \ | ||
2950 | + (((1UL << (PAGE_SHIFT + 1)) - 1) << (BITS_PER_LONG - (PAGE_SHIFT + 1))) | ||
2951 | + | ||
2952 | static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) | ||
2953 | { | ||
2954 | struct inode *inode = file_inode(file); | ||
2955 | @@ -137,12 +147,13 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) | ||
2956 | vma->vm_ops = &hugetlb_vm_ops; | ||
2957 | |||
2958 | /* | ||
2959 | - * Offset passed to mmap (before page shift) could have been | ||
2960 | - * negative when represented as a (l)off_t. | ||
2961 | + * page based offset in vm_pgoff could be sufficiently large to | ||
2962 | + * overflow a (l)off_t when converted to byte offset. | ||
2963 | */ | ||
2964 | - if (((loff_t)vma->vm_pgoff << PAGE_SHIFT) < 0) | ||
2965 | + if (vma->vm_pgoff & PGOFF_LOFFT_MAX) | ||
2966 | return -EINVAL; | ||
2967 | |||
2968 | + /* must be huge page aligned */ | ||
2969 | if (vma->vm_pgoff & (~huge_page_mask(h) >> PAGE_SHIFT)) | ||
2970 | return -EINVAL; | ||
2971 | |||
2972 | diff --git a/fs/ncpfs/ncplib_kernel.c b/fs/ncpfs/ncplib_kernel.c | ||
2973 | index 804adfebba2f..3e047eb4cc7c 100644 | ||
2974 | --- a/fs/ncpfs/ncplib_kernel.c | ||
2975 | +++ b/fs/ncpfs/ncplib_kernel.c | ||
2976 | @@ -981,6 +981,10 @@ ncp_read_kernel(struct ncp_server *server, const char *file_id, | ||
2977 | goto out; | ||
2978 | } | ||
2979 | *bytes_read = ncp_reply_be16(server, 0); | ||
2980 | + if (*bytes_read > to_read) { | ||
2981 | + result = -EINVAL; | ||
2982 | + goto out; | ||
2983 | + } | ||
2984 | source = ncp_reply_data(server, 2 + (offset & 1)); | ||
2985 | |||
2986 | memcpy(target, source, *bytes_read); | ||
2987 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c | ||
2988 | index d89e6ccd33ba..3cef6bfa09d4 100644 | ||
2989 | --- a/fs/nfsd/nfs4state.c | ||
2990 | +++ b/fs/nfsd/nfs4state.c | ||
2991 | @@ -263,6 +263,35 @@ free_blocked_lock(struct nfsd4_blocked_lock *nbl) | ||
2992 | kfree(nbl); | ||
2993 | } | ||
2994 | |||
2995 | +static void | ||
2996 | +remove_blocked_locks(struct nfs4_lockowner *lo) | ||
2997 | +{ | ||
2998 | + struct nfs4_client *clp = lo->lo_owner.so_client; | ||
2999 | + struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id); | ||
3000 | + struct nfsd4_blocked_lock *nbl; | ||
3001 | + LIST_HEAD(reaplist); | ||
3002 | + | ||
3003 | + /* Dequeue all blocked locks */ | ||
3004 | + spin_lock(&nn->blocked_locks_lock); | ||
3005 | + while (!list_empty(&lo->lo_blocked)) { | ||
3006 | + nbl = list_first_entry(&lo->lo_blocked, | ||
3007 | + struct nfsd4_blocked_lock, | ||
3008 | + nbl_list); | ||
3009 | + list_del_init(&nbl->nbl_list); | ||
3010 | + list_move(&nbl->nbl_lru, &reaplist); | ||
3011 | + } | ||
3012 | + spin_unlock(&nn->blocked_locks_lock); | ||
3013 | + | ||
3014 | + /* Now free them */ | ||
3015 | + while (!list_empty(&reaplist)) { | ||
3016 | + nbl = list_first_entry(&reaplist, struct nfsd4_blocked_lock, | ||
3017 | + nbl_lru); | ||
3018 | + list_del_init(&nbl->nbl_lru); | ||
3019 | + posix_unblock_lock(&nbl->nbl_lock); | ||
3020 | + free_blocked_lock(nbl); | ||
3021 | + } | ||
3022 | +} | ||
3023 | + | ||
3024 | static int | ||
3025 | nfsd4_cb_notify_lock_done(struct nfsd4_callback *cb, struct rpc_task *task) | ||
3026 | { | ||
3027 | @@ -1854,6 +1883,7 @@ static __be32 mark_client_expired_locked(struct nfs4_client *clp) | ||
3028 | static void | ||
3029 | __destroy_client(struct nfs4_client *clp) | ||
3030 | { | ||
3031 | + int i; | ||
3032 | struct nfs4_openowner *oo; | ||
3033 | struct nfs4_delegation *dp; | ||
3034 | struct list_head reaplist; | ||
3035 | @@ -1883,6 +1913,16 @@ __destroy_client(struct nfs4_client *clp) | ||
3036 | nfs4_get_stateowner(&oo->oo_owner); | ||
3037 | release_openowner(oo); | ||
3038 | } | ||
3039 | + for (i = 0; i < OWNER_HASH_SIZE; i++) { | ||
3040 | + struct nfs4_stateowner *so, *tmp; | ||
3041 | + | ||
3042 | + list_for_each_entry_safe(so, tmp, &clp->cl_ownerstr_hashtbl[i], | ||
3043 | + so_strhash) { | ||
3044 | + /* Should be no openowners at this point */ | ||
3045 | + WARN_ON_ONCE(so->so_is_open_owner); | ||
3046 | + remove_blocked_locks(lockowner(so)); | ||
3047 | + } | ||
3048 | + } | ||
3049 | nfsd4_return_all_client_layouts(clp); | ||
3050 | nfsd4_shutdown_callback(clp); | ||
3051 | if (clp->cl_cb_conn.cb_xprt) | ||
3052 | @@ -6275,6 +6315,7 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp, | ||
3053 | } | ||
3054 | spin_unlock(&clp->cl_lock); | ||
3055 | free_ol_stateid_reaplist(&reaplist); | ||
3056 | + remove_blocked_locks(lo); | ||
3057 | nfs4_put_stateowner(&lo->lo_owner); | ||
3058 | |||
3059 | return status; | ||
3060 | @@ -7060,6 +7101,8 @@ nfs4_state_destroy_net(struct net *net) | ||
3061 | } | ||
3062 | } | ||
3063 | |||
3064 | + WARN_ON(!list_empty(&nn->blocked_locks_lru)); | ||
3065 | + | ||
3066 | for (i = 0; i < CLIENT_HASH_SIZE; i++) { | ||
3067 | while (!list_empty(&nn->unconf_id_hashtbl[i])) { | ||
3068 | clp = list_entry(nn->unconf_id_hashtbl[i].next, struct nfs4_client, cl_idhash); | ||
3069 | @@ -7126,7 +7169,6 @@ nfs4_state_shutdown_net(struct net *net) | ||
3070 | struct nfs4_delegation *dp = NULL; | ||
3071 | struct list_head *pos, *next, reaplist; | ||
3072 | struct nfsd_net *nn = net_generic(net, nfsd_net_id); | ||
3073 | - struct nfsd4_blocked_lock *nbl; | ||
3074 | |||
3075 | cancel_delayed_work_sync(&nn->laundromat_work); | ||
3076 | locks_end_grace(&nn->nfsd4_manager); | ||
3077 | @@ -7147,24 +7189,6 @@ nfs4_state_shutdown_net(struct net *net) | ||
3078 | nfs4_put_stid(&dp->dl_stid); | ||
3079 | } | ||
3080 | |||
3081 | - BUG_ON(!list_empty(&reaplist)); | ||
3082 | - spin_lock(&nn->blocked_locks_lock); | ||
3083 | - while (!list_empty(&nn->blocked_locks_lru)) { | ||
3084 | - nbl = list_first_entry(&nn->blocked_locks_lru, | ||
3085 | - struct nfsd4_blocked_lock, nbl_lru); | ||
3086 | - list_move(&nbl->nbl_lru, &reaplist); | ||
3087 | - list_del_init(&nbl->nbl_list); | ||
3088 | - } | ||
3089 | - spin_unlock(&nn->blocked_locks_lock); | ||
3090 | - | ||
3091 | - while (!list_empty(&reaplist)) { | ||
3092 | - nbl = list_first_entry(&reaplist, | ||
3093 | - struct nfsd4_blocked_lock, nbl_lru); | ||
3094 | - list_del_init(&nbl->nbl_lru); | ||
3095 | - posix_unblock_lock(&nbl->nbl_lock); | ||
3096 | - free_blocked_lock(nbl); | ||
3097 | - } | ||
3098 | - | ||
3099 | nfsd4_client_tracking_exit(net); | ||
3100 | nfs4_state_destroy_net(net); | ||
3101 | } | ||
3102 | diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h | ||
3103 | index 045a7f52ab3a..77b891a8f191 100644 | ||
3104 | --- a/include/asm-generic/pgtable.h | ||
3105 | +++ b/include/asm-generic/pgtable.h | ||
3106 | @@ -976,6 +976,8 @@ int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot); | ||
3107 | int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot); | ||
3108 | int pud_clear_huge(pud_t *pud); | ||
3109 | int pmd_clear_huge(pmd_t *pmd); | ||
3110 | +int pud_free_pmd_page(pud_t *pud); | ||
3111 | +int pmd_free_pte_page(pmd_t *pmd); | ||
3112 | #else /* !CONFIG_HAVE_ARCH_HUGE_VMAP */ | ||
3113 | static inline int p4d_set_huge(p4d_t *p4d, phys_addr_t addr, pgprot_t prot) | ||
3114 | { | ||
3115 | @@ -1001,6 +1003,14 @@ static inline int pmd_clear_huge(pmd_t *pmd) | ||
3116 | { | ||
3117 | return 0; | ||
3118 | } | ||
3119 | +static inline int pud_free_pmd_page(pud_t *pud) | ||
3120 | +{ | ||
3121 | + return 0; | ||
3122 | +} | ||
3123 | +static inline int pmd_free_pte_page(pmd_t *pmd) | ||
3124 | +{ | ||
3125 | + return 0; | ||
3126 | +} | ||
3127 | #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */ | ||
3128 | |||
3129 | #ifndef __HAVE_ARCH_FLUSH_PMD_TLB_RANGE | ||
3130 | diff --git a/include/drm/drm_syncobj.h b/include/drm/drm_syncobj.h | ||
3131 | index c00fee539822..6d45aae47b2e 100644 | ||
3132 | --- a/include/drm/drm_syncobj.h | ||
3133 | +++ b/include/drm/drm_syncobj.h | ||
3134 | @@ -60,11 +60,6 @@ struct drm_syncobj { | ||
3135 | * locks cb_list and write-locks fence. | ||
3136 | */ | ||
3137 | spinlock_t lock; | ||
3138 | - /** | ||
3139 | - * @file: | ||
3140 | - * a file backing for this syncobj. | ||
3141 | - */ | ||
3142 | - struct file *file; | ||
3143 | }; | ||
3144 | |||
3145 | typedef void (*drm_syncobj_func_t)(struct drm_syncobj *syncobj, | ||
3146 | diff --git a/include/linux/fsl_ifc.h b/include/linux/fsl_ifc.h | ||
3147 | index c332f0a45607..3fdfede2f0f3 100644 | ||
3148 | --- a/include/linux/fsl_ifc.h | ||
3149 | +++ b/include/linux/fsl_ifc.h | ||
3150 | @@ -734,11 +734,7 @@ struct fsl_ifc_nand { | ||
3151 | u32 res19[0x10]; | ||
3152 | __be32 nand_fsr; | ||
3153 | u32 res20; | ||
3154 | - /* The V1 nand_eccstat is actually 4 words that overlaps the | ||
3155 | - * V2 nand_eccstat. | ||
3156 | - */ | ||
3157 | - __be32 v1_nand_eccstat[2]; | ||
3158 | - __be32 v2_nand_eccstat[6]; | ||
3159 | + __be32 nand_eccstat[8]; | ||
3160 | u32 res21[0x1c]; | ||
3161 | __be32 nanndcr; | ||
3162 | u32 res22[0x2]; | ||
3163 | diff --git a/include/linux/memblock.h b/include/linux/memblock.h | ||
3164 | index bae11c7e7bf3..2dec2d4b469b 100644 | ||
3165 | --- a/include/linux/memblock.h | ||
3166 | +++ b/include/linux/memblock.h | ||
3167 | @@ -187,7 +187,6 @@ int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn, | ||
3168 | unsigned long *end_pfn); | ||
3169 | void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn, | ||
3170 | unsigned long *out_end_pfn, int *out_nid); | ||
3171 | -unsigned long memblock_next_valid_pfn(unsigned long pfn, unsigned long max_pfn); | ||
3172 | |||
3173 | /** | ||
3174 | * for_each_mem_pfn_range - early memory pfn range iterator | ||
3175 | diff --git a/include/trace/events/mmc.h b/include/trace/events/mmc.h | ||
3176 | index 200f731be557..7b706ff21335 100644 | ||
3177 | --- a/include/trace/events/mmc.h | ||
3178 | +++ b/include/trace/events/mmc.h | ||
3179 | @@ -86,8 +86,8 @@ TRACE_EVENT(mmc_request_start, | ||
3180 | __entry->stop_flags, __entry->stop_retries, | ||
3181 | __entry->sbc_opcode, __entry->sbc_arg, | ||
3182 | __entry->sbc_flags, __entry->sbc_retries, | ||
3183 | - __entry->blocks, __entry->blk_addr, | ||
3184 | - __entry->blksz, __entry->data_flags, __entry->tag, | ||
3185 | + __entry->blocks, __entry->blksz, | ||
3186 | + __entry->blk_addr, __entry->data_flags, __entry->tag, | ||
3187 | __entry->can_retune, __entry->doing_retune, | ||
3188 | __entry->retune_now, __entry->need_retune, | ||
3189 | __entry->hold_retune, __entry->retune_period) | ||
3190 | diff --git a/include/uapi/linux/usb/audio.h b/include/uapi/linux/usb/audio.h | ||
3191 | index 17a022c5b414..da3315ed1bcd 100644 | ||
3192 | --- a/include/uapi/linux/usb/audio.h | ||
3193 | +++ b/include/uapi/linux/usb/audio.h | ||
3194 | @@ -370,7 +370,7 @@ static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_d | ||
3195 | { | ||
3196 | return (protocol == UAC_VERSION_1) ? | ||
3197 | desc->baSourceID[desc->bNrInPins + 4] : | ||
3198 | - desc->baSourceID[desc->bNrInPins + 6]; | ||
3199 | + 2; /* in UAC2, this value is constant */ | ||
3200 | } | ||
3201 | |||
3202 | static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, | ||
3203 | @@ -378,7 +378,7 @@ static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_de | ||
3204 | { | ||
3205 | return (protocol == UAC_VERSION_1) ? | ||
3206 | &desc->baSourceID[desc->bNrInPins + 5] : | ||
3207 | - &desc->baSourceID[desc->bNrInPins + 7]; | ||
3208 | + &desc->baSourceID[desc->bNrInPins + 6]; | ||
3209 | } | ||
3210 | |||
3211 | static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, | ||
3212 | diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c | ||
3213 | index 25d074920a00..4e933219fec6 100644 | ||
3214 | --- a/kernel/bpf/syscall.c | ||
3215 | +++ b/kernel/bpf/syscall.c | ||
3216 | @@ -1455,7 +1455,7 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, siz | ||
3217 | union bpf_attr attr = {}; | ||
3218 | int err; | ||
3219 | |||
3220 | - if (!capable(CAP_SYS_ADMIN) && sysctl_unprivileged_bpf_disabled) | ||
3221 | + if (sysctl_unprivileged_bpf_disabled && !capable(CAP_SYS_ADMIN)) | ||
3222 | return -EPERM; | ||
3223 | |||
3224 | err = check_uarg_tail_zero(uattr, sizeof(attr), size); | ||
3225 | diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c | ||
3226 | index 030e4286f14c..76c0ef2cb509 100644 | ||
3227 | --- a/kernel/cgroup/cgroup.c | ||
3228 | +++ b/kernel/cgroup/cgroup.c | ||
3229 | @@ -3148,6 +3148,16 @@ static int cgroup_enable_threaded(struct cgroup *cgrp) | ||
3230 | if (cgroup_is_threaded(cgrp)) | ||
3231 | return 0; | ||
3232 | |||
3233 | + /* | ||
3234 | + * If @cgroup is populated or has domain controllers enabled, it | ||
3235 | + * can't be switched. While the below cgroup_can_be_thread_root() | ||
3236 | + * test can catch the same conditions, that's only when @parent is | ||
3237 | + * not mixable, so let's check it explicitly. | ||
3238 | + */ | ||
3239 | + if (cgroup_is_populated(cgrp) || | ||
3240 | + cgrp->subtree_control & ~cgrp_dfl_threaded_ss_mask) | ||
3241 | + return -EOPNOTSUPP; | ||
3242 | + | ||
3243 | /* we're joining the parent's domain, ensure its validity */ | ||
3244 | if (!cgroup_is_valid_domain(dom_cgrp) || | ||
3245 | !cgroup_can_be_thread_root(dom_cgrp)) | ||
3246 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
3247 | index f42f7c7a8f84..cecd72eb09b8 100644 | ||
3248 | --- a/kernel/events/core.c | ||
3249 | +++ b/kernel/events/core.c | ||
3250 | @@ -2322,7 +2322,7 @@ static void ctx_resched(struct perf_cpu_context *cpuctx, | ||
3251 | struct perf_event_context *task_ctx, | ||
3252 | enum event_type_t event_type) | ||
3253 | { | ||
3254 | - enum event_type_t ctx_event_type = event_type & EVENT_ALL; | ||
3255 | + enum event_type_t ctx_event_type; | ||
3256 | bool cpu_event = !!(event_type & EVENT_CPU); | ||
3257 | |||
3258 | /* | ||
3259 | @@ -2332,6 +2332,8 @@ static void ctx_resched(struct perf_cpu_context *cpuctx, | ||
3260 | if (event_type & EVENT_PINNED) | ||
3261 | event_type |= EVENT_FLEXIBLE; | ||
3262 | |||
3263 | + ctx_event_type = event_type & EVENT_ALL; | ||
3264 | + | ||
3265 | perf_pmu_disable(cpuctx->ctx.pmu); | ||
3266 | if (task_ctx) | ||
3267 | task_ctx_sched_out(cpuctx, task_ctx, event_type); | ||
3268 | diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c | ||
3269 | index ec999f32c840..708992708332 100644 | ||
3270 | --- a/kernel/time/posix-timers.c | ||
3271 | +++ b/kernel/time/posix-timers.c | ||
3272 | @@ -50,6 +50,7 @@ | ||
3273 | #include <linux/export.h> | ||
3274 | #include <linux/hashtable.h> | ||
3275 | #include <linux/compat.h> | ||
3276 | +#include <linux/nospec.h> | ||
3277 | |||
3278 | #include "timekeeping.h" | ||
3279 | #include "posix-timers.h" | ||
3280 | @@ -1346,11 +1347,15 @@ static const struct k_clock * const posix_clocks[] = { | ||
3281 | |||
3282 | static const struct k_clock *clockid_to_kclock(const clockid_t id) | ||
3283 | { | ||
3284 | - if (id < 0) | ||
3285 | + clockid_t idx = id; | ||
3286 | + | ||
3287 | + if (id < 0) { | ||
3288 | return (id & CLOCKFD_MASK) == CLOCKFD ? | ||
3289 | &clock_posix_dynamic : &clock_posix_cpu; | ||
3290 | + } | ||
3291 | |||
3292 | - if (id >= ARRAY_SIZE(posix_clocks) || !posix_clocks[id]) | ||
3293 | + if (id >= ARRAY_SIZE(posix_clocks)) | ||
3294 | return NULL; | ||
3295 | - return posix_clocks[id]; | ||
3296 | + | ||
3297 | + return posix_clocks[array_index_nospec(idx, ARRAY_SIZE(posix_clocks))]; | ||
3298 | } | ||
3299 | diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c | ||
3300 | index 8a907e12b6b9..f8d3bd974bcc 100644 | ||
3301 | --- a/kernel/trace/trace_kprobe.c | ||
3302 | +++ b/kernel/trace/trace_kprobe.c | ||
3303 | @@ -635,7 +635,7 @@ static int create_trace_kprobe(int argc, char **argv) | ||
3304 | char *symbol = NULL, *event = NULL, *group = NULL; | ||
3305 | int maxactive = 0; | ||
3306 | char *arg; | ||
3307 | - unsigned long offset = 0; | ||
3308 | + long offset = 0; | ||
3309 | void *addr = NULL; | ||
3310 | char buf[MAX_EVENT_NAME_LEN]; | ||
3311 | |||
3312 | @@ -723,7 +723,7 @@ static int create_trace_kprobe(int argc, char **argv) | ||
3313 | symbol = argv[1]; | ||
3314 | /* TODO: support .init module functions */ | ||
3315 | ret = traceprobe_split_symbol_offset(symbol, &offset); | ||
3316 | - if (ret) { | ||
3317 | + if (ret || offset < 0 || offset > UINT_MAX) { | ||
3318 | pr_info("Failed to parse either an address or a symbol.\n"); | ||
3319 | return ret; | ||
3320 | } | ||
3321 | diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c | ||
3322 | index 52478f033f88..fe4513330412 100644 | ||
3323 | --- a/kernel/trace/trace_probe.c | ||
3324 | +++ b/kernel/trace/trace_probe.c | ||
3325 | @@ -320,7 +320,7 @@ static fetch_func_t get_fetch_size_function(const struct fetch_type *type, | ||
3326 | } | ||
3327 | |||
3328 | /* Split symbol and offset. */ | ||
3329 | -int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset) | ||
3330 | +int traceprobe_split_symbol_offset(char *symbol, long *offset) | ||
3331 | { | ||
3332 | char *tmp; | ||
3333 | int ret; | ||
3334 | @@ -328,13 +328,11 @@ int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset) | ||
3335 | if (!offset) | ||
3336 | return -EINVAL; | ||
3337 | |||
3338 | - tmp = strchr(symbol, '+'); | ||
3339 | + tmp = strpbrk(symbol, "+-"); | ||
3340 | if (tmp) { | ||
3341 | - /* skip sign because kstrtoul doesn't accept '+' */ | ||
3342 | - ret = kstrtoul(tmp + 1, 0, offset); | ||
3343 | + ret = kstrtol(tmp, 0, offset); | ||
3344 | if (ret) | ||
3345 | return ret; | ||
3346 | - | ||
3347 | *tmp = '\0'; | ||
3348 | } else | ||
3349 | *offset = 0; | ||
3350 | diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h | ||
3351 | index 903273c93e61..dc39472ca9e4 100644 | ||
3352 | --- a/kernel/trace/trace_probe.h | ||
3353 | +++ b/kernel/trace/trace_probe.h | ||
3354 | @@ -354,7 +354,7 @@ extern int traceprobe_conflict_field_name(const char *name, | ||
3355 | extern void traceprobe_update_arg(struct probe_arg *arg); | ||
3356 | extern void traceprobe_free_probe_arg(struct probe_arg *arg); | ||
3357 | |||
3358 | -extern int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset); | ||
3359 | +extern int traceprobe_split_symbol_offset(char *symbol, long *offset); | ||
3360 | |||
3361 | extern ssize_t traceprobe_probes_write(struct file *file, | ||
3362 | const char __user *buffer, size_t count, loff_t *ppos, | ||
3363 | diff --git a/lib/ioremap.c b/lib/ioremap.c | ||
3364 | index b808a390e4c3..54e5bbaa3200 100644 | ||
3365 | --- a/lib/ioremap.c | ||
3366 | +++ b/lib/ioremap.c | ||
3367 | @@ -91,7 +91,8 @@ static inline int ioremap_pmd_range(pud_t *pud, unsigned long addr, | ||
3368 | |||
3369 | if (ioremap_pmd_enabled() && | ||
3370 | ((next - addr) == PMD_SIZE) && | ||
3371 | - IS_ALIGNED(phys_addr + addr, PMD_SIZE)) { | ||
3372 | + IS_ALIGNED(phys_addr + addr, PMD_SIZE) && | ||
3373 | + pmd_free_pte_page(pmd)) { | ||
3374 | if (pmd_set_huge(pmd, phys_addr + addr, prot)) | ||
3375 | continue; | ||
3376 | } | ||
3377 | @@ -117,7 +118,8 @@ static inline int ioremap_pud_range(p4d_t *p4d, unsigned long addr, | ||
3378 | |||
3379 | if (ioremap_pud_enabled() && | ||
3380 | ((next - addr) == PUD_SIZE) && | ||
3381 | - IS_ALIGNED(phys_addr + addr, PUD_SIZE)) { | ||
3382 | + IS_ALIGNED(phys_addr + addr, PUD_SIZE) && | ||
3383 | + pud_free_pmd_page(pud)) { | ||
3384 | if (pud_set_huge(pud, phys_addr + addr, prot)) | ||
3385 | continue; | ||
3386 | } | ||
3387 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c | ||
3388 | index eba34cdfc3e5..a403d29da6fd 100644 | ||
3389 | --- a/mm/huge_memory.c | ||
3390 | +++ b/mm/huge_memory.c | ||
3391 | @@ -2739,11 +2739,13 @@ static unsigned long deferred_split_scan(struct shrinker *shrink, | ||
3392 | |||
3393 | list_for_each_safe(pos, next, &list) { | ||
3394 | page = list_entry((void *)pos, struct page, mapping); | ||
3395 | - lock_page(page); | ||
3396 | + if (!trylock_page(page)) | ||
3397 | + goto next; | ||
3398 | /* split_huge_page() removes page from list on success */ | ||
3399 | if (!split_huge_page(page)) | ||
3400 | split++; | ||
3401 | unlock_page(page); | ||
3402 | +next: | ||
3403 | put_page(page); | ||
3404 | } | ||
3405 | |||
3406 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
3407 | index c539941671b4..b1f841a9edd4 100644 | ||
3408 | --- a/mm/hugetlb.c | ||
3409 | +++ b/mm/hugetlb.c | ||
3410 | @@ -18,6 +18,7 @@ | ||
3411 | #include <linux/bootmem.h> | ||
3412 | #include <linux/sysfs.h> | ||
3413 | #include <linux/slab.h> | ||
3414 | +#include <linux/mmdebug.h> | ||
3415 | #include <linux/sched/signal.h> | ||
3416 | #include <linux/rmap.h> | ||
3417 | #include <linux/string_helpers.h> | ||
3418 | @@ -4344,6 +4345,12 @@ int hugetlb_reserve_pages(struct inode *inode, | ||
3419 | struct resv_map *resv_map; | ||
3420 | long gbl_reserve; | ||
3421 | |||
3422 | + /* This should never happen */ | ||
3423 | + if (from > to) { | ||
3424 | + VM_WARN(1, "%s called with a negative range\n", __func__); | ||
3425 | + return -EINVAL; | ||
3426 | + } | ||
3427 | + | ||
3428 | /* | ||
3429 | * Only apply hugepage reservation if asked. At fault time, an | ||
3430 | * attempt will be made for VM_NORESERVE to allocate a page | ||
3431 | diff --git a/mm/khugepaged.c b/mm/khugepaged.c | ||
3432 | index 43cb3043311b..2fe26634e1a2 100644 | ||
3433 | --- a/mm/khugepaged.c | ||
3434 | +++ b/mm/khugepaged.c | ||
3435 | @@ -530,7 +530,12 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, | ||
3436 | goto out; | ||
3437 | } | ||
3438 | |||
3439 | - VM_BUG_ON_PAGE(PageCompound(page), page); | ||
3440 | + /* TODO: teach khugepaged to collapse THP mapped with pte */ | ||
3441 | + if (PageCompound(page)) { | ||
3442 | + result = SCAN_PAGE_COMPOUND; | ||
3443 | + goto out; | ||
3444 | + } | ||
3445 | + | ||
3446 | VM_BUG_ON_PAGE(!PageAnon(page), page); | ||
3447 | |||
3448 | /* | ||
3449 | diff --git a/mm/memblock.c b/mm/memblock.c | ||
3450 | index 6dd303717a4d..e81d12c544e9 100644 | ||
3451 | --- a/mm/memblock.c | ||
3452 | +++ b/mm/memblock.c | ||
3453 | @@ -1101,34 +1101,6 @@ void __init_memblock __next_mem_pfn_range(int *idx, int nid, | ||
3454 | *out_nid = r->nid; | ||
3455 | } | ||
3456 | |||
3457 | -unsigned long __init_memblock memblock_next_valid_pfn(unsigned long pfn, | ||
3458 | - unsigned long max_pfn) | ||
3459 | -{ | ||
3460 | - struct memblock_type *type = &memblock.memory; | ||
3461 | - unsigned int right = type->cnt; | ||
3462 | - unsigned int mid, left = 0; | ||
3463 | - phys_addr_t addr = PFN_PHYS(++pfn); | ||
3464 | - | ||
3465 | - do { | ||
3466 | - mid = (right + left) / 2; | ||
3467 | - | ||
3468 | - if (addr < type->regions[mid].base) | ||
3469 | - right = mid; | ||
3470 | - else if (addr >= (type->regions[mid].base + | ||
3471 | - type->regions[mid].size)) | ||
3472 | - left = mid + 1; | ||
3473 | - else { | ||
3474 | - /* addr is within the region, so pfn is valid */ | ||
3475 | - return pfn; | ||
3476 | - } | ||
3477 | - } while (left < right); | ||
3478 | - | ||
3479 | - if (right == type->cnt) | ||
3480 | - return -1UL; | ||
3481 | - else | ||
3482 | - return PHYS_PFN(type->regions[right].base); | ||
3483 | -} | ||
3484 | - | ||
3485 | /** | ||
3486 | * memblock_set_node - set node ID on memblock regions | ||
3487 | * @base: base of area to set node ID for | ||
3488 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
3489 | index 6627caeeaf82..1d7693c35424 100644 | ||
3490 | --- a/mm/page_alloc.c | ||
3491 | +++ b/mm/page_alloc.c | ||
3492 | @@ -3532,7 +3532,7 @@ static bool __need_fs_reclaim(gfp_t gfp_mask) | ||
3493 | return false; | ||
3494 | |||
3495 | /* this guy won't enter reclaim */ | ||
3496 | - if ((current->flags & PF_MEMALLOC) && !(gfp_mask & __GFP_NOMEMALLOC)) | ||
3497 | + if (current->flags & PF_MEMALLOC) | ||
3498 | return false; | ||
3499 | |||
3500 | /* We're only interested __GFP_FS allocations for now */ | ||
3501 | @@ -5302,17 +5302,8 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, | ||
3502 | if (context != MEMMAP_EARLY) | ||
3503 | goto not_early; | ||
3504 | |||
3505 | - if (!early_pfn_valid(pfn)) { | ||
3506 | -#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP | ||
3507 | - /* | ||
3508 | - * Skip to the pfn preceding the next valid one (or | ||
3509 | - * end_pfn), such that we hit a valid pfn (or end_pfn) | ||
3510 | - * on our next iteration of the loop. | ||
3511 | - */ | ||
3512 | - pfn = memblock_next_valid_pfn(pfn, end_pfn) - 1; | ||
3513 | -#endif | ||
3514 | + if (!early_pfn_valid(pfn)) | ||
3515 | continue; | ||
3516 | - } | ||
3517 | if (!early_pfn_in_nid(pfn, nid)) | ||
3518 | continue; | ||
3519 | if (!update_defer_init(pgdat, pfn, end_pfn, &nr_initialised)) | ||
3520 | diff --git a/mm/shmem.c b/mm/shmem.c | ||
3521 | index 07a1d22807be..f383298b7280 100644 | ||
3522 | --- a/mm/shmem.c | ||
3523 | +++ b/mm/shmem.c | ||
3524 | @@ -493,36 +493,45 @@ static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo, | ||
3525 | info = list_entry(pos, struct shmem_inode_info, shrinklist); | ||
3526 | inode = &info->vfs_inode; | ||
3527 | |||
3528 | - if (nr_to_split && split >= nr_to_split) { | ||
3529 | - iput(inode); | ||
3530 | - continue; | ||
3531 | - } | ||
3532 | + if (nr_to_split && split >= nr_to_split) | ||
3533 | + goto leave; | ||
3534 | |||
3535 | - page = find_lock_page(inode->i_mapping, | ||
3536 | + page = find_get_page(inode->i_mapping, | ||
3537 | (inode->i_size & HPAGE_PMD_MASK) >> PAGE_SHIFT); | ||
3538 | if (!page) | ||
3539 | goto drop; | ||
3540 | |||
3541 | + /* No huge page at the end of the file: nothing to split */ | ||
3542 | if (!PageTransHuge(page)) { | ||
3543 | - unlock_page(page); | ||
3544 | put_page(page); | ||
3545 | goto drop; | ||
3546 | } | ||
3547 | |||
3548 | + /* | ||
3549 | + * Leave the inode on the list if we failed to lock | ||
3550 | + * the page at this time. | ||
3551 | + * | ||
3552 | + * Waiting for the lock may lead to deadlock in the | ||
3553 | + * reclaim path. | ||
3554 | + */ | ||
3555 | + if (!trylock_page(page)) { | ||
3556 | + put_page(page); | ||
3557 | + goto leave; | ||
3558 | + } | ||
3559 | + | ||
3560 | ret = split_huge_page(page); | ||
3561 | unlock_page(page); | ||
3562 | put_page(page); | ||
3563 | |||
3564 | - if (ret) { | ||
3565 | - /* split failed: leave it on the list */ | ||
3566 | - iput(inode); | ||
3567 | - continue; | ||
3568 | - } | ||
3569 | + /* If split failed leave the inode on the list */ | ||
3570 | + if (ret) | ||
3571 | + goto leave; | ||
3572 | |||
3573 | split++; | ||
3574 | drop: | ||
3575 | list_del_init(&info->shrinklist); | ||
3576 | removed++; | ||
3577 | +leave: | ||
3578 | iput(inode); | ||
3579 | } | ||
3580 | |||
3581 | diff --git a/mm/vmscan.c b/mm/vmscan.c | ||
3582 | index 441f346fb5e2..a8a3729bfaa9 100644 | ||
3583 | --- a/mm/vmscan.c | ||
3584 | +++ b/mm/vmscan.c | ||
3585 | @@ -1846,6 +1846,20 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, | ||
3586 | if (stat.nr_writeback && stat.nr_writeback == nr_taken) | ||
3587 | set_bit(PGDAT_WRITEBACK, &pgdat->flags); | ||
3588 | |||
3589 | + /* | ||
3590 | + * If dirty pages are scanned that are not queued for IO, it | ||
3591 | + * implies that flushers are not doing their job. This can | ||
3592 | + * happen when memory pressure pushes dirty pages to the end of | ||
3593 | + * the LRU before the dirty limits are breached and the dirty | ||
3594 | + * data has expired. It can also happen when the proportion of | ||
3595 | + * dirty pages grows not through writes but through memory | ||
3596 | + * pressure reclaiming all the clean cache. And in some cases, | ||
3597 | + * the flushers simply cannot keep up with the allocation | ||
3598 | + * rate. Nudge the flusher threads in case they are asleep. | ||
3599 | + */ | ||
3600 | + if (stat.nr_unqueued_dirty == nr_taken) | ||
3601 | + wakeup_flusher_threads(0, WB_REASON_VMSCAN); | ||
3602 | + | ||
3603 | /* | ||
3604 | * Legacy memcg will stall in page writeback so avoid forcibly | ||
3605 | * stalling here. | ||
3606 | @@ -1858,22 +1872,9 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, | ||
3607 | if (stat.nr_dirty && stat.nr_dirty == stat.nr_congested) | ||
3608 | set_bit(PGDAT_CONGESTED, &pgdat->flags); | ||
3609 | |||
3610 | - /* | ||
3611 | - * If dirty pages are scanned that are not queued for IO, it | ||
3612 | - * implies that flushers are not doing their job. This can | ||
3613 | - * happen when memory pressure pushes dirty pages to the end of | ||
3614 | - * the LRU before the dirty limits are breached and the dirty | ||
3615 | - * data has expired. It can also happen when the proportion of | ||
3616 | - * dirty pages grows not through writes but through memory | ||
3617 | - * pressure reclaiming all the clean cache. And in some cases, | ||
3618 | - * the flushers simply cannot keep up with the allocation | ||
3619 | - * rate. Nudge the flusher threads in case they are asleep, but | ||
3620 | - * also allow kswapd to start writing pages during reclaim. | ||
3621 | - */ | ||
3622 | - if (stat.nr_unqueued_dirty == nr_taken) { | ||
3623 | - wakeup_flusher_threads(0, WB_REASON_VMSCAN); | ||
3624 | + /* Allow kswapd to start writing pages during reclaim. */ | ||
3625 | + if (stat.nr_unqueued_dirty == nr_taken) | ||
3626 | set_bit(PGDAT_DIRTY, &pgdat->flags); | ||
3627 | - } | ||
3628 | |||
3629 | /* | ||
3630 | * If kswapd scans pages marked marked for immediate | ||
3631 | diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c | ||
3632 | index 386ee829c655..829e2f6bfb73 100644 | ||
3633 | --- a/sound/drivers/aloop.c | ||
3634 | +++ b/sound/drivers/aloop.c | ||
3635 | @@ -192,6 +192,11 @@ static inline void loopback_timer_stop(struct loopback_pcm *dpcm) | ||
3636 | dpcm->timer.expires = 0; | ||
3637 | } | ||
3638 | |||
3639 | +static inline void loopback_timer_stop_sync(struct loopback_pcm *dpcm) | ||
3640 | +{ | ||
3641 | + del_timer_sync(&dpcm->timer); | ||
3642 | +} | ||
3643 | + | ||
3644 | #define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) | ||
3645 | #define CABLE_VALID_CAPTURE (1 << SNDRV_PCM_STREAM_CAPTURE) | ||
3646 | #define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK|CABLE_VALID_CAPTURE) | ||
3647 | @@ -326,6 +331,8 @@ static int loopback_prepare(struct snd_pcm_substream *substream) | ||
3648 | struct loopback_cable *cable = dpcm->cable; | ||
3649 | int bps, salign; | ||
3650 | |||
3651 | + loopback_timer_stop_sync(dpcm); | ||
3652 | + | ||
3653 | salign = (snd_pcm_format_width(runtime->format) * | ||
3654 | runtime->channels) / 8; | ||
3655 | bps = salign * runtime->rate; | ||
3656 | @@ -659,7 +666,9 @@ static void free_cable(struct snd_pcm_substream *substream) | ||
3657 | return; | ||
3658 | if (cable->streams[!substream->stream]) { | ||
3659 | /* other stream is still alive */ | ||
3660 | + spin_lock_irq(&cable->lock); | ||
3661 | cable->streams[substream->stream] = NULL; | ||
3662 | + spin_unlock_irq(&cable->lock); | ||
3663 | } else { | ||
3664 | /* free the cable */ | ||
3665 | loopback->cables[substream->number][dev] = NULL; | ||
3666 | @@ -699,7 +708,6 @@ static int loopback_open(struct snd_pcm_substream *substream) | ||
3667 | loopback->cables[substream->number][dev] = cable; | ||
3668 | } | ||
3669 | dpcm->cable = cable; | ||
3670 | - cable->streams[substream->stream] = dpcm; | ||
3671 | |||
3672 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); | ||
3673 | |||
3674 | @@ -731,6 +739,11 @@ static int loopback_open(struct snd_pcm_substream *substream) | ||
3675 | runtime->hw = loopback_pcm_hardware; | ||
3676 | else | ||
3677 | runtime->hw = cable->hw; | ||
3678 | + | ||
3679 | + spin_lock_irq(&cable->lock); | ||
3680 | + cable->streams[substream->stream] = dpcm; | ||
3681 | + spin_unlock_irq(&cable->lock); | ||
3682 | + | ||
3683 | unlock: | ||
3684 | if (err < 0) { | ||
3685 | free_cable(substream); | ||
3686 | @@ -745,7 +758,7 @@ static int loopback_close(struct snd_pcm_substream *substream) | ||
3687 | struct loopback *loopback = substream->private_data; | ||
3688 | struct loopback_pcm *dpcm = substream->runtime->private_data; | ||
3689 | |||
3690 | - loopback_timer_stop(dpcm); | ||
3691 | + loopback_timer_stop_sync(dpcm); | ||
3692 | mutex_lock(&loopback->cable_lock); | ||
3693 | free_cable(substream); | ||
3694 | mutex_unlock(&loopback->cable_lock); | ||
3695 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
3696 | index d5017adf9feb..c507c69029e3 100644 | ||
3697 | --- a/sound/pci/hda/hda_intel.c | ||
3698 | +++ b/sound/pci/hda/hda_intel.c | ||
3699 | @@ -375,6 +375,7 @@ enum { | ||
3700 | ((pci)->device == 0x160c)) | ||
3701 | |||
3702 | #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) | ||
3703 | +#define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348) | ||
3704 | |||
3705 | static char *driver_short_names[] = { | ||
3706 | [AZX_DRIVER_ICH] = "HDA Intel", | ||
3707 | @@ -1744,6 +1745,10 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, | ||
3708 | else | ||
3709 | chip->bdl_pos_adj = bdl_pos_adj[dev]; | ||
3710 | |||
3711 | + /* Workaround for a communication error on CFL (bko#199007) */ | ||
3712 | + if (IS_CFL(pci)) | ||
3713 | + chip->polling_mode = 1; | ||
3714 | + | ||
3715 | err = azx_bus_init(chip, model[dev], &pci_hda_io_ops); | ||
3716 | if (err < 0) { | ||
3717 | kfree(hda); | ||
3718 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
3719 | index 3d19efd2783a..e44a9758f2eb 100644 | ||
3720 | --- a/sound/pci/hda/patch_realtek.c | ||
3721 | +++ b/sound/pci/hda/patch_realtek.c | ||
3722 | @@ -3107,6 +3107,8 @@ static void alc256_init(struct hda_codec *codec) | ||
3723 | |||
3724 | alc_update_coef_idx(codec, 0x46, 3 << 12, 0); | ||
3725 | alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ | ||
3726 | + alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ | ||
3727 | + alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); | ||
3728 | } | ||
3729 | |||
3730 | static void alc256_shutup(struct hda_codec *codec) | ||
3731 | @@ -3486,8 +3488,12 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) | ||
3732 | pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid); | ||
3733 | pinval &= ~AC_PINCTL_VREFEN; | ||
3734 | pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80; | ||
3735 | - if (spec->mute_led_nid) | ||
3736 | + if (spec->mute_led_nid) { | ||
3737 | + /* temporarily power up/down for setting VREF */ | ||
3738 | + snd_hda_power_up_pm(codec); | ||
3739 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); | ||
3740 | + snd_hda_power_down_pm(codec); | ||
3741 | + } | ||
3742 | } | ||
3743 | |||
3744 | /* Make sure the led works even in runtime suspend */ | ||
3745 | @@ -5352,6 +5358,7 @@ enum { | ||
3746 | ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, | ||
3747 | ALC298_FIXUP_TPT470_DOCK, | ||
3748 | ALC255_FIXUP_DUMMY_LINEOUT_VERB, | ||
3749 | + ALC255_FIXUP_DELL_HEADSET_MIC, | ||
3750 | }; | ||
3751 | |||
3752 | static const struct hda_fixup alc269_fixups[] = { | ||
3753 | @@ -6212,6 +6219,13 @@ static const struct hda_fixup alc269_fixups[] = { | ||
3754 | .chained = true, | ||
3755 | .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE | ||
3756 | }, | ||
3757 | + [ALC255_FIXUP_DELL_HEADSET_MIC] = { | ||
3758 | + .type = HDA_FIXUP_PINS, | ||
3759 | + .v.pins = (const struct hda_pintbl[]) { | ||
3760 | + { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ | ||
3761 | + { } | ||
3762 | + }, | ||
3763 | + }, | ||
3764 | }; | ||
3765 | |||
3766 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
3767 | @@ -6266,6 +6280,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
3768 | SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), | ||
3769 | SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), | ||
3770 | SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), | ||
3771 | + SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), | ||
3772 | + SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), | ||
3773 | SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), | ||
3774 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
3775 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
3776 | @@ -7004,6 +7020,8 @@ static int patch_alc269(struct hda_codec *codec) | ||
3777 | break; | ||
3778 | case 0x10ec0257: | ||
3779 | spec->codec_variant = ALC269_TYPE_ALC257; | ||
3780 | + spec->shutup = alc256_shutup; | ||
3781 | + spec->init_hook = alc256_init; | ||
3782 | spec->gen.mixer_nid = 0; | ||
3783 | break; | ||
3784 | case 0x10ec0215: | ||
3785 | diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c | ||
3786 | index 69523ed55894..9df0af17e9c2 100644 | ||
3787 | --- a/tools/perf/builtin-stat.c | ||
3788 | +++ b/tools/perf/builtin-stat.c | ||
3789 | @@ -922,7 +922,7 @@ static void print_metric_csv(void *ctx, | ||
3790 | char buf[64], *vals, *ends; | ||
3791 | |||
3792 | if (unit == NULL || fmt == NULL) { | ||
3793 | - fprintf(out, "%s%s%s%s", csv_sep, csv_sep, csv_sep, csv_sep); | ||
3794 | + fprintf(out, "%s%s", csv_sep, csv_sep); | ||
3795 | return; | ||
3796 | } | ||
3797 | snprintf(buf, sizeof(buf), fmt, val); | ||
3798 | diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c | ||
3799 | index 6cbb83b47150..f15aa5a76fe3 100644 | ||
3800 | --- a/tools/testing/selftests/x86/protection_keys.c | ||
3801 | +++ b/tools/testing/selftests/x86/protection_keys.c | ||
3802 | @@ -250,7 +250,7 @@ void signal_handler(int signum, siginfo_t *si, void *vucontext) | ||
3803 | unsigned long ip; | ||
3804 | char *fpregs; | ||
3805 | u32 *pkru_ptr; | ||
3806 | - u64 si_pkey; | ||
3807 | + u64 siginfo_pkey; | ||
3808 | u32 *si_pkey_ptr; | ||
3809 | int pkru_offset; | ||
3810 | fpregset_t fpregset; | ||
3811 | @@ -292,9 +292,9 @@ void signal_handler(int signum, siginfo_t *si, void *vucontext) | ||
3812 | si_pkey_ptr = (u32 *)(((u8 *)si) + si_pkey_offset); | ||
3813 | dprintf1("si_pkey_ptr: %p\n", si_pkey_ptr); | ||
3814 | dump_mem(si_pkey_ptr - 8, 24); | ||
3815 | - si_pkey = *si_pkey_ptr; | ||
3816 | - pkey_assert(si_pkey < NR_PKEYS); | ||
3817 | - last_si_pkey = si_pkey; | ||
3818 | + siginfo_pkey = *si_pkey_ptr; | ||
3819 | + pkey_assert(siginfo_pkey < NR_PKEYS); | ||
3820 | + last_si_pkey = siginfo_pkey; | ||
3821 | |||
3822 | if ((si->si_code == SEGV_MAPERR) || | ||
3823 | (si->si_code == SEGV_ACCERR) || | ||
3824 | @@ -306,7 +306,7 @@ void signal_handler(int signum, siginfo_t *si, void *vucontext) | ||
3825 | dprintf1("signal pkru from xsave: %08x\n", *pkru_ptr); | ||
3826 | /* need __rdpkru() version so we do not do shadow_pkru checking */ | ||
3827 | dprintf1("signal pkru from pkru: %08x\n", __rdpkru()); | ||
3828 | - dprintf1("si_pkey from siginfo: %jx\n", si_pkey); | ||
3829 | + dprintf1("pkey from siginfo: %jx\n", siginfo_pkey); | ||
3830 | *(u64 *)pkru_ptr = 0x00000000; | ||
3831 | dprintf1("WARNING: set PRKU=0 to allow faulting instruction to continue\n"); | ||
3832 | pkru_faults++; | ||
3833 | diff --git a/tools/testing/selftests/x86/ptrace_syscall.c b/tools/testing/selftests/x86/ptrace_syscall.c | ||
3834 | index 1ae1c5a7392e..6f22238f3217 100644 | ||
3835 | --- a/tools/testing/selftests/x86/ptrace_syscall.c | ||
3836 | +++ b/tools/testing/selftests/x86/ptrace_syscall.c | ||
3837 | @@ -183,8 +183,10 @@ static void test_ptrace_syscall_restart(void) | ||
3838 | if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) | ||
3839 | err(1, "PTRACE_TRACEME"); | ||
3840 | |||
3841 | + pid_t pid = getpid(), tid = syscall(SYS_gettid); | ||
3842 | + | ||
3843 | printf("\tChild will make one syscall\n"); | ||
3844 | - raise(SIGSTOP); | ||
3845 | + syscall(SYS_tgkill, pid, tid, SIGSTOP); | ||
3846 | |||
3847 | syscall(SYS_gettid, 10, 11, 12, 13, 14, 15); | ||
3848 | _exit(0); | ||
3849 | @@ -301,9 +303,11 @@ static void test_restart_under_ptrace(void) | ||
3850 | if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) | ||
3851 | err(1, "PTRACE_TRACEME"); | ||
3852 | |||
3853 | + pid_t pid = getpid(), tid = syscall(SYS_gettid); | ||
3854 | + | ||
3855 | printf("\tChild will take a nap until signaled\n"); | ||
3856 | setsigign(SIGUSR1, SA_RESTART); | ||
3857 | - raise(SIGSTOP); | ||
3858 | + syscall(SYS_tgkill, pid, tid, SIGSTOP); | ||
3859 | |||
3860 | syscall(SYS_pause, 0, 0, 0, 0, 0, 0); | ||
3861 | _exit(0); |