diff options
99 files changed, 820 insertions, 474 deletions
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 1750fcef1ab4..cd077ca0e1b8 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
@@ -29,8 +29,6 @@ DMA-ISA-LPC.txt | |||
29 | - How to do DMA with ISA (and LPC) devices. | 29 | - How to do DMA with ISA (and LPC) devices. |
30 | DMA-attributes.txt | 30 | DMA-attributes.txt |
31 | - listing of the various possible attributes a DMA region can have | 31 | - listing of the various possible attributes a DMA region can have |
32 | dmatest.txt | ||
33 | - how to compile, configure and use the dmatest system. | ||
34 | DocBook/ | 32 | DocBook/ |
35 | - directory with DocBook templates etc. for kernel documentation. | 33 | - directory with DocBook templates etc. for kernel documentation. |
36 | EDID/ | 34 | EDID/ |
@@ -163,8 +161,6 @@ digsig.txt | |||
163 | -info on the Digital Signature Verification API | 161 | -info on the Digital Signature Verification API |
164 | dma-buf-sharing.txt | 162 | dma-buf-sharing.txt |
165 | - the DMA Buffer Sharing API Guide | 163 | - the DMA Buffer Sharing API Guide |
166 | dmaengine.txt | ||
167 | -the DMA Engine API Guide | ||
168 | dontdiff | 164 | dontdiff |
169 | - file containing a list of files that should never be diff'ed. | 165 | - file containing a list of files that should never be diff'ed. |
170 | driver-model/ | 166 | driver-model/ |
@@ -209,6 +205,8 @@ hid/ | |||
209 | - directory with information on human interface devices | 205 | - directory with information on human interface devices |
210 | highuid.txt | 206 | highuid.txt |
211 | - notes on the change from 16 bit to 32 bit user/group IDs. | 207 | - notes on the change from 16 bit to 32 bit user/group IDs. |
208 | hsi.txt | ||
209 | - HSI subsystem overview. | ||
212 | hwspinlock.txt | 210 | hwspinlock.txt |
213 | - hardware spinlock provides hardware assistance for synchronization | 211 | - hardware spinlock provides hardware assistance for synchronization |
214 | timers/ | 212 | timers/ |
@@ -277,6 +275,8 @@ kprobes.txt | |||
277 | - documents the kernel probes debugging feature. | 275 | - documents the kernel probes debugging feature. |
278 | kref.txt | 276 | kref.txt |
279 | - docs on adding reference counters (krefs) to kernel objects. | 277 | - docs on adding reference counters (krefs) to kernel objects. |
278 | kselftest.txt | ||
279 | - small unittests for (some) individual codepaths in the kernel. | ||
280 | laptops/ | 280 | laptops/ |
281 | - directory with laptop related info and laptop driver documentation. | 281 | - directory with laptop related info and laptop driver documentation. |
282 | ldm.txt | 282 | ldm.txt |
@@ -285,22 +285,22 @@ leds/ | |||
285 | - directory with info about LED handling under Linux. | 285 | - directory with info about LED handling under Linux. |
286 | local_ops.txt | 286 | local_ops.txt |
287 | - semantics and behavior of local atomic operations. | 287 | - semantics and behavior of local atomic operations. |
288 | lockdep-design.txt | ||
289 | - documentation on the runtime locking correctness validator. | ||
290 | locking/ | 288 | locking/ |
291 | - directory with info about kernel locking primitives | 289 | - directory with info about kernel locking primitives |
292 | lockstat.txt | ||
293 | - info on collecting statistics on locks (and contention). | ||
294 | lockup-watchdogs.txt | 290 | lockup-watchdogs.txt |
295 | - info on soft and hard lockup detectors (aka nmi_watchdog). | 291 | - info on soft and hard lockup detectors (aka nmi_watchdog). |
296 | logo.gif | 292 | logo.gif |
297 | - full colour GIF image of Linux logo (penguin - Tux). | 293 | - full colour GIF image of Linux logo (penguin - Tux). |
298 | logo.txt | 294 | logo.txt |
299 | - info on creator of above logo & site to get additional images from. | 295 | - info on creator of above logo & site to get additional images from. |
296 | lzo.txt | ||
297 | - kernel LZO decompressor input formats | ||
300 | m68k/ | 298 | m68k/ |
301 | - directory with info about Linux on Motorola 68k architecture. | 299 | - directory with info about Linux on Motorola 68k architecture. |
302 | magic-number.txt | 300 | magic-number.txt |
303 | - list of magic numbers used to mark/protect kernel data structures. | 301 | - list of magic numbers used to mark/protect kernel data structures. |
302 | mailbox.txt | ||
303 | - How to write drivers for the common mailbox framework (IPC). | ||
304 | md.txt | 304 | md.txt |
305 | - info on boot arguments for the multiple devices driver. | 305 | - info on boot arguments for the multiple devices driver. |
306 | media-framework.txt | 306 | media-framework.txt |
@@ -327,8 +327,6 @@ mtd/ | |||
327 | - directory with info about memory technology devices (flash) | 327 | - directory with info about memory technology devices (flash) |
328 | mono.txt | 328 | mono.txt |
329 | - how to execute Mono-based .NET binaries with the help of BINFMT_MISC. | 329 | - how to execute Mono-based .NET binaries with the help of BINFMT_MISC. |
330 | mutex-design.txt | ||
331 | - info on the generic mutex subsystem. | ||
332 | namespaces/ | 330 | namespaces/ |
333 | - directory with various information about namespaces | 331 | - directory with various information about namespaces |
334 | netlabel/ | 332 | netlabel/ |
@@ -395,10 +393,6 @@ robust-futexes.txt | |||
395 | - a description of what robust futexes are. | 393 | - a description of what robust futexes are. |
396 | rpmsg.txt | 394 | rpmsg.txt |
397 | - info on the Remote Processor Messaging (rpmsg) Framework | 395 | - info on the Remote Processor Messaging (rpmsg) Framework |
398 | rt-mutex-design.txt | ||
399 | - description of the RealTime mutex implementation design. | ||
400 | rt-mutex.txt | ||
401 | - desc. of RT-mutex subsystem with PI (Priority Inheritance) support. | ||
402 | rtc.txt | 396 | rtc.txt |
403 | - notes on how to use the Real Time Clock (aka CMOS clock) driver. | 397 | - notes on how to use the Real Time Clock (aka CMOS clock) driver. |
404 | s390/ | 398 | s390/ |
@@ -425,8 +419,6 @@ sparse.txt | |||
425 | - info on how to obtain and use the sparse tool for typechecking. | 419 | - info on how to obtain and use the sparse tool for typechecking. |
426 | spi/ | 420 | spi/ |
427 | - overview of Linux kernel Serial Peripheral Interface (SPI) support. | 421 | - overview of Linux kernel Serial Peripheral Interface (SPI) support. |
428 | spinlocks.txt | ||
429 | - info on using spinlocks to provide exclusive access in kernel. | ||
430 | stable_api_nonsense.txt | 422 | stable_api_nonsense.txt |
431 | - info on why the kernel does not have a stable in-kernel api or abi. | 423 | - info on why the kernel does not have a stable in-kernel api or abi. |
432 | stable_kernel_rules.txt | 424 | stable_kernel_rules.txt |
@@ -483,10 +475,10 @@ wimax/ | |||
483 | - directory with info about Intel Wireless Wimax Connections | 475 | - directory with info about Intel Wireless Wimax Connections |
484 | workqueue.txt | 476 | workqueue.txt |
485 | - information on the Concurrency Managed Workqueue implementation | 477 | - information on the Concurrency Managed Workqueue implementation |
486 | ww-mutex-design.txt | ||
487 | - Intro to Mutex wait/would deadlock handling.s | ||
488 | x86/x86_64/ | 478 | x86/x86_64/ |
489 | - directory with info on Linux support for AMD x86-64 (Hammer) machines. | 479 | - directory with info on Linux support for AMD x86-64 (Hammer) machines. |
480 | xillybus.txt | ||
481 | - Overview and basic ui of xillybus driver | ||
490 | xtensa/ | 482 | xtensa/ |
491 | - directory with documents relating to arch/xtensa port/implementation | 483 | - directory with documents relating to arch/xtensa port/implementation |
492 | xz.txt | 484 | xz.txt |
diff --git a/Documentation/Changes b/Documentation/Changes index 74bdda9272a4..646cdaa6e9d1 100644 --- a/Documentation/Changes +++ b/Documentation/Changes | |||
@@ -21,8 +21,8 @@ running a Linux kernel. Also, not all tools are necessary on all | |||
21 | systems; obviously, if you don't have any ISDN hardware, for example, | 21 | systems; obviously, if you don't have any ISDN hardware, for example, |
22 | you probably needn't concern yourself with isdn4k-utils. | 22 | you probably needn't concern yourself with isdn4k-utils. |
23 | 23 | ||
24 | o Gnu C 3.2 # gcc --version | 24 | o GNU C 3.2 # gcc --version |
25 | o Gnu make 3.80 # make --version | 25 | o GNU make 3.80 # make --version |
26 | o binutils 2.12 # ld -v | 26 | o binutils 2.12 # ld -v |
27 | o util-linux 2.10o # fdformat --version | 27 | o util-linux 2.10o # fdformat --version |
28 | o module-init-tools 0.9.10 # depmod -V | 28 | o module-init-tools 0.9.10 # depmod -V |
@@ -57,7 +57,7 @@ computer. | |||
57 | Make | 57 | Make |
58 | ---- | 58 | ---- |
59 | 59 | ||
60 | You will need Gnu make 3.80 or later to build the kernel. | 60 | You will need GNU make 3.80 or later to build the kernel. |
61 | 61 | ||
62 | Binutils | 62 | Binutils |
63 | -------- | 63 | -------- |
diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle index 618a33c940df..449a8a19fc21 100644 --- a/Documentation/CodingStyle +++ b/Documentation/CodingStyle | |||
@@ -527,6 +527,7 @@ values. To do the latter, you can stick the following in your .emacs file: | |||
527 | (string-match (expand-file-name "~/src/linux-trees") | 527 | (string-match (expand-file-name "~/src/linux-trees") |
528 | filename)) | 528 | filename)) |
529 | (setq indent-tabs-mode t) | 529 | (setq indent-tabs-mode t) |
530 | (setq show-trailing-whitespace t) | ||
530 | (c-set-style "linux-tabs-only"))))) | 531 | (c-set-style "linux-tabs-only"))))) |
531 | 532 | ||
532 | This will make emacs go better with the kernel coding style for C | 533 | This will make emacs go better with the kernel coding style for C |
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index 9c7d92d03f62..b6a6a2e0dd3b 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile | |||
@@ -56,7 +56,7 @@ htmldocs: $(HTML) | |||
56 | 56 | ||
57 | MAN := $(patsubst %.xml, %.9, $(BOOKS)) | 57 | MAN := $(patsubst %.xml, %.9, $(BOOKS)) |
58 | mandocs: $(MAN) | 58 | mandocs: $(MAN) |
59 | $(if $(wildcard $(obj)/man/*.9),gzip -f $(obj)/man/*.9) | 59 | find $(obj)/man -name '*.9' | xargs gzip -f |
60 | 60 | ||
61 | installmandocs: mandocs | 61 | installmandocs: mandocs |
62 | mkdir -p /usr/local/man/man9/ | 62 | mkdir -p /usr/local/man/man9/ |
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index 40b619ef9b6a..447671bd2927 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches | |||
@@ -284,7 +284,7 @@ kernel-related lists hosted elsewhere as well, though. | |||
284 | Do not send more than 15 patches at once to the vger mailing lists!!! | 284 | Do not send more than 15 patches at once to the vger mailing lists!!! |
285 | 285 | ||
286 | Linus Torvalds is the final arbiter of all changes accepted into the | 286 | Linus Torvalds is the final arbiter of all changes accepted into the |
287 | Linux kernel. His e-mail address is <torvalds@linux-foundation.org>. | 287 | Linux kernel. His e-mail address is <torvalds@linux-foundation.org>. |
288 | He gets a lot of e-mail, and, at this point, very few patches go through | 288 | He gets a lot of e-mail, and, at this point, very few patches go through |
289 | Linus directly, so typically you should do your best to -avoid- | 289 | Linus directly, so typically you should do your best to -avoid- |
290 | sending him e-mail. | 290 | sending him e-mail. |
@@ -437,11 +437,11 @@ can certify the below: | |||
437 | person who certified (a), (b) or (c) and I have not modified | 437 | person who certified (a), (b) or (c) and I have not modified |
438 | it. | 438 | it. |
439 | 439 | ||
440 | (d) I understand and agree that this project and the contribution | 440 | (d) I understand and agree that this project and the contribution |
441 | are public and that a record of the contribution (including all | 441 | are public and that a record of the contribution (including all |
442 | personal information I submit with it, including my sign-off) is | 442 | personal information I submit with it, including my sign-off) is |
443 | maintained indefinitely and may be redistributed consistent with | 443 | maintained indefinitely and may be redistributed consistent with |
444 | this project or the open source license(s) involved. | 444 | this project or the open source license(s) involved. |
445 | 445 | ||
446 | then you just add a line saying | 446 | then you just add a line saying |
447 | 447 | ||
@@ -451,7 +451,7 @@ using your real name (sorry, no pseudonyms or anonymous contributions.) | |||
451 | 451 | ||
452 | Some people also put extra tags at the end. They'll just be ignored for | 452 | Some people also put extra tags at the end. They'll just be ignored for |
453 | now, but you can do this to mark internal company procedures or just | 453 | now, but you can do this to mark internal company procedures or just |
454 | point out some special detail about the sign-off. | 454 | point out some special detail about the sign-off. |
455 | 455 | ||
456 | If you are a subsystem or branch maintainer, sometimes you need to slightly | 456 | If you are a subsystem or branch maintainer, sometimes you need to slightly |
457 | modify patches you receive in order to merge them, because the code is not | 457 | modify patches you receive in order to merge them, because the code is not |
diff --git a/Documentation/arm/00-INDEX b/Documentation/arm/00-INDEX index 3b08bc2b04cf..8edb9007844e 100644 --- a/Documentation/arm/00-INDEX +++ b/Documentation/arm/00-INDEX | |||
@@ -2,11 +2,15 @@ | |||
2 | - this file | 2 | - this file |
3 | Booting | 3 | Booting |
4 | - requirements for booting | 4 | - requirements for booting |
5 | CCN.txt | ||
6 | - Cache Coherent Network ring-bus and perf PMU driver. | ||
5 | Interrupts | 7 | Interrupts |
6 | - ARM Interrupt subsystem documentation | 8 | - ARM Interrupt subsystem documentation |
7 | IXP4xx | 9 | IXP4xx |
8 | - Intel IXP4xx Network processor. | 10 | - Intel IXP4xx Network processor. |
9 | msm | 11 | Makefile |
12 | - Build sourcefiles as part of the Documentation-build for arm | ||
13 | msm/ | ||
10 | - MSM specific documentation | 14 | - MSM specific documentation |
11 | Netwinder | 15 | Netwinder |
12 | - Netwinder specific documentation | 16 | - Netwinder specific documentation |
@@ -18,11 +22,9 @@ README | |||
18 | - General ARM documentation | 22 | - General ARM documentation |
19 | SA1100/ | 23 | SA1100/ |
20 | - SA1100 documentation | 24 | - SA1100 documentation |
21 | Samsung-S3C24XX | 25 | Samsung-S3C24XX/ |
22 | - S3C24XX ARM Linux Overview | 26 | - S3C24XX ARM Linux Overview |
23 | Sharp-LH | 27 | SPEAr/ |
24 | - Linux on Sharp LH79524 and LH7A40X System On a Chip (SOC) | ||
25 | SPEAr | ||
26 | - ST SPEAr platform Linux Overview | 28 | - ST SPEAr platform Linux Overview |
27 | VFP/ | 29 | VFP/ |
28 | - Release notes for Linux Kernel Vector Floating Point support code | 30 | - Release notes for Linux Kernel Vector Floating Point support code |
diff --git a/Documentation/blackfin/Makefile b/Documentation/blackfin/Makefile index c7e6c99bad81..03f78059d6f5 100644 --- a/Documentation/blackfin/Makefile +++ b/Documentation/blackfin/Makefile | |||
@@ -1,3 +1,5 @@ | |||
1 | ifneq ($(CONFIG_BLACKFIN),) | 1 | ifneq ($(CONFIG_BLACKFIN),) |
2 | ifneq ($(CONFIG_BFIN_GPTIMERS,) | ||
2 | obj-m := gptimers-example.o | 3 | obj-m := gptimers-example.o |
3 | endif | 4 | endif |
5 | endif | ||
diff --git a/Documentation/cgroups/00-INDEX b/Documentation/cgroups/00-INDEX index bc461b6425a7..96ce071a3633 100644 --- a/Documentation/cgroups/00-INDEX +++ b/Documentation/cgroups/00-INDEX | |||
@@ -24,3 +24,5 @@ net_prio.txt | |||
24 | - Network priority cgroups details and usages. | 24 | - Network priority cgroups details and usages. |
25 | resource_counter.txt | 25 | resource_counter.txt |
26 | - Resource Counter API. | 26 | - Resource Counter API. |
27 | unified-hierarchy.txt | ||
28 | - Description the new/next cgroup interface. | ||
diff --git a/Documentation/devicetree/bindings/arm/msm/timer.txt b/Documentation/devicetree/bindings/arm/msm/timer.txt index c6ef8f13dc7e..74607b6c1117 100644 --- a/Documentation/devicetree/bindings/arm/msm/timer.txt +++ b/Documentation/devicetree/bindings/arm/msm/timer.txt | |||
@@ -8,7 +8,7 @@ Properties: | |||
8 | "qcom,kpss-timer" - krait subsystem | 8 | "qcom,kpss-timer" - krait subsystem |
9 | "qcom,scss-timer" - scorpion subsystem | 9 | "qcom,scss-timer" - scorpion subsystem |
10 | 10 | ||
11 | - interrupts : Interrupts for the the debug timer, the first general purpose | 11 | - interrupts : Interrupts for the debug timer, the first general purpose |
12 | timer, and optionally a second general purpose timer in that | 12 | timer, and optionally a second general purpose timer in that |
13 | order. | 13 | order. |
14 | 14 | ||
diff --git a/Documentation/devicetree/bindings/ata/cavium-compact-flash.txt b/Documentation/devicetree/bindings/ata/cavium-compact-flash.txt index 93986a5a8018..3bacc8e0931e 100644 --- a/Documentation/devicetree/bindings/ata/cavium-compact-flash.txt +++ b/Documentation/devicetree/bindings/ata/cavium-compact-flash.txt | |||
@@ -9,7 +9,7 @@ Properties: | |||
9 | 9 | ||
10 | Compatibility with many Cavium evaluation boards. | 10 | Compatibility with many Cavium evaluation boards. |
11 | 11 | ||
12 | - reg: The base address of the the CF chip select banks. Depending on | 12 | - reg: The base address of the CF chip select banks. Depending on |
13 | the device configuration, there may be one or two banks. | 13 | the device configuration, there may be one or two banks. |
14 | 14 | ||
15 | - cavium,bus-width: The width of the connection to the CF devices. Valid | 15 | - cavium,bus-width: The width of the connection to the CF devices. Valid |
diff --git a/Documentation/devicetree/bindings/c6x/dscr.txt b/Documentation/devicetree/bindings/c6x/dscr.txt index b0e97144cfb1..92672235de57 100644 --- a/Documentation/devicetree/bindings/c6x/dscr.txt +++ b/Documentation/devicetree/bindings/c6x/dscr.txt | |||
@@ -12,7 +12,7 @@ configuration register for writes. These configuration register may be used to | |||
12 | enable (and disable in some cases) SoC pin drivers, select peripheral clock | 12 | enable (and disable in some cases) SoC pin drivers, select peripheral clock |
13 | sources (internal or pin), etc. In some cases, a configuration register is | 13 | sources (internal or pin), etc. In some cases, a configuration register is |
14 | write once or the individual bits are write once. In addition to device config, | 14 | write once or the individual bits are write once. In addition to device config, |
15 | the DSCR block may provide registers which which are used to reset peripherals, | 15 | the DSCR block may provide registers which are used to reset peripherals, |
16 | provide device ID information, provide ethernet MAC addresses, as well as other | 16 | provide device ID information, provide ethernet MAC addresses, as well as other |
17 | miscellaneous functions. | 17 | miscellaneous functions. |
18 | 18 | ||
diff --git a/Documentation/devicetree/bindings/dma/renesas,rcar-dmac.txt b/Documentation/devicetree/bindings/dma/renesas,rcar-dmac.txt index df0f48bcf75a..f7e21b1c2a05 100644 --- a/Documentation/devicetree/bindings/dma/renesas,rcar-dmac.txt +++ b/Documentation/devicetree/bindings/dma/renesas,rcar-dmac.txt | |||
@@ -1,6 +1,6 @@ | |||
1 | * Renesas R-Car DMA Controller Device Tree bindings | 1 | * Renesas R-Car DMA Controller Device Tree bindings |
2 | 2 | ||
3 | Renesas R-Car Generation 2 SoCs have have multiple multi-channel DMA | 3 | Renesas R-Car Generation 2 SoCs have multiple multi-channel DMA |
4 | controller instances named DMAC capable of serving multiple clients. Channels | 4 | controller instances named DMAC capable of serving multiple clients. Channels |
5 | can be dedicated to specific clients or shared between a large number of | 5 | can be dedicated to specific clients or shared between a large number of |
6 | clients. | 6 | clients. |
diff --git a/Documentation/devicetree/bindings/gpio/gpio-pcf857x.txt b/Documentation/devicetree/bindings/gpio/gpio-pcf857x.txt index d63194a2c848..ada4e2973323 100644 --- a/Documentation/devicetree/bindings/gpio/gpio-pcf857x.txt +++ b/Documentation/devicetree/bindings/gpio/gpio-pcf857x.txt | |||
@@ -39,7 +39,7 @@ Optional Properties: | |||
39 | - lines-initial-states: Bitmask that specifies the initial state of each | 39 | - lines-initial-states: Bitmask that specifies the initial state of each |
40 | line. When a bit is set to zero, the corresponding line will be initialized to | 40 | line. When a bit is set to zero, the corresponding line will be initialized to |
41 | the input (pulled-up) state. When the bit is set to one, the line will be | 41 | the input (pulled-up) state. When the bit is set to one, the line will be |
42 | initialized the the low-level output state. If the property is not specified | 42 | initialized the low-level output state. If the property is not specified |
43 | all lines will be initialized to the input state. | 43 | all lines will be initialized to the input state. |
44 | 44 | ||
45 | The I/O expander can detect input state changes, and thus optionally act as | 45 | The I/O expander can detect input state changes, and thus optionally act as |
diff --git a/Documentation/devicetree/bindings/iio/adc/xilinx-xadc.txt b/Documentation/devicetree/bindings/iio/adc/xilinx-xadc.txt index d9ee909d2b78..d71258e2d456 100644 --- a/Documentation/devicetree/bindings/iio/adc/xilinx-xadc.txt +++ b/Documentation/devicetree/bindings/iio/adc/xilinx-xadc.txt | |||
@@ -59,7 +59,7 @@ Optional properties: | |||
59 | Each child node represents one channel and has the following | 59 | Each child node represents one channel and has the following |
60 | properties: | 60 | properties: |
61 | Required properties: | 61 | Required properties: |
62 | * reg: Pair of pins the the channel is connected to. | 62 | * reg: Pair of pins the channel is connected to. |
63 | 0: VP/VN | 63 | 0: VP/VN |
64 | 1: VAUXP[0]/VAUXN[0] | 64 | 1: VAUXP[0]/VAUXN[0] |
65 | 2: VAUXP[1]/VAUXN[1] | 65 | 2: VAUXP[1]/VAUXN[1] |
diff --git a/Documentation/devicetree/bindings/mtd/fsmc-nand.txt b/Documentation/devicetree/bindings/mtd/fsmc-nand.txt index ec42935f3908..5235cbc551b0 100644 --- a/Documentation/devicetree/bindings/mtd/fsmc-nand.txt +++ b/Documentation/devicetree/bindings/mtd/fsmc-nand.txt | |||
@@ -9,7 +9,7 @@ Required properties: | |||
9 | Optional properties: | 9 | Optional properties: |
10 | - bank-width : Width (in bytes) of the device. If not present, the width | 10 | - bank-width : Width (in bytes) of the device. If not present, the width |
11 | defaults to 1 byte | 11 | defaults to 1 byte |
12 | - nand-skip-bbtscan: Indicates the the BBT scanning should be skipped | 12 | - nand-skip-bbtscan: Indicates the BBT scanning should be skipped |
13 | - timings: array of 6 bytes for NAND timings. The meanings of these bytes | 13 | - timings: array of 6 bytes for NAND timings. The meanings of these bytes |
14 | are: | 14 | are: |
15 | byte 0 TCLR : CLE to RE delay in number of AHB clock cycles, only 4 bits | 15 | byte 0 TCLR : CLE to RE delay in number of AHB clock cycles, only 4 bits |
diff --git a/Documentation/devicetree/bindings/net/broadcom-systemport.txt b/Documentation/devicetree/bindings/net/broadcom-systemport.txt index aa7ad622259d..877da34145b0 100644 --- a/Documentation/devicetree/bindings/net/broadcom-systemport.txt +++ b/Documentation/devicetree/bindings/net/broadcom-systemport.txt | |||
@@ -3,7 +3,7 @@ | |||
3 | Required properties: | 3 | Required properties: |
4 | - compatible: should be one of "brcm,systemport-v1.00" or "brcm,systemport" | 4 | - compatible: should be one of "brcm,systemport-v1.00" or "brcm,systemport" |
5 | - reg: address and length of the register set for the device. | 5 | - reg: address and length of the register set for the device. |
6 | - interrupts: interrupts for the device, first cell must be for the the rx | 6 | - interrupts: interrupts for the device, first cell must be for the rx |
7 | interrupts, and the second cell should be for the transmit queues. An | 7 | interrupts, and the second cell should be for the transmit queues. An |
8 | optional third interrupt cell for Wake-on-LAN can be specified | 8 | optional third interrupt cell for Wake-on-LAN can be specified |
9 | - local-mac-address: Ethernet MAC address (48 bits) of this adapter | 9 | - local-mac-address: Ethernet MAC address (48 bits) of this adapter |
diff --git a/Documentation/devicetree/bindings/power/rockchip-io-domain.txt b/Documentation/devicetree/bindings/power/rockchip-io-domain.txt index 6fbf6e7ecde6..8b70db103ca7 100644 --- a/Documentation/devicetree/bindings/power/rockchip-io-domain.txt +++ b/Documentation/devicetree/bindings/power/rockchip-io-domain.txt | |||
@@ -37,7 +37,7 @@ Required properties: | |||
37 | 37 | ||
38 | 38 | ||
39 | You specify supplies using the standard regulator bindings by including | 39 | You specify supplies using the standard regulator bindings by including |
40 | a phandle the the relevant regulator. All specified supplies must be able | 40 | a phandle the relevant regulator. All specified supplies must be able |
41 | to report their voltage. The IO Voltage Domain for any non-specified | 41 | to report their voltage. The IO Voltage Domain for any non-specified |
42 | supplies will be not be touched. | 42 | supplies will be not be touched. |
43 | 43 | ||
diff --git a/Documentation/devicetree/overlay-notes.txt b/Documentation/devicetree/overlay-notes.txt index 30ae758e3eef..d418a6ce9812 100644 --- a/Documentation/devicetree/overlay-notes.txt +++ b/Documentation/devicetree/overlay-notes.txt | |||
@@ -10,7 +10,7 @@ How overlays work | |||
10 | ----------------- | 10 | ----------------- |
11 | 11 | ||
12 | A Device Tree's overlay purpose is to modify the kernel's live tree, and | 12 | A Device Tree's overlay purpose is to modify the kernel's live tree, and |
13 | have the modification affecting the state of the the kernel in a way that | 13 | have the modification affecting the state of the kernel in a way that |
14 | is reflecting the changes. | 14 | is reflecting the changes. |
15 | Since the kernel mainly deals with devices, any new device node that result | 15 | Since the kernel mainly deals with devices, any new device node that result |
16 | in an active device should have it created while if the device node is either | 16 | in an active device should have it created while if the device node is either |
@@ -80,7 +80,7 @@ result in foo+bar.dts | |||
80 | }; | 80 | }; |
81 | ---- foo+bar.dts ------------------------------------------------------------- | 81 | ---- foo+bar.dts ------------------------------------------------------------- |
82 | 82 | ||
83 | As a result of the the overlay, a new device node (bar) has been created | 83 | As a result of the overlay, a new device node (bar) has been created |
84 | so a bar platform device will be registered and if a matching device driver | 84 | so a bar platform device will be registered and if a matching device driver |
85 | is loaded the device will be created as expected. | 85 | is loaded the device will be created as expected. |
86 | 86 | ||
diff --git a/Documentation/dmaengine/00-INDEX b/Documentation/dmaengine/00-INDEX new file mode 100644 index 000000000000..07de6573d22b --- /dev/null +++ b/Documentation/dmaengine/00-INDEX | |||
@@ -0,0 +1,8 @@ | |||
1 | 00-INDEX | ||
2 | - this file. | ||
3 | client.txt | ||
4 | -the DMA Engine API Guide. | ||
5 | dmatest.txt | ||
6 | - how to compile, configure and use the dmatest system. | ||
7 | provider.txt | ||
8 | - the DMA controller API. \ No newline at end of file | ||
diff --git a/Documentation/driver-model/bus.txt b/Documentation/driver-model/bus.txt index 6754b2df8aa1..b577a45b93ea 100644 --- a/Documentation/driver-model/bus.txt +++ b/Documentation/driver-model/bus.txt | |||
@@ -45,7 +45,7 @@ them are inherently bus-specific. Drivers typically declare an array | |||
45 | of device IDs of devices they support that reside in a bus-specific | 45 | of device IDs of devices they support that reside in a bus-specific |
46 | driver structure. | 46 | driver structure. |
47 | 47 | ||
48 | The purpose of the match callback is provide the bus an opportunity to | 48 | The purpose of the match callback is to give the bus an opportunity to |
49 | determine if a particular driver supports a particular device by | 49 | determine if a particular driver supports a particular device by |
50 | comparing the device IDs the driver supports with the device ID of a | 50 | comparing the device IDs the driver supports with the device ID of a |
51 | particular device, without sacrificing bus-specific functionality or | 51 | particular device, without sacrificing bus-specific functionality or |
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index aae9dd13c91f..79b3cc821e7b 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -28,7 +28,7 @@ Table of Contents | |||
28 | 1.6 Parallel port info in /proc/parport | 28 | 1.6 Parallel port info in /proc/parport |
29 | 1.7 TTY info in /proc/tty | 29 | 1.7 TTY info in /proc/tty |
30 | 1.8 Miscellaneous kernel statistics in /proc/stat | 30 | 1.8 Miscellaneous kernel statistics in /proc/stat |
31 | 1.9 Ext4 file system parameters | 31 | 1.9 Ext4 file system parameters |
32 | 32 | ||
33 | 2 Modifying System Parameters | 33 | 2 Modifying System Parameters |
34 | 34 | ||
diff --git a/Documentation/filesystems/seq_file.txt b/Documentation/filesystems/seq_file.txt index b797ed38de46..9de4303201e1 100644 --- a/Documentation/filesystems/seq_file.txt +++ b/Documentation/filesystems/seq_file.txt | |||
@@ -194,16 +194,16 @@ which is in the string esc will be represented in octal form in the output. | |||
194 | 194 | ||
195 | There are also a pair of functions for printing filenames: | 195 | There are also a pair of functions for printing filenames: |
196 | 196 | ||
197 | int seq_path(struct seq_file *m, struct path *path, char *esc); | 197 | int seq_path(struct seq_file *m, const struct path *path, |
198 | int seq_path_root(struct seq_file *m, struct path *path, | 198 | const char *esc); |
199 | struct path *root, char *esc) | 199 | int seq_path_root(struct seq_file *m, const struct path *path, |
200 | const struct path *root, const char *esc) | ||
200 | 201 | ||
201 | Here, path indicates the file of interest, and esc is a set of characters | 202 | Here, path indicates the file of interest, and esc is a set of characters |
202 | which should be escaped in the output. A call to seq_path() will output | 203 | which should be escaped in the output. A call to seq_path() will output |
203 | the path relative to the current process's filesystem root. If a different | 204 | the path relative to the current process's filesystem root. If a different |
204 | root is desired, it can be used with seq_path_root(). Note that, if it | 205 | root is desired, it can be used with seq_path_root(). If it turns out that |
205 | turns out that path cannot be reached from root, the value of root will be | 206 | path cannot be reached from root, seq_path_root() returns SEQ_SKIP. |
206 | changed in seq_file_root() to a root which *does* work. | ||
207 | 207 | ||
208 | A function producing complicated output may want to check | 208 | A function producing complicated output may want to check |
209 | bool seq_has_overflowed(struct seq_file *m); | 209 | bool seq_has_overflowed(struct seq_file *m); |
diff --git a/Documentation/gpio/board.txt b/Documentation/gpio/board.txt index 4452786225b8..8b35f51fe7b6 100644 --- a/Documentation/gpio/board.txt +++ b/Documentation/gpio/board.txt | |||
@@ -31,7 +31,7 @@ through gpiod_get(). For example: | |||
31 | <&gpio 16 GPIO_ACTIVE_HIGH>, /* green */ | 31 | <&gpio 16 GPIO_ACTIVE_HIGH>, /* green */ |
32 | <&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */ | 32 | <&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */ |
33 | 33 | ||
34 | power-gpio = <&gpio 1 GPIO_ACTIVE_LOW>; | 34 | power-gpios = <&gpio 1 GPIO_ACTIVE_LOW>; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | This property will make GPIOs 15, 16 and 17 available to the driver under the | 37 | This property will make GPIOs 15, 16 and 17 available to the driver under the |
diff --git a/Documentation/locking/00-INDEX b/Documentation/locking/00-INDEX new file mode 100644 index 000000000000..c256c9bee2a4 --- /dev/null +++ b/Documentation/locking/00-INDEX | |||
@@ -0,0 +1,16 @@ | |||
1 | 00-INDEX | ||
2 | - this file. | ||
3 | lockdep-design.txt | ||
4 | - documentation on the runtime locking correctness validator. | ||
5 | lockstat.txt | ||
6 | - info on collecting statistics on locks (and contention). | ||
7 | mutex-design.txt | ||
8 | - info on the generic mutex subsystem. | ||
9 | rt-mutex-design.txt | ||
10 | - description of the RealTime mutex implementation design. | ||
11 | rt-mutex.txt | ||
12 | - desc. of RT-mutex subsystem with PI (Priority Inheritance) support. | ||
13 | spinlocks.txt | ||
14 | - info on using spinlocks to provide exclusive access in kernel. | ||
15 | ww-mutex-design.txt | ||
16 | - Intro to Mutex wait/would deadlock handling.s | ||
diff --git a/Documentation/locking/lockstat.txt b/Documentation/locking/lockstat.txt index 7428773a1e69..568bbbacee91 100644 --- a/Documentation/locking/lockstat.txt +++ b/Documentation/locking/lockstat.txt | |||
@@ -121,6 +121,11 @@ show the header with column descriptions. Lines 05-18 and 20-31 show the actual | |||
121 | statistics. These statistics come in two parts; the actual stats separated by a | 121 | statistics. These statistics come in two parts; the actual stats separated by a |
122 | short separator (line 08, 13) from the contention points. | 122 | short separator (line 08, 13) from the contention points. |
123 | 123 | ||
124 | Lines 09-12 show the first 4 recorded contention points (the code | ||
125 | which tries to get the lock) and lines 14-17 show the first 4 recorded | ||
126 | contended points (the lock holder). It is possible that the max | ||
127 | con-bounces point is missing in the statistics. | ||
128 | |||
124 | The first lock (05-18) is a read/write lock, and shows two lines above the | 129 | The first lock (05-18) is a read/write lock, and shows two lines above the |
125 | short separator. The contention points don't match the column descriptors, | 130 | short separator. The contention points don't match the column descriptors, |
126 | they have two: contentions and [<IP>] symbol. The second set of contention | 131 | they have two: contentions and [<IP>] symbol. The second set of contention |
diff --git a/Documentation/misc-devices/mei/mei-client-bus.txt b/Documentation/misc-devices/mei/mei-client-bus.txt index f83910a8ce76..743be4ec8989 100644 --- a/Documentation/misc-devices/mei/mei-client-bus.txt +++ b/Documentation/misc-devices/mei/mei-client-bus.txt | |||
@@ -1,9 +1,10 @@ | |||
1 | Intel(R) Management Engine (ME) Client bus API | 1 | Intel(R) Management Engine (ME) Client bus API |
2 | =============================================== | 2 | ============================================== |
3 | 3 | ||
4 | 4 | ||
5 | Rationale | 5 | Rationale |
6 | ========= | 6 | ========= |
7 | |||
7 | MEI misc character device is useful for dedicated applications to send and receive | 8 | MEI misc character device is useful for dedicated applications to send and receive |
8 | data to the many FW appliance found in Intel's ME from the user space. | 9 | data to the many FW appliance found in Intel's ME from the user space. |
9 | However for some of the ME functionalities it make sense to leverage existing software | 10 | However for some of the ME functionalities it make sense to leverage existing software |
@@ -17,7 +18,8 @@ the existing code. | |||
17 | 18 | ||
18 | 19 | ||
19 | MEI CL bus API | 20 | MEI CL bus API |
20 | =========== | 21 | ============== |
22 | |||
21 | A driver implementation for an MEI Client is very similar to existing bus | 23 | A driver implementation for an MEI Client is very similar to existing bus |
22 | based device drivers. The driver registers itself as an MEI CL bus driver through | 24 | based device drivers. The driver registers itself as an MEI CL bus driver through |
23 | the mei_cl_driver structure: | 25 | the mei_cl_driver structure: |
@@ -55,6 +57,7 @@ received buffers. | |||
55 | 57 | ||
56 | Example | 58 | Example |
57 | ======= | 59 | ======= |
60 | |||
58 | As a theoretical example let's pretend the ME comes with a "contact" NFC IP. | 61 | As a theoretical example let's pretend the ME comes with a "contact" NFC IP. |
59 | The driver init and exit routines for this device would look like: | 62 | The driver init and exit routines for this device would look like: |
60 | 63 | ||
@@ -69,11 +72,11 @@ static struct mei_cl_device_id contact_mei_cl_tbl[] = { | |||
69 | MODULE_DEVICE_TABLE(mei_cl, contact_mei_cl_tbl); | 72 | MODULE_DEVICE_TABLE(mei_cl, contact_mei_cl_tbl); |
70 | 73 | ||
71 | static struct mei_cl_driver contact_driver = { | 74 | static struct mei_cl_driver contact_driver = { |
72 | .id_table = contact_mei_tbl, | 75 | .id_table = contact_mei_tbl, |
73 | .name = CONTACT_DRIVER_NAME, | 76 | .name = CONTACT_DRIVER_NAME, |
74 | 77 | ||
75 | .probe = contact_probe, | 78 | .probe = contact_probe, |
76 | .remove = contact_remove, | 79 | .remove = contact_remove, |
77 | }; | 80 | }; |
78 | 81 | ||
79 | static int contact_init(void) | 82 | static int contact_init(void) |
@@ -109,7 +112,7 @@ int contact_probe(struct mei_cl_device *dev, struct mei_cl_device_id *id) | |||
109 | mei_cl_register_event_cb(dev, contact_event_cb, contact); | 112 | mei_cl_register_event_cb(dev, contact_event_cb, contact); |
110 | 113 | ||
111 | return 0; | 114 | return 0; |
112 | } | 115 | } |
113 | 116 | ||
114 | In the probe routine the driver first enable the MEI device and then registers | 117 | In the probe routine the driver first enable the MEI device and then registers |
115 | an ME bus event handler which is as close as it can get to registering a | 118 | an ME bus event handler which is as close as it can get to registering a |
diff --git a/Documentation/misc-devices/mei/mei.txt b/Documentation/misc-devices/mei/mei.txt index 15bba1aeba9a..8d47501bba0a 100644 --- a/Documentation/misc-devices/mei/mei.txt +++ b/Documentation/misc-devices/mei/mei.txt | |||
@@ -1,8 +1,8 @@ | |||
1 | Intel(R) Management Engine Interface (Intel(R) MEI) | 1 | Intel(R) Management Engine Interface (Intel(R) MEI) |
2 | ======================= | 2 | =================================================== |
3 | 3 | ||
4 | Introduction | 4 | Introduction |
5 | ======================= | 5 | ============ |
6 | 6 | ||
7 | The Intel Management Engine (Intel ME) is an isolated and protected computing | 7 | The Intel Management Engine (Intel ME) is an isolated and protected computing |
8 | resource (Co-processor) residing inside certain Intel chipsets. The Intel ME | 8 | resource (Co-processor) residing inside certain Intel chipsets. The Intel ME |
@@ -19,7 +19,7 @@ each client has its own protocol. The protocol is message-based with a | |||
19 | header and payload up to 512 bytes. | 19 | header and payload up to 512 bytes. |
20 | 20 | ||
21 | Prominent usage of the Intel ME Interface is to communicate with Intel(R) | 21 | Prominent usage of the Intel ME Interface is to communicate with Intel(R) |
22 | Active Management Technology (Intel AMT)implemented in firmware running on | 22 | Active Management Technology (Intel AMT) implemented in firmware running on |
23 | the Intel ME. | 23 | the Intel ME. |
24 | 24 | ||
25 | Intel AMT provides the ability to manage a host remotely out-of-band (OOB) | 25 | Intel AMT provides the ability to manage a host remotely out-of-band (OOB) |
@@ -44,8 +44,9 @@ HTTP/S that are received from a remote management console application. | |||
44 | For more information about Intel AMT: | 44 | For more information about Intel AMT: |
45 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide | 45 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide |
46 | 46 | ||
47 | |||
47 | Intel MEI Driver | 48 | Intel MEI Driver |
48 | ======================= | 49 | ================ |
49 | 50 | ||
50 | The driver exposes a misc device called /dev/mei. | 51 | The driver exposes a misc device called /dev/mei. |
51 | 52 | ||
@@ -91,8 +92,10 @@ A code snippet for an application communicating with Intel AMTHI client: | |||
91 | [...] | 92 | [...] |
92 | close(fd); | 93 | close(fd); |
93 | 94 | ||
94 | IOCTL: | 95 | |
95 | ====== | 96 | IOCTL |
97 | ===== | ||
98 | |||
96 | The Intel MEI Driver supports the following IOCTL command: | 99 | The Intel MEI Driver supports the following IOCTL command: |
97 | IOCTL_MEI_CONNECT_CLIENT Connect to firmware Feature (client). | 100 | IOCTL_MEI_CONNECT_CLIENT Connect to firmware Feature (client). |
98 | 101 | ||
@@ -122,58 +125,61 @@ The Intel MEI Driver supports the following IOCTL command: | |||
122 | data that can be sent or received. (e.g. if MTU=2K, can send | 125 | data that can be sent or received. (e.g. if MTU=2K, can send |
123 | requests up to bytes 2k and received responses up to 2k bytes). | 126 | requests up to bytes 2k and received responses up to 2k bytes). |
124 | 127 | ||
125 | Intel ME Applications: | 128 | |
126 | ============== | 129 | Intel ME Applications |
127 | 130 | ===================== | |
128 | 1) Intel Local Management Service (Intel LMS) | 131 | |
129 | 132 | 1) Intel Local Management Service (Intel LMS) | |
130 | Applications running locally on the platform communicate with Intel AMT Release | 133 | |
131 | 2.0 and later releases in the same way that network applications do via SOAP | 134 | Applications running locally on the platform communicate with Intel AMT Release |
132 | over HTTP (deprecated starting with Release 6.0) or with WS-Management over | 135 | 2.0 and later releases in the same way that network applications do via SOAP |
133 | SOAP over HTTP. This means that some Intel AMT features can be accessed from a | 136 | over HTTP (deprecated starting with Release 6.0) or with WS-Management over |
134 | local application using the same network interface as a remote application | 137 | SOAP over HTTP. This means that some Intel AMT features can be accessed from a |
135 | communicating with Intel AMT over the network. | 138 | local application using the same network interface as a remote application |
136 | 139 | communicating with Intel AMT over the network. | |
137 | When a local application sends a message addressed to the local Intel AMT host | 140 | |
138 | name, the Intel LMS, which listens for traffic directed to the host name, | 141 | When a local application sends a message addressed to the local Intel AMT host |
139 | intercepts the message and routes it to the Intel MEI. | 142 | name, the Intel LMS, which listens for traffic directed to the host name, |
140 | For more information: | 143 | intercepts the message and routes it to the Intel MEI. |
141 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide | 144 | For more information: |
142 | Under "About Intel AMT" => "Local Access" | 145 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide |
143 | 146 | Under "About Intel AMT" => "Local Access" | |
144 | For downloading Intel LMS: | 147 | |
145 | http://software.intel.com/en-us/articles/download-the-latest-intel-amt-open-source-drivers/ | 148 | For downloading Intel LMS: |
146 | 149 | http://software.intel.com/en-us/articles/download-the-latest-intel-amt-open-source-drivers/ | |
147 | The Intel LMS opens a connection using the Intel MEI driver to the Intel LMS | 150 | |
148 | firmware feature using a defined UUID and then communicates with the feature | 151 | The Intel LMS opens a connection using the Intel MEI driver to the Intel LMS |
149 | using a protocol called Intel AMT Port Forwarding Protocol(Intel APF protocol). | 152 | firmware feature using a defined UUID and then communicates with the feature |
150 | The protocol is used to maintain multiple sessions with Intel AMT from a | 153 | using a protocol called Intel AMT Port Forwarding Protocol (Intel APF protocol). |
151 | single application. | 154 | The protocol is used to maintain multiple sessions with Intel AMT from a |
152 | 155 | single application. | |
153 | See the protocol specification in the Intel AMT Software Development Kit(SDK) | 156 | |
154 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide | 157 | See the protocol specification in the Intel AMT Software Development Kit (SDK) |
155 | Under "SDK Resources" => "Intel(R) vPro(TM) Gateway(MPS)" | 158 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide |
156 | => "Information for Intel(R) vPro(TM) Gateway Developers" | 159 | Under "SDK Resources" => "Intel(R) vPro(TM) Gateway (MPS)" |
157 | => "Description of the Intel AMT Port Forwarding (APF)Protocol" | 160 | => "Information for Intel(R) vPro(TM) Gateway Developers" |
158 | 161 | => "Description of the Intel AMT Port Forwarding (APF) Protocol" | |
159 | 2) Intel AMT Remote configuration using a Local Agent | 162 | |
160 | A Local Agent enables IT personnel to configure Intel AMT out-of-the-box | 163 | 2) Intel AMT Remote configuration using a Local Agent |
161 | without requiring installing additional data to enable setup. The remote | 164 | |
162 | configuration process may involve an ISV-developed remote configuration | 165 | A Local Agent enables IT personnel to configure Intel AMT out-of-the-box |
163 | agent that runs on the host. | 166 | without requiring installing additional data to enable setup. The remote |
164 | For more information: | 167 | configuration process may involve an ISV-developed remote configuration |
165 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide | 168 | agent that runs on the host. |
166 | Under "Setup and Configuration of Intel AMT" => | 169 | For more information: |
167 | "SDK Tools Supporting Setup and Configuration" => | 170 | http://software.intel.com/sites/manageability/AMT_Implementation_and_Reference_Guide |
168 | "Using the Local Agent Sample" | 171 | Under "Setup and Configuration of Intel AMT" => |
169 | 172 | "SDK Tools Supporting Setup and Configuration" => | |
170 | An open source Intel AMT configuration utility, implementing a local agent | 173 | "Using the Local Agent Sample" |
171 | that accesses the Intel MEI driver, can be found here: | 174 | |
172 | http://software.intel.com/en-us/articles/download-the-latest-intel-amt-open-source-drivers/ | 175 | An open source Intel AMT configuration utility, implementing a local agent |
173 | 176 | that accesses the Intel MEI driver, can be found here: | |
174 | 177 | http://software.intel.com/en-us/articles/download-the-latest-intel-amt-open-source-drivers/ | |
175 | Intel AMT OS Health Watchdog: | 178 | |
176 | ============================= | 179 | |
180 | Intel AMT OS Health Watchdog | ||
181 | ============================ | ||
182 | |||
177 | The Intel AMT Watchdog is an OS Health (Hang/Crash) watchdog. | 183 | The Intel AMT Watchdog is an OS Health (Hang/Crash) watchdog. |
178 | Whenever the OS hangs or crashes, Intel AMT will send an event | 184 | Whenever the OS hangs or crashes, Intel AMT will send an event |
179 | to any subscriber to this event. This mechanism means that | 185 | to any subscriber to this event. This mechanism means that |
@@ -192,8 +198,10 @@ watchdog is 120 seconds. | |||
192 | If the Intel AMT Watchdog feature does not exist (i.e. the connection failed), | 198 | If the Intel AMT Watchdog feature does not exist (i.e. the connection failed), |
193 | the Intel MEI driver will disable the sending of heartbeats. | 199 | the Intel MEI driver will disable the sending of heartbeats. |
194 | 200 | ||
195 | Supported Chipsets: | 201 | |
202 | Supported Chipsets | ||
196 | ================== | 203 | ================== |
204 | |||
197 | 7 Series Chipset Family | 205 | 7 Series Chipset Family |
198 | 6 Series Chipset Family | 206 | 6 Series Chipset Family |
199 | 5 Series Chipset Family | 207 | 5 Series Chipset Family |
diff --git a/Documentation/networking/00-INDEX b/Documentation/networking/00-INDEX index 557b6ef70c26..df27a1a50776 100644 --- a/Documentation/networking/00-INDEX +++ b/Documentation/networking/00-INDEX | |||
@@ -1,7 +1,5 @@ | |||
1 | 00-INDEX | 1 | 00-INDEX |
2 | - this file | 2 | - this file |
3 | 3c505.txt | ||
4 | - information on the 3Com EtherLink Plus (3c505) driver. | ||
5 | 3c509.txt | 3 | 3c509.txt |
6 | - information on the 3Com Etherlink III Series Ethernet cards. | 4 | - information on the 3Com Etherlink III Series Ethernet cards. |
7 | 6pack.txt | 5 | 6pack.txt |
@@ -24,6 +22,8 @@ README.sb1000 | |||
24 | - info on General Instrument/NextLevel SURFboard1000 cable modem. | 22 | - info on General Instrument/NextLevel SURFboard1000 cable modem. |
25 | alias.txt | 23 | alias.txt |
26 | - info on using alias network devices. | 24 | - info on using alias network devices. |
25 | altera_tse.txt | ||
26 | - Altera Triple-Speed Ethernet controller. | ||
27 | arcnet-hardware.txt | 27 | arcnet-hardware.txt |
28 | - tons of info on ARCnet, hubs, jumper settings for ARCnet cards, etc. | 28 | - tons of info on ARCnet, hubs, jumper settings for ARCnet cards, etc. |
29 | arcnet.txt | 29 | arcnet.txt |
@@ -42,6 +42,8 @@ bridge.txt | |||
42 | - where to get user space programs for ethernet bridging with Linux. | 42 | - where to get user space programs for ethernet bridging with Linux. |
43 | can.txt | 43 | can.txt |
44 | - documentation on CAN protocol family. | 44 | - documentation on CAN protocol family. |
45 | cdc_mbim.txt | ||
46 | - 3G/LTE USB modem (Mobile Broadband Interface Model) | ||
45 | cops.txt | 47 | cops.txt |
46 | - info on the COPS LocalTalk Linux driver | 48 | - info on the COPS LocalTalk Linux driver |
47 | cs89x0.txt | 49 | cs89x0.txt |
@@ -54,6 +56,8 @@ cxgb.txt | |||
54 | - Release Notes for the Chelsio N210 Linux device driver. | 56 | - Release Notes for the Chelsio N210 Linux device driver. |
55 | dccp.txt | 57 | dccp.txt |
56 | - the Datagram Congestion Control Protocol (DCCP) (RFC 4340..42). | 58 | - the Datagram Congestion Control Protocol (DCCP) (RFC 4340..42). |
59 | dctcp.txt | ||
60 | - DataCenter TCP congestion control | ||
57 | de4x5.txt | 61 | de4x5.txt |
58 | - the Digital EtherWORKS DE4?? and DE5?? PCI Ethernet driver | 62 | - the Digital EtherWORKS DE4?? and DE5?? PCI Ethernet driver |
59 | decnet.txt | 63 | decnet.txt |
diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt index 4415aa915681..de3afef76837 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt | |||
@@ -728,7 +728,7 @@ The default value is 60. | |||
728 | 728 | ||
729 | - user_reserve_kbytes | 729 | - user_reserve_kbytes |
730 | 730 | ||
731 | When overcommit_memory is set to 2, "never overommit" mode, reserve | 731 | When overcommit_memory is set to 2, "never overcommit" mode, reserve |
732 | min(3% of current process size, user_reserve_kbytes) of free memory. | 732 | min(3% of current process size, user_reserve_kbytes) of free memory. |
733 | This is intended to prevent a user from starting a single memory hogging | 733 | This is intended to prevent a user from starting a single memory hogging |
734 | process, such that they cannot recover (kill the hog). | 734 | process, such that they cannot recover (kill the hog). |
diff --git a/MAINTAINERS b/MAINTAINERS index ddb9ac8d32b3..76f9c0df3e73 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -3207,6 +3207,7 @@ F: Documentation/ | |||
3207 | X: Documentation/ABI/ | 3207 | X: Documentation/ABI/ |
3208 | X: Documentation/devicetree/ | 3208 | X: Documentation/devicetree/ |
3209 | X: Documentation/[a-z][a-z]_[A-Z][A-Z]/ | 3209 | X: Documentation/[a-z][a-z]_[A-Z][A-Z]/ |
3210 | T: git git://git.lwn.net/linux-2.6.git docs-next | ||
3210 | 3211 | ||
3211 | DOUBLETALK DRIVER | 3212 | DOUBLETALK DRIVER |
3212 | M: "James R. Van Zandt" <jrv@vanzandt.mv.com> | 3213 | M: "James R. Van Zandt" <jrv@vanzandt.mv.com> |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 19 | 2 | PATCHLEVEL = 19 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc1 | 4 | EXTRAVERSION = -rc2 |
5 | NAME = Diseased Newt | 5 | NAME = Diseased Newt |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index dd301be89ecc..5376d908eabe 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | # CONFIG_LOCALVERSION_AUTO is not set | 1 | # CONFIG_LOCALVERSION_AUTO is not set |
2 | CONFIG_SYSVIPC=y | 2 | CONFIG_SYSVIPC=y |
3 | CONFIG_POSIX_MQUEUE=y | 3 | CONFIG_POSIX_MQUEUE=y |
4 | CONFIG_FHANDLE=y | ||
4 | CONFIG_AUDIT=y | 5 | CONFIG_AUDIT=y |
5 | CONFIG_NO_HZ_IDLE=y | 6 | CONFIG_NO_HZ_IDLE=y |
6 | CONFIG_HIGH_RES_TIMERS=y | 7 | CONFIG_HIGH_RES_TIMERS=y |
@@ -13,14 +14,12 @@ CONFIG_TASK_IO_ACCOUNTING=y | |||
13 | CONFIG_IKCONFIG=y | 14 | CONFIG_IKCONFIG=y |
14 | CONFIG_IKCONFIG_PROC=y | 15 | CONFIG_IKCONFIG_PROC=y |
15 | CONFIG_LOG_BUF_SHIFT=14 | 16 | CONFIG_LOG_BUF_SHIFT=14 |
16 | CONFIG_RESOURCE_COUNTERS=y | ||
17 | CONFIG_MEMCG=y | 17 | CONFIG_MEMCG=y |
18 | CONFIG_MEMCG_SWAP=y | 18 | CONFIG_MEMCG_SWAP=y |
19 | CONFIG_MEMCG_KMEM=y | 19 | CONFIG_MEMCG_KMEM=y |
20 | CONFIG_CGROUP_HUGETLB=y | 20 | CONFIG_CGROUP_HUGETLB=y |
21 | # CONFIG_UTS_NS is not set | 21 | # CONFIG_UTS_NS is not set |
22 | # CONFIG_IPC_NS is not set | 22 | # CONFIG_IPC_NS is not set |
23 | # CONFIG_PID_NS is not set | ||
24 | # CONFIG_NET_NS is not set | 23 | # CONFIG_NET_NS is not set |
25 | CONFIG_SCHED_AUTOGROUP=y | 24 | CONFIG_SCHED_AUTOGROUP=y |
26 | CONFIG_BLK_DEV_INITRD=y | 25 | CONFIG_BLK_DEV_INITRD=y |
@@ -92,7 +91,6 @@ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y | |||
92 | CONFIG_SERIAL_OF_PLATFORM=y | 91 | CONFIG_SERIAL_OF_PLATFORM=y |
93 | CONFIG_VIRTIO_CONSOLE=y | 92 | CONFIG_VIRTIO_CONSOLE=y |
94 | # CONFIG_HW_RANDOM is not set | 93 | # CONFIG_HW_RANDOM is not set |
95 | # CONFIG_HMC_DRV is not set | ||
96 | CONFIG_SPI=y | 94 | CONFIG_SPI=y |
97 | CONFIG_SPI_PL022=y | 95 | CONFIG_SPI_PL022=y |
98 | CONFIG_GPIO_PL061=y | 96 | CONFIG_GPIO_PL061=y |
@@ -133,6 +131,8 @@ CONFIG_EXT3_FS=y | |||
133 | CONFIG_EXT4_FS=y | 131 | CONFIG_EXT4_FS=y |
134 | CONFIG_FANOTIFY=y | 132 | CONFIG_FANOTIFY=y |
135 | CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y | 133 | CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y |
134 | CONFIG_QUOTA=y | ||
135 | CONFIG_AUTOFS4_FS=y | ||
136 | CONFIG_FUSE_FS=y | 136 | CONFIG_FUSE_FS=y |
137 | CONFIG_CUSE=y | 137 | CONFIG_CUSE=y |
138 | CONFIG_VFAT_FS=y | 138 | CONFIG_VFAT_FS=y |
@@ -152,14 +152,15 @@ CONFIG_MAGIC_SYSRQ=y | |||
152 | CONFIG_DEBUG_KERNEL=y | 152 | CONFIG_DEBUG_KERNEL=y |
153 | CONFIG_LOCKUP_DETECTOR=y | 153 | CONFIG_LOCKUP_DETECTOR=y |
154 | # CONFIG_SCHED_DEBUG is not set | 154 | # CONFIG_SCHED_DEBUG is not set |
155 | # CONFIG_DEBUG_PREEMPT is not set | ||
155 | # CONFIG_FTRACE is not set | 156 | # CONFIG_FTRACE is not set |
157 | CONFIG_KEYS=y | ||
156 | CONFIG_SECURITY=y | 158 | CONFIG_SECURITY=y |
157 | CONFIG_CRYPTO_ANSI_CPRNG=y | 159 | CONFIG_CRYPTO_ANSI_CPRNG=y |
158 | CONFIG_ARM64_CRYPTO=y | 160 | CONFIG_ARM64_CRYPTO=y |
159 | CONFIG_CRYPTO_SHA1_ARM64_CE=y | 161 | CONFIG_CRYPTO_SHA1_ARM64_CE=y |
160 | CONFIG_CRYPTO_SHA2_ARM64_CE=y | 162 | CONFIG_CRYPTO_SHA2_ARM64_CE=y |
161 | CONFIG_CRYPTO_GHASH_ARM64_CE=y | 163 | CONFIG_CRYPTO_GHASH_ARM64_CE=y |
162 | CONFIG_CRYPTO_AES_ARM64_CE=y | ||
163 | CONFIG_CRYPTO_AES_ARM64_CE_CCM=y | 164 | CONFIG_CRYPTO_AES_ARM64_CE_CCM=y |
164 | CONFIG_CRYPTO_AES_ARM64_CE_BLK=y | 165 | CONFIG_CRYPTO_AES_ARM64_CE_BLK=y |
165 | CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y | 166 | CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y |
diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h index d34189bceff7..9ce3e680ae1c 100644 --- a/arch/arm64/include/asm/dma-mapping.h +++ b/arch/arm64/include/asm/dma-mapping.h | |||
@@ -52,13 +52,14 @@ static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops) | |||
52 | dev->archdata.dma_ops = ops; | 52 | dev->archdata.dma_ops = ops; |
53 | } | 53 | } |
54 | 54 | ||
55 | static inline int set_arch_dma_coherent_ops(struct device *dev) | 55 | static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, |
56 | struct iommu_ops *iommu, bool coherent) | ||
56 | { | 57 | { |
57 | dev->archdata.dma_coherent = true; | 58 | dev->archdata.dma_coherent = coherent; |
58 | set_dma_ops(dev, &coherent_swiotlb_dma_ops); | 59 | if (coherent) |
59 | return 0; | 60 | set_dma_ops(dev, &coherent_swiotlb_dma_ops); |
60 | } | 61 | } |
61 | #define set_arch_dma_coherent_ops set_arch_dma_coherent_ops | 62 | #define arch_setup_dma_ops arch_setup_dma_ops |
62 | 63 | ||
63 | /* do not use this function in a driver */ | 64 | /* do not use this function in a driver */ |
64 | static inline bool is_device_dma_coherent(struct device *dev) | 65 | static inline bool is_device_dma_coherent(struct device *dev) |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index df22314f57cf..210d632aa5ad 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
@@ -298,7 +298,6 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, | |||
298 | #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) | 298 | #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) |
299 | #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) | 299 | #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) |
300 | 300 | ||
301 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) | ||
302 | #define pud_write(pud) pte_write(pud_pte(pud)) | 301 | #define pud_write(pud) pte_write(pud_pte(pud)) |
303 | #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) | 302 | #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) |
304 | 303 | ||
@@ -401,7 +400,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) | |||
401 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); | 400 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); |
402 | } | 401 | } |
403 | 402 | ||
404 | #define pud_page(pud) pmd_page(pud_pmd(pud)) | 403 | #define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) |
405 | 404 | ||
406 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ | 405 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ |
407 | 406 | ||
@@ -437,6 +436,8 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr) | |||
437 | return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(addr); | 436 | return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(addr); |
438 | } | 437 | } |
439 | 438 | ||
439 | #define pgd_page(pgd) pfn_to_page(__phys_to_pfn(pgd_val(pgd) & PHYS_MASK)) | ||
440 | |||
440 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 3 */ | 441 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 3 */ |
441 | 442 | ||
442 | #define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd)) | 443 | #define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd)) |
diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c index 3771b72b6569..2d6b6065fe7f 100644 --- a/arch/arm64/kernel/suspend.c +++ b/arch/arm64/kernel/suspend.c | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <asm/debug-monitors.h> | 5 | #include <asm/debug-monitors.h> |
6 | #include <asm/pgtable.h> | 6 | #include <asm/pgtable.h> |
7 | #include <asm/memory.h> | 7 | #include <asm/memory.h> |
8 | #include <asm/mmu_context.h> | ||
8 | #include <asm/smp_plat.h> | 9 | #include <asm/smp_plat.h> |
9 | #include <asm/suspend.h> | 10 | #include <asm/suspend.h> |
10 | #include <asm/tlbflush.h> | 11 | #include <asm/tlbflush.h> |
@@ -98,7 +99,18 @@ int __cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) | |||
98 | */ | 99 | */ |
99 | ret = __cpu_suspend_enter(arg, fn); | 100 | ret = __cpu_suspend_enter(arg, fn); |
100 | if (ret == 0) { | 101 | if (ret == 0) { |
101 | cpu_switch_mm(mm->pgd, mm); | 102 | /* |
103 | * We are resuming from reset with TTBR0_EL1 set to the | ||
104 | * idmap to enable the MMU; restore the active_mm mappings in | ||
105 | * TTBR0_EL1 unless the active_mm == &init_mm, in which case | ||
106 | * the thread entered __cpu_suspend with TTBR0_EL1 set to | ||
107 | * reserved TTBR0 page tables and should be restored as such. | ||
108 | */ | ||
109 | if (mm == &init_mm) | ||
110 | cpu_set_reserved_ttbr0(); | ||
111 | else | ||
112 | cpu_switch_mm(mm->pgd, mm); | ||
113 | |||
102 | flush_tlb_all(); | 114 | flush_tlb_all(); |
103 | 115 | ||
104 | /* | 116 | /* |
diff --git a/arch/parisc/include/asm/ldcw.h b/arch/parisc/include/asm/ldcw.h index d2d11b7055ba..8121aa6db2ff 100644 --- a/arch/parisc/include/asm/ldcw.h +++ b/arch/parisc/include/asm/ldcw.h | |||
@@ -33,11 +33,18 @@ | |||
33 | 33 | ||
34 | #endif /*!CONFIG_PA20*/ | 34 | #endif /*!CONFIG_PA20*/ |
35 | 35 | ||
36 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ | 36 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. |
37 | We don't explicitly expose that "*a" may be written as reload | ||
38 | fails to find a register in class R1_REGS when "a" needs to be | ||
39 | reloaded when generating 64-bit PIC code. Instead, we clobber | ||
40 | memory to indicate to the compiler that the assembly code reads | ||
41 | or writes to items other than those listed in the input and output | ||
42 | operands. This may pessimize the code somewhat but __ldcw is | ||
43 | usually used within code blocks surrounded by memory barriors. */ | ||
37 | #define __ldcw(a) ({ \ | 44 | #define __ldcw(a) ({ \ |
38 | unsigned __ret; \ | 45 | unsigned __ret; \ |
39 | __asm__ __volatile__(__LDCW " 0(%2),%0" \ | 46 | __asm__ __volatile__(__LDCW " 0(%1),%0" \ |
40 | : "=r" (__ret), "+m" (*(a)) : "r" (a)); \ | 47 | : "=r" (__ret) : "r" (a) : "memory"); \ |
41 | __ret; \ | 48 | __ret; \ |
42 | }) | 49 | }) |
43 | 50 | ||
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 10fbed126b11..f83fc6c5e0ba 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -4448,7 +4448,7 @@ void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm) | |||
4448 | * zap all shadow pages. | 4448 | * zap all shadow pages. |
4449 | */ | 4449 | */ |
4450 | if (unlikely(kvm_current_mmio_generation(kvm) == 0)) { | 4450 | if (unlikely(kvm_current_mmio_generation(kvm) == 0)) { |
4451 | printk_ratelimited(KERN_INFO "kvm: zapping shadow pages for mmio generation wraparound\n"); | 4451 | printk_ratelimited(KERN_DEBUG "kvm: zapping shadow pages for mmio generation wraparound\n"); |
4452 | kvm_mmu_invalidate_zap_all_pages(kvm); | 4452 | kvm_mmu_invalidate_zap_all_pages(kvm); |
4453 | } | 4453 | } |
4454 | } | 4454 | } |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index feb852b04598..d4c58d884838 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -5840,53 +5840,10 @@ static __init int hardware_setup(void) | |||
5840 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); | 5840 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); |
5841 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); | 5841 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); |
5842 | 5842 | ||
5843 | vmx_disable_intercept_for_msr(MSR_FS_BASE, false); | ||
5844 | vmx_disable_intercept_for_msr(MSR_GS_BASE, false); | ||
5845 | vmx_disable_intercept_for_msr(MSR_KERNEL_GS_BASE, true); | ||
5846 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_CS, false); | ||
5847 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_ESP, false); | ||
5848 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false); | ||
5849 | vmx_disable_intercept_for_msr(MSR_IA32_BNDCFGS, true); | ||
5850 | |||
5851 | memcpy(vmx_msr_bitmap_legacy_x2apic, | ||
5852 | vmx_msr_bitmap_legacy, PAGE_SIZE); | ||
5853 | memcpy(vmx_msr_bitmap_longmode_x2apic, | ||
5854 | vmx_msr_bitmap_longmode, PAGE_SIZE); | ||
5855 | |||
5856 | if (enable_apicv) { | ||
5857 | for (msr = 0x800; msr <= 0x8ff; msr++) | ||
5858 | vmx_disable_intercept_msr_read_x2apic(msr); | ||
5859 | |||
5860 | /* According SDM, in x2apic mode, the whole id reg is used. | ||
5861 | * But in KVM, it only use the highest eight bits. Need to | ||
5862 | * intercept it */ | ||
5863 | vmx_enable_intercept_msr_read_x2apic(0x802); | ||
5864 | /* TMCCT */ | ||
5865 | vmx_enable_intercept_msr_read_x2apic(0x839); | ||
5866 | /* TPR */ | ||
5867 | vmx_disable_intercept_msr_write_x2apic(0x808); | ||
5868 | /* EOI */ | ||
5869 | vmx_disable_intercept_msr_write_x2apic(0x80b); | ||
5870 | /* SELF-IPI */ | ||
5871 | vmx_disable_intercept_msr_write_x2apic(0x83f); | ||
5872 | } | ||
5873 | |||
5874 | if (enable_ept) { | ||
5875 | kvm_mmu_set_mask_ptes(0ull, | ||
5876 | (enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull, | ||
5877 | (enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull, | ||
5878 | 0ull, VMX_EPT_EXECUTABLE_MASK); | ||
5879 | ept_set_mmio_spte_mask(); | ||
5880 | kvm_enable_tdp(); | ||
5881 | } else | ||
5882 | kvm_disable_tdp(); | ||
5883 | |||
5884 | update_ple_window_actual_max(); | ||
5885 | |||
5886 | if (setup_vmcs_config(&vmcs_config) < 0) { | 5843 | if (setup_vmcs_config(&vmcs_config) < 0) { |
5887 | r = -EIO; | 5844 | r = -EIO; |
5888 | goto out7; | 5845 | goto out7; |
5889 | } | 5846 | } |
5890 | 5847 | ||
5891 | if (boot_cpu_has(X86_FEATURE_NX)) | 5848 | if (boot_cpu_has(X86_FEATURE_NX)) |
5892 | kvm_enable_efer_bits(EFER_NX); | 5849 | kvm_enable_efer_bits(EFER_NX); |
@@ -5945,6 +5902,49 @@ static __init int hardware_setup(void) | |||
5945 | if (nested) | 5902 | if (nested) |
5946 | nested_vmx_setup_ctls_msrs(); | 5903 | nested_vmx_setup_ctls_msrs(); |
5947 | 5904 | ||
5905 | vmx_disable_intercept_for_msr(MSR_FS_BASE, false); | ||
5906 | vmx_disable_intercept_for_msr(MSR_GS_BASE, false); | ||
5907 | vmx_disable_intercept_for_msr(MSR_KERNEL_GS_BASE, true); | ||
5908 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_CS, false); | ||
5909 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_ESP, false); | ||
5910 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false); | ||
5911 | vmx_disable_intercept_for_msr(MSR_IA32_BNDCFGS, true); | ||
5912 | |||
5913 | memcpy(vmx_msr_bitmap_legacy_x2apic, | ||
5914 | vmx_msr_bitmap_legacy, PAGE_SIZE); | ||
5915 | memcpy(vmx_msr_bitmap_longmode_x2apic, | ||
5916 | vmx_msr_bitmap_longmode, PAGE_SIZE); | ||
5917 | |||
5918 | if (enable_apicv) { | ||
5919 | for (msr = 0x800; msr <= 0x8ff; msr++) | ||
5920 | vmx_disable_intercept_msr_read_x2apic(msr); | ||
5921 | |||
5922 | /* According SDM, in x2apic mode, the whole id reg is used. | ||
5923 | * But in KVM, it only use the highest eight bits. Need to | ||
5924 | * intercept it */ | ||
5925 | vmx_enable_intercept_msr_read_x2apic(0x802); | ||
5926 | /* TMCCT */ | ||
5927 | vmx_enable_intercept_msr_read_x2apic(0x839); | ||
5928 | /* TPR */ | ||
5929 | vmx_disable_intercept_msr_write_x2apic(0x808); | ||
5930 | /* EOI */ | ||
5931 | vmx_disable_intercept_msr_write_x2apic(0x80b); | ||
5932 | /* SELF-IPI */ | ||
5933 | vmx_disable_intercept_msr_write_x2apic(0x83f); | ||
5934 | } | ||
5935 | |||
5936 | if (enable_ept) { | ||
5937 | kvm_mmu_set_mask_ptes(0ull, | ||
5938 | (enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull, | ||
5939 | (enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull, | ||
5940 | 0ull, VMX_EPT_EXECUTABLE_MASK); | ||
5941 | ept_set_mmio_spte_mask(); | ||
5942 | kvm_enable_tdp(); | ||
5943 | } else | ||
5944 | kvm_disable_tdp(); | ||
5945 | |||
5946 | update_ple_window_actual_max(); | ||
5947 | |||
5948 | return alloc_kvm_area(); | 5948 | return alloc_kvm_area(); |
5949 | 5949 | ||
5950 | out7: | 5950 | out7: |
diff --git a/drivers/char/agp/ali-agp.c b/drivers/char/agp/ali-agp.c index 19db03667650..dcbbb4ea3cc1 100644 --- a/drivers/char/agp/ali-agp.c +++ b/drivers/char/agp/ali-agp.c | |||
@@ -417,6 +417,6 @@ static void __exit agp_ali_cleanup(void) | |||
417 | module_init(agp_ali_init); | 417 | module_init(agp_ali_init); |
418 | module_exit(agp_ali_cleanup); | 418 | module_exit(agp_ali_cleanup); |
419 | 419 | ||
420 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 420 | MODULE_AUTHOR("Dave Jones"); |
421 | MODULE_LICENSE("GPL and additional rights"); | 421 | MODULE_LICENSE("GPL and additional rights"); |
422 | 422 | ||
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 3b47ed0310e1..0ef350010766 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
@@ -813,6 +813,6 @@ static void __exit agp_amd64_cleanup(void) | |||
813 | module_init(agp_amd64_mod_init); | 813 | module_init(agp_amd64_mod_init); |
814 | module_exit(agp_amd64_cleanup); | 814 | module_exit(agp_amd64_cleanup); |
815 | 815 | ||
816 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>, Andi Kleen"); | 816 | MODULE_AUTHOR("Dave Jones, Andi Kleen"); |
817 | module_param(agp_try_unsupported, bool, 0); | 817 | module_param(agp_try_unsupported, bool, 0); |
818 | MODULE_LICENSE("GPL"); | 818 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/char/agp/ati-agp.c b/drivers/char/agp/ati-agp.c index 18a7a6baa304..75a9786a77e6 100644 --- a/drivers/char/agp/ati-agp.c +++ b/drivers/char/agp/ati-agp.c | |||
@@ -579,6 +579,6 @@ static void __exit agp_ati_cleanup(void) | |||
579 | module_init(agp_ati_init); | 579 | module_init(agp_ati_init); |
580 | module_exit(agp_ati_cleanup); | 580 | module_exit(agp_ati_cleanup); |
581 | 581 | ||
582 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 582 | MODULE_AUTHOR("Dave Jones"); |
583 | MODULE_LICENSE("GPL and additional rights"); | 583 | MODULE_LICENSE("GPL and additional rights"); |
584 | 584 | ||
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index 317c28ce8328..38ffb281df97 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c | |||
@@ -356,7 +356,7 @@ static __init int agp_setup(char *s) | |||
356 | __setup("agp=", agp_setup); | 356 | __setup("agp=", agp_setup); |
357 | #endif | 357 | #endif |
358 | 358 | ||
359 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 359 | MODULE_AUTHOR("Dave Jones, Jeff Hartmann"); |
360 | MODULE_DESCRIPTION("AGP GART driver"); | 360 | MODULE_DESCRIPTION("AGP GART driver"); |
361 | MODULE_LICENSE("GPL and additional rights"); | 361 | MODULE_LICENSE("GPL and additional rights"); |
362 | MODULE_ALIAS_MISCDEV(AGPGART_MINOR); | 362 | MODULE_ALIAS_MISCDEV(AGPGART_MINOR); |
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index f9b9ca5d31b7..0a21daed5b62 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
@@ -920,5 +920,5 @@ static void __exit agp_intel_cleanup(void) | |||
920 | module_init(agp_intel_init); | 920 | module_init(agp_intel_init); |
921 | module_exit(agp_intel_cleanup); | 921 | module_exit(agp_intel_cleanup); |
922 | 922 | ||
923 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 923 | MODULE_AUTHOR("Dave Jones, Various @Intel"); |
924 | MODULE_LICENSE("GPL and additional rights"); | 924 | MODULE_LICENSE("GPL and additional rights"); |
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index f3334829e55a..92aa43fa8d70 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
@@ -1438,5 +1438,5 @@ void intel_gmch_remove(void) | |||
1438 | } | 1438 | } |
1439 | EXPORT_SYMBOL(intel_gmch_remove); | 1439 | EXPORT_SYMBOL(intel_gmch_remove); |
1440 | 1440 | ||
1441 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 1441 | MODULE_AUTHOR("Dave Jones, Various @Intel"); |
1442 | MODULE_LICENSE("GPL and additional rights"); | 1442 | MODULE_LICENSE("GPL and additional rights"); |
diff --git a/drivers/char/agp/nvidia-agp.c b/drivers/char/agp/nvidia-agp.c index a1861b75eb31..6c8d39cb566e 100644 --- a/drivers/char/agp/nvidia-agp.c +++ b/drivers/char/agp/nvidia-agp.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Nvidia AGPGART routines. | 2 | * Nvidia AGPGART routines. |
3 | * Based upon a 2.4 agpgart diff by the folks from NVIDIA, and hacked up | 3 | * Based upon a 2.4 agpgart diff by the folks from NVIDIA, and hacked up |
4 | * to work in 2.5 by Dave Jones <davej@redhat.com> | 4 | * to work in 2.5 by Dave Jones. |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
diff --git a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c index 228f20cddc05..a4961d35e940 100644 --- a/drivers/char/agp/via-agp.c +++ b/drivers/char/agp/via-agp.c | |||
@@ -595,4 +595,4 @@ module_init(agp_via_init); | |||
595 | module_exit(agp_via_cleanup); | 595 | module_exit(agp_via_cleanup); |
596 | 596 | ||
597 | MODULE_LICENSE("GPL"); | 597 | MODULE_LICENSE("GPL"); |
598 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 598 | MODULE_AUTHOR("Dave Jones"); |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 5fa83f751378..6b65fa4e0c55 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -199,18 +199,6 @@ struct bmc_device { | |||
199 | int guid_set; | 199 | int guid_set; |
200 | char name[16]; | 200 | char name[16]; |
201 | struct kref usecount; | 201 | struct kref usecount; |
202 | |||
203 | /* bmc device attributes */ | ||
204 | struct device_attribute device_id_attr; | ||
205 | struct device_attribute provides_dev_sdrs_attr; | ||
206 | struct device_attribute revision_attr; | ||
207 | struct device_attribute firmware_rev_attr; | ||
208 | struct device_attribute version_attr; | ||
209 | struct device_attribute add_dev_support_attr; | ||
210 | struct device_attribute manufacturer_id_attr; | ||
211 | struct device_attribute product_id_attr; | ||
212 | struct device_attribute guid_attr; | ||
213 | struct device_attribute aux_firmware_rev_attr; | ||
214 | }; | 202 | }; |
215 | #define to_bmc_device(x) container_of((x), struct bmc_device, pdev.dev) | 203 | #define to_bmc_device(x) container_of((x), struct bmc_device, pdev.dev) |
216 | 204 | ||
@@ -2252,7 +2240,7 @@ static ssize_t device_id_show(struct device *dev, | |||
2252 | 2240 | ||
2253 | return snprintf(buf, 10, "%u\n", bmc->id.device_id); | 2241 | return snprintf(buf, 10, "%u\n", bmc->id.device_id); |
2254 | } | 2242 | } |
2255 | DEVICE_ATTR(device_id, S_IRUGO, device_id_show, NULL); | 2243 | static DEVICE_ATTR(device_id, S_IRUGO, device_id_show, NULL); |
2256 | 2244 | ||
2257 | static ssize_t provides_device_sdrs_show(struct device *dev, | 2245 | static ssize_t provides_device_sdrs_show(struct device *dev, |
2258 | struct device_attribute *attr, | 2246 | struct device_attribute *attr, |
@@ -2263,7 +2251,8 @@ static ssize_t provides_device_sdrs_show(struct device *dev, | |||
2263 | return snprintf(buf, 10, "%u\n", | 2251 | return snprintf(buf, 10, "%u\n", |
2264 | (bmc->id.device_revision & 0x80) >> 7); | 2252 | (bmc->id.device_revision & 0x80) >> 7); |
2265 | } | 2253 | } |
2266 | DEVICE_ATTR(provides_device_sdrs, S_IRUGO, provides_device_sdrs_show, NULL); | 2254 | static DEVICE_ATTR(provides_device_sdrs, S_IRUGO, provides_device_sdrs_show, |
2255 | NULL); | ||
2267 | 2256 | ||
2268 | static ssize_t revision_show(struct device *dev, struct device_attribute *attr, | 2257 | static ssize_t revision_show(struct device *dev, struct device_attribute *attr, |
2269 | char *buf) | 2258 | char *buf) |
@@ -2273,7 +2262,7 @@ static ssize_t revision_show(struct device *dev, struct device_attribute *attr, | |||
2273 | return snprintf(buf, 20, "%u\n", | 2262 | return snprintf(buf, 20, "%u\n", |
2274 | bmc->id.device_revision & 0x0F); | 2263 | bmc->id.device_revision & 0x0F); |
2275 | } | 2264 | } |
2276 | DEVICE_ATTR(revision, S_IRUGO, revision_show, NULL); | 2265 | static DEVICE_ATTR(revision, S_IRUGO, revision_show, NULL); |
2277 | 2266 | ||
2278 | static ssize_t firmware_revision_show(struct device *dev, | 2267 | static ssize_t firmware_revision_show(struct device *dev, |
2279 | struct device_attribute *attr, | 2268 | struct device_attribute *attr, |
@@ -2284,7 +2273,7 @@ static ssize_t firmware_revision_show(struct device *dev, | |||
2284 | return snprintf(buf, 20, "%u.%x\n", bmc->id.firmware_revision_1, | 2273 | return snprintf(buf, 20, "%u.%x\n", bmc->id.firmware_revision_1, |
2285 | bmc->id.firmware_revision_2); | 2274 | bmc->id.firmware_revision_2); |
2286 | } | 2275 | } |
2287 | DEVICE_ATTR(firmware_revision, S_IRUGO, firmware_revision_show, NULL); | 2276 | static DEVICE_ATTR(firmware_revision, S_IRUGO, firmware_revision_show, NULL); |
2288 | 2277 | ||
2289 | static ssize_t ipmi_version_show(struct device *dev, | 2278 | static ssize_t ipmi_version_show(struct device *dev, |
2290 | struct device_attribute *attr, | 2279 | struct device_attribute *attr, |
@@ -2296,7 +2285,7 @@ static ssize_t ipmi_version_show(struct device *dev, | |||
2296 | ipmi_version_major(&bmc->id), | 2285 | ipmi_version_major(&bmc->id), |
2297 | ipmi_version_minor(&bmc->id)); | 2286 | ipmi_version_minor(&bmc->id)); |
2298 | } | 2287 | } |
2299 | DEVICE_ATTR(ipmi_version, S_IRUGO, ipmi_version_show, NULL); | 2288 | static DEVICE_ATTR(ipmi_version, S_IRUGO, ipmi_version_show, NULL); |
2300 | 2289 | ||
2301 | static ssize_t add_dev_support_show(struct device *dev, | 2290 | static ssize_t add_dev_support_show(struct device *dev, |
2302 | struct device_attribute *attr, | 2291 | struct device_attribute *attr, |
@@ -2307,7 +2296,8 @@ static ssize_t add_dev_support_show(struct device *dev, | |||
2307 | return snprintf(buf, 10, "0x%02x\n", | 2296 | return snprintf(buf, 10, "0x%02x\n", |
2308 | bmc->id.additional_device_support); | 2297 | bmc->id.additional_device_support); |
2309 | } | 2298 | } |
2310 | DEVICE_ATTR(additional_device_support, S_IRUGO, add_dev_support_show, NULL); | 2299 | static DEVICE_ATTR(additional_device_support, S_IRUGO, add_dev_support_show, |
2300 | NULL); | ||
2311 | 2301 | ||
2312 | static ssize_t manufacturer_id_show(struct device *dev, | 2302 | static ssize_t manufacturer_id_show(struct device *dev, |
2313 | struct device_attribute *attr, | 2303 | struct device_attribute *attr, |
@@ -2317,7 +2307,7 @@ static ssize_t manufacturer_id_show(struct device *dev, | |||
2317 | 2307 | ||
2318 | return snprintf(buf, 20, "0x%6.6x\n", bmc->id.manufacturer_id); | 2308 | return snprintf(buf, 20, "0x%6.6x\n", bmc->id.manufacturer_id); |
2319 | } | 2309 | } |
2320 | DEVICE_ATTR(manufacturer_id, S_IRUGO, manufacturer_id_show, NULL); | 2310 | static DEVICE_ATTR(manufacturer_id, S_IRUGO, manufacturer_id_show, NULL); |
2321 | 2311 | ||
2322 | static ssize_t product_id_show(struct device *dev, | 2312 | static ssize_t product_id_show(struct device *dev, |
2323 | struct device_attribute *attr, | 2313 | struct device_attribute *attr, |
@@ -2327,7 +2317,7 @@ static ssize_t product_id_show(struct device *dev, | |||
2327 | 2317 | ||
2328 | return snprintf(buf, 10, "0x%4.4x\n", bmc->id.product_id); | 2318 | return snprintf(buf, 10, "0x%4.4x\n", bmc->id.product_id); |
2329 | } | 2319 | } |
2330 | DEVICE_ATTR(product_id, S_IRUGO, product_id_show, NULL); | 2320 | static DEVICE_ATTR(product_id, S_IRUGO, product_id_show, NULL); |
2331 | 2321 | ||
2332 | static ssize_t aux_firmware_rev_show(struct device *dev, | 2322 | static ssize_t aux_firmware_rev_show(struct device *dev, |
2333 | struct device_attribute *attr, | 2323 | struct device_attribute *attr, |
@@ -2341,7 +2331,7 @@ static ssize_t aux_firmware_rev_show(struct device *dev, | |||
2341 | bmc->id.aux_firmware_revision[1], | 2331 | bmc->id.aux_firmware_revision[1], |
2342 | bmc->id.aux_firmware_revision[0]); | 2332 | bmc->id.aux_firmware_revision[0]); |
2343 | } | 2333 | } |
2344 | DEVICE_ATTR(aux_firmware_revision, S_IRUGO, aux_firmware_rev_show, NULL); | 2334 | static DEVICE_ATTR(aux_firmware_revision, S_IRUGO, aux_firmware_rev_show, NULL); |
2345 | 2335 | ||
2346 | static ssize_t guid_show(struct device *dev, struct device_attribute *attr, | 2336 | static ssize_t guid_show(struct device *dev, struct device_attribute *attr, |
2347 | char *buf) | 2337 | char *buf) |
@@ -2352,7 +2342,7 @@ static ssize_t guid_show(struct device *dev, struct device_attribute *attr, | |||
2352 | (long long) bmc->guid[0], | 2342 | (long long) bmc->guid[0], |
2353 | (long long) bmc->guid[8]); | 2343 | (long long) bmc->guid[8]); |
2354 | } | 2344 | } |
2355 | DEVICE_ATTR(guid, S_IRUGO, guid_show, NULL); | 2345 | static DEVICE_ATTR(guid, S_IRUGO, guid_show, NULL); |
2356 | 2346 | ||
2357 | static struct attribute *bmc_dev_attrs[] = { | 2347 | static struct attribute *bmc_dev_attrs[] = { |
2358 | &dev_attr_device_id.attr, | 2348 | &dev_attr_device_id.attr, |
@@ -2392,10 +2382,10 @@ cleanup_bmc_device(struct kref *ref) | |||
2392 | 2382 | ||
2393 | if (bmc->id.aux_firmware_revision_set) | 2383 | if (bmc->id.aux_firmware_revision_set) |
2394 | device_remove_file(&bmc->pdev.dev, | 2384 | device_remove_file(&bmc->pdev.dev, |
2395 | &bmc->aux_firmware_rev_attr); | 2385 | &dev_attr_aux_firmware_revision); |
2396 | if (bmc->guid_set) | 2386 | if (bmc->guid_set) |
2397 | device_remove_file(&bmc->pdev.dev, | 2387 | device_remove_file(&bmc->pdev.dev, |
2398 | &bmc->guid_attr); | 2388 | &dev_attr_guid); |
2399 | 2389 | ||
2400 | platform_device_unregister(&bmc->pdev); | 2390 | platform_device_unregister(&bmc->pdev); |
2401 | } | 2391 | } |
@@ -2422,16 +2412,14 @@ static int create_bmc_files(struct bmc_device *bmc) | |||
2422 | int err; | 2412 | int err; |
2423 | 2413 | ||
2424 | if (bmc->id.aux_firmware_revision_set) { | 2414 | if (bmc->id.aux_firmware_revision_set) { |
2425 | bmc->aux_firmware_rev_attr.attr.name = "aux_firmware_revision"; | ||
2426 | err = device_create_file(&bmc->pdev.dev, | 2415 | err = device_create_file(&bmc->pdev.dev, |
2427 | &bmc->aux_firmware_rev_attr); | 2416 | &dev_attr_aux_firmware_revision); |
2428 | if (err) | 2417 | if (err) |
2429 | goto out; | 2418 | goto out; |
2430 | } | 2419 | } |
2431 | if (bmc->guid_set) { | 2420 | if (bmc->guid_set) { |
2432 | bmc->guid_attr.attr.name = "guid"; | ||
2433 | err = device_create_file(&bmc->pdev.dev, | 2421 | err = device_create_file(&bmc->pdev.dev, |
2434 | &bmc->guid_attr); | 2422 | &dev_attr_guid); |
2435 | if (err) | 2423 | if (err) |
2436 | goto out_aux_firm; | 2424 | goto out_aux_firm; |
2437 | } | 2425 | } |
@@ -2441,7 +2429,7 @@ static int create_bmc_files(struct bmc_device *bmc) | |||
2441 | out_aux_firm: | 2429 | out_aux_firm: |
2442 | if (bmc->id.aux_firmware_revision_set) | 2430 | if (bmc->id.aux_firmware_revision_set) |
2443 | device_remove_file(&bmc->pdev.dev, | 2431 | device_remove_file(&bmc->pdev.dev, |
2444 | &bmc->aux_firmware_rev_attr); | 2432 | &dev_attr_aux_firmware_revision); |
2445 | out: | 2433 | out: |
2446 | return err; | 2434 | return err; |
2447 | } | 2435 | } |
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c index e178ac27e73c..fd5a5e85d7dc 100644 --- a/drivers/char/ipmi/ipmi_ssif.c +++ b/drivers/char/ipmi/ipmi_ssif.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <linux/dmi.h> | 52 | #include <linux/dmi.h> |
53 | #include <linux/kthread.h> | 53 | #include <linux/kthread.h> |
54 | #include <linux/acpi.h> | 54 | #include <linux/acpi.h> |
55 | #include <linux/ctype.h> | ||
55 | 56 | ||
56 | #define PFX "ipmi_ssif: " | 57 | #define PFX "ipmi_ssif: " |
57 | #define DEVICE_NAME "ipmi_ssif" | 58 | #define DEVICE_NAME "ipmi_ssif" |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 4f7b275f2f7b..7d4974b83af7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | |||
@@ -121,13 +121,9 @@ static int kfd_open(struct inode *inode, struct file *filep) | |||
121 | if (IS_ERR(process)) | 121 | if (IS_ERR(process)) |
122 | return PTR_ERR(process); | 122 | return PTR_ERR(process); |
123 | 123 | ||
124 | process->is_32bit_user_mode = is_32bit_user_mode; | ||
125 | |||
126 | dev_dbg(kfd_device, "process %d opened, compat mode (32 bit) - %d\n", | 124 | dev_dbg(kfd_device, "process %d opened, compat mode (32 bit) - %d\n", |
127 | process->pasid, process->is_32bit_user_mode); | 125 | process->pasid, process->is_32bit_user_mode); |
128 | 126 | ||
129 | kfd_init_apertures(process); | ||
130 | |||
131 | return 0; | 127 | return 0; |
132 | } | 128 | } |
133 | 129 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c index 66df4da01c29..e64aa99e5e41 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c | |||
@@ -299,13 +299,13 @@ int kfd_init_apertures(struct kfd_process *process) | |||
299 | struct kfd_dev *dev; | 299 | struct kfd_dev *dev; |
300 | struct kfd_process_device *pdd; | 300 | struct kfd_process_device *pdd; |
301 | 301 | ||
302 | mutex_lock(&process->mutex); | ||
303 | |||
304 | /*Iterating over all devices*/ | 302 | /*Iterating over all devices*/ |
305 | while ((dev = kfd_topology_enum_kfd_devices(id)) != NULL && | 303 | while ((dev = kfd_topology_enum_kfd_devices(id)) != NULL && |
306 | id < NUM_OF_SUPPORTED_GPUS) { | 304 | id < NUM_OF_SUPPORTED_GPUS) { |
307 | 305 | ||
308 | pdd = kfd_get_process_device_data(dev, process, 1); | 306 | pdd = kfd_get_process_device_data(dev, process, 1); |
307 | if (!pdd) | ||
308 | return -1; | ||
309 | 309 | ||
310 | /* | 310 | /* |
311 | * For 64 bit process aperture will be statically reserved in | 311 | * For 64 bit process aperture will be statically reserved in |
@@ -348,8 +348,6 @@ int kfd_init_apertures(struct kfd_process *process) | |||
348 | id++; | 348 | id++; |
349 | } | 349 | } |
350 | 350 | ||
351 | mutex_unlock(&process->mutex); | ||
352 | |||
353 | return 0; | 351 | return 0; |
354 | } | 352 | } |
355 | 353 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index b85eb0b830b4..3c76ef05cbcf 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c | |||
@@ -26,6 +26,8 @@ | |||
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/amd-iommu.h> | 27 | #include <linux/amd-iommu.h> |
28 | #include <linux/notifier.h> | 28 | #include <linux/notifier.h> |
29 | #include <linux/compat.h> | ||
30 | |||
29 | struct mm_struct; | 31 | struct mm_struct; |
30 | 32 | ||
31 | #include "kfd_priv.h" | 33 | #include "kfd_priv.h" |
@@ -285,8 +287,15 @@ static struct kfd_process *create_process(const struct task_struct *thread) | |||
285 | if (err != 0) | 287 | if (err != 0) |
286 | goto err_process_pqm_init; | 288 | goto err_process_pqm_init; |
287 | 289 | ||
290 | /* init process apertures*/ | ||
291 | process->is_32bit_user_mode = is_compat_task(); | ||
292 | if (kfd_init_apertures(process) != 0) | ||
293 | goto err_init_apretures; | ||
294 | |||
288 | return process; | 295 | return process; |
289 | 296 | ||
297 | err_init_apretures: | ||
298 | pqm_uninit(&process->pqm); | ||
290 | err_process_pqm_init: | 299 | err_process_pqm_init: |
291 | hash_del_rcu(&process->kfd_processes); | 300 | hash_del_rcu(&process->kfd_processes); |
292 | synchronize_rcu(); | 301 | synchronize_rcu(); |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index 5733e2859e8a..b11792d7e70e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c | |||
@@ -700,8 +700,6 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr, | |||
700 | dev->node_props.simd_per_cu); | 700 | dev->node_props.simd_per_cu); |
701 | sysfs_show_32bit_prop(buffer, "max_slots_scratch_cu", | 701 | sysfs_show_32bit_prop(buffer, "max_slots_scratch_cu", |
702 | dev->node_props.max_slots_scratch_cu); | 702 | dev->node_props.max_slots_scratch_cu); |
703 | sysfs_show_32bit_prop(buffer, "engine_id", | ||
704 | dev->node_props.engine_id); | ||
705 | sysfs_show_32bit_prop(buffer, "vendor_id", | 703 | sysfs_show_32bit_prop(buffer, "vendor_id", |
706 | dev->node_props.vendor_id); | 704 | dev->node_props.vendor_id); |
707 | sysfs_show_32bit_prop(buffer, "device_id", | 705 | sysfs_show_32bit_prop(buffer, "device_id", |
@@ -715,6 +713,12 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr, | |||
715 | dev->gpu->kgd)); | 713 | dev->gpu->kgd)); |
716 | sysfs_show_64bit_prop(buffer, "local_mem_size", | 714 | sysfs_show_64bit_prop(buffer, "local_mem_size", |
717 | kfd2kgd->get_vmem_size(dev->gpu->kgd)); | 715 | kfd2kgd->get_vmem_size(dev->gpu->kgd)); |
716 | |||
717 | sysfs_show_32bit_prop(buffer, "fw_version", | ||
718 | kfd2kgd->get_fw_version( | ||
719 | dev->gpu->kgd, | ||
720 | KGD_ENGINE_MEC1)); | ||
721 | |||
718 | } | 722 | } |
719 | 723 | ||
720 | ret = sysfs_show_32bit_prop(buffer, "max_engine_clk_ccompute", | 724 | ret = sysfs_show_32bit_prop(buffer, "max_engine_clk_ccompute", |
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index 9c729dd8dd50..47b551970a14 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h | |||
@@ -45,6 +45,17 @@ enum kgd_memory_pool { | |||
45 | KGD_POOL_FRAMEBUFFER = 3, | 45 | KGD_POOL_FRAMEBUFFER = 3, |
46 | }; | 46 | }; |
47 | 47 | ||
48 | enum kgd_engine_type { | ||
49 | KGD_ENGINE_PFP = 1, | ||
50 | KGD_ENGINE_ME, | ||
51 | KGD_ENGINE_CE, | ||
52 | KGD_ENGINE_MEC1, | ||
53 | KGD_ENGINE_MEC2, | ||
54 | KGD_ENGINE_RLC, | ||
55 | KGD_ENGINE_SDMA, | ||
56 | KGD_ENGINE_MAX | ||
57 | }; | ||
58 | |||
48 | struct kgd2kfd_shared_resources { | 59 | struct kgd2kfd_shared_resources { |
49 | /* Bit n == 1 means VMID n is available for KFD. */ | 60 | /* Bit n == 1 means VMID n is available for KFD. */ |
50 | unsigned int compute_vmid_bitmap; | 61 | unsigned int compute_vmid_bitmap; |
@@ -137,6 +148,8 @@ struct kgd2kfd_calls { | |||
137 | * | 148 | * |
138 | * @hqd_destroy: Destructs and preempts the queue assigned to that hqd slot. | 149 | * @hqd_destroy: Destructs and preempts the queue assigned to that hqd slot. |
139 | * | 150 | * |
151 | * @get_fw_version: Returns FW versions from the header | ||
152 | * | ||
140 | * This structure contains function pointers to services that the kgd driver | 153 | * This structure contains function pointers to services that the kgd driver |
141 | * provides to amdkfd driver. | 154 | * provides to amdkfd driver. |
142 | * | 155 | * |
@@ -176,6 +189,8 @@ struct kfd2kgd_calls { | |||
176 | int (*hqd_destroy)(struct kgd_dev *kgd, uint32_t reset_type, | 189 | int (*hqd_destroy)(struct kgd_dev *kgd, uint32_t reset_type, |
177 | unsigned int timeout, uint32_t pipe_id, | 190 | unsigned int timeout, uint32_t pipe_id, |
178 | uint32_t queue_id); | 191 | uint32_t queue_id); |
192 | uint16_t (*get_fw_version)(struct kgd_dev *kgd, | ||
193 | enum kgd_engine_type type); | ||
179 | }; | 194 | }; |
180 | 195 | ||
181 | bool kgd2kfd_init(unsigned interface_version, | 196 | bool kgd2kfd_init(unsigned interface_version, |
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 4a78a773151c..bbdbe4721573 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -61,7 +61,7 @@ drm_atomic_helper_plane_changed(struct drm_atomic_state *state, | |||
61 | struct drm_crtc_state *crtc_state; | 61 | struct drm_crtc_state *crtc_state; |
62 | 62 | ||
63 | if (plane->state->crtc) { | 63 | if (plane->state->crtc) { |
64 | crtc_state = state->crtc_states[drm_crtc_index(plane->crtc)]; | 64 | crtc_state = state->crtc_states[drm_crtc_index(plane->state->crtc)]; |
65 | 65 | ||
66 | if (WARN_ON(!crtc_state)) | 66 | if (WARN_ON(!crtc_state)) |
67 | return; | 67 | return; |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index f5a5f18efa5b..4d79dad9d44f 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -830,6 +830,8 @@ drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, | |||
830 | * vblank events since the system was booted, including lost events due to | 830 | * vblank events since the system was booted, including lost events due to |
831 | * modesetting activity. | 831 | * modesetting activity. |
832 | * | 832 | * |
833 | * This is the legacy version of drm_crtc_vblank_count(). | ||
834 | * | ||
833 | * Returns: | 835 | * Returns: |
834 | * The software vblank counter. | 836 | * The software vblank counter. |
835 | */ | 837 | */ |
@@ -844,6 +846,25 @@ u32 drm_vblank_count(struct drm_device *dev, int crtc) | |||
844 | EXPORT_SYMBOL(drm_vblank_count); | 846 | EXPORT_SYMBOL(drm_vblank_count); |
845 | 847 | ||
846 | /** | 848 | /** |
849 | * drm_crtc_vblank_count - retrieve "cooked" vblank counter value | ||
850 | * @crtc: which counter to retrieve | ||
851 | * | ||
852 | * Fetches the "cooked" vblank count value that represents the number of | ||
853 | * vblank events since the system was booted, including lost events due to | ||
854 | * modesetting activity. | ||
855 | * | ||
856 | * This is the native KMS version of drm_vblank_count(). | ||
857 | * | ||
858 | * Returns: | ||
859 | * The software vblank counter. | ||
860 | */ | ||
861 | u32 drm_crtc_vblank_count(struct drm_crtc *crtc) | ||
862 | { | ||
863 | return drm_vblank_count(crtc->dev, drm_crtc_index(crtc)); | ||
864 | } | ||
865 | EXPORT_SYMBOL(drm_crtc_vblank_count); | ||
866 | |||
867 | /** | ||
847 | * drm_vblank_count_and_time - retrieve "cooked" vblank counter value | 868 | * drm_vblank_count_and_time - retrieve "cooked" vblank counter value |
848 | * and the system timestamp corresponding to that vblank counter value. | 869 | * and the system timestamp corresponding to that vblank counter value. |
849 | * | 870 | * |
@@ -904,6 +925,8 @@ static void send_vblank_event(struct drm_device *dev, | |||
904 | * | 925 | * |
905 | * Updates sequence # and timestamp on event, and sends it to userspace. | 926 | * Updates sequence # and timestamp on event, and sends it to userspace. |
906 | * Caller must hold event lock. | 927 | * Caller must hold event lock. |
928 | * | ||
929 | * This is the legacy version of drm_crtc_send_vblank_event(). | ||
907 | */ | 930 | */ |
908 | void drm_send_vblank_event(struct drm_device *dev, int crtc, | 931 | void drm_send_vblank_event(struct drm_device *dev, int crtc, |
909 | struct drm_pending_vblank_event *e) | 932 | struct drm_pending_vblank_event *e) |
@@ -923,6 +946,23 @@ void drm_send_vblank_event(struct drm_device *dev, int crtc, | |||
923 | EXPORT_SYMBOL(drm_send_vblank_event); | 946 | EXPORT_SYMBOL(drm_send_vblank_event); |
924 | 947 | ||
925 | /** | 948 | /** |
949 | * drm_crtc_send_vblank_event - helper to send vblank event after pageflip | ||
950 | * @crtc: the source CRTC of the vblank event | ||
951 | * @e: the event to send | ||
952 | * | ||
953 | * Updates sequence # and timestamp on event, and sends it to userspace. | ||
954 | * Caller must hold event lock. | ||
955 | * | ||
956 | * This is the native KMS version of drm_send_vblank_event(). | ||
957 | */ | ||
958 | void drm_crtc_send_vblank_event(struct drm_crtc *crtc, | ||
959 | struct drm_pending_vblank_event *e) | ||
960 | { | ||
961 | drm_send_vblank_event(crtc->dev, drm_crtc_index(crtc), e); | ||
962 | } | ||
963 | EXPORT_SYMBOL(drm_crtc_send_vblank_event); | ||
964 | |||
965 | /** | ||
926 | * drm_vblank_enable - enable the vblank interrupt on a CRTC | 966 | * drm_vblank_enable - enable the vblank interrupt on a CRTC |
927 | * @dev: DRM device | 967 | * @dev: DRM device |
928 | * @crtc: CRTC in question | 968 | * @crtc: CRTC in question |
@@ -1594,6 +1634,8 @@ static void drm_handle_vblank_events(struct drm_device *dev, int crtc) | |||
1594 | * | 1634 | * |
1595 | * Drivers should call this routine in their vblank interrupt handlers to | 1635 | * Drivers should call this routine in their vblank interrupt handlers to |
1596 | * update the vblank counter and send any signals that may be pending. | 1636 | * update the vblank counter and send any signals that may be pending. |
1637 | * | ||
1638 | * This is the legacy version of drm_crtc_handle_vblank(). | ||
1597 | */ | 1639 | */ |
1598 | bool drm_handle_vblank(struct drm_device *dev, int crtc) | 1640 | bool drm_handle_vblank(struct drm_device *dev, int crtc) |
1599 | { | 1641 | { |
@@ -1670,3 +1712,21 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc) | |||
1670 | return true; | 1712 | return true; |
1671 | } | 1713 | } |
1672 | EXPORT_SYMBOL(drm_handle_vblank); | 1714 | EXPORT_SYMBOL(drm_handle_vblank); |
1715 | |||
1716 | /** | ||
1717 | * drm_crtc_handle_vblank - handle a vblank event | ||
1718 | * @crtc: where this event occurred | ||
1719 | * | ||
1720 | * Drivers should call this routine in their vblank interrupt handlers to | ||
1721 | * update the vblank counter and send any signals that may be pending. | ||
1722 | * | ||
1723 | * This is the native KMS version of drm_handle_vblank(). | ||
1724 | * | ||
1725 | * Returns: | ||
1726 | * True if the event was successfully handled, false on failure. | ||
1727 | */ | ||
1728 | bool drm_crtc_handle_vblank(struct drm_crtc *crtc) | ||
1729 | { | ||
1730 | return drm_handle_vblank(crtc->dev, drm_crtc_index(crtc)); | ||
1731 | } | ||
1732 | EXPORT_SYMBOL(drm_crtc_handle_vblank); | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index f990ab4c3efb..574057cd1d09 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -811,6 +811,8 @@ int i915_reset(struct drm_device *dev) | |||
811 | if (!i915.reset) | 811 | if (!i915.reset) |
812 | return 0; | 812 | return 0; |
813 | 813 | ||
814 | intel_reset_gt_powersave(dev); | ||
815 | |||
814 | mutex_lock(&dev->struct_mutex); | 816 | mutex_lock(&dev->struct_mutex); |
815 | 817 | ||
816 | i915_gem_reset(dev); | 818 | i915_gem_reset(dev); |
@@ -880,7 +882,7 @@ int i915_reset(struct drm_device *dev) | |||
880 | * of re-init after reset. | 882 | * of re-init after reset. |
881 | */ | 883 | */ |
882 | if (INTEL_INFO(dev)->gen > 5) | 884 | if (INTEL_INFO(dev)->gen > 5) |
883 | intel_reset_gt_powersave(dev); | 885 | intel_enable_gt_powersave(dev); |
884 | } else { | 886 | } else { |
885 | mutex_unlock(&dev->struct_mutex); | 887 | mutex_unlock(&dev->struct_mutex); |
886 | } | 888 | } |
@@ -1584,7 +1586,7 @@ static struct drm_driver driver = { | |||
1584 | .gem_prime_import = i915_gem_prime_import, | 1586 | .gem_prime_import = i915_gem_prime_import, |
1585 | 1587 | ||
1586 | .dumb_create = i915_gem_dumb_create, | 1588 | .dumb_create = i915_gem_dumb_create, |
1587 | .dumb_map_offset = i915_gem_dumb_map_offset, | 1589 | .dumb_map_offset = i915_gem_mmap_gtt, |
1588 | .dumb_destroy = drm_gem_dumb_destroy, | 1590 | .dumb_destroy = drm_gem_dumb_destroy, |
1589 | .ioctls = i915_ioctls, | 1591 | .ioctls = i915_ioctls, |
1590 | .fops = &i915_driver_fops, | 1592 | .fops = &i915_driver_fops, |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 63bcda5541ec..70d0f0f06f1a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -2501,9 +2501,8 @@ void i915_vma_move_to_active(struct i915_vma *vma, | |||
2501 | int i915_gem_dumb_create(struct drm_file *file_priv, | 2501 | int i915_gem_dumb_create(struct drm_file *file_priv, |
2502 | struct drm_device *dev, | 2502 | struct drm_device *dev, |
2503 | struct drm_mode_create_dumb *args); | 2503 | struct drm_mode_create_dumb *args); |
2504 | int i915_gem_dumb_map_offset(struct drm_file *file_priv, | 2504 | int i915_gem_mmap_gtt(struct drm_file *file_priv, struct drm_device *dev, |
2505 | struct drm_device *dev, uint32_t handle, | 2505 | uint32_t handle, uint64_t *offset); |
2506 | uint64_t *offset); | ||
2507 | /** | 2506 | /** |
2508 | * Returns true if seq1 is later than seq2. | 2507 | * Returns true if seq1 is later than seq2. |
2509 | */ | 2508 | */ |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4a9faea626db..52adcb680be3 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -401,7 +401,6 @@ static int | |||
401 | i915_gem_create(struct drm_file *file, | 401 | i915_gem_create(struct drm_file *file, |
402 | struct drm_device *dev, | 402 | struct drm_device *dev, |
403 | uint64_t size, | 403 | uint64_t size, |
404 | bool dumb, | ||
405 | uint32_t *handle_p) | 404 | uint32_t *handle_p) |
406 | { | 405 | { |
407 | struct drm_i915_gem_object *obj; | 406 | struct drm_i915_gem_object *obj; |
@@ -417,7 +416,6 @@ i915_gem_create(struct drm_file *file, | |||
417 | if (obj == NULL) | 416 | if (obj == NULL) |
418 | return -ENOMEM; | 417 | return -ENOMEM; |
419 | 418 | ||
420 | obj->base.dumb = dumb; | ||
421 | ret = drm_gem_handle_create(file, &obj->base, &handle); | 419 | ret = drm_gem_handle_create(file, &obj->base, &handle); |
422 | /* drop reference from allocate - handle holds it now */ | 420 | /* drop reference from allocate - handle holds it now */ |
423 | drm_gem_object_unreference_unlocked(&obj->base); | 421 | drm_gem_object_unreference_unlocked(&obj->base); |
@@ -437,7 +435,7 @@ i915_gem_dumb_create(struct drm_file *file, | |||
437 | args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64); | 435 | args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64); |
438 | args->size = args->pitch * args->height; | 436 | args->size = args->pitch * args->height; |
439 | return i915_gem_create(file, dev, | 437 | return i915_gem_create(file, dev, |
440 | args->size, true, &args->handle); | 438 | args->size, &args->handle); |
441 | } | 439 | } |
442 | 440 | ||
443 | /** | 441 | /** |
@@ -450,7 +448,7 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data, | |||
450 | struct drm_i915_gem_create *args = data; | 448 | struct drm_i915_gem_create *args = data; |
451 | 449 | ||
452 | return i915_gem_create(file, dev, | 450 | return i915_gem_create(file, dev, |
453 | args->size, false, &args->handle); | 451 | args->size, &args->handle); |
454 | } | 452 | } |
455 | 453 | ||
456 | static inline int | 454 | static inline int |
@@ -1840,10 +1838,10 @@ static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj) | |||
1840 | drm_gem_free_mmap_offset(&obj->base); | 1838 | drm_gem_free_mmap_offset(&obj->base); |
1841 | } | 1839 | } |
1842 | 1840 | ||
1843 | static int | 1841 | int |
1844 | i915_gem_mmap_gtt(struct drm_file *file, | 1842 | i915_gem_mmap_gtt(struct drm_file *file, |
1845 | struct drm_device *dev, | 1843 | struct drm_device *dev, |
1846 | uint32_t handle, bool dumb, | 1844 | uint32_t handle, |
1847 | uint64_t *offset) | 1845 | uint64_t *offset) |
1848 | { | 1846 | { |
1849 | struct drm_i915_private *dev_priv = dev->dev_private; | 1847 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -1860,13 +1858,6 @@ i915_gem_mmap_gtt(struct drm_file *file, | |||
1860 | goto unlock; | 1858 | goto unlock; |
1861 | } | 1859 | } |
1862 | 1860 | ||
1863 | /* | ||
1864 | * We don't allow dumb mmaps on objects created using another | ||
1865 | * interface. | ||
1866 | */ | ||
1867 | WARN_ONCE(dumb && !(obj->base.dumb || obj->base.import_attach), | ||
1868 | "Illegal dumb map of accelerated buffer.\n"); | ||
1869 | |||
1870 | if (obj->base.size > dev_priv->gtt.mappable_end) { | 1861 | if (obj->base.size > dev_priv->gtt.mappable_end) { |
1871 | ret = -E2BIG; | 1862 | ret = -E2BIG; |
1872 | goto out; | 1863 | goto out; |
@@ -1891,15 +1882,6 @@ unlock: | |||
1891 | return ret; | 1882 | return ret; |
1892 | } | 1883 | } |
1893 | 1884 | ||
1894 | int | ||
1895 | i915_gem_dumb_map_offset(struct drm_file *file, | ||
1896 | struct drm_device *dev, | ||
1897 | uint32_t handle, | ||
1898 | uint64_t *offset) | ||
1899 | { | ||
1900 | return i915_gem_mmap_gtt(file, dev, handle, true, offset); | ||
1901 | } | ||
1902 | |||
1903 | /** | 1885 | /** |
1904 | * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing | 1886 | * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing |
1905 | * @dev: DRM device | 1887 | * @dev: DRM device |
@@ -1921,7 +1903,7 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data, | |||
1921 | { | 1903 | { |
1922 | struct drm_i915_gem_mmap_gtt *args = data; | 1904 | struct drm_i915_gem_mmap_gtt *args = data; |
1923 | 1905 | ||
1924 | return i915_gem_mmap_gtt(file, dev, args->handle, false, &args->offset); | 1906 | return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset); |
1925 | } | 1907 | } |
1926 | 1908 | ||
1927 | static inline int | 1909 | static inline int |
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index d17ff435f276..d011ec82ef1e 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
@@ -473,7 +473,12 @@ mi_set_context(struct intel_engine_cs *ring, | |||
473 | u32 hw_flags) | 473 | u32 hw_flags) |
474 | { | 474 | { |
475 | u32 flags = hw_flags | MI_MM_SPACE_GTT; | 475 | u32 flags = hw_flags | MI_MM_SPACE_GTT; |
476 | int ret; | 476 | const int num_rings = |
477 | /* Use an extended w/a on ivb+ if signalling from other rings */ | ||
478 | i915_semaphore_is_enabled(ring->dev) ? | ||
479 | hweight32(INTEL_INFO(ring->dev)->ring_mask) - 1 : | ||
480 | 0; | ||
481 | int len, i, ret; | ||
477 | 482 | ||
478 | /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB | 483 | /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB |
479 | * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value | 484 | * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value |
@@ -490,15 +495,31 @@ mi_set_context(struct intel_engine_cs *ring, | |||
490 | if (!IS_HASWELL(ring->dev) && INTEL_INFO(ring->dev)->gen < 8) | 495 | if (!IS_HASWELL(ring->dev) && INTEL_INFO(ring->dev)->gen < 8) |
491 | flags |= (MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN); | 496 | flags |= (MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN); |
492 | 497 | ||
493 | ret = intel_ring_begin(ring, 6); | 498 | |
499 | len = 4; | ||
500 | if (INTEL_INFO(ring->dev)->gen >= 7) | ||
501 | len += 2 + (num_rings ? 4*num_rings + 2 : 0); | ||
502 | |||
503 | ret = intel_ring_begin(ring, len); | ||
494 | if (ret) | 504 | if (ret) |
495 | return ret; | 505 | return ret; |
496 | 506 | ||
497 | /* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */ | 507 | /* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */ |
498 | if (INTEL_INFO(ring->dev)->gen >= 7) | 508 | if (INTEL_INFO(ring->dev)->gen >= 7) { |
499 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_DISABLE); | 509 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_DISABLE); |
500 | else | 510 | if (num_rings) { |
501 | intel_ring_emit(ring, MI_NOOP); | 511 | struct intel_engine_cs *signaller; |
512 | |||
513 | intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings)); | ||
514 | for_each_ring(signaller, to_i915(ring->dev), i) { | ||
515 | if (signaller == ring) | ||
516 | continue; | ||
517 | |||
518 | intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); | ||
519 | intel_ring_emit(ring, _MASKED_BIT_ENABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); | ||
520 | } | ||
521 | } | ||
522 | } | ||
502 | 523 | ||
503 | intel_ring_emit(ring, MI_NOOP); | 524 | intel_ring_emit(ring, MI_NOOP); |
504 | intel_ring_emit(ring, MI_SET_CONTEXT); | 525 | intel_ring_emit(ring, MI_SET_CONTEXT); |
@@ -510,10 +531,21 @@ mi_set_context(struct intel_engine_cs *ring, | |||
510 | */ | 531 | */ |
511 | intel_ring_emit(ring, MI_NOOP); | 532 | intel_ring_emit(ring, MI_NOOP); |
512 | 533 | ||
513 | if (INTEL_INFO(ring->dev)->gen >= 7) | 534 | if (INTEL_INFO(ring->dev)->gen >= 7) { |
535 | if (num_rings) { | ||
536 | struct intel_engine_cs *signaller; | ||
537 | |||
538 | intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings)); | ||
539 | for_each_ring(signaller, to_i915(ring->dev), i) { | ||
540 | if (signaller == ring) | ||
541 | continue; | ||
542 | |||
543 | intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); | ||
544 | intel_ring_emit(ring, _MASKED_BIT_DISABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); | ||
545 | } | ||
546 | } | ||
514 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_ENABLE); | 547 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_ENABLE); |
515 | else | 548 | } |
516 | intel_ring_emit(ring, MI_NOOP); | ||
517 | 549 | ||
518 | intel_ring_advance(ring); | 550 | intel_ring_advance(ring); |
519 | 551 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index f06027ba3ee5..11738316394a 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -121,9 +121,6 @@ eb_lookup_vmas(struct eb_vmas *eb, | |||
121 | goto err; | 121 | goto err; |
122 | } | 122 | } |
123 | 123 | ||
124 | WARN_ONCE(obj->base.dumb, | ||
125 | "GPU use of dumb buffer is illegal.\n"); | ||
126 | |||
127 | drm_gem_object_reference(&obj->base); | 124 | drm_gem_object_reference(&obj->base); |
128 | list_add_tail(&obj->obj_exec_link, &objects); | 125 | list_add_tail(&obj->obj_exec_link, &objects); |
129 | } | 126 | } |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 981834b0f9b6..996c2931c499 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -281,10 +281,14 @@ void gen6_enable_rps_interrupts(struct drm_device *dev) | |||
281 | struct drm_i915_private *dev_priv = dev->dev_private; | 281 | struct drm_i915_private *dev_priv = dev->dev_private; |
282 | 282 | ||
283 | spin_lock_irq(&dev_priv->irq_lock); | 283 | spin_lock_irq(&dev_priv->irq_lock); |
284 | |||
284 | WARN_ON(dev_priv->rps.pm_iir); | 285 | WARN_ON(dev_priv->rps.pm_iir); |
285 | WARN_ON(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events); | 286 | WARN_ON(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events); |
286 | dev_priv->rps.interrupts_enabled = true; | 287 | dev_priv->rps.interrupts_enabled = true; |
288 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) | | ||
289 | dev_priv->pm_rps_events); | ||
287 | gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); | 290 | gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); |
291 | |||
288 | spin_unlock_irq(&dev_priv->irq_lock); | 292 | spin_unlock_irq(&dev_priv->irq_lock); |
289 | } | 293 | } |
290 | 294 | ||
@@ -3307,8 +3311,10 @@ static void gen5_gt_irq_postinstall(struct drm_device *dev) | |||
3307 | GEN5_IRQ_INIT(GT, dev_priv->gt_irq_mask, gt_irqs); | 3311 | GEN5_IRQ_INIT(GT, dev_priv->gt_irq_mask, gt_irqs); |
3308 | 3312 | ||
3309 | if (INTEL_INFO(dev)->gen >= 6) { | 3313 | if (INTEL_INFO(dev)->gen >= 6) { |
3310 | pm_irqs |= dev_priv->pm_rps_events; | 3314 | /* |
3311 | 3315 | * RPS interrupts will get enabled/disabled on demand when RPS | |
3316 | * itself is enabled/disabled. | ||
3317 | */ | ||
3312 | if (HAS_VEBOX(dev)) | 3318 | if (HAS_VEBOX(dev)) |
3313 | pm_irqs |= PM_VEBOX_USER_INTERRUPT; | 3319 | pm_irqs |= PM_VEBOX_USER_INTERRUPT; |
3314 | 3320 | ||
@@ -3520,7 +3526,11 @@ static void gen8_gt_irq_postinstall(struct drm_i915_private *dev_priv) | |||
3520 | dev_priv->pm_irq_mask = 0xffffffff; | 3526 | dev_priv->pm_irq_mask = 0xffffffff; |
3521 | GEN8_IRQ_INIT_NDX(GT, 0, ~gt_interrupts[0], gt_interrupts[0]); | 3527 | GEN8_IRQ_INIT_NDX(GT, 0, ~gt_interrupts[0], gt_interrupts[0]); |
3522 | GEN8_IRQ_INIT_NDX(GT, 1, ~gt_interrupts[1], gt_interrupts[1]); | 3528 | GEN8_IRQ_INIT_NDX(GT, 1, ~gt_interrupts[1], gt_interrupts[1]); |
3523 | GEN8_IRQ_INIT_NDX(GT, 2, dev_priv->pm_irq_mask, dev_priv->pm_rps_events); | 3529 | /* |
3530 | * RPS interrupts will get enabled/disabled on demand when RPS itself | ||
3531 | * is enabled/disabled. | ||
3532 | */ | ||
3533 | GEN8_IRQ_INIT_NDX(GT, 2, dev_priv->pm_irq_mask, 0); | ||
3524 | GEN8_IRQ_INIT_NDX(GT, 3, ~gt_interrupts[3], gt_interrupts[3]); | 3534 | GEN8_IRQ_INIT_NDX(GT, 3, ~gt_interrupts[3], gt_interrupts[3]); |
3525 | } | 3535 | } |
3526 | 3536 | ||
@@ -3609,7 +3619,7 @@ static void vlv_display_irq_uninstall(struct drm_i915_private *dev_priv) | |||
3609 | 3619 | ||
3610 | vlv_display_irq_reset(dev_priv); | 3620 | vlv_display_irq_reset(dev_priv); |
3611 | 3621 | ||
3612 | dev_priv->irq_mask = 0; | 3622 | dev_priv->irq_mask = ~0; |
3613 | } | 3623 | } |
3614 | 3624 | ||
3615 | static void valleyview_irq_uninstall(struct drm_device *dev) | 3625 | static void valleyview_irq_uninstall(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index eefdc238f70b..172de3b3433b 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -395,6 +395,7 @@ | |||
395 | #define PIPE_CONTROL_STORE_DATA_INDEX (1<<21) | 395 | #define PIPE_CONTROL_STORE_DATA_INDEX (1<<21) |
396 | #define PIPE_CONTROL_CS_STALL (1<<20) | 396 | #define PIPE_CONTROL_CS_STALL (1<<20) |
397 | #define PIPE_CONTROL_TLB_INVALIDATE (1<<18) | 397 | #define PIPE_CONTROL_TLB_INVALIDATE (1<<18) |
398 | #define PIPE_CONTROL_MEDIA_STATE_CLEAR (1<<16) | ||
398 | #define PIPE_CONTROL_QW_WRITE (1<<14) | 399 | #define PIPE_CONTROL_QW_WRITE (1<<14) |
399 | #define PIPE_CONTROL_POST_SYNC_OP_MASK (3<<14) | 400 | #define PIPE_CONTROL_POST_SYNC_OP_MASK (3<<14) |
400 | #define PIPE_CONTROL_DEPTH_STALL (1<<13) | 401 | #define PIPE_CONTROL_DEPTH_STALL (1<<13) |
@@ -1128,6 +1129,7 @@ enum punit_power_well { | |||
1128 | #define GEN6_VERSYNC (RING_SYNC_1(VEBOX_RING_BASE)) | 1129 | #define GEN6_VERSYNC (RING_SYNC_1(VEBOX_RING_BASE)) |
1129 | #define GEN6_VEVSYNC (RING_SYNC_2(VEBOX_RING_BASE)) | 1130 | #define GEN6_VEVSYNC (RING_SYNC_2(VEBOX_RING_BASE)) |
1130 | #define GEN6_NOSYNC 0 | 1131 | #define GEN6_NOSYNC 0 |
1132 | #define RING_PSMI_CTL(base) ((base)+0x50) | ||
1131 | #define RING_MAX_IDLE(base) ((base)+0x54) | 1133 | #define RING_MAX_IDLE(base) ((base)+0x54) |
1132 | #define RING_HWS_PGA(base) ((base)+0x80) | 1134 | #define RING_HWS_PGA(base) ((base)+0x80) |
1133 | #define RING_HWS_PGA_GEN6(base) ((base)+0x2080) | 1135 | #define RING_HWS_PGA_GEN6(base) ((base)+0x2080) |
@@ -1458,6 +1460,7 @@ enum punit_power_well { | |||
1458 | #define GEN6_BLITTER_FBC_NOTIFY (1<<3) | 1460 | #define GEN6_BLITTER_FBC_NOTIFY (1<<3) |
1459 | 1461 | ||
1460 | #define GEN6_RC_SLEEP_PSMI_CONTROL 0x2050 | 1462 | #define GEN6_RC_SLEEP_PSMI_CONTROL 0x2050 |
1463 | #define GEN6_PSMI_SLEEP_MSG_DISABLE (1 << 0) | ||
1461 | #define GEN8_RC_SEMA_IDLE_MSG_DISABLE (1 << 12) | 1464 | #define GEN8_RC_SEMA_IDLE_MSG_DISABLE (1 << 12) |
1462 | #define GEN8_FF_DOP_CLOCK_GATE_DISABLE (1<<10) | 1465 | #define GEN8_FF_DOP_CLOCK_GATE_DISABLE (1<<10) |
1463 | 1466 | ||
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 1f4b56e273c8..964b28e3c630 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -6191,6 +6191,20 @@ void intel_cleanup_gt_powersave(struct drm_device *dev) | |||
6191 | valleyview_cleanup_gt_powersave(dev); | 6191 | valleyview_cleanup_gt_powersave(dev); |
6192 | } | 6192 | } |
6193 | 6193 | ||
6194 | static void gen6_suspend_rps(struct drm_device *dev) | ||
6195 | { | ||
6196 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
6197 | |||
6198 | flush_delayed_work(&dev_priv->rps.delayed_resume_work); | ||
6199 | |||
6200 | /* | ||
6201 | * TODO: disable RPS interrupts on GEN9+ too once RPS support | ||
6202 | * is added for it. | ||
6203 | */ | ||
6204 | if (INTEL_INFO(dev)->gen < 9) | ||
6205 | gen6_disable_rps_interrupts(dev); | ||
6206 | } | ||
6207 | |||
6194 | /** | 6208 | /** |
6195 | * intel_suspend_gt_powersave - suspend PM work and helper threads | 6209 | * intel_suspend_gt_powersave - suspend PM work and helper threads |
6196 | * @dev: drm device | 6210 | * @dev: drm device |
@@ -6206,14 +6220,7 @@ void intel_suspend_gt_powersave(struct drm_device *dev) | |||
6206 | if (INTEL_INFO(dev)->gen < 6) | 6220 | if (INTEL_INFO(dev)->gen < 6) |
6207 | return; | 6221 | return; |
6208 | 6222 | ||
6209 | flush_delayed_work(&dev_priv->rps.delayed_resume_work); | 6223 | gen6_suspend_rps(dev); |
6210 | |||
6211 | /* | ||
6212 | * TODO: disable RPS interrupts on GEN9+ too once RPS support | ||
6213 | * is added for it. | ||
6214 | */ | ||
6215 | if (INTEL_INFO(dev)->gen < 9) | ||
6216 | gen6_disable_rps_interrupts(dev); | ||
6217 | 6224 | ||
6218 | /* Force GPU to min freq during suspend */ | 6225 | /* Force GPU to min freq during suspend */ |
6219 | gen6_rps_idle(dev_priv); | 6226 | gen6_rps_idle(dev_priv); |
@@ -6316,8 +6323,11 @@ void intel_reset_gt_powersave(struct drm_device *dev) | |||
6316 | { | 6323 | { |
6317 | struct drm_i915_private *dev_priv = dev->dev_private; | 6324 | struct drm_i915_private *dev_priv = dev->dev_private; |
6318 | 6325 | ||
6326 | if (INTEL_INFO(dev)->gen < 6) | ||
6327 | return; | ||
6328 | |||
6329 | gen6_suspend_rps(dev); | ||
6319 | dev_priv->rps.enabled = false; | 6330 | dev_priv->rps.enabled = false; |
6320 | intel_enable_gt_powersave(dev); | ||
6321 | } | 6331 | } |
6322 | 6332 | ||
6323 | static void ibx_init_clock_gating(struct drm_device *dev) | 6333 | static void ibx_init_clock_gating(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 9f445e9a75d1..c7bc93d28d84 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -362,12 +362,15 @@ gen7_render_ring_flush(struct intel_engine_cs *ring, | |||
362 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; | 362 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; |
363 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; | 363 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; |
364 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; | 364 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; |
365 | flags |= PIPE_CONTROL_MEDIA_STATE_CLEAR; | ||
365 | /* | 366 | /* |
366 | * TLB invalidate requires a post-sync write. | 367 | * TLB invalidate requires a post-sync write. |
367 | */ | 368 | */ |
368 | flags |= PIPE_CONTROL_QW_WRITE; | 369 | flags |= PIPE_CONTROL_QW_WRITE; |
369 | flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; | 370 | flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; |
370 | 371 | ||
372 | flags |= PIPE_CONTROL_STALL_AT_SCOREBOARD; | ||
373 | |||
371 | /* Workaround: we must issue a pipe_control with CS-stall bit | 374 | /* Workaround: we must issue a pipe_control with CS-stall bit |
372 | * set before a pipe_control command that has the state cache | 375 | * set before a pipe_control command that has the state cache |
373 | * invalidate bit set. */ | 376 | * invalidate bit set. */ |
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index aa873048308b..94a5bee69fe7 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c | |||
@@ -386,9 +386,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *gpu) | |||
386 | msm_gem_put_iova(gpu->memptrs_bo, gpu->base.id); | 386 | msm_gem_put_iova(gpu->memptrs_bo, gpu->base.id); |
387 | drm_gem_object_unreference(gpu->memptrs_bo); | 387 | drm_gem_object_unreference(gpu->memptrs_bo); |
388 | } | 388 | } |
389 | if (gpu->pm4) | 389 | release_firmware(gpu->pm4); |
390 | release_firmware(gpu->pm4); | 390 | release_firmware(gpu->pfp); |
391 | if (gpu->pfp) | ||
392 | release_firmware(gpu->pfp); | ||
393 | msm_gpu_cleanup(&gpu->base); | 391 | msm_gpu_cleanup(&gpu->base); |
394 | } | 392 | } |
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c index fbebb0405d76..b4e70e0e3cfa 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c | |||
@@ -141,6 +141,15 @@ static int hpd_enable(struct hdmi_connector *hdmi_connector) | |||
141 | uint32_t hpd_ctrl; | 141 | uint32_t hpd_ctrl; |
142 | int i, ret; | 142 | int i, ret; |
143 | 143 | ||
144 | for (i = 0; i < config->hpd_reg_cnt; i++) { | ||
145 | ret = regulator_enable(hdmi->hpd_regs[i]); | ||
146 | if (ret) { | ||
147 | dev_err(dev->dev, "failed to enable hpd regulator: %s (%d)\n", | ||
148 | config->hpd_reg_names[i], ret); | ||
149 | goto fail; | ||
150 | } | ||
151 | } | ||
152 | |||
144 | ret = gpio_config(hdmi, true); | 153 | ret = gpio_config(hdmi, true); |
145 | if (ret) { | 154 | if (ret) { |
146 | dev_err(dev->dev, "failed to configure GPIOs: %d\n", ret); | 155 | dev_err(dev->dev, "failed to configure GPIOs: %d\n", ret); |
@@ -164,15 +173,6 @@ static int hpd_enable(struct hdmi_connector *hdmi_connector) | |||
164 | } | 173 | } |
165 | } | 174 | } |
166 | 175 | ||
167 | for (i = 0; i < config->hpd_reg_cnt; i++) { | ||
168 | ret = regulator_enable(hdmi->hpd_regs[i]); | ||
169 | if (ret) { | ||
170 | dev_err(dev->dev, "failed to enable hpd regulator: %s (%d)\n", | ||
171 | config->hpd_reg_names[i], ret); | ||
172 | goto fail; | ||
173 | } | ||
174 | } | ||
175 | |||
176 | hdmi_set_mode(hdmi, false); | 176 | hdmi_set_mode(hdmi, false); |
177 | phy->funcs->reset(phy); | 177 | phy->funcs->reset(phy); |
178 | hdmi_set_mode(hdmi, true); | 178 | hdmi_set_mode(hdmi, true); |
@@ -200,7 +200,7 @@ fail: | |||
200 | return ret; | 200 | return ret; |
201 | } | 201 | } |
202 | 202 | ||
203 | static int hdp_disable(struct hdmi_connector *hdmi_connector) | 203 | static void hdp_disable(struct hdmi_connector *hdmi_connector) |
204 | { | 204 | { |
205 | struct hdmi *hdmi = hdmi_connector->hdmi; | 205 | struct hdmi *hdmi = hdmi_connector->hdmi; |
206 | const struct hdmi_platform_config *config = hdmi->config; | 206 | const struct hdmi_platform_config *config = hdmi->config; |
@@ -212,28 +212,19 @@ static int hdp_disable(struct hdmi_connector *hdmi_connector) | |||
212 | 212 | ||
213 | hdmi_set_mode(hdmi, false); | 213 | hdmi_set_mode(hdmi, false); |
214 | 214 | ||
215 | for (i = 0; i < config->hpd_reg_cnt; i++) { | ||
216 | ret = regulator_disable(hdmi->hpd_regs[i]); | ||
217 | if (ret) { | ||
218 | dev_err(dev->dev, "failed to disable hpd regulator: %s (%d)\n", | ||
219 | config->hpd_reg_names[i], ret); | ||
220 | goto fail; | ||
221 | } | ||
222 | } | ||
223 | |||
224 | for (i = 0; i < config->hpd_clk_cnt; i++) | 215 | for (i = 0; i < config->hpd_clk_cnt; i++) |
225 | clk_disable_unprepare(hdmi->hpd_clks[i]); | 216 | clk_disable_unprepare(hdmi->hpd_clks[i]); |
226 | 217 | ||
227 | ret = gpio_config(hdmi, false); | 218 | ret = gpio_config(hdmi, false); |
228 | if (ret) { | 219 | if (ret) |
229 | dev_err(dev->dev, "failed to unconfigure GPIOs: %d\n", ret); | 220 | dev_warn(dev->dev, "failed to unconfigure GPIOs: %d\n", ret); |
230 | goto fail; | ||
231 | } | ||
232 | |||
233 | return 0; | ||
234 | 221 | ||
235 | fail: | 222 | for (i = 0; i < config->hpd_reg_cnt; i++) { |
236 | return ret; | 223 | ret = regulator_disable(hdmi->hpd_regs[i]); |
224 | if (ret) | ||
225 | dev_warn(dev->dev, "failed to disable hpd regulator: %s (%d)\n", | ||
226 | config->hpd_reg_names[i], ret); | ||
227 | } | ||
237 | } | 228 | } |
238 | 229 | ||
239 | static void | 230 | static void |
@@ -260,11 +251,11 @@ void hdmi_connector_irq(struct drm_connector *connector) | |||
260 | (hpd_int_status & HDMI_HPD_INT_STATUS_INT)) { | 251 | (hpd_int_status & HDMI_HPD_INT_STATUS_INT)) { |
261 | bool detected = !!(hpd_int_status & HDMI_HPD_INT_STATUS_CABLE_DETECTED); | 252 | bool detected = !!(hpd_int_status & HDMI_HPD_INT_STATUS_CABLE_DETECTED); |
262 | 253 | ||
263 | DBG("status=%04x, ctrl=%04x", hpd_int_status, hpd_int_ctrl); | 254 | /* ack & disable (temporarily) HPD events: */ |
264 | |||
265 | /* ack the irq: */ | ||
266 | hdmi_write(hdmi, REG_HDMI_HPD_INT_CTRL, | 255 | hdmi_write(hdmi, REG_HDMI_HPD_INT_CTRL, |
267 | hpd_int_ctrl | HDMI_HPD_INT_CTRL_INT_ACK); | 256 | HDMI_HPD_INT_CTRL_INT_ACK); |
257 | |||
258 | DBG("status=%04x, ctrl=%04x", hpd_int_status, hpd_int_ctrl); | ||
268 | 259 | ||
269 | /* detect disconnect if we are connected or visa versa: */ | 260 | /* detect disconnect if we are connected or visa versa: */ |
270 | hpd_int_ctrl = HDMI_HPD_INT_CTRL_INT_EN; | 261 | hpd_int_ctrl = HDMI_HPD_INT_CTRL_INT_EN; |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c index a7672e100d8b..3449213f1e76 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | |||
@@ -331,17 +331,8 @@ static int mdp4_crtc_atomic_check(struct drm_crtc *crtc, | |||
331 | struct drm_crtc_state *state) | 331 | struct drm_crtc_state *state) |
332 | { | 332 | { |
333 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); | 333 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); |
334 | struct drm_device *dev = crtc->dev; | ||
335 | |||
336 | DBG("%s: check", mdp4_crtc->name); | 334 | DBG("%s: check", mdp4_crtc->name); |
337 | |||
338 | if (mdp4_crtc->event) { | ||
339 | dev_err(dev->dev, "already pending flip!\n"); | ||
340 | return -EBUSY; | ||
341 | } | ||
342 | |||
343 | // TODO anything else to check? | 335 | // TODO anything else to check? |
344 | |||
345 | return 0; | 336 | return 0; |
346 | } | 337 | } |
347 | 338 | ||
@@ -357,7 +348,7 @@ static void mdp4_crtc_atomic_flush(struct drm_crtc *crtc) | |||
357 | struct drm_device *dev = crtc->dev; | 348 | struct drm_device *dev = crtc->dev; |
358 | unsigned long flags; | 349 | unsigned long flags; |
359 | 350 | ||
360 | DBG("%s: flush", mdp4_crtc->name); | 351 | DBG("%s: event: %p", mdp4_crtc->name, crtc->state->event); |
361 | 352 | ||
362 | WARN_ON(mdp4_crtc->event); | 353 | WARN_ON(mdp4_crtc->event); |
363 | 354 | ||
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c index 0e9a2e3a82d7..f021f960a8a2 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | |||
@@ -303,11 +303,6 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc, | |||
303 | 303 | ||
304 | DBG("%s: check", mdp5_crtc->name); | 304 | DBG("%s: check", mdp5_crtc->name); |
305 | 305 | ||
306 | if (mdp5_crtc->event) { | ||
307 | dev_err(dev->dev, "already pending flip!\n"); | ||
308 | return -EBUSY; | ||
309 | } | ||
310 | |||
311 | /* request a free CTL, if none is already allocated for this CRTC */ | 306 | /* request a free CTL, if none is already allocated for this CRTC */ |
312 | if (state->enable && !mdp5_crtc->ctl) { | 307 | if (state->enable && !mdp5_crtc->ctl) { |
313 | mdp5_crtc->ctl = mdp5_ctlm_request(mdp5_kms->ctlm, crtc); | 308 | mdp5_crtc->ctl = mdp5_ctlm_request(mdp5_kms->ctlm, crtc); |
@@ -364,7 +359,7 @@ static void mdp5_crtc_atomic_flush(struct drm_crtc *crtc) | |||
364 | struct drm_device *dev = crtc->dev; | 359 | struct drm_device *dev = crtc->dev; |
365 | unsigned long flags; | 360 | unsigned long flags; |
366 | 361 | ||
367 | DBG("%s: flush", mdp5_crtc->name); | 362 | DBG("%s: event: %p", mdp5_crtc->name, crtc->state->event); |
368 | 363 | ||
369 | WARN_ON(mdp5_crtc->event); | 364 | WARN_ON(mdp5_crtc->event); |
370 | 365 | ||
@@ -460,10 +455,7 @@ void mdp5_crtc_set_intf(struct drm_crtc *crtc, int intf, | |||
460 | /* now that we know what irq's we want: */ | 455 | /* now that we know what irq's we want: */ |
461 | mdp5_crtc->err.irqmask = intf2err(intf); | 456 | mdp5_crtc->err.irqmask = intf2err(intf); |
462 | mdp5_crtc->vblank.irqmask = intf2vblank(intf); | 457 | mdp5_crtc->vblank.irqmask = intf2vblank(intf); |
463 | 458 | mdp_irq_update(&mdp5_kms->base); | |
464 | /* when called from modeset_init(), skip the rest until later: */ | ||
465 | if (!mdp5_kms) | ||
466 | return; | ||
467 | 459 | ||
468 | spin_lock_irqsave(&mdp5_kms->resource_lock, flags); | 460 | spin_lock_irqsave(&mdp5_kms->resource_lock, flags); |
469 | intf_sel = mdp5_read(mdp5_kms, REG_MDP5_DISP_INTF_SEL); | 461 | intf_sel = mdp5_read(mdp5_kms, REG_MDP5_DISP_INTF_SEL); |
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c index a11f1b80c488..9f01a4f21af2 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | |||
@@ -216,17 +216,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) | |||
216 | goto fail; | 216 | goto fail; |
217 | } | 217 | } |
218 | 218 | ||
219 | /* NOTE: the vsync and error irq's are actually associated with | 219 | encoder->possible_crtcs = (1 << priv->num_crtcs) - 1;; |
220 | * the INTF/encoder.. the easiest way to deal with this (ie. what | ||
221 | * we do now) is assume a fixed relationship between crtc's and | ||
222 | * encoders. I'm not sure if there is ever a need to more freely | ||
223 | * assign crtcs to encoders, but if there is then we need to take | ||
224 | * care of error and vblank irq's that the crtc has registered, | ||
225 | * and also update user-requested vblank_mask. | ||
226 | */ | ||
227 | encoder->possible_crtcs = BIT(0); | ||
228 | mdp5_crtc_set_intf(priv->crtcs[0], 3, INTF_HDMI); | ||
229 | |||
230 | priv->encoders[priv->num_encoders++] = encoder; | 220 | priv->encoders[priv->num_encoders++] = encoder; |
231 | 221 | ||
232 | /* Construct bridge/connector for HDMI: */ | 222 | /* Construct bridge/connector for HDMI: */ |
diff --git a/drivers/gpu/drm/msm/mdp/mdp_kms.c b/drivers/gpu/drm/msm/mdp/mdp_kms.c index 03455b64a245..2a731722d840 100644 --- a/drivers/gpu/drm/msm/mdp/mdp_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp_kms.c | |||
@@ -42,7 +42,10 @@ static void update_irq(struct mdp_kms *mdp_kms) | |||
42 | mdp_kms->funcs->set_irqmask(mdp_kms, irqmask); | 42 | mdp_kms->funcs->set_irqmask(mdp_kms, irqmask); |
43 | } | 43 | } |
44 | 44 | ||
45 | static void update_irq_unlocked(struct mdp_kms *mdp_kms) | 45 | /* if an mdp_irq's irqmask has changed, such as when mdp5 crtc<->encoder |
46 | * link changes, this must be called to figure out the new global irqmask | ||
47 | */ | ||
48 | void mdp_irq_update(struct mdp_kms *mdp_kms) | ||
46 | { | 49 | { |
47 | unsigned long flags; | 50 | unsigned long flags; |
48 | spin_lock_irqsave(&list_lock, flags); | 51 | spin_lock_irqsave(&list_lock, flags); |
@@ -122,7 +125,7 @@ void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq) | |||
122 | spin_unlock_irqrestore(&list_lock, flags); | 125 | spin_unlock_irqrestore(&list_lock, flags); |
123 | 126 | ||
124 | if (needs_update) | 127 | if (needs_update) |
125 | update_irq_unlocked(mdp_kms); | 128 | mdp_irq_update(mdp_kms); |
126 | } | 129 | } |
127 | 130 | ||
128 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq) | 131 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq) |
@@ -141,5 +144,5 @@ void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq) | |||
141 | spin_unlock_irqrestore(&list_lock, flags); | 144 | spin_unlock_irqrestore(&list_lock, flags); |
142 | 145 | ||
143 | if (needs_update) | 146 | if (needs_update) |
144 | update_irq_unlocked(mdp_kms); | 147 | mdp_irq_update(mdp_kms); |
145 | } | 148 | } |
diff --git a/drivers/gpu/drm/msm/mdp/mdp_kms.h b/drivers/gpu/drm/msm/mdp/mdp_kms.h index 99557b5ad4fd..b268ce95d394 100644 --- a/drivers/gpu/drm/msm/mdp/mdp_kms.h +++ b/drivers/gpu/drm/msm/mdp/mdp_kms.h | |||
@@ -75,7 +75,7 @@ void mdp_update_vblank_mask(struct mdp_kms *mdp_kms, uint32_t mask, bool enable) | |||
75 | void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask); | 75 | void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask); |
76 | void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq); | 76 | void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq); |
77 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq); | 77 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq); |
78 | 78 | void mdp_irq_update(struct mdp_kms *mdp_kms); | |
79 | 79 | ||
80 | /* | 80 | /* |
81 | * pixel format helpers: | 81 | * pixel format helpers: |
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c index f0de412e13dc..191968256c58 100644 --- a/drivers/gpu/drm/msm/msm_atomic.c +++ b/drivers/gpu/drm/msm/msm_atomic.c | |||
@@ -23,10 +23,41 @@ struct msm_commit { | |||
23 | struct drm_atomic_state *state; | 23 | struct drm_atomic_state *state; |
24 | uint32_t fence; | 24 | uint32_t fence; |
25 | struct msm_fence_cb fence_cb; | 25 | struct msm_fence_cb fence_cb; |
26 | uint32_t crtc_mask; | ||
26 | }; | 27 | }; |
27 | 28 | ||
28 | static void fence_cb(struct msm_fence_cb *cb); | 29 | static void fence_cb(struct msm_fence_cb *cb); |
29 | 30 | ||
31 | /* block until specified crtcs are no longer pending update, and | ||
32 | * atomically mark them as pending update | ||
33 | */ | ||
34 | static int start_atomic(struct msm_drm_private *priv, uint32_t crtc_mask) | ||
35 | { | ||
36 | int ret; | ||
37 | |||
38 | spin_lock(&priv->pending_crtcs_event.lock); | ||
39 | ret = wait_event_interruptible_locked(priv->pending_crtcs_event, | ||
40 | !(priv->pending_crtcs & crtc_mask)); | ||
41 | if (ret == 0) { | ||
42 | DBG("start: %08x", crtc_mask); | ||
43 | priv->pending_crtcs |= crtc_mask; | ||
44 | } | ||
45 | spin_unlock(&priv->pending_crtcs_event.lock); | ||
46 | |||
47 | return ret; | ||
48 | } | ||
49 | |||
50 | /* clear specified crtcs (no longer pending update) | ||
51 | */ | ||
52 | static void end_atomic(struct msm_drm_private *priv, uint32_t crtc_mask) | ||
53 | { | ||
54 | spin_lock(&priv->pending_crtcs_event.lock); | ||
55 | DBG("end: %08x", crtc_mask); | ||
56 | priv->pending_crtcs &= ~crtc_mask; | ||
57 | wake_up_all_locked(&priv->pending_crtcs_event); | ||
58 | spin_unlock(&priv->pending_crtcs_event.lock); | ||
59 | } | ||
60 | |||
30 | static struct msm_commit *new_commit(struct drm_atomic_state *state) | 61 | static struct msm_commit *new_commit(struct drm_atomic_state *state) |
31 | { | 62 | { |
32 | struct msm_commit *c = kzalloc(sizeof(*c), GFP_KERNEL); | 63 | struct msm_commit *c = kzalloc(sizeof(*c), GFP_KERNEL); |
@@ -58,12 +89,27 @@ static void complete_commit(struct msm_commit *c) | |||
58 | 89 | ||
59 | drm_atomic_helper_commit_post_planes(dev, state); | 90 | drm_atomic_helper_commit_post_planes(dev, state); |
60 | 91 | ||
92 | /* NOTE: _wait_for_vblanks() only waits for vblank on | ||
93 | * enabled CRTCs. So we end up faulting when disabling | ||
94 | * due to (potentially) unref'ing the outgoing fb's | ||
95 | * before the vblank when the disable has latched. | ||
96 | * | ||
97 | * But if it did wait on disabled (or newly disabled) | ||
98 | * CRTCs, that would be racy (ie. we could have missed | ||
99 | * the irq. We need some way to poll for pipe shut | ||
100 | * down. Or just live with occasionally hitting the | ||
101 | * timeout in the CRTC disable path (which really should | ||
102 | * not be critical path) | ||
103 | */ | ||
104 | |||
61 | drm_atomic_helper_wait_for_vblanks(dev, state); | 105 | drm_atomic_helper_wait_for_vblanks(dev, state); |
62 | 106 | ||
63 | drm_atomic_helper_cleanup_planes(dev, state); | 107 | drm_atomic_helper_cleanup_planes(dev, state); |
64 | 108 | ||
65 | drm_atomic_state_free(state); | 109 | drm_atomic_state_free(state); |
66 | 110 | ||
111 | end_atomic(dev->dev_private, c->crtc_mask); | ||
112 | |||
67 | kfree(c); | 113 | kfree(c); |
68 | } | 114 | } |
69 | 115 | ||
@@ -97,8 +143,9 @@ static void add_fb(struct msm_commit *c, struct drm_framebuffer *fb) | |||
97 | int msm_atomic_commit(struct drm_device *dev, | 143 | int msm_atomic_commit(struct drm_device *dev, |
98 | struct drm_atomic_state *state, bool async) | 144 | struct drm_atomic_state *state, bool async) |
99 | { | 145 | { |
100 | struct msm_commit *c; | ||
101 | int nplanes = dev->mode_config.num_total_plane; | 146 | int nplanes = dev->mode_config.num_total_plane; |
147 | int ncrtcs = dev->mode_config.num_crtc; | ||
148 | struct msm_commit *c; | ||
102 | int i, ret; | 149 | int i, ret; |
103 | 150 | ||
104 | ret = drm_atomic_helper_prepare_planes(dev, state); | 151 | ret = drm_atomic_helper_prepare_planes(dev, state); |
@@ -106,6 +153,18 @@ int msm_atomic_commit(struct drm_device *dev, | |||
106 | return ret; | 153 | return ret; |
107 | 154 | ||
108 | c = new_commit(state); | 155 | c = new_commit(state); |
156 | if (!c) | ||
157 | return -ENOMEM; | ||
158 | |||
159 | /* | ||
160 | * Figure out what crtcs we have: | ||
161 | */ | ||
162 | for (i = 0; i < ncrtcs; i++) { | ||
163 | struct drm_crtc *crtc = state->crtcs[i]; | ||
164 | if (!crtc) | ||
165 | continue; | ||
166 | c->crtc_mask |= (1 << drm_crtc_index(crtc)); | ||
167 | } | ||
109 | 168 | ||
110 | /* | 169 | /* |
111 | * Figure out what fence to wait for: | 170 | * Figure out what fence to wait for: |
@@ -122,6 +181,14 @@ int msm_atomic_commit(struct drm_device *dev, | |||
122 | } | 181 | } |
123 | 182 | ||
124 | /* | 183 | /* |
184 | * Wait for pending updates on any of the same crtc's and then | ||
185 | * mark our set of crtc's as busy: | ||
186 | */ | ||
187 | ret = start_atomic(dev->dev_private, c->crtc_mask); | ||
188 | if (ret) | ||
189 | return ret; | ||
190 | |||
191 | /* | ||
125 | * This is the point of no return - everything below never fails except | 192 | * This is the point of no return - everything below never fails except |
126 | * when the hw goes bonghits. Which means we can commit the new state on | 193 | * when the hw goes bonghits. Which means we can commit the new state on |
127 | * the software side now. | 194 | * the software side now. |
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index c795217e1bfc..9a61546a0b05 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c | |||
@@ -193,6 +193,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags) | |||
193 | 193 | ||
194 | priv->wq = alloc_ordered_workqueue("msm", 0); | 194 | priv->wq = alloc_ordered_workqueue("msm", 0); |
195 | init_waitqueue_head(&priv->fence_event); | 195 | init_waitqueue_head(&priv->fence_event); |
196 | init_waitqueue_head(&priv->pending_crtcs_event); | ||
196 | 197 | ||
197 | INIT_LIST_HEAD(&priv->inactive_list); | 198 | INIT_LIST_HEAD(&priv->inactive_list); |
198 | INIT_LIST_HEAD(&priv->fence_cbs); | 199 | INIT_LIST_HEAD(&priv->fence_cbs); |
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index 136303818436..b69ef2d5a26c 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h | |||
@@ -96,6 +96,10 @@ struct msm_drm_private { | |||
96 | /* callbacks deferred until bo is inactive: */ | 96 | /* callbacks deferred until bo is inactive: */ |
97 | struct list_head fence_cbs; | 97 | struct list_head fence_cbs; |
98 | 98 | ||
99 | /* crtcs pending async atomic updates: */ | ||
100 | uint32_t pending_crtcs; | ||
101 | wait_queue_head_t pending_crtcs_event; | ||
102 | |||
99 | /* registered MMUs: */ | 103 | /* registered MMUs: */ |
100 | unsigned int num_mmus; | 104 | unsigned int num_mmus; |
101 | struct msm_mmu *mmus[NUM_DOMAINS]; | 105 | struct msm_mmu *mmus[NUM_DOMAINS]; |
diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c index 94d55e526b4e..1f3af13ccede 100644 --- a/drivers/gpu/drm/msm/msm_fbdev.c +++ b/drivers/gpu/drm/msm/msm_fbdev.c | |||
@@ -190,8 +190,7 @@ fail_unlock: | |||
190 | fail: | 190 | fail: |
191 | 191 | ||
192 | if (ret) { | 192 | if (ret) { |
193 | if (fbi) | 193 | framebuffer_release(fbi); |
194 | framebuffer_release(fbi); | ||
195 | if (fb) { | 194 | if (fb) { |
196 | drm_framebuffer_unregister_private(fb); | 195 | drm_framebuffer_unregister_private(fb); |
197 | drm_framebuffer_remove(fb); | 196 | drm_framebuffer_remove(fb); |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 4a6f0e49d5b5..49dea4fb55ac 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
@@ -535,8 +535,7 @@ void msm_gem_free_object(struct drm_gem_object *obj) | |||
535 | drm_free_large(msm_obj->pages); | 535 | drm_free_large(msm_obj->pages); |
536 | 536 | ||
537 | } else { | 537 | } else { |
538 | if (msm_obj->vaddr) | 538 | vunmap(msm_obj->vaddr); |
539 | vunmap(msm_obj->vaddr); | ||
540 | put_pages(obj); | 539 | put_pages(obj); |
541 | } | 540 | } |
542 | 541 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 5d93902a91ab..f8042433752b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
@@ -876,7 +876,6 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev, | |||
876 | if (ret) | 876 | if (ret) |
877 | return ret; | 877 | return ret; |
878 | 878 | ||
879 | bo->gem.dumb = true; | ||
880 | ret = drm_gem_handle_create(file_priv, &bo->gem, &args->handle); | 879 | ret = drm_gem_handle_create(file_priv, &bo->gem, &args->handle); |
881 | drm_gem_object_unreference_unlocked(&bo->gem); | 880 | drm_gem_object_unreference_unlocked(&bo->gem); |
882 | return ret; | 881 | return ret; |
@@ -892,14 +891,6 @@ nouveau_display_dumb_map_offset(struct drm_file *file_priv, | |||
892 | gem = drm_gem_object_lookup(dev, file_priv, handle); | 891 | gem = drm_gem_object_lookup(dev, file_priv, handle); |
893 | if (gem) { | 892 | if (gem) { |
894 | struct nouveau_bo *bo = nouveau_gem_object(gem); | 893 | struct nouveau_bo *bo = nouveau_gem_object(gem); |
895 | |||
896 | /* | ||
897 | * We don't allow dumb mmaps on objects created using another | ||
898 | * interface. | ||
899 | */ | ||
900 | WARN_ONCE(!(gem->dumb || gem->import_attach), | ||
901 | "Illegal dumb map of accelerated buffer.\n"); | ||
902 | |||
903 | *poffset = drm_vma_node_offset_addr(&bo->bo.vma_node); | 894 | *poffset = drm_vma_node_offset_addr(&bo->bo.vma_node); |
904 | drm_gem_object_unreference_unlocked(gem); | 895 | drm_gem_object_unreference_unlocked(gem); |
905 | return 0; | 896 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 28d51a22a4bf..42c34babc2e5 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
@@ -444,9 +444,6 @@ validate_list(struct nouveau_channel *chan, struct nouveau_cli *cli, | |||
444 | list_for_each_entry(nvbo, list, entry) { | 444 | list_for_each_entry(nvbo, list, entry) { |
445 | struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; | 445 | struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; |
446 | 446 | ||
447 | WARN_ONCE(nvbo->gem.dumb, | ||
448 | "GPU use of dumb buffer is illegal.\n"); | ||
449 | |||
450 | ret = nouveau_gem_set_domain(&nvbo->gem, b->read_domains, | 447 | ret = nouveau_gem_set_domain(&nvbo->gem, b->read_domains, |
451 | b->write_domains, | 448 | b->write_domains, |
452 | b->valid_domains); | 449 | b->valid_domains); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index 753a6def61e7..3d1cfcb96b6b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "nouveau_ttm.h" | 28 | #include "nouveau_ttm.h" |
29 | #include "nouveau_gem.h" | 29 | #include "nouveau_gem.h" |
30 | 30 | ||
31 | #include "drm_legacy.h" | ||
31 | static int | 32 | static int |
32 | nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long psize) | 33 | nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long psize) |
33 | { | 34 | { |
@@ -281,7 +282,7 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
281 | struct nouveau_drm *drm = nouveau_drm(file_priv->minor->dev); | 282 | struct nouveau_drm *drm = nouveau_drm(file_priv->minor->dev); |
282 | 283 | ||
283 | if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) | 284 | if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) |
284 | return -EINVAL; | 285 | return drm_legacy_mmap(filp, vma); |
285 | 286 | ||
286 | return ttm_bo_mmap(filp, vma, &drm->ttm.bdev); | 287 | return ttm_bo_mmap(filp, vma, &drm->ttm.bdev); |
287 | } | 288 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index fe48f229043e..a46f73737994 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -394,10 +394,9 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data, | |||
394 | return r; | 394 | return r; |
395 | } | 395 | } |
396 | 396 | ||
397 | static int radeon_mode_mmap(struct drm_file *filp, | 397 | int radeon_mode_dumb_mmap(struct drm_file *filp, |
398 | struct drm_device *dev, | 398 | struct drm_device *dev, |
399 | uint32_t handle, bool dumb, | 399 | uint32_t handle, uint64_t *offset_p) |
400 | uint64_t *offset_p) | ||
401 | { | 400 | { |
402 | struct drm_gem_object *gobj; | 401 | struct drm_gem_object *gobj; |
403 | struct radeon_bo *robj; | 402 | struct radeon_bo *robj; |
@@ -406,14 +405,6 @@ static int radeon_mode_mmap(struct drm_file *filp, | |||
406 | if (gobj == NULL) { | 405 | if (gobj == NULL) { |
407 | return -ENOENT; | 406 | return -ENOENT; |
408 | } | 407 | } |
409 | |||
410 | /* | ||
411 | * We don't allow dumb mmaps on objects created using another | ||
412 | * interface. | ||
413 | */ | ||
414 | WARN_ONCE(dumb && !(gobj->dumb || gobj->import_attach), | ||
415 | "Illegal dumb map of GPU buffer.\n"); | ||
416 | |||
417 | robj = gem_to_radeon_bo(gobj); | 408 | robj = gem_to_radeon_bo(gobj); |
418 | if (radeon_ttm_tt_has_userptr(robj->tbo.ttm)) { | 409 | if (radeon_ttm_tt_has_userptr(robj->tbo.ttm)) { |
419 | drm_gem_object_unreference_unlocked(gobj); | 410 | drm_gem_object_unreference_unlocked(gobj); |
@@ -424,20 +415,12 @@ static int radeon_mode_mmap(struct drm_file *filp, | |||
424 | return 0; | 415 | return 0; |
425 | } | 416 | } |
426 | 417 | ||
427 | int radeon_mode_dumb_mmap(struct drm_file *filp, | ||
428 | struct drm_device *dev, | ||
429 | uint32_t handle, uint64_t *offset_p) | ||
430 | { | ||
431 | return radeon_mode_mmap(filp, dev, handle, true, offset_p); | ||
432 | } | ||
433 | |||
434 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, | 418 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, |
435 | struct drm_file *filp) | 419 | struct drm_file *filp) |
436 | { | 420 | { |
437 | struct drm_radeon_gem_mmap *args = data; | 421 | struct drm_radeon_gem_mmap *args = data; |
438 | 422 | ||
439 | return radeon_mode_mmap(filp, dev, args->handle, false, | 423 | return radeon_mode_dumb_mmap(filp, dev, args->handle, &args->addr_ptr); |
440 | &args->addr_ptr); | ||
441 | } | 424 | } |
442 | 425 | ||
443 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | 426 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, |
@@ -763,7 +746,6 @@ int radeon_mode_dumb_create(struct drm_file *file_priv, | |||
763 | return -ENOMEM; | 746 | return -ENOMEM; |
764 | 747 | ||
765 | r = drm_gem_handle_create(file_priv, gobj, &handle); | 748 | r = drm_gem_handle_create(file_priv, gobj, &handle); |
766 | gobj->dumb = true; | ||
767 | /* drop reference from allocate - handle holds it now */ | 749 | /* drop reference from allocate - handle holds it now */ |
768 | drm_gem_object_unreference_unlocked(gobj); | 750 | drm_gem_object_unreference_unlocked(gobj); |
769 | if (r) { | 751 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c index 065d02068ec3..242fd8b1b221 100644 --- a/drivers/gpu/drm/radeon/radeon_kfd.c +++ b/drivers/gpu/drm/radeon/radeon_kfd.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include "cikd.h" | 28 | #include "cikd.h" |
29 | #include "cik_reg.h" | 29 | #include "cik_reg.h" |
30 | #include "radeon_kfd.h" | 30 | #include "radeon_kfd.h" |
31 | #include "radeon_ucode.h" | ||
32 | #include <linux/firmware.h> | ||
31 | 33 | ||
32 | #define CIK_PIPE_PER_MEC (4) | 34 | #define CIK_PIPE_PER_MEC (4) |
33 | 35 | ||
@@ -49,6 +51,7 @@ static uint64_t get_vmem_size(struct kgd_dev *kgd); | |||
49 | static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd); | 51 | static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd); |
50 | 52 | ||
51 | static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd); | 53 | static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd); |
54 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); | ||
52 | 55 | ||
53 | /* | 56 | /* |
54 | * Register access functions | 57 | * Register access functions |
@@ -91,6 +94,7 @@ static const struct kfd2kgd_calls kfd2kgd = { | |||
91 | .hqd_load = kgd_hqd_load, | 94 | .hqd_load = kgd_hqd_load, |
92 | .hqd_is_occupies = kgd_hqd_is_occupies, | 95 | .hqd_is_occupies = kgd_hqd_is_occupies, |
93 | .hqd_destroy = kgd_hqd_destroy, | 96 | .hqd_destroy = kgd_hqd_destroy, |
97 | .get_fw_version = get_fw_version | ||
94 | }; | 98 | }; |
95 | 99 | ||
96 | static const struct kgd2kfd_calls *kgd2kfd; | 100 | static const struct kgd2kfd_calls *kgd2kfd; |
@@ -561,3 +565,52 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, | |||
561 | release_queue(kgd); | 565 | release_queue(kgd); |
562 | return 0; | 566 | return 0; |
563 | } | 567 | } |
568 | |||
569 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) | ||
570 | { | ||
571 | struct radeon_device *rdev = (struct radeon_device *) kgd; | ||
572 | const union radeon_firmware_header *hdr; | ||
573 | |||
574 | BUG_ON(kgd == NULL || rdev->mec_fw == NULL); | ||
575 | |||
576 | switch (type) { | ||
577 | case KGD_ENGINE_PFP: | ||
578 | hdr = (const union radeon_firmware_header *) rdev->pfp_fw->data; | ||
579 | break; | ||
580 | |||
581 | case KGD_ENGINE_ME: | ||
582 | hdr = (const union radeon_firmware_header *) rdev->me_fw->data; | ||
583 | break; | ||
584 | |||
585 | case KGD_ENGINE_CE: | ||
586 | hdr = (const union radeon_firmware_header *) rdev->ce_fw->data; | ||
587 | break; | ||
588 | |||
589 | case KGD_ENGINE_MEC1: | ||
590 | hdr = (const union radeon_firmware_header *) rdev->mec_fw->data; | ||
591 | break; | ||
592 | |||
593 | case KGD_ENGINE_MEC2: | ||
594 | hdr = (const union radeon_firmware_header *) | ||
595 | rdev->mec2_fw->data; | ||
596 | break; | ||
597 | |||
598 | case KGD_ENGINE_RLC: | ||
599 | hdr = (const union radeon_firmware_header *) rdev->rlc_fw->data; | ||
600 | break; | ||
601 | |||
602 | case KGD_ENGINE_SDMA: | ||
603 | hdr = (const union radeon_firmware_header *) | ||
604 | rdev->sdma_fw->data; | ||
605 | break; | ||
606 | |||
607 | default: | ||
608 | return 0; | ||
609 | } | ||
610 | |||
611 | if (hdr == NULL) | ||
612 | return 0; | ||
613 | |||
614 | /* Only 12 bit in use*/ | ||
615 | return hdr->common.ucode_version; | ||
616 | } | ||
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 7d68223eb469..86fc56434b28 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
@@ -529,9 +529,6 @@ int radeon_bo_list_validate(struct radeon_device *rdev, | |||
529 | u32 current_domain = | 529 | u32 current_domain = |
530 | radeon_mem_type_to_domain(bo->tbo.mem.mem_type); | 530 | radeon_mem_type_to_domain(bo->tbo.mem.mem_type); |
531 | 531 | ||
532 | WARN_ONCE(bo->gem_base.dumb, | ||
533 | "GPU use of dumb buffer is illegal.\n"); | ||
534 | |||
535 | /* Check if this buffer will be moved and don't move it | 532 | /* Check if this buffer will be moved and don't move it |
536 | * if we have moved too many buffers for this IB already. | 533 | * if we have moved too many buffers for this IB already. |
537 | * | 534 | * |
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 3367960286a6..978993fa3a36 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c | |||
@@ -168,7 +168,7 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
168 | const struct tegra_dc_window *window) | 168 | const struct tegra_dc_window *window) |
169 | { | 169 | { |
170 | unsigned h_offset, v_offset, h_size, v_size, h_dda, v_dda, bpp; | 170 | unsigned h_offset, v_offset, h_size, v_size, h_dda, v_dda, bpp; |
171 | unsigned long value; | 171 | unsigned long value, flags; |
172 | bool yuv, planar; | 172 | bool yuv, planar; |
173 | 173 | ||
174 | /* | 174 | /* |
@@ -181,6 +181,8 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
181 | else | 181 | else |
182 | bpp = planar ? 1 : 2; | 182 | bpp = planar ? 1 : 2; |
183 | 183 | ||
184 | spin_lock_irqsave(&dc->lock, flags); | ||
185 | |||
184 | value = WINDOW_A_SELECT << index; | 186 | value = WINDOW_A_SELECT << index; |
185 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); | 187 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); |
186 | 188 | ||
@@ -273,6 +275,7 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
273 | 275 | ||
274 | case TEGRA_BO_TILING_MODE_BLOCK: | 276 | case TEGRA_BO_TILING_MODE_BLOCK: |
275 | DRM_ERROR("hardware doesn't support block linear mode\n"); | 277 | DRM_ERROR("hardware doesn't support block linear mode\n"); |
278 | spin_unlock_irqrestore(&dc->lock, flags); | ||
276 | return -EINVAL; | 279 | return -EINVAL; |
277 | } | 280 | } |
278 | 281 | ||
@@ -331,6 +334,8 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
331 | 334 | ||
332 | tegra_dc_window_commit(dc, index); | 335 | tegra_dc_window_commit(dc, index); |
333 | 336 | ||
337 | spin_unlock_irqrestore(&dc->lock, flags); | ||
338 | |||
334 | return 0; | 339 | return 0; |
335 | } | 340 | } |
336 | 341 | ||
@@ -338,11 +343,14 @@ static int tegra_window_plane_disable(struct drm_plane *plane) | |||
338 | { | 343 | { |
339 | struct tegra_dc *dc = to_tegra_dc(plane->crtc); | 344 | struct tegra_dc *dc = to_tegra_dc(plane->crtc); |
340 | struct tegra_plane *p = to_tegra_plane(plane); | 345 | struct tegra_plane *p = to_tegra_plane(plane); |
346 | unsigned long flags; | ||
341 | u32 value; | 347 | u32 value; |
342 | 348 | ||
343 | if (!plane->crtc) | 349 | if (!plane->crtc) |
344 | return 0; | 350 | return 0; |
345 | 351 | ||
352 | spin_lock_irqsave(&dc->lock, flags); | ||
353 | |||
346 | value = WINDOW_A_SELECT << p->index; | 354 | value = WINDOW_A_SELECT << p->index; |
347 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); | 355 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); |
348 | 356 | ||
@@ -352,6 +360,8 @@ static int tegra_window_plane_disable(struct drm_plane *plane) | |||
352 | 360 | ||
353 | tegra_dc_window_commit(dc, p->index); | 361 | tegra_dc_window_commit(dc, p->index); |
354 | 362 | ||
363 | spin_unlock_irqrestore(&dc->lock, flags); | ||
364 | |||
355 | return 0; | 365 | return 0; |
356 | } | 366 | } |
357 | 367 | ||
@@ -699,14 +709,16 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y, | |||
699 | struct tegra_bo *bo = tegra_fb_get_plane(fb, 0); | 709 | struct tegra_bo *bo = tegra_fb_get_plane(fb, 0); |
700 | unsigned int h_offset = 0, v_offset = 0; | 710 | unsigned int h_offset = 0, v_offset = 0; |
701 | struct tegra_bo_tiling tiling; | 711 | struct tegra_bo_tiling tiling; |
712 | unsigned long value, flags; | ||
702 | unsigned int format, swap; | 713 | unsigned int format, swap; |
703 | unsigned long value; | ||
704 | int err; | 714 | int err; |
705 | 715 | ||
706 | err = tegra_fb_get_tiling(fb, &tiling); | 716 | err = tegra_fb_get_tiling(fb, &tiling); |
707 | if (err < 0) | 717 | if (err < 0) |
708 | return err; | 718 | return err; |
709 | 719 | ||
720 | spin_lock_irqsave(&dc->lock, flags); | ||
721 | |||
710 | tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER); | 722 | tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER); |
711 | 723 | ||
712 | value = fb->offsets[0] + y * fb->pitches[0] + | 724 | value = fb->offsets[0] + y * fb->pitches[0] + |
@@ -752,6 +764,7 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y, | |||
752 | 764 | ||
753 | case TEGRA_BO_TILING_MODE_BLOCK: | 765 | case TEGRA_BO_TILING_MODE_BLOCK: |
754 | DRM_ERROR("hardware doesn't support block linear mode\n"); | 766 | DRM_ERROR("hardware doesn't support block linear mode\n"); |
767 | spin_unlock_irqrestore(&dc->lock, flags); | ||
755 | return -EINVAL; | 768 | return -EINVAL; |
756 | } | 769 | } |
757 | 770 | ||
@@ -778,6 +791,8 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y, | |||
778 | tegra_dc_writel(dc, value << 8, DC_CMD_STATE_CONTROL); | 791 | tegra_dc_writel(dc, value << 8, DC_CMD_STATE_CONTROL); |
779 | tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL); | 792 | tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL); |
780 | 793 | ||
794 | spin_unlock_irqrestore(&dc->lock, flags); | ||
795 | |||
781 | return 0; | 796 | return 0; |
782 | } | 797 | } |
783 | 798 | ||
@@ -814,23 +829,32 @@ static void tegra_dc_finish_page_flip(struct tegra_dc *dc) | |||
814 | unsigned long flags, base; | 829 | unsigned long flags, base; |
815 | struct tegra_bo *bo; | 830 | struct tegra_bo *bo; |
816 | 831 | ||
817 | if (!dc->event) | 832 | spin_lock_irqsave(&drm->event_lock, flags); |
833 | |||
834 | if (!dc->event) { | ||
835 | spin_unlock_irqrestore(&drm->event_lock, flags); | ||
818 | return; | 836 | return; |
837 | } | ||
819 | 838 | ||
820 | bo = tegra_fb_get_plane(crtc->primary->fb, 0); | 839 | bo = tegra_fb_get_plane(crtc->primary->fb, 0); |
821 | 840 | ||
841 | spin_lock_irqsave(&dc->lock, flags); | ||
842 | |||
822 | /* check if new start address has been latched */ | 843 | /* check if new start address has been latched */ |
844 | tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER); | ||
823 | tegra_dc_writel(dc, READ_MUX, DC_CMD_STATE_ACCESS); | 845 | tegra_dc_writel(dc, READ_MUX, DC_CMD_STATE_ACCESS); |
824 | base = tegra_dc_readl(dc, DC_WINBUF_START_ADDR); | 846 | base = tegra_dc_readl(dc, DC_WINBUF_START_ADDR); |
825 | tegra_dc_writel(dc, 0, DC_CMD_STATE_ACCESS); | 847 | tegra_dc_writel(dc, 0, DC_CMD_STATE_ACCESS); |
826 | 848 | ||
849 | spin_unlock_irqrestore(&dc->lock, flags); | ||
850 | |||
827 | if (base == bo->paddr + crtc->primary->fb->offsets[0]) { | 851 | if (base == bo->paddr + crtc->primary->fb->offsets[0]) { |
828 | spin_lock_irqsave(&drm->event_lock, flags); | 852 | drm_crtc_send_vblank_event(crtc, dc->event); |
829 | drm_send_vblank_event(drm, dc->pipe, dc->event); | 853 | drm_crtc_vblank_put(crtc); |
830 | drm_vblank_put(drm, dc->pipe); | ||
831 | dc->event = NULL; | 854 | dc->event = NULL; |
832 | spin_unlock_irqrestore(&drm->event_lock, flags); | ||
833 | } | 855 | } |
856 | |||
857 | spin_unlock_irqrestore(&drm->event_lock, flags); | ||
834 | } | 858 | } |
835 | 859 | ||
836 | void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) | 860 | void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) |
@@ -843,7 +867,7 @@ void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) | |||
843 | 867 | ||
844 | if (dc->event && dc->event->base.file_priv == file) { | 868 | if (dc->event && dc->event->base.file_priv == file) { |
845 | dc->event->base.destroy(&dc->event->base); | 869 | dc->event->base.destroy(&dc->event->base); |
846 | drm_vblank_put(drm, dc->pipe); | 870 | drm_crtc_vblank_put(crtc); |
847 | dc->event = NULL; | 871 | dc->event = NULL; |
848 | } | 872 | } |
849 | 873 | ||
@@ -853,16 +877,16 @@ void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) | |||
853 | static int tegra_dc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, | 877 | static int tegra_dc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, |
854 | struct drm_pending_vblank_event *event, uint32_t page_flip_flags) | 878 | struct drm_pending_vblank_event *event, uint32_t page_flip_flags) |
855 | { | 879 | { |
880 | unsigned int pipe = drm_crtc_index(crtc); | ||
856 | struct tegra_dc *dc = to_tegra_dc(crtc); | 881 | struct tegra_dc *dc = to_tegra_dc(crtc); |
857 | struct drm_device *drm = crtc->dev; | ||
858 | 882 | ||
859 | if (dc->event) | 883 | if (dc->event) |
860 | return -EBUSY; | 884 | return -EBUSY; |
861 | 885 | ||
862 | if (event) { | 886 | if (event) { |
863 | event->pipe = dc->pipe; | 887 | event->pipe = pipe; |
864 | dc->event = event; | 888 | dc->event = event; |
865 | drm_vblank_get(drm, dc->pipe); | 889 | drm_crtc_vblank_get(crtc); |
866 | } | 890 | } |
867 | 891 | ||
868 | tegra_dc_set_base(dc, 0, 0, fb); | 892 | tegra_dc_set_base(dc, 0, 0, fb); |
@@ -1127,7 +1151,7 @@ static irqreturn_t tegra_dc_irq(int irq, void *data) | |||
1127 | /* | 1151 | /* |
1128 | dev_dbg(dc->dev, "%s(): vertical blank\n", __func__); | 1152 | dev_dbg(dc->dev, "%s(): vertical blank\n", __func__); |
1129 | */ | 1153 | */ |
1130 | drm_handle_vblank(dc->base.dev, dc->pipe); | 1154 | drm_crtc_handle_vblank(&dc->base); |
1131 | tegra_dc_finish_page_flip(dc); | 1155 | tegra_dc_finish_page_flip(dc); |
1132 | } | 1156 | } |
1133 | 1157 | ||
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index e549afeece1f..d4f827593dfa 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c | |||
@@ -694,24 +694,28 @@ static const struct file_operations tegra_drm_fops = { | |||
694 | .llseek = noop_llseek, | 694 | .llseek = noop_llseek, |
695 | }; | 695 | }; |
696 | 696 | ||
697 | static struct drm_crtc *tegra_crtc_from_pipe(struct drm_device *drm, int pipe) | 697 | static struct drm_crtc *tegra_crtc_from_pipe(struct drm_device *drm, |
698 | unsigned int pipe) | ||
698 | { | 699 | { |
699 | struct drm_crtc *crtc; | 700 | struct drm_crtc *crtc; |
700 | 701 | ||
701 | list_for_each_entry(crtc, &drm->mode_config.crtc_list, head) { | 702 | list_for_each_entry(crtc, &drm->mode_config.crtc_list, head) { |
702 | struct tegra_dc *dc = to_tegra_dc(crtc); | 703 | if (pipe == drm_crtc_index(crtc)) |
703 | |||
704 | if (dc->pipe == pipe) | ||
705 | return crtc; | 704 | return crtc; |
706 | } | 705 | } |
707 | 706 | ||
708 | return NULL; | 707 | return NULL; |
709 | } | 708 | } |
710 | 709 | ||
711 | static u32 tegra_drm_get_vblank_counter(struct drm_device *dev, int crtc) | 710 | static u32 tegra_drm_get_vblank_counter(struct drm_device *drm, int pipe) |
712 | { | 711 | { |
712 | struct drm_crtc *crtc = tegra_crtc_from_pipe(drm, pipe); | ||
713 | |||
714 | if (!crtc) | ||
715 | return 0; | ||
716 | |||
713 | /* TODO: implement real hardware counter using syncpoints */ | 717 | /* TODO: implement real hardware counter using syncpoints */ |
714 | return drm_vblank_count(dev, crtc); | 718 | return drm_crtc_vblank_count(crtc); |
715 | } | 719 | } |
716 | 720 | ||
717 | static int tegra_drm_enable_vblank(struct drm_device *drm, int pipe) | 721 | static int tegra_drm_enable_vblank(struct drm_device *drm, int pipe) |
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c index da32086cbeaf..8777b7f75791 100644 --- a/drivers/gpu/drm/tegra/gem.c +++ b/drivers/gpu/drm/tegra/gem.c | |||
@@ -216,32 +216,58 @@ static void tegra_bo_free(struct drm_device *drm, struct tegra_bo *bo) | |||
216 | } | 216 | } |
217 | } | 217 | } |
218 | 218 | ||
219 | static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo, | 219 | static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo) |
220 | size_t size) | ||
221 | { | 220 | { |
221 | struct scatterlist *s; | ||
222 | struct sg_table *sgt; | ||
223 | unsigned int i; | ||
224 | |||
222 | bo->pages = drm_gem_get_pages(&bo->gem); | 225 | bo->pages = drm_gem_get_pages(&bo->gem); |
223 | if (IS_ERR(bo->pages)) | 226 | if (IS_ERR(bo->pages)) |
224 | return PTR_ERR(bo->pages); | 227 | return PTR_ERR(bo->pages); |
225 | 228 | ||
226 | bo->num_pages = size >> PAGE_SHIFT; | 229 | bo->num_pages = bo->gem.size >> PAGE_SHIFT; |
227 | 230 | ||
228 | bo->sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages); | 231 | sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages); |
229 | if (IS_ERR(bo->sgt)) { | 232 | if (IS_ERR(sgt)) |
230 | drm_gem_put_pages(&bo->gem, bo->pages, false, false); | 233 | goto put_pages; |
231 | return PTR_ERR(bo->sgt); | 234 | |
235 | /* | ||
236 | * Fake up the SG table so that dma_map_sg() can be used to flush the | ||
237 | * pages associated with it. Note that this relies on the fact that | ||
238 | * the DMA API doesn't hook into IOMMU on Tegra, therefore mapping is | ||
239 | * only cache maintenance. | ||
240 | * | ||
241 | * TODO: Replace this by drm_clflash_sg() once it can be implemented | ||
242 | * without relying on symbols that are not exported. | ||
243 | */ | ||
244 | for_each_sg(sgt->sgl, s, sgt->nents, i) | ||
245 | sg_dma_address(s) = sg_phys(s); | ||
246 | |||
247 | if (dma_map_sg(drm->dev, sgt->sgl, sgt->nents, DMA_TO_DEVICE) == 0) { | ||
248 | sgt = ERR_PTR(-ENOMEM); | ||
249 | goto release_sgt; | ||
232 | } | 250 | } |
233 | 251 | ||
252 | bo->sgt = sgt; | ||
253 | |||
234 | return 0; | 254 | return 0; |
255 | |||
256 | release_sgt: | ||
257 | sg_free_table(sgt); | ||
258 | kfree(sgt); | ||
259 | put_pages: | ||
260 | drm_gem_put_pages(&bo->gem, bo->pages, false, false); | ||
261 | return PTR_ERR(sgt); | ||
235 | } | 262 | } |
236 | 263 | ||
237 | static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo, | 264 | static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo) |
238 | size_t size) | ||
239 | { | 265 | { |
240 | struct tegra_drm *tegra = drm->dev_private; | 266 | struct tegra_drm *tegra = drm->dev_private; |
241 | int err; | 267 | int err; |
242 | 268 | ||
243 | if (tegra->domain) { | 269 | if (tegra->domain) { |
244 | err = tegra_bo_get_pages(drm, bo, size); | 270 | err = tegra_bo_get_pages(drm, bo); |
245 | if (err < 0) | 271 | if (err < 0) |
246 | return err; | 272 | return err; |
247 | 273 | ||
@@ -251,6 +277,8 @@ static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo, | |||
251 | return err; | 277 | return err; |
252 | } | 278 | } |
253 | } else { | 279 | } else { |
280 | size_t size = bo->gem.size; | ||
281 | |||
254 | bo->vaddr = dma_alloc_writecombine(drm->dev, size, &bo->paddr, | 282 | bo->vaddr = dma_alloc_writecombine(drm->dev, size, &bo->paddr, |
255 | GFP_KERNEL | __GFP_NOWARN); | 283 | GFP_KERNEL | __GFP_NOWARN); |
256 | if (!bo->vaddr) { | 284 | if (!bo->vaddr) { |
@@ -274,7 +302,7 @@ struct tegra_bo *tegra_bo_create(struct drm_device *drm, size_t size, | |||
274 | if (IS_ERR(bo)) | 302 | if (IS_ERR(bo)) |
275 | return bo; | 303 | return bo; |
276 | 304 | ||
277 | err = tegra_bo_alloc(drm, bo, size); | 305 | err = tegra_bo_alloc(drm, bo); |
278 | if (err < 0) | 306 | if (err < 0) |
279 | goto release; | 307 | goto release; |
280 | 308 | ||
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 8735543eacdb..493478989dbd 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
@@ -1127,6 +1127,24 @@ static void schedule_external_copy(struct thin_c *tc, dm_block_t virt_block, | |||
1127 | schedule_zero(tc, virt_block, data_dest, cell, bio); | 1127 | schedule_zero(tc, virt_block, data_dest, cell, bio); |
1128 | } | 1128 | } |
1129 | 1129 | ||
1130 | static void set_pool_mode(struct pool *pool, enum pool_mode new_mode); | ||
1131 | |||
1132 | static void check_for_space(struct pool *pool) | ||
1133 | { | ||
1134 | int r; | ||
1135 | dm_block_t nr_free; | ||
1136 | |||
1137 | if (get_pool_mode(pool) != PM_OUT_OF_DATA_SPACE) | ||
1138 | return; | ||
1139 | |||
1140 | r = dm_pool_get_free_block_count(pool->pmd, &nr_free); | ||
1141 | if (r) | ||
1142 | return; | ||
1143 | |||
1144 | if (nr_free) | ||
1145 | set_pool_mode(pool, PM_WRITE); | ||
1146 | } | ||
1147 | |||
1130 | /* | 1148 | /* |
1131 | * A non-zero return indicates read_only or fail_io mode. | 1149 | * A non-zero return indicates read_only or fail_io mode. |
1132 | * Many callers don't care about the return value. | 1150 | * Many callers don't care about the return value. |
@@ -1141,6 +1159,8 @@ static int commit(struct pool *pool) | |||
1141 | r = dm_pool_commit_metadata(pool->pmd); | 1159 | r = dm_pool_commit_metadata(pool->pmd); |
1142 | if (r) | 1160 | if (r) |
1143 | metadata_operation_failed(pool, "dm_pool_commit_metadata", r); | 1161 | metadata_operation_failed(pool, "dm_pool_commit_metadata", r); |
1162 | else | ||
1163 | check_for_space(pool); | ||
1144 | 1164 | ||
1145 | return r; | 1165 | return r; |
1146 | } | 1166 | } |
@@ -1159,8 +1179,6 @@ static void check_low_water_mark(struct pool *pool, dm_block_t free_blocks) | |||
1159 | } | 1179 | } |
1160 | } | 1180 | } |
1161 | 1181 | ||
1162 | static void set_pool_mode(struct pool *pool, enum pool_mode new_mode); | ||
1163 | |||
1164 | static int alloc_data_block(struct thin_c *tc, dm_block_t *result) | 1182 | static int alloc_data_block(struct thin_c *tc, dm_block_t *result) |
1165 | { | 1183 | { |
1166 | int r; | 1184 | int r; |
@@ -2155,7 +2173,7 @@ static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) | |||
2155 | pool->process_cell = process_cell_read_only; | 2173 | pool->process_cell = process_cell_read_only; |
2156 | pool->process_discard_cell = process_discard_cell; | 2174 | pool->process_discard_cell = process_discard_cell; |
2157 | pool->process_prepared_mapping = process_prepared_mapping; | 2175 | pool->process_prepared_mapping = process_prepared_mapping; |
2158 | pool->process_prepared_discard = process_prepared_discard_passdown; | 2176 | pool->process_prepared_discard = process_prepared_discard; |
2159 | 2177 | ||
2160 | if (!pool->pf.error_if_no_space && no_space_timeout) | 2178 | if (!pool->pf.error_if_no_space && no_space_timeout) |
2161 | queue_delayed_work(pool->wq, &pool->no_space_timeout, no_space_timeout); | 2179 | queue_delayed_work(pool->wq, &pool->no_space_timeout, no_space_timeout); |
@@ -3814,6 +3832,8 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
3814 | r = -EINVAL; | 3832 | r = -EINVAL; |
3815 | goto bad; | 3833 | goto bad; |
3816 | } | 3834 | } |
3835 | atomic_set(&tc->refcount, 1); | ||
3836 | init_completion(&tc->can_destroy); | ||
3817 | list_add_tail_rcu(&tc->list, &tc->pool->active_thins); | 3837 | list_add_tail_rcu(&tc->list, &tc->pool->active_thins); |
3818 | spin_unlock_irqrestore(&tc->pool->lock, flags); | 3838 | spin_unlock_irqrestore(&tc->pool->lock, flags); |
3819 | /* | 3839 | /* |
@@ -3826,9 +3846,6 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
3826 | 3846 | ||
3827 | dm_put(pool_md); | 3847 | dm_put(pool_md); |
3828 | 3848 | ||
3829 | atomic_set(&tc->refcount, 1); | ||
3830 | init_completion(&tc->can_destroy); | ||
3831 | |||
3832 | return 0; | 3849 | return 0; |
3833 | 3850 | ||
3834 | bad: | 3851 | bad: |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 4c06585bf165..b98cd9d84435 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -899,7 +899,7 @@ static void disable_write_same(struct mapped_device *md) | |||
899 | 899 | ||
900 | static void clone_endio(struct bio *bio, int error) | 900 | static void clone_endio(struct bio *bio, int error) |
901 | { | 901 | { |
902 | int r = 0; | 902 | int r = error; |
903 | struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); | 903 | struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); |
904 | struct dm_io *io = tio->io; | 904 | struct dm_io *io = tio->io; |
905 | struct mapped_device *md = tio->io->md; | 905 | struct mapped_device *md = tio->io->md; |
diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c index 1bf891bd321a..4f361b77c749 100644 --- a/drivers/staging/lustre/lustre/llite/namei.c +++ b/drivers/staging/lustre/lustre/llite/namei.c | |||
@@ -264,7 +264,7 @@ int ll_md_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, | |||
264 | 264 | ||
265 | if ((bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM)) && | 265 | if ((bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM)) && |
266 | inode->i_sb->s_root != NULL && | 266 | inode->i_sb->s_root != NULL && |
267 | is_root_inode(inode)) | 267 | !is_root_inode(inode)) |
268 | ll_invalidate_aliases(inode); | 268 | ll_invalidate_aliases(inode); |
269 | 269 | ||
270 | iput(inode); | 270 | iput(inode); |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 8ba35c622e22..e1b2e8b98af7 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -901,11 +901,15 @@ extern int drm_vblank_init(struct drm_device *dev, int num_crtcs); | |||
901 | extern int drm_wait_vblank(struct drm_device *dev, void *data, | 901 | extern int drm_wait_vblank(struct drm_device *dev, void *data, |
902 | struct drm_file *filp); | 902 | struct drm_file *filp); |
903 | extern u32 drm_vblank_count(struct drm_device *dev, int crtc); | 903 | extern u32 drm_vblank_count(struct drm_device *dev, int crtc); |
904 | extern u32 drm_crtc_vblank_count(struct drm_crtc *crtc); | ||
904 | extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, | 905 | extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, |
905 | struct timeval *vblanktime); | 906 | struct timeval *vblanktime); |
906 | extern void drm_send_vblank_event(struct drm_device *dev, int crtc, | 907 | extern void drm_send_vblank_event(struct drm_device *dev, int crtc, |
907 | struct drm_pending_vblank_event *e); | 908 | struct drm_pending_vblank_event *e); |
909 | extern void drm_crtc_send_vblank_event(struct drm_crtc *crtc, | ||
910 | struct drm_pending_vblank_event *e); | ||
908 | extern bool drm_handle_vblank(struct drm_device *dev, int crtc); | 911 | extern bool drm_handle_vblank(struct drm_device *dev, int crtc); |
912 | extern bool drm_crtc_handle_vblank(struct drm_crtc *crtc); | ||
909 | extern int drm_vblank_get(struct drm_device *dev, int crtc); | 913 | extern int drm_vblank_get(struct drm_device *dev, int crtc); |
910 | extern void drm_vblank_put(struct drm_device *dev, int crtc); | 914 | extern void drm_vblank_put(struct drm_device *dev, int crtc); |
911 | extern int drm_crtc_vblank_get(struct drm_crtc *crtc); | 915 | extern int drm_crtc_vblank_get(struct drm_crtc *crtc); |
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 780511a459c0..1e6ae1458f7a 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h | |||
@@ -119,13 +119,6 @@ struct drm_gem_object { | |||
119 | * simply leave it as NULL. | 119 | * simply leave it as NULL. |
120 | */ | 120 | */ |
121 | struct dma_buf_attachment *import_attach; | 121 | struct dma_buf_attachment *import_attach; |
122 | |||
123 | /** | ||
124 | * dumb - created as dumb buffer | ||
125 | * Whether the gem object was created using the dumb buffer interface | ||
126 | * as such it may not be used for GPU rendering. | ||
127 | */ | ||
128 | bool dumb; | ||
129 | }; | 122 | }; |
130 | 123 | ||
131 | void drm_gem_object_release(struct drm_gem_object *obj); | 124 | void drm_gem_object_release(struct drm_gem_object *obj); |
diff --git a/include/linux/audit.h b/include/linux/audit.h index 0c04917c2f12..af84234e1f6e 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -47,6 +47,7 @@ struct sk_buff; | |||
47 | 47 | ||
48 | struct audit_krule { | 48 | struct audit_krule { |
49 | int vers_ops; | 49 | int vers_ops; |
50 | u32 pflags; | ||
50 | u32 flags; | 51 | u32 flags; |
51 | u32 listnr; | 52 | u32 listnr; |
52 | u32 action; | 53 | u32 action; |
@@ -64,6 +65,9 @@ struct audit_krule { | |||
64 | u64 prio; | 65 | u64 prio; |
65 | }; | 66 | }; |
66 | 67 | ||
68 | /* Flag to indicate legacy AUDIT_LOGINUID unset usage */ | ||
69 | #define AUDIT_LOGINUID_LEGACY 0x1 | ||
70 | |||
67 | struct audit_field { | 71 | struct audit_field { |
68 | u32 type; | 72 | u32 type; |
69 | union { | 73 | union { |
diff --git a/kernel/audit.c b/kernel/audit.c index f8f203e8018c..231b7dcb154b 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -429,7 +429,7 @@ static void kauditd_send_skb(struct sk_buff *skb) | |||
429 | * This function doesn't consume an skb as might be expected since it has to | 429 | * This function doesn't consume an skb as might be expected since it has to |
430 | * copy it anyways. | 430 | * copy it anyways. |
431 | */ | 431 | */ |
432 | static void kauditd_send_multicast_skb(struct sk_buff *skb) | 432 | static void kauditd_send_multicast_skb(struct sk_buff *skb, gfp_t gfp_mask) |
433 | { | 433 | { |
434 | struct sk_buff *copy; | 434 | struct sk_buff *copy; |
435 | struct audit_net *aunet = net_generic(&init_net, audit_net_id); | 435 | struct audit_net *aunet = net_generic(&init_net, audit_net_id); |
@@ -448,11 +448,11 @@ static void kauditd_send_multicast_skb(struct sk_buff *skb) | |||
448 | * no reason for new multicast clients to continue with this | 448 | * no reason for new multicast clients to continue with this |
449 | * non-compliance. | 449 | * non-compliance. |
450 | */ | 450 | */ |
451 | copy = skb_copy(skb, GFP_KERNEL); | 451 | copy = skb_copy(skb, gfp_mask); |
452 | if (!copy) | 452 | if (!copy) |
453 | return; | 453 | return; |
454 | 454 | ||
455 | nlmsg_multicast(sock, copy, 0, AUDIT_NLGRP_READLOG, GFP_KERNEL); | 455 | nlmsg_multicast(sock, copy, 0, AUDIT_NLGRP_READLOG, gfp_mask); |
456 | } | 456 | } |
457 | 457 | ||
458 | /* | 458 | /* |
@@ -1940,7 +1940,7 @@ void audit_log_end(struct audit_buffer *ab) | |||
1940 | struct nlmsghdr *nlh = nlmsg_hdr(ab->skb); | 1940 | struct nlmsghdr *nlh = nlmsg_hdr(ab->skb); |
1941 | 1941 | ||
1942 | nlh->nlmsg_len = ab->skb->len; | 1942 | nlh->nlmsg_len = ab->skb->len; |
1943 | kauditd_send_multicast_skb(ab->skb); | 1943 | kauditd_send_multicast_skb(ab->skb, ab->gfp_mask); |
1944 | 1944 | ||
1945 | /* | 1945 | /* |
1946 | * The original kaudit unicast socket sends up messages with | 1946 | * The original kaudit unicast socket sends up messages with |
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 3598e13f2a65..4f68a326d92e 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c | |||
@@ -442,19 +442,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, | |||
442 | if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) { | 442 | if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) { |
443 | f->type = AUDIT_LOGINUID_SET; | 443 | f->type = AUDIT_LOGINUID_SET; |
444 | f->val = 0; | 444 | f->val = 0; |
445 | } | 445 | entry->rule.pflags |= AUDIT_LOGINUID_LEGACY; |
446 | |||
447 | if ((f->type == AUDIT_PID) || (f->type == AUDIT_PPID)) { | ||
448 | struct pid *pid; | ||
449 | rcu_read_lock(); | ||
450 | pid = find_vpid(f->val); | ||
451 | if (!pid) { | ||
452 | rcu_read_unlock(); | ||
453 | err = -ESRCH; | ||
454 | goto exit_free; | ||
455 | } | ||
456 | f->val = pid_nr(pid); | ||
457 | rcu_read_unlock(); | ||
458 | } | 446 | } |
459 | 447 | ||
460 | err = audit_field_valid(entry, f); | 448 | err = audit_field_valid(entry, f); |
@@ -630,6 +618,13 @@ static struct audit_rule_data *audit_krule_to_data(struct audit_krule *krule) | |||
630 | data->buflen += data->values[i] = | 618 | data->buflen += data->values[i] = |
631 | audit_pack_string(&bufp, krule->filterkey); | 619 | audit_pack_string(&bufp, krule->filterkey); |
632 | break; | 620 | break; |
621 | case AUDIT_LOGINUID_SET: | ||
622 | if (krule->pflags & AUDIT_LOGINUID_LEGACY && !f->val) { | ||
623 | data->fields[i] = AUDIT_LOGINUID; | ||
624 | data->values[i] = AUDIT_UID_UNSET; | ||
625 | break; | ||
626 | } | ||
627 | /* fallthrough if set */ | ||
633 | default: | 628 | default: |
634 | data->values[i] = f->val; | 629 | data->values[i] = f->val; |
635 | } | 630 | } |
@@ -646,6 +641,7 @@ static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b) | |||
646 | int i; | 641 | int i; |
647 | 642 | ||
648 | if (a->flags != b->flags || | 643 | if (a->flags != b->flags || |
644 | a->pflags != b->pflags || | ||
649 | a->listnr != b->listnr || | 645 | a->listnr != b->listnr || |
650 | a->action != b->action || | 646 | a->action != b->action || |
651 | a->field_count != b->field_count) | 647 | a->field_count != b->field_count) |
@@ -764,6 +760,7 @@ struct audit_entry *audit_dupe_rule(struct audit_krule *old) | |||
764 | new = &entry->rule; | 760 | new = &entry->rule; |
765 | new->vers_ops = old->vers_ops; | 761 | new->vers_ops = old->vers_ops; |
766 | new->flags = old->flags; | 762 | new->flags = old->flags; |
763 | new->pflags = old->pflags; | ||
767 | new->listnr = old->listnr; | 764 | new->listnr = old->listnr; |
768 | new->action = old->action; | 765 | new->action = old->action; |
769 | for (i = 0; i < AUDIT_BITMASK_SIZE; i++) | 766 | for (i = 0; i < AUDIT_BITMASK_SIZE; i++) |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index c75522a83678..37c69ab561da 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -1877,12 +1877,18 @@ void __audit_inode(struct filename *name, const struct dentry *dentry, | |||
1877 | } | 1877 | } |
1878 | 1878 | ||
1879 | out_alloc: | 1879 | out_alloc: |
1880 | /* unable to find the name from a previous getname(). Allocate a new | 1880 | /* unable to find an entry with both a matching name and type */ |
1881 | * anonymous entry. | 1881 | n = audit_alloc_name(context, AUDIT_TYPE_UNKNOWN); |
1882 | */ | ||
1883 | n = audit_alloc_name(context, AUDIT_TYPE_NORMAL); | ||
1884 | if (!n) | 1882 | if (!n) |
1885 | return; | 1883 | return; |
1884 | if (name) | ||
1885 | /* since name is not NULL we know there is already a matching | ||
1886 | * name record, see audit_getname(), so there must be a type | ||
1887 | * mismatch; reuse the string path since the original name | ||
1888 | * record will keep the string valid until we free it in | ||
1889 | * audit_free_names() */ | ||
1890 | n->name = name; | ||
1891 | |||
1886 | out: | 1892 | out: |
1887 | if (parent) { | 1893 | if (parent) { |
1888 | n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL; | 1894 | n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL; |
diff --git a/mm/memory.c b/mm/memory.c index 649e7d440bd7..ca920d1fd314 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2378,12 +2378,12 @@ void unmap_mapping_range(struct address_space *mapping, | |||
2378 | details.last_index = ULONG_MAX; | 2378 | details.last_index = ULONG_MAX; |
2379 | 2379 | ||
2380 | 2380 | ||
2381 | i_mmap_lock_read(mapping); | 2381 | i_mmap_lock_write(mapping); |
2382 | if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap))) | 2382 | if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap))) |
2383 | unmap_mapping_range_tree(&mapping->i_mmap, &details); | 2383 | unmap_mapping_range_tree(&mapping->i_mmap, &details); |
2384 | if (unlikely(!list_empty(&mapping->i_mmap_nonlinear))) | 2384 | if (unlikely(!list_empty(&mapping->i_mmap_nonlinear))) |
2385 | unmap_mapping_range_list(&mapping->i_mmap_nonlinear, &details); | 2385 | unmap_mapping_range_list(&mapping->i_mmap_nonlinear, &details); |
2386 | i_mmap_unlock_read(mapping); | 2386 | i_mmap_unlock_write(mapping); |
2387 | } | 2387 | } |
2388 | EXPORT_SYMBOL(unmap_mapping_range); | 2388 | EXPORT_SYMBOL(unmap_mapping_range); |
2389 | 2389 | ||
diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c index 8276a743e22e..0cfc9c8c4b4e 100644 --- a/sound/pci/hda/hda_controller.c +++ b/sound/pci/hda/hda_controller.c | |||
@@ -1922,10 +1922,18 @@ int azx_mixer_create(struct azx *chip) | |||
1922 | EXPORT_SYMBOL_GPL(azx_mixer_create); | 1922 | EXPORT_SYMBOL_GPL(azx_mixer_create); |
1923 | 1923 | ||
1924 | 1924 | ||
1925 | static bool is_input_stream(struct azx *chip, unsigned char index) | ||
1926 | { | ||
1927 | return (index >= chip->capture_index_offset && | ||
1928 | index < chip->capture_index_offset + chip->capture_streams); | ||
1929 | } | ||
1930 | |||
1925 | /* initialize SD streams */ | 1931 | /* initialize SD streams */ |
1926 | int azx_init_stream(struct azx *chip) | 1932 | int azx_init_stream(struct azx *chip) |
1927 | { | 1933 | { |
1928 | int i; | 1934 | int i; |
1935 | int in_stream_tag = 0; | ||
1936 | int out_stream_tag = 0; | ||
1929 | 1937 | ||
1930 | /* initialize each stream (aka device) | 1938 | /* initialize each stream (aka device) |
1931 | * assign the starting bdl address to each stream (device) | 1939 | * assign the starting bdl address to each stream (device) |
@@ -1938,9 +1946,21 @@ int azx_init_stream(struct azx *chip) | |||
1938 | azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80); | 1946 | azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80); |
1939 | /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */ | 1947 | /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */ |
1940 | azx_dev->sd_int_sta_mask = 1 << i; | 1948 | azx_dev->sd_int_sta_mask = 1 << i; |
1941 | /* stream tag: must be non-zero and unique */ | ||
1942 | azx_dev->index = i; | 1949 | azx_dev->index = i; |
1943 | azx_dev->stream_tag = i + 1; | 1950 | |
1951 | /* stream tag must be unique throughout | ||
1952 | * the stream direction group, | ||
1953 | * valid values 1...15 | ||
1954 | * use separate stream tag if the flag | ||
1955 | * AZX_DCAPS_SEPARATE_STREAM_TAG is used | ||
1956 | */ | ||
1957 | if (chip->driver_caps & AZX_DCAPS_SEPARATE_STREAM_TAG) | ||
1958 | azx_dev->stream_tag = | ||
1959 | is_input_stream(chip, i) ? | ||
1960 | ++in_stream_tag : | ||
1961 | ++out_stream_tag; | ||
1962 | else | ||
1963 | azx_dev->stream_tag = i + 1; | ||
1944 | } | 1964 | } |
1945 | 1965 | ||
1946 | return 0; | 1966 | return 0; |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 2bf0b568e3de..d426a0bd6a5f 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -299,6 +299,9 @@ enum { | |||
299 | AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_POWERWELL |\ | 299 | AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_POWERWELL |\ |
300 | AZX_DCAPS_SNOOP_TYPE(SCH)) | 300 | AZX_DCAPS_SNOOP_TYPE(SCH)) |
301 | 301 | ||
302 | #define AZX_DCAPS_INTEL_SKYLAKE \ | ||
303 | (AZX_DCAPS_INTEL_PCH | AZX_DCAPS_SEPARATE_STREAM_TAG) | ||
304 | |||
302 | /* quirks for ATI SB / AMD Hudson */ | 305 | /* quirks for ATI SB / AMD Hudson */ |
303 | #define AZX_DCAPS_PRESET_ATI_SB \ | 306 | #define AZX_DCAPS_PRESET_ATI_SB \ |
304 | (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB |\ | 307 | (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB |\ |
@@ -2027,7 +2030,7 @@ static const struct pci_device_id azx_ids[] = { | |||
2027 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | 2030 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
2028 | /* Sunrise Point-LP */ | 2031 | /* Sunrise Point-LP */ |
2029 | { PCI_DEVICE(0x8086, 0x9d70), | 2032 | { PCI_DEVICE(0x8086, 0x9d70), |
2030 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | 2033 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE }, |
2031 | /* Haswell */ | 2034 | /* Haswell */ |
2032 | { PCI_DEVICE(0x8086, 0x0a0c), | 2035 | { PCI_DEVICE(0x8086, 0x0a0c), |
2033 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, | 2036 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, |
diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index aa484fdf4338..166e3e84b963 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h | |||
@@ -171,6 +171,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; | |||
171 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ | 171 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ |
172 | #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ | 172 | #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ |
173 | #define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ | 173 | #define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ |
174 | #define AZX_DCAPS_SEPARATE_STREAM_TAG (1 << 30) /* capture and playback use separate stream tag */ | ||
174 | 175 | ||
175 | enum { | 176 | enum { |
176 | AZX_SNOOP_TYPE_NONE , | 177 | AZX_SNOOP_TYPE_NONE , |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index f5283438ee05..1cc6e2e19982 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -671,6 +671,7 @@ static void update_memslots(struct kvm_memslots *slots, | |||
671 | 671 | ||
672 | WARN_ON(mslots[i].id != id); | 672 | WARN_ON(mslots[i].id != id); |
673 | if (!new->npages) { | 673 | if (!new->npages) { |
674 | WARN_ON(!mslots[i].npages); | ||
674 | new->base_gfn = 0; | 675 | new->base_gfn = 0; |
675 | if (mslots[i].npages) | 676 | if (mslots[i].npages) |
676 | slots->used_slots--; | 677 | slots->used_slots--; |
@@ -687,12 +688,25 @@ static void update_memslots(struct kvm_memslots *slots, | |||
687 | slots->id_to_index[mslots[i].id] = i; | 688 | slots->id_to_index[mslots[i].id] = i; |
688 | i++; | 689 | i++; |
689 | } | 690 | } |
690 | while (i > 0 && | 691 | |
691 | new->base_gfn > mslots[i - 1].base_gfn) { | 692 | /* |
692 | mslots[i] = mslots[i - 1]; | 693 | * The ">=" is needed when creating a slot with base_gfn == 0, |
693 | slots->id_to_index[mslots[i].id] = i; | 694 | * so that it moves before all those with base_gfn == npages == 0. |
694 | i--; | 695 | * |
695 | } | 696 | * On the other hand, if new->npages is zero, the above loop has |
697 | * already left i pointing to the beginning of the empty part of | ||
698 | * mslots, and the ">=" would move the hole backwards in this | ||
699 | * case---which is wrong. So skip the loop when deleting a slot. | ||
700 | */ | ||
701 | if (new->npages) { | ||
702 | while (i > 0 && | ||
703 | new->base_gfn >= mslots[i - 1].base_gfn) { | ||
704 | mslots[i] = mslots[i - 1]; | ||
705 | slots->id_to_index[mslots[i].id] = i; | ||
706 | i--; | ||
707 | } | ||
708 | } else | ||
709 | WARN_ON_ONCE(i != slots->used_slots); | ||
696 | 710 | ||
697 | mslots[i] = *new; | 711 | mslots[i] = *new; |
698 | slots->id_to_index[mslots[i].id] = i; | 712 | slots->id_to_index[mslots[i].id] = i; |