Merge commit 'v2.6.39-rc6' into x86/cleanups
[pandora-kernel.git] / arch / x86 / kernel / pci-gart_64.c
index c01ffa5..b117efd 100644 (file)
@@ -27,7 +27,7 @@
 #include <linux/kdebug.h>
 #include <linux/scatterlist.h>
 #include <linux/iommu-helper.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
 #include <linux/io.h>
 #include <linux/gfp.h>
 #include <asm/atomic.h>
@@ -81,6 +81,9 @@ static u32 gart_unmapped_entry;
 #define AGPEXTERN
 #endif
 
+/* GART can only remap to physical addresses < 1TB */
+#define GART_MAX_PHYS_ADDR     (1ULL << 40)
+
 /* backdoor interface to AGP driver */
 AGPEXTERN int agp_memory_reserved;
 AGPEXTERN __u32 *agp_gatt_table;
@@ -212,9 +215,13 @@ static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem,
                                size_t size, int dir, unsigned long align_mask)
 {
        unsigned long npages = iommu_num_pages(phys_mem, size, PAGE_SIZE);
-       unsigned long iommu_page = alloc_iommu(dev, npages, align_mask);
+       unsigned long iommu_page;
        int i;
 
+       if (unlikely(phys_mem + size > GART_MAX_PHYS_ADDR))
+               return bad_dma_addr;
+
+       iommu_page = alloc_iommu(dev, npages, align_mask);
        if (iommu_page == -1) {
                if (!nonforced_iommu(dev, phys_mem, size))
                        return phys_mem;
@@ -589,7 +596,7 @@ void set_up_gart_resume(u32 aper_order, u32 aper_alloc)
        aperture_alloc = aper_alloc;
 }
 
-static void gart_fixup_northbridges(struct sys_device *dev)
+static void gart_fixup_northbridges(void)
 {
        int i;
 
@@ -613,33 +620,20 @@ static void gart_fixup_northbridges(struct sys_device *dev)
        }
 }
 
-static int gart_resume(struct sys_device *dev)
+static void gart_resume(void)
 {
        pr_info("PCI-DMA: Resuming GART IOMMU\n");
 
-       gart_fixup_northbridges(dev);
+       gart_fixup_northbridges();
 
        enable_gart_translations();
-
-       return 0;
 }
 
-static int gart_suspend(struct sys_device *dev, pm_message_t state)
-{
-       return 0;
-}
-
-static struct sysdev_class gart_sysdev_class = {
-       .name           = "gart",
-       .suspend        = gart_suspend,
+static struct syscore_ops gart_syscore_ops = {
        .resume         = gart_resume,
 
 };
 
-static struct sys_device device_gart = {
-       .cls            = &gart_sysdev_class,
-};
-
 /*
  * Private Northbridge GATT initialization in case we cannot use the
  * AGP driver for some reason.
@@ -650,7 +644,7 @@ static __init int init_amd_gatt(struct agp_kern_info *info)
        unsigned aper_base, new_aper_base;
        struct pci_dev *dev;
        void *gatt;
-       int i, error;
+       int i;
 
        pr_info("PCI-DMA: Disabling AGP.\n");
 
@@ -685,12 +679,7 @@ static __init int init_amd_gatt(struct agp_kern_info *info)
 
        agp_gatt_table = gatt;
 
-       error = sysdev_class_register(&gart_sysdev_class);
-       if (!error)
-               error = sysdev_register(&device_gart);
-       if (error)
-               panic("Could not register gart_sysdev -- "
-                     "would corrupt data on next suspend");
+       register_syscore_ops(&gart_syscore_ops);
 
        flush_gart();