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

Reply via email to