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; |
