Commit ef9856a7 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'stable/for-linus-5.12' of...

Merge branch 'stable/for-linus-5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb

Pull swiotlb updates from Konrad Rzeszutek Wilk:
 "Two memory encryption related patches (SWIOTLB is enabled by default
  for AMD-SEV):

   - Add support for alignment so that NVME can properly work

   - Keep track of requested DMA buffers length, as underlaying hardware
     devices can trip SWIOTLB to bounce too much and crash the kernel

  And a tiny fix to use proper APIs in drivers"

* 'stable/for-linus-5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb:
  swiotlb: Validate bounce size in the sync/unmap path
  nvme-pci: set min_align_mask
  swiotlb: respect min_align_mask
  swiotlb: don't modify orig_addr in swiotlb_tbl_sync_single
  swiotlb: refactor swiotlb_tbl_map_single
  swiotlb: clean up swiotlb_tbl_unmap_single
  swiotlb: factor out a nr_slots helper
  swiotlb: factor out an io_tlb_offset helper
  swiotlb: add a IO_TLB_SIZE define
  driver core: add a min_align_mask field to struct device_dma_parameters
  sdhci: stop poking into swiotlb internals
parents fecfd015 daf9514f
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/sizes.h> #include <linux/sizes.h>
#include <linux/swiotlb.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -4582,12 +4581,8 @@ int sdhci_setup_host(struct sdhci_host *host) ...@@ -4582,12 +4581,8 @@ int sdhci_setup_host(struct sdhci_host *host)
mmc->max_segs = SDHCI_MAX_SEGS; mmc->max_segs = SDHCI_MAX_SEGS;
} else if (host->flags & SDHCI_USE_SDMA) { } else if (host->flags & SDHCI_USE_SDMA) {
mmc->max_segs = 1; mmc->max_segs = 1;
if (swiotlb_max_segment()) { mmc->max_req_size = min_t(size_t, mmc->max_req_size,
unsigned int max_req_size = (1 << IO_TLB_SHIFT) * dma_max_mapping_size(mmc_dev(mmc)));
IO_TLB_SEGSIZE;
mmc->max_req_size = min(mmc->max_req_size,
max_req_size);
}
} else { /* PIO */ } else { /* PIO */
mmc->max_segs = SDHCI_MAX_SEGS; mmc->max_segs = SDHCI_MAX_SEGS;
} }
......
...@@ -2632,6 +2632,7 @@ static void nvme_reset_work(struct work_struct *work) ...@@ -2632,6 +2632,7 @@ static void nvme_reset_work(struct work_struct *work)
* Don't limit the IOMMU merged segment size. * Don't limit the IOMMU merged segment size.
*/ */
dma_set_max_seg_size(dev->dev, 0xffffffff); dma_set_max_seg_size(dev->dev, 0xffffffff);
dma_set_min_align_mask(dev->dev, NVME_CTRL_PAGE_SIZE - 1);
mutex_unlock(&dev->shutdown_lock); mutex_unlock(&dev->shutdown_lock);
......
...@@ -291,6 +291,7 @@ struct device_dma_parameters { ...@@ -291,6 +291,7 @@ struct device_dma_parameters {
* sg limitations. * sg limitations.
*/ */
unsigned int max_segment_size; unsigned int max_segment_size;
unsigned int min_align_mask;
unsigned long segment_boundary_mask; unsigned long segment_boundary_mask;
}; };
......
...@@ -509,6 +509,22 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask) ...@@ -509,6 +509,22 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
return -EIO; return -EIO;
} }
static inline unsigned int dma_get_min_align_mask(struct device *dev)
{
if (dev->dma_parms)
return dev->dma_parms->min_align_mask;
return 0;
}
static inline int dma_set_min_align_mask(struct device *dev,
unsigned int min_align_mask)
{
if (WARN_ON_ONCE(!dev->dma_parms))
return -EIO;
dev->dma_parms->min_align_mask = min_align_mask;
return 0;
}
static inline int dma_get_cache_alignment(void) static inline int dma_get_cache_alignment(void)
{ {
#ifdef ARCH_DMA_MINALIGN #ifdef ARCH_DMA_MINALIGN
......
...@@ -29,6 +29,7 @@ enum swiotlb_force { ...@@ -29,6 +29,7 @@ enum swiotlb_force {
* controllable. * controllable.
*/ */
#define IO_TLB_SHIFT 11 #define IO_TLB_SHIFT 11
#define IO_TLB_SIZE (1 << IO_TLB_SHIFT)
/* default to 64MB */ /* default to 64MB */
#define IO_TLB_DEFAULT_SIZE (64UL<<20) #define IO_TLB_DEFAULT_SIZE (64UL<<20)
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment