aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/amd_iommu.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index 5113c080f0c4..85704418644a 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -22,6 +22,7 @@
22#include <linux/bitops.h> 22#include <linux/bitops.h>
23#include <linux/debugfs.h> 23#include <linux/debugfs.h>
24#include <linux/scatterlist.h> 24#include <linux/scatterlist.h>
25#include <linux/dma-mapping.h>
25#include <linux/iommu-helper.h> 26#include <linux/iommu-helper.h>
26#ifdef CONFIG_IOMMU_API 27#ifdef CONFIG_IOMMU_API
27#include <linux/iommu.h> 28#include <linux/iommu.h>
@@ -1297,8 +1298,10 @@ static void __unmap_single(struct amd_iommu *iommu,
1297/* 1298/*
1298 * The exported map_single function for dma_ops. 1299 * The exported map_single function for dma_ops.
1299 */ 1300 */
1300static dma_addr_t map_single(struct device *dev, phys_addr_t paddr, 1301static dma_addr_t map_page(struct device *dev, struct page *page,
1301 size_t size, int dir) 1302 unsigned long offset, size_t size,
1303 enum dma_data_direction dir,
1304 struct dma_attrs *attrs)
1302{ 1305{
1303 unsigned long flags; 1306 unsigned long flags;
1304 struct amd_iommu *iommu; 1307 struct amd_iommu *iommu;
@@ -1306,6 +1309,7 @@ static dma_addr_t map_single(struct device *dev, phys_addr_t paddr,
1306 u16 devid; 1309 u16 devid;
1307 dma_addr_t addr; 1310 dma_addr_t addr;
1308 u64 dma_mask; 1311 u64 dma_mask;
1312 phys_addr_t paddr = page_to_phys(page) + offset;
1309 1313
1310 INC_STATS_COUNTER(cnt_map_single); 1314 INC_STATS_COUNTER(cnt_map_single);
1311 1315
@@ -1337,11 +1341,18 @@ out:
1337 return addr; 1341 return addr;
1338} 1342}
1339 1343
1344static dma_addr_t map_single(struct device *dev, phys_addr_t paddr,
1345 size_t size, int dir)
1346{
1347 return map_page(dev, pfn_to_page(paddr >> PAGE_SHIFT),
1348 paddr & ~PAGE_MASK, size, dir, NULL);
1349}
1350
1340/* 1351/*
1341 * The exported unmap_single function for dma_ops. 1352 * The exported unmap_single function for dma_ops.
1342 */ 1353 */
1343static void unmap_single(struct device *dev, dma_addr_t dma_addr, 1354static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size,
1344 size_t size, int dir) 1355 enum dma_data_direction dir, struct dma_attrs *attrs)
1345{ 1356{
1346 unsigned long flags; 1357 unsigned long flags;
1347 struct amd_iommu *iommu; 1358 struct amd_iommu *iommu;
@@ -1367,6 +1378,12 @@ static void unmap_single(struct device *dev, dma_addr_t dma_addr,
1367 spin_unlock_irqrestore(&domain->lock, flags); 1378 spin_unlock_irqrestore(&domain->lock, flags);
1368} 1379}
1369 1380
1381static void unmap_single(struct device *dev, dma_addr_t dma_addr,
1382 size_t size, int dir)
1383{
1384 return unmap_page(dev, dma_addr, size, dir, NULL);
1385}
1386
1370/* 1387/*
1371 * This is a special map_sg function which is used if we should map a 1388 * This is a special map_sg function which is used if we should map a
1372 * device which is not handled by an AMD IOMMU in the system. 1389 * device which is not handled by an AMD IOMMU in the system.
@@ -1649,6 +1666,8 @@ static struct dma_mapping_ops amd_iommu_dma_ops = {
1649 .free_coherent = free_coherent, 1666 .free_coherent = free_coherent,
1650 .map_single = map_single, 1667 .map_single = map_single,
1651 .unmap_single = unmap_single, 1668 .unmap_single = unmap_single,
1669 .map_page = map_page,
1670 .unmap_page = unmap_page,
1652 .map_sg = map_sg, 1671 .map_sg = map_sg,
1653 .unmap_sg = unmap_sg, 1672 .unmap_sg = unmap_sg,
1654 .dma_supported = amd_iommu_dma_supported, 1673 .dma_supported = amd_iommu_dma_supported,