Commit cd76374e authored by Pavel Machek's avatar Pavel Machek Committed by Thomas Gleixner

suspend-vs-iommu: prevent suspend if we could not resume

iommu/gart support misses suspend/resume code, which can do bad stuff,
including memory corruption on resume.  Prevent system suspend in case we
would be unable to resume.
Signed-off-by: default avatarPavel Machek <pavel@suse.cz>
Tested-by: default avatarPatrick <ragamuffin@datacomm.ch>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent be524fb9
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/iommu-helper.h> #include <linux/iommu-helper.h>
#include <linux/sysdev.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/mtrr.h> #include <asm/mtrr.h>
...@@ -548,6 +549,28 @@ static __init unsigned read_aperture(struct pci_dev *dev, u32 *size) ...@@ -548,6 +549,28 @@ static __init unsigned read_aperture(struct pci_dev *dev, u32 *size)
return aper_base; return aper_base;
} }
static int gart_resume(struct sys_device *dev)
{
return 0;
}
static int gart_suspend(struct sys_device *dev, pm_message_t state)
{
return -EINVAL;
}
static struct sysdev_class gart_sysdev_class = {
.name = "gart",
.suspend = gart_suspend,
.resume = gart_resume,
};
static struct sys_device device_gart = {
.id = 0,
.cls = &gart_sysdev_class,
};
/* /*
* Private Northbridge GATT initialization in case we cannot use the * Private Northbridge GATT initialization in case we cannot use the
* AGP driver for some reason. * AGP driver for some reason.
...@@ -558,7 +581,7 @@ static __init int init_k8_gatt(struct agp_kern_info *info) ...@@ -558,7 +581,7 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
unsigned aper_base, new_aper_base; unsigned aper_base, new_aper_base;
struct pci_dev *dev; struct pci_dev *dev;
void *gatt; void *gatt;
int i; int i, error;
printk(KERN_INFO "PCI-DMA: Disabling AGP.\n"); printk(KERN_INFO "PCI-DMA: Disabling AGP.\n");
aper_size = aper_base = info->aper_size = 0; aper_size = aper_base = info->aper_size = 0;
...@@ -606,6 +629,12 @@ static __init int init_k8_gatt(struct agp_kern_info *info) ...@@ -606,6 +629,12 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
pci_write_config_dword(dev, 0x90, ctl); pci_write_config_dword(dev, 0x90, ctl);
} }
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");
flush_gart(); flush_gart();
printk(KERN_INFO "PCI-DMA: aperture base @ %x size %u KB\n", printk(KERN_INFO "PCI-DMA: aperture base @ %x size %u KB\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment