Skip to content

Commit 3684b03

Browse files
committed
Merge tag 'iommu-fixes-v4.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu
Pull IOMMU fixes from Joerg Roedel: - Some functions defined in a header file for the mediatek driver were not marked inline. Fix that oversight. - Fix a potential crash in the ARM64 dma-mapping code when freeing a partially initialized domain. - Another fix for ARM64 dma-mapping to respect IOMMU mapping constraints when allocating IOVA addresses. * tag 'iommu-fixes-v4.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: iommu/dma: Respect IOMMU aperture when allocating iommu/dma: Don't put uninitialised IOVA domains iommu/mediatek: Mark static functions in headers inline
2 parents f2fa30a + c987ff0 commit 3684b03

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

drivers/iommu/dma-iommu.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ void iommu_put_dma_cookie(struct iommu_domain *domain)
6868
if (!iovad)
6969
return;
7070

71-
put_iova_domain(iovad);
71+
if (iovad->granule)
72+
put_iova_domain(iovad);
7273
kfree(iovad);
7374
domain->iova_cookie = NULL;
7475
}
@@ -151,12 +152,15 @@ int dma_direction_to_prot(enum dma_data_direction dir, bool coherent)
151152
}
152153
}
153154

154-
static struct iova *__alloc_iova(struct iova_domain *iovad, size_t size,
155+
static struct iova *__alloc_iova(struct iommu_domain *domain, size_t size,
155156
dma_addr_t dma_limit)
156157
{
158+
struct iova_domain *iovad = domain->iova_cookie;
157159
unsigned long shift = iova_shift(iovad);
158160
unsigned long length = iova_align(iovad, size) >> shift;
159161

162+
if (domain->geometry.force_aperture)
163+
dma_limit = min(dma_limit, domain->geometry.aperture_end);
160164
/*
161165
* Enforce size-alignment to be safe - there could perhaps be an
162166
* attribute to control this per-device, or at least per-domain...
@@ -314,7 +318,7 @@ struct page **iommu_dma_alloc(struct device *dev, size_t size, gfp_t gfp,
314318
if (!pages)
315319
return NULL;
316320

317-
iova = __alloc_iova(iovad, size, dev->coherent_dma_mask);
321+
iova = __alloc_iova(domain, size, dev->coherent_dma_mask);
318322
if (!iova)
319323
goto out_free_pages;
320324

@@ -386,7 +390,7 @@ dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
386390
phys_addr_t phys = page_to_phys(page) + offset;
387391
size_t iova_off = iova_offset(iovad, phys);
388392
size_t len = iova_align(iovad, size + iova_off);
389-
struct iova *iova = __alloc_iova(iovad, len, dma_get_mask(dev));
393+
struct iova *iova = __alloc_iova(domain, len, dma_get_mask(dev));
390394

391395
if (!iova)
392396
return DMA_ERROR_CODE;
@@ -538,7 +542,7 @@ int iommu_dma_map_sg(struct device *dev, struct scatterlist *sg,
538542
prev = s;
539543
}
540544

541-
iova = __alloc_iova(iovad, iova_len, dma_get_mask(dev));
545+
iova = __alloc_iova(domain, iova_len, dma_get_mask(dev));
542546
if (!iova)
543547
goto out_restore_sg;
544548

drivers/iommu/mtk_iommu.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,19 @@ struct mtk_iommu_data {
5555
bool enable_4GB;
5656
};
5757

58-
static int compare_of(struct device *dev, void *data)
58+
static inline int compare_of(struct device *dev, void *data)
5959
{
6060
return dev->of_node == data;
6161
}
6262

63-
static int mtk_iommu_bind(struct device *dev)
63+
static inline int mtk_iommu_bind(struct device *dev)
6464
{
6565
struct mtk_iommu_data *data = dev_get_drvdata(dev);
6666

6767
return component_bind_all(dev, &data->smi_imu);
6868
}
6969

70-
static void mtk_iommu_unbind(struct device *dev)
70+
static inline void mtk_iommu_unbind(struct device *dev)
7171
{
7272
struct mtk_iommu_data *data = dev_get_drvdata(dev);
7373

0 commit comments

Comments
 (0)