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