diff options
author | Keshavamurthy, Anil S <anil.s.keshavamurthy@intel.com> | 2007-10-21 19:41:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-22 11:13:19 -0400 |
commit | e820482cd2621dba60e403af1c54502daa54b220 (patch) | |
tree | 3498401c7154e14008ab80b2f0cbca539ce7ffbc /drivers/pci | |
parent | 3460a6d9cef9ac2aa997da7eff7ff1c8291b361c (diff) |
Intel IOMMU: Iommu Gfx workaround
When we fix all the opensource gfx drivers to use the DMA api's, at that time
we can yank this config options out.
[jengelh@computergmbh.de: Kconfig fixes]
Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Muli Ben-Yehuda <muli@il.ibm.com>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Cc: Arjan van de Ven <arjan@infradead.org>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Jan Engelhardt <jengelh@gmx.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/intel-iommu.c | 33 | ||||
-rw-r--r-- | drivers/pci/intel-iommu.h | 7 |
2 files changed, 40 insertions, 0 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 358dd406fe21..4905e0e3a644 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -1602,6 +1602,36 @@ static inline int iommu_prepare_rmrr_dev(struct dmar_rmrr_unit *rmrr, | |||
1602 | rmrr->end_address + 1); | 1602 | rmrr->end_address + 1); |
1603 | } | 1603 | } |
1604 | 1604 | ||
1605 | #ifdef CONFIG_DMAR_GFX_WA | ||
1606 | extern int arch_get_ram_range(int slot, u64 *addr, u64 *size); | ||
1607 | static void __init iommu_prepare_gfx_mapping(void) | ||
1608 | { | ||
1609 | struct pci_dev *pdev = NULL; | ||
1610 | u64 base, size; | ||
1611 | int slot; | ||
1612 | int ret; | ||
1613 | |||
1614 | for_each_pci_dev(pdev) { | ||
1615 | if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO || | ||
1616 | !IS_GFX_DEVICE(pdev)) | ||
1617 | continue; | ||
1618 | printk(KERN_INFO "IOMMU: gfx device %s 1-1 mapping\n", | ||
1619 | pci_name(pdev)); | ||
1620 | slot = arch_get_ram_range(0, &base, &size); | ||
1621 | while (slot >= 0) { | ||
1622 | ret = iommu_prepare_identity_map(pdev, | ||
1623 | base, base + size); | ||
1624 | if (ret) | ||
1625 | goto error; | ||
1626 | slot = arch_get_ram_range(slot, &base, &size); | ||
1627 | } | ||
1628 | continue; | ||
1629 | error: | ||
1630 | printk(KERN_ERR "IOMMU: mapping reserved region failed\n"); | ||
1631 | } | ||
1632 | } | ||
1633 | #endif | ||
1634 | |||
1605 | int __init init_dmars(void) | 1635 | int __init init_dmars(void) |
1606 | { | 1636 | { |
1607 | struct dmar_drhd_unit *drhd; | 1637 | struct dmar_drhd_unit *drhd; |
@@ -1665,6 +1695,8 @@ int __init init_dmars(void) | |||
1665 | } | 1695 | } |
1666 | } | 1696 | } |
1667 | 1697 | ||
1698 | iommu_prepare_gfx_mapping(); | ||
1699 | |||
1668 | /* | 1700 | /* |
1669 | * for each drhd | 1701 | * for each drhd |
1670 | * enable fault log | 1702 | * enable fault log |
@@ -2176,3 +2208,4 @@ int __init intel_iommu_init(void) | |||
2176 | dma_ops = &intel_dma_ops; | 2208 | dma_ops = &intel_dma_ops; |
2177 | return 0; | 2209 | return 0; |
2178 | } | 2210 | } |
2211 | |||
diff --git a/drivers/pci/intel-iommu.h b/drivers/pci/intel-iommu.h index 71dda6b56ffa..ee88dd2400cb 100644 --- a/drivers/pci/intel-iommu.h +++ b/drivers/pci/intel-iommu.h | |||
@@ -315,4 +315,11 @@ struct intel_iommu { | |||
315 | struct sys_device sysdev; | 315 | struct sys_device sysdev; |
316 | }; | 316 | }; |
317 | 317 | ||
318 | #ifndef CONFIG_DMAR_GFX_WA | ||
319 | static inline void iommu_prepare_gfx_mapping(void) | ||
320 | { | ||
321 | return; | ||
322 | } | ||
323 | #endif /* !CONFIG_DMAR_GFX_WA */ | ||
324 | |||
318 | #endif | 325 | #endif |