Module Name: src
Committed By: mrg
Date: Sat Aug 8 17:59:25 UTC 2009
Modified Files:
src/sys/external/bsd/drm/dist/shared-core: radeon_cp.c radeon_drv.h
radeon_irq.c
Log Message:
- stash the fbmap into the radeon dev_priv handle so we can ..
- call drm_rmmap() in radeon_do_cleanup_cp on the two maps created
- in several vblank functions, check to make sure we have mappings
enabled before doing something that might blow up. fixes PR#41715.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 \
src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c \
src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h
cvs rdiff -u -r1.2 -r1.3 \
src/sys/external/bsd/drm/dist/shared-core/radeon_irq.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c
diff -u src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c:1.5 src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c:1.6
--- src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c:1.5 Sat Jun 20 01:07:10 2009
+++ src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c Sat Aug 8 17:59:25 2009
@@ -1401,6 +1401,12 @@
dev_priv->gart_info.addr = 0;
}
}
+
+ if (dev_priv->mmio)
+ drm_rmmap(dev, dev_priv->mmio);
+ if (dev_priv->fb_map)
+ drm_rmmap(dev, dev_priv->fb_map);
+
/* only clear to the start of flags */
memset(dev_priv, 0, offsetof(drm_radeon_private_t, flags));
@@ -2021,7 +2027,6 @@
int radeon_driver_firstopen(struct drm_device *dev)
{
int ret;
- drm_local_map_t *map;
drm_radeon_private_t *dev_priv = dev->dev_private;
dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
@@ -2035,7 +2040,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,
- _DRM_WRITE_COMBINING, &map);
+ _DRM_WRITE_COMBINING, &dev_priv->fb_map);
if (ret != 0)
return ret;
Index: src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h
diff -u src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h:1.5 src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h:1.6
--- src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h:1.5 Fri Jun 19 03:50:05 2009
+++ src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h Sat Aug 8 17:59:25 2009
@@ -296,6 +296,7 @@
drm_local_map_t *sarea;
drm_local_map_t *mmio;
+ drm_local_map_t *fb_map;
drm_local_map_t *cp_ring;
drm_local_map_t *ring_rptr;
drm_local_map_t *gart_textures;
Index: src/sys/external/bsd/drm/dist/shared-core/radeon_irq.c
diff -u src/sys/external/bsd/drm/dist/shared-core/radeon_irq.c:1.2 src/sys/external/bsd/drm/dist/shared-core/radeon_irq.c:1.3
--- src/sys/external/bsd/drm/dist/shared-core/radeon_irq.c:1.2 Fri Jun 19 03:50:05 2009
+++ src/sys/external/bsd/drm/dist/shared-core/radeon_irq.c Sat Aug 8 17:59:25 2009
@@ -65,6 +65,9 @@
{
drm_radeon_private_t *dev_priv = dev->dev_private;
+ if (!dev_priv->mmio)
+ return 0;
+
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) {
switch (crtc) {
case 0:
@@ -100,6 +103,9 @@
{
drm_radeon_private_t *dev_priv = dev->dev_private;
+ if (!dev_priv->mmio)
+ return;
+
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) {
switch (crtc) {
case 0:
@@ -289,6 +295,8 @@
DRM_ERROR("called with no initialization\n");
return -EINVAL;
}
+ if (!dev_priv->mmio)
+ return 0;
if (crtc < 0 || crtc > 1) {
DRM_ERROR("Invalid crtc %d\n", crtc);
@@ -322,6 +330,8 @@
DRM_ERROR("called with no initialization\n");
return -EINVAL;
}
+ if (!dev_priv->mmio)
+ return 0;
result = radeon_emit_irq(dev);
@@ -344,6 +354,8 @@
DRM_ERROR("called with no initialization\n");
return -EINVAL;
}
+ if (!dev_priv->mmio)
+ return 0;
return radeon_wait_irq(dev, irqwait->irq_seq);
}