Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 28 Nov 2019 19:16:43 +0000 (11:16 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 28 Nov 2019 19:16:43 +0000 (11:16 -0800)
Pull dma-mapping updates from Christoph Hellwig:

 - improve dma-debug scalability (Eric Dumazet)

 - tiny dma-debug cleanup (Dan Carpenter)

 - check for vmap memory in dma_map_single (Kees Cook)

 - check for dma_addr_t overflows in dma-direct when using DMA offsets
   (Nicolas Saenz Julienne)

 - switch the x86 sta2x11 SOC to use more generic DMA code (Nicolas
   Saenz Julienne)

 - fix arm-nommu dma-ranges handling (Vladimir Murzin)

 - use __initdata in CMA (Shyam Saini)

 - replace the bus dma mask with a limit (Nicolas Saenz Julienne)

 - merge the remapping helpers into the main dma-direct flow (me)

 - switch xtensa to the generic dma remap handling (me)

 - various cleanups around dma_capable (me)

 - remove unused dev arguments to various dma-noncoherent helpers (me)

* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux:

* tag 'dma-mapping-5.5' of git://git.infradead.org/users/hch/dma-mapping: (22 commits)
  dma-mapping: treat dev->bus_dma_mask as a DMA limit
  dma-direct: exclude dma_direct_map_resource from the min_low_pfn check
  dma-direct: don't check swiotlb=force in dma_direct_map_resource
  dma-debug: clean up put_hash_bucket()
  powerpc: remove support for NULL dev in __phys_to_dma / __dma_to_phys
  dma-direct: avoid a forward declaration for phys_to_dma
  dma-direct: unify the dma_capable definitions
  dma-mapping: drop the dev argument to arch_sync_dma_for_*
  x86/PCI: sta2x11: use default DMA address translation
  dma-direct: check for overflows on 32 bit DMA addresses
  dma-debug: increase HASH_SIZE
  dma-debug: reorder struct dma_debug_entry fields
  xtensa: use the generic uncached segment support
  dma-mapping: merge the generic remapping helpers into dma-direct
  dma-direct: provide mmap and get_sgtable method overrides
  dma-direct: remove the dma_handle argument to __dma_direct_alloc_pages
  dma-direct: remove __dma_direct_free_pages
  usb: core: Remove redundant vmap checks
  kernel: dma-contiguous: mark CMA parameters __initdata/__initconst
  dma-debug: add a schedule point in debug_dma_dump_mappings()
  ...

12 files changed:
1  2 
arch/arm/Kconfig
arch/arm/xen/mm.c
arch/arm64/Kconfig
arch/microblaze/Kconfig
arch/mips/Kconfig
arch/x86/Kconfig
arch/x86/kernel/amd_gart_64.c
arch/x86/kernel/pci-dma.c
drivers/ata/ahci.c
include/linux/device.h
include/linux/dma-mapping.h
kernel/dma/debug.c

diff --combined arch/arm/Kconfig
index 0d3c5d7cceb700f2328588abacc6a3ea9aee35fb,80e795aacd3a734367bf84f417f3f206680cc5da..6d532e7296d306294b681e19a426f659cdd301f3
@@@ -7,7 -7,6 +7,6 @@@ config AR
        select ARCH_HAS_BINFMT_FLAT
        select ARCH_HAS_DEBUG_VIRTUAL if MMU
        select ARCH_HAS_DEVMEM_IS_ALLOWED
-       select ARCH_HAS_DMA_COHERENT_TO_PFN if SWIOTLB
        select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
        select ARCH_HAS_ELF_RANDOMIZE
        select ARCH_HAS_FORTIFY_SOURCE
        select OLD_SIGSUSPEND3
        select PCI_SYSCALL if PCI
        select PERF_USE_VMALLOC
 -      select REFCOUNT_FULL
        select RTC_LIB
        select SYS_SUPPORTS_APM_EMULATION
        # Above selects are sorted alphabetically; please add new ones
diff --combined arch/arm/xen/mm.c
index 3c7645d7b9b4badd2900862951b814048dcfabb5,a6a2514e5fe8fb0370b164128c5d6570ccd73109..d40e9e5fc52b7aac89848939e88b671f9dd8d2c3
@@@ -15,7 -15,6 +15,7 @@@
  #include <xen/interface/grant_table.h>
  #include <xen/interface/memory.h>
  #include <xen/page.h>
 +#include <xen/xen-ops.h>
  #include <xen/swiotlb-xen.h>
  
  #include <asm/cacheflush.h>
@@@ -71,20 -70,20 +71,20 @@@ static void dma_cache_maint(dma_addr_t 
   * pfn_valid returns true the pages is local and we can use the native
   * dma-direct functions, otherwise we call the Xen specific version.
   */
- void xen_dma_sync_for_cpu(struct device *dev, dma_addr_t handle,
-               phys_addr_t paddr, size_t size, enum dma_data_direction dir)
+ void xen_dma_sync_for_cpu(dma_addr_t handle, phys_addr_t paddr, size_t size,
+               enum dma_data_direction dir)
  {
        if (pfn_valid(PFN_DOWN(handle)))
-               arch_sync_dma_for_cpu(dev, paddr, size, dir);
+               arch_sync_dma_for_cpu(paddr, size, dir);
        else if (dir != DMA_TO_DEVICE)
                dma_cache_maint(handle, size, GNTTAB_CACHE_INVAL);
  }
  
- void xen_dma_sync_for_device(struct device *dev, dma_addr_t handle,
-               phys_addr_t paddr, size_t size, enum dma_data_direction dir)
+ void xen_dma_sync_for_device(dma_addr_t handle, phys_addr_t paddr, size_t size,
+               enum dma_data_direction dir)
  {
        if (pfn_valid(PFN_DOWN(handle)))
-               arch_sync_dma_for_device(dev, paddr, size, dir);
+               arch_sync_dma_for_device(paddr, size, dir);
        else if (dir == DMA_FROM_DEVICE)
                dma_cache_maint(handle, size, GNTTAB_CACHE_INVAL);
        else
@@@ -134,7 -133,7 +134,7 @@@ void xen_destroy_contiguous_region(phys
        return;
  }
  
 -int __init xen_mm_init(void)
 +static int __init xen_mm_init(void)
  {
        struct gnttab_cache_flush cflush;
        if (!xen_initial_domain())
diff --combined arch/arm64/Kconfig
index afe6412fe769aa15d8de3d24d001f9142bf4d463,ed5706ebf551e3b3bf7ebf608ef39cc6a61c5c84..b1b4476ddb834ba64a8ba93e55e88d3a7282fed1
@@@ -12,7 -12,6 +12,6 @@@ config ARM6
        select ARCH_CLOCKSOURCE_DATA
        select ARCH_HAS_DEBUG_VIRTUAL
        select ARCH_HAS_DEVMEM_IS_ALLOWED
-       select ARCH_HAS_DMA_COHERENT_TO_PFN
        select ARCH_HAS_DMA_PREP_COHERENT
        select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
        select ARCH_HAS_FAST_MULTIPLIER
@@@ -67,7 -66,7 +66,7 @@@
        select ARCH_USE_QUEUED_SPINLOCKS
        select ARCH_SUPPORTS_MEMORY_FAILURE
        select ARCH_SUPPORTS_ATOMIC_RMW
 -      select ARCH_SUPPORTS_INT128 if GCC_VERSION >= 50000 || CC_IS_CLANG
 +      select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 && (GCC_VERSION >= 50000 || CC_IS_CLANG)
        select ARCH_SUPPORTS_NUMA_BALANCING
        select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT
        select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DMA_CONTIGUOUS
        select HAVE_DYNAMIC_FTRACE
 +      select HAVE_DYNAMIC_FTRACE_WITH_REGS \
 +              if $(cc-option,-fpatchable-function-entry=2)
        select HAVE_EFFICIENT_UNALIGNED_ACCESS
        select HAVE_FAST_GUP
        select HAVE_FTRACE_MCOUNT_RECORD
        select PCI_SYSCALL if PCI
        select POWER_RESET
        select POWER_SUPPLY
 -      select REFCOUNT_FULL
        select SPARSE_IRQ
        select SWIOTLB
        select SYSCTL_EXCEPTION_TRACE
@@@ -543,16 -541,6 +542,16 @@@ config ARM64_ERRATUM_128680
          invalidated has been observed by other observers. The
          workaround repeats the TLBI+DSB operation.
  
 +config ARM64_ERRATUM_1319367
 +      bool "Cortex-A57/A72: Speculative AT instruction using out-of-context translation regime could cause subsequent request to generate an incorrect translation"
 +      default y
 +      help
 +        This option adds work arounds for ARM Cortex-A57 erratum 1319537
 +        and A72 erratum 1319367
 +
 +        Cortex-A57 and A72 cores could end-up with corrupted TLBs by
 +        speculating an AT instruction during a guest context switch.
 +
          If unsure, say Y.
  
  config ARM64_ERRATUM_1463225
  
          If unsure, say Y.
  
 +config ARM64_ERRATUM_1542419
 +      bool "Neoverse-N1: workaround mis-ordering of instruction fetches"
 +      default y
 +      help
 +        This option adds a workaround for ARM Neoverse-N1 erratum
 +        1542419.
 +
 +        Affected Neoverse-N1 cores could execute a stale instruction when
 +        modified by another CPU. The workaround depends on a firmware
 +        counterpart.
 +
 +        Workaround the issue by hiding the DIC feature from EL0. This
 +        forces user-space to perform cache maintenance.
 +
 +        If unsure, say Y.
 +
  config CAVIUM_ERRATUM_22375
        bool "Cavium erratum 22375, 24313"
        default y
@@@ -876,26 -848,10 +875,26 @@@ config ARM64_PA_BIT
        default 48 if ARM64_PA_BITS_48
        default 52 if ARM64_PA_BITS_52
  
 +choice
 +      prompt "Endianness"
 +      default CPU_LITTLE_ENDIAN
 +      help
 +        Select the endianness of data accesses performed by the CPU. Userspace
 +        applications will need to be compiled and linked for the endianness
 +        that is selected here.
 +
  config CPU_BIG_ENDIAN
         bool "Build big-endian kernel"
         help
 -         Say Y if you plan on running a kernel in big-endian mode.
 +        Say Y if you plan on running a kernel with a big-endian userspace.
 +
 +config CPU_LITTLE_ENDIAN
 +      bool "Build little-endian kernel"
 +      help
 +        Say Y if you plan on running a kernel with a little-endian userspace.
 +        This is usually the case for distributions targeting arm64.
 +
 +endchoice
  
  config SCHED_MC
        bool "Multi-core scheduler support"
@@@ -1644,7 -1600,6 +1643,7 @@@ config CMDLIN
  
  config CMDLINE_FORCE
        bool "Always use the default kernel command string"
 +      depends on CMDLINE != ""
        help
          Always use the default kernel command string, even if the boot
          loader passes other arguments to the kernel.
diff --combined arch/microblaze/Kconfig
index a75896f18e58f246212d38866acde330b45c3999,261c26df1c9ff19df521ea23ec3fed93048a4ffa..5f46ebe7bfe3c641512e560c18f1cf240799c894
@@@ -4,7 -4,6 +4,6 @@@ config MICROBLAZ
        select ARCH_32BIT_OFF_T
        select ARCH_NO_SWAP
        select ARCH_HAS_BINFMT_FLAT if !MMU
-       select ARCH_HAS_DMA_COHERENT_TO_PFN if MMU
        select ARCH_HAS_DMA_PREP_COHERENT
        select ARCH_HAS_GCOV_PROFILE_ALL
        select ARCH_HAS_SYNC_DMA_FOR_CPU
@@@ -46,7 -45,6 +45,7 @@@
        select VIRT_TO_BUS
        select CPU_NO_EFFICIENT_FFS
        select MMU_GATHER_NO_RANGE if MMU
 +      select SPARSE_IRQ
  
  # Endianness selection
  choice
diff --combined arch/mips/Kconfig
index 61b9269cdd3eb3d9022c1ad35eff5acf2453e8c4,248d39b8a1608c9cf5dd137a524b064026defd1d..add388236f4ef2cdf2558b0d282605fadce6912a
@@@ -7,7 -7,6 +7,7 @@@ config MIP
        select ARCH_CLOCKSOURCE_DATA
        select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
        select ARCH_HAS_UBSAN_SANITIZE_ALL
 +      select ARCH_HAS_FORTIFY_SOURCE
        select ARCH_SUPPORTS_UPROBES
        select ARCH_USE_BUILTIN_BSWAP
        select ARCH_USE_CMPXCHG_LOCKREF if 64BIT
@@@ -74,7 -73,6 +74,7 @@@
        select HAVE_PERF_EVENTS
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_RSEQ
 +      select HAVE_SPARSE_SYSCALL_NR
        select HAVE_STACKPROTECTOR
        select HAVE_SYSCALL_TRACEPOINTS
        select HAVE_VIRT_CPU_ACCOUNTING_GEN if 64BIT || !SMP
@@@ -88,8 -86,6 +88,8 @@@
        select SYSCTL_EXCEPTION_TRACE
        select VIRT_TO_BUS
        select ARCH_HAS_PTE_SPECIAL if !(32BIT && CPU_HAS_RIXI)
 +      select ARCH_HAS_KCOV
 +      select HAVE_GCC_PLUGINS
  
  menu "Machine selection"
  
@@@ -363,8 -359,6 +363,8 @@@ config MACH_DECSTATIO
  
  config MACH_JAZZ
        bool "Jazz family of machines"
 +      select ARC_MEMORY
 +      select ARC_PROMLIB
        select ARCH_MIGHT_HAVE_PC_PARPORT
        select ARCH_MIGHT_HAVE_PC_SERIO
        select FW_ARC
@@@ -447,7 -441,7 +447,7 @@@ config LASA
        select SYS_SUPPORTS_LITTLE_ENDIAN
  
  config MACH_LOONGSON32
 -      bool "Loongson-1 family of machines"
 +      bool "Loongson 32-bit family of machines"
        select SYS_SUPPORTS_ZBOOT
        help
          This enables support for the Loongson-1 family of machines.
          the Institute of Computing Technology (ICT), Chinese Academy of
          Sciences (CAS).
  
 +config MACH_LOONGSON2EF
 +      bool "Loongson-2E/F family of machines"
 +      select SYS_SUPPORTS_ZBOOT
 +      help
 +        This enables the support of early Loongson-2E/F family of machines.
 +
  config MACH_LOONGSON64
 -      bool "Loongson-2/3 family of machines"
 +      bool "Loongson 64-bit family of machines"
 +      select ARCH_SPARSEMEM_ENABLE
 +      select ARCH_MIGHT_HAVE_PC_PARPORT
 +      select ARCH_MIGHT_HAVE_PC_SERIO
 +      select GENERIC_ISA_DMA_SUPPORT_BROKEN
 +      select BOOT_ELF32
 +      select BOARD_SCACHE
 +      select CSRC_R4K
 +      select CEVT_R4K
 +      select CPU_HAS_WB
 +      select FORCE_PCI
 +      select ISA
 +      select I8259
 +      select IRQ_MIPS_CPU
 +      select NR_CPUS_DEFAULT_4
 +      select USE_GENERIC_EARLY_PRINTK_8250
 +      select SYS_HAS_CPU_LOONGSON64
 +      select SYS_HAS_EARLY_PRINTK
 +      select SYS_SUPPORTS_SMP
 +      select SYS_SUPPORTS_HOTPLUG_CPU
 +      select SYS_SUPPORTS_NUMA
 +      select SYS_SUPPORTS_64BIT_KERNEL
 +      select SYS_SUPPORTS_HIGHMEM
 +      select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_SUPPORTS_ZBOOT
 +      select LOONGSON_MC146818
 +      select ZONE_DMA32
 +      select NUMA
        help
          This enables the support of Loongson-2/3 family of machines.
  
 -        Loongson-2 is a family of single-core CPUs and Loongson-3 is a
 -        family of multi-core CPUs. They are both 64-bit general-purpose
 -        MIPS-compatible CPUs. Loongson-2/3 are developed by the Institute
 -        of Computing Technology (ICT), Chinese Academy of Sciences (CAS)
 -        in the People's Republic of China. The chief architect is Professor
 -        Weiwu Hu.
 +        Loongson-2 and Loongson-3 are 64-bit general-purpose processors with
 +        GS264/GS464/GS464E/GS464V microarchitecture (except old Loongson-2E
 +        and Loongson-2F which will be removed), developed by the Institute
 +        of Computing Technology (ICT), Chinese Academy of Sciences (CAS).
  
  config MACH_PISTACHIO
        bool "IMG Pistachio SoC based boards"
@@@ -667,8 -631,6 +667,8 @@@ config RALIN
  
  config SGI_IP22
        bool "SGI IP22 (Indy/Indigo2)"
 +      select ARC_MEMORY
 +      select ARC_PROMLIB
        select FW_ARC
        select FW_ARC32
        select ARCH_MIGHT_HAVE_PC_SERIO
        select SWAP_IO_SPACE
        select SYS_HAS_CPU_R4X00
        select SYS_HAS_CPU_R5000
 -      #
 -      # Disable EARLY_PRINTK for now since it leads to overwritten prom
 -      # memory during early boot on some machines.
 -      #
 -      # See http://www.linux-mips.org/cgi-bin/mesg.cgi?a=linux-mips&i=20091119164009.GA15038%40deprecation.cyrius.com
 -      # for a more details discussion
 -      #
 -      # select SYS_HAS_EARLY_PRINTK
 +      select SYS_HAS_EARLY_PRINTK
        select SYS_SUPPORTS_32BIT_KERNEL
        select SYS_SUPPORTS_64BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
  config SGI_IP27
        bool "SGI IP27 (Origin200/2000)"
        select ARCH_HAS_PHYS_TO_DMA
 +      select ARCH_SPARSEMEM_ENABLE
        select FW_ARC
        select FW_ARC64
 +      select ARC_CMDLINE_ONLY
        select BOOT_ELF64
        select DEFAULT_SGI_PARTITION
        select SYS_HAS_EARLY_PRINTK
  
  config SGI_IP28
        bool "SGI IP28 (Indigo2 R10k)"
 +      select ARC_MEMORY
 +      select ARC_PROMLIB
        select FW_ARC
        select FW_ARC64
        select ARCH_MIGHT_HAVE_PC_SERIO
        select SGI_HAS_ZILOG
        select SWAP_IO_SPACE
        select SYS_HAS_CPU_R10000
 -      #
 -      # Disable EARLY_PRINTK for now since it leads to overwritten prom
 -      # memory during early boot on some machines.
 -      #
 -      # See http://www.linux-mips.org/cgi-bin/mesg.cgi?a=linux-mips&i=20091119164009.GA15038%40deprecation.cyrius.com
 -      # for a more details discussion
 -      #
 -      # select SYS_HAS_EARLY_PRINTK
 +      select SYS_HAS_EARLY_PRINTK
        select SYS_SUPPORTS_64BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
        select MIPS_L1_CACHE_SHIFT_7
          This is the SGI Indigo2 with R10000 processor.  To compile a Linux
          kernel that runs on these, say Y here.
  
 +config SGI_IP30
 +      bool "SGI IP30 (Octane/Octane2)"
 +      select ARCH_HAS_PHYS_TO_DMA
 +      select FW_ARC
 +      select FW_ARC64
 +      select BOOT_ELF64
 +      select CEVT_R4K
 +      select CSRC_R4K
 +      select SYNC_R4K if SMP
 +      select ZONE_DMA32
 +      select HAVE_PCI
 +      select IRQ_MIPS_CPU
 +      select IRQ_DOMAIN_HIERARCHY
 +      select NR_CPUS_DEFAULT_2
 +      select PCI_DRIVERS_GENERIC
 +      select PCI_XTALK_BRIDGE
 +      select SYS_HAS_EARLY_PRINTK
 +      select SYS_HAS_CPU_R10000
 +      select SYS_SUPPORTS_64BIT_KERNEL
 +      select SYS_SUPPORTS_BIG_ENDIAN
 +      select SYS_SUPPORTS_SMP
 +      select MIPS_L1_CACHE_SHIFT_7
 +      select ARC_MEMORY
 +      help
 +        These are the SGI Octane and Octane2 graphics workstations.  To
 +        compile a Linux kernel that runs on these, say Y here.
 +
  config SGI_IP32
        bool "SGI IP32 (O2)"
 +      select ARC_MEMORY
 +      select ARC_PROMLIB
        select ARCH_HAS_PHYS_TO_DMA
        select FW_ARC
        select FW_ARC32
@@@ -900,8 -843,6 +900,8 @@@ config SIBYTE_BIGSU
  
  config SNI_RM
        bool "SNI RM200/300/400"
 +      select ARC_MEMORY
 +      select ARC_PROMLIB
        select FW_ARC if CPU_LITTLE_ENDIAN
        select FW_ARC32 if CPU_LITTLE_ENDIAN
        select FW_SNIPROM if CPU_BIG_ENDIAN
@@@ -1097,7 -1038,6 +1097,7 @@@ source "arch/mips/sibyte/Kconfig
  source "arch/mips/txx9/Kconfig"
  source "arch/mips/vr41xx/Kconfig"
  source "arch/mips/cavium-octeon/Kconfig"
 +source "arch/mips/loongson2ef/Kconfig"
  source "arch/mips/loongson32/Kconfig"
  source "arch/mips/loongson64/Kconfig"
  source "arch/mips/netlogic/Kconfig"
@@@ -1194,9 -1134,9 +1194,9 @@@ config DMA_NONCOHEREN
        select ARCH_HAS_DMA_WRITE_COMBINE
        select ARCH_HAS_SYNC_DMA_FOR_DEVICE
        select ARCH_HAS_UNCACHED_SEGMENT
-       select NEED_DMA_MAP_STATE
-       select ARCH_HAS_DMA_COHERENT_TO_PFN
+       select DMA_NONCOHERENT_MMAP
        select DMA_NONCOHERENT_CACHE_SYNC
+       select NEED_DMA_MAP_STATE
  
  config SYS_HAS_EARLY_PRINTK
        bool
@@@ -1413,18 -1353,19 +1413,18 @@@ config MIPS_L1_CACHE_SHIF
  config HAVE_STD_PC_SERIAL_PORT
        bool
  
 +config ARC_CMDLINE_ONLY
 +      bool
 +
  config ARC_CONSOLE
        bool "ARC console support"
        depends on SGI_IP22 || SGI_IP28 || (SNI_RM && CPU_LITTLE_ENDIAN)
  
  config ARC_MEMORY
        bool
 -      depends on MACH_JAZZ || SNI_RM || SGI_IP32
 -      default y
  
  config ARC_PROMLIB
        bool
 -      depends on MACH_JAZZ || SNI_RM || SGI_IP22 || SGI_IP28 || SGI_IP32
 -      default y
  
  config FW_ARC64
        bool
@@@ -1438,56 -1379,51 +1438,56 @@@ choic
        prompt "CPU type"
        default CPU_R4X00
  
 -config CPU_LOONGSON3
 -      bool "Loongson 3 CPU"
 -      depends on SYS_HAS_CPU_LOONGSON3
 +config CPU_LOONGSON64
 +      bool "Loongson 64-bit CPU"
 +      depends on SYS_HAS_CPU_LOONGSON64
        select ARCH_HAS_PHYS_TO_DMA
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_HUGEPAGES
 +      select CPU_SUPPORTS_MSA
        select CPU_HAS_LOAD_STORE_LR
        select WEAK_ORDERING
        select WEAK_REORDERING_BEYOND_LLSC
 +      select MIPS_ASID_BITS_VARIABLE
        select MIPS_PGD_C0_CONTEXT
        select MIPS_L1_CACHE_SHIFT_6
        select GPIOLIB
        select SWIOTLB
        help
 -              The Loongson 3 processor implements the MIPS64R2 instruction
 -              set with many extensions.
 +              The Loongson GSx64(GS264/GS464/GS464E/GS464V) series of processor
 +              cores implements the MIPS64R2 instruction set with many extensions,
 +              including most 64-bit Loongson-2 (2H, 2K) and Loongson-3 (3A1000,
 +              3B1000, 3B1500, 3A2000, 3A3000 and 3A4000) processors. However, old
 +              Loongson-2E/2F is not covered here and will be removed in future.
  
  config LOONGSON3_ENHANCEMENT
 -      bool "New Loongson 3 CPU Enhancements"
 +      bool "New Loongson-3 CPU Enhancements"
        default n
        select CPU_MIPSR2
        select CPU_HAS_PREFETCH
 -      depends on CPU_LOONGSON3
 +      depends on CPU_LOONGSON64
        help
 -        New Loongson 3 CPU (since Loongson-3A R2, as opposed to Loongson-3A
 +        New Loongson-3 cores (since Loongson-3A R2, as opposed to Loongson-3A
          R1, Loongson-3B R1 and Loongson-3B R2) has many enhancements, such as
 -        FTLB, L1-VCache, EI/DI/Wait/Prefetch instruction, DSP/DSPv2 ASE, User
 +        FTLB, L1-VCache, EI/DI/Wait/Prefetch instruction, DSP/DSPr2 ASE, User
          Local register, Read-Inhibit/Execute-Inhibit, SFB (Store Fill Buffer),
          Fast TLB refill support, etc.
  
          This option enable those enhancements which are not probed at run
          time. If you want a generic kernel to run on all Loongson 3 machines,
          please say 'N' here. If you want a high-performance kernel to run on
 -        new Loongson 3 machines only, please say 'Y' here.
 +        new Loongson-3 machines only, please say 'Y' here.
  
  config CPU_LOONGSON3_WORKAROUNDS
 -      bool "Old Loongson 3 LLSC Workarounds"
 +      bool "Old Loongson-3 LLSC Workarounds"
        default y if SMP
 -      depends on CPU_LOONGSON3
 +      depends on CPU_LOONGSON64
        help
 -        Loongson 3 processors have the llsc issues which require workarounds.
 +        Loongson-3 processors have the llsc issues which require workarounds.
          Without workarounds the system may hang unexpectedly.
  
 -        Newer Loongson 3 will fix these issues and no workarounds are needed.
 +        Newer Loongson-3 will fix these issues and no workarounds are needed.
          The workarounds have no significant side effect on them but may
          decrease the performance of the system so this option should be
          disabled unless the kernel is intended to be run on old systems.
  config CPU_LOONGSON2E
        bool "Loongson 2E"
        depends on SYS_HAS_CPU_LOONGSON2E
 -      select CPU_LOONGSON2
 +      select CPU_LOONGSON2EF
        help
          The Loongson 2E processor implements the MIPS III instruction set
          with many extensions.
  config CPU_LOONGSON2F
        bool "Loongson 2F"
        depends on SYS_HAS_CPU_LOONGSON2F
 -      select CPU_LOONGSON2
 +      select CPU_LOONGSON2EF
        select GPIOLIB
        help
          The Loongson 2F processor implements the MIPS III instruction set
  config CPU_LOONGSON1B
        bool "Loongson 1B"
        depends on SYS_HAS_CPU_LOONGSON1B
 -      select CPU_LOONGSON1
 +      select CPU_LOONGSON32
        select LEDS_GPIO_REGISTER
        help
          The Loongson 1B is a 32-bit SoC, which implements the MIPS32
  config CPU_LOONGSON1C
        bool "Loongson 1C"
        depends on SYS_HAS_CPU_LOONGSON1C
 -      select CPU_LOONGSON1
 +      select CPU_LOONGSON32
        select LEDS_GPIO_REGISTER
        help
          The Loongson 1C is a 32-bit SoC, which implements the MIPS32
@@@ -1921,7 -1857,7 +1921,7 @@@ config SYS_SUPPORTS_ZBOOT_UART_PRO
        bool
        select SYS_SUPPORTS_ZBOOT
  
 -config CPU_LOONGSON2
 +config CPU_LOONGSON2EF
        bool
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select ARCH_HAS_PHYS_TO_DMA
        select CPU_HAS_LOAD_STORE_LR
  
 -config CPU_LOONGSON1
 +config CPU_LOONGSON32
        bool
        select CPU_MIPS32
        select CPU_MIPSR2
@@@ -1964,7 -1900,7 +1964,7 @@@ config CPU_BMIPS500
        select SYS_SUPPORTS_HOTPLUG_CPU
        select CPU_HAS_RIXI
  
 -config SYS_HAS_CPU_LOONGSON3
 +config SYS_HAS_CPU_LOONGSON64
        bool
        select CPU_SUPPORTS_CPUFREQ
        select CPU_HAS_RIXI
@@@ -1976,6 -1912,7 +1976,6 @@@ config SYS_HAS_CPU_LOONGSON2
        bool
        select CPU_SUPPORTS_CPUFREQ
        select CPU_SUPPORTS_ADDRWINCFG if 64BIT
 -      select CPU_SUPPORTS_UNCACHED_ACCELERATED
  
  config SYS_HAS_CPU_LOONGSON1B
        bool
@@@ -2152,6 -2089,8 +2152,6 @@@ config CPU_SUPPORTS_ADDRWINCF
  config CPU_SUPPORTS_HUGEPAGES
        bool
        depends on !(32BIT && (ARCH_PHYS_ADDR_T_64BIT || EVA))
 -config CPU_SUPPORTS_UNCACHED_ACCELERATED
 -      bool
  config MIPS_PGD_C0_CONTEXT
        bool
        default y if 64BIT && (CPU_MIPSR2 || CPU_MIPSR6) && !CPU_XLP
@@@ -2223,7 -2162,7 +2223,7 @@@ choic
  
  config PAGE_SIZE_4KB
        bool "4kB"
 -      depends on !CPU_LOONGSON2 && !CPU_LOONGSON3
 +      depends on !CPU_LOONGSON2EF && !CPU_LOONGSON64
        help
          This option select the standard 4kB Linux page size.  On some
          R3000-family processors this is the only available page size.  Using
@@@ -2615,10 -2554,6 +2615,10 @@@ config CPU_R4000_WORKAROUND
  config CPU_R4400_WORKAROUNDS
        bool
  
 +config CPU_R4X00_BUGS64
 +      bool
 +      default y if SYS_HAS_CPU_R4X00 && 64BIT && (TARGET_ISA_REV < 1)
 +
  config MIPS_ASID_SHIFT
        int
        default 6 if CPU_R3000 || CPU_TX39XX
@@@ -2677,11 -2612,20 +2677,11 @@@ config CPU_SUPPORTS_MS
  
  config ARCH_FLATMEM_ENABLE
        def_bool y
 -      depends on !NUMA && !CPU_LOONGSON2
 -
 -config ARCH_DISCONTIGMEM_ENABLE
 -      bool
 -      default y if SGI_IP27
 -      help
 -        Say Y to support efficient handling of discontiguous physical memory,
 -        for architectures which are either NUMA (Non-Uniform Memory Access)
 -        or have huge holes in the physical address space for other reasons.
 -        See <file:Documentation/vm/numa.rst> for more.
 +      depends on !NUMA && !CPU_LOONGSON2EF
  
  config ARCH_SPARSEMEM_ENABLE
        bool
 -      select SPARSEMEM_STATIC
 +      select SPARSEMEM_STATIC if !SGI_IP27
  
  config NUMA
        bool "NUMA Support"
@@@ -2758,7 -2702,7 +2758,7 @@@ config NODES_SHIF
  
  config HW_PERF_EVENTS
        bool "Enable hardware performance counter support for perf events"
 -      depends on PERF_EVENTS && !OPROFILE && (CPU_MIPS32 || CPU_MIPS64 || CPU_R10000 || CPU_SB1 || CPU_CAVIUM_OCTEON || CPU_XLP || CPU_LOONGSON3)
 +      depends on PERF_EVENTS && !OPROFILE && (CPU_MIPS32 || CPU_MIPS64 || CPU_R10000 || CPU_SB1 || CPU_CAVIUM_OCTEON || CPU_XLP || CPU_LOONGSON64)
        default y
        help
          Enable hardware performance counter support for perf events. If
diff --combined arch/x86/Kconfig
index 58b31ee198d966932eecfff0cc9f1d8311cd78c4,35dd8f147f992e504057975816960b8c66b56f3a..0cb1756223bef01d84a984398965a31c16fc75a2
@@@ -24,7 -24,7 +24,7 @@@ config X86_6
        depends on 64BIT
        # Options that are inherently 64-bit kernel only:
        select ARCH_HAS_GIGANTIC_PAGE
 -      select ARCH_SUPPORTS_INT128
 +      select ARCH_SUPPORTS_INT128 if CC_HAS_INT128
        select ARCH_USE_CMPXCHG_LOCKREF
        select HAVE_ARCH_SOFT_DIRTY
        select MODULES_USE_ELF_RELA
@@@ -73,6 -73,7 +73,6 @@@ config X8
        select ARCH_HAS_PMEM_API                if X86_64
        select ARCH_HAS_PTE_DEVMAP              if X86_64
        select ARCH_HAS_PTE_SPECIAL
 -      select ARCH_HAS_REFCOUNT
        select ARCH_HAS_UACCESS_FLUSHCACHE      if X86_64
        select ARCH_HAS_UACCESS_MCSAFE          if X86_64 && X86_MCE
        select ARCH_HAS_SET_MEMORY
        select HAVE_DMA_CONTIGUOUS
        select HAVE_DYNAMIC_FTRACE
        select HAVE_DYNAMIC_FTRACE_WITH_REGS
 +      select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
        select HAVE_EBPF_JIT
        select HAVE_EFFICIENT_UNALIGNED_ACCESS
        select HAVE_EISA
@@@ -708,7 -708,6 +708,6 @@@ config X86_SUPPORTS_MEMORY_FAILUR
  config STA2X11
        bool "STA2X11 Companion Chip Support"
        depends on X86_32_NON_STANDARD && PCI
-       select ARCH_HAS_PHYS_TO_DMA
        select SWIOTLB
        select MFD_STA2X11
        select GPIOLIB
@@@ -932,6 -931,36 +931,6 @@@ config GART_IOMM
  
          If unsure, say Y.
  
 -config CALGARY_IOMMU
 -      bool "IBM Calgary IOMMU support"
 -      select IOMMU_HELPER
 -      select SWIOTLB
 -      depends on X86_64 && PCI
 -      ---help---
 -        Support for hardware IOMMUs in IBM's xSeries x366 and x460
 -        systems. Needed to run systems with more than 3GB of memory
 -        properly with 32-bit PCI devices that do not support DAC
 -        (Double Address Cycle). Calgary also supports bus level
 -        isolation, where all DMAs pass through the IOMMU.  This
 -        prevents them from going anywhere except their intended
 -        destination. This catches hard-to-find kernel bugs and
 -        mis-behaving drivers and devices that do not use the DMA-API
 -        properly to set up their DMA buffers.  The IOMMU can be
 -        turned off at boot time with the iommu=off parameter.
 -        Normally the kernel will make the right choice by itself.
 -        If unsure, say Y.
 -
 -config CALGARY_IOMMU_ENABLED_BY_DEFAULT
 -      def_bool y
 -      prompt "Should Calgary be enabled by default?"
 -      depends on CALGARY_IOMMU
 -      ---help---
 -        Should Calgary be enabled by default? if you choose 'y', Calgary
 -        will be used (if it exists). If you choose 'n', Calgary will not be
 -        used even if it exists. If you choose 'n' and would like to use
 -        Calgary anyway, pass 'iommu=calgary' on the kernel command line.
 -        If unsure, say Y.
 -
  config MAXSMP
        bool "Enable Maximum number of SMP Processors and NUMA Nodes"
        depends on X86_64 && SMP && DEBUG_KERNEL
@@@ -970,8 -999,8 +969,8 @@@ config NR_CPUS_RANGE_EN
  config NR_CPUS_RANGE_END
        int
        depends on X86_64
 -      default 8192 if  SMP && ( MAXSMP ||  CPUMASK_OFFSTACK)
 -      default  512 if  SMP && (!MAXSMP && !CPUMASK_OFFSTACK)
 +      default 8192 if  SMP && CPUMASK_OFFSTACK
 +      default  512 if  SMP && !CPUMASK_OFFSTACK
        default    1 if !SMP
  
  config NR_CPUS_DEFAULT
@@@ -1224,24 -1253,6 +1223,24 @@@ config X86_VSYSCALL_EMULATIO
         Disabling this option saves about 7K of kernel size and
         possibly 4K of additional runtime pagetable memory.
  
 +config X86_IOPL_IOPERM
 +      bool "IOPERM and IOPL Emulation"
 +      default y
 +      ---help---
 +        This enables the ioperm() and iopl() syscalls which are necessary
 +        for legacy applications.
 +
 +        Legacy IOPL support is an overbroad mechanism which allows user
 +        space aside of accessing all 65536 I/O ports also to disable
 +        interrupts. To gain this access the caller needs CAP_SYS_RAWIO
 +        capabilities and permission from potentially active security
 +        modules.
 +
 +        The emulation restricts the functionality of the syscall to
 +        only allowing the full range I/O port access, but prevents the
 +        ability to disable interrupts from user space which would be
 +        granted if the hardware IOPL mechanism would be used.
 +
  config TOSHIBA
        tristate "Toshiba Laptop support"
        depends on X86_32
@@@ -1480,7 -1491,6 +1479,7 @@@ config X86_PA
  
  config X86_5LEVEL
        bool "Enable 5-level page tables support"
 +      default y
        select DYNAMIC_MEMORY_LAYOUT
        select SPARSEMEM_VMEMMAP
        depends on X86_64
@@@ -1740,7 -1750,7 +1739,7 @@@ config X86_RESERVE_LO
  config MATH_EMULATION
        bool
        depends on MODIFY_LDT_SYSCALL
 -      prompt "Math emulation" if X86_32
 +      prompt "Math emulation" if X86_32 && (M486SX || MELAN)
        ---help---
          Linux can emulate a math coprocessor (used for floating point
          operations) if you don't have one. 486DX and Pentium processors have
@@@ -1869,16 -1879,16 +1868,16 @@@ config X86_SMA
  
          If unsure, say Y.
  
 -config X86_INTEL_UMIP
 +config X86_UMIP
        def_bool y
 -      depends on CPU_SUP_INTEL
 -      prompt "Intel User Mode Instruction Prevention" if EXPERT
 +      depends on CPU_SUP_INTEL || CPU_SUP_AMD
 +      prompt "User Mode Instruction Prevention" if EXPERT
        ---help---
 -        The User Mode Instruction Prevention (UMIP) is a security
 -        feature in newer Intel processors. If enabled, a general
 -        protection fault is issued if the SGDT, SLDT, SIDT, SMSW
 -        or STR instructions are executed in user mode. These instructions
 -        unnecessarily expose information about the hardware state.
 +        User Mode Instruction Prevention (UMIP) is a security feature in
 +        some x86 processors. If enabled, a general protection fault is
 +        issued if the SGDT, SLDT, SIDT, SMSW or STR instructions are
 +        executed in user mode. These instructions unnecessarily expose
 +        information about the hardware state.
  
          The vast majority of applications do not use these instructions.
          For the very few that do, software emulation is provided in
@@@ -1929,51 -1939,6 +1928,51 @@@ config X86_INTEL_MEMORY_PROTECTION_KEY
  
          If unsure, say y.
  
 +choice
 +      prompt "TSX enable mode"
 +      depends on CPU_SUP_INTEL
 +      default X86_INTEL_TSX_MODE_OFF
 +      help
 +        Intel's TSX (Transactional Synchronization Extensions) feature
 +        allows to optimize locking protocols through lock elision which
 +        can lead to a noticeable performance boost.
 +
 +        On the other hand it has been shown that TSX can be exploited
 +        to form side channel attacks (e.g. TAA) and chances are there
 +        will be more of those attacks discovered in the future.
 +
 +        Therefore TSX is not enabled by default (aka tsx=off). An admin
 +        might override this decision by tsx=on the command line parameter.
 +        Even with TSX enabled, the kernel will attempt to enable the best
 +        possible TAA mitigation setting depending on the microcode available
 +        for the particular machine.
 +
 +        This option allows to set the default tsx mode between tsx=on, =off
 +        and =auto. See Documentation/admin-guide/kernel-parameters.txt for more
 +        details.
 +
 +        Say off if not sure, auto if TSX is in use but it should be used on safe
 +        platforms or on if TSX is in use and the security aspect of tsx is not
 +        relevant.
 +
 +config X86_INTEL_TSX_MODE_OFF
 +      bool "off"
 +      help
 +        TSX is disabled if possible - equals to tsx=off command line parameter.
 +
 +config X86_INTEL_TSX_MODE_ON
 +      bool "on"
 +      help
 +        TSX is always enabled on TSX capable HW - equals the tsx=on command
 +        line parameter.
 +
 +config X86_INTEL_TSX_MODE_AUTO
 +      bool "auto"
 +      help
 +        TSX is enabled on TSX capable HW that is believed to be safe against
 +        side channel attacks- equals the tsx=auto command line parameter.
 +endchoice
 +
  config EFI
        bool "EFI runtime service support"
        depends on ACPI
index 4bbccb9d16dcd02fb3fecdf82fcc0cdce65a35df,5cfab41e8509c6a77ae277f0be15432300c88f8f..4e5f502360480eec6f90a355009d9a881be3515e
@@@ -185,13 -185,13 +185,13 @@@ static void iommu_full(struct device *d
  static inline int
  need_iommu(struct device *dev, unsigned long addr, size_t size)
  {
-       return force_iommu || !dma_capable(dev, addr, size);
+       return force_iommu || !dma_capable(dev, addr, size, true);
  }
  
  static inline int
  nonforced_iommu(struct device *dev, unsigned long addr, size_t size)
  {
-       return !dma_capable(dev, addr, size);
+       return !dma_capable(dev, addr, size, true);
  }
  
  /* Map a single continuous physical area into the IOMMU.
@@@ -510,9 -510,10 +510,9 @@@ static __init unsigned long check_iommu
        iommu_size -= round_up(a, PMD_PAGE_SIZE) - a;
  
        if (iommu_size < 64*1024*1024) {
 -              pr_warning(
 -                      "PCI-DMA: Warning: Small IOMMU %luMB."
 +              pr_warn("PCI-DMA: Warning: Small IOMMU %luMB."
                        " Consider increasing the AGP aperture in BIOS\n",
 -                              iommu_size >> 20);
 +                      iommu_size >> 20);
        }
  
        return iommu_size;
@@@ -664,7 -665,8 +664,7 @@@ static __init int init_amd_gatt(struct 
  
   nommu:
        /* Should not happen anymore */
 -      pr_warning("PCI-DMA: More than 4GB of RAM and no IOMMU\n"
 -             "falling back to iommu=soft.\n");
 +      pr_warn("PCI-DMA: More than 4GB of RAM and no IOMMU - falling back to iommu=soft.\n");
        return -1;
  }
  
@@@ -731,8 -733,8 +731,8 @@@ int __init gart_iommu_init(void
            !gart_iommu_aperture ||
            (no_agp && init_amd_gatt(&info) < 0)) {
                if (max_pfn > MAX_DMA32_PFN) {
 -                      pr_warning("More than 4GB of memory but GART IOMMU not available.\n");
 -                      pr_warning("falling back to iommu=soft.\n");
 +                      pr_warn("More than 4GB of memory but GART IOMMU not available.\n");
 +                      pr_warn("falling back to iommu=soft.\n");
                }
                return 0;
        }
index 57de2ebff7e20151daa94b53ddcb74b5369bb8ca,3a75d665d43c4299cafb2131ac67651a442ad890..5dcedad21dffa2a0e5428c599354c37ff1fc84be
@@@ -12,6 -12,7 +12,6 @@@
  #include <asm/dma.h>
  #include <asm/iommu.h>
  #include <asm/gart.h>
 -#include <asm/calgary.h>
  #include <asm/x86_init.h>
  #include <asm/iommu_table.h>
  
@@@ -111,6 -112,11 +111,6 @@@ static __init int iommu_setup(char *p
  
                gart_parse_options(p);
  
 -#ifdef CONFIG_CALGARY_IOMMU
 -              if (!strncmp(p, "calgary", 7))
 -                      use_calgary = 1;
 -#endif /* CONFIG_CALGARY_IOMMU */
 -
                p += strcspn(p, ",");
                if (*p == ',')
                        ++p;
@@@ -140,7 -146,7 +140,7 @@@ rootfs_initcall(pci_iommu_init)
  
  static int via_no_dac_cb(struct pci_dev *pdev, void *data)
  {
-       pdev->dev.bus_dma_mask = DMA_BIT_MASK(32);
+       pdev->dev.bus_dma_limit = DMA_BIT_MASK(32);
        return 0;
  }
  
diff --combined drivers/ata/ahci.c
index ec6c64fce74a1c64263293a345c7b8ff4c805ebb,7c6d06ffb58685531e81f24aa731252e8526fceb..4bfd1b14b3906c86cfd8808da33878ad1f617d59
@@@ -56,7 -56,6 +56,7 @@@ enum board_ids 
        board_ahci_yes_fbs,
  
        /* board IDs for specific chipsets in alphabetical order */
 +      board_ahci_al,
        board_ahci_avn,
        board_ahci_mcp65,
        board_ahci_mcp77,
@@@ -168,13 -167,6 +168,13 @@@ static const struct ata_port_info ahci_
                .port_ops       = &ahci_ops,
        },
        /* by chipsets */
 +      [board_ahci_al] = {
 +              AHCI_HFLAGS     (AHCI_HFLAG_NO_PMP | AHCI_HFLAG_NO_MSI),
 +              .flags          = AHCI_FLAG_COMMON,
 +              .pio_mask       = ATA_PIO4,
 +              .udma_mask      = ATA_UDMA6,
 +              .port_ops       = &ahci_ops,
 +      },
        [board_ahci_avn] = {
                .flags          = AHCI_FLAG_COMMON,
                .pio_mask       = ATA_PIO4,
@@@ -423,11 -415,6 +423,11 @@@ static const struct pci_device_id ahci_
        { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb700 }, /* ATI SB700/800 */
        { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */
  
 +      /* Amazon's Annapurna Labs support */
 +      { PCI_DEVICE(PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031),
 +              .class = PCI_CLASS_STORAGE_SATA_AHCI,
 +              .class_mask = 0xffffff,
 +              board_ahci_al },
        /* AMD */
        { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */
        { PCI_VDEVICE(AMD, 0x7900), board_ahci }, /* AMD CZ */
@@@ -910,7 -897,7 +910,7 @@@ static int ahci_configure_dma_masks(str
         * value, don't extend it here. This happens on STA2X11, for example.
         *
         * XXX: manipulating the DMA mask from platform code is completely
-        * bogus, platform code should use dev->bus_dma_mask instead..
+        * bogus, platform code should use dev->bus_dma_limit instead..
         */
        if (pdev->dma_mask && pdev->dma_mask < DMA_BIT_MASK(32))
                return 0;
diff --combined include/linux/device.h
index f05c5b92e61f535abcfd1d11fd6e8165a8ae840f,e396de656f2072617293dffadb8a128d62cae9dc..e226030c1df3c3f1c333f2acba8955a116921cf6
@@@ -80,13 -80,6 +80,13 @@@ extern void bus_remove_file(struct bus_
   *            that generate uevents to add the environment variables.
   * @probe:    Called when a new device or driver add to this bus, and callback
   *            the specific driver's probe to initial the matched device.
 + * @sync_state:       Called to sync device state to software state after all the
 + *            state tracking consumers linked to this device (present at
 + *            the time of late_initcall) have successfully bound to a
 + *            driver. If the device has no consumers, this function will
 + *            be called at late_initcall_sync level. If the device has
 + *            consumers that are never bound to a driver, this function
 + *            will never get called until they do.
   * @remove:   Called when a device removed from this bus.
   * @shutdown: Called at shut-down time to quiesce the device.
   *
@@@ -130,7 -123,6 +130,7 @@@ struct bus_type 
        int (*match)(struct device *dev, struct device_driver *drv);
        int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
        int (*probe)(struct device *dev);
 +      void (*sync_state)(struct device *dev);
        int (*remove)(struct device *dev);
        void (*shutdown)(struct device *dev);
  
@@@ -348,13 -340,6 +348,13 @@@ enum probe_type 
   * @probe:    Called to query the existence of a specific device,
   *            whether this driver can work with it, and bind the driver
   *            to a specific device.
 + * @sync_state:       Called to sync device state to software state after all the
 + *            state tracking consumers linked to this device (present at
 + *            the time of late_initcall) have successfully bound to a
 + *            driver. If the device has no consumers, this function will
 + *            be called at late_initcall_sync level. If the device has
 + *            consumers that are never bound to a driver, this function
 + *            will never get called until they do.
   * @remove:   Called when the device is removed from the system to
   *            unbind a device from this driver.
   * @shutdown: Called at shut-down time to quiesce the device.
@@@ -394,7 -379,6 +394,7 @@@ struct device_driver 
        const struct acpi_device_id     *acpi_match_table;
  
        int (*probe) (struct device *dev);
 +      void (*sync_state)(struct device *dev);
        int (*remove) (struct device *dev);
        void (*shutdown) (struct device *dev);
        int (*suspend) (struct device *dev, pm_message_t state);
@@@ -962,8 -946,6 +962,8 @@@ extern void devm_free_pages(struct devi
  
  void __iomem *devm_ioremap_resource(struct device *dev,
                                    const struct resource *res);
 +void __iomem *devm_ioremap_resource_wc(struct device *dev,
 +                                     const struct resource *res);
  
  void __iomem *devm_of_iomap(struct device *dev,
                            struct device_node *node, int index,
@@@ -1098,7 -1080,6 +1098,7 @@@ enum device_link_state 
   * AUTOREMOVE_SUPPLIER: Remove the link automatically on supplier driver unbind.
   * AUTOPROBE_CONSUMER: Probe consumer driver automatically after supplier binds.
   * MANAGED: The core tracks presence of supplier/consumer drivers (internal).
 + * SYNC_STATE_ONLY: Link only affects sync_state() behavior.
   */
  #define DL_FLAG_STATELESS             BIT(0)
  #define DL_FLAG_AUTOREMOVE_CONSUMER   BIT(1)
  #define DL_FLAG_AUTOREMOVE_SUPPLIER   BIT(4)
  #define DL_FLAG_AUTOPROBE_CONSUMER    BIT(5)
  #define DL_FLAG_MANAGED                       BIT(6)
 +#define DL_FLAG_SYNC_STATE_ONLY               BIT(7)
  
  /**
   * struct device_link - Device link representation.
@@@ -1155,18 -1135,11 +1155,18 @@@ enum dl_dev_state 
   * struct dev_links_info - Device data related to device links.
   * @suppliers: List of links to supplier devices.
   * @consumers: List of links to consumer devices.
 + * @needs_suppliers: Hook to global list of devices waiting for suppliers.
 + * @defer_sync: Hook to global list of devices that have deferred sync_state.
 + * @need_for_probe: If needs_suppliers is on a list, this indicates if the
 + *                suppliers are needed for probe or not.
   * @status: Driver status information.
   */
  struct dev_links_info {
        struct list_head suppliers;
        struct list_head consumers;
 +      struct list_head needs_suppliers;
 +      struct list_head defer_sync;
 +      bool need_for_probe;
        enum dl_dev_state status;
  };
  
   * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all
   *            hardware supports 64-bit addresses for consistent allocations
   *            such descriptors.
-  * @bus_dma_mask: Mask of an upstream bridge or bus which imposes a smaller DMA
-  *            limit than the device itself supports.
+  * @bus_dma_limit: Limit of an upstream bridge or bus which imposes a smaller
+  *            DMA limit than the device itself supports.
   * @dma_pfn_offset: offset of DMA memory range relatively of RAM
   * @dma_parms:        A low level driver may set these to teach IOMMU code about
   *            segment limitations.
   * @offline:  Set after successful invocation of bus type's .offline().
   * @of_node_reused: Set if the device-tree node is shared with an ancestor
   *              device.
 + * @state_synced: The hardware state of this device has been synced to match
 + *              the software state of this device by calling the driver/bus
 + *              sync_state() callback.
   * @dma_coherent: this particular device is dma coherent, even if the
   *            architecture supports non-coherent devices.
   *
@@@ -1300,7 -1270,7 +1300,7 @@@ struct device 
                                             not all hardware supports
                                             64 bit addresses for consistent
                                             allocations such descriptors. */
-       u64             bus_dma_mask;   /* upstream dma_mask constraint */
+       u64             bus_dma_limit;  /* upstream dma constraint */
        unsigned long   dma_pfn_offset;
  
        struct device_dma_parameters *dma_parms;
        bool                    offline_disabled:1;
        bool                    offline:1;
        bool                    of_node_reused:1;
 +      bool                    state_synced:1;
  #if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \
      defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) || \
      defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
@@@ -1684,8 -1653,6 +1684,8 @@@ struct device_link *device_link_add(str
                                    struct device *supplier, u32 flags);
  void device_link_del(struct device_link *link);
  void device_link_remove(void *consumer, struct device *supplier);
 +void device_links_supplier_sync_state_pause(void);
 +void device_links_supplier_sync_state_resume(void);
  
  #ifndef dev_fmt
  #define dev_fmt(fmt) fmt
index 8023071d690319b1a08b4b579503fd6942484a72,c4d8741264bd0c339438ad582c039af145dc1e9c..330ad58fbf4d210fc23f211dcec11fb454a211ea
  /**
   * List of possible attributes associated with a DMA mapping. The semantics
   * of each attribute should be defined in Documentation/DMA-attributes.txt.
 - *
 - * DMA_ATTR_WRITE_BARRIER: DMA to a memory region with this attribute
 - * forces all pending DMA writes to complete.
   */
 -#define DMA_ATTR_WRITE_BARRIER                (1UL << 0)
 +
  /*
   * DMA_ATTR_WEAK_ORDERING: Specifies that reads and writes to the mapping
   * may be weakly ordered, that is that reads and writes may pass each other.
@@@ -159,7 -162,7 +159,7 @@@ int dma_release_from_dev_coherent(struc
  int dma_mmap_from_dev_coherent(struct device *dev, struct vm_area_struct *vma,
                            void *cpu_addr, size_t size, int *ret);
  
- void *dma_alloc_from_global_coherent(ssize_t size, dma_addr_t *dma_handle);
+ void *dma_alloc_from_global_coherent(struct device *dev, ssize_t size, dma_addr_t *dma_handle);
  int dma_release_from_global_coherent(int order, void *vaddr);
  int dma_mmap_from_global_coherent(struct vm_area_struct *vma, void *cpu_addr,
                                  size_t size, int *ret);
  #define dma_release_from_dev_coherent(dev, order, vaddr) (0)
  #define dma_mmap_from_dev_coherent(dev, vma, vaddr, order, ret) (0)
  
- static inline void *dma_alloc_from_global_coherent(ssize_t size,
+ static inline void *dma_alloc_from_global_coherent(struct device *dev, ssize_t size,
                                                   dma_addr_t *dma_handle)
  {
        return NULL;
@@@ -580,6 -583,10 +580,10 @@@ static inline unsigned long dma_get_mer
  static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
                size_t size, enum dma_data_direction dir, unsigned long attrs)
  {
+       /* DMA must never operate on areas that might be remapped. */
+       if (dev_WARN_ONCE(dev, is_vmalloc_addr(ptr),
+                         "rejecting DMA map of vmalloc memory\n"))
+               return DMA_MAPPING_ERROR;
        debug_dma_map_single(dev, ptr, size);
        return dma_map_page_attrs(dev, virt_to_page(ptr), offset_in_page(ptr),
                        size, dir, attrs);
@@@ -690,7 -697,7 +694,7 @@@ static inline int dma_coerce_mask_and_c
   */
  static inline bool dma_addressing_limited(struct device *dev)
  {
-       return min_not_zero(dma_get_mask(dev), dev->bus_dma_mask) <
+       return min_not_zero(dma_get_mask(dev), dev->bus_dma_limit) <
                            dma_get_required_mask(dev);
  }
  
diff --combined kernel/dma/debug.c
index a261704695434f9bc8e797558ab850e25f904217,64972aa9bfc316d136241965191274369dc04b1b..2031ed1ad7fa109bb8a8c290bbbc5f825362baba
@@@ -27,7 -27,7 +27,7 @@@
  
  #include <asm/sections.h>
  
- #define HASH_SIZE       1024ULL
+ #define HASH_SIZE       16384ULL
  #define HASH_FN_SHIFT   13
  #define HASH_FN_MASK    (HASH_SIZE - 1)
  
@@@ -54,40 -54,40 +54,40 @@@ enum map_err_types 
   * struct dma_debug_entry - track a dma_map* or dma_alloc_coherent mapping
   * @list: node on pre-allocated free_entries list
   * @dev: 'dev' argument to dma_map_{page|single|sg} or dma_alloc_coherent
-  * @type: single, page, sg, coherent
-  * @pfn: page frame of the start address
-  * @offset: offset of mapping relative to pfn
   * @size: length of the mapping
+  * @type: single, page, sg, coherent
   * @direction: enum dma_data_direction
   * @sg_call_ents: 'nents' from dma_map_sg
   * @sg_mapped_ents: 'mapped_ents' from dma_map_sg
+  * @pfn: page frame of the start address
+  * @offset: offset of mapping relative to pfn
   * @map_err_type: track whether dma_mapping_error() was checked
   * @stacktrace: support backtraces when a violation is detected
   */
  struct dma_debug_entry {
        struct list_head list;
        struct device    *dev;
-       int              type;
-       unsigned long    pfn;
-       size_t           offset;
        u64              dev_addr;
        u64              size;
+       int              type;
        int              direction;
        int              sg_call_ents;
        int              sg_mapped_ents;
+       unsigned long    pfn;
+       size_t           offset;
        enum map_err_types  map_err_type;
  #ifdef CONFIG_STACKTRACE
        unsigned int    stack_len;
        unsigned long   stack_entries[DMA_DEBUG_STACKTRACE_ENTRIES];
  #endif
- };
+ } ____cacheline_aligned_in_smp;
  
  typedef bool (*match_fn)(struct dma_debug_entry *, struct dma_debug_entry *);
  
  struct hash_bucket {
        struct list_head list;
        spinlock_t lock;
- } ____cacheline_aligned_in_smp;
+ };
  
  /* Hash list to save the allocated dma addresses */
  static struct hash_bucket dma_entry_hash[HASH_SIZE];
@@@ -161,7 -161,7 +161,7 @@@ static inline void dump_entry_trace(str
  {
  #ifdef CONFIG_STACKTRACE
        if (entry) {
 -              pr_warning("Mapped at:\n");
 +              pr_warn("Mapped at:\n");
                stack_trace_print(entry->stack_entries, entry->stack_len, 0);
        }
  #endif
@@@ -255,12 -255,10 +255,10 @@@ static struct hash_bucket *get_hash_buc
   * Give up exclusive access to the hash bucket
   */
  static void put_hash_bucket(struct hash_bucket *bucket,
-                           unsigned long *flags)
+                           unsigned long flags)
        __releases(&bucket->lock)
  {
-       unsigned long __flags = *flags;
-       spin_unlock_irqrestore(&bucket->lock, __flags);
+       spin_unlock_irqrestore(&bucket->lock, flags);
  }
  
  static bool exact_match(struct dma_debug_entry *a, struct dma_debug_entry *b)
@@@ -359,7 -357,7 +357,7 @@@ static struct dma_debug_entry *bucket_f
                /*
                 * Nothing found, go back a hash bucket
                 */
-               put_hash_bucket(*bucket, flags);
+               put_hash_bucket(*bucket, *flags);
                range          += (1 << HASH_FN_SHIFT);
                index.dev_addr -= (1 << HASH_FN_SHIFT);
                *bucket = get_hash_bucket(&index, flags);
@@@ -420,6 -418,7 +418,7 @@@ void debug_dma_dump_mappings(struct dev
                }
  
                spin_unlock_irqrestore(&bucket->lock, flags);
+               cond_resched();
        }
  }
  
@@@ -608,7 -607,7 +607,7 @@@ static void add_dma_entry(struct dma_de
  
        bucket = get_hash_bucket(entry, &flags);
        hash_bucket_add(bucket, entry);
-       put_hash_bucket(bucket, &flags);
+       put_hash_bucket(bucket, flags);
  
        rc = active_cacheline_insert(entry);
        if (rc == -ENOMEM) {
@@@ -1001,7 -1000,7 +1000,7 @@@ static void check_unmap(struct dma_debu
  
        if (!entry) {
                /* must drop lock before calling dma_mapping_error */
-               put_hash_bucket(bucket, &flags);
+               put_hash_bucket(bucket, flags);
  
                if (dma_mapping_error(ref->dev, ref->dev_addr)) {
                        err_printk(ref->dev, NULL,
        hash_bucket_del(entry);
        dma_entry_free(entry);
  
-       put_hash_bucket(bucket, &flags);
+       put_hash_bucket(bucket, flags);
  }
  
  static void check_for_stack(struct device *dev,
@@@ -1203,7 -1202,7 +1202,7 @@@ static void check_sync(struct device *d
        }
  
  out:
-       put_hash_bucket(bucket, &flags);
+       put_hash_bucket(bucket, flags);
  }
  
  static void check_sg_segment(struct device *dev, struct scatterlist *sg)
@@@ -1318,7 -1317,7 +1317,7 @@@ void debug_dma_mapping_error(struct dev
                }
        }
  
-       put_hash_bucket(bucket, &flags);
+       put_hash_bucket(bucket, flags);
  }
  EXPORT_SYMBOL(debug_dma_mapping_error);
  
@@@ -1391,7 -1390,7 +1390,7 @@@ static int get_nr_mapped_entries(struc
  
        if (entry)
                mapped_ents = entry->sg_mapped_ents;
-       put_hash_bucket(bucket, &flags);
+       put_hash_bucket(bucket, flags);
  
        return mapped_ents;
  }