Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <linux/kdebug.h>
#include <linux/scatterlist.h>
#include <linux/iommu-helper.h>
#include <linux/sysdev.h>
#include <asm/atomic.h>
#include <asm/io.h>
#include <asm/mtrr.h>
@@ -548,6 +549,28 @@ static __init unsigned read_aperture(struct pci_dev *dev, u32 *size)
	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
 * AGP driver for some reason.
@@ -558,7 +581,7 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
	unsigned aper_base, new_aper_base;
	struct pci_dev *dev;
	void *gatt;
	int i;
	int i, error;

	printk(KERN_INFO "PCI-DMA: Disabling AGP.\n");
	aper_size = aper_base = info->aper_size = 0;
@@ -606,6 +629,12 @@ static __init int init_k8_gatt(struct agp_kern_info *info)

		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();

	printk(KERN_INFO "PCI-DMA: aperture base @ %x size %u KB\n",