Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cea9d03c authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

dma-mapping: add an arch_dma_supported hook



To implement the x86 forbid_dac and iommu_sac_force we want an arch hook
so that it can apply the global options across all dma_map_ops
implementations.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 57bf5a89
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
	return dma_ops;
}

int arch_dma_supported(struct device *dev, u64 mask);
#define arch_dma_supported arch_dma_supported

bool arch_dma_alloc_attrs(struct device **dev, gfp_t *gfp);
#define arch_dma_alloc_attrs arch_dma_alloc_attrs

+12 −7
Original line number Diff line number Diff line
@@ -215,7 +215,7 @@ static __init int iommu_setup(char *p)
}
early_param("iommu", iommu_setup);

int x86_dma_supported(struct device *dev, u64 mask)
int arch_dma_supported(struct device *dev, u64 mask)
{
#ifdef CONFIG_PCI
	if (mask > 0xffffffff && forbid_dac > 0) {
@@ -224,12 +224,6 @@ int x86_dma_supported(struct device *dev, u64 mask)
	}
#endif

	/* Copied from i386. Doesn't make much sense, because it will
	   only work for pci_alloc_coherent.
	   The caller just has to use GFP_DMA in this case. */
	if (mask < DMA_BIT_MASK(24))
		return 0;

	/* Tell the device to use SAC when IOMMU force is on.  This
	   allows the driver to use cheaper accesses in some cases.

@@ -249,6 +243,17 @@ int x86_dma_supported(struct device *dev, u64 mask)

	return 1;
}
EXPORT_SYMBOL(arch_dma_supported);

int x86_dma_supported(struct device *dev, u64 mask)
{
	/* Copied from i386. Doesn't make much sense, because it will
	   only work for pci_alloc_coherent.
	   The caller just has to use GFP_DMA in this case. */
	if (mask < DMA_BIT_MASK(24))
		return 0;
	return 1;
}

static int __init pci_iommu_init(void)
{
+11 −0
Original line number Diff line number Diff line
@@ -576,6 +576,14 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
	return 0;
}

/*
 * This is a hack for the legacy x86 forbid_dac and iommu_sac_force. Please
 * don't use this is new code.
 */
#ifndef arch_dma_supported
#define arch_dma_supported(dev, mask)	(1)
#endif

static inline void dma_check_mask(struct device *dev, u64 mask)
{
	if (sme_active() && (mask < (((u64)sme_get_me_mask() << 1) - 1)))
@@ -588,6 +596,9 @@ static inline int dma_supported(struct device *dev, u64 mask)

	if (!ops)
		return 0;
	if (!arch_dma_supported(dev, mask))
		return 0;

	if (!ops->dma_supported)
		return 1;
	return ops->dma_supported(dev, mask);