Merge tag 'char-misc-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregk...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 24 Feb 2021 18:25:37 +0000 (10:25 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 24 Feb 2021 18:25:37 +0000 (10:25 -0800)
Pull char/misc driver updates from Greg KH:
 "Here is the large set of char/misc/whatever driver subsystem updates
  for 5.12-rc1. Over time it seems like this tree is collecting more and
  more tiny driver subsystems in one place, making it easier for those
  maintainers, which is why this is getting larger.

  Included in here are:

   - coresight driver updates

   - habannalabs driver updates

   - virtual acrn driver addition (proper acks from the x86 maintainers)

   - broadcom misc driver addition

   - speakup driver updates

   - soundwire driver updates

   - fpga driver updates

   - amba driver updates

   - mei driver updates

   - vfio driver updates

   - greybus driver updates

   - nvmeem driver updates

   - phy driver updates

   - mhi driver updates

   - interconnect driver udpates

   - fsl-mc bus driver updates

   - random driver fix

   - some small misc driver updates (rtsx, pvpanic, etc.)

  All of these have been in linux-next for a while, with the only
  reported issue being a merge conflict due to the dfl_device_id
  addition from the fpga subsystem in here"

* tag 'char-misc-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (311 commits)
  spmi: spmi-pmic-arb: Fix hw_irq overflow
  Documentation: coresight: Add PID tracing description
  coresight: etm-perf: Support PID tracing for kernel at EL2
  coresight: etm-perf: Clarify comment on perf options
  ACRN: update MAINTAINERS: mailing list is subscribers-only
  regmap: sdw-mbq: use MODULE_LICENSE("GPL")
  regmap: sdw: use no_pm routines for SoundWire 1.2 MBQ
  regmap: sdw: use _no_pm functions in regmap_read/write
  soundwire: intel: fix possible crash when no device is detected
  MAINTAINERS: replace my with email with replacements
  mhi: Fix double dma free
  uapi: map_to_7segment: Update example in documentation
  uio: uio_pci_generic: don't fail probe if pdev->irq equals to IRQ_NOTCONNECTED
  drivers/misc/vmw_vmci: restrict too big queue size in qp_host_alloc_queue
  firewire: replace tricky statement by two simple ones
  vme: make remove callback return void
  firmware: google: make coreboot driver's remove callback return void
  firmware: xilinx: Use explicit values for all enum values
  sample/acrn: Introduce a sample of HSM ioctl interface usage
  virt: acrn: Introduce an interface for Service VM to control vCPU
  ...

17 files changed:
1  2 
Documentation/devicetree/bindings/interconnect/qcom,rpmh.yaml
Documentation/driver-api/index.rst
Documentation/userspace-api/ioctl/ioctl-number.rst
MAINTAINERS
arch/arm64/include/asm/sysreg.h
drivers/accessibility/speakup/spk_ttyio.c
drivers/bus/fsl-mc/fsl-mc-bus.c
drivers/char/random.c
drivers/memory/Kconfig
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/common/memory.c
drivers/misc/mei/hdcp/mei_hdcp.c
drivers/of/platform.c
drivers/watchdog/mei_wdt.c
include/linux/mod_devicetable.h
scripts/mod/devicetable-offsets.c
scripts/mod/file2alias.c

index ebcf465c42804179b5c225b0a3d9b64bb314ffa5,f9b150b817d8aefaa9d98c6cbb1abe8741bceae8..799e73cdb90b494af79c98a8dac61ecaf61b74fd
@@@ -45,6 -45,10 +45,10 @@@ properties
        - qcom,sdm845-mem-noc
        - qcom,sdm845-mmss-noc
        - qcom,sdm845-system-noc
+       - qcom,sdx55-ipa-virt
+       - qcom,sdx55-mc-virt
+       - qcom,sdx55-mem-noc
+       - qcom,sdx55-system-noc
        - qcom,sm8150-aggre1-noc
        - qcom,sm8150-aggre2-noc
        - qcom,sm8150-camnoc-noc
@@@ -69,7 -73,7 +73,7 @@@
        - qcom,sm8250-system-noc
  
    '#interconnect-cells':
 -    const: 1
 +    enum: [ 1, 2 ]
  
    qcom,bcm-voters:
      $ref: /schemas/types.yaml#/definitions/phandle-array
index 9ba74e86751b947d5e8cf8616c7a476d20016911,ef4bed8f3758bc36a233435a6073d423154f1fdb..b0ab367896ab04008cce89232d8f53e3a2658246
@@@ -35,7 -35,6 +35,7 @@@ available subsections can be seen below
     usb/index
     firewire
     pci/index
 +   cxl/index
     spi
     i2c
     ipmb
     pps
     ptp
     phy/index
-    pti_intel_mid
     pwm
     pldmfw/index
     rfkill
     serial/index
     sm501
 +   surface_aggregator/index
     switchtec
     sync_file
     vfio-mediated-device
index 2fe16fb8c3af4c0409c8aefdcd3d6ffba4210c64,76c27dbae96bcadf21dbaf67d8cc853a75fb4efd..599bd449394441611e726ef6f2b6c3b1b4b96481
@@@ -157,6 -157,7 +157,6 @@@ Code  Seq#    Include Fil
  'I'   all    linux/isdn.h                                            conflict!
  'I'   00-0F  drivers/isdn/divert/isdn_divert.h                       conflict!
  'I'   40-4F  linux/mISDNif.h                                         conflict!
 -'J'   00-1F  drivers/scsi/gdth_ioctl.h
  'K'   all    linux/kd.h
  'L'   00-1F  linux/loop.h                                            conflict!
  'L'   10-1F  drivers/scsi/mpt3sas/mpt3sas_ctl.h                      conflict!
  'R'   00-1F  linux/random.h                                          conflict!
  'R'   01     linux/rfkill.h                                          conflict!
  'R'   C0-DF  net/bluetooth/rfcomm.h
+ 'R'   E0     uapi/linux/fsl_mc.h
  'S'   all    linux/cdrom.h                                           conflict!
  'S'   80-81  scsi/scsi_ioctl.h                                       conflict!
  'S'   82-FF  scsi/scsi.h                                             conflict!
  0xA0  all    linux/sdp/sdp.h                                         Industrial Device Project
                                                                       <mailto:kenji@bitgate.com>
  0xA1  0      linux/vtpm_proxy.h                                      TPM Emulator Proxy Driver
+ 0xA2  all    uapi/linux/acrn.h                                       ACRN hypervisor
  0xA3  80-8F                                                          Port ACL  in development:
                                                                       <mailto:tlewis@mindspring.com>
  0xA3  90-9F  linux/dtlk.h
  0xA4  00-1F  uapi/linux/tee.h                                        Generic TEE subsystem
  0xA4  00-1F  uapi/asm/sgx.h                                          <mailto:linux-sgx@vger.kernel.org>
 +0xA5  01     linux/surface_aggregator/cdev.h                         Microsoft Surface Platform System Aggregator
 +                                                                     <mailto:luzmaximilian@gmail.com>
  0xAA  00-3F  linux/uapi/linux/userfaultfd.h
  0xAB  00-1F  linux/nbd.h
  0xAC  00-1F  linux/raw.h
                                                                       <mailto:michael.klein@puffin.lb.shuttle.de>
  0xCC  00-0F  drivers/misc/ibmvmc.h                                   pseries VMC driver
  0xCD  01     linux/reiserfs_fs.h
 +0xCE  01-02  uapi/linux/cxl_mem.h                                    Compute Express Link Memory Devices
  0xCF  02     fs/cifs/ioctl.c
  0xDB  00-0F  drivers/char/mwave/mwavepub.h
  0xDD  00-3F                                                          ZFCP device driver see drivers/s390/scsi/
diff --combined MAINTAINERS
index 39478550cd344b450ebee4ce44fa3d1510d4dddc,11d37eb4d914fd6039bf3151fb101684dcb60083..e91fe5b33b0e5cadd7bed0a68f4f74bca3a85795
@@@ -436,6 -436,15 +436,15 @@@ S:       Orpha
  F:    drivers/platform/x86/wmi.c
  F:    include/uapi/linux/wmi.h
  
+ ACRN HYPERVISOR SERVICE MODULE
+ M:    Shuo Liu <shuo.a.liu@intel.com>
+ L:    acrn-dev@lists.projectacrn.org (subscribers-only)
+ S:    Supported
+ W:    https://projectacrn.org
+ F:    Documentation/virt/acrn/
+ F:    drivers/virt/acrn/
+ F:    include/uapi/linux/acrn.h
  AD1889 ALSA SOUND DRIVER
  L:    linux-parisc@vger.kernel.org
  S:    Maintained
@@@ -699,8 -708,7 +708,8 @@@ M: Michael Tretter <m.tretter@pengutron
  R:    Pengutronix Kernel Team <kernel@pengutronix.de>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    drivers/staging/media/allegro-dvt/
 +F:    Documentation/devicetree/bindings/media/allegro,al5e.yaml
 +F:    drivers/media/platform/allegro-dvt/
  
  ALLWINNER A10 CSI DRIVER
  M:    Maxime Ripard <mripard@kernel.org>
@@@ -1017,7 -1025,7 +1026,7 @@@ F:      Documentation/devicetree/bindings/mu
  F:    drivers/mux/adgs1408.c
  
  ANALOG DEVICES INC ADIN DRIVER
- M:    Alexandru Ardelean <alexaundru.ardelean@analog.com>
+ M:    Michael Hennerich <michael.hennerich@analog.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://ez.analog.com/community/linux-device-drivers
@@@ -1025,7 -1033,7 +1034,7 @@@ F:      Documentation/devicetree/bindings/ne
  F:    drivers/net/phy/adin.c
  
  ANALOG DEVICES INC ADIS DRIVER LIBRARY
- M:    Alexandru Ardelean <alexandru.ardelean@analog.com>
+ M:    Nuno Sa <nuno.sa@analog.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
  F:    drivers/iio/imu/adis.c
@@@ -1414,6 -1422,7 +1423,6 @@@ F:      arch/arm*/include/asm/hw_breakpoint.
  F:    arch/arm*/include/asm/perf_event.h
  F:    arch/arm*/kernel/hw_breakpoint.c
  F:    arch/arm*/kernel/perf_*
 -F:    arch/arm/oprofile/common.c
  F:    drivers/perf/
  F:    include/linux/perf/arm_pmu.h
  
@@@ -1511,7 -1520,6 +1520,7 @@@ ARM/ACTIONS SEMI ARCHITECTUR
  M:    Andreas Färber <afaerber@suse.de>
  M:    Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +L:    linux-actions@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/actions.yaml
  F:    Documentation/devicetree/bindings/clock/actions,owl-cmu.txt
@@@ -1779,6 -1787,19 +1788,6 @@@ F:     drivers/net/ethernet/cortina
  F:    drivers/pinctrl/pinctrl-gemini.c
  F:    drivers/rtc/rtc-ftrtc010.c
  
 -ARM/CSR SIRFPRIMA2 MACHINE SUPPORT
 -M:    Barry Song <baohua@kernel.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/baohua/linux.git
 -F:    arch/arm/boot/dts/prima2*
 -F:    arch/arm/mach-prima2/
 -F:    drivers/clk/sirf/
 -F:    drivers/clocksource/timer-atlas7.c
 -F:    drivers/clocksource/timer-prima2.c
 -X:    drivers/gnss
 -N:    [^a-z]sirf
 -
  ARM/CZ.NIC TURRIS MOX SUPPORT
  M:    Marek Behun <marek.behun@nic.cz>
  S:    Maintained
@@@ -1794,6 -1815,13 +1803,6 @@@ F:     drivers/firmware/turris-mox-rwtm.
  F:    drivers/gpio/gpio-moxtet.c
  F:    include/linux/moxtet.h
  
 -ARM/ENERGY MICRO (SILICON LABS) EFM32 SUPPORT
 -M:    Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
 -R:    Pengutronix Kernel Team <kernel@pengutronix.de>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -N:    efm32
 -
  ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6)
  M:    Robert Jarzmik <robert.jarzmik@free.fr>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2071,7 -2099,7 +2080,7 @@@ M:      Chunfeng Yun <chunfeng.yun@mediatek.
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/devicetree/bindings/phy/phy-mtk-*
 +F:    Documentation/devicetree/bindings/phy/mediatek,*
  F:    drivers/phy/mediatek/
  
  ARM/Microchip (AT91) SoC support
@@@ -2126,20 -2154,17 +2135,20 @@@ L:   linux-arm-kernel@lists.infradead.or
  S:    Maintained
  W:    http://linux-chenxing.org/
  F:    Documentation/devicetree/bindings/arm/mstar/*
 +F:    Documentation/devicetree/bindings/clock/mstar,msc313-mpll.yaml
  F:    Documentation/devicetree/bindings/gpio/mstar,msc313-gpio.yaml
  F:    arch/arm/boot/dts/mstar-*
  F:    arch/arm/mach-mstar/
 +F:    drivers/clk/mstar/
  F:    drivers/gpio/gpio-msc313.c
 +F:    include/dt-bindings/clock/mstar-*
  F:    include/dt-bindings/gpio/msc313-gpio.h
  
  ARM/NEC MOBILEPRO 900/c MACHINE SUPPORT
  M:    Michael Petchkovsky <mkpetch@internode.on.net>
  S:    Maintained
  
 -ARM/NOMADIK/U300/Ux500 ARCHITECTURES
 +ARM/NOMADIK/Ux500 ARCHITECTURES
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -2148,23 -2173,35 +2157,23 @@@ F:   Documentation/devicetree/bindings/ar
  F:    Documentation/devicetree/bindings/arm/ux500.yaml
  F:    Documentation/devicetree/bindings/arm/ux500/
  F:    Documentation/devicetree/bindings/i2c/i2c-nomadik.txt
 -F:    Documentation/devicetree/bindings/i2c/i2c-stu300.txt
  F:    arch/arm/boot/dts/ste-*
  F:    arch/arm/mach-nomadik/
 -F:    arch/arm/mach-u300/
  F:    arch/arm/mach-ux500/
  F:    drivers/clk/clk-nomadik.c
 -F:    drivers/clk/clk-u300.c
  F:    drivers/clocksource/clksrc-dbx500-prcmu.c
 -F:    drivers/clocksource/timer-u300.c
 -F:    drivers/dma/coh901318*
  F:    drivers/dma/ste_dma40*
  F:    drivers/hwspinlock/u8500_hsem.c
  F:    drivers/i2c/busses/i2c-nomadik.c
 -F:    drivers/i2c/busses/i2c-stu300.c
  F:    drivers/iio/adc/ab8500-gpadc.c
 -F:    drivers/mfd/ab3100*
  F:    drivers/mfd/ab8500*
  F:    drivers/mfd/abx500*
  F:    drivers/mfd/db8500*
  F:    drivers/mfd/dbx500*
  F:    drivers/pinctrl/nomadik/
 -F:    drivers/pinctrl/pinctrl-coh901*
 -F:    drivers/pinctrl/pinctrl-u300.c
 -F:    drivers/rtc/rtc-ab3100.c
  F:    drivers/rtc/rtc-ab8500.c
 -F:    drivers/rtc/rtc-coh901331.c
  F:    drivers/rtc/rtc-pl031.c
  F:    drivers/soc/ux500/
 -F:    drivers/watchdog/coh901327_wdt.c
  
  ARM/NUVOTON NPCM ARCHITECTURE
  M:    Avi Fishman <avifishman70@gmail.com>
@@@ -2386,8 -2423,6 +2395,8 @@@ F:      drivers/*/*s5pv210
  F:    drivers/memory/samsung/
  F:    drivers/soc/samsung/
  F:    drivers/tty/serial/samsung*
 +F:    include/linux/platform_data/*s3c*
 +F:    include/linux/serial_s3c.h
  F:    include/linux/soc/samsung/
  N:    exynos
  N:    s3c2410
@@@ -2531,6 -2566,13 +2540,6 @@@ F:     arch/arm/boot/dts/berlin
  F:    arch/arm/mach-berlin/
  F:    arch/arm64/boot/dts/synaptics/
  
 -ARM/TANGO ARCHITECTURE
 -M:    Marc Gonzalez <marc.w.gonzalez@free.fr>
 -M:    Mans Rullgard <mans@mansr.com>
 -L:    linux-arm-kernel@lists.infradead.org
 -S:    Odd Fixes
 -N:    tango
 -
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2583,8 -2625,8 +2592,8 @@@ S:      Maintaine
  F:    drivers/power/reset/keystone-reset.c
  
  ARM/TEXAS INSTRUMENTS K3 ARCHITECTURE
 -M:    Tero Kristo <t-kristo@ti.com>
  M:    Nishanth Menon <nm@ti.com>
 +M:    Tero Kristo <kristo@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  F:    Documentation/devicetree/bindings/arm/ti/k3.yaml
@@@ -2608,15 -2650,9 +2617,15 @@@ L:    linux-arm-kernel@lists.infradead.or
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/iwamatsu/linux-visconti.git
  F:    Documentation/devicetree/bindings/arm/toshiba.yaml
 +F:    Documentation/devicetree/bindings/net/toshiba,visconti-dwmac.yaml
 +F:    Documentation/devicetree/bindings/gpio/toshiba,gpio-visconti.yaml
  F:    Documentation/devicetree/bindings/pinctrl/toshiba,tmpv7700-pinctrl.yaml
 +F:    Documentation/devicetree/bindings/watchdog/toshiba,visconti-wdt.yaml
  F:    arch/arm64/boot/dts/toshiba/
 +F:    drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c
 +F:    drivers/gpio/gpio-visconti.c
  F:    drivers/pinctrl/visconti/
 +F:    drivers/watchdog/visconti_wdt.c
  N:    visconti
  
  ARM/UNIPHIER ARCHITECTURE
@@@ -2696,6 -2732,40 +2705,6 @@@ S:     Maintaine
  F:    arch/arm/mach-pxa/include/mach/z2.h
  F:    arch/arm/mach-pxa/z2.c
  
 -ARM/ZTE ARCHITECTURE
 -M:    Jun Nie <jun.nie@linaro.org>
 -M:    Shawn Guo <shawnguo@kernel.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    Documentation/devicetree/bindings/arm/zte.yaml
 -F:    Documentation/devicetree/bindings/clock/zx2967*.txt
 -F:    Documentation/devicetree/bindings/dma/zxdma.txt
 -F:    Documentation/devicetree/bindings/gpio/zx296702-gpio.txt
 -F:    Documentation/devicetree/bindings/i2c/i2c-zx2967.txt
 -F:    Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt
 -F:    Documentation/devicetree/bindings/pinctrl/pinctrl-zx.txt
 -F:    Documentation/devicetree/bindings/reset/zte,zx2967-reset.txt
 -F:    Documentation/devicetree/bindings/soc/zte/
 -F:    Documentation/devicetree/bindings/sound/zte,*.txt
 -F:    Documentation/devicetree/bindings/thermal/zx2967-thermal.txt
 -F:    Documentation/devicetree/bindings/watchdog/zte,zx2967-wdt.txt
 -F:    arch/arm/boot/dts/zx2967*
 -F:    arch/arm/mach-zx/
 -F:    arch/arm64/boot/dts/zte/
 -F:    drivers/clk/zte/
 -F:    drivers/dma/zx_dma.c
 -F:    drivers/gpio/gpio-zx.c
 -F:    drivers/i2c/busses/i2c-zx2967.c
 -F:    drivers/mmc/host/dw_mmc-zx.*
 -F:    drivers/pinctrl/zte/
 -F:    drivers/soc/zte/
 -F:    drivers/thermal/zx2967_thermal.c
 -F:    drivers/watchdog/zx2967_wdt.c
 -F:    include/dt-bindings/clock/zx2967*.h
 -F:    include/dt-bindings/soc/zte,*.h
 -F:    sound/soc/codecs/zx_aud96p22.c
 -F:    sound/soc/zte/
 -
  ARM/ZYNQ ARCHITECTURE
  M:    Michal Simek <michal.simek@xilinx.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -2704,7 -2774,6 +2713,7 @@@ W:      http://wiki.xilinx.co
  T:    git https://github.com/Xilinx/linux-xlnx.git
  F:    Documentation/devicetree/bindings/i2c/cdns,i2c-r1p10.yaml
  F:    Documentation/devicetree/bindings/i2c/xlnx,xps-iic-2.00.a.yaml
 +F:    Documentation/devicetree/bindings/spi/xlnx,zynq-qspi.yaml
  F:    arch/arm/mach-zynq/
  F:    drivers/block/xsysace.c
  F:    drivers/clocksource/timer-cadence-ttc.c
@@@ -2727,14 -2796,6 +2736,14 @@@ F:    arch/arm64
  F:    tools/testing/selftests/arm64/
  X:    arch/arm64/boot/dts/
  
 +ARROW SPEEDCHIPS XRS7000 SERIES ETHERNET SWITCH DRIVER
 +M:    George McCollister <george.mccollister@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/dsa/arrow,xrs700x.yaml
 +F:    drivers/net/dsa/xrs700x/*
 +F:    net/dsa/tag_xrs700x.c
 +
  AS3645A LED FLASH CONTROLLER DRIVER
  M:    Sakari Ailus <sakari.ailus@iki.fi>
  L:    linux-leds@vger.kernel.org
@@@ -2780,15 -2841,6 +2789,15 @@@ F:    Documentation/devicetree/bindings/in
  F:    drivers/irqchip/irq-aspeed-scu-ic.c
  F:    include/dt-bindings/interrupt-controller/aspeed-scu-ic.h
  
 +ASPEED SD/MMC DRIVER
 +M:    Andrew Jeffery <andrew@aj.id.au>
 +L:    linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
 +L:    openbmc@lists.ozlabs.org (moderated for non-subscribers)
 +L:    linux-mmc@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mmc/aspeed,sdhci.yaml
 +F:    drivers/mmc/host/sdhci-of-aspeed*
 +
  ASPEED VIDEO ENGINE DRIVER
  M:    Eddie James <eajames@linux.ibm.com>
  L:    linux-media@vger.kernel.org
@@@ -2828,7 -2880,9 +2837,7 @@@ S:      Odd fixe
  W:    http://sourceforge.net/projects/xscaleiop
  F:    Documentation/crypto/async-tx-api.rst
  F:    crypto/async_tx/
 -F:    drivers/dma/
  F:    include/linux/async_tx.h
 -F:    include/linux/dmaengine.h
  
  AT24 EEPROM DRIVER
  M:    Bartosz Golaszewski <bgolaszewski@baylibre.com>
@@@ -3194,7 -3248,6 +3203,7 @@@ L:      netdev@vger.kernel.or
  S:    Supported
  W:    http://sourceforge.net/projects/bonding/
  F:    drivers/net/bonding/
 +F:    include/net/bonding.h
  F:    include/uapi/linux/if_bonding.h
  
  BOSCH SENSORTEC BMA400 ACCELEROMETER IIO DRIVER
@@@ -3354,7 -3407,6 +3363,7 @@@ L:      openwrt-devel@lists.openwrt.org (sub
  S:    Supported
  F:    Documentation/devicetree/bindings/net/dsa/brcm,b53.yaml
  F:    drivers/net/dsa/b53/*
 +F:    include/linux/dsa/brcm.h
  F:    include/linux/platform_data/b53.h
  
  BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
@@@ -3368,7 -3420,7 +3377,7 @@@ F:      Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pcie-brcmstb.c
  F:    drivers/staging/vc04_services
  N:    bcm2711
 -N:    bcm2835
 +N:    bcm283*
  
  BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
  M:    Florian Fainelli <f.fainelli@gmail.com>
@@@ -3392,15 -3444,6 +3401,15 @@@ F:    Documentation/devicetree/bindings/mi
  F:    arch/mips/bcm47xx/*
  F:    arch/mips/include/asm/mach-bcm47xx/*
  
 +BROADCOM BCM4908 ETHERNET DRIVER
 +M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
 +M:    bcm-kernel-feedback-list@broadcom.com
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/brcm,bcm4908-enet.yaml
 +F:    drivers/net/ethernet/broadcom/bcm4908_enet.*
 +F:    drivers/net/ethernet/broadcom/unimac.h
 +
  BROADCOM BCM5301X ARM ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
  M:    RafaÅ‚ MiÅ‚ecki <zajec5@gmail.com>
@@@ -3589,7 -3632,6 +3598,7 @@@ S:      Supporte
  F:    Documentation/devicetree/bindings/net/brcm,bcmgenet.txt
  F:    Documentation/devicetree/bindings/net/brcm,unimac-mdio.txt
  F:    drivers/net/ethernet/broadcom/genet/
 +F:    drivers/net/ethernet/broadcom/unimac.h
  F:    drivers/net/mdio/mdio-bcm-unimac.c
  F:    include/linux/platform_data/bcmgenet.h
  F:    include/linux/platform_data/mdio-bcm-unimac.h
@@@ -3623,15 -3665,6 +3632,15 @@@ N:    bcm8831
  N:    hr2
  N:    stingray
  
 +BROADCOM IPROC GBIT ETHERNET DRIVER
 +M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
 +M:    bcm-kernel-feedback-list@broadcom.com
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/brcm,amac.txt
 +F:    drivers/net/ethernet/broadcom/bgmac*
 +F:    drivers/net/ethernet/broadcom/unimac.h
 +
  BROADCOM KONA GPIO DRIVER
  M:    Ray Jui <rjui@broadcom.com>
  L:    bcm-kernel-feedback-list@broadcom.com
@@@ -3657,16 -3690,6 +3666,16 @@@ L:    linux-mips@vger.kernel.or
  S:    Maintained
  F:    drivers/firmware/broadcom/*
  
 +BROADCOM PMB (POWER MANAGEMENT BUS) DRIVER
 +M:    RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
 +M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    bcm-kernel-feedback-list@broadcom.com
 +L:    linux-pm@vger.kernel.org
 +S:    Maintained
 +T:    git git://github.com/broadcom/stblinux.git
 +F:    drivers/soc/bcm/bcm-pmb.c
 +F:    include/dt-bindings/soc/bcm-pmb.h
 +
  BROADCOM SPECIFIC AMBA DRIVER (BCMA)
  M:    RafaÅ‚ MiÅ‚ecki <zajec5@gmail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -3721,7 -3744,6 +3730,7 @@@ L:      bcm-kernel-feedback-list@broadcom.co
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bcmsysport.*
 +F:    drivers/net/ethernet/broadcom/unimac.h
  
  BROADCOM TG3 GIGABIT ETHERNET DRIVER
  M:    Siva Reddy Kallam <siva.kallam@broadcom.com>
@@@ -3731,6 -3753,13 +3740,13 @@@ L:    netdev@vger.kernel.or
  S:    Supported
  F:    drivers/net/ethernet/broadcom/tg3.*
  
+ BROADCOM VK DRIVER
+ M:    Scott Branden <scott.branden@broadcom.com>
+ L:    bcm-kernel-feedback-list@broadcom.com
+ S:    Supported
+ F:    drivers/misc/bcm-vk/
+ F:    include/uapi/linux/misc/bcm_vk.h
  BROCADE BFA FC SCSI DRIVER
  M:    Anil Gurumurthy <anil.gurumurthy@qlogic.com>
  M:    Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
@@@ -3829,6 -3858,14 +3845,6 @@@ F:     drivers/irqchip/irq-csky-
  N:    csky
  K:    csky
  
 -C6X ARCHITECTURE
 -M:    Mark Salter <msalter@redhat.com>
 -M:    Aurelien Jacquiot <jacquiot.aurelien@gmail.com>
 -L:    linux-c6x-dev@linux-c6x.org
 -S:    Maintained
 -W:    http://www.linux-c6x.org/wiki/index.php/Main_Page
 -F:    arch/c6x/
 -
  CA8210 IEEE-802.15.4 RADIO DRIVER
  M:    Harry Morris <h.morris@cascoda.com>
  L:    linux-wpan@vger.kernel.org
@@@ -3867,15 -3904,6 +3883,15 @@@ S:    Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
  F:    Documentation/devicetree/bindings/usb/cdns,usb3.yaml
  F:    drivers/usb/cdns3/
 +X:    drivers/usb/cdns3/cdnsp*
 +
 +CADENCE USBSSP DRD IP DRIVER
 +M:    Pawel Laszczak <pawell@cadence.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
 +F:    drivers/usb/cdns3/
 +X:    drivers/usb/cdns3/cdns3*
  
  CADET FM/AM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
@@@ -3917,10 -3945,8 +3933,10 @@@ T:    git git://git.kernel.org/pub/scm/lin
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
  F:    Documentation/devicetree/bindings/net/can/
  F:    drivers/net/can/
 +F:    include/linux/can/bittiming.h
  F:    include/linux/can/dev.h
  F:    include/linux/can/led.h
 +F:    include/linux/can/length.h
  F:    include/linux/can/platform/
  F:    include/linux/can/rx-offload.h
  F:    include/uapi/linux/can/error.h
@@@ -3936,7 -3962,6 +3952,7 @@@ W:      https://github.com/linux-ca
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
  F:    Documentation/networking/can.rst
 +F:    include/linux/can/can-ml.h
  F:    include/linux/can/core.h
  F:    include/linux/can/skb.h
  F:    include/net/netns/can.h
@@@ -4072,6 -4097,7 +4088,6 @@@ W:      http://www.ibm.com/developerworks/po
  F:    arch/powerpc/include/asm/cell*.h
  F:    arch/powerpc/include/asm/spu*.h
  F:    arch/powerpc/include/uapi/asm/spu*.h
 -F:    arch/powerpc/oprofile/*cell*
  F:    arch/powerpc/platforms/cell/
  
  CELLWISE CW2015 BATTERY DRIVER
@@@ -4293,7 -4319,7 +4309,7 @@@ S:      Maintaine
  F:    .clang-format
  
  CLANG/LLVM BUILD SUPPORT
 -M:    Nathan Chancellor <natechancellor@gmail.com>
 +M:    Nathan Chancellor <nathan@kernel.org>
  M:    Nick Desaulniers <ndesaulniers@google.com>
  L:    clang-built-linux@googlegroups.com
  S:    Supported
@@@ -4434,17 -4460,6 +4450,17 @@@ M:    Miguel Ojeda <miguel.ojeda.sandonis@
  S:    Maintained
  F:    include/linux/compiler_attributes.h
  
 +COMPUTE EXPRESS LINK (CXL)
 +M:    Alison Schofield <alison.schofield@intel.com>
 +M:    Vishal Verma <vishal.l.verma@intel.com>
 +M:    Ira Weiny <ira.weiny@intel.com>
 +M:    Ben Widawsky <ben.widawsky@intel.com>
 +M:    Dan Williams <dan.j.williams@intel.com>
 +L:    linux-cxl@vger.kernel.org
 +S:    Maintained
 +F:    drivers/cxl/
 +F:    include/uapi/linux/cxl_mem.h
 +
  CONEXANT ACCESSRUNNER USB DRIVER
  L:    accessrunner-general@lists.sourceforge.net
  S:    Orphan
@@@ -4468,7 -4483,7 +4484,7 @@@ F:      include/linux/console
  
  CONTROL GROUP (CGROUP)
  M:    Tejun Heo <tj@kernel.org>
 -M:    Li Zefan <lizefan@huawei.com>
 +M:    Zefan Li <lizefan.x@bytedance.com>
  M:    Johannes Weiner <hannes@cmpxchg.org>
  L:    cgroups@vger.kernel.org
  S:    Maintained
@@@ -4492,9 -4507,11 +4508,9 @@@ F:     block/blk-throttle.
  F:    include/linux/blk-cgroup.h
  
  CONTROL GROUP - CPUSET
 -M:    Li Zefan <lizefan@huawei.com>
 +M:    Zefan Li <lizefan.x@bytedance.com>
  L:    cgroups@vger.kernel.org
  S:    Maintained
 -W:    http://www.bullopensource.org/cpuset/
 -W:    http://oss.sgi.com/projects/cpusets/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
  F:    Documentation/admin-guide/cgroup-v1/cpusets.rst
  F:    include/linux/cpuset.h
@@@ -4622,7 -4639,6 +4638,7 @@@ L:      linux-samsung-soc@vger.kernel.or
  S:    Supported
  F:    arch/arm/mach-exynos/pm.c
  F:    drivers/cpuidle/cpuidle-exynos.c
 +F:    include/linux/platform_data/cpuidle-exynos.h
  
  CPUIDLE DRIVER - ARM PSCI
  M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
@@@ -4938,7 -4954,7 +4954,7 @@@ F:      Documentation/networking/decnet.rs
  F:    net/decnet/
  
  DECSTATION PLATFORM SUPPORT
 -M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +M:    "Maciej W. Rozycki" <macro@orcam.me.uk>
  L:    linux-mips@vger.kernel.org
  S:    Maintained
  W:    http://www.linux-mips.org/wiki/DECstation
@@@ -4947,12 -4963,12 +4963,12 @@@ F:   arch/mips/include/asm/dec
  F:    arch/mips/include/asm/mach-dec/
  
  DEFXX FDDI NETWORK DRIVER
 -M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +M:    "Maciej W. Rozycki" <macro@orcam.me.uk>
  S:    Maintained
  F:    drivers/net/fddi/defxx.*
  
  DEFZA FDDI NETWORK DRIVER
 -M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +M:    "Maciej W. Rozycki" <macro@orcam.me.uk>
  S:    Maintained
  F:    drivers/net/fddi/defza.*
  
@@@ -4969,17 -4985,17 +4985,17 @@@ M:   Matthew Garrett <mjg59@srcf.ucam.org
  M:    Pali Rohár <pali@kernel.org>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
 -F:    drivers/platform/x86/dell-laptop.c
 +F:    drivers/platform/x86/dell/dell-laptop.c
  
  DELL LAPTOP FREEFALL DRIVER
  M:    Pali Rohár <pali@kernel.org>
  S:    Maintained
 -F:    drivers/platform/x86/dell-smo8800.c
 +F:    drivers/platform/x86/dell/dell-smo8800.c
  
  DELL LAPTOP RBTN DRIVER
  M:    Pali Rohár <pali@kernel.org>
  S:    Maintained
 -F:    drivers/platform/x86/dell-rbtn.*
 +F:    drivers/platform/x86/dell/dell-rbtn.*
  
  DELL LAPTOP SMM DRIVER
  M:    Pali Rohár <pali@kernel.org>
@@@ -4991,26 -5007,26 +5007,26 @@@ DELL REMOTE BIOS UPDATE DRIVE
  M:    Stuart Hayes <stuart.w.hayes@gmail.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
 -F:    drivers/platform/x86/dell_rbu.c
 +F:    drivers/platform/x86/dell/dell_rbu.c
  
  DELL SMBIOS DRIVER
  M:    Pali Rohár <pali@kernel.org>
  M:    Mario Limonciello <mario.limonciello@dell.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
 -F:    drivers/platform/x86/dell-smbios.*
 +F:    drivers/platform/x86/dell/dell-smbios.*
  
  DELL SMBIOS SMM DRIVER
  M:    Mario Limonciello <mario.limonciello@dell.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
 -F:    drivers/platform/x86/dell-smbios-smm.c
 +F:    drivers/platform/x86/dell/dell-smbios-smm.c
  
  DELL SMBIOS WMI DRIVER
  M:    Mario Limonciello <mario.limonciello@dell.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
 -F:    drivers/platform/x86/dell-smbios-wmi.c
 +F:    drivers/platform/x86/dell/dell-smbios-wmi.c
  F:    tools/wmi/dell-smbios-example.c
  
  DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas)
@@@ -5018,12 -5034,12 +5034,12 @@@ M:   Stuart Hayes <stuart.w.hayes@gmail.c
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  F:    Documentation/driver-api/dcdbas.rst
 -F:    drivers/platform/x86/dcdbas.*
 +F:    drivers/platform/x86/dell/dcdbas.*
  
  DELL WMI DESCRIPTOR DRIVER
  M:    Mario Limonciello <mario.limonciello@dell.com>
  S:    Maintained
 -F:    drivers/platform/x86/dell-wmi-descriptor.c
 +F:    drivers/platform/x86/dell/dell-wmi-descriptor.c
  
  DELL WMI SYSMAN DRIVER
  M:    Divya Bharathi <divya.bharathi@dell.com>
@@@ -5032,13 -5048,13 +5048,13 @@@ M:   Prasanth Ksr <prasanth.ksr@dell.com
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-class-firmware-attributes
 -F:    drivers/platform/x86/dell-wmi-sysman/
 +F:    drivers/platform/x86/dell/dell-wmi-sysman/
  
  DELL WMI NOTIFICATIONS DRIVER
  M:    Matthew Garrett <mjg59@srcf.ucam.org>
  M:    Pali Rohár <pali@kernel.org>
  S:    Maintained
 -F:    drivers/platform/x86/dell-wmi.c
 +F:    drivers/platform/x86/dell/dell-wmi.c
  
  DELTA ST MEDIA DRIVER
  M:    Hugues Fruchet <hugues.fruchet@st.com>
@@@ -5280,7 -5296,6 +5296,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/dma/
  F:    Documentation/driver-api/dmaengine/
  F:    drivers/dma/
 +F:    include/linux/dma/
  F:    include/linux/dmaengine.h
  F:    include/linux/of_dma.h
  
@@@ -5784,7 -5799,6 +5800,7 @@@ F:      drivers/gpu/drm/vboxvideo
  DRM DRIVER FOR VMWARE VIRTUAL GPU
  M:    "VMware Graphics" <linux-graphics-maintainer@vmware.com>
  M:    Roland Scheidegger <sroland@vmware.com>
 +M:    Zack Rusin <zackr@vmware.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Supported
  T:    git git://people.freedesktop.org/~sroland/linux
@@@ -5986,8 -6000,8 +6002,8 @@@ F:      Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/stm
  
  DRM DRIVERS FOR TI KEYSTONE
 -M:    Jyri Sarha <jsarha@ti.com>
 -M:    Tomi Valkeinen <tomi.valkeinen@ti.com>
 +M:    Jyri Sarha <jyri.sarha@iki.fi>
 +M:    Tomi Valkeinen <tomba@kernel.org>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -5997,15 -6011,15 +6013,15 @@@ F:   Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/tidss/
  
  DRM DRIVERS FOR TI LCDC
 -M:    Jyri Sarha <jsarha@ti.com>
 -R:    Tomi Valkeinen <tomi.valkeinen@ti.com>
 +M:    Jyri Sarha <jyri.sarha@iki.fi>
 +R:    Tomi Valkeinen <tomba@kernel.org>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/display/tilcdc/
  F:    drivers/gpu/drm/tilcdc/
  
  DRM DRIVERS FOR TI OMAP
 -M:    Tomi Valkeinen <tomi.valkeinen@ti.com>
 +M:    Tomi Valkeinen <tomba@kernel.org>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/display/ti/
@@@ -6058,6 -6072,14 +6074,6 @@@ T:     git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/xlnx/
  F:    drivers/gpu/drm/xlnx/
  
 -DRM DRIVERS FOR ZTE ZX
 -M:    Shawn Guo <shawnguo@kernel.org>
 -L:    dri-devel@lists.freedesktop.org
 -S:    Maintained
 -T:    git git://anongit.freedesktop.org/drm/drm-misc
 -F:    Documentation/devicetree/bindings/display/zte,vou.txt
 -F:    drivers/gpu/drm/zte/
 -
  DRM PANEL DRIVERS
  M:    Thierry Reding <thierry.reding@gmail.com>
  R:    Sam Ravnborg <sam@ravnborg.org>
@@@ -6217,7 -6239,7 +6233,7 @@@ F:      include/linux/dim.
  F:    lib/dim/
  
  DZ DECSTATION DZ11 SERIAL DRIVER
 -M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +M:    "Maciej W. Rozycki" <macro@orcam.me.uk>
  S:    Maintained
  F:    drivers/tty/serial/dz.*
  
@@@ -6467,9 -6489,9 +6483,9 @@@ S:      Maintaine
  F:    drivers/edac/skx_*.[ch]
  
  EDAC-TI
 -M:    Tero Kristo <t-kristo@ti.com>
 +M:    Tero Kristo <kristo@kernel.org>
  L:    linux-edac@vger.kernel.org
 -S:    Maintained
 +S:    Odd Fixes
  F:    drivers/edac/ti_edac.c
  
  EDIROL UA-101/UA-1000 DRIVER
@@@ -6856,9 -6878,6 +6872,9 @@@ F:      include/linux/fs.
  F:    include/linux/fs_types.h
  F:    include/uapi/linux/fs.h
  F:    include/uapi/linux/openat2.h
 +X:    fs/io-wq.c
 +X:    fs/io-wq.h
 +X:    fs/io_uring.c
  
  FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    Riku Voipio <riku.voipio@iki.fi>
@@@ -6950,9 -6969,10 +6966,10 @@@ M:    Wu Hao <hao.wu@intel.com
  R:    Tom Rix <trix@redhat.com>
  L:    linux-fpga@vger.kernel.org
  S:    Maintained
- F:    Documentation/ABI/testing/sysfs-bus-dfl
+ F:    Documentation/ABI/testing/sysfs-bus-dfl*
  F:    Documentation/fpga/dfl.rst
  F:    drivers/fpga/dfl*
+ F:    include/linux/dfl.h
  F:    include/uapi/linux/fpga-dfl.h
  
  FPGA MANAGER FRAMEWORK
@@@ -7373,6 -7393,13 +7390,6 @@@ M:     Kieran Bingham <kbingham@kernel.org
  S:    Supported
  F:    scripts/gdb/
  
 -GDT SCSI DISK ARRAY CONTROLLER DRIVER
 -M:    Achim Leubner <achim_leubner@adaptec.com>
 -L:    linux-scsi@vger.kernel.org
 -S:    Supported
 -W:    http://www.icp-vortex.com/
 -F:    drivers/scsi/gdt*
 -
  GEMTEK FM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -7918,12 -7945,6 +7935,12 @@@ F:    drivers/hid
  F:    include/linux/hid*
  F:    include/uapi/linux/hid*
  
 +HID PLAYSTATION DRIVER
 +M:    Roderick Colenbrander <roderick.colenbrander@sony.com>
 +L:    linux-input@vger.kernel.org
 +S:    Supported
 +F:    drivers/hid/hid-playstation.c
 +
  HID SENSOR HUB DRIVERS
  M:    Jiri Kosina <jikos@kernel.org>
  M:    Jonathan Cameron <jic23@kernel.org>
@@@ -8155,7 -8176,7 +8172,7 @@@ F:      net/hsr
  HT16K33 LED CONTROLLER DRIVER
  M:    Robin van der Gracht <robin@protonic.nl>
  S:    Maintained
 -F:    Documentation/devicetree/bindings/display/ht16k33.txt
 +F:    Documentation/devicetree/bindings/auxdisplay/holtek,ht16k33.yaml
  F:    drivers/auxdisplay/ht16k33.c
  
  HTCPEN TOUCHSCREEN DRIVER
@@@ -8429,8 -8450,11 +8446,8 @@@ F:     drivers/i3c
  F:    include/linux/i3c/
  
  IA64 (Itanium) PLATFORM
 -M:    Tony Luck <tony.luck@intel.com>
 -M:    Fenghua Yu <fenghua.yu@intel.com>
  L:    linux-ia64@vger.kernel.org
 -S:    Odd Fixes
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git
 +S:    Orphan
  F:    Documentation/ia64/
  F:    arch/ia64/
  
@@@ -8873,6 -8897,7 +8890,6 @@@ F:      drivers/mfd/intel_pmc_bxt.
  F:    include/linux/mfd/intel_pmc_bxt.h
  
  INTEL C600 SERIES SAS CONTROLLER DRIVER
 -M:    Intel SCU Linux support <intel-linux-scu@intel.com>
  M:    Artur Paszkiewicz <artur.paszkiewicz@intel.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
@@@ -8930,6 -8955,7 +8947,6 @@@ L:      linux-gpio@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git
  F:    drivers/gpio/gpio-ich.c
 -F:    drivers/gpio/gpio-intel-mid.c
  F:    drivers/gpio/gpio-merrifield.c
  F:    drivers/gpio/gpio-ml-ioh.c
  F:    drivers/gpio/gpio-pch.c
@@@ -9002,11 -9028,9 +9019,11 @@@ INTEL IPU3 CSI-2 CIO2 DRIVE
  M:    Yong Zhi <yong.zhi@intel.com>
  M:    Sakari Ailus <sakari.ailus@linux.intel.com>
  M:    Bingbu Cao <bingbu.cao@intel.com>
 +M:    Dan Scally <djrscally@gmail.com>
  R:    Tianshu Qiu <tian.shu.qiu@intel.com>
  L:    linux-media@vger.kernel.org
  S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst
  F:    drivers/media/pci/intel/ipu3/
  
@@@ -9053,17 -9077,6 +9070,17 @@@ F:    drivers/crypto/keembay/keembay-ocs-a
  F:    drivers/crypto/keembay/ocs-aes.c
  F:    drivers/crypto/keembay/ocs-aes.h
  
 +INTEL KEEM BAY OCS HCU CRYPTO DRIVER
 +M:    Daniele Alessandrelli <daniele.alessandrelli@intel.com>
 +M:    Declan Murphy <declan.murphy@intel.com>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/crypto/intel,keembay-ocs-hcu.yaml
 +F:    drivers/crypto/keembay/Kconfig
 +F:    drivers/crypto/keembay/Makefile
 +F:    drivers/crypto/keembay/keembay-ocs-hcu-core.c
 +F:    drivers/crypto/keembay/ocs-hcu.c
 +F:    drivers/crypto/keembay/ocs-hcu.h
 +
  INTEL MANAGEMENT ENGINE (mei)
  M:    Tomas Winkler <tomas.winkler@intel.com>
  L:    linux-kernel@vger.kernel.org
@@@ -9101,6 -9114,7 +9118,6 @@@ M:      Andy Shevchenko <andy@kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git
  F:    drivers/gpio/gpio-*cove.c
 -F:    drivers/gpio/gpio-msic.c
  
  INTEL PMIC MULTIFUNCTION DEVICE DRIVERS
  M:    Andy Shevchenko <andy@kernel.org>
@@@ -9229,11 -9243,10 +9246,11 @@@ F:   include/linux/tboot.
  
  INTEL SGX
  M:    Jarkko Sakkinen <jarkko@kernel.org>
 +R:    Dave Hansen <dave.hansen@linux.intel.com>
  L:    linux-sgx@vger.kernel.org
  S:    Supported
  Q:    https://patchwork.kernel.org/project/intel-sgx/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-sgx.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/sgx
  F:    Documentation/x86/sgx.rst
  F:    arch/x86/entry/vdso/vsgx.S
  F:    arch/x86/include/uapi/asm/sgx.h
@@@ -9301,7 -9314,6 +9318,7 @@@ F:      include/uapi/linux/iommu.
  
  IO_URING
  M:    Jens Axboe <axboe@kernel.dk>
 +R:    Pavel Begunkov <asml.silence@gmail.com>
  L:    io-uring@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.dk/linux-block
@@@ -9309,7 -9321,6 +9326,7 @@@ T:      git git://git.kernel.dk/liburin
  F:    fs/io-wq.c
  F:    fs/io-wq.h
  F:    fs/io_uring.c
 +F:    include/linux/io_uring.h
  F:    include/uapi/linux/io_uring.h
  
  IPMI SUBSYSTEM
@@@ -9567,18 -9578,16 +9584,18 @@@ F:   Documentation/hwmon/k8temp.rs
  F:    drivers/hwmon/k8temp.c
  
  KASAN
 -M:    Andrey Ryabinin <aryabinin@virtuozzo.com>
 +M:    Andrey Ryabinin <ryabinin.a.a@gmail.com>
  R:    Alexander Potapenko <glider@google.com>
 +R:    Andrey Konovalov <andreyknvl@gmail.com>
  R:    Dmitry Vyukov <dvyukov@google.com>
  L:    kasan-dev@googlegroups.com
  S:    Maintained
  F:    Documentation/dev-tools/kasan.rst
 -F:    arch/*/include/asm/kasan.h
 +F:    arch/*/include/asm/*kasan.h
  F:    arch/*/mm/kasan_init*
  F:    include/linux/kasan*.h
 -F:    lib/test_kasan.c
 +F:    lib/Kconfig.kasan
 +F:    lib/test_kasan*.c
  F:    mm/kasan/
  F:    scripts/Makefile.kasan
  
@@@ -9593,7 -9602,7 +9610,7 @@@ F:      scripts/kconfig
  
  KCOV
  R:    Dmitry Vyukov <dvyukov@google.com>
 -R:    Andrey Konovalov <andreyknvl@google.com>
 +R:    Andrey Konovalov <andreyknvl@gmail.com>
  L:    kasan-dev@googlegroups.com
  S:    Maintained
  F:    Documentation/dev-tools/kcov.rst
@@@ -9744,7 -9753,6 +9761,7 @@@ M:      Aleksandar Markovic <aleksandar.qemu
  L:    linux-mips@vger.kernel.org
  L:    kvm@vger.kernel.org
  S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
  F:    arch/mips/include/asm/kvm*
  F:    arch/mips/include/uapi/asm/kvm*
  F:    arch/mips/kvm/
@@@ -10378,8 -10386,6 +10395,8 @@@ LOCKING PRIMITIVE
  M:    Peter Zijlstra <peterz@infradead.org>
  M:    Ingo Molnar <mingo@redhat.com>
  M:    Will Deacon <will@kernel.org>
 +R:    Waiman Long <longman@redhat.com>
 +R:    Boqun Feng <boqun.feng@gmail.com> (LOCKDEP)
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
@@@ -10700,8 -10706,6 +10717,8 @@@ M:   Sunil Goutham <sgoutham@marvell.com
  M:    Linu Cherian <lcherian@marvell.com>
  M:    Geetha sowjanya <gakula@marvell.com>
  M:    Jerin Jacob <jerinj@marvell.com>
 +M:    hariprasad <hkelam@marvell.com>
 +M:    Subbaraya Sundeep <sbhatta@marvell.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/networking/device_drivers/ethernet/marvell/octeontx2.rst
@@@ -11191,15 -11195,6 +11208,15 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
  F:    drivers/i2c/busses/i2c-mt65xx.c
  
 +MEDIATEK IOMMU DRIVER
 +M:    Yong Wu <yong.wu@mediatek.com>
 +L:    iommu@lists.linux-foundation.org
 +L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
 +S:    Supported
 +F:    Documentation/devicetree/bindings/iommu/mediatek*
 +F:    drivers/iommu/mtk_iommu*
 +F:    include/dt-bindings/memory/mt*-port.h
 +
  MEDIATEK JPEG DRIVER
  M:    Rick Chang <rick.chang@mediatek.com>
  M:    Bin Liu <bin.liu@mediatek.com>
@@@ -11289,8 -11284,6 +11306,8 @@@ L:   linux-usb@vger.kernel.or
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 +F:    Documentation/devicetree/bindings/usb/mediatek,*
 +F:    drivers/usb/host/xhci-mtk*
  F:    drivers/usb/mtu3/
  
  MEGACHIPS STDPXXXX-GE-B850V3-FW LVDS/DP++ BRIDGES
@@@ -11572,7 -11565,7 +11589,7 @@@ L:   linux-amlogic@lists.infradead.or
  S:    Supported
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/amlogic,axg-ge2d.yaml
 -F:    drivers/media/meson/ge2d/
 +F:    drivers/media/platform/meson/ge2d/
  
  MESON NAND CONTROLLER DRIVER FOR AMLOGIC SOCS
  M:    Liang Yang <liang.yang@amlogic.com>
@@@ -11624,6 -11617,7 +11641,6 @@@ F:   drivers/dma/at_hdmac.
  F:    drivers/dma/at_hdmac_regs.h
  F:    drivers/dma/at_xdmac.c
  F:    include/dt-bindings/dma/at91.h
 -F:    include/linux/platform_data/dma-atmel.h
  
  MICROCHIP AT91 SERIAL DRIVER
  M:    Richard Genoud <richard.genoud@gmail.com>
@@@ -11709,9 -11703,9 +11726,9 @@@ F:   drivers/video/fbdev/atmel_lcdfb.
  F:    include/video/atmel_lcdc.h
  
  MICROCHIP MCP16502 PMIC DRIVER
 -M:    Andrei Stefanescu <andrei.stefanescu@microchip.com>
 +M:    Claudiu Beznea <claudiu.beznea@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 +S:    Supported
  F:    Documentation/devicetree/bindings/regulator/mcp16502-regulator.txt
  F:    drivers/regulator/mcp16502.c
  
@@@ -11826,31 -11820,12 +11843,31 @@@ S:        Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
  F:    drivers/platform/surface/
  
 +MICROSOFT SURFACE HOT-PLUG DRIVER
 +M:    Maximilian Luz <luzmaximilian@gmail.com>
 +L:    platform-driver-x86@vger.kernel.org
 +S:    Maintained
 +F:    drivers/platform/surface/surface_hotplug.c
 +
  MICROSOFT SURFACE PRO 3 BUTTON DRIVER
  M:    Chen Yu <yu.c.chen@intel.com>
  L:    platform-driver-x86@vger.kernel.org
  S:    Supported
  F:    drivers/platform/surface/surfacepro3_button.c
  
 +MICROSOFT SURFACE SYSTEM AGGREGATOR SUBSYSTEM
 +M:    Maximilian Luz <luzmaximilian@gmail.com>
 +S:    Maintained
 +W:    https://github.com/linux-surface/surface-aggregator-module
 +C:    irc://chat.freenode.net/##linux-surface
 +F:    Documentation/driver-api/surface_aggregator/
 +F:    drivers/platform/surface/aggregator/
 +F:    drivers/platform/surface/surface_acpi_notify.c
 +F:    drivers/platform/surface/surface_aggregator_cdev.c
 +F:    include/linux/surface_acpi_notify.h
 +F:    include/linux/surface_aggregator/
 +F:    include/uapi/linux/surface_aggregator/
 +
  MICROTEK X6 SCANNER
  M:    Oliver Neukum <oliver@neukum.org>
  S:    Maintained
@@@ -11873,11 -11848,9 +11890,11 @@@ L: linux-media@vger.kernel.or
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/i2c/mipi-ccs.yaml
  F:    Documentation/driver-api/media/drivers/ccs/
 +F:    Documentation/userspace-api/media/drivers/ccs.rst
  F:    drivers/media/i2c/ccs-pll.c
  F:    drivers/media/i2c/ccs-pll.h
  F:    drivers/media/i2c/ccs/
 +F:    include/uapi/linux/ccs.h
  F:    include/uapi/linux/smiapp.h
  
  MIPS
@@@ -11943,7 -11916,8 +11960,7 @@@ L:   linux-mips@vger.kernel.or
  S:    Maintained
  F:    arch/mips/include/asm/mach-loongson2ef/
  F:    arch/mips/loongson2ef/
 -F:    drivers/*/*/*loongson2*
 -F:    drivers/*/*loongson2*
 +F:    drivers/cpufreq/loongson2_cpufreq.c
  
  MIPS/LOONGSON64 ARCHITECTURE
  M:    Huacai Chen <chenhuacai@kernel.org>
@@@ -11952,6 -11926,8 +11969,6 @@@ L:   linux-mips@vger.kernel.or
  S:    Maintained
  F:    arch/mips/include/asm/mach-loongson64/
  F:    arch/mips/loongson64/
 -F:    drivers/*/*/*loongson3*
 -F:    drivers/*/*loongson3*
  F:    drivers/irqchip/irq-loongson*
  F:    drivers/platform/mips/cpu_hwmon.c
  
@@@ -12456,7 -12432,6 +12473,7 @@@ F:   tools/testing/selftests/net/ipsec.
  NETWORKING [IPv4/IPv6]
  M:    "David S. Miller" <davem@davemloft.net>
  M:    Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
 +M:    David Ahern <dsahern@kernel.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
@@@ -12560,14 -12535,6 +12577,14 @@@ F: include/net/nfc
  F:    include/uapi/linux/nfc.h
  F:    net/nfc/
  
 +NFC VIRTUAL NCI DEVICE DRIVER
 +M:    Bongsu Jeon <bongsu.jeon@samsung.com>
 +L:    netdev@vger.kernel.org
 +L:    linux-nfc@lists.01.org (moderated for non-subscribers)
 +S:    Supported
 +F:    drivers/nfc/virtual_ncidev.c
 +F:    tools/testing/selftests/nci/
 +
  NFS, SUNRPC, AND LOCKD CLIENTS
  M:    Trond Myklebust <trond.myklebust@hammerspace.com>
  M:    Anna Schumaker <anna.schumaker@netapp.com>
@@@ -12795,13 -12762,6 +12812,13 @@@ F: drivers/iio/gyro/fxas21002c_core.
  F:    drivers/iio/gyro/fxas21002c_i2c.c
  F:    drivers/iio/gyro/fxas21002c_spi.c
  
 +NXP i.MX CLOCK DRIVERS
 +M:    Abel Vesa <abel.vesa@nxp.com>
 +L:    linux-clk@vger.kernel.org
 +L:    linux-imx@nxp.com
 +S:    Maintained
 +F:    drivers/clk/imx/
 +
  NXP i.MX 8MQ DCSS DRIVER
  M:    Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
  R:    Lucas Stach <l.stach@pengutronix.de>
@@@ -12886,7 -12846,6 +12903,7 @@@ F:   drivers/net/dsa/ocelot/
  F:    drivers/net/ethernet/mscc/
  F:    include/soc/mscc/ocelot*
  F:    net/dsa/tag_ocelot.c
 +F:    net/dsa/tag_ocelot_8021q.c
  F:    tools/testing/selftests/drivers/net/ocelot/*
  
  OCXL (Open Coherent Accelerator Processor Interface OpenCAPI) DRIVER
@@@ -12946,7 -12905,7 +12963,7 @@@ S:   Orpha
  F:    drivers/video/fbdev/omap/
  
  OMAP GENERAL PURPOSE MEMORY CONTROLLER SUPPORT
 -M:    Roger Quadros <rogerq@ti.com>
 +M:    Roger Quadros <rogerq@kernel.org>
  M:    Tony Lindgren <tony@atomide.com>
  L:    linux-omap@vger.kernel.org
  S:    Maintained
@@@ -13166,7 -13125,7 +13183,7 @@@ M:   Jacopo Mondi <jacopo@jmondi.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/ov5647.yaml
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov5647.yaml
  F:    drivers/media/i2c/ov5647.c
  
  OMNIVISION OV5670 SENSOR DRIVER
@@@ -13365,6 -13324,15 +13382,6 @@@ S:  Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  F:    sound/drivers/opl4/
  
 -OPROFILE
 -M:    Robert Richter <rric@kernel.org>
 -L:    oprofile-list@lists.sf.net
 -S:    Maintained
 -F:    arch/*/include/asm/oprofile*.h
 -F:    arch/*/oprofile/
 -F:    drivers/oprofile/
 -F:    include/linux/oprofile.h
 -
  ORACLE CLUSTER FILESYSTEM 2 (OCFS2)
  M:    Mark Fasheh <mark@fasheh.com>
  M:    Joel Becker <jlbec@evilplan.org>
@@@ -14027,6 -13995,15 +14044,6 @@@ L:  linux-input@vger.kernel.or
  S:    Maintained
  F:    drivers/hid/hid-picolcd*
  
 -PICOXCELL SUPPORT
 -M:    Jamie Iles <jamie@jamieiles.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 -T:    git git://github.com/jamieiles/linux-2.6-ji.git
 -F:    arch/arm/boot/dts/picoxcell*
 -F:    arch/arm/mach-picoxcell/
 -F:    drivers/crypto/picoxcell*
 -
  PIDFD API
  M:    Christian Brauner <christian@brauner.io>
  L:    linux-kernel@vger.kernel.org
@@@ -14133,6 -14110,7 +14150,6 @@@ L:   linux-mips@vger.kernel.or
  S:    Odd Fixes
  F:    arch/mips/boot/dts/img/pistachio*
  F:    arch/mips/configs/pistachio*_defconfig
 -F:    arch/mips/include/asm/mach-pistachio/
  F:    arch/mips/pistachio/
  
  PKTCDVD DRIVER
@@@ -14655,12 -14633,6 +14672,12 @@@ L: netdev@vger.kernel.or
  S:    Supported
  F:    drivers/staging/qlge/
  
 +QLOGIC QLGE 10Gb ETHERNET DRIVER
 +M:    Coiby Xu <coiby.xu@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/networking/device_drivers/qlogic/qlge.rst
 +
  QM1D1B0004 MEDIA DRIVER
  M:    Akihiro Tsukada <tskd08@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -14686,9 -14658,11 +14703,11 @@@ M: Stuart Yoder <stuyoder@gmail.com
  M:    Laurentiu Tudor <laurentiu.tudor@nxp.com>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
+ F:    Documentation/ABI/stable/sysfs-bus-fsl-mc
  F:    Documentation/devicetree/bindings/misc/fsl,qoriq-mc.txt
  F:    Documentation/networking/device_drivers/ethernet/freescale/dpaa2/overview.rst
  F:    drivers/bus/fsl-mc/
+ F:    include/uapi/linux/fsl_mc.h
  
  QT1010 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
@@@ -15012,18 -14986,6 +15031,18 @@@ F: drivers/media/i2c/max9271.
  F:    drivers/media/i2c/max9271.h
  F:    drivers/media/i2c/rdacm20.c
  
 +RDACM21 Camera Sensor
 +M:    Jacopo Mondi <jacopo+renesas@jmondi.org>
 +M:    Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
 +M:    Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
 +M:    Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/rdacm2x-gmsl.yaml
 +F:    drivers/media/i2c/max9271.c
 +F:    drivers/media/i2c/max9271.h
 +F:    drivers/media/i2c/rdacm21.c
 +
  RDC R-321X SoC
  M:    Florian Fainelli <florian@openwrt.org>
  S:    Maintained
@@@ -15748,6 -15710,7 +15767,6 @@@ F:   drivers/media/i2c/s5k5baf.
  SAMSUNG S5P Security SubSystem (SSS) DRIVER
  M:    Krzysztof Kozlowski <krzk@kernel.org>
  M:    Vladimir Zapolskiy <vz@mleia.com>
 -M:    Kamil Konieczny <k.konieczny@samsung.com>
  L:    linux-crypto@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Maintained
@@@ -16295,14 -16258,6 +16314,14 @@@ S: Maintaine
  F:    Documentation/fb/sm712fb.rst
  F:    drivers/video/fbdev/sm712*
  
 +SILVACO I3C DUAL-ROLE MASTER
 +M:    Miquel Raynal <miquel.raynal@bootlin.com>
 +M:    Conor Culhane <conor.culhane@silvaco.com>
 +L:    linux-i3c@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/i3c/silvaco,i3c-master.yaml
 +F:    drivers/i3c/master/svc-i3c-master.c
 +
  SIMPLE FIRMWARE INTERFACE (SFI)
  S:    Obsolete
  W:    http://simplefirmware.org/
@@@ -16607,7 -16562,6 +16626,7 @@@ M:   Sakari Ailus <sakari.ailus@linux.int
  L:    linux-media@vger.kernel.org
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/imx258.yaml
  F:    drivers/media/i2c/imx258.c
  
  SONY IMX274 SENSOR DRIVER
@@@ -16633,15 -16587,6 +16652,15 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/imx319.c
  
 +SONY IMX334 SENSOR DRIVER
 +M:    Paul J. Murphy <paul.j.murphy@intel.com>
 +M:    Daniele Alessandrelli <daniele.alessandrelli@intel.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/sony,imx334.yaml
 +F:    drivers/media/i2c/imx334.c
 +
  SONY IMX355 SENSOR DRIVER
  M:    Tianshu Qiu <tian.shu.qiu@intel.com>
  L:    linux-media@vger.kernel.org
@@@ -16731,6 -16676,7 +16750,7 @@@ R:   Pierre-Louis Bossart <pierre-louis.b
  R:    Sanyog Kale <sanyog.r.kale@intel.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire.git
  F:    Documentation/driver-api/soundwire/
  F:    drivers/soundwire/
  F:    include/linux/soundwire/
@@@ -17012,6 -16958,12 +17032,6 @@@ F:  include/linux/static_call*.
  F:    kernel/jump_label.c
  F:    kernel/static_call.c
  
 -STEC S1220 SKD DRIVER
 -M:    Damien Le Moal <Damien.LeMoal@wdc.com>
 -L:    linux-block@vger.kernel.org
 -S:    Maintained
 -F:    drivers/block/skd*[ch]
 -
  STI AUDIO (ASoC) DRIVERS
  M:    Arnaud Pouliquen <arnaud.pouliquen@st.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -17281,7 -17233,6 +17301,7 @@@ F:   drivers/mfd/syscon.
  
  SYSTEM CONTROL & POWER/MANAGEMENT INTERFACE (SCPI/SCMI) Message Protocol drivers
  M:    Sudeep Holla <sudeep.holla@arm.com>
 +R:    Cristian Marussi <cristian.marussi@arm.com>
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/arm/arm,sc[mp]i.txt
@@@ -17289,7 -17240,6 +17309,7 @@@ F:   drivers/clk/clk-sc[mp]i.
  F:    drivers/cpufreq/sc[mp]i-cpufreq.c
  F:    drivers/firmware/arm_scmi/
  F:    drivers/firmware/arm_scpi.c
 +F:    drivers/regulator/scmi-regulator.c
  F:    drivers/reset/reset-scmi.c
  F:    include/linux/sc[mp]i_protocol.h
  F:    include/trace/events/scmi.h
@@@ -17573,14 -17523,6 +17593,14 @@@ M: Laxman Dewangan <ldewangan@nvidia.co
  S:    Supported
  F:    drivers/spi/spi-tegra*
  
 +TEGRA QUAD SPI DRIVER
 +M:    Thierry Reding <thierry.reding@gmail.com>
 +M:    Jonathan Hunter <jonathanh@nvidia.com>
 +M:    Sowjanya Komatineni <skomatineni@nvidia.com>
 +L:    linux-tegra@vger.kernel.org
 +S:    Maintained
 +F:    drivers/spi/spi-tegra210-quad.c
 +
  TEGRA VIDEO DRIVER
  M:    Thierry Reding <thierry.reding@gmail.com>
  M:    Jonathan Hunter <jonathanh@nvidia.com>
@@@ -17651,7 -17593,7 +17671,7 @@@ F:   include/linux/dma/k3-psil.
  
  TEXAS INSTRUMENTS' SYSTEM CONTROL INTERFACE (TISCI) PROTOCOL DRIVER
  M:    Nishanth Menon <nm@ti.com>
 -M:    Tero Kristo <t-kristo@ti.com>
 +M:    Tero Kristo <kristo@kernel.org>
  M:    Santosh Shilimkar <ssantosh@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
@@@ -17673,15 -17615,6 +17693,15 @@@ F: include/dt-bindings/soc/ti,sci_pm_do
  F:    include/linux/soc/ti/ti_sci_inta_msi.h
  F:    include/linux/soc/ti/ti_sci_protocol.h
  
 +TEXAS INSTRUMENTS TPS23861 PoE PSE DRIVER
 +M:    Robert Marko <robert.marko@sartura.hr>
 +M:    Luka Perkov <luka.perkov@sartura.hr>
 +L:    linux-hwmon@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/hwmon/ti,tps23861.yaml
 +F:    Documentation/hwmon/tps23861.rst
 +F:    drivers/hwmon/tps23861.c
 +
  THANKO'S RAREMONO AM/FM/SW RADIO RECEIVER USB DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -17735,7 -17668,7 +17755,7 @@@ F:   drivers/thermal/gov_power_allocator.
  F:    include/trace/events/thermal_power_allocator.h
  
  THINKPAD ACPI EXTRAS DRIVER
 -M:    Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br>
 +M:    Henrique de Moraes Holschuh <hmh@hmh.eng.br>
  L:    ibm-acpi-devel@lists.sourceforge.net
  L:    platform-driver-x86@vger.kernel.org
  S:    Maintained
@@@ -17804,9 -17737,9 +17824,9 @@@ S:   Maintaine
  F:    drivers/clk/clk-cdce706.c
  
  TI CLOCK DRIVER
 -M:    Tero Kristo <t-kristo@ti.com>
 +M:    Tero Kristo <kristo@kernel.org>
  L:    linux-omap@vger.kernel.org
 -S:    Maintained
 +S:    Odd Fixes
  F:    drivers/clk/ti/
  F:    include/linux/clk/ti.h
  
@@@ -17932,7 -17865,7 +17952,7 @@@ M:   Dan Murphy <dmurphy@ti.com
  L:    linux-can@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/can/tcan4x5x.txt
 -F:    drivers/net/can/m_can/tcan4x5x.c
 +F:    drivers/net/can/m_can/tcan4x5x*
  
  TI TRF7970A NFC DRIVER
  M:    Mark Greer <mgreer@animalcreek.com>
@@@ -18196,7 -18129,7 +18216,7 @@@ F:   Documentation/networking/tuntap.rs
  F:    arch/um/os-Linux/drivers/
  
  TURBOCHANNEL SUBSYSTEM
 -M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +M:    "Maciej W. Rozycki" <macro@orcam.me.uk>
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-mips@vger.kernel.org
  S:    Maintained
@@@ -19829,7 -19762,7 +19849,7 @@@ F:   Documentation/admin-guide/blockdev/z
  F:    drivers/block/zram/
  
  ZS DECSTATION Z85C30 SERIAL DRIVER
 -M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +M:    "Maciej W. Rozycki" <macro@orcam.me.uk>
  S:    Maintained
  F:    drivers/tty/serial/zs.*
  
index f9fbbb4734e80254609c0cbd263c02b1722cab84,4acff97519b94e07717e387e5a9d62179e0851d3..dfd4edbfe36086df7c67bafe532929970c73dcb7
  #define SYS_GCR_EL1                   sys_reg(3, 0, 1, 0, 6)
  
  #define SYS_ZCR_EL1                   sys_reg(3, 0, 1, 2, 0)
+ #define SYS_TRFCR_EL1                 sys_reg(3, 0, 1, 2, 1)
  
  #define SYS_TTBR0_EL1                 sys_reg(3, 0, 2, 0, 0)
  #define SYS_TTBR1_EL1                 sys_reg(3, 0, 2, 0, 1)
  #define SYS_PMSFCR_EL1_ST_SHIFT               18
  
  #define SYS_PMSEVFR_EL1                       sys_reg(3, 0, 9, 9, 5)
 -#define SYS_PMSEVFR_EL1_RES0          0x0000ffff00ff0f55UL
 +#define SYS_PMSEVFR_EL1_RES0_8_2      \
 +      (GENMASK_ULL(47, 32) | GENMASK_ULL(23, 16) | GENMASK_ULL(11, 8) |\
 +       BIT_ULL(6) | BIT_ULL(4) | BIT_ULL(2) | BIT_ULL(0))
 +#define SYS_PMSEVFR_EL1_RES0_8_3      \
 +      (SYS_PMSEVFR_EL1_RES0_8_2 & ~(BIT_ULL(18) | BIT_ULL(17) | BIT_ULL(11)))
  
  #define SYS_PMSLATFR_EL1              sys_reg(3, 0, 9, 9, 6)
  #define SYS_PMSLATFR_EL1_MINLAT_SHIFT 0
  
  #define SYS_SCTLR_EL2                 sys_reg(3, 4, 1, 0, 0)
  #define SYS_ZCR_EL2                   sys_reg(3, 4, 1, 2, 0)
+ #define SYS_TRFCR_EL2                 sys_reg(3, 4, 1, 2, 1)
  #define SYS_DACR32_EL2                        sys_reg(3, 4, 3, 0, 0)
  #define SYS_SPSR_EL2                  sys_reg(3, 4, 4, 0, 0)
  #define SYS_ELR_EL2                   sys_reg(3, 4, 4, 0, 1)
  #define ID_AA64MMFR2_CNP_SHIFT                0
  
  /* id_aa64dfr0 */
+ #define ID_AA64DFR0_TRACE_FILT_SHIFT  40
  #define ID_AA64DFR0_DOUBLELOCK_SHIFT  36
  #define ID_AA64DFR0_PMSVER_SHIFT      32
  #define ID_AA64DFR0_CTX_CMPS_SHIFT    28
  #define ID_AA64DFR0_PMUVER_8_5                0x6
  #define ID_AA64DFR0_PMUVER_IMP_DEF    0xf
  
 +#define ID_AA64DFR0_PMSVER_8_2                0x1
 +#define ID_AA64DFR0_PMSVER_8_3                0x2
 +
  #define ID_DFR0_PERFMON_SHIFT         24
  
 +#define ID_DFR0_PERFMON_8_0           0x3
  #define ID_DFR0_PERFMON_8_1           0x4
 +#define ID_DFR0_PERFMON_8_4           0x5
 +#define ID_DFR0_PERFMON_8_5           0x6
  
  #define ID_ISAR4_SWP_FRAC_SHIFT               28
  #define ID_ISAR4_PSR_M_SHIFT          24
  /* Safe value for MPIDR_EL1: Bit31:RES1, Bit30:U:0, Bit24:MT:0 */
  #define SYS_MPIDR_SAFE_VAL    (BIT(31))
  
+ #define TRFCR_ELx_TS_SHIFT            5
+ #define TRFCR_ELx_TS_VIRTUAL          ((0x1UL) << TRFCR_ELx_TS_SHIFT)
+ #define TRFCR_ELx_TS_GUEST_PHYSICAL   ((0x2UL) << TRFCR_ELx_TS_SHIFT)
+ #define TRFCR_ELx_TS_PHYSICAL         ((0x3UL) << TRFCR_ELx_TS_SHIFT)
+ #define TRFCR_EL2_CX                  BIT(3)
+ #define TRFCR_ELx_ExTRE                       BIT(1)
+ #define TRFCR_ELx_E0TRE                       BIT(0)
  #ifdef __ASSEMBLY__
  
        .irp    num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
index 835d17455fcdb1a57e77f861c80a2033b6874122,4dbd24c506d6c795500c9994f821d1959724099e..9af1d4c124d378d312e943c260c43afd426c8156
@@@ -12,14 -12,15 +12,15 @@@ struct spk_ldisc_data 
        char buf;
        struct completion completion;
        bool buf_free;
+       struct spk_synth *synth;
  };
  
- static struct spk_synth *spk_ttyio_synth;
- static struct tty_struct *speakup_tty;
- /* mutex to protect against speakup_tty disappearing from underneath us while
-  * we are using it. this can happen when the device physically unplugged,
-  * while in use. it also serialises access to speakup_tty.
+ /*
+  * This allows to catch within spk_ttyio_ldisc_open whether it is getting set
+  * on for a speakup-driven device.
   */
+ static struct tty_struct *speakup_tty;
+ /* This mutex serializes the use of such global speakup_tty variable */
  static DEFINE_MUTEX(speakup_tty_mutex);
  
  static int ser_to_dev(int ser, dev_t *dev_no)
@@@ -67,22 -68,20 +68,20 @@@ static int spk_ttyio_ldisc_open(struct 
  
  static void spk_ttyio_ldisc_close(struct tty_struct *tty)
  {
-       mutex_lock(&speakup_tty_mutex);
-       kfree(speakup_tty->disc_data);
-       speakup_tty = NULL;
-       mutex_unlock(&speakup_tty_mutex);
+       kfree(tty->disc_data);
  }
  
  static int spk_ttyio_receive_buf2(struct tty_struct *tty,
                                  const unsigned char *cp, char *fp, int count)
  {
        struct spk_ldisc_data *ldisc_data = tty->disc_data;
+       struct spk_synth *synth = ldisc_data->synth;
  
-       if (spk_ttyio_synth->read_buff_add) {
+       if (synth->read_buff_add) {
                int i;
  
                for (i = 0; i < count; i++)
-                       spk_ttyio_synth->read_buff_add(cp[i]);
+                       synth->read_buff_add(cp[i]);
  
                return count;
        }
@@@ -114,11 -113,11 +113,11 @@@ static struct tty_ldisc_ops spk_ttyio_l
  
  static int spk_ttyio_out(struct spk_synth *in_synth, const char ch);
  static int spk_ttyio_out_unicode(struct spk_synth *in_synth, u16 ch);
- static void spk_ttyio_send_xchar(char ch);
- static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear);
- static unsigned char spk_ttyio_in(void);
- static unsigned char spk_ttyio_in_nowait(void);
- static void spk_ttyio_flush_buffer(void);
+ static void spk_ttyio_send_xchar(struct spk_synth *in_synth, char ch);
+ static void spk_ttyio_tiocmset(struct spk_synth *in_synth, unsigned int set, unsigned int clear);
+ static unsigned char spk_ttyio_in(struct spk_synth *in_synth);
+ static unsigned char spk_ttyio_in_nowait(struct spk_synth *in_synth);
+ static void spk_ttyio_flush_buffer(struct spk_synth *in_synth);
  static int spk_ttyio_wait_for_xmitr(struct spk_synth *in_synth);
  
  struct spk_io_ops spk_ttyio_ops = {
@@@ -152,7 -151,7 +151,7 @@@ static int spk_ttyio_initialise_ldisc(s
        if (ret)
                return ret;
  
 -      tty = tty_kopen(dev);
 +      tty = tty_kopen_exclusive(dev);
        if (IS_ERR(tty))
                return PTR_ERR(tty);
  
        mutex_lock(&speakup_tty_mutex);
        speakup_tty = tty;
        ret = tty_set_ldisc(tty, N_SPEAKUP);
-       if (ret)
-               speakup_tty = NULL;
+       speakup_tty = NULL;
        mutex_unlock(&speakup_tty_mutex);
  
-       if (!ret)
+       if (!ret) {
                /* Success */
+               struct spk_ldisc_data *ldisc_data = tty->disc_data;
+               ldisc_data->synth = synth;
+               synth->dev = tty;
                return 0;
+       }
  
        pr_err("speakup: Failed to set N_SPEAKUP on tty\n");
  
@@@ -221,29 -224,30 +224,30 @@@ void spk_ttyio_unregister_ldisc(void
  
  static int spk_ttyio_out(struct spk_synth *in_synth, const char ch)
  {
-       mutex_lock(&speakup_tty_mutex);
-       if (in_synth->alive && speakup_tty && speakup_tty->ops->write) {
-               int ret = speakup_tty->ops->write(speakup_tty, &ch, 1);
-               mutex_unlock(&speakup_tty_mutex);
-               if (ret == 0)
-                       /* No room */
-                       return 0;
-               if (ret < 0) {
-                       pr_warn("%s: I/O error, deactivating speakup\n",
-                               in_synth->long_name);
-                       /* No synth any more, so nobody will restart TTYs,
-                        * and we thus need to do it ourselves.  Now that there
-                        * is no synth we can let application flood anyway
-                        */
-                       in_synth->alive = 0;
-                       speakup_start_ttys();
-                       return 0;
-               }
+       struct tty_struct *tty = in_synth->dev;
+       int ret;
+       if (!in_synth->alive || !tty->ops->write)
+               return 0;
+       ret = tty->ops->write(tty, &ch, 1);
+       if (ret == 0)
+               /* No room */
+               return 0;
+       if (ret > 0)
+               /* Success */
                return 1;
-       }
  
-       mutex_unlock(&speakup_tty_mutex);
+       pr_warn("%s: I/O error, deactivating speakup\n",
+               in_synth->long_name);
+       /* No synth any more, so nobody will restart TTYs,
+        * and we thus need to do it ourselves.  Now that there
+        * is no synth we can let application flood anyway
+        */
+       in_synth->alive = 0;
+       speakup_start_ttys();
        return 0;
  }
  
@@@ -264,47 -268,20 +268,20 @@@ static int spk_ttyio_out_unicode(struc
        return ret;
  }
  
- static int check_tty(struct tty_struct *tty)
- {
-       if (!tty) {
-               pr_warn("%s: I/O error, deactivating speakup\n",
-                       spk_ttyio_synth->long_name);
-               /* No synth any more, so nobody will restart TTYs, and we thus
-                * need to do it ourselves.  Now that there is no synth we can
-                * let application flood anyway
-                */
-               spk_ttyio_synth->alive = 0;
-               speakup_start_ttys();
-               return 1;
-       }
-       return 0;
- }
- static void spk_ttyio_send_xchar(char ch)
+ static void spk_ttyio_send_xchar(struct spk_synth *in_synth, char ch)
  {
-       mutex_lock(&speakup_tty_mutex);
-       if (check_tty(speakup_tty)) {
-               mutex_unlock(&speakup_tty_mutex);
-               return;
-       }
+       struct tty_struct *tty = in_synth->dev;
  
-       if (speakup_tty->ops->send_xchar)
-               speakup_tty->ops->send_xchar(speakup_tty, ch);
-       mutex_unlock(&speakup_tty_mutex);
+       if (tty->ops->send_xchar)
+               tty->ops->send_xchar(tty, ch);
  }
  
- static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear)
+ static void spk_ttyio_tiocmset(struct spk_synth *in_synth, unsigned int set, unsigned int clear)
  {
-       mutex_lock(&speakup_tty_mutex);
-       if (check_tty(speakup_tty)) {
-               mutex_unlock(&speakup_tty_mutex);
-               return;
-       }
+       struct tty_struct *tty = in_synth->dev;
  
-       if (speakup_tty->ops->tiocmset)
-               speakup_tty->ops->tiocmset(speakup_tty, set, clear);
-       mutex_unlock(&speakup_tty_mutex);
+       if (tty->ops->tiocmset)
+               tty->ops->tiocmset(tty, set, clear);
  }
  
  static int spk_ttyio_wait_for_xmitr(struct spk_synth *in_synth)
        return 1;
  }
  
- static unsigned char ttyio_in(int timeout)
+ static unsigned char ttyio_in(struct spk_synth *in_synth, int timeout)
  {
-       struct spk_ldisc_data *ldisc_data = speakup_tty->disc_data;
+       struct tty_struct *tty = in_synth->dev;
+       struct spk_ldisc_data *ldisc_data = tty->disc_data;
        char rv;
  
        if (!timeout) {
        mb();
        ldisc_data->buf_free = true;
        /* Let TTY push more characters */
-       tty_schedule_flip(speakup_tty->port);
+       tty_schedule_flip(tty->port);
  
        return rv;
  }
  
- static unsigned char spk_ttyio_in(void)
+ static unsigned char spk_ttyio_in(struct spk_synth *in_synth)
  {
-       return ttyio_in(SPK_SYNTH_TIMEOUT);
+       return ttyio_in(in_synth, SPK_SYNTH_TIMEOUT);
  }
  
- static unsigned char spk_ttyio_in_nowait(void)
+ static unsigned char spk_ttyio_in_nowait(struct spk_synth *in_synth)
  {
-       u8 rv = ttyio_in(0);
+       u8 rv = ttyio_in(in_synth, 0);
  
        return (rv == 0xff) ? 0 : rv;
  }
  
- static void spk_ttyio_flush_buffer(void)
+ static void spk_ttyio_flush_buffer(struct spk_synth *in_synth)
  {
-       mutex_lock(&speakup_tty_mutex);
-       if (check_tty(speakup_tty)) {
-               mutex_unlock(&speakup_tty_mutex);
-               return;
-       }
+       struct tty_struct *tty = in_synth->dev;
  
-       if (speakup_tty->ops->flush_buffer)
-               speakup_tty->ops->flush_buffer(speakup_tty);
-       mutex_unlock(&speakup_tty_mutex);
+       if (tty->ops->flush_buffer)
+               tty->ops->flush_buffer(tty);
  }
  
  int spk_ttyio_synth_probe(struct spk_synth *synth)
                return rv;
  
        synth->alive = 1;
-       spk_ttyio_synth = synth;
  
        return 0;
  }
  EXPORT_SYMBOL_GPL(spk_ttyio_synth_probe);
  
- void spk_ttyio_release(void)
+ void spk_ttyio_release(struct spk_synth *in_synth)
  {
-       if (!speakup_tty)
-               return;
+       struct tty_struct *tty = in_synth->dev;
  
-       tty_lock(speakup_tty);
+       tty_lock(tty);
  
-       if (speakup_tty->ops->close)
-               speakup_tty->ops->close(speakup_tty, NULL);
+       if (tty->ops->close)
+               tty->ops->close(tty, NULL);
+       tty_ldisc_flush(tty);
+       tty_unlock(tty);
+       tty_kclose(tty);
  
-       tty_ldisc_flush(speakup_tty);
-       tty_unlock(speakup_tty);
-       tty_kclose(speakup_tty);
+       in_synth->dev = NULL;
  }
  EXPORT_SYMBOL_GPL(spk_ttyio_release);
  
- const char *spk_ttyio_synth_immediate(struct spk_synth *synth, const char *buff)
+ const char *spk_ttyio_synth_immediate(struct spk_synth *in_synth, const char *buff)
  {
+       struct tty_struct *tty = in_synth->dev;
        u_char ch;
  
        while ((ch = *buff)) {
                if (ch == '\n')
-                       ch = synth->procspeech;
-               if (tty_write_room(speakup_tty) < 1 ||
-                   !synth->io_ops->synth_out(synth, ch))
+                       ch = in_synth->procspeech;
+               if (tty_write_room(tty) < 1 ||
+                   !in_synth->io_ops->synth_out(in_synth, ch))
                        return buff;
                buff++;
        }
index 8af978bd0000c2a2302e609dc49851fe9528d733,0c8bf020ba43ef95a45e5b4df463df1fc5ca6500..380ad1fdb74564b4f63a0150672d5d20afc5b045
@@@ -41,7 -41,7 +41,7 @@@ struct fsl_mc 
        struct fsl_mc_device *root_mc_bus_dev;
        u8 num_translation_ranges;
        struct fsl_mc_addr_translation_range *translation_ranges;
-       void *fsl_mc_regs;
+       void __iomem *fsl_mc_regs;
  };
  
  /**
@@@ -208,12 -208,108 +208,108 @@@ static struct attribute *fsl_mc_dev_att
  
  ATTRIBUTE_GROUPS(fsl_mc_dev);
  
+ static int scan_fsl_mc_bus(struct device *dev, void *data)
+ {
+       struct fsl_mc_device *root_mc_dev;
+       struct fsl_mc_bus *root_mc_bus;
+       if (!fsl_mc_is_root_dprc(dev))
+               goto exit;
+       root_mc_dev = to_fsl_mc_device(dev);
+       root_mc_bus = to_fsl_mc_bus(root_mc_dev);
+       mutex_lock(&root_mc_bus->scan_mutex);
+       dprc_scan_objects(root_mc_dev, NULL);
+       mutex_unlock(&root_mc_bus->scan_mutex);
+ exit:
+       return 0;
+ }
+ static ssize_t rescan_store(struct bus_type *bus,
+                           const char *buf, size_t count)
+ {
+       unsigned long val;
+       if (kstrtoul(buf, 0, &val) < 0)
+               return -EINVAL;
+       if (val)
+               bus_for_each_dev(bus, NULL, NULL, scan_fsl_mc_bus);
+       return count;
+ }
+ static BUS_ATTR_WO(rescan);
+ static int fsl_mc_bus_set_autorescan(struct device *dev, void *data)
+ {
+       struct fsl_mc_device *root_mc_dev;
+       unsigned long val;
+       char *buf = data;
+       if (!fsl_mc_is_root_dprc(dev))
+               goto exit;
+       root_mc_dev = to_fsl_mc_device(dev);
+       if (kstrtoul(buf, 0, &val) < 0)
+               return -EINVAL;
+       if (val)
+               enable_dprc_irq(root_mc_dev);
+       else
+               disable_dprc_irq(root_mc_dev);
+ exit:
+       return 0;
+ }
+ static int fsl_mc_bus_get_autorescan(struct device *dev, void *data)
+ {
+       struct fsl_mc_device *root_mc_dev;
+       char *buf = data;
+       if (!fsl_mc_is_root_dprc(dev))
+               goto exit;
+       root_mc_dev = to_fsl_mc_device(dev);
+       sprintf(buf, "%d\n", get_dprc_irq_state(root_mc_dev));
+ exit:
+       return 0;
+ }
+ static ssize_t autorescan_store(struct bus_type *bus,
+                               const char *buf, size_t count)
+ {
+       bus_for_each_dev(bus, NULL, (void *)buf, fsl_mc_bus_set_autorescan);
+       return count;
+ }
+ static ssize_t autorescan_show(struct bus_type *bus, char *buf)
+ {
+       bus_for_each_dev(bus, NULL, (void *)buf, fsl_mc_bus_get_autorescan);
+       return strlen(buf);
+ }
+ static BUS_ATTR_RW(autorescan);
+ static struct attribute *fsl_mc_bus_attrs[] = {
+       &bus_attr_rescan.attr,
+       &bus_attr_autorescan.attr,
+       NULL,
+ };
+ ATTRIBUTE_GROUPS(fsl_mc_bus);
  struct bus_type fsl_mc_bus_type = {
        .name = "fsl-mc",
        .match = fsl_mc_bus_match,
        .uevent = fsl_mc_bus_uevent,
        .dma_configure  = fsl_mc_dma_configure,
        .dev_groups = fsl_mc_dev_groups,
+       .bus_groups = fsl_mc_bus_groups,
  };
  EXPORT_SYMBOL_GPL(fsl_mc_bus_type);
  
@@@ -292,6 -388,11 +388,11 @@@ struct device_type fsl_mc_bus_dpdmai_ty
  };
  EXPORT_SYMBOL_GPL(fsl_mc_bus_dpdmai_type);
  
+ struct device_type fsl_mc_bus_dpdbg_type = {
+       .name = "fsl_mc_bus_dpdbg"
+ };
+ EXPORT_SYMBOL_GPL(fsl_mc_bus_dpdbg_type);
  static struct device_type *fsl_mc_get_device_type(const char *type)
  {
        static const struct {
                { &fsl_mc_bus_dpaiop_type, "dpaiop" },
                { &fsl_mc_bus_dpci_type, "dpci" },
                { &fsl_mc_bus_dpdmai_type, "dpdmai" },
+               { &fsl_mc_bus_dpdbg_type, "dpdbg" },
                { NULL, NULL }
        };
        int i;
@@@ -840,15 -942,6 +942,15 @@@ struct fsl_mc_device *fsl_mc_get_endpoi
        endpoint_desc.id = endpoint2.id;
        endpoint = fsl_mc_device_lookup(&endpoint_desc, mc_bus_dev);
  
 +      /*
 +       * We know that the device has an endpoint because we verified by
 +       * interrogating the firmware. This is the case when the device was not
 +       * yet discovered by the fsl-mc bus, thus the lookup returned NULL.
 +       * Differentiate this case by returning EPROBE_DEFER.
 +       */
 +      if (!endpoint)
 +              return ERR_PTR(-EPROBE_DEFER);
 +
        return endpoint;
  }
  EXPORT_SYMBOL_GPL(fsl_mc_get_endpoint);
diff --combined drivers/char/random.c
index 84e24986a97a3c876d5572ccf9a34f9d8b9e3088,a894c0559a8cf2751bdc5396ece1998e1aaa5539..0fe9e200e4c8401681954e7f59cd785205b2924b
@@@ -1261,6 -1261,8 +1261,6 @@@ void add_interrupt_randomness(int irq, 
        cycles_t                cycles = random_get_entropy();
        __u32                   c_high, j_high;
        __u64                   ip;
 -      unsigned long           seed;
 -      int                     credit = 0;
  
        if (cycles == 0)
                cycles = get_reg(fast_pool, regs);
  
        fast_pool->last = now;
        __mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool));
 -
 -      /*
 -       * If we have architectural seed generator, produce a seed and
 -       * add it to the pool.  For the sake of paranoia don't let the
 -       * architectural seed generator dominate the input from the
 -       * interrupt noise.
 -       */
 -      if (arch_get_random_seed_long(&seed)) {
 -              __mix_pool_bytes(r, &seed, sizeof(seed));
 -              credit = 1;
 -      }
        spin_unlock(&r->lock);
  
        fast_pool->count = 0;
  
        /* award one bit for the contents of the fast pool */
 -      credit_entropy_bits(r, credit + 1);
 +      credit_entropy_bits(r, 1);
  }
  EXPORT_SYMBOL_GPL(add_interrupt_randomness);
  
@@@ -1959,7 -1972,7 +1959,7 @@@ static long random_ioctl(struct file *f
                        return -EPERM;
                if (crng_init < 2)
                        return -ENODATA;
-               crng_reseed(&primary_crng, NULL);
+               crng_reseed(&primary_crng, &input_pool);
                crng_global_init_time = jiffies - 1;
                return 0;
        default:
diff --combined drivers/memory/Kconfig
index 7d9d33d8ebf66bdb6b013ba993fcc1f2c77aefd6,3c9a9882ef28197539fdb8c0be616eee81349965..72c0df129d5c50658fca2e56e8e9694c628e187d
@@@ -137,6 -137,15 +137,15 @@@ config TI_EMIF_SRA
          sequence so this driver provides several relocatable PM functions
          for the SoC PM code to use.
  
+ config FPGA_DFL_EMIF
+       tristate "FPGA DFL EMIF Driver"
+       depends on FPGA_DFL && HAS_IOMEM
+       help
+         This driver is for the EMIF private feature implemented under
+         FPGA Device Feature List (DFL) framework. It is used to expose
+         memory interface status information as well as memory clearing
+         control.
  config MVEBU_DEVBUS
        bool "Marvell EBU Device Bus Controller"
        default y if PLAT_ORION
@@@ -173,7 -182,7 +182,7 @@@ config JZ4780_NEM
          memory devices such as NAND and SRAM.
  
  config MTK_SMI
 -      bool "Mediatek SoC Memory Controller driver" if COMPILE_TEST
 +      tristate "MediaTek SoC Memory Controller driver" if COMPILE_TEST
        depends on ARCH_MEDIATEK || COMPILE_TEST
        help
          This driver is for the Memory Controller module in MediaTek SoCs,
@@@ -202,9 -211,9 +211,9 @@@ config RENESAS_RPCI
        depends on ARCH_RENESAS || COMPILE_TEST
        select REGMAP_MMIO
        help
 -        This supports Renesas R-Car Gen3 RPC-IF which provides either SPI
 -        host or HyperFlash. You'll have to select individual components
 -        under the corresponding menu.
 +        This supports Renesas R-Car Gen3 or RZ/G2 RPC-IF which provides
 +        either SPI host or HyperFlash. You'll have to select individual
 +        components under the corresponding menu.
  
  config STM32_FMC2_EBI
        tristate "Support for FMC2 External Bus Interface on STM32MP SoCs"
index 41af347157e0939e9119be4577b5266405d1d699,dc9f5a83dfc90529fcdcc5d43fccf0455f9a4e75..d933878b24d133b6a0e61db940a96f94c97b6781
  #define HL_NAME                               "habanalabs"
  
  /* Use upper bits of mmap offset to store habana driver specific information.
-  * bits[63:62] - Encode mmap type
+  * bits[63:61] - Encode mmap type
   * bits[45:0]  - mmap offset value
   *
   * NOTE: struct vm_area_struct.vm_pgoff uses offset in pages. Hence, these
   *  defines are w.r.t to PAGE_SIZE
   */
- #define HL_MMAP_TYPE_SHIFT            (62 - PAGE_SHIFT)
- #define HL_MMAP_TYPE_MASK             (0x3ull << HL_MMAP_TYPE_SHIFT)
+ #define HL_MMAP_TYPE_SHIFT            (61 - PAGE_SHIFT)
+ #define HL_MMAP_TYPE_MASK             (0x7ull << HL_MMAP_TYPE_SHIFT)
+ #define HL_MMAP_TYPE_BLOCK            (0x4ull << HL_MMAP_TYPE_SHIFT)
  #define HL_MMAP_TYPE_CB                       (0x2ull << HL_MMAP_TYPE_SHIFT)
  
- #define HL_MMAP_OFFSET_VALUE_MASK     (0x3FFFFFFFFFFFull >> PAGE_SHIFT)
+ #define HL_MMAP_OFFSET_VALUE_MASK     (0x1FFFFFFFFFFFull >> PAGE_SHIFT)
  #define HL_MMAP_OFFSET_VALUE_GET(off) (off & HL_MMAP_OFFSET_VALUE_MASK)
  
  #define HL_PENDING_RESET_PER_SEC      10
@@@ -408,6 -409,9 +409,9 @@@ struct hl_mmu_properties 
   * @sync_stream_first_mon: first monitor available for sync stream use
   * @first_available_user_sob: first sob available for the user
   * @first_available_user_mon: first monitor available for the user
+  * @first_available_user_msix_interrupt: first available msix interrupt
+  *                                       reserved for the user
+  * @first_available_cq: first available CQ for the user.
   * @tpc_enabled_mask: which TPCs are enabled.
   * @completion_queues_count: number of completion queues.
   * @fw_security_disabled: true if security measures are disabled in firmware,
   *                            from BOOT_DEV_STS0
   * @dram_supports_virtual_memory: is there an MMU towards the DRAM
   * @hard_reset_done_by_fw: true if firmware is handling hard reset flow
+  * @num_functional_hbms: number of functional HBMs in each DCORE.
   */
  struct asic_fixed_properties {
        struct hw_queue_properties      *hw_queues_props;
        u16                             sync_stream_first_mon;
        u16                             first_available_user_sob[HL_MAX_DCORES];
        u16                             first_available_user_mon[HL_MAX_DCORES];
+       u16                             first_available_user_msix_interrupt;
+       u16                             first_available_cq[HL_MAX_DCORES];
        u8                              tpc_enabled_mask;
        u8                              completion_queues_count;
        u8                              fw_security_disabled;
        u8                              fw_security_status_valid;
        u8                              dram_supports_virtual_memory;
        u8                              hard_reset_done_by_fw;
+       u8                              num_functional_hbms;
  };
  
  /**
   * struct hl_fence - software synchronization primitive
   * @completion: fence is implemented using completion
   * @refcount: refcount for this fence
+  * @cs_sequence: sequence of the corresponding command submission
   * @error: mark this fence with error
   * @timestamp: timestamp upon completion
   *
  struct hl_fence {
        struct completion       completion;
        struct kref             refcount;
+       u64                     cs_sequence;
        int                     error;
        ktime_t                 timestamp;
  };
@@@ -846,6 -856,19 +856,19 @@@ enum div_select_defs 
   * @collective_wait_init_cs: Generate collective master/slave packets
   *                           and place them in the relevant cs jobs
   * @collective_wait_create_jobs: allocate collective wait cs jobs
+  * @scramble_addr: Routine to scramble the address prior of mapping it
+  *                 in the MMU.
+  * @descramble_addr: Routine to de-scramble the address prior of
+  *                   showing it to users.
+  * @ack_protection_bits_errors: ack and dump all security violations
+  * @get_hw_block_id: retrieve a HW block id to be used by the user to mmap it.
+  *                   also returns the size of the block if caller supplies
+  *                   a valid pointer for it
+  * @hw_block_mmap: mmap a HW block with a given id.
+  * @enable_events_from_fw: send interrupt to firmware to notify them the
+  *                         driver is ready to receive asynchronous events. This
+  *                         function should be called during the first init and
+  *                         after every hard-reset of the device
   */
  struct hl_asic_funcs {
        int (*early_init)(struct hl_device *hdev);
        void (*set_clock_gating)(struct hl_device *hdev);
        void (*disable_clock_gating)(struct hl_device *hdev);
        int (*debug_coresight)(struct hl_device *hdev, void *data);
-       bool (*is_device_idle)(struct hl_device *hdev, u64 *mask,
-                               struct seq_file *s);
+       bool (*is_device_idle)(struct hl_device *hdev, u64 *mask_arr,
+                                       u8 mask_len, struct seq_file *s);
        int (*soft_reset_late_init)(struct hl_device *hdev);
        void (*hw_queues_lock)(struct hl_device *hdev);
        void (*hw_queues_unlock)(struct hl_device *hdev);
        int (*collective_wait_create_jobs)(struct hl_device *hdev,
                        struct hl_ctx *ctx, struct hl_cs *cs, u32 wait_queue_id,
                        u32 collective_engine_id);
+       u64 (*scramble_addr)(struct hl_device *hdev, u64 addr);
+       u64 (*descramble_addr)(struct hl_device *hdev, u64 addr);
+       void (*ack_protection_bits_errors)(struct hl_device *hdev);
+       int (*get_hw_block_id)(struct hl_device *hdev, u64 block_addr,
+                               u32 *block_size, u32 *block_id);
+       int (*hw_block_mmap)(struct hl_device *hdev, struct vm_area_struct *vma,
+                       u32 block_id, u32 block_size);
+       void (*enable_events_from_fw)(struct hl_device *hdev);
  };
  
  
@@@ -1011,6 -1042,20 +1042,20 @@@ struct hl_cs_counters_atomic 
        atomic64_t validation_drop_cnt;
  };
  
+ /**
+  * struct hl_pending_cb - pending command buffer structure
+  * @cb_node: cb node in pending cb list
+  * @cb: command buffer to send in next submission
+  * @cb_size: command buffer size
+  * @hw_queue_id: destination queue id
+  */
+ struct hl_pending_cb {
+       struct list_head        cb_node;
+       struct hl_cb            *cb;
+       u32                     cb_size;
+       u32                     hw_queue_id;
+ };
  /**
   * struct hl_ctx - user/kernel context.
   * @mem_hash: holds mapping from virtual address to virtual memory area
   * @mmu_lock: protects the MMU page tables. Any change to the PGT, modifying the
   *            MMU hash or walking the PGT requires talking this lock.
   * @debugfs_list: node in debugfs list of contexts.
+  * pending_cb_list: list of pending command buffers waiting to be sent upon
+  *                  next user command submission context.
   * @cs_counters: context command submission counters.
   * @cb_va_pool: device VA pool for command buffers which are mapped to the
   *              device's MMU.
   *                    index to cs_pending array.
   * @dram_default_hops: array that holds all hops addresses needed for default
   *                     DRAM mapping.
+  * @pending_cb_lock: spinlock to protect pending cb list
   * @cs_lock: spinlock to protect cs_sequence.
   * @dram_phys_mem: amount of used physical DRAM memory by this context.
   * @thread_ctx_switch_token: token to prevent multiple threads of the same
   *                            context from running the context switch phase.
   *                            Only a single thread should run it.
+  * @thread_pending_cb_token: token to prevent multiple threads from processing
+  *                            the pending CB list. Only a single thread should
+  *                            process the list since it is protected by a
+  *                            spinlock and we don't want to halt the entire
+  *                            command submission sequence.
   * @thread_ctx_switch_wait_token: token to prevent the threads that didn't run
   *                            the context switch phase from moving to their
   *                            execution phase before the context switch phase
@@@ -1057,13 -1110,16 +1110,16 @@@ struct hl_ctx 
        struct mutex                    mem_hash_lock;
        struct mutex                    mmu_lock;
        struct list_head                debugfs_list;
+       struct list_head                pending_cb_list;
        struct hl_cs_counters_atomic    cs_counters;
        struct gen_pool                 *cb_va_pool;
        u64                             cs_sequence;
        u64                             *dram_default_hops;
+       spinlock_t                      pending_cb_lock;
        spinlock_t                      cs_lock;
        atomic64_t                      dram_phys_mem;
        atomic_t                        thread_ctx_switch_token;
+       atomic_t                        thread_pending_cb_token;
        u32                             thread_ctx_switch_wait_token;
        u32                             asid;
        u32                             handle;
@@@ -1089,8 -1145,7 +1145,8 @@@ struct hl_ctx_mgr 
   * struct hl_userptr - memory mapping chunk information
   * @vm_type: type of the VM.
   * @job_node: linked-list node for hanging the object on the Job's list.
 - * @vec: pointer to the frame vector.
 + * @pages: pointer to struct page array
 + * @npages: size of @pages array
   * @sgt: pointer to the scatter-gather table that holds the pages.
   * @dir: for DMA unmapping, the direction must be supplied, so save it.
   * @debugfs_list: node in debugfs list of command submissions.
  struct hl_userptr {
        enum vm_type_t          vm_type; /* must be first */
        struct list_head        job_node;
 -      struct frame_vector     *vec;
 +      struct page             **pages;
 +      unsigned int            npages;
        struct sg_table         *sgt;
        enum dma_data_direction dir;
        struct list_head        debugfs_list;
   * @finish_work: workqueue object to run when CS is completed by H/W.
   * @work_tdr: delayed work node for TDR.
   * @mirror_node : node in device mirror list of command submissions.
+  * @staged_cs_node: node in the staged cs list.
   * @debugfs_list: node in debugfs list of command submissions.
   * @sequence: the sequence number of this CS.
+  * @staged_sequence: the sequence of the staged submission this CS is part of,
+  *                   relevant only if staged_cs is set.
   * @type: CS_TYPE_*.
   * @submitted: true if CS was submitted to H/W.
   * @completed: true if CS was completed by device.
   * @tdr_active: true if TDR was activated for this CS (to prevent
   *            double TDR activation).
   * @aborted: true if CS was aborted due to some device error.
-  * @timestamp: true if a timestmap must be captured upon completion
+  * @timestamp: true if a timestmap must be captured upon completion.
+  * @staged_last: true if this is the last staged CS and needs completion.
+  * @staged_first: true if this is the first staged CS and we need to receive
+  *                timeout for this CS.
+  * @staged_cs: true if this CS is part of a staged submission.
   */
  struct hl_cs {
        u16                     *jobs_in_queue_cnt;
        struct work_struct      finish_work;
        struct delayed_work     work_tdr;
        struct list_head        mirror_node;
+       struct list_head        staged_cs_node;
        struct list_head        debugfs_list;
        u64                     sequence;
+       u64                     staged_sequence;
        enum hl_cs_type         type;
        u8                      submitted;
        u8                      completed;
        u8                      tdr_active;
        u8                      aborted;
        u8                      timestamp;
+       u8                      staged_last;
+       u8                      staged_first;
+       u8                      staged_cs;
  };
  
  /**
@@@ -1225,6 -1291,7 +1293,7 @@@ struct hl_cs_job 
   *                    MSG_PROT packets. Relevant only for GAUDI as GOYA doesn't
   *                    have streams so the engine can't be busy by another
   *                    stream.
+  * @completion: true if we need completion for this CS.
   */
  struct hl_cs_parser {
        struct hl_cb            *user_cb;
        u8                      job_id;
        u8                      is_kernel_allocated_cb;
        u8                      contains_dma_pkt;
+       u8                      completion;
  };
  
  /*
@@@ -1688,12 -1756,20 +1758,20 @@@ struct hl_mmu_per_hop_info 
   * struct hl_mmu_hop_info - A structure describing the TLB hops and their
   * hop-entries that were created in order to translate a virtual address to a
   * physical one.
+  * @scrambled_vaddr: The value of the virtual address after scrambling. This
+  *                   address replaces the original virtual-address when mapped
+  *                   in the MMU tables.
+  * @unscrambled_paddr: The un-scrambled physical address.
   * @hop_info: Array holding the per-hop information used for the translation.
   * @used_hops: The number of hops used for the translation.
+  * @range_type: virtual address range type.
   */
  struct hl_mmu_hop_info {
+       u64 scrambled_vaddr;
+       u64 unscrambled_paddr;
        struct hl_mmu_per_hop_info hop_info[MMU_ARCH_5_HOPS];
        u32 used_hops;
+       enum hl_va_range_type range_type;
  };
  
  /**
@@@ -1766,7 -1842,6 +1844,6 @@@ struct hl_mmu_funcs 
   * @asic_funcs: ASIC specific functions.
   * @asic_specific: ASIC specific information to use only from ASIC files.
   * @vm: virtual memory manager for MMU.
-  * @mmu_cache_lock: protects MMU cache invalidation as it can serve one context.
   * @hwmon_dev: H/W monitor device.
   * @pm_mng_profile: current power management profile.
   * @hl_chip_info: ASIC's sensors information.
   *                          user processes
   * @device_fini_pending: true if device_fini was called and might be
   *                       waiting for the reset thread to finish
+  * @supports_staged_submission: true if staged submissions are supported
   */
  struct hl_device {
        struct pci_dev                  *pdev;
        const struct hl_asic_funcs      *asic_funcs;
        void                            *asic_specific;
        struct hl_vm                    vm;
-       struct mutex                    mmu_cache_lock;
        struct device                   *hwmon_dev;
        enum hl_pm_mng_profile          pm_mng_profile;
        struct hwmon_chip_info          *hl_chip_info;
        u8                              needs_reset;
        u8                              process_kill_trial_cnt;
        u8                              device_fini_pending;
+       u8                              supports_staged_submission;
  
        /* Parameters for bring-up */
        u64                             nic_ports_mask;
@@@ -2067,7 -2143,7 +2145,7 @@@ int hl_hw_queue_send_cb_no_cmpl(struct 
  int hl_hw_queue_schedule_cs(struct hl_cs *cs);
  u32 hl_hw_queue_add_ptr(u32 ptr, u16 val);
  void hl_hw_queue_inc_ci_kernel(struct hl_device *hdev, u32 hw_queue_id);
- void hl_int_hw_queue_update_ci(struct hl_cs *cs);
+ void hl_hw_queue_update_ci(struct hl_cs *cs);
  void hl_hw_queue_reset(struct hl_device *hdev, bool hard_reset);
  
  #define hl_queue_inc_ptr(p)           hl_hw_queue_add_ptr(p, 1)
@@@ -2123,6 -2199,7 +2201,7 @@@ int hl_cb_create(struct hl_device *hdev
                        bool map_cb, u64 *handle);
  int hl_cb_destroy(struct hl_device *hdev, struct hl_cb_mgr *mgr, u64 cb_handle);
  int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma);
+ int hl_hw_block_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma);
  struct hl_cb *hl_cb_get(struct hl_device *hdev,       struct hl_cb_mgr *mgr,
                        u32 handle);
  void hl_cb_put(struct hl_cb *cb);
@@@ -2136,6 -2213,7 +2215,7 @@@ int hl_cb_va_pool_init(struct hl_ctx *c
  void hl_cb_va_pool_fini(struct hl_ctx *ctx);
  
  void hl_cs_rollback_all(struct hl_device *hdev);
+ void hl_pending_cb_list_flush(struct hl_ctx *ctx);
  struct hl_cs_job *hl_cs_allocate_job(struct hl_device *hdev,
                enum hl_queue_type queue_type, bool is_kernel_allocated_cb);
  void hl_sob_reset_error(struct kref *ref);
@@@ -2143,6 -2221,10 +2223,10 @@@ int hl_gen_sob_mask(u16 sob_base, u8 so
  void hl_fence_put(struct hl_fence *fence);
  void hl_fence_get(struct hl_fence *fence);
  void cs_get(struct hl_cs *cs);
+ bool cs_needs_completion(struct hl_cs *cs);
+ bool cs_needs_timeout(struct hl_cs *cs);
+ bool is_staged_cs_last_exists(struct hl_device *hdev, struct hl_cs *cs);
+ struct hl_cs *hl_staged_cs_find_first(struct hl_device *hdev, u64 cs_seq);
  
  void goya_set_asic_funcs(struct hl_device *hdev);
  void gaudi_set_asic_funcs(struct hl_device *hdev);
@@@ -2184,6 -2266,8 +2268,8 @@@ void hl_mmu_v1_set_funcs(struct hl_devi
  int hl_mmu_va_to_pa(struct hl_ctx *ctx, u64 virt_addr, u64 *phys_addr);
  int hl_mmu_get_tlb_info(struct hl_ctx *ctx, u64 virt_addr,
                        struct hl_mmu_hop_info *hops);
+ u64 hl_mmu_scramble_addr(struct hl_device *hdev, u64 addr);
+ u64 hl_mmu_descramble_addr(struct hl_device *hdev, u64 addr);
  bool hl_is_dram_va(struct hl_device *hdev, u64 virt_addr);
  
  int hl_fw_load_fw_to_device(struct hl_device *hdev, const char *fw_name,
@@@ -2201,7 -2285,8 +2287,8 @@@ void hl_fw_cpu_accessible_dma_pool_free
                                        void *vaddr);
  int hl_fw_send_heartbeat(struct hl_device *hdev);
  int hl_fw_cpucp_info_get(struct hl_device *hdev,
-                       u32 cpu_security_boot_status_reg);
+                       u32 cpu_security_boot_status_reg,
+                       u32 boot_err0_reg);
  int hl_fw_get_eeprom_data(struct hl_device *hdev, void *data, size_t max_size);
  int hl_fw_cpucp_pci_counters_get(struct hl_device *hdev,
                struct hl_info_pci_counters *counters);
index 245c0159159fb89449f30b8ac5403fd1e5db96b1,7cadf75ebb814cca37f6e9923fbacb34e6a9fa45..1f5910517b0e3ad565d6179fc8d481598fca57ba
@@@ -14,6 -14,9 +14,9 @@@
  
  #define HL_MMU_DEBUG  0
  
+ /* use small pages for supporting non-pow2 (32M/40M/48M) DRAM phys page sizes */
+ #define DRAM_POOL_PAGE_SIZE SZ_8M
  /*
   * The va ranges in context object contain a list with the available chunks of
   * device virtual memory.
   */
  
  /*
-  * alloc_device_memory - allocate device memory
-  *
-  * @ctx                 : current context
-  * @args                : host parameters containing the requested size
-  * @ret_handle          : result handle
+  * alloc_device_memory() - allocate device memory.
+  * @ctx: pointer to the context structure.
+  * @args: host parameters containing the requested size.
+  * @ret_handle: result handle.
   *
   * This function does the following:
-  * - Allocate the requested size rounded up to 'dram_page_size' pages
-  * - Return unique handle
+  * - Allocate the requested size rounded up to 'dram_page_size' pages.
+  * - Return unique handle for later map/unmap/free.
   */
  static int alloc_device_memory(struct hl_ctx *ctx, struct hl_mem_in *args,
                                u32 *ret_handle)
        struct hl_vm *vm = &hdev->vm;
        struct hl_vm_phys_pg_pack *phys_pg_pack;
        u64 paddr = 0, total_size, num_pgs, i;
-       u32 num_curr_pgs, page_size, page_shift;
+       u32 num_curr_pgs, page_size;
        int handle, rc;
        bool contiguous;
  
        num_curr_pgs = 0;
        page_size = hdev->asic_prop.dram_page_size;
-       page_shift = __ffs(page_size);
-       num_pgs = (args->alloc.mem_size + (page_size - 1)) >> page_shift;
-       total_size = num_pgs << page_shift;
+       num_pgs = DIV_ROUND_UP_ULL(args->alloc.mem_size, page_size);
+       total_size = num_pgs * page_size;
  
        if (!total_size) {
                dev_err(hdev->dev, "Cannot allocate 0 bytes\n");
@@@ -182,17 -183,17 +183,17 @@@ pages_pack_err
        return rc;
  }
  
- /*
-  * dma_map_host_va - DMA mapping of the given host virtual address.
-  * @hdev: habanalabs device structure
-  * @addr: the host virtual address of the memory area
-  * @size: the size of the memory area
-  * @p_userptr: pointer to result userptr structure
+ /**
+  * dma_map_host_va() - DMA mapping of the given host virtual address.
+  * @hdev: habanalabs device structure.
+  * @addr: the host virtual address of the memory area.
+  * @size: the size of the memory area.
+  * @p_userptr: pointer to result userptr structure.
   *
   * This function does the following:
-  * - Allocate userptr structure
-  * - Pin the given host memory using the userptr structure
-  * - Perform DMA mapping to have the DMA addresses of the pages
+  * - Allocate userptr structure.
+  * - Pin the given host memory using the userptr structure.
+  * - Perform DMA mapping to have the DMA addresses of the pages.
   */
  static int dma_map_host_va(struct hl_device *hdev, u64 addr, u64 size,
                                struct hl_userptr **p_userptr)
@@@ -236,14 -237,14 +237,14 @@@ userptr_err
        return rc;
  }
  
- /*
-  * dma_unmap_host_va - DMA unmapping of the given host virtual address.
-  * @hdev: habanalabs device structure
-  * @userptr: userptr to free
+ /**
+  * dma_unmap_host_va() - DMA unmapping of the given host virtual address.
+  * @hdev: habanalabs device structure.
+  * @userptr: userptr to free.
   *
   * This function does the following:
-  * - Unpins the physical pages
-  * - Frees the userptr structure
+  * - Unpins the physical pages.
+  * - Frees the userptr structure.
   */
  static void dma_unmap_host_va(struct hl_device *hdev,
                                struct hl_userptr *userptr)
        kfree(userptr);
  }
  
- /*
-  * dram_pg_pool_do_release - free DRAM pages pool
-  *
-  * @ref                 : pointer to reference object
+ /**
+  * dram_pg_pool_do_release() - free DRAM pages pool
+  * @ref: pointer to reference object.
   *
   * This function does the following:
-  * - Frees the idr structure of physical pages handles
-  * - Frees the generic pool of DRAM physical pages
+  * - Frees the idr structure of physical pages handles.
+  * - Frees the generic pool of DRAM physical pages.
   */
  static void dram_pg_pool_do_release(struct kref *ref)
  {
        gen_pool_destroy(vm->dram_pg_pool);
  }
  
- /*
-  * free_phys_pg_pack - free physical page pack
-  * @hdev: habanalabs device structure
-  * @phys_pg_pack: physical page pack to free
+ /**
+  * free_phys_pg_pack() - free physical page pack.
+  * @hdev: habanalabs device structure.
+  * @phys_pg_pack: physical page pack to free.
   *
   * This function does the following:
   * - For DRAM memory only, iterate over the pack and free each physical block
-  *   structure by returning it to the general pool
-  * - Free the hl_vm_phys_pg_pack structure
+  *   structure by returning it to the general pool.
+  * - Free the hl_vm_phys_pg_pack structure.
   */
  static void free_phys_pg_pack(struct hl_device *hdev,
                                struct hl_vm_phys_pg_pack *phys_pg_pack)
        kfree(phys_pg_pack);
  }
  
- /*
-  * free_device_memory - free device memory
-  *
-  * @ctx                  : current context
-  * @handle              : handle of the memory chunk to free
+ /**
+  * free_device_memory() - free device memory.
+  * @ctx: pointer to the context structure.
+  * @args: host parameters containing the requested size.
   *
   * This function does the following:
-  * - Free the device memory related to the given handle
+  * - Free the device memory related to the given handle.
   */
- static int free_device_memory(struct hl_ctx *ctx, u32 handle)
+ static int free_device_memory(struct hl_ctx *ctx, struct hl_mem_in *args)
  {
        struct hl_device *hdev = ctx->hdev;
        struct hl_vm *vm = &hdev->vm;
        struct hl_vm_phys_pg_pack *phys_pg_pack;
+       u32 handle = args->free.handle;
  
        spin_lock(&vm->idr_lock);
        phys_pg_pack = idr_find(&vm->phys_pg_pack_handles, handle);
        return 0;
  }
  
- /*
-  * clear_va_list_locked - free virtual addresses list
-  *
-  * @hdev                : habanalabs device structure
-  * @va_list             : list of virtual addresses to free
+ /**
+  * clear_va_list_locked() - free virtual addresses list.
+  * @hdev: habanalabs device structure.
+  * @va_list: list of virtual addresses to free.
   *
   * This function does the following:
-  * - Iterate over the list and free each virtual addresses block
+  * - Iterate over the list and free each virtual addresses block.
   *
-  * This function should be called only when va_list lock is taken
+  * This function should be called only when va_list lock is taken.
   */
  static void clear_va_list_locked(struct hl_device *hdev,
                struct list_head *va_list)
        }
  }
  
- /*
-  * print_va_list_locked    - print virtual addresses list
-  *
-  * @hdev                : habanalabs device structure
-  * @va_list             : list of virtual addresses to print
+ /**
+  * print_va_list_locked() - print virtual addresses list.
+  * @hdev: habanalabs device structure.
+  * @va_list: list of virtual addresses to print.
   *
   * This function does the following:
-  * - Iterate over the list and print each virtual addresses block
+  * - Iterate over the list and print each virtual addresses block.
   *
-  * This function should be called only when va_list lock is taken
+  * This function should be called only when va_list lock is taken.
   */
  static void print_va_list_locked(struct hl_device *hdev,
                struct list_head *va_list)
  #endif
  }
  
- /*
-  * merge_va_blocks_locked - merge a virtual block if possible
-  *
-  * @hdev                : pointer to the habanalabs device structure
-  * @va_list             : pointer to the virtual addresses block list
-  * @va_block            : virtual block to merge with adjacent blocks
+ /**
+  * merge_va_blocks_locked() - merge a virtual block if possible.
+  * @hdev: pointer to the habanalabs device structure.
+  * @va_list: pointer to the virtual addresses block list.
+  * @va_block: virtual block to merge with adjacent blocks.
   *
   * This function does the following:
   * - Merge the given blocks with the adjacent blocks if their virtual ranges
-  *   create a contiguous virtual range
+  *   create a contiguous virtual range.
   *
-  * This Function should be called only when va_list lock is taken
+  * This Function should be called only when va_list lock is taken.
   */
  static void merge_va_blocks_locked(struct hl_device *hdev,
                struct list_head *va_list, struct hl_vm_va_block *va_block)
        }
  }
  
- /*
-  * add_va_block_locked - add a virtual block to the virtual addresses list
-  *
-  * @hdev                : pointer to the habanalabs device structure
-  * @va_list             : pointer to the virtual addresses block list
-  * @start               : start virtual address
-  * @end                 : end virtual address
+ /**
+  * add_va_block_locked() - add a virtual block to the virtual addresses list.
+  * @hdev: pointer to the habanalabs device structure.
+  * @va_list: pointer to the virtual addresses block list.
+  * @start: start virtual address.
+  * @end: end virtual address.
   *
   * This function does the following:
-  * - Add the given block to the virtual blocks list and merge with other
-  * blocks if a contiguous virtual block can be created
+  * - Add the given block to the virtual blocks list and merge with other blocks
+  *   if a contiguous virtual block can be created.
   *
-  * This Function should be called only when va_list lock is taken
+  * This Function should be called only when va_list lock is taken.
   */
  static int add_va_block_locked(struct hl_device *hdev,
                struct list_head *va_list, u64 start, u64 end)
        return 0;
  }
  
- /*
-  * add_va_block - wrapper for add_va_block_locked
-  *
-  * @hdev                : pointer to the habanalabs device structure
-  * @va_list             : pointer to the virtual addresses block list
-  * @start               : start virtual address
-  * @end                 : end virtual address
+ /**
+  * add_va_block() - wrapper for add_va_block_locked.
+  * @hdev: pointer to the habanalabs device structure.
+  * @va_list: pointer to the virtual addresses block list.
+  * @start: start virtual address.
+  * @end: end virtual address.
   *
   * This function does the following:
-  * - Takes the list lock and calls add_va_block_locked
+  * - Takes the list lock and calls add_va_block_locked.
   */
  static inline int add_va_block(struct hl_device *hdev,
                struct hl_va_range *va_range, u64 start, u64 end)
        return rc;
  }
  
- /*
+ /**
   * get_va_block() - get a virtual block for the given size and alignment.
+  *
   * @hdev: pointer to the habanalabs device structure.
   * @va_range: pointer to the virtual addresses range.
   * @size: requested block size.
   *
   * This function does the following:
   * - Iterate on the virtual block list to find a suitable virtual block for the
-  *   given size and alignment.
+  *   given size, hint address and alignment.
   * - Reserve the requested block and update the list.
   * - Return the start address of the virtual block.
   */
- static u64 get_va_block(struct hl_device *hdev, struct hl_va_range *va_range,
-                       u64 size, u64 hint_addr, u32 va_block_align)
+ static u64 get_va_block(struct hl_device *hdev,
+                               struct hl_va_range *va_range,
+                               u64 size, u64 hint_addr, u32 va_block_align)
  {
        struct hl_vm_va_block *va_block, *new_va_block = NULL;
-       u64 valid_start, valid_size, prev_start, prev_end, align_mask,
-               res_valid_start = 0, res_valid_size = 0;
+       u64 tmp_hint_addr, valid_start, valid_size, prev_start, prev_end,
+               align_mask, reserved_valid_start = 0, reserved_valid_size = 0;
        bool add_prev = false;
+       bool is_align_pow_2  = is_power_of_2(va_range->page_size);
+       if (is_align_pow_2)
+               align_mask = ~((u64)va_block_align - 1);
+       else
+               /*
+                * with non-power-of-2 range we work only with page granularity
+                * and the start address is page aligned,
+                * so no need for alignment checking.
+                */
+               size = DIV_ROUND_UP_ULL(size, va_range->page_size) *
+                                                       va_range->page_size;
  
-       align_mask = ~((u64)va_block_align - 1);
+       tmp_hint_addr = hint_addr;
  
-       /* check if hint_addr is aligned */
-       if (hint_addr & (va_block_align - 1))
+       /* Check if we need to ignore hint address */
+       if ((is_align_pow_2 && (hint_addr & (va_block_align - 1))) ||
+                       (!is_align_pow_2 &&
+                               do_div(tmp_hint_addr, va_range->page_size))) {
+               dev_info(hdev->dev, "Hint address 0x%llx will be ignored\n",
+                                       hint_addr);
                hint_addr = 0;
+       }
  
        mutex_lock(&va_range->lock);
  
        print_va_list_locked(hdev, &va_range->list);
  
        list_for_each_entry(va_block, &va_range->list, node) {
-               /* calc the first possible aligned addr */
+               /* Calc the first possible aligned addr */
                valid_start = va_block->start;
  
-               if (valid_start & (va_block_align - 1)) {
+               if (is_align_pow_2 && (valid_start & (va_block_align - 1))) {
                        valid_start &= align_mask;
                        valid_start += va_block_align;
                        if (valid_start > va_block->end)
                }
  
                valid_size = va_block->end - valid_start;
+               if (valid_size < size)
+                       continue;
  
-               if (valid_size >= size &&
-                       (!new_va_block || valid_size < res_valid_size)) {
+               /* Pick the minimal length block which has the required size */
+               if (!new_va_block || (valid_size < reserved_valid_size)) {
                        new_va_block = va_block;
-                       res_valid_start = valid_start;
-                       res_valid_size = valid_size;
+                       reserved_valid_start = valid_start;
+                       reserved_valid_size = valid_size;
                }
  
                if (hint_addr && hint_addr >= valid_start &&
-                               ((hint_addr + size) <= va_block->end)) {
+                                       (hint_addr + size) <= va_block->end) {
                        new_va_block = va_block;
-                       res_valid_start = hint_addr;
-                       res_valid_size = valid_size;
+                       reserved_valid_start = hint_addr;
+                       reserved_valid_size = valid_size;
                        break;
                }
        }
  
        if (!new_va_block) {
                dev_err(hdev->dev, "no available va block for size %llu\n",
-                               size);
+                                                               size);
                goto out;
        }
  
-       if (res_valid_start > new_va_block->start) {
+       /*
+        * Check if there is some leftover range due to reserving the new
+        * va block, then return it to the main virtual addresses list.
+        */
+       if (reserved_valid_start > new_va_block->start) {
                prev_start = new_va_block->start;
-               prev_end = res_valid_start - 1;
+               prev_end = reserved_valid_start - 1;
  
-               new_va_block->start = res_valid_start;
-               new_va_block->size = res_valid_size;
+               new_va_block->start = reserved_valid_start;
+               new_va_block->size = reserved_valid_size;
  
                add_prev = true;
        }
  out:
        mutex_unlock(&va_range->lock);
  
-       return res_valid_start;
+       return reserved_valid_start;
  }
  
  /*
@@@ -644,9 -664,9 +664,9 @@@ u64 hl_reserve_va_block(struct hl_devic
  
  /**
   * hl_get_va_range_type() - get va_range type for the given address and size.
-  * @address: The start address of the area we want to validate.
-  * @size: The size in bytes of the area we want to validate.
-  * @type: returned va_range type
+  * @address: the start address of the area we want to validate.
+  * @size: the size in bytes of the area we want to validate.
+  * @type: returned va_range type.
   *
   * Return: true if the area is inside a valid range, false otherwise.
   */
@@@ -667,16 -687,15 +687,15 @@@ static int hl_get_va_range_type(struct 
        return -EINVAL;
  }
  
- /*
-  * hl_unreserve_va_block - wrapper for add_va_block for unreserving a va block
-  *
+ /**
+  * hl_unreserve_va_block() - wrapper for add_va_block to unreserve a va block.
   * @hdev: pointer to the habanalabs device structure
-  * @ctx: current context
-  * @start: start virtual address
-  * @end: end virtual address
+  * @ctx: pointer to the context structure.
+  * @start: start virtual address.
+  * @end: end virtual address.
   *
   * This function does the following:
-  * - Takes the list lock and calls add_va_block_locked
+  * - Takes the list lock and calls add_va_block_locked.
   */
  int hl_unreserve_va_block(struct hl_device *hdev, struct hl_ctx *ctx,
                u64 start_addr, u64 size)
        return rc;
  }
  
- /*
-  * get_sg_info - get number of pages and the DMA address from SG list
-  *
-  * @sg                 : the SG list
-  * @dma_addr           : pointer to DMA address to return
+ /**
+  * get_sg_info() - get number of pages and the DMA address from SG list.
+  * @sg: the SG list.
+  * @dma_addr: pointer to DMA address to return.
   *
   * Calculate the number of consecutive pages described by the SG list. Take the
   * offset of the address in the first page, add to it the length and round it up
@@@ -719,17 -737,17 +737,17 @@@ static u32 get_sg_info(struct scatterli
                        (PAGE_SIZE - 1)) >> PAGE_SHIFT;
  }
  
- /*
-  * init_phys_pg_pack_from_userptr - initialize physical page pack from host
-  *                                  memory
-  * @ctx: current context
-  * @userptr: userptr to initialize from
-  * @pphys_pg_pack: result pointer
+ /**
+  * init_phys_pg_pack_from_userptr() - initialize physical page pack from host
+  *                                    memory
+  * @ctx: pointer to the context structure.
+  * @userptr: userptr to initialize from.
+  * @pphys_pg_pack: result pointer.
   *
   * This function does the following:
-  * - Pin the physical pages related to the given virtual block
+  * - Pin the physical pages related to the given virtual block.
   * - Create a physical page pack from the physical pages related to the given
-  *   virtual block
+  *   virtual block.
   */
  static int init_phys_pg_pack_from_userptr(struct hl_ctx *ctx,
                                struct hl_userptr *userptr,
@@@ -821,16 -839,16 +839,16 @@@ page_pack_arr_mem_err
        return rc;
  }
  
- /*
-  * map_phys_pg_pack - maps the physical page pack.
-  * @ctx: current context
-  * @vaddr: start address of the virtual area to map from
-  * @phys_pg_pack: the pack of physical pages to map to
+ /**
+  * map_phys_pg_pack() - maps the physical page pack..
+  * @ctx: pointer to the context structure.
+  * @vaddr: start address of the virtual area to map from.
+  * @phys_pg_pack: the pack of physical pages to map to.
   *
   * This function does the following:
-  * - Maps each chunk of virtual memory to matching physical chunk
-  * - Stores number of successful mappings in the given argument
-  * - Returns 0 on success, error code otherwise
+  * - Maps each chunk of virtual memory to matching physical chunk.
+  * - Stores number of successful mappings in the given argument.
+  * - Returns 0 on success, error code otherwise.
   */
  static int map_phys_pg_pack(struct hl_ctx *ctx, u64 vaddr,
                                struct hl_vm_phys_pg_pack *phys_pg_pack)
@@@ -875,11 -893,11 +893,11 @@@ err
        return rc;
  }
  
- /*
-  * unmap_phys_pg_pack - unmaps the physical page pack
-  * @ctx: current context
-  * @vaddr: start address of the virtual area to unmap
-  * @phys_pg_pack: the pack of physical pages to unmap
+ /**
+  * unmap_phys_pg_pack() - unmaps the physical page pack.
+  * @ctx: pointer to the context structure.
+  * @vaddr: start address of the virtual area to unmap.
+  * @phys_pg_pack: the pack of physical pages to unmap.
   */
  static void unmap_phys_pg_pack(struct hl_ctx *ctx, u64 vaddr,
                                struct hl_vm_phys_pg_pack *phys_pg_pack)
  }
  
  static int get_paddr_from_handle(struct hl_ctx *ctx, struct hl_mem_in *args,
-                               u64 *paddr)
+                                       u64 *paddr)
  {
        struct hl_device *hdev = ctx->hdev;
        struct hl_vm *vm = &hdev->vm;
        return 0;
  }
  
- /*
-  * map_device_va - map the given memory
-  *
-  * @ctx                : current context
-  * @args         : host parameters with handle/host virtual address
-  * @device_addr        : pointer to result device virtual address
+ /**
+  * map_device_va() - map the given memory.
+  * @ctx: pointer to the context structure.
+  * @args: host parameters with handle/host virtual address.
+  * @device_addr: pointer to result device virtual address.
   *
   * This function does the following:
   * - If given a physical device memory handle, map to a device virtual block
-  *   and return the start address of this block
+  *   and return the start address of this block.
   * - If given a host virtual address and size, find the related physical pages,
   *   map a device virtual block to this pages and return the start address of
-  *   this block
+  *   this block.
   */
  static int map_device_va(struct hl_ctx *ctx, struct hl_mem_in *args,
                u64 *device_addr)
  
                hint_addr = args->map_device.hint_addr;
  
-               /* DRAM VA alignment is the same as the DRAM page size */
+               /* DRAM VA alignment is the same as the MMU page size */
                va_range = ctx->va_range[HL_VA_RANGE_TYPE_DRAM];
                va_block_align = hdev->asic_prop.dmmu.page_size;
        }
@@@ -1125,24 -1142,26 +1142,26 @@@ init_page_pack_err
        return rc;
  }
  
- /*
-  * unmap_device_va      - unmap the given device virtual address
-  *
-  * @ctx                 : current context
-  * @vaddr               : device virtual address to unmap
-  * @ctx_free            : true if in context free flow, false otherwise.
+ /**
+  * unmap_device_va() - unmap the given device virtual address.
+  * @ctx: pointer to the context structure.
+  * @args: host parameters with device virtual address to unmap.
+  * @ctx_free: true if in context free flow, false otherwise.
   *
   * This function does the following:
-  * - Unmap the physical pages related to the given virtual address
-  * - return the device virtual block to the virtual block list
+  * - unmap the physical pages related to the given virtual address.
+  * - return the device virtual block to the virtual block list.
   */
- static int unmap_device_va(struct hl_ctx *ctx, u64 vaddr, bool ctx_free)
+ static int unmap_device_va(struct hl_ctx *ctx, struct hl_mem_in *args,
+                               bool ctx_free)
  {
        struct hl_device *hdev = ctx->hdev;
+       struct asic_fixed_properties *prop = &hdev->asic_prop;
        struct hl_vm_phys_pg_pack *phys_pg_pack = NULL;
        struct hl_vm_hash_node *hnode = NULL;
        struct hl_userptr *userptr = NULL;
        struct hl_va_range *va_range;
+       u64 vaddr = args->unmap.device_virt_addr;
        enum vm_type_t *vm_type;
        bool is_userptr;
        int rc = 0;
                goto mapping_cnt_err;
        }
  
-       vaddr &= ~(((u64) phys_pg_pack->page_size) - 1);
+       if (!is_userptr && !is_power_of_2(phys_pg_pack->page_size))
+               vaddr = prop->dram_base_address +
+                       DIV_ROUND_DOWN_ULL(vaddr - prop->dram_base_address,
+                                               phys_pg_pack->page_size) *
+                                                       phys_pg_pack->page_size;
+       else
+               vaddr &= ~(((u64) phys_pg_pack->page_size) - 1);
  
        mutex_lock(&ctx->mmu_lock);
  
@@@ -1264,12 -1289,90 +1289,90 @@@ vm_type_err
        return rc;
  }
  
+ static int map_block(struct hl_device *hdev, u64 address, u64 *handle,
+                       u32 *size)
+ {
+       u32 block_id = 0;
+       int rc;
+       rc = hdev->asic_funcs->get_hw_block_id(hdev, address, size, &block_id);
+       *handle = block_id | HL_MMAP_TYPE_BLOCK;
+       *handle <<= PAGE_SHIFT;
+       return rc;
+ }
+ static void hw_block_vm_close(struct vm_area_struct *vma)
+ {
+       struct hl_ctx *ctx = (struct hl_ctx *) vma->vm_private_data;
+       hl_ctx_put(ctx);
+       vma->vm_private_data = NULL;
+ }
+ static const struct vm_operations_struct hw_block_vm_ops = {
+       .close = hw_block_vm_close
+ };
+ /**
+  * hl_hw_block_mmap() - mmap a hw block to user.
+  * @hpriv: pointer to the private data of the fd
+  * @vma: pointer to vm_area_struct of the process
+  *
+  * Driver increments context reference for every HW block mapped in order
+  * to prevent user from closing FD without unmapping first
+  */
+ int hl_hw_block_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma)
+ {
+       struct hl_device *hdev = hpriv->hdev;
+       u32 block_id, block_size;
+       int rc;
+       /* We use the page offset to hold the block id and thus we need to clear
+        * it before doing the mmap itself
+        */
+       block_id = vma->vm_pgoff;
+       vma->vm_pgoff = 0;
+       /* Driver only allows mapping of a complete HW block */
+       block_size = vma->vm_end - vma->vm_start;
+ #ifdef _HAS_TYPE_ARG_IN_ACCESS_OK
+       if (!access_ok(VERIFY_WRITE,
+               (void __user *) (uintptr_t) vma->vm_start, block_size)) {
+ #else
+       if (!access_ok((void __user *) (uintptr_t) vma->vm_start, block_size)) {
+ #endif
+               dev_err(hdev->dev,
+                       "user pointer is invalid - 0x%lx\n",
+                       vma->vm_start);
+               return -EINVAL;
+       }
+       vma->vm_ops = &hw_block_vm_ops;
+       vma->vm_private_data = hpriv->ctx;
+       hl_ctx_get(hdev, hpriv->ctx);
+       rc = hdev->asic_funcs->hw_block_mmap(hdev, vma, block_id, block_size);
+       if (rc) {
+               hl_ctx_put(hpriv->ctx);
+               return rc;
+       }
+       vma->vm_pgoff = block_id;
+       return 0;
+ }
  static int mem_ioctl_no_mmu(struct hl_fpriv *hpriv, union hl_mem_args *args)
  {
        struct hl_device *hdev = hpriv->hdev;
        struct hl_ctx *ctx = hpriv->ctx;
-       u64 device_addr = 0;
-       u32 handle = 0;
+       u64 block_handle, device_addr = 0;
+       u32 handle = 0, block_size;
        int rc;
  
        switch (args->in.op) {
                break;
  
        case HL_MEM_OP_FREE:
-               rc = free_device_memory(ctx, args->in.free.handle);
+               rc = free_device_memory(ctx, &args->in);
                break;
  
        case HL_MEM_OP_MAP:
                        rc = 0;
                } else {
                        rc = get_paddr_from_handle(ctx, &args->in,
-                                       &device_addr);
+                                                       &device_addr);
                }
  
                memset(args, 0, sizeof(*args));
                rc = 0;
                break;
  
+       case HL_MEM_OP_MAP_BLOCK:
+               rc = map_block(hdev, args->in.map_block.block_addr,
+                               &block_handle, &block_size);
+               args->out.block_handle = block_handle;
+               args->out.block_size = block_size;
+               break;
        default:
                dev_err(hdev->dev, "Unknown opcode for memory IOCTL\n");
                rc = -ENOTTY;
@@@ -1328,8 -1438,8 +1438,8 @@@ int hl_mem_ioctl(struct hl_fpriv *hpriv
        union hl_mem_args *args = data;
        struct hl_device *hdev = hpriv->hdev;
        struct hl_ctx *ctx = hpriv->ctx;
-       u64 device_addr = 0;
-       u32 handle = 0;
+       u64 block_handle, device_addr = 0;
+       u32 handle = 0, block_size;
        int rc;
  
        if (!hl_device_operational(hdev, &status)) {
                        goto out;
                }
  
-               rc = free_device_memory(ctx, args->in.free.handle);
+               rc = free_device_memory(ctx, &args->in);
                break;
  
        case HL_MEM_OP_MAP:
                break;
  
        case HL_MEM_OP_UNMAP:
-               rc = unmap_device_va(ctx, args->in.unmap.device_virt_addr,
-                                       false);
+               rc = unmap_device_va(ctx, &args->in, false);
+               break;
+       case HL_MEM_OP_MAP_BLOCK:
+               rc = map_block(hdev, args->in.map_block.block_addr,
+                               &block_handle, &block_size);
+               args->out.block_handle = block_handle;
+               args->out.block_size = block_size;
                break;
  
        default:
@@@ -1436,53 -1552,58 +1552,53 @@@ static int get_user_memory(struct hl_de
                return -EFAULT;
        }
  
 -      userptr->vec = frame_vector_create(npages);
 -      if (!userptr->vec) {
 -              dev_err(hdev->dev, "Failed to create frame vector\n");
 +      userptr->pages = kvmalloc_array(npages, sizeof(*userptr->pages),
 +                                      GFP_KERNEL);
 +      if (!userptr->pages)
                return -ENOMEM;
 -      }
  
 -      rc = get_vaddr_frames(start, npages, FOLL_FORCE | FOLL_WRITE,
 -                              userptr->vec);
 +      rc = pin_user_pages_fast(start, npages,
 +                               FOLL_FORCE | FOLL_WRITE | FOLL_LONGTERM,
 +                               userptr->pages);
  
        if (rc != npages) {
                dev_err(hdev->dev,
                        "Failed to map host memory, user ptr probably wrong\n");
                if (rc < 0)
 -                      goto destroy_framevec;
 -              rc = -EFAULT;
 -              goto put_framevec;
 -      }
 -
 -      if (frame_vector_to_pages(userptr->vec) < 0) {
 -              dev_err(hdev->dev,
 -                      "Failed to translate frame vector to pages\n");
 +                      goto destroy_pages;
 +              npages = rc;
                rc = -EFAULT;
 -              goto put_framevec;
 +              goto put_pages;
        }
 +      userptr->npages = npages;
  
        rc = sg_alloc_table_from_pages(userptr->sgt,
 -                                      frame_vector_pages(userptr->vec),
 -                                      npages, offset, size, GFP_ATOMIC);
 +                                     userptr->pages,
 +                                     npages, offset, size, GFP_ATOMIC);
        if (rc < 0) {
                dev_err(hdev->dev, "failed to create SG table from pages\n");
 -              goto put_framevec;
 +              goto put_pages;
        }
  
        return 0;
  
 -put_framevec:
 -      put_vaddr_frames(userptr->vec);
 -destroy_framevec:
 -      frame_vector_destroy(userptr->vec);
 +put_pages:
 +      unpin_user_pages(userptr->pages, npages);
 +destroy_pages:
 +      kvfree(userptr->pages);
        return rc;
  }
  
- /*
-  * hl_pin_host_memory - pins a chunk of host memory.
-  * @hdev: pointer to the habanalabs device structure
-  * @addr: the host virtual address of the memory area
-  * @size: the size of the memory area
-  * @userptr: pointer to hl_userptr structure
+ /**
+  * hl_pin_host_memory() - pins a chunk of host memory.
+  * @hdev: pointer to the habanalabs device structure.
+  * @addr: the host virtual address of the memory area.
+  * @size: the size of the memory area.
+  * @userptr: pointer to hl_userptr structure.
   *
   * This function does the following:
-  * - Pins the physical pages
-  * - Create an SG list from those pages
+  * - Pins the physical pages.
+  * - Create an SG list from those pages.
   */
  int hl_pin_host_memory(struct hl_device *hdev, u64 addr, u64 size,
                                        struct hl_userptr *userptr)
@@@ -1555,6 -1676,8 +1671,6 @@@ free_sgt
   */
  void hl_unpin_host_memory(struct hl_device *hdev, struct hl_userptr *userptr)
  {
 -      struct page **pages;
 -
        hl_debugfs_remove_userptr(hdev, userptr);
  
        if (userptr->dma_mapped)
                                                        userptr->sgt->nents,
                                                        userptr->dir);
  
 -      pages = frame_vector_pages(userptr->vec);
 -      if (!IS_ERR(pages)) {
 -              int i;
 -
 -              for (i = 0; i < frame_vector_count(userptr->vec); i++)
 -                      set_page_dirty_lock(pages[i]);
 -      }
 -      put_vaddr_frames(userptr->vec);
 -      frame_vector_destroy(userptr->vec);
 +      unpin_user_pages_dirty_lock(userptr->pages, userptr->npages, true);
 +      kvfree(userptr->pages);
  
        list_del(&userptr->job_node);
  
        kfree(userptr->sgt);
  }
  
- /*
-  * hl_userptr_delete_list - clear userptr list
-  *
-  * @hdev                : pointer to the habanalabs device structure
-  * @userptr_list        : pointer to the list to clear
+ /**
+  * hl_userptr_delete_list() - clear userptr list.
+  * @hdev: pointer to the habanalabs device structure.
+  * @userptr_list: pointer to the list to clear.
   *
   * This function does the following:
   * - Iterates over the list and unpins the host memory and frees the userptr
@@@ -1594,12 -1723,11 +1709,11 @@@ void hl_userptr_delete_list(struct hl_d
        INIT_LIST_HEAD(userptr_list);
  }
  
- /*
-  * hl_userptr_is_pinned - returns whether the given userptr is pinned
-  *
-  * @hdev                : pointer to the habanalabs device structure
-  * @userptr_list        : pointer to the list to clear
-  * @userptr             : pointer to userptr to check
+ /**
+  * hl_userptr_is_pinned() - returns whether the given userptr is pinned.
+  * @hdev: pointer to the habanalabs device structure.
+  * @userptr_list: pointer to the list to clear.
+  * @userptr: pointer to userptr to check.
   *
   * This function does the following:
   * - Iterates over the list and checks if the given userptr is in it, means is
@@@ -1617,12 -1745,12 +1731,12 @@@ bool hl_userptr_is_pinned(struct hl_dev
        return false;
  }
  
- /*
-  * va_range_init - initialize virtual addresses range
-  * @hdev: pointer to the habanalabs device structure
-  * @va_range: pointer to the range to initialize
-  * @start: range start address
-  * @end: range end address
+ /**
+  * va_range_init() - initialize virtual addresses range.
+  * @hdev: pointer to the habanalabs device structure.
+  * @va_range: pointer to the range to initialize.
+  * @start: range start address.
+  * @end: range end address.
   *
   * This function does the following:
   * - Initializes the virtual addresses list of the given range with the given
@@@ -1635,15 -1763,21 +1749,21 @@@ static int va_range_init(struct hl_devi
  
        INIT_LIST_HEAD(&va_range->list);
  
-       /* PAGE_SIZE alignment */
+       /*
+        * PAGE_SIZE alignment
+        * it is the callers responsibility to align the addresses if the
+        * page size is not a power of 2
+        */
  
-       if (start & (PAGE_SIZE - 1)) {
-               start &= PAGE_MASK;
-               start += PAGE_SIZE;
-       }
+       if (is_power_of_2(page_size)) {
+               if (start & (PAGE_SIZE - 1)) {
+                       start &= PAGE_MASK;
+                       start += PAGE_SIZE;
+               }
  
-       if (end & (PAGE_SIZE - 1))
-               end &= PAGE_MASK;
+               if (end & (PAGE_SIZE - 1))
+                       end &= PAGE_MASK;
+       }
  
        if (start >= end) {
                dev_err(hdev->dev, "too small vm range for va list\n");
        return 0;
  }
  
- /*
-  * va_range_fini() - clear a virtual addresses range
-  * @hdev: pointer to the habanalabs structure
-  * va_range: pointer to virtual addresses range
+ /**
+  * va_range_fini() - clear a virtual addresses range.
+  * @hdev: pointer to the habanalabs structure.
+  * va_range: pointer to virtual addresses rang.e
   *
   * This function does the following:
-  * - Frees the virtual addresses block list and its lock
+  * - Frees the virtual addresses block list and its lock.
   */
  static void va_range_fini(struct hl_device *hdev, struct hl_va_range *va_range)
  {
        kfree(va_range);
  }
  
- /*
-  * vm_ctx_init_with_ranges() - initialize virtual memory for context
-  * @ctx: pointer to the habanalabs context structure
+ /**
+  * vm_ctx_init_with_ranges() - initialize virtual memory for context.
+  * @ctx: pointer to the habanalabs context structure.
   * @host_range_start: host virtual addresses range start.
   * @host_range_end: host virtual addresses range end.
   * @host_huge_range_start: host virtual addresses range start for memory
-  *                          allocated with huge pages.
+  *                         allocated with huge pages.
   * @host_huge_range_end: host virtual addresses range end for memory allocated
   *                        with huge pages.
   * @dram_range_start: dram virtual addresses range start.
   * @dram_range_end: dram virtual addresses range end.
   *
   * This function initializes the following:
-  * - MMU for context
-  * - Virtual address to area descriptor hashtable
-  * - Virtual block list of available virtual memory
+  * - MMU for context.
+  * - Virtual address to area descriptor hashtable.
+  * - Virtual block list of available virtual memory.
   */
  static int vm_ctx_init_with_ranges(struct hl_ctx *ctx,
                                        u64 host_range_start,
@@@ -1818,7 -1952,8 +1938,8 @@@ int hl_vm_ctx_init(struct hl_ctx *ctx
  
        dram_range_start = prop->dmmu.start_addr;
        dram_range_end = prop->dmmu.end_addr;
-       dram_page_size = prop->dmmu.page_size;
+       dram_page_size = prop->dram_page_size ?
+                               prop->dram_page_size : prop->dmmu.page_size;
        host_range_start = prop->pmmu.start_addr;
        host_range_end = prop->pmmu.end_addr;
        host_page_size = prop->pmmu.page_size;
                        dram_range_start, dram_range_end, dram_page_size);
  }
  
- /*
-  * hl_vm_ctx_fini       - virtual memory teardown of context
-  *
-  * @ctx                 : pointer to the habanalabs context structure
+ /**
+  * hl_vm_ctx_fini() - virtual memory teardown of context.
+  * @ctx: pointer to the habanalabs context structure.
   *
   * This function perform teardown the following:
-  * - Virtual block list of available virtual memory
-  * - Virtual address to area descriptor hashtable
-  * - MMU for context
+  * - Virtual block list of available virtual memory.
+  * - Virtual address to area descriptor hashtable.
+  * - MMU for context.
   *
   * In addition this function does the following:
   * - Unmaps the existing hashtable nodes if the hashtable is not empty. The
@@@ -1859,9 -1993,10 +1979,10 @@@ void hl_vm_ctx_fini(struct hl_ctx *ctx
        struct hl_vm_phys_pg_pack *phys_pg_list;
        struct hl_vm_hash_node *hnode;
        struct hlist_node *tmp_node;
+       struct hl_mem_in args;
        int i;
  
-       if (!ctx->hdev->mmu_enable)
+       if (!hdev->mmu_enable)
                return;
  
        hl_debugfs_remove_ctx_mem_hash(hdev, ctx);
                dev_dbg(hdev->dev,
                        "hl_mem_hash_node of vaddr 0x%llx of asid %d is still alive\n",
                        hnode->vaddr, ctx->asid);
-               unmap_device_va(ctx, hnode->vaddr, true);
+               args.unmap.device_virt_addr = hnode->vaddr;
+               unmap_device_va(ctx, &args, true);
        }
  
+       mutex_lock(&ctx->mmu_lock);
        /* invalidate the cache once after the unmapping loop */
        hdev->asic_funcs->mmu_invalidate_cache(hdev, true, VM_TYPE_USERPTR);
        hdev->asic_funcs->mmu_invalidate_cache(hdev, true, VM_TYPE_PHYS_PACK);
  
+       mutex_unlock(&ctx->mmu_lock);
        spin_lock(&vm->idr_lock);
        idr_for_each_entry(&vm->phys_pg_pack_handles, phys_pg_list, i)
                if (phys_pg_list->asid == ctx->asid) {
         * because the user notifies us on allocations. If the user is no more,
         * all DRAM is available
         */
-       if (!ctx->hdev->asic_prop.dram_supports_virtual_memory)
-               atomic64_set(&ctx->hdev->dram_used_mem, 0);
+       if (ctx->asid != HL_KERNEL_ASID_ID &&
+                       !hdev->asic_prop.dram_supports_virtual_memory)
+               atomic64_set(&hdev->dram_used_mem, 0);
  }
  
- /*
-  * hl_vm_init           - initialize virtual memory module
-  *
-  * @hdev                : pointer to the habanalabs device structure
+ /**
+  * hl_vm_init() - initialize virtual memory module.
+  * @hdev: pointer to the habanalabs device structure.
   *
   * This function initializes the following:
-  * - MMU module
-  * - DRAM physical pages pool of 2MB
-  * - Idr for device memory allocation handles
+  * - MMU module.
+  * - DRAM physical pages pool of 2MB.
+  * - Idr for device memory allocation handles.
   */
  int hl_vm_init(struct hl_device *hdev)
  {
        struct hl_vm *vm = &hdev->vm;
        int rc;
  
-       vm->dram_pg_pool = gen_pool_create(__ffs(prop->dram_page_size), -1);
+       if (is_power_of_2(prop->dram_page_size))
+               vm->dram_pg_pool =
+                       gen_pool_create(__ffs(prop->dram_page_size), -1);
+       else
+               vm->dram_pg_pool =
+                       gen_pool_create(__ffs(DRAM_POOL_PAGE_SIZE), -1);
        if (!vm->dram_pg_pool) {
                dev_err(hdev->dev, "Failed to create dram page pool\n");
                return -ENOMEM;
@@@ -1964,15 -2110,14 +2096,14 @@@ pool_add_err
        return rc;
  }
  
- /*
-  * hl_vm_fini           - virtual memory module teardown
-  *
-  * @hdev                : pointer to the habanalabs device structure
+ /**
+  * hl_vm_fini() - virtual memory module teardown.
+  * @hdev: pointer to the habanalabs device structure.
   *
   * This function perform teardown to the following:
-  * - Idr for device memory allocation handles
-  * - DRAM physical pages pool of 2MB
-  * - MMU module
+  * - Idr for device memory allocation handles.
+  * - DRAM physical pages pool of 2MB.
+  * - MMU module.
   */
  void hl_vm_fini(struct hl_device *hdev)
  {
index 3506a3534294aff11e3ae719176cf55e4207e377,8447ad4b7d478dc15c9b37521dda499438a4a764..ec2a4fce8581835832824c8fe7367533439700d1
@@@ -569,7 -569,8 +569,7 @@@ static int mei_hdcp_verify_mprime(struc
        verify_mprime_in->header.api_version = HDCP_API_VERSION;
        verify_mprime_in->header.command_id = WIRED_REPEATER_AUTH_STREAM_REQ;
        verify_mprime_in->header.status = ME_HDCP_STATUS_SUCCESS;
 -      verify_mprime_in->header.buffer_len =
 -                      WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_MIN_IN;
 +      verify_mprime_in->header.buffer_len = cmd_size  - sizeof(verify_mprime_in->header);
  
        verify_mprime_in->port.integrated_port_type = data->port_type;
        verify_mprime_in->port.physical_port = (u8)data->fw_ddi;
@@@ -844,16 -845,19 +844,19 @@@ enable_err_exit
        return ret;
  }
  
- static int mei_hdcp_remove(struct mei_cl_device *cldev)
+ static void mei_hdcp_remove(struct mei_cl_device *cldev)
  {
        struct i915_hdcp_comp_master *comp_master =
                                                mei_cldev_get_drvdata(cldev);
+       int ret;
  
        component_master_del(&cldev->dev, &mei_component_master_ops);
        kfree(comp_master);
        mei_cldev_set_drvdata(cldev, NULL);
  
-       return mei_cldev_disable(cldev);
+       ret = mei_cldev_disable(cldev);
+       if (ret)
+               dev_warn(&cldev->dev, "mei_cldev_disable() failed\n");
  }
  
  #define MEI_UUID_HDCP GUID_INIT(0xB638AB7E, 0x94E2, 0x4EA2, 0xA5, \
diff --combined drivers/of/platform.c
index 020bf860c72c875ae967cdebbbe49d09360dd168,6699cdbe58b698543d60c04d3df33ecf2ee1f678..0da86209ddaab5b5429181797a30e5285382c907
@@@ -511,6 -511,7 +511,7 @@@ static const struct of_device_id reserv
        { .compatible = "qcom,rmtfs-mem" },
        { .compatible = "qcom,cmd-db" },
        { .compatible = "ramoops" },
+       { .compatible = "nvmem-rmem" },
        {}
  };
  
@@@ -687,7 -688,7 +688,7 @@@ static int of_platform_notify(struct no
                pdev_parent = of_find_device_by_node(rd->dn->parent);
                pdev = of_platform_device_create(rd->dn, NULL,
                                pdev_parent ? &pdev_parent->dev : NULL);
 -              of_dev_put(pdev_parent);
 +              platform_device_put(pdev_parent);
  
                if (pdev == NULL) {
                        pr_err("%s: failed to create for '%pOF'\n",
                of_platform_device_destroy(&pdev->dev, &children_left);
  
                /* and put the reference of the find */
 -              of_dev_put(pdev);
 +              platform_device_put(pdev);
                break;
        }
  
index c5967d8b4256a31f048fdb751e45115319c3af13,53165e49c2980596eaf65a1f89c036ff224f13b0..e023d7d90d66f4fa4ec9dae3cfca2695ce25f353
@@@ -382,7 -382,6 +382,7 @@@ static int mei_wdt_register(struct mei_
  
        watchdog_set_drvdata(&wdt->wdd, wdt);
        watchdog_stop_on_reboot(&wdt->wdd);
 +      watchdog_stop_on_unregister(&wdt->wdd);
  
        ret = watchdog_register_device(&wdt->wdd);
        if (ret)
@@@ -620,7 -619,7 +620,7 @@@ err_out
        return ret;
  }
  
- static int mei_wdt_remove(struct mei_cl_device *cldev)
+ static void mei_wdt_remove(struct mei_cl_device *cldev)
  {
        struct mei_wdt *wdt = mei_cldev_get_drvdata(cldev);
  
        dbgfs_unregister(wdt);
  
        kfree(wdt);
-       return 0;
  }
  
  #define MEI_UUID_WD UUID_LE(0x05B79A6F, 0x4628, 0x4D7F, \
index 935060955152ba729a4788f8ae95f67b5f07b991,b8dae34eca101ebdd6fdd61587595afdbe166e91..7d45b5f989b076a653f010497780c97869e285bc
@@@ -846,22 -846,28 +846,46 @@@ struct auxiliary_device_id 
        kernel_ulong_t driver_data;
  };
  
 +/* Surface System Aggregator Module */
 +
 +#define SSAM_MATCH_TARGET     0x1
 +#define SSAM_MATCH_INSTANCE   0x2
 +#define SSAM_MATCH_FUNCTION   0x4
 +
 +struct ssam_device_id {
 +      __u8 match_flags;
 +
 +      __u8 domain;
 +      __u8 category;
 +      __u8 target;
 +      __u8 instance;
 +      __u8 function;
 +
 +      kernel_ulong_t driver_data;
 +};
 +
+ /*
+  * DFL (Device Feature List)
+  *
+  * DFL defines a linked list of feature headers within the device MMIO space to
+  * provide an extensible way of adding features. Software can walk through these
+  * predefined data structures to enumerate features. It is now used in the FPGA.
+  * See Documentation/fpga/dfl.rst for more information.
+  *
+  * The dfl bus type is introduced to match the individual feature devices (dfl
+  * devices) for specific dfl drivers.
+  */
+ /**
+  * struct dfl_device_id -  dfl device identifier
+  * @type: DFL FIU type of the device. See enum dfl_id_type.
+  * @feature_id: feature identifier local to its DFL FIU type.
+  * @driver_data: driver specific data.
+  */
+ struct dfl_device_id {
+       __u16 type;
+       __u16 feature_id;
+       kernel_ulong_t driver_data;
+ };
  #endif /* LINUX_MOD_DEVICETABLE_H */
index f078eeb0a9616d1e9e3d7213a84a600f1d59a022,1b14f3cde4e5934ca7b598aaa410783264945040..9bb6c7edccc4494e689b6f0dfc46f49662e7379e
@@@ -246,13 -246,9 +246,17 @@@ int main(void
        DEVID(auxiliary_device_id);
        DEVID_FIELD(auxiliary_device_id, name);
  
 +      DEVID(ssam_device_id);
 +      DEVID_FIELD(ssam_device_id, match_flags);
 +      DEVID_FIELD(ssam_device_id, domain);
 +      DEVID_FIELD(ssam_device_id, category);
 +      DEVID_FIELD(ssam_device_id, target);
 +      DEVID_FIELD(ssam_device_id, instance);
 +      DEVID_FIELD(ssam_device_id, function);
 +
+       DEVID(dfl_device_id);
+       DEVID_FIELD(dfl_device_id, type);
+       DEVID_FIELD(dfl_device_id, feature_id);
        return 0;
  }
diff --combined scripts/mod/file2alias.c
index d21d2871387bd1c272a0a50e241f8b975811fde6,7ebabeb1e9c905e3d7410e1361b6f98c557cac26..7c97fa8e36bcd3b95ed942ee443c55db1b3d2085
@@@ -1375,28 -1375,18 +1375,40 @@@ static int do_auxiliary_entry(const cha
        return 1;
  }
  
 +/*
 + * Looks like: ssam:dNcNtNiNfN
 + *
 + * N is exactly 2 digits, where each is an upper-case hex digit.
 + */
 +static int do_ssam_entry(const char *filename, void *symval, char *alias)
 +{
 +      DEF_FIELD(symval, ssam_device_id, match_flags);
 +      DEF_FIELD(symval, ssam_device_id, domain);
 +      DEF_FIELD(symval, ssam_device_id, category);
 +      DEF_FIELD(symval, ssam_device_id, target);
 +      DEF_FIELD(symval, ssam_device_id, instance);
 +      DEF_FIELD(symval, ssam_device_id, function);
 +
 +      sprintf(alias, "ssam:d%02Xc%02X", domain, category);
 +      ADD(alias, "t", match_flags & SSAM_MATCH_TARGET, target);
 +      ADD(alias, "i", match_flags & SSAM_MATCH_INSTANCE, instance);
 +      ADD(alias, "f", match_flags & SSAM_MATCH_FUNCTION, function);
 +
 +      return 1;
 +}
 +
+ /* Looks like: dfl:tNfN */
+ static int do_dfl_entry(const char *filename, void *symval, char *alias)
+ {
+       DEF_FIELD(symval, dfl_device_id, type);
+       DEF_FIELD(symval, dfl_device_id, feature_id);
+       sprintf(alias, "dfl:t%04Xf%04X", type, feature_id);
+       add_wildcard(alias);
+       return 1;
+ }
  /* Does namelen bytes of name exactly match the symbol? */
  static bool sym_is(const char *name, unsigned namelen, const char *symbol)
  {
@@@ -1472,7 -1462,7 +1484,8 @@@ static const struct devtable devtable[
        {"wmi", SIZE_wmi_device_id, do_wmi_entry},
        {"mhi", SIZE_mhi_device_id, do_mhi_entry},
        {"auxiliary", SIZE_auxiliary_device_id, do_auxiliary_entry},
 +      {"ssam", SIZE_ssam_device_id, do_ssam_entry},
+       {"dfl", SIZE_dfl_device_id, do_dfl_entry},
  };
  
  /* Create MODULE_ALIAS() statements.