[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Support for AGP aperture as IOMMU in AMD64 mode [2/2]
These are the diffs against the pristine versions of arch/x86_64/kernel/[aperture.c,pci-gart.c] to better show the changes necessary to adapt those files to Xen. They were included with the patch and should not be applied again. -Mark Langsdorf AMD, Inc. --- pristine-linux-2.6.12/arch/x86_64/kernel/aperture.c 2005-06-17 12:48:29.000000000 -0700 +++ linux-2.6-xen-sparse/arch/xen/x86_64/kernel/aperture.c 2006-01-12 10:53:17.000000000 -0800 @@ -83,7 +83,7 @@ printk("Aperture from %s beyond 4GB. Ignoring.\n",name); return 0; } - if (e820_mapped(aper_base, aper_base + aper_size, E820_RAM)) { + if (0 && e820_mapped(aper_base, aper_base + aper_size, E820_RAM)) { printk("Aperture from %s pointing to e820 RAM. Ignoring.\n",name); return 0; } --- pristine-linux-2.6.12/arch/x86_64/kernel/pci-gart.c 2005-06-17 12:48:29.000000000 -0700 +++ linux-2.6-xen-sparse/arch/xen/x86_64/kernel/pci-gart.c 2006-01-16 14:32:15.000000000 -0800 @@ -30,6 +30,7 @@ #include <asm/proto.h> #include <asm/cacheflush.h> #include <asm/kdebug.h> +#include <asm-xen/xen-public/memory.h> dma_addr_t bad_dma_address; @@ -39,6 +40,11 @@ u32 *iommu_gatt_base; /* Remapping table */ +/* gart remapping */ +#define virt_to_gart(x) (phys_to_gart(virt_to_phys(x))) +#define gart_to_virt(x) (phys_to_virt(gart_to_phys(x))) +#include <asm-xen/asm-i386/agp.h> + int no_iommu; static int no_agp; #ifdef CONFIG_IOMMU_DEBUG @@ -416,7 +422,7 @@ if (!dev) dev = &fallback_dev; - phys_mem = virt_to_phys(addr); + phys_mem = virt_to_bus(addr); if (!need_iommu(dev, phys_mem, size)) return phys_mem; @@ -721,6 +727,7 @@ unsigned aper_size, gatt_size, new_aper_size; printk(KERN_INFO "PCI-DMA: Disabling AGP.\n"); + aper_size = aper_base = info->aper_size = 0; for_all_nb(dev) { new_aper_base = read_aperture(dev, &new_aper_size); @@ -740,17 +747,20 @@ info->aper_size = aper_size>>20; gatt_size = (aper_size >> PAGE_SHIFT) * sizeof(u32); - gatt = (void *)__get_free_pages(GFP_KERNEL, get_order(gatt_size)); + gatt = (void *) alloc_gatt_pages(get_order(gatt_size)); if (!gatt) panic("Cannot allocate GATT table"); memset(gatt, 0, gatt_size); - agp_gatt_table = gatt; + if (!agp_gatt_table) + agp_gatt_table = gatt; + else + goto nommu; for_all_nb(dev) { u32 ctl; u32 gatt_reg; - gatt_reg = __pa(gatt) >> 12; + gatt_reg = (0xffffffff & virt_to_gart(gatt)) >> 12; gatt_reg <<= 4; pci_write_config_dword(dev, 0x98, gatt_reg); pci_read_config_dword(dev, 0x90, &ctl); @@ -782,6 +792,7 @@ struct pci_dev *dev; unsigned long scratch; long i; + long ram_end = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL); #ifndef CONFIG_AGP_AMD64 no_agp = 1; @@ -800,7 +811,7 @@ } if (no_iommu || - (!force_iommu && end_pfn < 0xffffffff>>PAGE_SHIFT) || + (!force_iommu && ram_end < 0xfffff) || !iommu_aperture || (no_agp && init_k8_gatt(&info) < 0)) { printk(KERN_INFO "PCI-DMA: Disabling IOMMU.\n"); @@ -976,5 +987,7 @@ if (*p == ',') ++p; } + if (force_iommu || fallback_aper_force) + swiotlb = -1; return 1; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |