rpms/kernel/F-10 drm-modesetting-radeon.patch, 1.61, 1.62 drm-next.patch, 1.8, 1.9 kernel.spec, 1.1163, 1.1164 drm-intel-fix-vt-switch-hang.patch, 1.1, NONE drm-next-intel-irq-test.patch, 1.1, NONE

Dave Airlie airlied at fedoraproject.org
Thu Nov 27 01:44:44 UTC 2008


Author: airlied

Update of /cvs/pkgs/rpms/kernel/F-10
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv28970

Modified Files:
	drm-modesetting-radeon.patch drm-next.patch kernel.spec 
Removed Files:
	drm-intel-fix-vt-switch-hang.patch 
	drm-next-intel-irq-test.patch 
Log Message:
- drm: intel rebase with upstream fixes - radeon add larger GART size


drm-modesetting-radeon.patch:

View full diff with command:
/usr/bin/cvs -f diff  -kk -u -N -r 1.61 -r 1.62 drm-modesetting-radeon.patch
Index: drm-modesetting-radeon.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/drm-modesetting-radeon.patch,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -r1.61 -r1.62
--- drm-modesetting-radeon.patch	24 Nov 2008 03:51:46 -0000	1.61
+++ drm-modesetting-radeon.patch	27 Nov 2008 01:44:43 -0000	1.62
@@ -1,4 +1,21 @@
-commit e6b8a9c1229e99d65045ea89cb67623f2e657e27
+commit 5a7e1ee57ec37fb479cb3f7dc428bdb8cb9099ad
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Mon Nov 24 15:18:31 2008 +1000
+
+    radeon: enable larger GART size on PCIE/IGP
+    
+    Allocate a larger GART on PCIE and IGP chipsets controlled by the gart_size
+    command line option.
+    
+    Default to 512MB gart.
+
+commit b2628a4d2aeac92530f83c3f425b7593076fb4c8
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Mon Nov 24 15:17:49 2008 +1000
+
+    radeon: add some missing feature checks for modesetting
+
+commit 4f9b537f20809a5e47e8efe49e440afd4dcab4e3
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 24 11:41:06 2008 +1100
 
@@ -7,49 +24,49 @@
     we really need to read back to make sure the invalidate has happened
     before continuing along happily in life.
 
-commit 3ca0fb9be2b58d48c5cb8c8482e7eade63a68337
+commit 8e9fc797117820610d5c414f9ad016fd022cde2e
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Sun Nov 23 19:19:02 2008 +1000
 
     drm: we have discardable now so don't do special cases
 
-commit b5b1e0ef92c66e9a7423ea1fbfdaa9cf31c975af
+commit 4c3d55f855d5f7931b6493b4eb433cfca169d8e4
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Fri Nov 21 14:52:25 2008 +1000
 
     atom: fix bug in parser for MC reads
 
-commit 6f3f61f49573db49b0753246432cabd0ec9874d8
+commit e8ebeedbc953aec25e546d765dc2271b621ea074
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 17 18:14:28 2008 +1000
 
     radeon: turn of VRAM zeroing by default for now - needs work
 
-commit 8db04f7036da4679b2fabc11e9aba369e53742da
+commit e6f04b8b47432de09575dd7de51b47553905d96c
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 17 16:59:00 2008 +1000
 
     drm: make 800x600 be standard not 640x480
 
-commit 9ba7d8764e635fb3970e332a375f5737bf76f66d
+commit bf63101f05e0a692f16d1bb0ed4f0e2e36c88178
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 17 09:03:36 2008 +1000
 
     radeon: fix return value for no relocs
 
-commit 8fb7d29572e13fc3c0a656c3bd331b74bc40bd49
+commit 847ae8403cfc09dc422766a5773fe8a26acc6ed5
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 17 09:03:01 2008 +1000
 
     ttm: add discard for VRAM buffers
 
-commit 0b9bb18f43cbe0530315576779e00f040e009a05
+commit 2f4b5f642fd33de9ac31a78f168246b6790e4c8c
 Author: Dave Airlie <airlied at dhcp-1-203.bne.redhat.com>
 Date:   Fri Nov 14 15:52:32 2008 +1000
 
     drm: fix the exit path of the bo unlocking
 
-commit be363ffa96a54097b91bf2049a278c520d157fe4
+commit ca31807fbcfe5bef921d75e385d6b3e12a8c866b
 Author: Dave Airlie <airlied at dhcp-1-203.bne.redhat.com>
 Date:   Fri Nov 14 15:51:44 2008 +1000
 
@@ -57,55 +74,55 @@
     
     Fixup failure paths and make EAGAIN work
 
-commit 3e942734ecf15667177effd5e541796a279520c3
+commit 1e587fd7c62ccb6a26fea1de898974cbcf2b2908
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Thu Nov 13 17:22:26 2008 +1100
 
     radeon: fix some issues since last rebase
 
-commit 4b7dbf8bb37888fa45afdd248fc3e54392c9b1f8
+commit 604e11f3e32bedbe0db22c03aa12757818ca5174
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Wed Nov 12 09:01:14 2008 +1000
 
     radeon: fix more build
 
-commit 917d96dd4e24490f1222e7187183a789b576fd9e
+commit dfcf72615c23801340fae0beef4fe702538b0a56
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Wed Nov 12 08:59:04 2008 +1000
 
     radeon: fix compile
 
-commit 936702e46b302aab564cf3471cec474a415260de
+commit 149fcaecaacf2fea87f26efd131cb25b39bd9d83
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Wed Nov 12 08:58:55 2008 +1000
 
     i915: fix master bits
 
-commit a6b89de74617402f17abdd6cf3e965b938dabe84
+commit 1df9f502b2674da3451e7804b68fe7ce7fbd246b
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 10 15:39:25 2008 +1000
 
     radeon: fix dumbness in cp ring check
 
-commit edf529612b2d47f07e3a62b8a1e7b39f534d9ed5
+commit e75fdc3101607976cb76bc8094c118bd289e6265
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Nov 10 14:26:11 2008 +1000
 
     radeon: add gart useable size to report to userspace
 
-commit 3a3cace7c9964f62d6a8d89affcffb88a8a6681d
+commit 986926b9d20ec64c00a9a101d5891f07d125778f
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Sun Nov 9 20:34:49 2008 +1000
 
     radeon: fix powerpc oops on rv280
 
-commit 71d810605e5aedecc159bc86c1a96e3f673c4d4e
+commit 8ce00c9310b729fc626f28d73fe79fbde34c8dfa
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Sun Nov 9 10:23:43 2008 +1000
 
     radeon: upgrade atom headers
 
-commit d0115b2129c49138b6ff805c89ccea1d3e1e184f
+commit 3ca7095e451147baecf70617b793b24022cca3dc
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Sat Nov 8 14:39:41 2008 +1000
 
@@ -114,13 +131,13 @@
     For some reason reading the SCRATCH reg from RAM causes some race to occur.
     Hopefully fix this.
 
-commit 9274c5b531772c536ac46af546fbcc7462056e39
+commit 6728b93f0d37d1a45bb6656c7556d78907ce1326
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Sat Nov 8 11:31:03 2008 +1000
 
     drm/radeon: add dpms connector functions
 
-commit aae530859dd2142283f62a2004d5e5ba7d88d0f6
+commit 7cfe7fe92a8fecd4f256db803ba5c306d07f9687
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Fri Nov 7 16:22:22 2008 +1000
 
@@ -128,13 +145,13 @@
     
     fixes cursor on second head
 
-commit ad0c84ed7b731fe98ed8d555b9fb02f7f7a669d4
+commit 6a6fc0b1a3cb4c1fcf0e79c3f373a40d5e7a3a0f
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Fri Nov 7 16:21:03 2008 +1000
 
     modesetting: set the crtc x,y after the mode base change
 
-commit f24e2e5edfdd6ed2bd79e8ab9f3ca619e9be2754
+commit 798f38d02b8ff14d6c8d5c877d1b3398ee00fed0
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Wed Nov 5 10:23:35 2008 +1000
 
@@ -142,19 +159,19 @@
     
     This allows re-use of uc/wc marked pages
 
-commit d79264d477fe607ad0067226a75f6e7f441635a3
+commit 9b35742ca9b1ce203f700efb77b74a8daae659df
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Wed Nov 5 10:22:27 2008 +1000
 
     radeon: fix ring tail overflow issue since alignment
 
-commit 2b7f36f5ce3e6b953bcf9f323ee9b787d9ed1200
+commit 98d0a3e296e8342ffe82e530ab6557997b225d36
 Author: Dave Airlie <airlied at redhat.com>
[...2355 lines suppressed...]
@@ -31724,7 +31785,7 @@
 +		return 0;
 +	}
 +
-+	dev_priv->mm.gart_size = (32 * 1024 * 1024);
++	dev_priv->mm.gart_size = (radeon_gart_size * 1024 * 1024);
 +	dev_priv->mm.gart_start = 0;
 +	dev_priv->mm.gart_useable = dev_priv->mm.gart_size;
 +	ret = radeon_gart_init(dev);
@@ -32760,7 +32821,7 @@
 +}
 +
 diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c
-index 5079f70..b4f5d50 100644
+index 97c0599..7d778a0 100644
 --- a/drivers/gpu/drm/radeon/radeon_irq.c
 +++ b/drivers/gpu/drm/radeon/radeon_irq.c
 @@ -193,11 +193,14 @@ irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS)
@@ -32827,14 +32888,14 @@
  
  	return ret;
  }
-@@ -339,7 +345,6 @@ int radeon_driver_irq_postinstall(struct drm_device *dev)
+@@ -338,7 +344,6 @@ int radeon_driver_irq_postinstall(struct drm_device *dev)
+ 	drm_radeon_private_t *dev_priv =
  	    (drm_radeon_private_t *) dev->dev_private;
- 	int ret;
  
 -	atomic_set(&dev_priv->swi_emitted, 0);
  	DRM_INIT_WAITQUEUE(&dev_priv->swi_queue);
  
- 	ret = drm_vblank_init(dev, 2);
+ 	dev->max_vblank_count = 0x001fffff;
 diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
 new file mode 100644
 index 0000000..c0a3c0f
@@ -35665,7 +35726,7 @@
 +#endif
 diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
 new file mode 100644
-index 0000000..1df4375
+index 0000000..e67a548
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_pm.c
 @@ -0,0 +1,248 @@
@@ -35746,7 +35807,7 @@
 +	RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
 +
 +	if (dev_priv->flags & RADEON_IS_PCIE) {
-+		memcpy_fromio(dev_priv->mm.pcie_table_backup, dev_priv->mm.pcie_table.kmap.virtual, RADEON_PCIGART_TABLE_SIZE);
++		memcpy_fromio(dev_priv->mm.pcie_table_backup, dev_priv->mm.pcie_table.kmap.virtual, dev_priv->gart_info.table_size);
 +	}
 +
 +	pci_save_state(dev->pdev);
@@ -35813,7 +35874,7 @@
 +	radeon_init_memory_map(dev);
 +
 +	if (dev_priv->flags & RADEON_IS_PCIE) {
-+		memcpy_toio(dev_priv->mm.pcie_table.kmap.virtual, dev_priv->mm.pcie_table_backup, RADEON_PCIGART_TABLE_SIZE);
++		memcpy_toio(dev_priv->mm.pcie_table.kmap.virtual, dev_priv->mm.pcie_table_backup, dev_priv->gart_info.table_size);
 +	}
 +
 +	if (dev_priv->mm.ring.kmap.virtual)
@@ -41267,7 +41328,7 @@
 +
 +#endif
 diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c
-index 5d7153f..c7602aa 100644
+index 5d7153f..0c3c7d2 100644
 --- a/drivers/gpu/drm/radeon/radeon_state.c
 +++ b/drivers/gpu/drm/radeon/radeon_state.c
 @@ -305,8 +305,9 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
@@ -41892,7 +41953,7 @@
  	default:
  		DRM_DEBUG("Invalid parameter %d\n", param->param);
  		return -EINVAL;
-@@ -3064,6 +3100,7 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
+@@ -3064,36 +3100,53 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
  static int radeon_cp_setparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
  	drm_radeon_private_t *dev_priv = dev->dev_private;
@@ -41900,7 +41961,20 @@
  	drm_radeon_setparam_t *sp = data;
  	struct drm_radeon_driver_file_fields *radeon_priv;
  
-@@ -3078,12 +3115,14 @@ static int radeon_cp_setparam(struct drm_device *dev, void *data, struct drm_fil
+ 	switch (sp->param) {
+ 	case RADEON_SETPARAM_FB_LOCATION:
++		if (drm_core_check_feature(dev, DRIVER_MODESET))
++			return 0;
++
+ 		radeon_priv = file_priv->driver_priv;
+ 		radeon_priv->radeon_fb_delta = dev_priv->fb_location -
+ 		    sp->value;
+ 		break;
+ 	case RADEON_SETPARAM_SWITCH_TILING:
++		if (drm_core_check_feature(dev, DRIVER_MODESET))
++			return 0;
++
+ 		if (sp->value == 0) {
  			DRM_DEBUG("color tiling disabled\n");
  			dev_priv->front_pitch_offset &= ~RADEON_DST_TILE_MACRO;
  			dev_priv->back_pitch_offset &= ~RADEON_DST_TILE_MACRO;
@@ -41917,11 +41991,32 @@
  		}
  		break;
  	case RADEON_SETPARAM_PCIGART_LOCATION:
-@@ -3101,6 +3140,11 @@ static int radeon_cp_setparam(struct drm_device *dev, void *data, struct drm_fil
++		if (drm_core_check_feature(dev, DRIVER_MODESET))
++			return 0;
++
+ 		dev_priv->pcigart_offset = sp->value;
+ 		dev_priv->pcigart_offset_set = 1;
+ 		break;
+ 	case RADEON_SETPARAM_NEW_MEMMAP:
++		if (drm_core_check_feature(dev, DRIVER_MODESET))
++			return 0;
+ 		dev_priv->new_memmap = sp->value;
+ 		break;
+ 	case RADEON_SETPARAM_PCIGART_TABLE_SIZE:
++		if (drm_core_check_feature(dev, DRIVER_MODESET))
++			return 0;
++
+ 		dev_priv->gart_info.table_size = sp->value;
+ 		if (dev_priv->gart_info.table_size < RADEON_PCIGART_TABLE_SIZE)
+ 			dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
+@@ -3101,6 +3154,14 @@ static int radeon_cp_setparam(struct drm_device *dev, void *data, struct drm_fil
  	case RADEON_SETPARAM_VBLANK_CRTC:
  		return radeon_vblank_crtc_set(dev, sp->value);
  		break;
 +	case RADEON_SETPARAM_MM_INIT:
++		if (drm_core_check_feature(dev, DRIVER_MODESET))
++			return 0;
++
 +		dev_priv->new_memmap = true;
 +		dev_priv->user_mm_enable = true;
 +		return radeon_gem_mm_init(dev);
@@ -41929,7 +42024,7 @@
  	default:
  		DRM_DEBUG("Invalid parameter %d\n", sp->param);
  		return -EINVAL;
-@@ -3129,14 +3173,6 @@ void radeon_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
+@@ -3129,14 +3190,6 @@ void radeon_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
  
  void radeon_driver_lastclose(struct drm_device *dev)
  {
@@ -41944,7 +42039,7 @@
  	radeon_do_release(dev);
  }
  
-@@ -3197,7 +3233,20 @@ struct drm_ioctl_desc radeon_ioctls[] = {
+@@ -3197,7 +3250,20 @@ struct drm_ioctl_desc radeon_ioctls[] = {
  	DRM_IOCTL_DEF(DRM_RADEON_IRQ_WAIT, radeon_irq_wait, DRM_AUTH),
  	DRM_IOCTL_DEF(DRM_RADEON_SETPARAM, radeon_cp_setparam, DRM_AUTH),
  	DRM_IOCTL_DEF(DRM_RADEON_SURF_ALLOC, radeon_surface_alloc, DRM_AUTH),
@@ -42074,7 +42169,7 @@
   * Device specific ioctls should only be in their respective headers
   * The device specific ioctl range is from 0x40 to 0x99.
 diff --git a/include/drm/drmP.h b/include/drm/drmP.h
-index 28c7f16..c750fe9 100644
+index d5e8e5c..339216f 100644
 --- a/include/drm/drmP.h
 +++ b/include/drm/drmP.h
 @@ -87,6 +87,7 @@ struct drm_device;
@@ -42373,7 +42468,7 @@
  				/* Misc. IOCTL support (drm_ioctl.h) */
  extern int drm_irq_by_busid(struct drm_device *dev, void *data,
  			    struct drm_file *file_priv);
-@@ -1185,9 +1284,17 @@ extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size
+@@ -1186,9 +1285,17 @@ extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size
  extern int drm_agp_free_memory(DRM_AGP_MEM * handle);
  extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);
  extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle);
@@ -42391,7 +42486,7 @@
  extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
  		       struct drm_driver *driver);
  extern int drm_put_dev(struct drm_device *dev);
-@@ -1219,6 +1326,8 @@ extern int drm_ati_pcigart_init(struct drm_device *dev,
+@@ -1220,6 +1327,8 @@ extern int drm_ati_pcigart_init(struct drm_device *dev,
  				struct drm_ati_pcigart_info * gart_info);
  extern int drm_ati_pcigart_cleanup(struct drm_device *dev,
  				   struct drm_ati_pcigart_info * gart_info);
@@ -42400,7 +42495,7 @@
  
  extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
  				       size_t align, dma_addr_t maxaddr);
-@@ -1230,7 +1339,11 @@ struct drm_sysfs_class;
+@@ -1231,7 +1340,11 @@ struct drm_sysfs_class;
  extern struct class *drm_sysfs_create(struct module *owner, char *name);
  extern void drm_sysfs_destroy(void);
  extern int drm_sysfs_device_add(struct drm_minor *minor);
@@ -42412,7 +42507,7 @@
  
  /*
   * Basic memory manager support (drm_mm.c)
-@@ -1368,6 +1481,39 @@ extern void drm_free(void *pt, size_t size, int area);
+@@ -1369,6 +1482,39 @@ extern void drm_free(void *pt, size_t size, int area);
  extern void *drm_calloc(size_t nmemb, size_t size, int area);
  #endif
  

drm-next.patch:

Index: drm-next.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/drm-next.patch,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- drm-next.patch	18 Nov 2008 07:09:47 -0000	1.8
+++ drm-next.patch	27 Nov 2008 01:44:43 -0000	1.9
@@ -1,3 +1,94 @@
+commit 1d44bed6f4ddd05022eeeb7e3bd4125bf1de22b4
+Author: Peng Li <peng.li at intel.com>
+Date:   Tue Nov 18 12:39:02 2008 +0800
+
+    drm/i915: Save/restore HWS_PGA on suspend/resume
+    
+    It fixes suspend/resume failure of xf86-video-intel dri2
+    branch. As dri2 branch doesn't call I830DRIResume() to restore
+    hardware status page anymore, we need to preserve
+    this register across suspend/resume.
+    
+    Signed-off-by: Peng Li <peng.li at intel.com>
+    Signed-off-by: Eric Anholt <eric at anholt.net>
+    Signed-off-by: Dave Airlie <airlied at redhat.com>
+    (cherry picked from commit 461cba2d294fe83297edf8a6556912812903dce1)
+
+commit a538ff2ea6684d60c8ddb1c59991702c4d923ef6
+Author: Keith Packard <keithp at keithp.com>
+Date:   Tue Nov 18 09:30:25 2008 -0800
+
+    drm: move drm vblank initialization/cleanup to driver load/unload
+    
+    drm vblank initialization keeps track of the changes in driver-supplied
+    frame counts across vt switch and mode setting, but only if you let it by
+    not tearing down the drm vblank structure.
+    
+    Signed-off-by: Keith Packard <keithp at keithp.com>
+    Signed-off-by: Dave Airlie <airlied at redhat.com>
+    (cherry picked from commit 52440211dcdc52c0b757f8b34d122e11b12cdd50)
+
+commit c90540c605e1ae1755c6a25c3428503939e09e2e
+Author: Keith Packard <keithp at keithp.com>
+Date:   Thu Nov 20 23:14:48 2008 -0800
+
+    drm/i915: execbuffer pins objects, no need to ensure they're still in the GTT
+    
+    Before we had the notion of pinning objects, we had a kludge around to make
+    sure all of the objects were still resident in the GTT before we committed
+    to executing a batch buffer. We don't need this any longer, and it sticks an
+    error return in the middle of object domain computations that must be
+    associated with a subsequent flush/invalidate emmission into the ring.
+    
+    Signed-off-by: Keith Packard <keithp at keithp.com>
+    Signed-off-by: Eric Anholt <eric at anholt.net>
+    Signed-off-by: Dave Airlie <airlied at redhat.com>
+    (cherry picked from commit 6133047aa64d2fd5b3b79dff74f696ded45615b2)
+
+commit 8807db3522abff3fc9bb6f1e1e77877293fd4d7c
+Author: Keith Packard <keithp at keithp.com>
+Date:   Wed Nov 19 14:03:05 2008 -0800
+
+    drm/i915: Always read pipestat in irq_handler
+    
+    Because we write pipestat before iir, it's possible that a pipestat
+    interrupt will occur between the pipestat write and the iir write. This
+    leaves pipestat with an interrupt status not visible in iir. This may cause
+    an interrupt flood as we never clear the pipestat event.
+    
+    Signed-off-by: Keith Packard <keithp at keithp.com>
+    Signed-off-by: Eric Anholt <eric at anholt.net>
+    Signed-off-by: Dave Airlie <airlied at redhat.com>
+    (cherry picked from commit 05eff845a28499762075d3a72e238a31f4d2407c)
+
+commit 1b2b03fc17b01658f142c77473b80d2b239050c5
+Author: Keith Packard <keithp at keithp.com>
+Date:   Thu Nov 20 22:54:54 2008 -0800
+
+    drm/i915: Subtract total pinned bytes from available aperture size
+    
+    The old code was wandering through the active list looking for pinned
+    buffers; there may be other pinned buffers around. Fortunately, we keep a
+    count of the total amount of pinned memory and can use that instead.
+    
+    Signed-off-by: Keith Packard <keithp at keithp.com>
+    Signed-off-by: Eric Anholt <eric at anholt.net>
+    Signed-off-by: Dave Airlie <airlied at redhat.com>
+    (cherry picked from commit 2678d9d6964b29ecd1975870c7a850242b29bc5c)
+
+commit 9cf12f18923a92772248792c7f0244947b5dad9d
+Author: Eric Anholt <eric at anholt.net>
+Date:   Thu Nov 13 15:00:55 2008 -0800
+
+    drm/i915: Avoid BUG_ONs on VT switch with a wedged chipset.
+    
+    Instead, just warn that bad things are happening and do our best to clean up
+    the mess without the GPU's help.
+    
+    Signed-off-by: Eric Anholt <eric at anholt.net>
+    Signed-off-by: Dave Airlie <airlied at redhat.com>
+    (cherry picked from commit 28dfe52a6e8a1495067c4331358700a170d0ee86)
+
 commit 44078e77a4901e91836b5f9f0fae28d8fac2a17d
 Author: Keith Packard <keithp at keithp.com>
 Date:   Fri Jun 20 00:08:06 2008 -0700
@@ -1406,7 +1497,7 @@
  					 DRM_MEM_BUFS);
  		} else
 diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
-index 452c2d8..3ab1e9c 100644
+index 452c2d8..996097a 100644
 --- a/drivers/gpu/drm/drm_drv.c
 +++ b/drivers/gpu/drm/drm_drv.c
 @@ -116,7 +116,13 @@ static struct drm_ioctl_desc drm_ioctls[] = {
@@ -1444,6 +1535,15 @@
  			/* stealth mode requires a manual probe */
  			pci_dev_get(pdev);
  			drm_get_dev(pdev, pid, driver);
+@@ -291,6 +305,8 @@ static void drm_cleanup(struct drm_device * dev)
+ 		return;
+ 	}
+ 
++	drm_vblank_cleanup(dev);
++
+ 	drm_lastclose(dev);
+ 
+ 	if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
 diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
 index 851a53f..0d46627 100644
 --- a/drivers/gpu/drm/drm_fops.c
@@ -1964,7 +2064,7 @@
  };
  
 diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
-index 53f0e5a..15c8dab 100644
+index 53f0e5a..1e787f8 100644
 --- a/drivers/gpu/drm/drm_irq.c
 +++ b/drivers/gpu/drm/drm_irq.c
 @@ -63,7 +63,7 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
@@ -2003,7 +2103,7 @@
 +	}
 +}
 +
-+static void drm_vblank_cleanup(struct drm_device *dev)
++void drm_vblank_cleanup(struct drm_device *dev)
 +{
 +	/* Bail if the driver didn't call drm_vblank_init() */
 +	if (dev->num_crtcs == 0)
@@ -2169,7 +2269,7 @@
  
  /**
   * Uninstall the IRQ handler.
-@@ -164,17 +272,16 @@ int drm_irq_uninstall(struct drm_device * dev)
+@@ -164,17 +272,14 @@ int drm_irq_uninstall(struct drm_device * dev)
  	if (!irq_enabled)
  		return -EINVAL;
  
@@ -2179,10 +2279,9 @@
  	dev->driver->irq_uninstall(dev);
  
 -	free_irq(dev->irq, dev);
-+	free_irq(dev->pdev->irq, dev);
- 
+-
 -	dev->locked_tasklet_func = NULL;
-+	drm_vblank_cleanup(dev);
++	free_irq(dev->pdev->irq, dev);
  
  	return 0;
  }
@@ -2190,7 +2289,7 @@
  EXPORT_SYMBOL(drm_irq_uninstall);
  
  /**
-@@ -201,7 +308,7 @@ int drm_control(struct drm_device *dev, void *data,
+@@ -201,7 +306,7 @@ int drm_control(struct drm_device *dev, void *data,
  		if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
  			return 0;
  		if (dev->if_version < DRM_IF_VERSION(1, 2) &&
@@ -2199,7 +2298,7 @@
  			return -EINVAL;
  		return drm_irq_install(dev);
  	case DRM_UNINST_HANDLER:
-@@ -214,6 +321,174 @@ int drm_control(struct drm_device *dev, void *data,
+@@ -214,6 +319,174 @@ int drm_control(struct drm_device *dev, void *data,
  }
  
  /**
@@ -2374,7 +2473,7 @@
   * Wait for VBLANK.
   *
   * \param inode device inode.
-@@ -232,14 +507,14 @@ int drm_control(struct drm_device *dev, void *data,
+@@ -232,14 +505,14 @@ int drm_control(struct drm_device *dev, void *data,
   *
   * If a signal is not requested, then calls vblank_wait().
   */
@@ -2393,7 +2492,7 @@
  		return -EINVAL;
  
  	if (vblwait->request.type &
-@@ -251,13 +526,17 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -251,13 +524,17 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
  	}
  
  	flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
@@ -2415,7 +2514,7 @@
  
  	switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
  	case _DRM_VBLANK_RELATIVE:
-@@ -266,7 +545,8 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -266,7 +543,8 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
  	case _DRM_VBLANK_ABSOLUTE:
  		break;
  	default:
@@ -2425,7 +2524,7 @@
  	}
  
  	if ((flags & _DRM_VBLANK_NEXTONMISS) &&
-@@ -276,8 +556,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -276,8 +554,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
  
  	if (flags & _DRM_VBLANK_SIGNAL) {
  		unsigned long irqflags;
@@ -2435,7 +2534,7 @@
  		struct drm_vbl_sig *vbl_sig;
  
  		spin_lock_irqsave(&dev->vbl_lock, irqflags);
-@@ -298,22 +577,32 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -298,22 +575,32 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
  			}
  		}
  
@@ -2477,7 +2576,7 @@
  
  		vbl_sig->sequence = vblwait->request.sequence;
  		vbl_sig->info.si_signo = vblwait->request.signal;
-@@ -327,20 +616,29 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -327,20 +614,29 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
  
  		vblwait->reply.sequence = seq;
  	} else {
@@ -2519,7 +2618,7 @@
  	return ret;
  }
  
-@@ -348,119 +646,54 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -348,119 +644,54 @@ int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_pr
   * Send the VBLANK signals.
   *
   * \param dev DRM device.
@@ -3045,7 +3144,7 @@
  
  obj-$(CONFIG_DRM_I915)  += i915.o
 diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
-index 8897434..d08fb42 100644
+index 8897434..6508d95 100644
 --- a/drivers/gpu/drm/i915/i915_dma.c
 +++ b/drivers/gpu/drm/i915/i915_dma.c
 @@ -40,40 +40,96 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
@@ -3385,10 +3484,10 @@
  {
 -	LOCK_TEST_WITH_RETURN(dev, file_priv);
 +	int ret;
++
++	RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
  
 -	return i915_quiescent(dev);
-+	RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
-+
 +	mutex_lock(&dev->struct_mutex);
 +	ret = i915_quiescent(dev);
 +	mutex_unlock(&dev->struct_mutex);
@@ -3523,7 +3622,7 @@
  			dev_priv->status_gfx_addr);
  	DRM_DEBUG("load hws at %p\n", dev_priv->hw_status_page);
  	return 0;
-@@ -776,14 +822,40 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -776,14 +822,47 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
  	memset(dev_priv, 0, sizeof(drm_i915_private_t));
  
  	dev->dev_private = (void *)dev_priv;
@@ -3564,10 +3663,17 @@
 +
 +	spin_lock_init(&dev_priv->user_irq_lock);
 +
++	ret = drm_vblank_init(dev, I915_NUM_PIPE);
++
++	if (ret) {
++		(void) i915_driver_unload(dev);
++		return ret;
++	}
++
  	return ret;
  }
  
-@@ -791,8 +863,15 @@ int i915_driver_unload(struct drm_device *dev)
+@@ -791,8 +870,15 @@ int i915_driver_unload(struct drm_device *dev)
  {
  	struct drm_i915_private *dev_priv = dev->dev_private;
  
@@ -3585,7 +3691,7 @@
  
  	drm_free(dev->dev_private, sizeof(drm_i915_private_t),
  		 DRM_MEM_DRIVER);
-@@ -800,6 +879,25 @@ int i915_driver_unload(struct drm_device *dev)
+@@ -800,6 +886,25 @@ int i915_driver_unload(struct drm_device *dev)
  	return 0;
  }
  
@@ -3611,7 +3717,7 @@
  void i915_driver_lastclose(struct drm_device * dev)
  {
  	drm_i915_private_t *dev_priv = dev->dev_private;
-@@ -807,6 +905,8 @@ void i915_driver_lastclose(struct drm_device * dev)
+@@ -807,6 +912,8 @@ void i915_driver_lastclose(struct drm_device * dev)
  	if (!dev_priv)
  		return;
  
@@ -3620,7 +3726,7 @@
  	if (dev_priv->agp_heap)
  		i915_mem_takedown(&(dev_priv->agp_heap));
  
-@@ -819,6 +919,13 @@ void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
+@@ -819,6 +926,13 @@ void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
  	i915_mem_release(dev, file_priv, dev_priv->agp_heap);
  }
  
@@ -3634,7 +3740,7 @@
  struct drm_ioctl_desc i915_ioctls[] = {
  	DRM_IOCTL_DEF(DRM_I915_INIT, i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
  	DRM_IOCTL_DEF(DRM_I915_FLUSH, i915_flush_ioctl, DRM_AUTH),
-@@ -836,7 +943,24 @@ struct drm_ioctl_desc i915_ioctls[] = {
+@@ -836,7 +950,24 @@ struct drm_ioctl_desc i915_ioctls[] = {
  	DRM_IOCTL_DEF(DRM_I915_SET_VBLANK_PIPE,  i915_vblank_pipe_set, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
  	DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE,  i915_vblank_pipe_get, DRM_AUTH ),
  	DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
@@ -4195,7 +4301,7 @@
  	.fops = {
  		 .owner = THIS_MODULE,
 diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
-index d7326d9..ed1edcf 100644
+index d7326d9..0a4f39b 100644
 --- a/drivers/gpu/drm/i915/i915_drv.h
 +++ b/drivers/gpu/drm/i915/i915_drv.h
 @@ -30,6 +30,9 @@
@@ -4208,7 +4314,7 @@
  /* General customization:
   */
  
-@@ -37,7 +40,12 @@
+@@ -37,7 +40,14 @@
  
  #define DRIVER_NAME		"i915"
  #define DRIVER_DESC		"Intel Graphics"
@@ -4219,10 +4325,12 @@
 +	PIPE_A = 0,
 +	PIPE_B,
 +};
++
++#define I915_NUM_PIPE	2
  
  /* Interface history:
   *
-@@ -53,16 +61,23 @@
+@@ -53,16 +63,23 @@
  #define DRIVER_MINOR		6
  #define DRIVER_PATCHLEVEL	0
  
@@ -4248,7 +4356,7 @@
  } drm_i915_ring_buffer_t;
  
  struct mem_block {
-@@ -73,16 +88,24 @@ struct mem_block {
+@@ -73,16 +90,24 @@ struct mem_block {
  	struct drm_file *file_priv; /* NULL: free, -1: heap, other: real files */
  };
  
@@ -4280,7 +4388,7 @@
  
  	drm_i915_sarea_t *sarea_priv;
  	drm_i915_ring_buffer_t ring;
-@@ -90,20 +113,26 @@ typedef struct drm_i915_private {
+@@ -90,20 +115,26 @@ typedef struct drm_i915_private {
  	drm_dma_handle_t *status_page_dmah;
  	void *hw_status_page;
  	dma_addr_t dma_status_page;
@@ -4310,7 +4418,7 @@
  
  	int tex_lru_log_granularity;
  	int allow_batchbuffer;
-@@ -111,15 +140,14 @@ typedef struct drm_i915_private {
+@@ -111,15 +142,15 @@ typedef struct drm_i915_private {
  	unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
  	int vblank_pipe;
  
@@ -4325,10 +4433,11 @@
  	u32 saveDSPBCNTR;
  	u32 saveDSPARB;
 +	u32 saveRENDERSTANDBY;
++	u32 saveHWS;
  	u32 savePIPEACONF;
  	u32 savePIPEBCONF;
  	u32 savePIPEASRC;
-@@ -139,7 +167,7 @@ typedef struct drm_i915_private {
+@@ -139,7 +170,7 @@ typedef struct drm_i915_private {
  	u32 saveDSPASTRIDE;
  	u32 saveDSPASIZE;
  	u32 saveDSPAPOS;
@@ -4337,7 +4446,7 @@
  	u32 saveDSPASURF;
  	u32 saveDSPATILEOFF;
  	u32 savePFIT_PGM_RATIOS;
-@@ -160,24 +188,24 @@ typedef struct drm_i915_private {
+@@ -160,24 +191,24 @@ typedef struct drm_i915_private {
  	u32 saveDSPBSTRIDE;
  	u32 saveDSPBSIZE;
  	u32 saveDSPBPOS;
@@ -4369,7 +4478,7 @@
  	u32 savePFIT_CONTROL;
  	u32 save_palette_a[256];
  	u32 save_palette_b[256];
-@@ -190,7 +218,7 @@ typedef struct drm_i915_private {
+@@ -190,7 +221,7 @@ typedef struct drm_i915_private {
  	u32 saveIMR;
  	u32 saveCACHE_MODE_0;
  	u32 saveD_STATE;
@@ -4378,7 +4487,7 @@
  	u32 saveMI_ARB_STATE;
  	u32 saveSWF0[16];
  	u32 saveSWF1[16];
-@@ -203,8 +231,179 @@ typedef struct drm_i915_private {
+@@ -203,8 +234,179 @@ typedef struct drm_i915_private {
  	u8 saveDACMASK;
  	u8 saveDACDATA[256*3]; /* 256 3-byte colors */
  	u8 saveCR[37];
@@ -4558,7 +4667,7 @@
  extern struct drm_ioctl_desc i915_ioctls[];
  extern int i915_max_ioctl;
  
-@@ -212,31 +411,48 @@ extern int i915_max_ioctl;
+@@ -212,31 +414,48 @@ extern int i915_max_ioctl;
  extern void i915_kernel_lost_context(struct drm_device * dev);
  extern int i915_driver_load(struct drm_device *, unsigned long flags);
  extern int i915_driver_unload(struct drm_device *);
@@ -4610,7 +4719,7 @@
  
  /* i915_mem.c */
  extern int i915_mem_alloc(struct drm_device *dev, void *data,
-@@ -250,11 +466,108 @@ extern int i915_mem_destroy_heap(struct drm_device *dev, void *data,
+@@ -250,11 +469,108 @@ extern int i915_mem_destroy_heap(struct drm_device *dev, void *data,
  extern void i915_mem_takedown(struct mem_block **heap);
  extern void i915_mem_release(struct drm_device * dev,
  			     struct drm_file *file_priv, struct mem_block *heap);
@@ -4723,7 +4832,7 @@
  
  #define I915_VERBOSE 0
  
-@@ -284,816 +597,30 @@ extern void i915_mem_release(struct drm_device * dev,
+@@ -284,816 +600,30 @@ extern void i915_mem_release(struct drm_device * dev,
  	if (I915_VERBOSE) DRM_DEBUG("ADVANCE_LP_RING %x\n", outring);	\
  	dev_priv->ring.tail = outring;					\
  	dev_priv->ring.space -= outcount * 4;				\
@@ -5557,7 +5666,7 @@
  
  #define IS_I830(dev) ((dev)->pci_device == 0x3577)
  #define IS_845G(dev) ((dev)->pci_device == 0x2562)
-@@ -1119,7 +646,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
+@@ -1119,7 +649,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
  
  #define IS_I965GM(dev) ((dev)->pci_device == 0x2A02)
  
@@ -5566,7 +5675,7 @@
  
  #define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
  		     (dev)->pci_device == 0x2E12 || \
-@@ -1133,9 +660,9 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
+@@ -1133,9 +663,9 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
  		      IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev))
  
  #define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \
@@ -5580,10 +5689,10 @@
  
 diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
 new file mode 100644
-index 0000000..6b4a2bd
+index 0000000..54bb0d0
 --- /dev/null
 +++ b/drivers/gpu/drm/i915/i915_gem.c
-@@ -0,0 +1,2576 @@
+@@ -0,0 +1,2584 @@
 +/*
 + * Copyright © 2008 Intel Corporation
 + *
@@ -5617,6 +5726,8 @@
 +#include "i915_drv.h"
 +#include <linux/swap.h>
 +
++#define I915_GEM_GPU_DOMAINS	(~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT))
++
 +static int
 +i915_gem_object_set_domain(struct drm_gem_object *obj,
 +			    uint32_t read_domains,
@@ -5669,20 +5780,14 @@
 +i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
 +			    struct drm_file *file_priv)
 +{
-+	drm_i915_private_t *dev_priv = dev->dev_private;
 +	struct drm_i915_gem_get_aperture *args = data;
-+	struct drm_i915_gem_object *obj_priv;
 +
 +	if (!(dev->driver->driver_features & DRIVER_GEM))
 +		return -ENODEV;
 +
 +	args->aper_size = dev->gtt_total;
-+	args->aper_available_size = args->aper_size;
-+
-+	list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) {
-+		if (obj_priv->pin_count > 0)
-+			args->aper_available_size -= obj_priv->obj->size;
-+	}
++	args->aper_available_size = (args->aper_size -
++				     atomic_read(&dev->pin_memory));
 +
 +	return 0;
 +}
@@ -7456,17 +7561,6 @@
 +
 +	for (i = 0; i < args->buffer_count; i++) {
 +		struct drm_gem_object *obj = object_list[i];
-+		struct drm_i915_gem_object *obj_priv = obj->driver_private;
-+
-+		if (obj_priv->gtt_space == NULL) {
-+			/* We evicted the buffer in the process of validating
-+			 * our set of buffers in.  We could try to recover by
-+			 * kicking them everything out and trying again from
-+			 * the start.
-+			 */
-+			ret = -ENOMEM;
-+			goto err;
-+		}
 +
 +		/* make sure all previous memory operations have passed */
 +		ret = i915_gem_object_set_domain(obj,
@@ -7885,29 +7979,52 @@
 +
 +	i915_gem_retire_requests(dev);
 +
-+	/* Active and flushing should now be empty as we've
-+	 * waited for a sequence higher than any pending execbuffer
-+	 */
-+	BUG_ON(!list_empty(&dev_priv->mm.active_list));
-+	BUG_ON(!list_empty(&dev_priv->mm.flushing_list));
++	if (!dev_priv->mm.wedged) {
++		/* Active and flushing should now be empty as we've
++		 * waited for a sequence higher than any pending execbuffer
++		 */
++		WARN_ON(!list_empty(&dev_priv->mm.active_list));
++		WARN_ON(!list_empty(&dev_priv->mm.flushing_list));
++		/* Request should now be empty as we've also waited
++		 * for the last request in the list
++		 */
++		WARN_ON(!list_empty(&dev_priv->mm.request_list));
++	}
 +
-+	/* Request should now be empty as we've also waited
-+	 * for the last request in the list
++	/* Empty the active and flushing lists to inactive.  If there's
++	 * anything left at this point, it means that we're wedged and
++	 * nothing good's going to happen by leaving them there.  So strip
++	 * the GPU domains and just stuff them onto inactive.
 +	 */
-+	BUG_ON(!list_empty(&dev_priv->mm.request_list));
++	while (!list_empty(&dev_priv->mm.active_list)) {
++		struct drm_i915_gem_object *obj_priv;
 +
-+	/* Move all buffers out of the GTT. */
++		obj_priv = list_first_entry(&dev_priv->mm.active_list,
++					    struct drm_i915_gem_object,
++					    list);
++		obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS;
++		i915_gem_object_move_to_inactive(obj_priv->obj);
++	}
++
++	while (!list_empty(&dev_priv->mm.flushing_list)) {
++		struct drm_i915_gem_object *obj_priv;
++
++		obj_priv = list_first_entry(&dev_priv->mm.active_list,
++					    struct drm_i915_gem_object,
++					    list);
++		obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS;
++		i915_gem_object_move_to_inactive(obj_priv->obj);
++	}
++
++
++	/* Move all inactive buffers out of the GTT. */
 +	ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list);
++	WARN_ON(!list_empty(&dev_priv->mm.inactive_list));
 +	if (ret) {
 +		mutex_unlock(&dev->struct_mutex);
 +		return ret;
 +	}
 +
-+	BUG_ON(!list_empty(&dev_priv->mm.active_list));
-+	BUG_ON(!list_empty(&dev_priv->mm.flushing_list));
-+	BUG_ON(!list_empty(&dev_priv->mm.inactive_list));
-+	BUG_ON(!list_empty(&dev_priv->mm.request_list));
-+
 +	i915_gem_cleanup_ringbuffer(dev);
 +	mutex_unlock(&dev->struct_mutex);
 +
@@ -8972,10 +9089,10 @@
 +	return 0;
 +}
 diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
-index df03611..654d42f 100644
+index df03611..fe3d9cc 100644
 --- a/drivers/gpu/drm/i915/i915_irq.c
 +++ b/drivers/gpu/drm/i915/i915_irq.c
-@@ -31,260 +31,220 @@
+@@ -31,262 +31,239 @@
  #include "i915_drm.h"
  #include "i915_drv.h"
  
@@ -9108,23 +9225,9 @@
 +}
  
 -	spin_unlock(&dev_priv->swaps_lock);
-+static inline u32
-+i915_pipestat(int pipe)
-+{
-+	if (pipe == 0)
-+		return PIPEASTAT;
-+	if (pipe == 1)
-+		return PIPEBSTAT;
-+	BUG_ON(1);
-+}
- 
+-
 -	i915_kernel_lost_context(dev);
-+void
-+i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
-+{
-+	if ((dev_priv->pipestat[pipe] & mask) != mask) {
-+		u32 reg = i915_pipestat(pipe);
- 
+-
 -	if (IS_I965G(dev)) {
 -		BEGIN_LP_RING(4);
 -
@@ -9135,14 +9238,28 @@
 -		ADVANCE_LP_RING();
 -	} else {
 -		BEGIN_LP_RING(6);
--
++static inline u32
++i915_pipestat(int pipe)
++{
++	if (pipe == 0)
++		return PIPEASTAT;
++	if (pipe == 1)
++		return PIPEBSTAT;
++	BUG_ON(1);
++}
+ 
 -		OUT_RING(GFX_OP_DRAWRECT_INFO);
 -		OUT_RING(0);
 -		OUT_RING(0);
 -		OUT_RING(sarea_priv->width | sarea_priv->height << 16);
 -		OUT_RING(sarea_priv->width | sarea_priv->height << 16);
 -		OUT_RING(0);
--
++void
++i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
++{
++	if ((dev_priv->pipestat[pipe] & mask) != mask) {
++		u32 reg = i915_pipestat(pipe);
+ 
 -		ADVANCE_LP_RING();
 +		dev_priv->pipestat[pipe] |= mask;
 +		/* Enable the interrupt, clear any pending status */
@@ -9291,64 +9408,77 @@
 -	u16 temp;
 +	u32 iir, new_iir;
  	u32 pipea_stats, pipeb_stats;
++	u32 vblank_status;
++	u32 vblank_enable;
 +	int vblank = 0;
 +	unsigned long irqflags;
-+
-+	atomic_inc(&dev_priv->irq_received);
-+
-+	iir = I915_READ(IIR);
++	int irq_received;
++	int ret = IRQ_NONE;
  
 -	pipea_stats = I915_READ(I915REG_PIPEASTAT);
 -	pipeb_stats = I915_READ(I915REG_PIPEBSTAT);
-+	if (iir == 0)
-+		return IRQ_NONE;
++	atomic_inc(&dev_priv->irq_received);
  
 -	temp = I915_READ16(I915REG_INT_IDENTITY_R);
-+	do {
-+		pipea_stats = 0;
-+		pipeb_stats = 0;
++	iir = I915_READ(IIR);
+ 
+-	temp &= (USER_INT_FLAG | VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG);
++	if (IS_I965G(dev)) {
++		vblank_status = I915_START_VBLANK_INTERRUPT_STATUS;
++		vblank_enable = PIPE_START_VBLANK_INTERRUPT_ENABLE;
++	} else {
++		vblank_status = I915_VBLANK_INTERRUPT_STATUS;
++		vblank_enable = I915_VBLANK_INTERRUPT_ENABLE;
++	}
+ 
+-	DRM_DEBUG("%s flag=%08x\n", __FUNCTION__, temp);
++	for (;;) {
++		irq_received = iir != 0;
++
++		/* Can't rely on pipestat interrupt bit in iir as it might
++		 * have been cleared after the pipestat interrupt was received.
++		 * It doesn't set the bit in iir again, but it still produces
++		 * interrupts (for non-MSI).
++		 */
++		spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
++		pipea_stats = I915_READ(PIPEASTAT);
++		pipeb_stats = I915_READ(PIPEBSTAT);
 +		/*
 +		 * Clear the PIPE(A|B)STAT regs before the IIR
 +		 */
-+		if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) {
-+			spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
-+			pipea_stats = I915_READ(PIPEASTAT);
++		if (pipea_stats & 0x8000ffff) {
 +			I915_WRITE(PIPEASTAT, pipea_stats);
-+			spin_unlock_irqrestore(&dev_priv->user_irq_lock,
-+					       irqflags);
++			irq_received = 1;
 +		}
  
--	temp &= (USER_INT_FLAG | VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG);
-+		if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) {
-+			spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
-+			pipeb_stats = I915_READ(PIPEBSTAT);
-+			I915_WRITE(PIPEBSTAT, pipeb_stats);
-+			spin_unlock_irqrestore(&dev_priv->user_irq_lock,
-+					       irqflags);
-+		}
- 
--	DRM_DEBUG("%s flag=%08x\n", __FUNCTION__, temp);
-+		I915_WRITE(IIR, iir);
-+		new_iir = I915_READ(IIR); /* Flush posted writes */
- 
 -	if (temp == 0)
 -		return IRQ_NONE;
-+		if (dev_priv->sarea_priv)
-+			dev_priv->sarea_priv->last_dispatch =
-+				READ_BREADCRUMB(dev_priv);
++		if (pipeb_stats & 0x8000ffff) {
++			I915_WRITE(PIPEBSTAT, pipeb_stats);
++			irq_received = 1;
++		}
++		spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
  
 -	I915_WRITE16(I915REG_INT_IDENTITY_R, temp);
 -	(void) I915_READ16(I915REG_INT_IDENTITY_R);
 -	DRM_READMEMORYBARRIER();
--
++		if (!irq_received)
++			break;
+ 
 -	dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
--
++		ret = IRQ_HANDLED;
+ 
 -	if (temp & USER_INT_FLAG)
 -		DRM_WAKEUP(&dev_priv->irq_queue);
--
++		I915_WRITE(IIR, iir);
++		new_iir = I915_READ(IIR); /* Flush posted writes */
+ 
 -	if (temp & (VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG)) {
 -		int vblank_pipe = dev_priv->vblank_pipe;
--
++		if (dev_priv->sarea_priv)
++			dev_priv->sarea_priv->last_dispatch =
++				READ_BREADCRUMB(dev_priv);
+ 
 -		if ((vblank_pipe &
 -		     (DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B))
 -		    == (DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B)) {
@@ -9361,10 +9491,18 @@
 -			   ((temp & VSYNC_PIPEB_FLAG) &&
 -			    (vblank_pipe & DRM_I915_VBLANK_PIPE_B)))
 -			atomic_inc(&dev->vbl_received);
--
++		if (iir & I915_USER_INTERRUPT) {
++			dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev);
++			DRM_WAKEUP(&dev_priv->irq_queue);
++		}
+ 
 -		DRM_WAKEUP(&dev->vbl_queue);
 -		drm_vbl_send_signals(dev);
--
++		if (pipea_stats & vblank_status) {
++			vblank++;
++			drm_handle_vblank(dev, 0);
++		}
+ 
 -		if (dev_priv->swaps_pending > 0)
 -			drm_locked_tasklet(dev, i915_vblank_tasklet);
 -		I915_WRITE(I915REG_PIPEASTAT,
@@ -9373,18 +9511,7 @@
 -		I915_WRITE(I915REG_PIPEBSTAT,
 -			pipeb_stats|I915_VBLANK_INTERRUPT_ENABLE|
 -			I915_VBLANK_CLEAR);
--	}
-+		if (iir & I915_USER_INTERRUPT) {
-+			dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev);
-+			DRM_WAKEUP(&dev_priv->irq_queue);
-+		}
-+
-+		if (pipea_stats & I915_VBLANK_INTERRUPT_STATUS) {
-+			vblank++;
-+			drm_handle_vblank(dev, 0);
-+		}
-+
-+		if (pipeb_stats & I915_VBLANK_INTERRUPT_STATUS) {
++		if (pipeb_stats & vblank_status) {
 +			vblank++;
 +			drm_handle_vblank(dev, 1);
 +		}
@@ -9409,11 +9536,14 @@
 +		 * stray interrupts.
 +		 */
 +		iir = new_iir;
-+	} while (iir != 0);
+ 	}
  
- 	return IRQ_HANDLED;
+-	return IRQ_HANDLED;
++	return ret;
  }
-@@ -298,23 +258,45 @@ static int i915_emit_irq(struct drm_device * dev)
+ 
+ static int i915_emit_irq(struct drm_device * dev)
+@@ -298,23 +275,45 @@ static int i915_emit_irq(struct drm_device * dev)
  
  	DRM_DEBUG("\n");
  
@@ -9468,7 +9598,7 @@
  static int i915_wait_irq(struct drm_device * dev, int irq_nr)
  {
  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-@@ -323,55 +305,34 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
+@@ -323,55 +322,34 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
  	DRM_DEBUG("irq_nr=%d breadcrumb=%d\n", irq_nr,
  		  READ_BREADCRUMB(dev_priv));
  
@@ -9537,7 +9667,7 @@
  /* Needs the lock as it touches the ring.
   */
  int i915_irq_emit(struct drm_device *dev, void *data,
-@@ -381,14 +342,15 @@ int i915_irq_emit(struct drm_device *dev, void *data,
+@@ -381,14 +359,15 @@ int i915_irq_emit(struct drm_device *dev, void *data,
  	drm_i915_irq_emit_t *emit = data;
  	int result;
  
@@ -9555,7 +9685,7 @@
  
  	if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
  		DRM_ERROR("copy_to_user\n");
-@@ -414,18 +376,38 @@ int i915_irq_wait(struct drm_device *dev, void *data,
+@@ -414,18 +393,38 @@ int i915_irq_wait(struct drm_device *dev, void *data,
  	return i915_wait_irq(dev, irqwait->irq_seq);
  }
  
@@ -9568,12 +9698,7 @@
  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
 -	u16 flag;
 +	unsigned long irqflags;
- 
--	flag = 0;
--	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)
--		flag |= VSYNC_PIPEA_FLAG;
--	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)
--		flag |= VSYNC_PIPEB_FLAG;
++
 +	spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
 +	if (IS_I965G(dev))
 +		i915_enable_pipestat(dev_priv, pipe,
@@ -9585,7 +9710,11 @@
 +	return 0;
 +}
  
--	I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG | flag);
+-	flag = 0;
+-	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)
+-		flag |= VSYNC_PIPEA_FLAG;
+-	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)
+-		flag |= VSYNC_PIPEB_FLAG;
 +/* Called from drm generic code, passed 'crtc' which
 + * we use as a pipe index
 + */
@@ -9593,7 +9722,8 @@
 +{
 +	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
 +	unsigned long irqflags;
-+
+ 
+-	I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG | flag);
 +	spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
 +	i915_disable_pipestat(dev_priv, pipe,
 +			      PIPE_VBLANK_INTERRUPT_ENABLE |
@@ -9602,7 +9732,7 @@
  }
  
  /* Set the vblank monitor pipe
-@@ -434,22 +416,12 @@ int i915_vblank_pipe_set(struct drm_device *dev, void *data,
+@@ -434,22 +433,12 @@ int i915_vblank_pipe_set(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv)
  {
  	drm_i915_private_t *dev_priv = dev->dev_private;
@@ -9625,7 +9755,7 @@
  	return 0;
  }
  
-@@ -458,19 +430,13 @@ int i915_vblank_pipe_get(struct drm_device *dev, void *data,
+@@ -458,19 +447,13 @@ int i915_vblank_pipe_get(struct drm_device *dev, void *data,
  {
  	drm_i915_private_t *dev_priv = dev->dev_private;
  	drm_i915_vblank_pipe_t *pipe = data;
@@ -9646,7 +9776,7 @@
  
  	return 0;
  }
-@@ -481,104 +447,21 @@ int i915_vblank_pipe_get(struct drm_device *dev, void *data,
+@@ -481,104 +464,21 @@ int i915_vblank_pipe_get(struct drm_device *dev, void *data,
  int i915_vblank_swap(struct drm_device *dev, void *data,
  		     struct drm_file *file_priv)
  {
@@ -9766,7 +9896,7 @@
  }
  
  /* drm_dma.h hooks
-@@ -587,37 +470,65 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
+@@ -587,37 +487,60 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
  {
  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
  
@@ -9785,22 +9915,17 @@
 +int i915_driver_irq_postinstall(struct drm_device *dev)
  {
  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-+	int ret, num_pipes = 2;
-+
-+	ret = drm_vblank_init(dev, num_pipes);
-+	if (ret)
-+		return ret;
-+
+ 
+-	spin_lock_init(&dev_priv->swaps_lock);
+-	INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
+-	dev_priv->swaps_pending = 0;
 +	dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
 +
 +	dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
 +
 +	/* Unmask the interrupts that we always want on. */
 +	dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX;
- 
--	spin_lock_init(&dev_priv->swaps_lock);
--	INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
--	dev_priv->swaps_pending = 0;
++
 +	dev_priv->pipestat[0] = 0;
 +	dev_priv->pipestat[1] = 0;
  
@@ -11651,10 +11776,10 @@
 +#endif /* _I915_REG_H_ */
 diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
 new file mode 100644
-index 0000000..5ddc6e5
+index 0000000..5d84027
 --- /dev/null
 +++ b/drivers/gpu/drm/i915/i915_suspend.c
-@@ -0,0 +1,518 @@
+@@ -0,0 +1,524 @@
 +/*
 + *
 + * Copyright 2008 (c) Intel Corporation
@@ -11901,6 +12026,9 @@
 +	if (IS_I965G(dev) && IS_MOBILE(dev))
 +		dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY);
 +
++	/* Hardware status page */
++	dev_priv->saveHWS = I915_READ(HWS_PGA);
++
 +	/* Display arbitration control */
 +	dev_priv->saveDSPARB = I915_READ(DSPARB);
 +
@@ -12030,6 +12158,9 @@
 +	if (IS_I965G(dev) && IS_MOBILE(dev))
 +		I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY);
 +
++	/* Hardware status page */
++	I915_WRITE(HWS_PGA, dev_priv->saveHWS);
++
 +	/* Display arbitration */
 +	I915_WRITE(DSPARB, dev_priv->saveDSPARB);
 +
@@ -12173,6 +12304,32 @@
 +	return 0;
 +}
 +
+diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c
+index c1d12db..b49c5ff 100644
+--- a/drivers/gpu/drm/mga/mga_dma.c
++++ b/drivers/gpu/drm/mga/mga_dma.c
+@@ -396,6 +396,7 @@ int mga_freelist_put(struct drm_device * dev, struct drm_buf * buf)
+ int mga_driver_load(struct drm_device * dev, unsigned long flags)
+ {
+ 	drm_mga_private_t *dev_priv;
++	int ret;
+ 
+ 	dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER);
+ 	if (!dev_priv)
+@@ -415,6 +416,13 @@ int mga_driver_load(struct drm_device * dev, unsigned long flags)
+ 	dev->types[7] = _DRM_STAT_PRIMARY;
+ 	dev->types[8] = _DRM_STAT_SECONDARY;
+ 
++	ret = drm_vblank_init(dev, 1);
++
++	if (ret) {
++		(void) mga_driver_unload(dev);
++		return ret;
++	}
++
+ 	return 0;
+ }
+ 
 diff --git a/drivers/gpu/drm/mga/mga_drv.c b/drivers/gpu/drm/mga/mga_drv.c
 index 5572939..97ee566 100644
 --- a/drivers/gpu/drm/mga/mga_drv.c
@@ -12258,7 +12415,7 @@
  extern long mga_compat_ioctl(struct file *filp, unsigned int cmd,
  			     unsigned long arg);
 diff --git a/drivers/gpu/drm/mga/mga_irq.c b/drivers/gpu/drm/mga/mga_irq.c
-index 9302cb8..bab42f4 100644
+index 9302cb8..daa6041 100644
 --- a/drivers/gpu/drm/mga/mga_irq.c
 +++ b/drivers/gpu/drm/mga/mga_irq.c
 @@ -1,5 +1,6 @@
@@ -12362,7 +12519,7 @@
  }
  
  int mga_driver_fence_wait(struct drm_device * dev, unsigned int *sequence)
-@@ -125,14 +149,22 @@ void mga_driver_irq_preinstall(struct drm_device * dev)
+@@ -125,14 +149,17 @@ void mga_driver_irq_preinstall(struct drm_device * dev)
  	MGA_WRITE(MGA_ICLEAR, ~0);
  }
  
@@ -12370,11 +12527,6 @@
 +int mga_driver_irq_postinstall(struct drm_device *dev)
  {
  	drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-+	int ret;
-+
-+	ret = drm_vblank_init(dev, 1);
-+	if (ret)
-+		return ret;
  
  	DRM_INIT_WAITQUEUE(&dev_priv->fence_queue);
  
@@ -12402,10 +12554,10 @@
  	case MGA_PARAM_CARD_TYPE:
  		value = dev_priv->chipset;
 diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c
-index 6108e75..3265d53 100644
+index 6108e75..601f4c0 100644
 --- a/drivers/gpu/drm/r128/r128_drv.c
 +++ b/drivers/gpu/drm/r128/r128_drv.c
-@@ -43,12 +43,13 @@ static struct pci_device_id pciidlist[] = {
+@@ -43,12 +43,14 @@ static struct pci_device_id pciidlist[] = {
  static struct drm_driver driver = {
  	.driver_features =
  	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
@@ -12413,6 +12565,7 @@
 -	    DRIVER_IRQ_VBL,
 +	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
  	.dev_priv_size = sizeof(drm_r128_buf_priv_t),
++	.load = r128_driver_load,
  	.preclose = r128_driver_preclose,
  	.lastclose = r128_driver_lastclose,
 -	.vblank_wait = r128_driver_vblank_wait,
@@ -12422,7 +12575,7 @@
  	.irq_preinstall = r128_driver_irq_preinstall,
  	.irq_postinstall = r128_driver_irq_postinstall,
  	.irq_uninstall = r128_driver_irq_uninstall,
-@@ -59,21 +60,20 @@ static struct drm_driver driver = {
+@@ -59,21 +61,20 @@ static struct drm_driver driver = {
  	.ioctls = r128_ioctls,
  	.dma_ioctl = r128_cce_buffers,
  	.fops = {
@@ -12454,7 +12607,15 @@
  	},
  
  	.name = DRIVER_NAME,
-@@ -87,6 +87,7 @@ static struct drm_driver driver = {
+@@ -84,9 +85,15 @@ static struct drm_driver driver = {
+ 	.patchlevel = DRIVER_PATCHLEVEL,
+ };
+ 
++int r128_driver_load(struct drm_device * dev, unsigned long flags)
++{
++	return drm_vblank_init(dev, 1);
++}
++
  static int __init r128_init(void)
  {
  	driver.num_ioctls = r128_max_ioctl;
@@ -12463,7 +12624,7 @@
  }
  
 diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h
-index 011105e..5898b27 100644
+index 011105e..797a26c 100644
 --- a/drivers/gpu/drm/r128/r128_drv.h
 +++ b/drivers/gpu/drm/r128/r128_drv.h
 @@ -29,7 +29,7 @@
@@ -12484,7 +12645,7 @@
  	u32 color_fmt;
  	unsigned int front_offset;
  	unsigned int front_pitch;
-@@ -149,11 +151,12 @@ extern int r128_wait_ring(drm_r128_private_t * dev_priv, int n);
+@@ -149,13 +151,15 @@ extern int r128_wait_ring(drm_r128_private_t * dev_priv, int n);
  extern int r128_do_cce_idle(drm_r128_private_t * dev_priv);
  extern int r128_do_cleanup_cce(struct drm_device * dev);
  
@@ -12499,9 +12660,12 @@
 +extern int r128_driver_irq_postinstall(struct drm_device *dev);
  extern void r128_driver_irq_uninstall(struct drm_device * dev);
  extern void r128_driver_lastclose(struct drm_device * dev);
++extern int r128_driver_load(struct drm_device * dev, unsigned long flags);
  extern void r128_driver_preclose(struct drm_device * dev,
+ 				 struct drm_file *file_priv);
+ 
 diff --git a/drivers/gpu/drm/r128/r128_irq.c b/drivers/gpu/drm/r128/r128_irq.c
-index c76fdca..d734901 100644
+index c76fdca..69810fb 100644
 --- a/drivers/gpu/drm/r128/r128_irq.c
 +++ b/drivers/gpu/drm/r128/r128_irq.c
 @@ -35,6 +35,16 @@
@@ -12586,7 +12750,7 @@
 -
 -	/* Turn on VBL interrupt */
 -	R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
-+	return drm_vblank_init(dev, 1);
++	return 0;
  }
  
  void r128_driver_irq_uninstall(struct drm_device * dev)
@@ -12604,7 +12768,7 @@
  	default:
  		return -EINVAL;
 diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c
-index 248ab4a..abdc1ae 100644
+index 248ab4a..dcebb4b 100644
 --- a/drivers/gpu/drm/radeon/radeon_cp.c
 +++ b/drivers/gpu/drm/radeon/radeon_cp.c
 @@ -71,7 +71,8 @@ static u32 RS690_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
@@ -12772,7 +12936,7 @@
  	case CHIP_RV410:
  	case CHIP_RV515:
  	case CHIP_R520:
-@@ -1727,6 +1751,12 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -1727,6 +1751,18 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  	else
  		dev_priv->flags |= RADEON_IS_PCI;
  
@@ -12782,10 +12946,16 @@
 +	if (ret != 0)
 +		return ret;
 +
++	ret = drm_vblank_init(dev, 2);
++	if (ret) {
++		radeon_driver_unload(dev);
++		return ret;
++	}
++
  	DRM_DEBUG("%s card detected\n",
  		  ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI"))));
  	return ret;
-@@ -1743,12 +1773,6 @@ int radeon_driver_firstopen(struct drm_device *dev)
+@@ -1743,12 +1779,6 @@ int radeon_driver_firstopen(struct drm_device *dev)
  
  	dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
  
@@ -12798,7 +12968,7 @@
  	dev_priv->fb_aper_offset = drm_get_resource_start(dev, 0);
  	ret = drm_addmap(dev, dev_priv->fb_aper_offset,
  			 drm_get_resource_len(dev, 0), _DRM_FRAME_BUFFER,
-@@ -1764,6 +1788,9 @@ int radeon_driver_unload(struct drm_device *dev)
+@@ -1764,6 +1794,9 @@ int radeon_driver_unload(struct drm_device *dev)
  	drm_radeon_private_t *dev_priv = dev->dev_private;
  
  	DRM_DEBUG("\n");
@@ -13018,7 +13188,7 @@
  	else								\
  		RS480_WRITE_MCIND(addr, val);				\
 diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c
-index ee40d19..5079f70 100644
+index ee40d19..97c0599 100644
 --- a/drivers/gpu/drm/radeon/radeon_irq.c
 +++ b/drivers/gpu/drm/radeon/radeon_irq.c
 @@ -27,7 +27,7 @@
@@ -13292,7 +13462,7 @@
  }
  
  /* Needs the lock as it touches the ring.
-@@ -234,46 +316,41 @@ int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_pr
+@@ -234,38 +316,24 @@ int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_pr
  	return radeon_wait_irq(dev, irqwait->irq_seq);
  }
  
@@ -13336,16 +13506,11 @@
  {
  	drm_radeon_private_t *dev_priv =
  	    (drm_radeon_private_t *) dev->dev_private;
-+	int ret;
- 
+@@ -273,7 +341,11 @@ void radeon_driver_irq_postinstall(struct drm_device * dev)
  	atomic_set(&dev_priv->swi_emitted, 0);
  	DRM_INIT_WAITQUEUE(&dev_priv->swi_queue);
  
 -	radeon_enable_interrupt(dev);
-+	ret = drm_vblank_init(dev, 2);
-+	if (ret)
-+		return ret;
-+
 +	dev->max_vblank_count = 0x001fffff;
 +
 +	radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1);
@@ -13354,7 +13519,7 @@
  }
  
  void radeon_driver_irq_uninstall(struct drm_device * dev)
-@@ -285,6 +362,8 @@ void radeon_driver_irq_uninstall(struct drm_device * dev)
+@@ -285,6 +357,8 @@ void radeon_driver_irq_uninstall(struct drm_device * dev)
  
  	dev_priv->irq_enabled = 0;
  
@@ -13363,7 +13528,7 @@
  	/* Disable *all* interrupts */
  	RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
  }
-@@ -293,18 +372,8 @@ void radeon_driver_irq_uninstall(struct drm_device * dev)
+@@ -293,18 +367,8 @@ void radeon_driver_irq_uninstall(struct drm_device * dev)
  int radeon_vblank_crtc_get(struct drm_device *dev)
  {
  	drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
@@ -13383,7 +13548,7 @@
  }
  
  int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value)
-@@ -315,6 +384,5 @@ int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value)
+@@ -315,6 +379,5 @@ int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value)
  		return -EINVAL;
  	}
  	dev_priv->vblank_crtc = (unsigned int)value;
@@ -13541,7 +13706,7 @@
  
  extern void via_dmablit_handler(struct drm_device *dev, int engine, int from_irq);
 diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c
-index c6bb978..665d319 100644
+index c6bb978..c248c1d 100644
 --- a/drivers/gpu/drm/via/via_irq.c
 +++ b/drivers/gpu/drm/via/via_irq.c
 @@ -43,7 +43,7 @@
@@ -13699,7 +13864,7 @@
  /*
   * drm_dma.h hooks
   */
-@@ -292,23 +305,25 @@ void via_driver_irq_preinstall(struct drm_device * dev)
+@@ -292,23 +305,24 @@ void via_driver_irq_preinstall(struct drm_device * dev)
  	}
  }
  
@@ -13719,7 +13884,6 @@
 +		return -EINVAL;
  
 -		/* Some magic, oh for some data sheets ! */
-+	drm_vblank_init(dev, 1);
 +	status = VIA_READ(VIA_REG_INTERRUPT);
 +	VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL
 +		  | dev_priv->irq_enable_mask);
@@ -13735,7 +13899,7 @@
  }
  
  void via_driver_irq_uninstall(struct drm_device * dev)
-@@ -339,9 +354,6 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
+@@ -339,9 +353,6 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
  	drm_via_irq_t *cur_irq = dev_priv->via_irqs;
  	int force_sequence;
  
@@ -13745,7 +13909,7 @@
  	if (irqwait->request.irq >= dev_priv->num_irqs) {
  		DRM_ERROR("Trying to wait on unknown irq %d\n",
  			  irqwait->request.irq);
-@@ -352,7 +364,8 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
+@@ -352,7 +363,8 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
  
  	switch (irqwait->request.type & ~VIA_IRQ_FLAGS_MASK) {
  	case VIA_IRQ_RELATIVE:
@@ -13755,6 +13919,29 @@
  		irqwait->request.type &= ~_DRM_VBLANK_RELATIVE;
  	case VIA_IRQ_ABSOLUTE:
  		break;
+diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c
+index a967556..2c4f0b4 100644
+--- a/drivers/gpu/drm/via/via_map.c
++++ b/drivers/gpu/drm/via/via_map.c
+@@ -107,8 +107,17 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset)
+ 	ret = drm_sman_init(&dev_priv->sman, 2, 12, 8);
+ 	if (ret) {
+ 		drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
++		return ret;
+ 	}
+-	return ret;
++
++	ret = drm_vblank_init(dev, 1);
++	if (ret) {
++		drm_sman_takedown(&dev_priv->sman);
++		drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
++		return ret;
++	}
++
++	return 0;
+ }
+ 
+ int via_driver_unload(struct drm_device *dev)
 diff --git a/drivers/gpu/drm/via/via_mm.c b/drivers/gpu/drm/via/via_mm.c
 index e640949..f694cb5 100644
 --- a/drivers/gpu/drm/via/via_mm.c
@@ -13976,7 +14163,7 @@
  #define DRM_IOCTL_SET_UNIQUE		DRM_IOW( 0x10, struct drm_unique)
  #define DRM_IOCTL_AUTH_MAGIC		DRM_IOW( 0x11, struct drm_auth)
 diff --git a/include/drm/drmP.h b/include/drm/drmP.h
-index 1c1b13e..28c7f16 100644
+index 1c1b13e..d5e8e5c 100644
 --- a/include/drm/drmP.h
 +++ b/include/drm/drmP.h
 @@ -104,6 +104,7 @@ struct drm_device;
@@ -14245,7 +14432,7 @@
  				/* Locking IOCTL support (drm_lock.h) */
  extern int drm_lock(struct drm_device *dev, void *data,
  		    struct drm_file *file_priv);
-@@ -985,16 +1137,23 @@ extern void drm_core_reclaim_buffers(struct drm_device *dev,
+@@ -985,16 +1137,24 @@ extern void drm_core_reclaim_buffers(struct drm_device *dev,
  extern int drm_control(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
  extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS);
@@ -14266,13 +14453,14 @@
 +extern void drm_handle_vblank(struct drm_device *dev, int crtc);
 +extern int drm_vblank_get(struct drm_device *dev, int crtc);
 +extern void drm_vblank_put(struct drm_device *dev, int crtc);
++extern void drm_vblank_cleanup(struct drm_device *dev);
 +/* Modesetting support */
 +extern int drm_modeset_ctl(struct drm_device *dev, void *data,
 +			   struct drm_file *file_priv);
  
  				/* AGP/GART support (drm_agpsupport.h) */
  extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
-@@ -1026,6 +1185,7 @@ extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size
+@@ -1026,6 +1186,7 @@ extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size
  extern int drm_agp_free_memory(DRM_AGP_MEM * handle);
  extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);
  extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle);
@@ -14280,7 +14468,7 @@
  
  				/* Stub support (drm_stub.h) */
  extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
-@@ -1088,6 +1248,66 @@ extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
+@@ -1088,6 +1249,66 @@ extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
  extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, unsigned long size);
  extern int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size);
  


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/kernel.spec,v
retrieving revision 1.1163
retrieving revision 1.1164
diff -u -r1.1163 -r1.1164
--- kernel.spec	25 Nov 2008 16:38:31 -0000	1.1163
+++ kernel.spec	27 Nov 2008 01:44:43 -0000	1.1164
@@ -666,12 +666,9 @@
 # nouveau + drm fixes
 Patch1800: nvidia-agp.patch
 Patch1810: drm-next.patch
-Patch1811: drm-next-intel-irq-test.patch
 Patch1813: drm-modesetting-radeon.patch
-Patch1814: drm-modesetting-i915.patch
 Patch1815: drm-nouveau.patch
 Patch1816: drm-intel-8xx-pae-no-gem.patch
-Patch1817: drm-intel-fix-vt-switch-hang.patch
 
 # kludge to make ich9 e1000 work
 Patch2000: linux-2.6-e1000-ich9.patch
@@ -1319,12 +1316,9 @@
 # Nouveau DRM + drm fixes
 ApplyPatch nvidia-agp.patch
 ApplyPatch drm-next.patch
-ApplyPatch drm-next-intel-irq-test.patch
 ApplyPatch drm-modesetting-radeon.patch
-#ApplyPatch drm-modesetting-i915.patch
 ApplyPatch drm-nouveau.patch
 ApplyPatch drm-intel-8xx-pae-no-gem.patch
-ApplyPatch drm-intel-fix-vt-switch-hang.patch
 
 # linux1394 git patches
 ApplyPatch linux-2.6-firewire-git-update.patch
@@ -1933,6 +1927,9 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* Thu Nov 27 2008 Dave Airlie <airlied at redhat.com> 2.6.27.5-128
+- drm: intel rebase with upstream fixes - radeon add larger GART size
+
 * Tue Nov 25 2008 Chuck Ebbert <cebbert at redhat.com> 2.6.27.7-127
 - Two USB patches scheduled for the next -stable release.
 


--- drm-intel-fix-vt-switch-hang.patch DELETED ---


--- drm-next-intel-irq-test.patch DELETED ---




More information about the fedora-extras-commits mailing list