The following commit has been merged in the master branch: commit af3c8d98508d37541d4bf57f13a984a7f73a328c Merge: d3e3b7eac886fb1383db2f22b81550fa6d87f62f 00fc2c26bc46a64545cdf95a1511461ea9acecb4 Author: Linus Torvalds torvalds@linux-foundation.org Date: Sun Jul 9 18:48:37 2017 -0700
Merge tag 'drm-for-v4.13' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "This is the main pull request for the drm, I think I've got one later driver pull for mediatek SoC driver, I'm undecided on if it needs to go to you yet.
Otherwise summary below:
Core drm: - Atomic add driver private objects - Deprecate preclose hook in modern drivers - MST bandwidth tracking - Use kvmalloc in more places - Add mode_valid hook for crtc/encoder/bridge - Reduce sync_file construction time - Documentation updates - New DRM synchronisation object support
New drivers: - pl111 - pl111 CLCD display controller
Panel: - Innolux P079ZCA panel driver - Add NL12880B20-05, NL192108AC18-02D, P320HVN03 panels - panel-samsung-s6e3ha2: Add s6e3hf2 panel support
i915: - SKL+ watermark fixes - G4x/G33 reset improvements - DP AUX backlight improvements - Buffer based GuC/host communication - New getparam for (sub)slice infomation - Cannonlake and Coffeelake initial patches - Execbuf optimisations
radeon/amdgpu: - Lots of Vega10 bug fixes - Preliminary raven support - KIQ support for compute rings - MEC queue management rework - DCE6 Audio support - SR-IOV improvements - Better radeon/amdgpu selection support
nouveau: - HDMI stereoscopic support - Display code rework for >= GM20x GPUs
msm: - GEM rework for fine-grained locking - Per-process pagetable work - HDMI fixes for Snapdragon 820.
vc4: - Remove 256MB CMA limit from vc4 - Add out-fence support - Add support for cygnus - Get/set tiling ioctls support - Add T-format tiling support for scanout
zte: - add VGA support.
etnaviv: - Thermal throttle support for newer GPUs - Restore userspace buffer cache performance - dma-buf sync fix
stm: - add stm32f429 display support
exynos: - Rework vblank handling - Fixup sw-trigger code
sun4i: - V3s display engine support - HDMI support for older SoCs - Preliminary work on dual-pipeline SoCs.
rcar-du: - VSP work
imx-drm: - Remove counter load enable from PRE - Double read/write reduction flag support
tegra: - Documentation for the host1x and drm driver. - Lots of staging ioctl fixes due to grate project work.
omapdrm: - dma-buf fence support - TILER rotation fixes"
* tag 'drm-for-v4.13' of git://people.freedesktop.org/~airlied/linux: (1270 commits) drm: Remove unused drm_file parameter to drm_syncobj_replace_fence() drm/amd/powerplay: fix bug fail to remove sysfs when rmmod amdgpu. amdgpu: Set cik/si_support to 1 by default if radeon isn't built drm/amdgpu/gfx9: fix driver reload with KIQ drm/amdgpu/gfx8: fix driver reload with KIQ drm/amdgpu: Don't call amd_powerplay_destroy() if we don't have powerplay drm/ttm: Fix use-after-free in ttm_bo_clean_mm drm/amd/amdgpu: move get memory type function from early init to sw init drm/amdgpu/cgs: always set reference clock in mode_info drm/amdgpu: fix vblank_time when displays are off drm/amd/powerplay: power value format change for Vega10 drm/amdgpu/gfx9: support the amdgpu.disable_cu option drm/amd/powerplay: change PPSMC_MSG_GetCurrPkgPwr for Vega10 drm/amdgpu: Make amdgpu_cs_parser_init static (v2) drm/amdgpu/cs: fix a typo in a comment drm/amdgpu: Fix the exported always on CU bitmap drm/amdgpu/gfx9: gfx_v9_0_enable_gfx_static_mg_power_gating() can be static drm/amdgpu/psp: upper_32_bits/lower_32_bits for address setup drm/amd/powerplay/cz: print message if smc message fails drm/amdgpu: fix typo in amdgpu_debugfs_test_ib_init ...
diff --combined Documentation/devicetree/bindings/vendor-prefixes.txt index 52cfd5f97b6b,f08284e7439b..daf465bef758 --- a/Documentation/devicetree/bindings/vendor-prefixes.txt +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt @@@ -5,7 -5,6 +5,7 @@@ using them to avoid name-space collisio
abcn Abracon Corporation abilis Abilis Systems +actions Actions Semiconductor Co., Ltd. active-semi Active-Semi International Inc ad Avionic Design GmbH adapteva Adapteva, Inc. @@@ -29,7 -28,6 +29,7 @@@ andestech Andes Technology Corporatio apm Applied Micro Circuits Corporation (APM) aptina Aptina Imaging arasan Arasan Chip Systems +arctic Arctic Sand aries Aries Embedded GmbH arm ARM Ltd. armadeus ARMadeus Systems SARL @@@ -46,7 -44,6 +46,7 @@@ avia avia semiconducto avic Shanghai AVIC Optoelectronics Co., Ltd. axentia Axentia Technologies AB axis Axis Communications AB +bananapi BIPAI KEJI LIMITED boe BOE Technology Group Co., Ltd. bosch Bosch Sensortec GmbH boundary Boundary Devices Inc. @@@ -161,8 -158,6 +161,8 @@@ iom Iomega Corporatio isee ISEE 2007 S.L. isil Intersil issi Integrated Silicon Solutions Inc. +itead ITEAD Intelligent Systems Co.Ltd +iwave iWave Systems Technologies Pvt. Ltd. jdi Japan Display Inc. jedec JEDEC Solid State Technology Association karo Ka-Ro electronics GmbH @@@ -170,7 -165,6 +170,7 @@@ keithkoep Keith & Koep Gmb keymile Keymile GmbH khadas Khadas kinetic Kinetic Technologies +kingnovel Kingnovel Technology Co., Ltd. kosagi Sutajio Ko-Usagi PTE Ltd. kyo Kyocera Corporation lacie LaCie @@@ -178,10 -172,8 +178,10 @@@ lantiq Lantiq Semiconducto lego LEGO Systems A/S lenovo Lenovo Group Ltd. lg LG Corporation +libretech Shenzhen Libre Technology Co., Ltd licheepi Lichee Pi linaro Linaro Limited +linksys Belkin International, Inc. (Linksys) linux Linux-specific binding lltc Linear Technology Corporation lsi LSI Corp. (LSI Logic) @@@ -227,6 -219,7 +227,7 @@@ nexbox Nexbo newhaven Newhaven Display International ni National Instruments nintendo Nintendo + nlt NLT Technologies, Ltd. nokia Nokia nordic Nordic Semiconductor nuvoton Nuvoton Technology Corporation @@@ -274,10 -267,8 +275,10 @@@ renesas Renesas Electronics Corporatio richtek Richtek Technology Corporation ricoh Ricoh Co. Ltd. rikomagic Rikomagic Tech Corp. Ltd +riscv RISC-V Foundation rockchip Fuzhou Rockchip Electronics Co., Ltd rohm ROHM Semiconductor Co., Ltd +roofull Shenzhen Roofull Technology Co, Ltd samsung Samsung Semiconductor samtec Samtec/Softing company sandisk Sandisk Corporation @@@ -341,7 -332,6 +342,7 @@@ tronfy Tronf tronsmart Tronsmart truly Truly Semiconductors Limited tyan Tyan Computer Corporation +ucrobotics uCRobotics udoo Udoo uniwest United Western Technologies Corp (UniWest) upisemi uPI Semiconductor Corp. @@@ -367,7 -357,6 +368,7 @@@ xlnx Xilin xunlong Shenzhen Xunlong Software CO.,Limited zarlink Zarlink Semiconductor zeitec ZEITEC Semiconductor Co., LTD. +zidoo Shenzhen Zidoo Technology Co., Ltd. zii Zodiac Inflight Innovations zte ZTE Corp. zyxel ZyXEL Communications Corp. diff --combined Documentation/gpu/todo.rst index 6162d0e9dc28,95a517077eb0..1ae42006deea --- a/Documentation/gpu/todo.rst +++ b/Documentation/gpu/todo.rst @@@ -177,19 -177,6 +177,6 @@@ following drivers still use ``struct_mu
Contact: Daniel Vetter, respective driver maintainers
- Switch to drm_connector_list_iter for any connector_list walking - ---------------------------------------------------------------- - - Connectors can be hotplugged, and we now have a special list of helpers to walk - the connector_list in a race-free fashion, without incurring deadlocks on - mutexes and other fun stuff. - - Unfortunately most drivers are not converted yet. At least all those supporting - DP MST hotplug should be converted, since for those drivers the difference - matters. See drm_for_each_connector_iter() vs. drm_for_each_connector(). - - Contact: Daniel Vetter - Core refactorings =================
@@@ -228,7 -215,7 +215,7 @@@ The DRM reference documentation is stil task would be to clean up interfaces like moving functions around between files to better group them and improving the interfaces like dropping return values for functions that never fail. Then write kerneldoc for all exported -functions and an overview section and integrate it all into the drm DocBook. +functions and an overview section and integrate it all into the drm book.
See https://dri.freedesktop.org/docs/drm/ for what's there already.
diff --combined MAINTAINERS index 01dffc0a9e1f,068fd67bb637..7ad8107b47db --- a/MAINTAINERS +++ b/MAINTAINERS @@@ -155,7 -155,7 +155,7 @@@ S: Maintaine F: drivers/scsi/53c700*
6LOWPAN GENERIC (BTLE/IEEE 802.15.4) -M: Alexander Aring aar@pengutronix.de +M: Alexander Aring alex.aring@gmail.com M: Jukka Rissanen jukka.rissanen@linux.intel.com L: linux-bluetooth@vger.kernel.org L: linux-wpan@vger.kernel.org @@@ -478,7 -478,7 +478,7 @@@ L: linux-hwmon@vger.kernel.or S: Maintained F: Documentation/hwmon/ads1015 F: drivers/hwmon/ads1015.c -F: include/linux/i2c/ads1015.h +F: include/linux/platform_data/ads1015.h
ADT746X FAN DRIVER M: Colin Leroy colin@colino.net @@@ -1036,22 -1036,6 +1036,22 @@@ S: Maintaine F: drivers/amba/ F: include/linux/amba/bus.h
+ARM/ACTIONS SEMI ARCHITECTURE +M: Andreas Färber afaerber@suse.de +L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) +S: Maintained +N: owl +F: arch/arm/mach-actions/ +F: arch/arm/boot/dts/owl-* +F: arch/arm64/boot/dts/actions/ +F: drivers/clocksource/owl-* +F: drivers/soc/actions/ +F: include/dt-bindings/power/owl-* +F: include/linux/soc/actions/ +F: Documentation/devicetree/bindings/arm/actions.txt +F: Documentation/devicetree/bindings/power/actions,owl-sps.txt +F: Documentation/devicetree/bindings/timer/actions,owl-timer.txt + ARM/ADS SPHERE MACHINE SUPPORT M: Lennert Buytenhek kernel@wantstofly.org L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) @@@ -1223,9 -1207,7 +1223,9 @@@ L: linux-arm-kernel@lists.infradead.or S: Maintained F: drivers/hwtracing/coresight/* F: Documentation/trace/coresight.txt +F: Documentation/trace/coresight-cpu-debug.txt F: Documentation/devicetree/bindings/arm/coresight.txt +F: Documentation/devicetree/bindings/arm/coresight-cpu-debug.txt F: Documentation/ABI/testing/sysfs-bus-coresight-devices-* F: tools/perf/arch/arm/util/pmu.c F: tools/perf/arch/arm/util/auxtrace.c @@@ -1515,7 -1497,6 +1515,7 @@@ F: arch/arm64/boot/dts/marvell/armada F: drivers/cpufreq/mvebu-cpufreq.c F: drivers/irqchip/irq-armada-370-xp.c F: drivers/irqchip/irq-mvebu-* +F: drivers/pinctrl/mvebu/ F: drivers/rtc/rtc-armada38x.c
ARM/Marvell Berlin SoC support @@@ -1682,6 -1663,7 +1682,6 @@@ F: arch/arm/mach-qcom F: arch/arm64/boot/dts/qcom/* F: drivers/i2c/busses/i2c-qup.c F: drivers/clk/qcom/ -F: drivers/pinctrl/qcom/ F: drivers/dma/qcom/ F: drivers/soc/qcom/ F: drivers/spi/spi-qup.c @@@ -1697,13 -1679,6 +1697,13 @@@ M: Lennert Buytenhek <kernel@wantstofly L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) S: Maintained
+ARM/REALTEK ARCHITECTURE +M: Andreas Färber afaerber@suse.de +L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) +S: Maintained +F: arch/arm64/boot/dts/realtek/ +F: Documentation/devicetree/bindings/arm/realtek.txt + ARM/RENESAS ARM64 ARCHITECTURE M: Simon Horman horms@verge.net.au M: Magnus Damm magnus.damm@gmail.com @@@ -1737,7 -1712,6 +1737,7 @@@ L: linux-rockchip@lists.infradead.or T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git S: Maintained F: arch/arm/boot/dts/rk3* +F: arch/arm/boot/dts/rv1108* F: arch/arm/mach-rockchip/ F: drivers/clk/rockchip/ F: drivers/i2c/busses/i2c-rk3x.c @@@ -1802,12 -1776,11 +1802,12 @@@ F: arch/arm/plat-samsung/s5p-dev-mfc. F: drivers/media/platform/s5p-mfc/
ARM/SAMSUNG S5P SERIES HDMI CEC SUBSYSTEM SUPPORT -M: Kyungmin Park kyungmin.park@samsung.com -L: linux-arm-kernel@lists.infradead.org +M: Marek Szyprowski m.szyprowski@samsung.com +L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) L: linux-media@vger.kernel.org S: Maintained -F: drivers/staging/media/platform/s5p-cec/ +F: drivers/media/platform/s5p-cec/ +F: Documentation/devicetree/bindings/media/s5p-cec.txt
ARM/SAMSUNG S5P SERIES JPEG CODEC SUPPORT M: Andrzej Pietrasiewicz andrzej.p@samsung.com @@@ -1870,8 -1843,8 +1870,8 @@@ F: drivers/i2c/busses/i2c-st. F: drivers/media/rc/st_rc.c F: drivers/media/platform/sti/c8sectpfe/ F: drivers/mmc/host/sdhci-st.c -F: drivers/phy/phy-miphy28lp.c -F: drivers/phy/phy-stih407-usb.c +F: drivers/phy/st/phy-miphy28lp.c +F: drivers/phy/st/phy-stih407-usb.c F: drivers/pinctrl/pinctrl-st.c F: drivers/remoteproc/st_remoteproc.c F: drivers/remoteproc/st_slim_rproc.c @@@ -2349,15 -2322,6 +2349,15 @@@ F: Documentation/devicetree/bindings/in F: drivers/input/touchscreen/atmel_mxt_ts.c F: include/linux/platform_data/atmel_mxt_ts.h
+ATOMIC INFRASTRUCTURE +M: Will Deacon will.deacon@arm.com +M: Peter Zijlstra peterz@infradead.org +R: Boqun Feng boqun.feng@gmail.com +L: linux-kernel@vger.kernel.org +S: Maintained +F: arch/*/include/asm/atomic*.h +F: include/*/atomic*.h + ATTO EXPRESSSAS SAS/SATA RAID SCSI DRIVER M: Bradley Grove linuxdrivers@attotech.com L: linux-scsi@vger.kernel.org @@@ -2631,21 -2595,6 +2631,21 @@@ S: Maintaine F: net/bluetooth/ F: include/net/bluetooth/
+DMA MAPPING HELPERS +M: Christoph Hellwig hch@lst.de +M: Marek Szyprowski m.szyprowski@samsung.com +R: Robin Murphy robin.murphy@arm.com +L: linux-kernel@vger.kernel.org +T: git git://git.infradead.org/users/hch/dma-mapping.git +W: http://git.infradead.org/users/hch/dma-mapping.git +S: Supported +F: lib/dma-debug.c +F: lib/dma-noop.c +F: lib/dma-virt.c +F: drivers/base/dma-mapping.c +F: drivers/base/dma-coherent.c +F: include/linux/dma-mapping.h + BONDING DRIVER M: Jay Vosburgh j.vosburgh@gmail.com M: Veaceslav Falico vfalico@gmail.com @@@ -2736,6 -2685,7 +2736,6 @@@ N: kon F: arch/arm/mach-bcm/
BROADCOM BCM2835 ARM ARCHITECTURE -M: Lee Jones lee@kernel.org M: Eric Anholt eric@anholt.net M: Stefan Wahren stefan.wahren@i2se.com L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers) @@@ -2835,11 -2785,8 +2835,11 @@@ BROADCOM BRCM80211 IEEE802.11n WIRELES M: Arend van Spriel arend.vanspriel@broadcom.com M: Franky Lin franky.lin@broadcom.com M: Hante Meuleman hante.meuleman@broadcom.com +M: Chi-Hsien Lin chi-hsien.lin@cypress.com +M: Wright Feng wright.feng@cypress.com L: linux-wireless@vger.kernel.org L: brcm80211-dev-list.pdl@broadcom.com +L: brcm80211-dev-list@cypress.com S: Supported F: drivers/net/wireless/broadcom/brcm80211/
@@@ -3017,7 -2964,7 +3017,7 @@@ F: sound/pci/oxygen
C6X ARCHITECTURE M: Mark Salter msalter@redhat.com -M: Aurelien Jacquiot a-jacquiot@ti.com +M: Aurelien Jacquiot jacquiot.aurelien@gmail.com L: linux-c6x-dev@linux-c6x.org W: http://www.linux-c6x.org/wiki/index.php/Main_Page S: Maintained @@@ -3190,7 -3137,6 +3190,7 @@@ F: include/media/cec. F: include/media/cec-notifier.h F: include/uapi/linux/cec.h F: include/uapi/linux/cec-funcs.h +F: Documentation/devicetree/bindings/media/cec.txt
CELL BROADBAND ENGINE ARCHITECTURE M: Arnd Bergmann arnd@arndb.de @@@ -3640,6 -3586,7 +3640,6 @@@ T: git git://git.kernel.org/pub/scm/lin S: Maintained F: Documentation/crypto/ F: Documentation/devicetree/bindings/crypto/ -F: Documentation/DocBook/crypto-API.tmpl F: arch/*/crypto/ F: crypto/ F: drivers/crypto/ @@@ -3766,13 -3713,6 +3766,13 @@@ S: Supporte F: drivers/infiniband/hw/cxgb4/ F: include/uapi/rdma/cxgb4-abi.h
+CXGB4 CRYPTO DRIVER (chcr) +M: Harsh Jain harsh@chelsio.com +L: linux-crypto@vger.kernel.org +W: http://www.chelsio.com +S: Supported +F: drivers/crypto/chelsio + CXGB4VF ETHERNET DRIVER (CXGB4VF) M: Casey Leedom leedom@chelsio.com L: netdev@vger.kernel.org @@@ -3781,8 -3721,8 +3781,8 @@@ S: Supporte F: drivers/net/ethernet/chelsio/cxgb4vf/
CXL (IBM Coherent Accelerator Processor Interface CAPI) DRIVER -M: Ian Munsie imunsie@au1.ibm.com M: Frederic Barrat fbarrat@linux.vnet.ibm.com +M: Andrew Donnellan andrew.donnellan@au1.ibm.com L: linuxppc-dev@lists.ozlabs.org S: Supported F: arch/powerpc/platforms/powernv/pci-cxl.c @@@ -3846,12 -3786,6 +3846,12 @@@ S: Supporte F: drivers/input/touchscreen/cyttsp* F: include/linux/input/cyttsp.h
+D-LINK DIR-685 TOUCHKEYS DRIVER +M: Linus Walleij linus.walleij@linaro.org +L: linux-input@vger.kernel.org +S: Supported +F: drivers/input/dlink-dir685-touchkeys.c + DALLAS/MAXIM DS1685-FAMILY REAL TIME CLOCK M: Joshua Kinard kumba@gentoo.org S: Maintained @@@ -4054,10 -3988,7 +4054,10 @@@ W: http://www.dialog-semiconductor.com/ S: Supported F: Documentation/hwmon/da90?? F: Documentation/devicetree/bindings/mfd/da90*.txt +F: Documentation/devicetree/bindings/input/da90??-onkey.txt +F: Documentation/devicetree/bindings/thermal/da90??-thermal.txt F: Documentation/devicetree/bindings/regulator/da92*.txt +F: Documentation/devicetree/bindings/watchdog/da92??-wdt.txt F: Documentation/devicetree/bindings/sound/da[79]*.txt F: drivers/gpio/gpio-da90??.c F: drivers/hwmon/da90??-hwmon.c @@@ -4072,7 -4003,6 +4072,7 @@@ F: drivers/power/supply/da9052-battery. F: drivers/power/supply/da91??-*.c F: drivers/regulator/da903x.c F: drivers/regulator/da9???-regulator.[ch] +F: drivers/thermal/da90??-thermal.c F: drivers/rtc/rtc-da90??.c F: drivers/video/backlight/da90??_bl.c F: drivers/watchdog/da90??_wdt.c @@@ -4213,7 -4143,8 +4213,7 @@@ M: Jonathan Corbet <corbet@lwn.net L: linux-doc@vger.kernel.org S: Maintained F: Documentation/ -F: scripts/docproc.c -F: scripts/kernel-doc* +F: scripts/kernel-doc X: Documentation/ABI/ X: Documentation/devicetree/ X: Documentation/acpi @@@ -4304,6 -4235,12 +4304,12 @@@ F: include/drm/drm F: include/uapi/drm/drm* F: include/linux/vga*
+ DRM DRIVER FOR ARM PL111 CLCD + M: Eric Anholt eric@anholt.net + T: git git://anongit.freedesktop.org/drm/drm-misc + S: Supported + F: drivers/gpu/drm/pl111/ + DRM DRIVER FOR AST SERVER GRAPHICS CHIPS M: Dave Airlie airlied@redhat.com S: Odd Fixes @@@ -4311,6 -4248,8 +4317,8 @@@ F: drivers/gpu/drm/ast
DRM DRIVERS FOR BRIDGE CHIPS M: Archit Taneja architt@codeaurora.org + M: Andrzej Hajda a.hajda@samsung.com + R: Laurent Pinchart Laurent.pinchart@ideasonboard.com S: Maintained T: git git://anongit.freedesktop.org/drm/drm-misc F: drivers/gpu/drm/bridge/ @@@ -4567,6 -4506,17 +4575,17 @@@ S: Maintaine F: drivers/gpu/drm/sti F: Documentation/devicetree/bindings/display/st,stih4xx.txt
+ DRM DRIVERS FOR STM + M: Yannick Fertre yannick.fertre@st.com + M: Philippe Cornu philippe.cornu@st.com + M: Benjamin Gaignard benjamin.gaignard@linaro.org + M: Vincent Abriou vincent.abriou@st.com + L: dri-devel@lists.freedesktop.org + T: git git://anongit.freedesktop.org/drm/drm-misc + S: Maintained + F: drivers/gpu/drm/stm + F: Documentation/devicetree/bindings/display/st,stm32-ltdc.txt + DRM DRIVER FOR TDFX VIDEO CARDS S: Orphan / Obsolete F: drivers/gpu/drm/tdfx/ @@@ -4761,13 -4711,6 +4780,13 @@@ S: Maintaine F: drivers/media/usb/dvb-usb-v2/dvb_usb* F: drivers/media/usb/dvb-usb-v2/usb_urb.c
+DONGWOON DW9714 LENS VOICE COIL DRIVER +M: Sakari Ailus sakari.ailus@linux.intel.com +L: linux-media@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +S: Maintained +F: drivers/media/i2c/dw9714.c + DYNAMIC DEBUG M: Jason Baron jbaron@akamai.com S: Maintained @@@ -5075,12 -5018,6 +5094,12 @@@ T: git git://git.kernel.org/pub/scm/lin F: drivers/video/fbdev/s1d13xxxfb.c F: include/video/s1d13xxxfb.h
+ERRSEQ ERROR TRACKING INFRASTRUCTURE +M: Jeff Layton jlayton@poochiereds.net +S: Maintained +F: lib/errseq.c +F: include/linux/errseq.h + ET131X NETWORK DRIVER M: Mark Einon mark.einon@gmail.com S: Odd Fixes @@@ -5364,7 -5301,7 +5383,7 @@@ S: Maintaine F: drivers/video/fbdev/fsl-diu-fb.*
FREESCALE DMA DRIVER -M: Li Yang leoli@freescale.com +M: Li Yang leoyang.li@nxp.com M: Zhang Wei zw@zh-kernel.org L: linuxppc-dev@lists.ozlabs.org S: Maintained @@@ -5429,11 -5366,11 +5448,11 @@@ S: Maintaine F: drivers/net/ethernet/freescale/dpaa
FREESCALE SOC DRIVERS -M: Scott Wood oss@buserror.net +M: Li Yang leoyang.li@nxp.com L: linuxppc-dev@lists.ozlabs.org L: linux-arm-kernel@lists.infradead.org S: Maintained -F: Documentation/devicetree/bindings/powerpc/fsl/ +F: Documentation/devicetree/bindings/soc/fsl/ F: drivers/soc/fsl/ F: include/linux/fsl/
@@@ -5446,14 -5383,14 +5465,14 @@@ F: include/soc/fsl/*qe*. F: include/soc/fsl/*ucc*.h
FREESCALE USB PERIPHERAL DRIVERS -M: Li Yang leoli@freescale.com +M: Li Yang leoyang.li@nxp.com L: linux-usb@vger.kernel.org L: linuxppc-dev@lists.ozlabs.org S: Maintained F: drivers/usb/gadget/udc/fsl*
FREESCALE QUICC ENGINE UCC ETHERNET DRIVER -M: Li Yang leoli@freescale.com +M: Li Yang leoyang.li@nxp.com L: netdev@vger.kernel.org L: linuxppc-dev@lists.ozlabs.org S: Maintained @@@ -5763,15 -5700,6 +5782,15 @@@ F: include/asm-generic/gpio. F: include/uapi/linux/gpio.h F: tools/gpio/
+GPIO ACPI SUPPORT +M: Mika Westerberg mika.westerberg@linux.intel.com +M: Andy Shevchenko andriy.shevchenko@linux.intel.com +L: linux-gpio@vger.kernel.org +L: linux-acpi@vger.kernel.org +S: Maintained +F: Documentation/acpi/gpio-properties.txt +F: drivers/gpio/gpiolib-acpi.c + GRE DEMULTIPLEXER DRIVER M: Dmitry Kozlov xeb@mail.ru L: netdev@vger.kernel.org @@@ -6116,7 -6044,7 +6135,7 @@@ F: drivers/hid/hid-sensor- F: drivers/iio/*/hid-* F: include/linux/hid-sensor-*
-HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS +HIGH-RESOLUTION TIMERS, CLOCKEVENTS M: Thomas Gleixner tglx@linutronix.de L: linux-kernel@vger.kernel.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core @@@ -6124,6 -6052,7 +6143,6 @@@ S: Maintaine F: Documentation/timers/ F: kernel/time/hrtimer.c F: kernel/time/clockevents.c -F: kernel/time/tick*.* F: kernel/time/timer_*.c F: include/linux/clockchips.h F: include/linux/hrtimer.h @@@ -6516,7 -6445,7 +6535,7 @@@ F: Documentation/cdrom/ide-c F: drivers/ide/ide-cd*
IEEE 802.15.4 SUBSYSTEM -M: Alexander Aring aar@pengutronix.de +M: Alexander Aring alex.aring@gmail.com M: Stefan Schmidt stefan@osg.samsung.com L: linux-wpan@vger.kernel.org W: http://wpan.cakelab.org/ @@@ -6570,13 -6499,6 +6589,13 @@@ F: Documentation/ABI/testing/sysfs-bus- F: Documentation/devicetree/bindings/iio/adc/envelope-detector.txt F: drivers/iio/adc/envelope-detector.c
+IIO MULTIPLEXER +M: Peter Rosin peda@axentia.se +L: linux-iio@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/iio/multiplexer/iio-mux.txt +F: drivers/iio/multiplexer/iio-mux.c + IIO SUBSYSTEM AND DRIVERS M: Jonathan Cameron jic23@kernel.org R: Hartmut Knaack knaack.h@gmx.de @@@ -6694,10 -6616,8 +6713,10 @@@ S: Maintaine F: drivers/input/ F: include/linux/input.h F: include/uapi/linux/input.h +F: include/uapi/linux/input-event-codes.h F: include/linux/input/ F: Documentation/devicetree/bindings/input/ +F: Documentation/input/
INPUT MULTITOUCH (MT) PROTOCOL M: Henrik Rydberg rydberg@bitmath.org @@@ -6707,12 -6627,6 +6726,12 @@@ F: Documentation/input/multi-touch-prot F: drivers/input/input-mt.c K: \b(ABS|SYN)_MT_
+INSIDE SECURE CRYPTO DRIVER +M: Antoine Tenart antoine.tenart@free-electrons.com +F: drivers/crypto/inside-secure/ +S: Maintained +L: linux-crypto@vger.kernel.org + INTEL ASoC BDW/HSW DRIVERS M: Jie Yang yang.jie@linux.intel.com L: alsa-devel@alsa-project.org (moderated for non-subscribers) @@@ -6842,7 -6756,6 +6861,7 @@@ F: Documentation/networking/i40e.tx F: Documentation/networking/i40evf.txt F: drivers/net/ethernet/intel/ F: drivers/net/ethernet/intel/*/ +F: include/linux/avf/virtchnl.h
INTEL RDMA RNIC DRIVER M: Faisal Latif faisal.latif@intel.com @@@ -7350,10 -7263,9 +7369,10 @@@ KERNEL SELFTEST FRAMEWOR M: Shuah Khan shuahkh@osg.samsung.com M: Shuah Khan shuah@kernel.org L: linux-kselftest@vger.kernel.org -T: git git://git.kernel.org/pub/scm/shuah/linux-kselftest +T: git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git S: Maintained -F: tools/testing/selftests +F: tools/testing/selftests/ +F: Documentation/dev-tools/kselftest*
KERNEL VIRTUAL MACHINE (KVM) M: Paolo Bonzini pbonzini@redhat.com @@@ -7392,7 -7304,7 +7411,7 @@@ F: arch/powerpc/kvm
KERNEL VIRTUAL MACHINE for s390 (KVM/s390) M: Christian Borntraeger borntraeger@de.ibm.com -M: Cornelia Huck cornelia.huck@de.ibm.com +M: Cornelia Huck cohuck@redhat.com L: linux-s390@vger.kernel.org W: http://www.ibm.com/developerworks/linux/linux390/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git @@@ -7455,7 -7367,7 +7474,7 @@@ KEYS/KEYRINGS M: David Howells dhowells@redhat.com L: keyrings@vger.kernel.org S: Maintained -F: Documentation/security/keys.txt +F: Documentation/security/keys/core.rst F: include/linux/key.h F: include/linux/key-type.h F: include/linux/keyctl.h @@@ -7469,7 -7381,7 +7488,7 @@@ M: Mimi Zohar <zohar@linux.vnet.ibm.com L: linux-security-module@vger.kernel.org L: keyrings@vger.kernel.org S: Supported -F: Documentation/security/keys-trusted-encrypted.txt +F: Documentation/security/keys/trusted-encrypted.rst F: include/keys/trusted-type.h F: security/keys/trusted.c F: security/keys/trusted.h @@@ -7480,7 -7392,7 +7499,7 @@@ M: David Safford <safford@us.ibm.com L: linux-security-module@vger.kernel.org L: keyrings@vger.kernel.org S: Supported -F: Documentation/security/keys-trusted-encrypted.txt +F: Documentation/security/keys/trusted-encrypted.rst F: include/keys/encrypted-type.h F: security/keys/encrypted-keys/
@@@ -7490,7 -7402,7 +7509,7 @@@ W: http://kgdb.wiki.kernel.org L: kgdb-bugreport@lists.sourceforge.net T: git git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/kgdb.git S: Maintained -F: Documentation/DocBook/kgdb.tmpl +F: Documentation/dev-tools/kgdb.rst F: drivers/misc/kgdbts.c F: drivers/tty/serial/kgdboc.c F: include/linux/kdb.h @@@ -7644,15 -7556,6 +7663,15 @@@ S: Maintaine F: drivers/ata/pata_*.c F: drivers/ata/ata_generic.c
+LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS +M: Linus Walleij linus.walleij@linaro.org +L: linux-ide@vger.kernel.org +T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git +S: Maintained +F: drivers/ata/pata_ftide010.c +F: drivers/ata/sata_gemini.c +F: drivers/ata/sata_gemini.h + LIBATA SATA AHCI PLATFORM devices support M: Hans de Goede hdegoede@redhat.com M: Tejun Heo tj@kernel.org @@@ -7671,7 -7574,7 +7690,7 @@@ S: Maintaine F: drivers/ata/sata_promise.*
LIBLOCKDEP -M: Sasha Levin sasha.levin@oracle.com +M: Sasha Levin alexander.levin@verizon.com S: Maintained F: tools/lib/lockdep/
@@@ -7707,7 -7610,9 +7726,7 @@@ M: Ross Zwisler <ross.zwisler@linux.int L: linux-nvdimm@lists.01.org Q: https://patchwork.kernel.org/project/linux-nvdimm/list/ S: Supported -F: drivers/nvdimm/pmem.c -F: include/linux/pmem.h -F: arch/*/include/asm/pmem.h +F: drivers/nvdimm/pmem*
LIGHTNVM PLATFORM SUPPORT M: Matias Bjorling mb@lightnvm.io @@@ -7798,7 -7703,6 +7817,7 @@@ T: git git://git.kernel.org/pub/scm/lin S: Maintained F: arch/powerpc/platforms/83xx/ F: arch/powerpc/platforms/85xx/ +F: Documentation/devicetree/bindings/powerpc/fsl/
LINUX FOR POWERPC PA SEMI PWRFICIENT L: linuxppc-dev@lists.ozlabs.org @@@ -8092,12 -7996,6 +8111,12 @@@ S: Maintaine F: drivers/net/ethernet/marvell/mv643xx_eth.* F: include/linux/mv643xx.h
+MARVELL MV88X3310 PHY DRIVER +M: Russell King rmk@armlinux.org.uk +L: netdev@vger.kernel.org +S: Maintained +F: drivers/net/phy/marvell10g.c + MARVELL MVNETA ETHERNET DRIVER M: Thomas Petazzoni thomas.petazzoni@free-electrons.com L: netdev@vger.kernel.org @@@ -8151,16 -8049,6 +8170,16 @@@ S: Maintaine F: Documentation/hwmon/max20751 F: drivers/hwmon/max20751.c
+MAX2175 SDR TUNER DRIVER +M: Ramesh Shanmugasundaram ramesh.shanmugasundaram@bp.renesas.com +L: linux-media@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +S: Maintained +F: Documentation/devicetree/bindings/media/i2c/max2175.txt +F: Documentation/media/v4l-drivers/max2175.rst +F: drivers/media/i2c/max2175* +F: include/uapi/linux/max2175.h + MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER L: linux-hwmon@vger.kernel.org S: Orphan @@@ -8191,11 -8079,11 +8210,11 @@@ S: Supporte F: drivers/power/supply/max14577_charger.c F: drivers/power/supply/max77693_charger.c
-MAXIM MAX77802 MULTIFUNCTION PMIC DEVICE DRIVERS -M: Javier Martinez Canillas javier@osg.samsung.com +MAXIM MAX77802 PMIC REGULATOR DEVICE DRIVER +M: Javier Martinez Canillas javier@dowhile0.org L: linux-kernel@vger.kernel.org S: Supported -F: drivers/*/*max77802*.c +F: drivers/regulator/max77802-regulator.c F: Documentation/devicetree/bindings/*/*max77802.txt F: include/dt-bindings/*/*max77802.h
@@@ -8241,27 -8129,6 +8260,27 @@@ L: linux-iio@vger.kernel.or S: Maintained F: drivers/iio/dac/cio-dac.c
+MEDIA DRIVERS FOR RENESAS - DRIF +M: Ramesh Shanmugasundaram ramesh.shanmugasundaram@bp.renesas.com +L: linux-media@vger.kernel.org +L: linux-renesas-soc@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +S: Supported +F: Documentation/devicetree/bindings/media/renesas,drif.txt +F: drivers/media/platform/rcar_drif.c + +MEDIA DRIVERS FOR FREESCALE IMX +M: Steve Longerbeam slongerbeam@gmail.com +M: Philipp Zabel p.zabel@pengutronix.de +L: linux-media@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +S: Maintained +F: Documentation/devicetree/bindings/media/imx.txt +F: Documentation/media/v4l-drivers/imx.rst +F: drivers/staging/media/imx/ +F: include/linux/imx-media.h +F: include/media/imx.h + MEDIA DRIVERS FOR RENESAS - FCP M: Laurent Pinchart laurent.pinchart@ideasonboard.com L: linux-media@vger.kernel.org @@@ -8419,11 -8286,6 +8438,11 @@@ L: linux-wireless@vger.kernel.or S: Maintained F: drivers/net/wireless/mediatek/mt7601u/
+MEDIATEK RANDOM NUMBER GENERATOR SUPPORT +M: Sean Wang sean.wang@mediatek.com +S: Maintained +F: drivers/char/hw_random/mtk-rng.c + MEGACHIPS STDPXXXX-GE-B850V3-FW LVDS/DP++ BRIDGES M: Peter Senna Tschudin peter.senna@collabora.com M: Martin Donnelly martin.donnelly@ge.com @@@ -8467,26 -8329,6 +8486,26 @@@ W: http://www.mellanox.co Q: http://patchwork.ozlabs.org/project/netdev/list/ F: drivers/net/ethernet/mellanox/mlx5/core/en_*
+MELLANOX ETHERNET INNOVA DRIVER +M: Ilan Tayari ilant@mellanox.com +R: Boris Pismenny borisp@mellanox.com +L: netdev@vger.kernel.org +S: Supported +W: http://www.mellanox.com +Q: http://patchwork.ozlabs.org/project/netdev/list/ +F: drivers/net/ethernet/mellanox/mlx5/core/fpga/* +F: include/linux/mlx5/mlx5_ifc_fpga.h + +MELLANOX ETHERNET INNOVA IPSEC DRIVER +M: Ilan Tayari ilant@mellanox.com +R: Boris Pismenny borisp@mellanox.com +L: netdev@vger.kernel.org +S: Supported +W: http://www.mellanox.com +Q: http://patchwork.ozlabs.org/project/netdev/list/ +F: drivers/net/ethernet/mellanox/mlx5/core/en_ipsec/* +F: drivers/net/ethernet/mellanox/mlx5/core/ipsec* + MELLANOX ETHERNET SWITCH DRIVERS M: Jiri Pirko jiri@mellanox.com M: Ido Schimmel idosch@mellanox.com @@@ -8496,14 -8338,6 +8515,14 @@@ W: http://www.mellanox.co Q: http://patchwork.ozlabs.org/project/netdev/list/ F: drivers/net/ethernet/mellanox/mlxsw/
+MELLANOX FIRMWARE FLASH LIBRARY (mlxfw) +M: Yotam Gigi yotamg@mellanox.com +L: netdev@vger.kernel.org +S: Supported +W: http://www.mellanox.com +Q: http://patchwork.ozlabs.org/project/netdev/list/ +F: drivers/net/ethernet/mellanox/mlxfw/ + MELLANOX MLXCPLD I2C AND MUX DRIVER M: Vadim Pasternak vadimp@mellanox.com M: Michael Shych michaelsh@mellanox.com @@@ -8622,7 -8456,7 +8641,7 @@@ T: git git://git.monstr.eu/linux-2.6-mi S: Supported F: arch/microblaze/
-MICROCHIP / ATMEL AT91 / AT32 SERIAL DRIVER +MICROCHIP / ATMEL AT91 SERIAL DRIVER M: Richard Genoud richard.genoud@gmail.com S: Maintained F: drivers/tty/serial/atmel_serial.c @@@ -8645,16 -8479,6 +8664,16 @@@ F: drivers/media/platform/atmel/atmel-i F: drivers/media/platform/atmel/atmel-isc-regs.h F: devicetree/bindings/media/atmel-isc.txt
+MICROCHIP KSZ SERIES ETHERNET SWITCH DRIVER +M: Woojung Huh Woojung.Huh@microchip.com +M: Microchip Linux Driver Support UNGLinuxDriver@microchip.com +L: netdev@vger.kernel.org +S: Maintained +F: net/dsa/tag_ksz.c +F: drivers/net/dsa/microchip/* +F: include/linux/platform_data/microchip-ksz.h +F: Documentation/devicetree/bindings/net/dsa/ksz.txt + MICROCHIP USB251XB DRIVER M: Richard Leitner richard.leitner@skidata.com L: linux-usb@vger.kernel.org @@@ -8910,15 -8734,6 +8929,15 @@@ S: Orpha F: drivers/mmc/host/mmc_spi.c F: include/linux/spi/mmc_spi.h
+MULTIPLEXER SUBSYSTEM +M: Peter Rosin peda@axentia.se +S: Maintained +F: Documentation/ABI/testing/mux/sysfs-class-mux* +F: Documentation/devicetree/bindings/mux/ +F: include/linux/dt-bindings/mux/ +F: include/linux/mux/ +F: drivers/mux/ + MULTISOUND SOUND DRIVER M: Andrew Veliath andrewtv@usa.net S: Maintained @@@ -9136,7 -8951,9 +9155,7 @@@ F: lib/random32. NETWORKING [IPv4/IPv6] M: "David S. Miller" davem@davemloft.net M: Alexey Kuznetsov kuznet@ms2.inr.ac.ru -M: James Morris jmorris@namei.org M: Hideaki YOSHIFUJI yoshfuji@linux-ipv6.org -M: Patrick McHardy kaber@trash.net L: netdev@vger.kernel.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git S: Maintained @@@ -9145,16 -8962,6 +9164,16 @@@ F: net/ipv6 F: include/net/ip* F: arch/x86/net/*
+NETWORKING [TLS] +M: Ilya Lesokhin ilyal@mellanox.com +M: Aviad Yehezkel aviadye@mellanox.com +M: Dave Watson davejwatson@fb.com +L: netdev@vger.kernel.org +S: Maintained +F: net/tls/* +F: include/uapi/linux/tls.h +F: include/net/tls.h + NETWORKING [IPSEC] M: Steffen Klassert steffen.klassert@secunet.com M: Herbert Xu herbert@gondor.apana.org.au @@@ -9236,6 -9043,9 +9255,6 @@@ F: include/uapi/linux/nfc. F: drivers/nfc/ F: include/linux/platform_data/nfcmrvl.h F: include/linux/platform_data/nxp-nci.h -F: include/linux/platform_data/pn544.h -F: include/linux/platform_data/st21nfca.h -F: include/linux/platform_data/st-nci.h F: Documentation/devicetree/bindings/net/nfc/
NFS, SUNRPC, AND LOCKD CLIENTS @@@ -9290,17 -9100,6 +9309,17 @@@ T: git git://git.kernel.org/pub/scm/lin S: Maintained F: arch/nios2/
+NOHZ, DYNTICKS SUPPORT +M: Frederic Weisbecker fweisbec@gmail.com +M: Thomas Gleixner tglx@linutronix.de +M: Ingo Molnar mingo@kernel.org +L: linux-kernel@vger.kernel.org +T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/nohz +S: Maintained +F: kernel/time/tick*.* +F: include/linux/tick.h +F: include/linux/sched/nohz.h + NOKIA N900 CAMERA SUPPORT (ET8EK8 SENSOR, AD5820 FOCUS) M: Pavel Machek pavel@ucw.cz M: Sakari Ailus sakari.ailus@iki.fi @@@ -9638,13 -9437,6 +9657,13 @@@ M: Harald Welte <laforge@gnumonks.org S: Maintained F: drivers/char/pcmcia/cm4040_cs.*
+OMNIVISION OV5640 SENSOR DRIVER +M: Steve Longerbeam slongerbeam@gmail.com +L: linux-media@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +S: Maintained +F: drivers/media/i2c/ov5640.c + OMNIVISION OV5647 SENSOR DRIVER M: Ramiro Oliveira roliveir@synopsys.com L: linux-media@vger.kernel.org @@@ -9660,13 -9452,6 +9679,13 @@@ S: Maintaine F: drivers/media/i2c/ov7670.c F: Documentation/devicetree/bindings/media/i2c/ov7670.txt
+OMNIVISION OV13858 SENSOR DRIVER +M: Sakari Ailus sakari.ailus@linux.intel.com +L: linux-media@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +S: Maintained +F: drivers/media/i2c/ov13858.c + ONENAND FLASH DRIVER M: Kyungmin Park kyungmin.park@samsung.com L: linux-mtd@lists.infradead.org @@@ -9701,7 -9486,6 +9720,7 @@@ S: Maintaine F: drivers/of/ F: include/linux/of*.h F: scripts/dtc/ +F: Documentation/ABI/testing/sysfs-firmware-ofw
OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS M: Rob Herring robh+dt@kernel.org @@@ -10170,16 -9954,9 +10189,16 @@@ S: Maintaine F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt F: drivers/pci/dwc/pcie-hisi.c
+PCIE DRIVER FOR HISILICON KIRIN +M: Xiaowei Song songxiaowei@hisilicon.com +M: Binghui Wang wangbinghui@hisilicon.com +L: linux-pci@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/pci/pcie-kirin.txt +F: drivers/pci/dwc/pcie-kirin.c + PCIE DRIVER FOR ROCKCHIP M: Shawn Lin shawn.lin@rock-chips.com -M: Wenrui Li wenrui.li@rock-chips.com L: linux-pci@vger.kernel.org L: linux-rockchip@lists.infradead.org S: Maintained @@@ -10201,14 -9978,6 +10220,14 @@@ S: Supporte F: Documentation/devicetree/bindings/pci/pci-thunder-* F: drivers/pci/host/pci-thunder-*
+PCIE DRIVER FOR MEDIATEK +M: Ryder Lee ryder.lee@mediatek.com +L: linux-pci@vger.kernel.org +L: linux-mediatek@lists.infradead.org +S: Supported +F: Documentation/devicetree/bindings/pci/mediatek* +F: drivers/pci/host/*mediatek* + PCMCIA SUBSYSTEM P: Linux PCMCIA Team L: linux-pcmcia@lists.infradead.org @@@ -10333,13 -10102,6 +10352,13 @@@ M: Heikki Krogerus <heikki.krogerus@lin S: Maintained F: drivers/pinctrl/intel/
+PIN CONTROLLER - QUALCOMM +M: Bjorn Andersson bjorn.andersson@linaro.org +S: Maintained +L: linux-arm-msm@vger.kernel.org +F: Documentation/devicetree/bindings/pinctrl/qcom,*.txt +F: drivers/pinctrl/qcom/ + PIN CONTROLLER - RENESAS M: Laurent Pinchart laurent.pinchart@ideasonboard.com M: Geert Uytterhoeven geert+renesas@glider.be @@@ -10411,7 -10173,7 +10430,7 @@@ T: git git://git.kernel.org/pub/scm/lin S: Maintained F: Documentation/hwmon/pmbus F: drivers/hwmon/pmbus/ -F: include/linux/i2c/pmbus.h +F: include/linux/pmbus.h
PMC SIERRA MaxRAID DRIVER L: linux-scsi@vger.kernel.org @@@ -10801,7 -10563,6 +10820,7 @@@ M: Laurentiu Tudor <laurentiu.tudor@nxp L: linux-kernel@vger.kernel.org S: Maintained F: drivers/staging/fsl-mc/ +F: Documentation/devicetree/bindings/misc/fsl,qoriq-mc.txt
QT1010 MEDIA DRIVER M: Antti Palosaari crope@iki.fi @@@ -10841,14 -10602,6 +10860,14 @@@ T: git git://git.kernel.org/pub/scm/lin S: Supported F: arch/hexagon/
+QUALCOMM VENUS VIDEO ACCELERATOR DRIVER +M: Stanimir Varbanov stanimir.varbanov@linaro.org +L: linux-media@vger.kernel.org +L: linux-arm-msm@vger.kernel.org +T: git git://linuxtv.org/media_tree.git +S: Maintained +F: drivers/media/platform/qcom/venus/ + QUALCOMM WCN36XX WIRELESS DRIVER M: Eugene Krasnikov k.eugene.e@gmail.com L: wcn36xx@lists.infradead.org @@@ -10864,14 -10617,6 +10883,14 @@@ L: qemu-devel@nongnu.or S: Maintained F: drivers/firmware/qemu_fw_cfg.c
+QUANTENNA QTNFMAC WIRELESS DRIVER +M: Igor Mitsyanko imitsyanko@quantenna.com +M: Avinash Patil avinashp@quantenna.com +M: Sergey Matyukevich smatyukevich@quantenna.com +L: linux-wireless@vger.kernel.org +S: Maintained +F: drivers/net/wireless/quantenna + RADOS BLOCK DEVICE (RBD) M: Ilya Dryomov idryomov@gmail.com M: Sage Weil sage@redhat.com @@@ -11105,11 -10850,11 +11124,11 @@@ L: linux-iio@vger.kernel.or S: Supported F: drivers/iio/adc/rcar_gyro_adc.c
-RENESAS USB2 PHY DRIVER +RENESAS USB PHY DRIVER M: Yoshihiro Shimoda yoshihiro.shimoda.uh@renesas.com L: linux-renesas-soc@vger.kernel.org S: Maintained -F: drivers/phy/phy-rcar-gen3-usb2.c +F: drivers/phy/renesas/phy-rcar-gen3-usb*.c
RESET CONTROLLER FRAMEWORK M: Philipp Zabel p.zabel@pengutronix.de @@@ -11266,7 -11011,7 +11285,7 @@@ S: Supporte F: arch/s390/ F: drivers/s390/ F: Documentation/s390/ -F: Documentation/DocBook/s390* +F: Documentation/driver-api/s390-drivers.rst
S390 COMMON I/O LAYER M: Sebastian Ott sebott@linux.vnet.ibm.com @@@ -11334,7 -11079,7 +11353,7 @@@ S: Supporte F: drivers/iommu/s390-iommu.c
S390 VFIO-CCW DRIVER -M: Cornelia Huck cornelia.huck@de.ibm.com +M: Cornelia Huck cohuck@redhat.com M: Dong Jia Shi bjsdjshi@linux.vnet.ibm.com L: linux-s390@vger.kernel.org L: kvm@vger.kernel.org @@@ -11511,12 -11256,12 +11530,12 @@@ L: linux-kernel@vger.kernel.or S: Supported F: Documentation/devicetree/bindings/phy/samsung-phy.txt F: Documentation/phy/samsung-usb2.txt -F: drivers/phy/phy-exynos4210-usb2.c -F: drivers/phy/phy-exynos4x12-usb2.c -F: drivers/phy/phy-exynos5250-usb2.c -F: drivers/phy/phy-s5pv210-usb2.c -F: drivers/phy/phy-samsung-usb2.c -F: drivers/phy/phy-samsung-usb2.h +F: drivers/phy/samsung/phy-exynos4210-usb2.c +F: drivers/phy/samsung/phy-exynos4x12-usb2.c +F: drivers/phy/samsung/phy-exynos5250-usb2.c +F: drivers/phy/samsung/phy-s5pv210-usb2.c +F: drivers/phy/samsung/phy-samsung-usb2.c +F: drivers/phy/samsung/phy-samsung-usb2.h
SERIAL DRIVERS M: Greg Kroah-Hartman gregkh@linuxfoundation.org @@@ -11600,9 -11345,6 +11619,9 @@@ F: Documentation/tee.tx
THUNDERBOLT DRIVER M: Andreas Noever andreas.noever@gmail.com +M: Michael Jamet michael.jamet@intel.com +M: Mika Westerberg mika.westerberg@linux.intel.com +M: Yehezkel Bernat yehezkel.bernat@intel.com S: Maintained F: drivers/thunderbolt/
@@@ -11630,14 -11372,6 +11649,14 @@@ F: kernel/time/alarmtimer. F: kernel/time/ntp.c F: tools/testing/selftests/timers/
+TI TRF7970A NFC DRIVER +M: Mark Greer mgreer@animalcreek.com +L: linux-wireless@vger.kernel.org +L: linux-nfc@lists.01.org (moderated for non-subscribers) +S: Supported +F: drivers/nfc/trf7970a.c +F: Documentation/devicetree/bindings/net/nfc/trf7970a.txt + SC1200 WDT DRIVER M: Zwane Mwaikambo zwanem@gmail.com S: Maintained @@@ -11778,8 -11512,6 +11797,8 @@@ F: kernel/seccomp. F: include/uapi/linux/seccomp.h F: include/linux/seccomp.h F: tools/testing/selftests/seccomp/* +F: tools/testing/selftests/kselftest_harness.h +F: Documentation/userspace-api/seccomp_filter.rst K: \bsecure_computing K: \bTIF_SECCOMP\b
@@@ -11838,7 -11570,6 +11857,7 @@@ S: Supporte F: include/linux/selinux* F: security/selinux/ F: scripts/selinux/ +F: Documentation/admin-guide/LSM/SELinux.rst
APPARMOR SECURITY MODULE M: John Johansen john.johansen@canonical.com @@@ -11847,21 -11578,18 +11866,21 @@@ W: apparmor.wiki.kernel.or T: git git://git.kernel.org/pub/scm/linux/kernel/git/jj/apparmor-dev.git S: Supported F: security/apparmor/ +F: Documentation/admin-guide/LSM/apparmor.rst
LOADPIN SECURITY MODULE M: Kees Cook keescook@chromium.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git lsm/loadpin S: Supported F: security/loadpin/ +F: Documentation/admin-guide/LSM/LoadPin.rst
YAMA SECURITY MODULE M: Kees Cook keescook@chromium.org T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git yama/tip S: Supported F: security/yama/ +F: Documentation/admin-guide/LSM/Yama.rst
SENSABLE PHANTOM M: Jiri Slaby jirislaby@gmail.com @@@ -12079,13 -11807,6 +12098,13 @@@ S: Maintaine F: drivers/media/platform/davinci/ F: include/media/davinci/
+TI DAVINCI SERIES GPIO DRIVER +M: Keerthy j-keerthy@ti.com +L: linux-gpio@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/gpio/gpio-davinci.txt +F: drivers/gpio/gpio-davinci.c + TI AM437X VPFE DRIVER M: "Lad, Prabhakar" prabhakar.csengg@gmail.com L: linux-media@vger.kernel.org @@@ -12171,7 -11892,7 +12190,7 @@@ L: linux-security-module@vger.kernel.or W: http://schaufler-ca.com T: git git://github.com/cschaufler/smack-next S: Maintained -F: Documentation/security/Smack.txt +F: Documentation/admin-guide/LSM/Smack.rst F: security/smack/
DRIVERS FOR ADAPTIVE VOLTAGE SCALING (AVS) @@@ -12261,9 -11982,8 +12280,9 @@@ F: drivers/leds/leds-net48xx.
SOFTLOGIC 6x10 MPEG CODEC M: Bluecherry Maintainers maintainers@bluecherrydvr.com +M: Anton Sviridenko anton@corp.bluecherry.net M: Andrey Utkin andrey.utkin@corp.bluecherry.net -M: Andrey Utkin andrey.krieger.utkin@gmail.com +M: Andrey Utkin andrey_utkin@fastmail.com M: Ismael Luceno ismael@iodev.co.uk L: linux-media@vger.kernel.org S: Supported @@@ -12931,10 -12651,6 +12950,10 @@@ F: include/linux/soc/ti/ti_sci_protocol F: Documentation/devicetree/bindings/soc/ti/sci-pm-domain.txt F: include/dt-bindings/genpd/k2g.h F: drivers/soc/ti/ti_sci_pm_domains.c +F: Documentation/devicetree/bindings/reset/ti,sci-reset.txt +F: Documentation/devicetree/bindings/clock/ti,sci-clk.txt +F: drivers/clk/keystone/sci-clk.c +F: drivers/reset/reset-ti-sci.c
THANKO'S RAREMONO AM/FM/SW RADIO RECEIVER USB DRIVER M: Hans Verkuil hverkuil@xs4all.nl @@@ -13184,7 -12900,7 +13203,7 @@@ M: Wolfram Sang <wsa+renesas@sang-engin L: linux-mmc@vger.kernel.org S: Supported F: drivers/mmc/host/tmio_mmc* -F: drivers/mmc/host/sh_mobile_sdhi.c +F: drivers/mmc/host/renesas_sdhi* F: include/linux/mfd/tmio.h
TMP401 HARDWARE MONITOR DRIVER @@@ -13213,7 -12929,6 +13232,7 @@@ F: Documentation/media/v4l-drivers/tm60
TW5864 VIDEO4LINUX DRIVER M: Bluecherry Maintainers maintainers@bluecherrydvr.com +M: Anton Sviridenko anton@corp.bluecherry.net M: Andrey Utkin andrey.utkin@corp.bluecherry.net M: Andrey Utkin andrey_utkin@fastmail.com L: linux-media@vger.kernel.org @@@ -13766,17 -13481,6 +13785,17 @@@ W: http://en.wikipedia.org/wiki/Util-li T: git git://git.kernel.org/pub/scm/utils/util-linux/util-linux.git S: Maintained
+UUID HELPERS +M: Christoph Hellwig hch@lst.de +R: Andy Shevchenko andriy.shevchenko@linux.intel.com +L: linux-kernel@vger.kernel.org +T: git git://git.infradead.org/users/hch/uuid.git +F: lib/uuid.c +F: lib/test_uuid.c +F: include/linux/uuid.h +F: include/uapi/linux/uuid.h +S: Maintained + UVESAFB DRIVER M: Michal Januszewski spock@gentoo.org L: linux-fbdev@vger.kernel.org @@@ -13839,12 -13543,6 +13858,12 @@@ S: Maintaine F: drivers/media/v4l2-core/videobuf2-* F: include/media/videobuf2-*
+VIDEO MULTIPLEXER DRIVER +M: Philipp Zabel p.zabel@pengutronix.de +L: linux-media@vger.kernel.org +S: Maintained +F: drivers/media/platform/video-mux.c + VIRTIO AND VHOST VSOCK DRIVER M: Stefan Hajnoczi stefanha@redhat.com L: kvm@vger.kernel.org @@@ -13890,7 -13588,7 +13909,7 @@@ F: include/uapi/linux/virtio_*. F: drivers/crypto/virtio/
VIRTIO DRIVERS FOR S390 -M: Cornelia Huck cornelia.huck@de.ibm.com +M: Cornelia Huck cohuck@redhat.com M: Halil Pasic pasic@linux.vnet.ibm.com L: linux-s390@vger.kernel.org L: virtualization@lists.linux-foundation.org @@@ -14089,7 -13787,6 +14108,7 @@@ M: Evgeniy Polyakov <zbr@ioremap.net S: Maintained F: Documentation/w1/ F: drivers/w1/ +F: include/linux/w1.h
W83791D HARDWARE MONITORING DRIVER M: Marc Hulsman m.hulsman@tudelft.nl @@@ -14304,8 -14001,6 +14323,8 @@@ F: drivers/xen F: arch/x86/include/asm/xen/ F: include/xen/ F: include/uapi/xen/ +F: Documentation/ABI/stable/sysfs-hypervisor-xen +F: Documentation/ABI/testing/sysfs-hypervisor-xen
XEN HYPERVISOR ARM M: Stefano Stabellini sstabellini@kernel.org @@@ -14398,14 -14093,6 +14417,14 @@@ L: linux-kernel@vger.kernel.or S: Supported F: drivers/char/xillybus/
+XRA1403 GPIO EXPANDER +M: Nandor Han nandor.han@ge.com +M: Semi Malinen semi.malinen@ge.com +L: linux-gpio@vger.kernel.org +S: Maintained +F: drivers/gpio/gpio-xra1403.c +F: Documentation/devicetree/bindings/gpio/gpio-xra1403.txt + XTENSA XTFPGA PLATFORM SUPPORT M: Max Filippov jcmvbkbc@gmail.com L: linux-xtensa@linux-xtensa.org diff --combined drivers/bus/Kconfig index d2a5f1184022,b83c5351376c..2408ea38a39c --- a/drivers/bus/Kconfig +++ b/drivers/bus/Kconfig @@@ -57,7 -57,7 +57,7 @@@ config ARM_CC
config BRCMSTB_GISB_ARB bool "Broadcom STB GISB bus arbiter" - depends on ARM || MIPS + depends on ARM || ARM64 || MIPS default ARCH_BRCMSTB || BMIPS_GENERIC help Driver for the Broadcom Set Top Box System-on-a-chip internal bus @@@ -121,7 -121,6 +121,6 @@@ config QCOM_EBI config SIMPLE_PM_BUS bool "Simple Power-Managed Bus Driver" depends on OF && PM - depends on ARCH_RENESAS || COMPILE_TEST help Driver for transparent busses that don't need a real driver, but where the bus controller is part of a PM domain, or under the control diff --combined drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index bbac5d5d1fcf,2fe1e0a20c17..4a8fc15467cf --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@@ -54,8 -54,14 +54,14 @@@ #include <linux/pci.h> #include <linux/firmware.h>
+ MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin"); + MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin"); + + #define AMDGPU_RESUME_MS 2000 + static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev); + static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev);
static const char *amdgpu_asic_name[] = { "TAHITI", @@@ -77,6 -83,7 +83,7 @@@ "POLARIS11", "POLARIS12", "VEGA10", + "RAVEN", "LAST", };
@@@ -478,9 -485,8 +485,8 @@@ void amdgpu_doorbell_get_kfd_info(struc
/* * amdgpu_wb_*() - * Writeback is the the method by which the the GPU updates special pages - * in memory with the status of certain GPU events (fences, ring pointers, - * etc.). + * Writeback is the method by which the GPU updates special pages in memory + * with the status of certain GPU events (fences, ring pointers,etc.). */
/** @@@ -506,7 -512,7 +512,7 @@@ static void amdgpu_wb_fini(struct amdgp * * @adev: amdgpu_device pointer * - * Disables Writeback and frees the Writeback memory (all asics). + * Initializes writeback and allocates writeback memory (all asics). * Used at driver startup. * Returns 0 on success or an -error on failure. */ @@@ -614,7 -620,7 +620,7 @@@ void amdgpu_wb_free_64bit(struct amdgpu * @mc: memory controller structure holding memory informations * @base: base address at which to put VRAM * - * Function will place try to place VRAM at base address provided + * Function will try to place VRAM at base address provided * as parameter (which is so far either PCI aperture address or * for IGP TOM base address). * @@@ -636,7 -642,7 +642,7 @@@ * ones) * * Note: IGP TOM addr should be the same as the aperture addr, we don't - * explicitly check for that thought. + * explicitly check for that though. * * FIXME: when reducing VRAM size align new size on power of 2. */ @@@ -1067,6 -1073,10 +1073,10 @@@ def_value
static void amdgpu_check_vm_size(struct amdgpu_device *adev) { + /* no need to check the default value */ + if (amdgpu_vm_size == -1) + return; + if (!amdgpu_check_pot_argument(amdgpu_vm_size)) { dev_warn(adev->dev, "VM size (%d) must be a power of 2\n", amdgpu_vm_size); @@@ -1152,12 -1162,16 +1162,12 @@@ static void amdgpu_switcheroo_set_state return;
if (state == VGA_SWITCHEROO_ON) { - unsigned d3_delay = dev->pdev->d3_delay; - pr_info("amdgpu: switched on\n"); /* don't suspend or resume card normally */ dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
amdgpu_device_resume(dev, true, true);
- dev->pdev->d3_delay = d3_delay; - dev->switch_power_state = DRM_SWITCH_POWER_ON; drm_kms_helper_poll_enable(dev); } else { @@@ -1338,6 -1352,9 +1348,9 @@@ int amdgpu_ip_block_add(struct amdgpu_d if (!ip_block_version) return -EINVAL;
+ DRM_DEBUG("add ip block number %d <%s>\n", adev->num_ip_blocks, + ip_block_version->funcs->name); + adev->ip_blocks[adev->num_ip_blocks++].version = ip_block_version;
return 0; @@@ -1388,6 -1405,104 +1401,104 @@@ static void amdgpu_device_enable_virtua } }
+ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev) + { + const char *chip_name; + char fw_name[30]; + int err; + const struct gpu_info_firmware_header_v1_0 *hdr; + + adev->firmware.gpu_info_fw = NULL; + + switch (adev->asic_type) { + case CHIP_TOPAZ: + case CHIP_TONGA: + case CHIP_FIJI: + case CHIP_POLARIS11: + case CHIP_POLARIS10: + case CHIP_POLARIS12: + case CHIP_CARRIZO: + case CHIP_STONEY: + #ifdef CONFIG_DRM_AMDGPU_SI + case CHIP_VERDE: + case CHIP_TAHITI: + case CHIP_PITCAIRN: + case CHIP_OLAND: + case CHIP_HAINAN: + #endif + #ifdef CONFIG_DRM_AMDGPU_CIK + case CHIP_BONAIRE: + case CHIP_HAWAII: + case CHIP_KAVERI: + case CHIP_KABINI: + case CHIP_MULLINS: + #endif + default: + return 0; + case CHIP_VEGA10: + chip_name = "vega10"; + break; + case CHIP_RAVEN: + chip_name = "raven"; + break; + } + + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name); + err = request_firmware(&adev->firmware.gpu_info_fw, fw_name, adev->dev); + if (err) { + dev_err(adev->dev, + "Failed to load gpu_info firmware "%s"\n", + fw_name); + goto out; + } + err = amdgpu_ucode_validate(adev->firmware.gpu_info_fw); + if (err) { + dev_err(adev->dev, + "Failed to validate gpu_info firmware "%s"\n", + fw_name); + goto out; + } + + hdr = (const struct gpu_info_firmware_header_v1_0 *)adev->firmware.gpu_info_fw->data; + amdgpu_ucode_print_gpu_info_hdr(&hdr->header); + + switch (hdr->version_major) { + case 1: + { + const struct gpu_info_firmware_v1_0 *gpu_info_fw = + (const struct gpu_info_firmware_v1_0 *)(adev->firmware.gpu_info_fw->data + + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); + + adev->gfx.config.max_shader_engines = le32_to_cpu(gpu_info_fw->gc_num_se); + adev->gfx.config.max_cu_per_sh = le32_to_cpu(gpu_info_fw->gc_num_cu_per_sh); + adev->gfx.config.max_sh_per_se = le32_to_cpu(gpu_info_fw->gc_num_sh_per_se); + adev->gfx.config.max_backends_per_se = le32_to_cpu(gpu_info_fw->gc_num_rb_per_se); + adev->gfx.config.max_texture_channel_caches = + le32_to_cpu(gpu_info_fw->gc_num_tccs); + adev->gfx.config.max_gprs = le32_to_cpu(gpu_info_fw->gc_num_gprs); + adev->gfx.config.max_gs_threads = le32_to_cpu(gpu_info_fw->gc_num_max_gs_thds); + adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gpu_info_fw->gc_gs_table_depth); + adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gpu_info_fw->gc_gsprim_buff_depth); + adev->gfx.config.double_offchip_lds_buf = + le32_to_cpu(gpu_info_fw->gc_double_offchip_lds_buffer); + adev->gfx.cu_info.wave_front_size = le32_to_cpu(gpu_info_fw->gc_wave_size); + adev->gfx.cu_info.max_waves_per_simd = + le32_to_cpu(gpu_info_fw->gc_max_waves_per_simd); + adev->gfx.cu_info.max_scratch_slots_per_cu = + le32_to_cpu(gpu_info_fw->gc_max_scratch_slots_per_cu); + adev->gfx.cu_info.lds_size = le32_to_cpu(gpu_info_fw->gc_lds_size); + break; + } + default: + dev_err(adev->dev, + "Unsupported gpu_info table %d\n", hdr->header.ucode_version); + err = -EINVAL; + goto out; + } + out: + return err; + } + static int amdgpu_early_init(struct amdgpu_device *adev) { int i, r; @@@ -1440,8 -1555,12 +1551,12 @@@ return r; break; #endif - case CHIP_VEGA10: - adev->family = AMDGPU_FAMILY_AI; + case CHIP_VEGA10: + case CHIP_RAVEN: + if (adev->asic_type == CHIP_RAVEN) + adev->family = AMDGPU_FAMILY_RV; + else + adev->family = AMDGPU_FAMILY_AI;
r = soc15_set_ip_blocks(adev); if (r) @@@ -1452,6 -1571,10 +1567,10 @@@ return -EINVAL; }
+ r = amdgpu_device_parse_gpu_info_fw(adev); + if (r) + return r; + if (amdgpu_sriov_vf(adev)) { r = amdgpu_virt_request_full_gpu(adev, true); if (r) @@@ -1460,7 -1583,8 +1579,8 @@@
for (i = 0; i < adev->num_ip_blocks; i++) { if ((amdgpu_ip_block_mask & (1 << i)) == 0) { - DRM_ERROR("disabled ip block: %d\n", i); + DRM_ERROR("disabled ip block: %d <%s>\n", + i, adev->ip_blocks[i].version->funcs->name); adev->ip_blocks[i].status.valid = false; } else { if (adev->ip_blocks[i].version->funcs->early_init) { @@@ -1548,22 -1672,24 +1668,24 @@@ static int amdgpu_init(struct amdgpu_de return 0; }
- static int amdgpu_late_init(struct amdgpu_device *adev) + static void amdgpu_fill_reset_magic(struct amdgpu_device *adev) + { + memcpy(adev->reset_magic, adev->gart.ptr, AMDGPU_RESET_MAGIC_NUM); + } + + static bool amdgpu_check_vram_lost(struct amdgpu_device *adev) + { + return !!memcmp(adev->gart.ptr, adev->reset_magic, + AMDGPU_RESET_MAGIC_NUM); + } + + static int amdgpu_late_set_cg_state(struct amdgpu_device *adev) { int i = 0, r;
for (i = 0; i < adev->num_ip_blocks; i++) { if (!adev->ip_blocks[i].status.valid) continue; - if (adev->ip_blocks[i].version->funcs->late_init) { - r = adev->ip_blocks[i].version->funcs->late_init((void *)adev); - if (r) { - DRM_ERROR("late_init of IP block <%s> failed %d\n", - adev->ip_blocks[i].version->funcs->name, r); - return r; - } - adev->ip_blocks[i].status.late_initialized = true; - } /* skip CG for VCE/UVD, it's handled specially */ if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD && adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) { @@@ -1577,6 -1703,31 +1699,31 @@@ } } } + return 0; + } + + static int amdgpu_late_init(struct amdgpu_device *adev) + { + int i = 0, r; + + for (i = 0; i < adev->num_ip_blocks; i++) { + if (!adev->ip_blocks[i].status.valid) + continue; + if (adev->ip_blocks[i].version->funcs->late_init) { + r = adev->ip_blocks[i].version->funcs->late_init((void *)adev); + if (r) { + DRM_ERROR("late_init of IP block <%s> failed %d\n", + adev->ip_blocks[i].version->funcs->name, r); + return r; + } + adev->ip_blocks[i].status.late_initialized = true; + } + } + + mod_delayed_work(system_wq, &adev->late_init_work, + msecs_to_jiffies(AMDGPU_RESUME_MS)); + + amdgpu_fill_reset_magic(adev);
return 0; } @@@ -1668,6 -1819,13 +1815,13 @@@ static int amdgpu_fini(struct amdgpu_de return 0; }
+ static void amdgpu_late_init_func_handler(struct work_struct *work) + { + struct amdgpu_device *adev = + container_of(work, struct amdgpu_device, late_init_work.work); + amdgpu_late_set_cg_state(adev); + } + int amdgpu_suspend(struct amdgpu_device *adev) { int i, r; @@@ -1713,19 -1871,25 +1867,25 @@@ static int amdgpu_sriov_reinit_early(st { int i, r;
- for (i = 0; i < adev->num_ip_blocks; i++) { - if (!adev->ip_blocks[i].status.valid) - continue; + static enum amd_ip_block_type ip_order[] = { + AMD_IP_BLOCK_TYPE_GMC, + AMD_IP_BLOCK_TYPE_COMMON, + AMD_IP_BLOCK_TYPE_IH, + };
- if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || - adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || - adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH) - r = adev->ip_blocks[i].version->funcs->hw_init(adev); + for (i = 0; i < ARRAY_SIZE(ip_order); i++) { + int j; + struct amdgpu_ip_block *block;
- if (r) { - DRM_ERROR("resume of IP block <%s> failed %d\n", - adev->ip_blocks[i].version->funcs->name, r); - return r; + for (j = 0; j < adev->num_ip_blocks; j++) { + block = &adev->ip_blocks[j]; + + if (block->version->type != ip_order[i] || + !block->status.valid) + continue; + + r = block->version->funcs->hw_init(adev); + DRM_INFO("RE-INIT: %s %s\n", block->version->funcs->name, r?"failed":"successed"); } }
@@@ -1736,33 -1900,67 +1896,67 @@@ static int amdgpu_sriov_reinit_late(str { int i, r;
+ static enum amd_ip_block_type ip_order[] = { + AMD_IP_BLOCK_TYPE_SMC, + AMD_IP_BLOCK_TYPE_DCE, + AMD_IP_BLOCK_TYPE_GFX, + AMD_IP_BLOCK_TYPE_SDMA, + AMD_IP_BLOCK_TYPE_VCE, + }; + + for (i = 0; i < ARRAY_SIZE(ip_order); i++) { + int j; + struct amdgpu_ip_block *block; + + for (j = 0; j < adev->num_ip_blocks; j++) { + block = &adev->ip_blocks[j]; + + if (block->version->type != ip_order[i] || + !block->status.valid) + continue; + + r = block->version->funcs->hw_init(adev); + DRM_INFO("RE-INIT: %s %s\n", block->version->funcs->name, r?"failed":"successed"); + } + } + + return 0; + } + + static int amdgpu_resume_phase1(struct amdgpu_device *adev) + { + int i, r; + for (i = 0; i < adev->num_ip_blocks; i++) { if (!adev->ip_blocks[i].status.valid) continue; - if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || - adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ) - continue; - - r = adev->ip_blocks[i].version->funcs->hw_init(adev); - if (r) { - DRM_ERROR("resume of IP block <%s> failed %d\n", - adev->ip_blocks[i].version->funcs->name, r); - return r; + adev->ip_blocks[i].version->type == + AMD_IP_BLOCK_TYPE_IH) { + r = adev->ip_blocks[i].version->funcs->resume(adev); + if (r) { + DRM_ERROR("resume of IP block <%s> failed %d\n", + adev->ip_blocks[i].version->funcs->name, r); + return r; + } } }
return 0; }
- static int amdgpu_resume(struct amdgpu_device *adev) + static int amdgpu_resume_phase2(struct amdgpu_device *adev) { int i, r;
for (i = 0; i < adev->num_ip_blocks; i++) { if (!adev->ip_blocks[i].status.valid) continue; + if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || + adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || + adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ) + continue; r = adev->ip_blocks[i].version->funcs->resume(adev); if (r) { DRM_ERROR("resume of IP block <%s> failed %d\n", @@@ -1774,6 -1972,18 +1968,18 @@@ return 0; }
+ static int amdgpu_resume(struct amdgpu_device *adev) + { + int r; + + r = amdgpu_resume_phase1(adev); + if (r) + return r; + r = amdgpu_resume_phase2(adev); + + return r; + } + static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev) { if (adev->is_atom_fw) { @@@ -1856,8 -2066,6 +2062,6 @@@ int amdgpu_device_init(struct amdgpu_de
amdgpu_check_arguments(adev);
- /* Registers mapping */ - /* TODO: block userspace mapping of io register */ spin_lock_init(&adev->mmio_idx_lock); spin_lock_init(&adev->smc_idx_lock); spin_lock_init(&adev->pcie_idx_lock); @@@ -1873,6 -2081,13 +2077,13 @@@ INIT_LIST_HEAD(&adev->gtt_list); spin_lock_init(&adev->gtt_list_lock);
+ INIT_LIST_HEAD(&adev->ring_lru_list); + spin_lock_init(&adev->ring_lru_list_lock); + + INIT_DELAYED_WORK(&adev->late_init_work, amdgpu_late_init_func_handler); + + /* Registers mapping */ + /* TODO: block userspace mapping of io register */ if (adev->asic_type >= CHIP_BONAIRE) { adev->rmmio_base = pci_resource_start(adev->pdev, 5); adev->rmmio_size = pci_resource_len(adev->pdev, 5); @@@ -1985,6 -2200,8 +2196,8 @@@
adev->accel_working = true;
+ amdgpu_vm_check_compute_bug(adev); + /* Initialize the buffer migration limit. */ if (amdgpu_moverate >= 0) max_MBps = amdgpu_moverate; @@@ -2013,6 -2230,10 +2226,10 @@@ if (r) DRM_ERROR("registering register debugfs failed (%d).\n", r);
+ r = amdgpu_debugfs_test_ib_ring_init(adev); + if (r) + DRM_ERROR("registering register test ib ring debugfs failed (%d).\n", r); + r = amdgpu_debugfs_firmware_init(adev); if (r) DRM_ERROR("registering firmware debugfs failed (%d).\n", r); @@@ -2069,7 -2290,12 +2286,12 @@@ void amdgpu_device_fini(struct amdgpu_d amdgpu_fence_driver_fini(adev); amdgpu_fbdev_fini(adev); r = amdgpu_fini(adev); + if (adev->firmware.gpu_info_fw) { + release_firmware(adev->firmware.gpu_info_fw); + adev->firmware.gpu_info_fw = NULL; + } adev->accel_working = false; + cancel_delayed_work_sync(&adev->late_init_work); /* free i2c buses */ amdgpu_i2c_fini(adev); amdgpu_atombios_fini(adev); @@@ -2454,16 -2680,15 +2676,15 @@@ err * amdgpu_sriov_gpu_reset - reset the asic * * @adev: amdgpu device pointer - * @voluntary: if this reset is requested by guest. - * (true means by guest and false means by HYPERVISOR ) + * @job: which job trigger hang * * Attempt the reset the GPU if it has hung (all asics). * for SRIOV case. * Returns 0 for success or an error on failure. */ - int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary) + int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, struct amdgpu_job *job) { - int i, r = 0; + int i, j, r = 0; int resched; struct amdgpu_bo *bo, *tmp; struct amdgpu_ring *ring; @@@ -2476,22 -2701,39 +2697,39 @@@ /* block TTM */ resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
- /* block scheduler */ - for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { - ring = adev->rings[i]; + /* we start from the ring trigger GPU hang */ + j = job ? job->ring->idx : 0;
+ /* block scheduler */ + for (i = j; i < j + AMDGPU_MAX_RINGS; ++i) { + ring = adev->rings[i % AMDGPU_MAX_RINGS]; if (!ring || !ring->sched.thread) continue;
kthread_park(ring->sched.thread); + + if (job && j != i) + continue; + + /* here give the last chance to check if job removed from mirror-list + * since we already pay some time on kthread_park */ + if (job && list_empty(&job->base.node)) { + kthread_unpark(ring->sched.thread); + goto give_up_reset; + } + + if (amd_sched_invalidate_job(&job->base, amdgpu_job_hang_limit)) + amd_sched_job_kickout(&job->base); + + /* only do job_reset on the hang ring if @job not NULL */ amd_sched_hw_job_reset(&ring->sched); - }
- /* after all hw jobs are reset, hw fence is meaningless, so force_completion */ - amdgpu_fence_driver_force_completion(adev); + /* after all hw jobs are reset, hw fence is meaningless, so force_completion */ + amdgpu_fence_driver_force_completion_ring(ring); + }
/* request to take full control of GPU before re-initialization */ - if (voluntary) + if (job) amdgpu_virt_reset_gpu(adev); else amdgpu_virt_request_full_gpu(adev, true); @@@ -2541,20 -2783,28 +2779,28 @@@ } dma_fence_put(fence);
- for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { - struct amdgpu_ring *ring = adev->rings[i]; + for (i = j; i < j + AMDGPU_MAX_RINGS; ++i) { + ring = adev->rings[i % AMDGPU_MAX_RINGS]; if (!ring || !ring->sched.thread) continue;
+ if (job && j != i) { + kthread_unpark(ring->sched.thread); + continue; + } + amd_sched_job_recovery(&ring->sched); kthread_unpark(ring->sched.thread); }
drm_helper_resume_force_mode(adev->ddev); + give_up_reset: ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched); if (r) { /* bad news, how to tell it to userspace ? */ dev_info(adev->dev, "GPU reset failed\n"); + } else { + dev_info(adev->dev, "GPU reset successed!\n"); }
adev->gfx.in_reset = false; @@@ -2574,10 -2824,7 +2820,7 @@@ int amdgpu_gpu_reset(struct amdgpu_devi { int i, r; int resched; - bool need_full_reset; - - if (amdgpu_sriov_vf(adev)) - return amdgpu_sriov_gpu_reset(adev, true); + bool need_full_reset, vram_lost = false;
if (!amdgpu_check_soft_reset(adev)) { DRM_INFO("No hardware hang detected. Did some blocks stall?\n"); @@@ -2637,16 -2884,27 +2880,27 @@@ retry
if (!r) { dev_info(adev->dev, "GPU reset succeeded, trying to resume\n"); - r = amdgpu_resume(adev); + r = amdgpu_resume_phase1(adev); + if (r) + goto out; + vram_lost = amdgpu_check_vram_lost(adev); + if (vram_lost) { + DRM_ERROR("VRAM is lost!\n"); + atomic_inc(&adev->vram_lost_counter); + } + r = amdgpu_ttm_recover_gart(adev); + if (r) + goto out; + r = amdgpu_resume_phase2(adev); + if (r) + goto out; + if (vram_lost) + amdgpu_fill_reset_magic(adev); } } + out: if (!r) { amdgpu_irq_gpu_reset_resume_helper(adev); - if (need_full_reset && amdgpu_need_backup(adev)) { - r = amdgpu_ttm_recover_gart(adev); - if (r) - DRM_ERROR("gart recovery failed!!!\n"); - } r = amdgpu_ib_ring_tests(adev); if (r) { dev_err(adev->dev, "ib ring test failed (%d).\n", r); @@@ -2708,10 -2966,11 +2962,11 @@@ drm_helper_resume_force_mode(adev->ddev);
ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched); - if (r) { + if (r) /* bad news, how to tell it to userspace ? */ dev_info(adev->dev, "GPU reset failed\n"); - } + else + dev_info(adev->dev, "GPU reset successed!\n");
return r; } @@@ -3495,11 -3754,60 +3750,60 @@@ static void amdgpu_debugfs_regs_cleanup } }
+ static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data) + { + struct drm_info_node *node = (struct drm_info_node *) m->private; + struct drm_device *dev = node->minor->dev; + struct amdgpu_device *adev = dev->dev_private; + int r = 0, i; + + /* hold on the scheduler */ + for (i = 0; i < AMDGPU_MAX_RINGS; i++) { + struct amdgpu_ring *ring = adev->rings[i]; + + if (!ring || !ring->sched.thread) + continue; + kthread_park(ring->sched.thread); + } + + seq_printf(m, "run ib test:\n"); + r = amdgpu_ib_ring_tests(adev); + if (r) + seq_printf(m, "ib ring tests failed (%d).\n", r); + else + seq_printf(m, "ib ring tests passed.\n"); + + /* go on the scheduler */ + for (i = 0; i < AMDGPU_MAX_RINGS; i++) { + struct amdgpu_ring *ring = adev->rings[i]; + + if (!ring || !ring->sched.thread) + continue; + kthread_unpark(ring->sched.thread); + } + + return 0; + } + + static const struct drm_info_list amdgpu_debugfs_test_ib_ring_list[] = { + {"amdgpu_test_ib", &amdgpu_debugfs_test_ib} + }; + + static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev) + { + return amdgpu_debugfs_add_files(adev, + amdgpu_debugfs_test_ib_ring_list, 1); + } + int amdgpu_debugfs_init(struct drm_minor *minor) { return 0; } #else + static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev) + { + return 0; + } static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) { return 0; diff --combined drivers/gpu/drm/drm_internal.h index 14dfa9c83d1d,5cecc974d2f9..5edc24bd10fa --- a/drivers/gpu/drm/drm_internal.h +++ b/drivers/gpu/drm/drm_internal.h @@@ -53,8 -53,9 +53,9 @@@ int drm_name_info(struct seq_file *m, v int drm_clients_info(struct seq_file *m, void* data); int drm_gem_name_info(struct seq_file *m, void *data);
- /* drm_irq.c */ + /* drm_vblank.c */ extern unsigned int drm_timestamp_monotonic; + void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
/* IOCTLS */ int drm_wait_vblank(struct drm_device *dev, void *data, @@@ -142,7 -143,17 +143,21 @@@ static inline int drm_debugfs_crtc_crc_ { return 0; } + #endif + +drm_ioctl_t drm_version; +drm_ioctl_t drm_getunique; +drm_ioctl_t drm_getclient; ++ + /* drm_syncobj.c */ + void drm_syncobj_open(struct drm_file *file_private); + void drm_syncobj_release(struct drm_file *file_private); + int drm_syncobj_create_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_private); + int drm_syncobj_destroy_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_private); + int drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_private); + int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_private); diff --combined drivers/gpu/drm/drm_ioctl.c index 335821153776,f1e568176da9..f1eb326524cf --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@@ -107,7 -107,7 +107,7 @@@ * * Copies the bus id from drm_device::unique into user space. */ -static int drm_getunique(struct drm_device *dev, void *data, +int drm_getunique(struct drm_device *dev, void *data, struct drm_file *file_priv) { struct drm_unique *u = data; @@@ -172,7 -172,7 +172,7 @@@ static int drm_set_busid(struct drm_dev * Searches for the client with the specified index and copies its information * into userspace */ -static int drm_getclient(struct drm_device *dev, void *data, +int drm_getclient(struct drm_device *dev, void *data, struct drm_file *file_priv) { struct drm_client *client = data; @@@ -241,6 -241,9 +241,9 @@@ static int drm_getcap(struct drm_devic req->value |= dev->driver->prime_fd_to_handle ? DRM_PRIME_CAP_IMPORT : 0; req->value |= dev->driver->prime_handle_to_fd ? DRM_PRIME_CAP_EXPORT : 0; return 0; + case DRM_CAP_SYNCOBJ: + req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ); + return 0; }
/* Other caps only work with KMS drivers */ @@@ -461,7 -464,7 +464,7 @@@ static int drm_copy_field(char __user * * * Fills in the version information in \p arg. */ -static int drm_version(struct drm_device *dev, void *data, +int drm_version(struct drm_device *dev, void *data, struct drm_file *file_priv) { struct drm_version *version = data; @@@ -645,6 -648,15 +648,15 @@@ static const struct drm_ioctl_desc drm_ DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED), DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED), + + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_CREATE, drm_syncobj_create_ioctl, + DRM_UNLOCKED|DRM_RENDER_ALLOW), + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_DESTROY, drm_syncobj_destroy_ioctl, + DRM_UNLOCKED|DRM_RENDER_ALLOW), + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, drm_syncobj_handle_to_fd_ioctl, + DRM_UNLOCKED|DRM_RENDER_ALLOW), + DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl, + DRM_UNLOCKED|DRM_RENDER_ALLOW), };
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) @@@ -694,33 -706,6 +706,33 @@@ * structure. */
+long drm_ioctl_kernel(struct file *file, drm_ioctl_t *func, void *kdata, + u32 flags) +{ + struct drm_file *file_priv = file->private_data; + struct drm_device *dev = file_priv->minor->dev; + int retcode; + + if (drm_device_is_unplugged(dev)) + return -ENODEV; + + retcode = drm_ioctl_permit(flags, file_priv); + if (unlikely(retcode)) + return retcode; + + /* Enforce sane locking for modern driver ioctls. */ + if (!drm_core_check_feature(dev, DRIVER_LEGACY) || + (flags & DRM_UNLOCKED)) + retcode = func(dev, kdata, file_priv); + else { + mutex_lock(&drm_global_mutex); + retcode = func(dev, kdata, file_priv); + mutex_unlock(&drm_global_mutex); + } + return retcode; +} +EXPORT_SYMBOL(drm_ioctl_kernel); + /** * drm_ioctl - ioctl callback implementation for DRM drivers * @filp: file this ioctl is called on @@@ -789,6 -774,10 +801,6 @@@ long drm_ioctl(struct file *filp goto err_i1; }
- retcode = drm_ioctl_permit(ioctl->flags, file_priv); - if (unlikely(retcode)) - goto err_i1; - if (ksize <= sizeof(stack_kdata)) { kdata = stack_kdata; } else { @@@ -807,7 -796,16 +819,7 @@@ if (ksize > in_size) memset(kdata + in_size, 0, ksize - in_size);
- /* Enforce sane locking for modern driver ioctls. */ - if (!drm_core_check_feature(dev, DRIVER_LEGACY) || - (ioctl->flags & DRM_UNLOCKED)) - retcode = func(dev, kdata, file_priv); - else { - mutex_lock(&drm_global_mutex); - retcode = func(dev, kdata, file_priv); - mutex_unlock(&drm_global_mutex); - } - + retcode = drm_ioctl_kernel(filp, func, kdata, ioctl->flags); if (copy_to_user((void __user *)arg, kdata, out_size) != 0) retcode = -EFAULT;
diff --combined drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c index 1013765274da,ee7069e93eda..5bd93169dac2 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c @@@ -172,7 -172,7 +172,7 @@@ static int submit_fence_sync(const stru for (i = 0; i < submit->nr_bos; i++) { struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; bool write = submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE; - bool explicit = !(submit->flags & ETNA_SUBMIT_NO_IMPLICIT); + bool explicit = !!(submit->flags & ETNA_SUBMIT_NO_IMPLICIT);
ret = etnaviv_gpu_fence_sync_obj(etnaviv_obj, context, write, explicit); @@@ -345,9 -345,9 +345,9 @@@ int etnaviv_ioctl_gem_submit(struct drm * Copy the command submission and bo array to kernel space in * one go, and do this outside of any locks. */ - bos = drm_malloc_ab(args->nr_bos, sizeof(*bos)); - relocs = drm_malloc_ab(args->nr_relocs, sizeof(*relocs)); - stream = drm_malloc_ab(1, args->stream_size); + bos = kvmalloc_array(args->nr_bos, sizeof(*bos), GFP_KERNEL); + relocs = kvmalloc_array(args->nr_relocs, sizeof(*relocs), GFP_KERNEL); + stream = kvmalloc_array(1, args->stream_size, GFP_KERNEL); cmdbuf = etnaviv_cmdbuf_new(gpu->cmdbuf_suballoc, ALIGN(args->stream_size, 8) + 8, args->nr_bos); @@@ -489,11 -489,11 +489,11 @@@ err_submit_cmds if (cmdbuf) etnaviv_cmdbuf_free(cmdbuf); if (stream) - drm_free_large(stream); + kvfree(stream); if (bos) - drm_free_large(bos); + kvfree(bos); if (relocs) - drm_free_large(relocs); + kvfree(relocs);
return ret; } diff --combined drivers/gpu/drm/i915/i915_debugfs.c index 4bd1467c17b1,4577b0af6886..3f44076ec8a0 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@@ -229,7 -229,7 +229,7 @@@ static int i915_gem_stolen_list_info(st int ret;
total = READ_ONCE(dev_priv->mm.object_count); - objects = drm_malloc_ab(total, sizeof(*objects)); + objects = kvmalloc_array(total, sizeof(*objects), GFP_KERNEL); if (!objects) return -ENOMEM;
@@@ -274,7 -274,7 +274,7 @@@
mutex_unlock(&dev->struct_mutex); out: - drm_free_large(objects); + kvfree(objects); return ret; }
@@@ -292,8 -292,6 +292,8 @@@ static int per_file_stats(int id, void struct file_stats *stats = data; struct i915_vma *vma;
+ lockdep_assert_held(&obj->base.dev->struct_mutex); + stats->count++; stats->total += obj->base.size; if (!obj->bind_count) @@@ -478,8 -476,6 +478,8 @@@ static int i915_gem_object_info(struct struct drm_i915_gem_request *request; struct task_struct *task;
+ mutex_lock(&dev->struct_mutex); + memset(&stats, 0, sizeof(stats)); stats.file_priv = file->driver_priv; spin_lock(&file->table_lock); @@@ -491,6 -487,7 +491,6 @@@ * still alive (e.g. get_pid(current) => fork() => exit()). * Therefore, we need to protect this ->comm access using RCU. */ - mutex_lock(&dev->struct_mutex); request = list_first_entry_or_null(&file_priv->mm.request_list, struct drm_i915_gem_request, client_link); @@@ -500,7 -497,6 +500,7 @@@ PIDTYPE_PID); print_file_stats(m, task ? task->comm : "<unknown>", stats); rcu_read_unlock(); + mutex_unlock(&dev->struct_mutex); } mutex_unlock(&dev->filelist_mutex); @@@ -1674,12 -1670,22 +1674,22 @@@ static int i915_fbc_status(struct seq_f seq_printf(m, "FBC disabled: %s\n", dev_priv->fbc.no_fbc_reason);
- if (intel_fbc_is_active(dev_priv) && INTEL_GEN(dev_priv) >= 7) { - uint32_t mask = INTEL_GEN(dev_priv) >= 8 ? - BDW_FBC_COMPRESSION_MASK : - IVB_FBC_COMPRESSION_MASK; - seq_printf(m, "Compressing: %s\n", - yesno(I915_READ(FBC_STATUS2) & mask)); + if (intel_fbc_is_active(dev_priv)) { + u32 mask; + + if (INTEL_GEN(dev_priv) >= 8) + mask = I915_READ(IVB_FBC_STATUS2) & BDW_FBC_COMP_SEG_MASK; + else if (INTEL_GEN(dev_priv) >= 7) + mask = I915_READ(IVB_FBC_STATUS2) & IVB_FBC_COMP_SEG_MASK; + else if (INTEL_GEN(dev_priv) >= 5) + mask = I915_READ(ILK_DPFC_STATUS) & ILK_DPFC_COMP_SEG_MASK; + else if (IS_G4X(dev_priv)) + mask = I915_READ(DPFC_STATUS) & DPFC_COMP_SEG_MASK; + else + mask = I915_READ(FBC_STATUS) & (FBC_STAT_COMPRESSING | + FBC_STAT_COMPRESSED); + + seq_printf(m, "Compressing: %s\n", yesno(mask)); }
mutex_unlock(&dev_priv->fbc.lock); @@@ -1688,7 -1694,7 +1698,7 @@@ return 0; }
- static int i915_fbc_fc_get(void *data, u64 *val) + static int i915_fbc_false_color_get(void *data, u64 *val) { struct drm_i915_private *dev_priv = data;
@@@ -1700,7 -1706,7 +1710,7 @@@ return 0; }
- static int i915_fbc_fc_set(void *data, u64 val) + static int i915_fbc_false_color_set(void *data, u64 val) { struct drm_i915_private *dev_priv = data; u32 reg; @@@ -1721,8 -1727,8 +1731,8 @@@ return 0; }
- DEFINE_SIMPLE_ATTRIBUTE(i915_fbc_fc_fops, - i915_fbc_fc_get, i915_fbc_fc_set, + DEFINE_SIMPLE_ATTRIBUTE(i915_fbc_false_color_fops, + i915_fbc_false_color_get, i915_fbc_false_color_set, "%llu\n");
static int i915_ips_status(struct seq_file *m, void *unused) @@@ -1992,6 -1998,12 +2002,12 @@@ static int i915_context_status(struct s seq_putc(m, '\n'); }
+ seq_printf(m, + "\tvma hashtable size=%u (actual %lu), count=%u\n", + ctx->vma_lut.ht_size, + BIT(ctx->vma_lut.ht_bits), + ctx->vma_lut.ht_count); + seq_putc(m, '\n'); }
@@@ -2486,8 -2498,6 +2502,6 @@@ static void i915_guc_client_info(struc client->wq_size, client->wq_offset, client->wq_tail);
seq_printf(m, "\tWork queue full: %u\n", client->no_wq_space); - seq_printf(m, "\tFailed doorbell: %u\n", client->b_fail); - seq_printf(m, "\tLast submission result: %d\n", client->retcode);
for_each_engine(engine, dev_priv, id) { u64 submissions = client->submissions[id]; @@@ -2498,42 -2508,34 +2512,34 @@@ seq_printf(m, "\tTotal: %llu\n", tot); }
- static int i915_guc_info(struct seq_file *m, void *data) + static bool check_guc_submission(struct seq_file *m) { struct drm_i915_private *dev_priv = node_to_i915(m->private); const struct intel_guc *guc = &dev_priv->guc; - struct intel_engine_cs *engine; - enum intel_engine_id id; - u64 total;
if (!guc->execbuf_client) { seq_printf(m, "GuC submission %s\n", HAS_GUC_SCHED(dev_priv) ? "disabled" : "not supported"); - return 0; + return false; }
+ return true; + } + + static int i915_guc_info(struct seq_file *m, void *data) + { + struct drm_i915_private *dev_priv = node_to_i915(m->private); + const struct intel_guc *guc = &dev_priv->guc; + + if (!check_guc_submission(m)) + return 0; + seq_printf(m, "Doorbell map:\n"); seq_printf(m, "\t%*pb\n", GUC_NUM_DOORBELLS, guc->doorbell_bitmap); seq_printf(m, "Doorbell next cacheline: 0x%x\n\n", guc->db_cacheline);
- seq_printf(m, "GuC total action count: %llu\n", guc->action_count); - seq_printf(m, "GuC action failure count: %u\n", guc->action_fail); - seq_printf(m, "GuC last action command: 0x%x\n", guc->action_cmd); - seq_printf(m, "GuC last action status: 0x%x\n", guc->action_status); - seq_printf(m, "GuC last action error code: %d\n", guc->action_err); - - total = 0; - seq_printf(m, "\nGuC submissions:\n"); - for_each_engine(engine, dev_priv, id) { - u64 submissions = guc->submissions[id]; - total += submissions; - seq_printf(m, "\t%-24s: %10llu, last seqno 0x%08x\n", - engine->name, submissions, guc->last_seqno[id]); - } - seq_printf(m, "\t%s: %llu\n", "Total", total); - seq_printf(m, "\nGuC execbuf client @ %p:\n", guc->execbuf_client); i915_guc_client_info(m, dev_priv, guc->execbuf_client);
@@@ -2544,36 -2546,99 +2550,99 @@@ return 0; }
- static int i915_guc_log_dump(struct seq_file *m, void *data) + static int i915_guc_stage_pool(struct seq_file *m, void *data) { struct drm_i915_private *dev_priv = node_to_i915(m->private); - struct drm_i915_gem_object *obj; - int i = 0, pg; + const struct intel_guc *guc = &dev_priv->guc; + struct guc_stage_desc *desc = guc->stage_desc_pool_vaddr; + struct i915_guc_client *client = guc->execbuf_client; + unsigned int tmp; + int index;
- if (!dev_priv->guc.log.vma) + if (!check_guc_submission(m)) return 0;
- obj = dev_priv->guc.log.vma->obj; - for (pg = 0; pg < obj->base.size / PAGE_SIZE; pg++) { - u32 *log = kmap_atomic(i915_gem_object_get_page(obj, pg)); + for (index = 0; index < GUC_MAX_STAGE_DESCRIPTORS; index++, desc++) { + struct intel_engine_cs *engine; + + if (!(desc->attribute & GUC_STAGE_DESC_ATTR_ACTIVE)) + continue;
- for (i = 0; i < PAGE_SIZE / sizeof(u32); i += 4) - seq_printf(m, "0x%08x 0x%08x 0x%08x 0x%08x\n", - *(log + i), *(log + i + 1), - *(log + i + 2), *(log + i + 3)); + seq_printf(m, "GuC stage descriptor %u:\n", index); + seq_printf(m, "\tIndex: %u\n", desc->stage_id); + seq_printf(m, "\tAttribute: 0x%x\n", desc->attribute); + seq_printf(m, "\tPriority: %d\n", desc->priority); + seq_printf(m, "\tDoorbell id: %d\n", desc->db_id); + seq_printf(m, "\tEngines used: 0x%x\n", + desc->engines_used); + seq_printf(m, "\tDoorbell trigger phy: 0x%llx, cpu: 0x%llx, uK: 0x%x\n", + desc->db_trigger_phy, + desc->db_trigger_cpu, + desc->db_trigger_uk); + seq_printf(m, "\tProcess descriptor: 0x%x\n", + desc->process_desc); + seq_printf(m, "\tWorkqueue address: 0x%x, size: 0x%x\n", + desc->wq_addr, desc->wq_size); + seq_putc(m, '\n');
- kunmap_atomic(log); + for_each_engine_masked(engine, dev_priv, client->engines, tmp) { + u32 guc_engine_id = engine->guc_id; + struct guc_execlist_context *lrc = + &desc->lrc[guc_engine_id]; + + seq_printf(m, "\t%s LRC:\n", engine->name); + seq_printf(m, "\t\tContext desc: 0x%x\n", + lrc->context_desc); + seq_printf(m, "\t\tContext id: 0x%x\n", lrc->context_id); + seq_printf(m, "\t\tLRCA: 0x%x\n", lrc->ring_lrca); + seq_printf(m, "\t\tRing begin: 0x%x\n", lrc->ring_begin); + seq_printf(m, "\t\tRing end: 0x%x\n", lrc->ring_end); + seq_putc(m, '\n'); + } }
+ return 0; + } + + static int i915_guc_log_dump(struct seq_file *m, void *data) + { + struct drm_info_node *node = m->private; + struct drm_i915_private *dev_priv = node_to_i915(node); + bool dump_load_err = !!node->info_ent->data; + struct drm_i915_gem_object *obj = NULL; + u32 *log; + int i = 0; + + if (dump_load_err) + obj = dev_priv->guc.load_err_log; + else if (dev_priv->guc.log.vma) + obj = dev_priv->guc.log.vma->obj; + + if (!obj) + return 0; + + log = i915_gem_object_pin_map(obj, I915_MAP_WC); + if (IS_ERR(log)) { + DRM_DEBUG("Failed to pin object\n"); + seq_puts(m, "(log data unaccessible)\n"); + return PTR_ERR(log); + } + + for (i = 0; i < obj->base.size / sizeof(u32); i += 4) + seq_printf(m, "0x%08x 0x%08x 0x%08x 0x%08x\n", + *(log + i), *(log + i + 1), + *(log + i + 2), *(log + i + 3)); + seq_putc(m, '\n');
+ i915_gem_object_unpin_map(obj); + return 0; }
static int i915_guc_log_control_get(void *data, u64 *val) { - struct drm_device *dev = data; - struct drm_i915_private *dev_priv = to_i915(dev); + struct drm_i915_private *dev_priv = data;
if (!dev_priv->guc.log.vma) return -EINVAL; @@@ -2585,14 -2650,13 +2654,13 @@@
static int i915_guc_log_control_set(void *data, u64 val) { - struct drm_device *dev = data; - struct drm_i915_private *dev_priv = to_i915(dev); + struct drm_i915_private *dev_priv = data; int ret;
if (!dev_priv->guc.log.vma) return -EINVAL;
- ret = mutex_lock_interruptible(&dev->struct_mutex); + ret = mutex_lock_interruptible(&dev_priv->drm.struct_mutex); if (ret) return ret;
@@@ -2600,7 -2664,7 +2668,7 @@@ ret = i915_guc_log_control(dev_priv, val); intel_runtime_pm_put(dev_priv);
- mutex_unlock(&dev->struct_mutex); + mutex_unlock(&dev_priv->drm.struct_mutex); return ret; }
@@@ -2859,7 -2923,8 +2927,8 @@@ static int i915_dmc_info(struct seq_fil seq_printf(m, "version: %d.%d\n", CSR_VERSION_MAJOR(csr->version), CSR_VERSION_MINOR(csr->version));
- if (IS_SKYLAKE(dev_priv) && csr->version >= CSR_VERSION(1, 6)) { + if (IS_KABYLAKE(dev_priv) || + (IS_SKYLAKE(dev_priv) && csr->version >= CSR_VERSION(1, 6))) { seq_printf(m, "DC3 -> DC5 count: %d\n", I915_READ(SKL_CSR_DC3_DC5_COUNT)); seq_printf(m, "DC5 -> DC6 count: %d\n", @@@ -3047,36 -3112,6 +3116,6 @@@ static void intel_connector_info(struc intel_seq_print_mode(m, 2, mode); }
- static bool cursor_active(struct drm_i915_private *dev_priv, int pipe) - { - u32 state; - - if (IS_I845G(dev_priv) || IS_I865G(dev_priv)) - state = I915_READ(CURCNTR(PIPE_A)) & CURSOR_ENABLE; - else - state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE; - - return state; - } - - static bool cursor_position(struct drm_i915_private *dev_priv, - int pipe, int *x, int *y) - { - u32 pos; - - pos = I915_READ(CURPOS(pipe)); - - *x = (pos >> CURSOR_X_SHIFT) & CURSOR_POS_MASK; - if (pos & (CURSOR_POS_SIGN << CURSOR_X_SHIFT)) - *x = -*x; - - *y = (pos >> CURSOR_Y_SHIFT) & CURSOR_POS_MASK; - if (pos & (CURSOR_POS_SIGN << CURSOR_Y_SHIFT)) - *y = -*y; - - return cursor_active(dev_priv, pipe); - } - static const char *plane_type(enum drm_plane_type type) { switch (type) { @@@ -3099,17 -3134,17 +3138,17 @@@ static const char *plane_rotation(unsig { static char buf[48]; /* - * According to doc only one DRM_ROTATE_ is allowed but this + * According to doc only one DRM_MODE_ROTATE_ is allowed but this * will print them all to visualize if the values are misused */ snprintf(buf, sizeof(buf), "%s%s%s%s%s%s(0x%08x)", - (rotation & DRM_ROTATE_0) ? "0 " : "", - (rotation & DRM_ROTATE_90) ? "90 " : "", - (rotation & DRM_ROTATE_180) ? "180 " : "", - (rotation & DRM_ROTATE_270) ? "270 " : "", - (rotation & DRM_REFLECT_X) ? "FLIPX " : "", - (rotation & DRM_REFLECT_Y) ? "FLIPY " : "", + (rotation & DRM_MODE_ROTATE_0) ? "0 " : "", + (rotation & DRM_MODE_ROTATE_90) ? "90 " : "", + (rotation & DRM_MODE_ROTATE_180) ? "180 " : "", + (rotation & DRM_MODE_ROTATE_270) ? "270 " : "", + (rotation & DRM_MODE_REFLECT_X) ? "FLIPX " : "", + (rotation & DRM_MODE_REFLECT_Y) ? "FLIPY " : "", rotation);
return buf; @@@ -3198,9 -3233,7 +3237,7 @@@ static int i915_display_info(struct seq seq_printf(m, "CRTC info\n"); seq_printf(m, "---------\n"); for_each_intel_crtc(dev, crtc) { - bool active; struct intel_crtc_state *pipe_config; - int x, y;
drm_modeset_lock(&crtc->base.mutex, NULL); pipe_config = to_intel_crtc_state(crtc->base.state); @@@ -3212,14 -3245,18 +3249,18 @@@ yesno(pipe_config->dither), pipe_config->pipe_bpp);
if (pipe_config->base.active) { + struct intel_plane *cursor = + to_intel_plane(crtc->base.cursor); + intel_crtc_info(m, crtc);
- active = cursor_position(dev_priv, crtc->pipe, &x, &y); - seq_printf(m, "\tcursor visible? %s, position (%d, %d), size %dx%d, addr 0x%08x, active? %s\n", - yesno(crtc->cursor_base), - x, y, crtc->base.cursor->state->crtc_w, - crtc->base.cursor->state->crtc_h, - crtc->cursor_addr, yesno(active)); + seq_printf(m, "\tcursor visible? %s, position (%d, %d), size %dx%d, addr 0x%08x\n", + yesno(cursor->base.state->visible), + cursor->base.state->crtc_x, + cursor->base.state->crtc_y, + cursor->base.state->crtc_w, + cursor->base.state->crtc_h, + cursor->cursor.base); intel_scaler_info(m, crtc); intel_plane_info(m, crtc); } @@@ -3320,7 -3357,7 +3361,7 @@@ static int i915_engine_info(struct seq_
if (i915.enable_execlists) { u32 ptr, read, write; - struct rb_node *rb; + unsigned int idx;
seq_printf(m, "\tExeclist status: 0x%08x %08x\n", I915_READ(RING_EXECLIST_STATUS_LO(engine)), @@@ -3338,8 -3375,7 +3379,7 @@@ if (read > write) write += GEN8_CSB_ENTRIES; while (read < write) { - unsigned int idx = ++read % GEN8_CSB_ENTRIES; - + idx = ++read % GEN8_CSB_ENTRIES; seq_printf(m, "\tExeclist CSB[%d]: 0x%08x, context: %d\n", idx, I915_READ(RING_CONTEXT_STATUS_BUF_LO(engine, idx)), @@@ -3347,28 -3383,30 +3387,30 @@@ }
rcu_read_lock(); - rq = READ_ONCE(engine->execlist_port[0].request); - if (rq) { - seq_printf(m, "\t\tELSP[0] count=%d, ", - engine->execlist_port[0].count); - print_request(m, rq, "rq: "); - } else { - seq_printf(m, "\t\tELSP[0] idle\n"); - } - rq = READ_ONCE(engine->execlist_port[1].request); - if (rq) { - seq_printf(m, "\t\tELSP[1] count=%d, ", - engine->execlist_port[1].count); - print_request(m, rq, "rq: "); - } else { - seq_printf(m, "\t\tELSP[1] idle\n"); + for (idx = 0; idx < ARRAY_SIZE(engine->execlist_port); idx++) { + unsigned int count; + + rq = port_unpack(&engine->execlist_port[idx], + &count); + if (rq) { + seq_printf(m, "\t\tELSP[%d] count=%d, ", + idx, count); + print_request(m, rq, "rq: "); + } else { + seq_printf(m, "\t\tELSP[%d] idle\n", + idx); + } } rcu_read_unlock();
spin_lock_irq(&engine->timeline->lock); - for (rb = engine->execlist_first; rb; rb = rb_next(rb)) { - rq = rb_entry(rb, typeof(*rq), priotree.node); - print_request(m, rq, "\t\tQ "); + for (rb = engine->execlist_first; rb; rb = rb_next(rb)){ + struct i915_priolist *p = + rb_entry(rb, typeof(*p), node); + + list_for_each_entry(rq, &p->requests, + priotree.link) + print_request(m, rq, "\t\tQ "); } spin_unlock_irq(&engine->timeline->lock); } else if (INTEL_GEN(dev_priv) > 6) { @@@ -3708,16 -3746,10 +3750,10 @@@ static ssize_t i915_displayport_test_ac if (len == 0) return 0;
- input_buffer = kmalloc(len + 1, GFP_KERNEL); - if (!input_buffer) - return -ENOMEM; - - if (copy_from_user(input_buffer, ubuf, len)) { - status = -EFAULT; - goto out; - } + input_buffer = memdup_user_nul(ubuf, len); + if (IS_ERR(input_buffer)) + return PTR_ERR(input_buffer);
- input_buffer[len] = '\0'; DRM_DEBUG_DRIVER("Copied %d bytes from user\n", (unsigned int)len);
drm_connector_list_iter_begin(dev, &conn_iter); @@@ -3743,7 -3775,6 +3779,6 @@@ } } drm_connector_list_iter_end(&conn_iter); - out: kfree(input_buffer); if (status < 0) return status; @@@ -3904,6 -3935,8 +3939,8 @@@ static void wm_latency_show(struct seq_ num_levels = 3; else if (IS_VALLEYVIEW(dev_priv)) num_levels = 1; + else if (IS_G4X(dev_priv)) + num_levels = 3; else num_levels = ilk_wm_max_level(dev_priv) + 1;
@@@ -3916,8 -3949,10 +3953,10 @@@ * - WM1+ latency values in 0.5us units * - latencies are in us on gen9/vlv/chv */ - if (INTEL_GEN(dev_priv) >= 9 || IS_VALLEYVIEW(dev_priv) || - IS_CHERRYVIEW(dev_priv)) + if (INTEL_GEN(dev_priv) >= 9 || + IS_VALLEYVIEW(dev_priv) || + IS_CHERRYVIEW(dev_priv) || + IS_G4X(dev_priv)) latency *= 10; else if (level > 0) latency *= 5; @@@ -3978,7 -4013,7 +4017,7 @@@ static int pri_wm_latency_open(struct i { struct drm_i915_private *dev_priv = inode->i_private;
- if (INTEL_GEN(dev_priv) < 5) + if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv)) return -ENODEV;
return single_open(file, pri_wm_latency_show, dev_priv); @@@ -4020,6 -4055,8 +4059,8 @@@ static ssize_t wm_latency_write(struct num_levels = 3; else if (IS_VALLEYVIEW(dev_priv)) num_levels = 1; + else if (IS_G4X(dev_priv)) + num_levels = 3; else num_levels = ilk_wm_max_level(dev_priv) + 1;
@@@ -4268,26 -4305,27 +4309,27 @@@ i915_drop_caches_set(void *data, u64 va { struct drm_i915_private *dev_priv = data; struct drm_device *dev = &dev_priv->drm; - int ret; + int ret = 0;
DRM_DEBUG("Dropping caches: 0x%08llx\n", val);
/* No need to check and wait for gpu resets, only libdrm auto-restarts * on ioctls on -EAGAIN. */ - ret = mutex_lock_interruptible(&dev->struct_mutex); - if (ret) - return ret; - - if (val & DROP_ACTIVE) { - ret = i915_gem_wait_for_idle(dev_priv, - I915_WAIT_INTERRUPTIBLE | - I915_WAIT_LOCKED); + if (val & (DROP_ACTIVE | DROP_RETIRE)) { + ret = mutex_lock_interruptible(&dev->struct_mutex); if (ret) - goto unlock; - } + return ret; + + if (val & DROP_ACTIVE) + ret = i915_gem_wait_for_idle(dev_priv, + I915_WAIT_INTERRUPTIBLE | + I915_WAIT_LOCKED);
- if (val & DROP_RETIRE) - i915_gem_retire_requests(dev_priv); + if (val & DROP_RETIRE) + i915_gem_retire_requests(dev_priv); + + mutex_unlock(&dev->struct_mutex); + }
lockdep_set_current_reclaim_state(GFP_KERNEL); if (val & DROP_BOUND) @@@ -4300,9 -4338,6 +4342,6 @@@ i915_gem_shrink_all(dev_priv); lockdep_clear_current_reclaim_state();
- unlock: - mutex_unlock(&dev->struct_mutex); - if (val & DROP_FREED) { synchronize_rcu(); i915_gem_drain_freed_objects(dev_priv); @@@ -4780,6 -4815,8 +4819,8 @@@ static const struct drm_info_list i915_ {"i915_guc_info", i915_guc_info, 0}, {"i915_guc_load_status", i915_guc_load_status_info, 0}, {"i915_guc_log_dump", i915_guc_log_dump, 0}, + {"i915_guc_load_err_log_dump", i915_guc_log_dump, 0, (void *)1}, + {"i915_guc_stage_pool", i915_guc_stage_pool, 0}, {"i915_huc_load_status", i915_huc_load_status_info, 0}, {"i915_frequency_info", i915_frequency_info, 0}, {"i915_hangcheck_info", i915_hangcheck_info, 0}, @@@ -4838,7 -4875,7 +4879,7 @@@ static const struct i915_debugfs_files {"i915_pri_wm_latency", &i915_pri_wm_latency_fops}, {"i915_spr_wm_latency", &i915_spr_wm_latency_fops}, {"i915_cur_wm_latency", &i915_cur_wm_latency_fops}, - {"i915_fbc_false_color", &i915_fbc_fc_fops}, + {"i915_fbc_false_color", &i915_fbc_false_color_fops}, {"i915_dp_test_data", &i915_displayport_test_data_fops}, {"i915_dp_test_type", &i915_displayport_test_type_fops}, {"i915_dp_test_active", &i915_displayport_test_active_fops}, diff --combined drivers/gpu/drm/i915/i915_gem_request.h index a4a920c4c454,7b7c84369d78..7579b9702c22 --- a/drivers/gpu/drm/i915/i915_gem_request.h +++ b/drivers/gpu/drm/i915/i915_gem_request.h @@@ -67,12 -67,18 +67,18 @@@ struct i915_dependency struct i915_priotree { struct list_head signalers_list; /* those before us, we depend upon */ struct list_head waiters_list; /* those after us, they depend upon us */ - struct rb_node node; + struct list_head link; int priority; #define I915_PRIORITY_MAX 1024 + #define I915_PRIORITY_NORMAL 0 #define I915_PRIORITY_MIN (-I915_PRIORITY_MAX) };
+ struct i915_gem_capture_list { + struct i915_gem_capture_list *next; + struct i915_vma *vma; + }; + /** * Request queue structure. * @@@ -123,7 -129,7 +129,7 @@@ struct drm_i915_gem_request * It is used by the driver to then queue the request for execution. */ struct i915_sw_fence submit; - wait_queue_t submitq; + wait_queue_entry_t submitq; wait_queue_head_t execute;
/* A list of everyone we wait upon, and everyone who waits upon us. @@@ -167,6 -173,12 +173,12 @@@ * error state dump only). */ struct i915_vma *batch; + /** Additional buffers requested by userspace to be captured upon + * a GPU hang. The vma/obj on this list are protected by their + * active reference - all objects on this list must also be + * on the active_list (of their final request). + */ + struct i915_gem_capture_list *capture_list; struct list_head active_list;
/** Time at which this request was emitted, in jiffies. */ diff --combined drivers/gpu/drm/i915/i915_sw_fence.c index 380de4360b8a,474d23c0c0ce..f29540f922af --- a/drivers/gpu/drm/i915/i915_sw_fence.c +++ b/drivers/gpu/drm/i915/i915_sw_fence.c @@@ -12,6 -12,7 +12,7 @@@ #include <linux/reservation.h>
#include "i915_sw_fence.h" + #include "i915_selftest.h"
#define I915_SW_FENCE_FLAG_ALLOC BIT(3) /* after WQ_FLAG_* for safety */
@@@ -120,39 -121,11 +121,11 @@@ void i915_sw_fence_fini(struct i915_sw_ } #endif
- static void i915_sw_fence_release(struct kref *kref) - { - struct i915_sw_fence *fence = container_of(kref, typeof(*fence), kref); - - WARN_ON(atomic_read(&fence->pending) > 0); - debug_fence_destroy(fence); - - if (fence->flags & I915_SW_FENCE_MASK) { - __i915_sw_fence_notify(fence, FENCE_FREE); - } else { - i915_sw_fence_fini(fence); - kfree(fence); - } - } - - static void i915_sw_fence_put(struct i915_sw_fence *fence) - { - debug_fence_assert(fence); - kref_put(&fence->kref, i915_sw_fence_release); - } - - static struct i915_sw_fence *i915_sw_fence_get(struct i915_sw_fence *fence) - { - debug_fence_assert(fence); - kref_get(&fence->kref); - return fence; - } - static void __i915_sw_fence_wake_up_all(struct i915_sw_fence *fence, struct list_head *continuation) { wait_queue_head_t *x = &fence->wait; - wait_queue_t *pos, *next; + wait_queue_entry_t *pos, *next; unsigned long flags;
debug_fence_deactivate(fence); @@@ -160,30 -133,31 +133,30 @@@
/* * To prevent unbounded recursion as we traverse the graph of - * i915_sw_fences, we move the task_list from this, the next ready - * fence, to the tail of the original fence's task_list + * i915_sw_fences, we move the entry list from this, the next ready + * fence, to the tail of the original fence's entry list * (and so added to the list to be woken). */
spin_lock_irqsave_nested(&x->lock, flags, 1 + !!continuation); if (continuation) { - list_for_each_entry_safe(pos, next, &x->task_list, task_list) { + list_for_each_entry_safe(pos, next, &x->head, entry) { if (pos->func == autoremove_wake_function) pos->func(pos, TASK_NORMAL, 0, continuation); else - list_move_tail(&pos->task_list, continuation); + list_move_tail(&pos->entry, continuation); } } else { LIST_HEAD(extra);
do { - list_for_each_entry_safe(pos, next, - &x->task_list, task_list) + list_for_each_entry_safe(pos, next, &x->head, entry) pos->func(pos, TASK_NORMAL, 0, &extra);
if (list_empty(&extra)) break;
- list_splice_tail_init(&extra, &x->task_list); + list_splice_tail_init(&extra, &x->head); } while (1); } spin_unlock_irqrestore(&x->lock, flags); @@@ -201,13 -175,15 +174,15 @@@ static void __i915_sw_fence_complete(st
debug_fence_set_state(fence, DEBUG_FENCE_IDLE, DEBUG_FENCE_NOTIFY);
- if (fence->flags & I915_SW_FENCE_MASK && - __i915_sw_fence_notify(fence, FENCE_COMPLETE) != NOTIFY_DONE) + if (__i915_sw_fence_notify(fence, FENCE_COMPLETE) != NOTIFY_DONE) return;
debug_fence_set_state(fence, DEBUG_FENCE_NOTIFY, DEBUG_FENCE_IDLE);
__i915_sw_fence_wake_up_all(fence, continuation); + + debug_fence_destroy(fence); + __i915_sw_fence_notify(fence, FENCE_FREE); }
static void i915_sw_fence_complete(struct i915_sw_fence *fence) @@@ -231,33 -207,26 +206,26 @@@ void __i915_sw_fence_init(struct i915_s const char *name, struct lock_class_key *key) { - BUG_ON((unsigned long)fn & ~I915_SW_FENCE_MASK); + BUG_ON(!fn || (unsigned long)fn & ~I915_SW_FENCE_MASK);
debug_fence_init(fence);
__init_waitqueue_head(&fence->wait, name, key); - kref_init(&fence->kref); atomic_set(&fence->pending, 1); fence->flags = (unsigned long)fn; }
- static void __i915_sw_fence_commit(struct i915_sw_fence *fence) - { - i915_sw_fence_complete(fence); - i915_sw_fence_put(fence); - } - void i915_sw_fence_commit(struct i915_sw_fence *fence) { debug_fence_activate(fence); - __i915_sw_fence_commit(fence); + i915_sw_fence_complete(fence); }
-static int i915_sw_fence_wake(wait_queue_t *wq, unsigned mode, int flags, void *key) +static int i915_sw_fence_wake(wait_queue_entry_t *wq, unsigned mode, int flags, void *key) { - list_del(&wq->task_list); + list_del(&wq->entry); __i915_sw_fence_complete(wq->private, key); - i915_sw_fence_put(wq->private); + if (wq->flags & I915_SW_FENCE_FLAG_ALLOC) kfree(wq); return 0; @@@ -266,7 -235,7 +234,7 @@@ static bool __i915_sw_fence_check_if_after(struct i915_sw_fence *fence, const struct i915_sw_fence * const signaler) { - wait_queue_t *wq; + wait_queue_entry_t *wq;
if (__test_and_set_bit(I915_SW_FENCE_CHECKED_BIT, &fence->flags)) return false; @@@ -274,7 -243,7 +242,7 @@@ if (fence == signaler) return true;
- list_for_each_entry(wq, &fence->wait.task_list, task_list) { + list_for_each_entry(wq, &fence->wait.head, entry) { if (wq->func != i915_sw_fence_wake) continue;
@@@ -287,12 -256,12 +255,12 @@@
static void __i915_sw_fence_clear_checked_bit(struct i915_sw_fence *fence) { - wait_queue_t *wq; + wait_queue_entry_t *wq;
if (!__test_and_clear_bit(I915_SW_FENCE_CHECKED_BIT, &fence->flags)) return;
- list_for_each_entry(wq, &fence->wait.task_list, task_list) { + list_for_each_entry(wq, &fence->wait.head, entry) { if (wq->func != i915_sw_fence_wake) continue;
@@@ -306,7 -275,7 +274,7 @@@ static bool i915_sw_fence_check_if_afte unsigned long flags; bool err;
- if (!IS_ENABLED(CONFIG_I915_SW_FENCE_CHECK_DAG)) + if (!IS_ENABLED(CONFIG_DRM_I915_SW_FENCE_CHECK_DAG)) return false;
spin_lock_irqsave(&i915_sw_fence_lock, flags); @@@ -319,7 -288,7 +287,7 @@@
static int __i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence, struct i915_sw_fence *signaler, - wait_queue_t *wq, gfp_t gfp) + wait_queue_entry_t *wq, gfp_t gfp) { unsigned long flags; int pending; @@@ -349,16 -318,16 +317,16 @@@ pending |= I915_SW_FENCE_FLAG_ALLOC; }
- INIT_LIST_HEAD(&wq->task_list); + INIT_LIST_HEAD(&wq->entry); wq->flags = pending; wq->func = i915_sw_fence_wake; - wq->private = i915_sw_fence_get(fence); + wq->private = fence;
i915_sw_fence_await(fence);
spin_lock_irqsave(&signaler->wait.lock, flags); if (likely(!i915_sw_fence_done(signaler))) { - __add_wait_queue_tail(&signaler->wait, wq); + __add_wait_queue_entry_tail(&signaler->wait, wq); pending = 1; } else { i915_sw_fence_wake(wq, 0, 0, NULL); @@@ -371,7 -340,7 +339,7 @@@
int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence, struct i915_sw_fence *signaler, - wait_queue_t *wq) + wait_queue_entry_t *wq) { return __i915_sw_fence_await_sw_fence(fence, signaler, wq, 0); } @@@ -401,7 -370,7 +369,7 @@@ static void timer_i915_sw_fence_wake(un dma_fence_put(cb->dma); cb->dma = NULL;
- __i915_sw_fence_commit(cb->fence); + i915_sw_fence_complete(cb->fence); cb->timer.function = NULL; }
@@@ -412,7 -381,7 +380,7 @@@ static void dma_i915_sw_fence_wake(stru
del_timer_sync(&cb->timer); if (cb->timer.function) - __i915_sw_fence_commit(cb->fence); + i915_sw_fence_complete(cb->fence); dma_fence_put(cb->dma);
kfree(cb); @@@ -439,7 -408,7 +407,7 @@@ int i915_sw_fence_await_dma_fence(struc return dma_fence_wait(dma, false); }
- cb->fence = i915_sw_fence_get(fence); + cb->fence = fence; i915_sw_fence_await(fence);
cb->dma = NULL; @@@ -522,3 -491,7 +490,7 @@@ int i915_sw_fence_await_reservation(str
return ret; } + + #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) + #include "selftests/i915_sw_fence.c" + #endif diff --combined drivers/gpu/drm/i915/i915_sw_fence.h index fd3c3bf6c8b7,1d3b6051daaf..fe2ef4dadfc6 --- a/drivers/gpu/drm/i915/i915_sw_fence.h +++ b/drivers/gpu/drm/i915/i915_sw_fence.h @@@ -23,7 -23,6 +23,6 @@@ struct reservation_object struct i915_sw_fence { wait_queue_head_t wait; unsigned long flags; - struct kref kref; atomic_t pending; };
@@@ -66,7 -65,7 +65,7 @@@ void i915_sw_fence_commit(struct i915_s
int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence, struct i915_sw_fence *after, - wait_queue_t *wq); + wait_queue_entry_t *wq); int i915_sw_fence_await_sw_fence_gfp(struct i915_sw_fence *fence, struct i915_sw_fence *after, gfp_t gfp); diff --combined drivers/gpu/drm/i915/i915_vma.c index f066e2d785f5,532c709febbd..1cfe137cdc32 --- a/drivers/gpu/drm/i915/i915_vma.c +++ b/drivers/gpu/drm/i915/i915_vma.c @@@ -85,12 -85,12 +85,12 @@@ vma_create(struct drm_i915_gem_object * if (vma == NULL) return ERR_PTR(-ENOMEM);
- INIT_LIST_HEAD(&vma->exec_list); for (i = 0; i < ARRAY_SIZE(vma->last_read); i++) init_request_active(&vma->last_read[i], i915_vma_retire); init_request_active(&vma->last_fence, NULL); vma->vm = vm; vma->obj = obj; + vma->resv = obj->resv; vma->size = obj->base.size; vma->display_alignment = I915_GTT_MIN_ALIGNMENT;
@@@ -464,7 -464,7 +464,7 @@@ i915_vma_insert(struct i915_vma *vma, u size, obj->base.size, flags & PIN_MAPPABLE ? "mappable" : "total", end); - return -E2BIG; + return -ENOSPC; }
ret = i915_gem_object_pin_pages(obj); @@@ -577,7 -577,7 +577,7 @@@ err_unpin return ret; }
- void i915_vma_destroy(struct i915_vma *vma) + static void i915_vma_destroy(struct i915_vma *vma) { GEM_BUG_ON(vma->node.allocated); GEM_BUG_ON(i915_vma_is_active(vma)); @@@ -591,11 -591,33 +591,33 @@@ kmem_cache_free(to_i915(vma->obj->base.dev)->vmas, vma); }
+ void i915_vma_unlink_ctx(struct i915_vma *vma) + { + struct i915_gem_context *ctx = vma->ctx; + + if (ctx->vma_lut.ht_size & I915_CTX_RESIZE_IN_PROGRESS) { + cancel_work_sync(&ctx->vma_lut.resize); + ctx->vma_lut.ht_size &= ~I915_CTX_RESIZE_IN_PROGRESS; + } + + __hlist_del(&vma->ctx_node); + ctx->vma_lut.ht_count--; + + if (i915_vma_is_ggtt(vma)) + vma->obj->vma_hashed = NULL; + vma->ctx = NULL; + + i915_vma_put(vma); + } + void i915_vma_close(struct i915_vma *vma) { GEM_BUG_ON(i915_vma_is_closed(vma)); vma->flags |= I915_VMA_CLOSED;
+ if (vma->ctx) + i915_vma_unlink_ctx(vma); + list_del(&vma->obj_link); rb_erase(&vma->obj_node, &vma->obj->vma_tree);
@@@ -650,11 -672,6 +672,11 @@@ int i915_vma_unbind(struct i915_vma *vm break; }
+ if (!ret) { + ret = i915_gem_active_retire(&vma->last_fence, + &vma->vm->i915->drm.struct_mutex); + } + __i915_vma_unpin(vma); if (ret) return ret; diff --combined drivers/gpu/drm/radeon/Makefile index 640f8b3f9443,a5d3cd3ecb5f..4acbb944bcd2 --- a/drivers/gpu/drm/radeon/Makefile +++ b/drivers/gpu/drm/radeon/Makefile @@@ -2,7 -2,7 +2,7 @@@ # Makefile for the drm device driver. This driver provides support for the # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
- ccflags-y := -Iinclude/drm -Idrivers/gpu/drm/amd/include + ccflags-y := -Idrivers/gpu/drm/amd/include
hostprogs-y := mkregtable clean-files := rn50_reg_safe.h r100_reg_safe.h r200_reg_safe.h rv515_reg_safe.h r300_reg_safe.h r420_reg_safe.h rs600_reg_safe.h r600_reg_safe.h evergreen_reg_safe.h cayman_reg_safe.h @@@ -105,6 -105,7 +105,6 @@@ radeon-y += vce_v2_0.o \ radeon_kfd.o
-radeon-$(CONFIG_COMPAT) += radeon_ioc32.o radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o radeon-$(CONFIG_ACPI) += radeon_acpi.o
diff --combined drivers/gpu/drm/radeon/radeon.h index e562a78510ff,68be1bfa22b9..5008f3d4cccc --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@@ -68,11 -68,11 +68,11 @@@ #include <linux/hashtable.h> #include <linux/dma-fence.h>
- #include <ttm/ttm_bo_api.h> - #include <ttm/ttm_bo_driver.h> - #include <ttm/ttm_placement.h> - #include <ttm/ttm_module.h> - #include <ttm/ttm_execbuf_util.h> + #include <drm/ttm/ttm_bo_api.h> + #include <drm/ttm/ttm_bo_driver.h> + #include <drm/ttm/ttm_placement.h> + #include <drm/ttm/ttm_module.h> + #include <drm/ttm/ttm_execbuf_util.h>
#include <drm/drm_gem.h>
@@@ -115,6 -115,8 +115,8 @@@ extern int radeon_auxch extern int radeon_mst; extern int radeon_uvd; extern int radeon_vce; + extern int radeon_si_support; + extern int radeon_cik_support;
/* * Copy from radeon_drv.h so we don't have to include both and have conflicting @@@ -375,7 -377,7 +377,7 @@@ struct radeon_fence unsigned ring; bool is_vm_update;
- wait_queue_t fence_wake; + wait_queue_entry_t fence_wake; };
int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring); @@@ -767,24 -769,9 +769,9 @@@ struct r600_irq_stat_regs };
struct evergreen_irq_stat_regs { - u32 disp_int; - u32 disp_int_cont; - u32 disp_int_cont2; - u32 disp_int_cont3; - u32 disp_int_cont4; - u32 disp_int_cont5; - u32 d1grph_int; - u32 d2grph_int; - u32 d3grph_int; - u32 d4grph_int; - u32 d5grph_int; - u32 d6grph_int; - u32 afmt_status1; - u32 afmt_status2; - u32 afmt_status3; - u32 afmt_status4; - u32 afmt_status5; - u32 afmt_status6; + u32 disp_int[6]; + u32 grph_int[6]; + u32 afmt_status[6]; };
struct cik_irq_stat_regs { @@@ -2976,6 -2963,12 +2963,12 @@@ int r600_cs_common_vline_parse(struct r uint32_t *vline_start_end, uint32_t *vline_status);
+ /* interrupt control register helpers */ + void radeon_irq_kms_set_irq_n_enabled(struct radeon_device *rdev, + u32 reg, u32 mask, + bool enable, const char *name, + unsigned n); + #include "radeon_object.h"
#endif diff --combined drivers/gpu/drm/radeon/radeon_drv.c index e25cb51ce0ca,b23c771f4216..74abd161237b --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c @@@ -38,11 -38,10 +38,11 @@@ #include <linux/module.h> #include <linux/pm_runtime.h> #include <linux/vga_switcheroo.h> +#include <linux/compat.h> #include <drm/drm_gem.h> #include <drm/drm_fb_helper.h>
- #include "drm_crtc_helper.h" + #include <drm/drm_crtc_helper.h> #include "radeon_kfd.h"
/* @@@ -116,10 -115,6 +116,6 @@@ int radeon_resume_kms(struct drm_devic u32 radeon_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe); int radeon_enable_vblank_kms(struct drm_device *dev, unsigned int pipe); void radeon_disable_vblank_kms(struct drm_device *dev, unsigned int pipe); - int radeon_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe, - int *max_error, - struct timeval *vblank_time, - unsigned flags); void radeon_driver_irq_preinstall_kms(struct drm_device *dev); int radeon_driver_irq_postinstall_kms(struct drm_device *dev); void radeon_driver_irq_uninstall_kms(struct drm_device *dev); @@@ -155,6 -150,8 +151,6 @@@ void radeon_gem_prime_unpin(struct drm_ struct reservation_object *radeon_gem_prime_res_obj(struct drm_gem_object *); void *radeon_gem_prime_vmap(struct drm_gem_object *obj); void radeon_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); -extern long radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd, - unsigned long arg);
/* atpx handler */ #if defined(CONFIG_VGA_SWITCHEROO) @@@ -298,6 -295,14 +294,14 @@@ module_param_named(uvd, radeon_uvd, int MODULE_PARM_DESC(vce, "vce enable/disable vce support (1 = enable, 0 = disable)"); module_param_named(vce, radeon_vce, int, 0444);
+ int radeon_si_support = 1; + MODULE_PARM_DESC(si_support, "SI support (1 = enabled (default), 0 = disabled)"); + module_param_named(si_support, radeon_si_support, int, 0444); + + int radeon_cik_support = 1; + MODULE_PARM_DESC(cik_support, "CIK support (1 = enabled (default), 0 = disabled)"); + module_param_named(cik_support, radeon_cik_support, int, 0444); + static struct pci_device_id pciidlist[] = { radeon_PCI_IDS }; @@@ -504,21 -509,6 +508,21 @@@ long radeon_drm_ioctl(struct file *filp return ret; }
+#ifdef CONFIG_COMPAT +static long radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + unsigned int nr = DRM_IOCTL_NR(cmd); + int ret; + + if (nr < DRM_COMMAND_BASE) + return drm_compat_ioctl(filp, cmd, arg); + + ret = radeon_drm_ioctl(filp, cmd, arg); + + return ret; +} +#endif + static const struct dev_pm_ops radeon_pm_ops = { .suspend = radeon_pmops_suspend, .resume = radeon_pmops_resume, @@@ -544,6 -534,16 +548,16 @@@ static const struct file_operations rad #endif };
+ static bool + radeon_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe, + bool in_vblank_irq, int *vpos, int *hpos, + ktime_t *stime, ktime_t *etime, + const struct drm_display_mode *mode) + { + return radeon_get_crtc_scanoutpos(dev, pipe, 0, vpos, hpos, + stime, etime, mode); + } + static struct drm_driver kms_driver = { .driver_features = DRIVER_USE_AGP | @@@ -558,8 -558,8 +572,8 @@@ .get_vblank_counter = radeon_get_vblank_counter_kms, .enable_vblank = radeon_enable_vblank_kms, .disable_vblank = radeon_disable_vblank_kms, - .get_vblank_timestamp = radeon_get_vblank_timestamp_kms, - .get_scanout_position = radeon_get_crtc_scanoutpos, + .get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos, + .get_scanout_position = radeon_get_crtc_scanout_position, .irq_preinstall = radeon_driver_irq_preinstall_kms, .irq_postinstall = radeon_driver_irq_postinstall_kms, .irq_uninstall = radeon_driver_irq_uninstall_kms, diff --combined sound/x86/intel_hdmi_audio.c index 37f06ffdf1e6,c19efc9708d7..a0951505c7f5 --- a/sound/x86/intel_hdmi_audio.c +++ b/sound/x86/intel_hdmi_audio.c @@@ -42,6 -42,11 +42,11 @@@ #include <drm/intel_lpe_audio.h> #include "intel_hdmi_audio.h"
+ #define for_each_pipe(card_ctx, pipe) \ + for ((pipe) = 0; (pipe) < (card_ctx)->num_pipes; (pipe)++) + #define for_each_port(card_ctx, port) \ + for ((port) = 0; (port) < (card_ctx)->num_ports; (port)++) + /*standard module options for ALSA. This module supports only one card*/ static int hdmi_card_index = SNDRV_DEFAULT_IDX1; static char *hdmi_card_id = SNDRV_DEFAULT_STR1; @@@ -189,15 -194,30 +194,30 @@@ static void had_substream_put(struct sn spin_unlock_irqrestore(&intelhaddata->had_spinlock, flags); }
+ static u32 had_config_offset(int pipe) + { + switch (pipe) { + default: + case 0: + return AUDIO_HDMI_CONFIG_A; + case 1: + return AUDIO_HDMI_CONFIG_B; + case 2: + return AUDIO_HDMI_CONFIG_C; + } + } + /* Register access functions */ - static u32 had_read_register_raw(struct snd_intelhad *ctx, u32 reg) + static u32 had_read_register_raw(struct snd_intelhad_card *card_ctx, + int pipe, u32 reg) { - return ioread32(ctx->mmio_start + ctx->had_config_offset + reg); + return ioread32(card_ctx->mmio_start + had_config_offset(pipe) + reg); }
- static void had_write_register_raw(struct snd_intelhad *ctx, u32 reg, u32 val) + static void had_write_register_raw(struct snd_intelhad_card *card_ctx, + int pipe, u32 reg, u32 val) { - iowrite32(val, ctx->mmio_start + ctx->had_config_offset + reg); + iowrite32(val, card_ctx->mmio_start + had_config_offset(pipe) + reg); }
static void had_read_register(struct snd_intelhad *ctx, u32 reg, u32 *val) @@@ -205,13 -225,13 +225,13 @@@ if (!ctx->connected) *val = 0; else - *val = had_read_register_raw(ctx, reg); + *val = had_read_register_raw(ctx->card_ctx, ctx->pipe, reg); }
static void had_write_register(struct snd_intelhad *ctx, u32 reg, u32 val) { if (ctx->connected) - had_write_register_raw(ctx, reg, val); + had_write_register_raw(ctx->card_ctx, ctx->pipe, reg, val); }
/* @@@ -1358,6 -1378,9 +1378,9 @@@ static void had_process_hot_plug(struc return; }
+ /* Disable Audio */ + had_enable_audio(intelhaddata, false); + intelhaddata->connected = true; dev_dbg(intelhaddata->dev, "%s @ %d:DEBUG PLUG/UNPLUG : HAD_DRV_CONNECTED\n", @@@ -1519,22 -1542,32 +1542,32 @@@ static const struct snd_kcontrol_new ha */ static irqreturn_t display_pipe_interrupt_handler(int irq, void *dev_id) { - struct snd_intelhad *ctx = dev_id; - u32 audio_stat; + struct snd_intelhad_card *card_ctx = dev_id; + u32 audio_stat[3] = {}; + int pipe, port; + + for_each_pipe(card_ctx, pipe) { + /* use raw register access to ack IRQs even while disconnected */ + audio_stat[pipe] = had_read_register_raw(card_ctx, pipe, + AUD_HDMI_STATUS) & + (HDMI_AUDIO_UNDERRUN | HDMI_AUDIO_BUFFER_DONE); + + if (audio_stat[pipe]) + had_write_register_raw(card_ctx, pipe, + AUD_HDMI_STATUS, audio_stat[pipe]); + }
- /* use raw register access to ack IRQs even while disconnected */ - audio_stat = had_read_register_raw(ctx, AUD_HDMI_STATUS); + for_each_port(card_ctx, port) { + struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port]; + int pipe = ctx->pipe;
- if (audio_stat & HDMI_AUDIO_UNDERRUN) { - had_write_register_raw(ctx, AUD_HDMI_STATUS, - HDMI_AUDIO_UNDERRUN); - had_process_buffer_underrun(ctx); - } + if (pipe < 0) + continue;
- if (audio_stat & HDMI_AUDIO_BUFFER_DONE) { - had_write_register_raw(ctx, AUD_HDMI_STATUS, - HDMI_AUDIO_BUFFER_DONE); - had_process_buffer_done(ctx); + if (audio_stat[pipe] & HDMI_AUDIO_BUFFER_DONE) + had_process_buffer_done(ctx); + if (audio_stat[pipe] & HDMI_AUDIO_UNDERRUN) + had_process_buffer_underrun(ctx); }
return IRQ_HANDLED; @@@ -1543,9 -1576,10 +1576,10 @@@ /* * monitor plug/unplug notification from i915; just kick off the work */ - static void notify_audio_lpe(struct platform_device *pdev) + static void notify_audio_lpe(struct platform_device *pdev, int port) { - struct snd_intelhad *ctx = platform_get_drvdata(pdev); + struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev); + struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
schedule_work(&ctx->hdmi_audio_wq); } @@@ -1556,47 -1590,51 +1590,51 @@@ static void had_audio_wq(struct work_st struct snd_intelhad *ctx = container_of(work, struct snd_intelhad, hdmi_audio_wq); struct intel_hdmi_lpe_audio_pdata *pdata = ctx->dev->platform_data; + struct intel_hdmi_lpe_audio_port_pdata *ppdata = &pdata->port[ctx->port];
pm_runtime_get_sync(ctx->dev); mutex_lock(&ctx->mutex); - if (!pdata->hdmi_connected) { - dev_dbg(ctx->dev, "%s: Event: HAD_NOTIFY_HOT_UNPLUG\n", - __func__); + if (ppdata->pipe < 0) { + dev_dbg(ctx->dev, "%s: Event: HAD_NOTIFY_HOT_UNPLUG : port = %d\n", + __func__, ctx->port); + memset(ctx->eld, 0, sizeof(ctx->eld)); /* clear the old ELD */ + + ctx->dp_output = false; + ctx->tmds_clock_speed = 0; + ctx->link_rate = 0; + + /* Shut down the stream */ had_process_hot_unplug(ctx); - } else { - struct intel_hdmi_lpe_audio_eld *eld = &pdata->eld;
+ ctx->pipe = -1; + } else { dev_dbg(ctx->dev, "%s: HAD_NOTIFY_ELD : port = %d, tmds = %d\n", - __func__, eld->port_id, pdata->tmds_clock_speed); - - switch (eld->pipe_id) { - case 0: - ctx->had_config_offset = AUDIO_HDMI_CONFIG_A; - break; - case 1: - ctx->had_config_offset = AUDIO_HDMI_CONFIG_B; - break; - case 2: - ctx->had_config_offset = AUDIO_HDMI_CONFIG_C; - break; - default: - dev_dbg(ctx->dev, "Invalid pipe %d\n", - eld->pipe_id); - break; - } + __func__, ctx->port, ppdata->ls_clock);
- memcpy(ctx->eld, eld->eld_data, sizeof(ctx->eld)); + memcpy(ctx->eld, ppdata->eld, sizeof(ctx->eld));
- ctx->dp_output = pdata->dp_output; - ctx->tmds_clock_speed = pdata->tmds_clock_speed; - ctx->link_rate = pdata->link_rate; + ctx->dp_output = ppdata->dp_output; + if (ctx->dp_output) { + ctx->tmds_clock_speed = 0; + ctx->link_rate = ppdata->ls_clock; + } else { + ctx->tmds_clock_speed = ppdata->ls_clock; + ctx->link_rate = 0; + }
+ /* + * Shut down the stream before we change + * the pipe assignment for this pcm device + */ had_process_hot_plug(ctx);
- /* Process mode change if stream is active */ + ctx->pipe = ppdata->pipe; + + /* Restart the stream if necessary */ had_process_mode_change(ctx); } + mutex_unlock(&ctx->mutex); pm_runtime_mark_last_busy(ctx->dev); pm_runtime_put_autosuspend(ctx->dev); @@@ -1605,11 -1643,17 +1643,17 @@@ /* * Jack interface */ - static int had_create_jack(struct snd_intelhad *ctx) + static int had_create_jack(struct snd_intelhad *ctx, + struct snd_pcm *pcm) { + char hdmi_str[32]; int err;
- err = snd_jack_new(ctx->card, "HDMI/DP", SND_JACK_AVOUT, &ctx->jack, + snprintf(hdmi_str, sizeof(hdmi_str), + "HDMI/DP,pcm=%d", pcm->device); + + err = snd_jack_new(ctx->card_ctx->card, hdmi_str, + SND_JACK_AVOUT, &ctx->jack, true, false); if (err < 0) return err; @@@ -1623,13 -1667,18 +1667,18 @@@
static int hdmi_lpe_audio_runtime_suspend(struct device *dev) { - struct snd_intelhad *ctx = dev_get_drvdata(dev); - struct snd_pcm_substream *substream; + struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev); + int port;
- substream = had_substream_get(ctx); - if (substream) { - snd_pcm_suspend(substream); - had_substream_put(ctx); + for_each_port(card_ctx, port) { + struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port]; + struct snd_pcm_substream *substream; + + substream = had_substream_get(ctx); + if (substream) { + snd_pcm_suspend(substream); + had_substream_put(ctx); + } }
return 0; @@@ -1637,12 -1686,12 +1686,12 @@@
static int __maybe_unused hdmi_lpe_audio_suspend(struct device *dev) { - struct snd_intelhad *ctx = dev_get_drvdata(dev); + struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev); int err;
err = hdmi_lpe_audio_runtime_suspend(dev); if (!err) - snd_power_change_state(ctx->card, SNDRV_CTL_POWER_D3hot); + snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D3hot); return err; }
@@@ -1654,24 -1703,34 +1703,34 @@@ static int hdmi_lpe_audio_runtime_resum
static int __maybe_unused hdmi_lpe_audio_resume(struct device *dev) { - struct snd_intelhad *ctx = dev_get_drvdata(dev); + struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev);
hdmi_lpe_audio_runtime_resume(dev); - snd_power_change_state(ctx->card, SNDRV_CTL_POWER_D0); + snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D0); return 0; }
/* release resources */ static void hdmi_lpe_audio_free(struct snd_card *card) { - struct snd_intelhad *ctx = card->private_data; + struct snd_intelhad_card *card_ctx = card->private_data; + struct intel_hdmi_lpe_audio_pdata *pdata = card_ctx->dev->platform_data; + int port; + + spin_lock_irq(&pdata->lpe_audio_slock); + pdata->notify_audio_lpe = NULL; + spin_unlock_irq(&pdata->lpe_audio_slock);
- cancel_work_sync(&ctx->hdmi_audio_wq); + for_each_port(card_ctx, port) { + struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
- if (ctx->mmio_start) - iounmap(ctx->mmio_start); - if (ctx->irq >= 0) - free_irq(ctx->irq, ctx); + cancel_work_sync(&ctx->hdmi_audio_wq); + } + + if (card_ctx->mmio_start) + iounmap(card_ctx->mmio_start); + if (card_ctx->irq >= 0) + free_irq(card_ctx->irq, card_ctx); }
/* @@@ -1683,12 -1742,12 +1742,12 @@@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) { struct snd_card *card; - struct snd_intelhad *ctx; + struct snd_intelhad_card *card_ctx; struct snd_pcm *pcm; struct intel_hdmi_lpe_audio_pdata *pdata; int irq; struct resource *res_mmio; - int i, ret; + int port, ret;
pdata = pdev->dev.platform_data; if (!pdata) { @@@ -1699,8 -1758,8 +1758,8 @@@ /* get resources */ irq = platform_get_irq(pdev, 0); if (irq < 0) { - dev_err(&pdev->dev, "Could not get irq resource\n"); - return -ENODEV; + dev_err(&pdev->dev, "Could not get irq resource: %d\n", irq); + return irq; }
res_mmio = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@@ -1711,39 -1770,30 +1770,30 @@@
/* create a card instance with ALSA framework */ ret = snd_card_new(&pdev->dev, hdmi_card_index, hdmi_card_id, - THIS_MODULE, sizeof(*ctx), &card); + THIS_MODULE, sizeof(*card_ctx), &card); if (ret) return ret;
- ctx = card->private_data; - spin_lock_init(&ctx->had_spinlock); - mutex_init(&ctx->mutex); - ctx->connected = false; - ctx->dev = &pdev->dev; - ctx->card = card; - ctx->aes_bits = SNDRV_PCM_DEFAULT_CON_SPDIF; + card_ctx = card->private_data; + card_ctx->dev = &pdev->dev; + card_ctx->card = card; strcpy(card->driver, INTEL_HAD); strcpy(card->shortname, "Intel HDMI/DP LPE Audio"); strcpy(card->longname, "Intel HDMI/DP LPE Audio");
- ctx->irq = -1; - ctx->tmds_clock_speed = DIS_SAMPLE_RATE_148_5; - INIT_WORK(&ctx->hdmi_audio_wq, had_audio_wq); + card_ctx->irq = -1;
card->private_free = hdmi_lpe_audio_free;
- /* assume pipe A as default */ - ctx->had_config_offset = AUDIO_HDMI_CONFIG_A; - - platform_set_drvdata(pdev, ctx); + platform_set_drvdata(pdev, card_ctx);
dev_dbg(&pdev->dev, "%s: mmio_start = 0x%x, mmio_end = 0x%x\n", __func__, (unsigned int)res_mmio->start, (unsigned int)res_mmio->end);
- ctx->mmio_start = ioremap_nocache(res_mmio->start, - (size_t)(resource_size(res_mmio))); - if (!ctx->mmio_start) { + card_ctx->mmio_start = ioremap_nocache(res_mmio->start, + (size_t)(resource_size(res_mmio))); + if (!card_ctx->mmio_start) { dev_err(&pdev->dev, "Could not get ioremap\n"); ret = -EACCES; goto err; @@@ -1751,54 -1801,79 +1801,79 @@@
/* setup interrupt handler */ ret = request_irq(irq, display_pipe_interrupt_handler, 0, - pdev->name, ctx); + pdev->name, card_ctx); if (ret < 0) { dev_err(&pdev->dev, "request_irq failed\n"); goto err; }
- ctx->irq = irq; - - ret = snd_pcm_new(card, INTEL_HAD, PCM_INDEX, MAX_PB_STREAMS, - MAX_CAP_STREAMS, &pcm); - if (ret) - goto err; - - /* setup private data which can be retrieved when required */ - pcm->private_data = ctx; - pcm->info_flags = 0; - strncpy(pcm->name, card->shortname, strlen(card->shortname)); - /* setup the ops for playabck */ - snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &had_pcm_ops); + card_ctx->irq = irq;
/* only 32bit addressable */ dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
- /* allocate dma pages; - * try to allocate 600k buffer as default which is large enough - */ - snd_pcm_lib_preallocate_pages_for_all(pcm, - SNDRV_DMA_TYPE_DEV, NULL, - HAD_DEFAULT_BUFFER, HAD_MAX_BUFFER); + init_channel_allocations();
- /* create controls */ - for (i = 0; i < ARRAY_SIZE(had_controls); i++) { - ret = snd_ctl_add(card, snd_ctl_new1(&had_controls[i], ctx)); - if (ret < 0) + card_ctx->num_pipes = pdata->num_pipes; + card_ctx->num_ports = pdata->num_ports; + + for_each_port(card_ctx, port) { + struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port]; + int i; + + ctx->card_ctx = card_ctx; + ctx->dev = card_ctx->dev; + ctx->port = port; + ctx->pipe = -1; + + INIT_WORK(&ctx->hdmi_audio_wq, had_audio_wq); + + ret = snd_pcm_new(card, INTEL_HAD, port, MAX_PB_STREAMS, + MAX_CAP_STREAMS, &pcm); + if (ret) goto err; - }
- init_channel_allocations(); + /* setup private data which can be retrieved when required */ + pcm->private_data = ctx; + pcm->info_flags = 0; + strncpy(pcm->name, card->shortname, strlen(card->shortname)); + /* setup the ops for playabck */ + snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &had_pcm_ops);
- /* Register channel map controls */ - ret = had_register_chmap_ctls(ctx, pcm); - if (ret < 0) - goto err; + /* allocate dma pages; + * try to allocate 600k buffer as default which is large enough + */ + snd_pcm_lib_preallocate_pages_for_all(pcm, + SNDRV_DMA_TYPE_DEV, NULL, + HAD_DEFAULT_BUFFER, HAD_MAX_BUFFER); + + /* create controls */ + for (i = 0; i < ARRAY_SIZE(had_controls); i++) { + struct snd_kcontrol *kctl; + + kctl = snd_ctl_new1(&had_controls[i], ctx); + if (!kctl) { + ret = -ENOMEM; + goto err; + }
- ret = had_create_jack(ctx); - if (ret < 0) - goto err; + kctl->id.device = pcm->device; + + ret = snd_ctl_add(card, kctl); + if (ret < 0) + goto err; + } + + /* Register channel map controls */ + ret = had_register_chmap_ctls(ctx, pcm); + if (ret < 0) + goto err; + + ret = had_create_jack(ctx, pcm); + if (ret < 0) + goto err; + }
ret = snd_card_register(card); if (ret) @@@ -1806,7 -1881,6 +1881,6 @@@
spin_lock_irq(&pdata->lpe_audio_slock); pdata->notify_audio_lpe = notify_audio_lpe; - pdata->notify_pending = false; spin_unlock_irq(&pdata->lpe_audio_slock);
pm_runtime_use_autosuspend(&pdev->dev); @@@ -1814,7 -1888,11 +1888,11 @@@ pm_runtime_set_active(&pdev->dev);
dev_dbg(&pdev->dev, "%s: handle pending notification\n", __func__); - schedule_work(&ctx->hdmi_audio_wq); + for_each_port(card_ctx, port) { + struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port]; + + schedule_work(&ctx->hdmi_audio_wq); + }
return 0;
@@@ -1830,9 -1908,9 +1908,9 @@@ err */ static int hdmi_lpe_audio_remove(struct platform_device *pdev) { - struct snd_intelhad *ctx = platform_get_drvdata(pdev); + struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev);
- snd_card_free(ctx->card); + snd_card_free(card_ctx->card); return 0; }