From 993d387d75d59fee94d5652b84ed7a2615da6eb7 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Thu, 19 Feb 2009 12:02:37 -0500 Subject: [PATCH] radeon: make radeon_do_release() r6xx/r7xx safe --- shared-core/r600_cp.c | 2 +- shared-core/radeon_cp.c | 36 +++++++++++++++++++++++------------- shared-core/radeon_drv.h | 1 + 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/shared-core/r600_cp.c b/shared-core/r600_cp.c index a4b48577..d07620ce 100644 --- a/shared-core/r600_cp.c +++ b/shared-core/r600_cp.c @@ -2137,7 +2137,7 @@ static void r600_cp_init_ring_buffer(struct drm_device * dev, } -static int r600_do_cleanup_cp(struct drm_device * dev) +int r600_do_cleanup_cp(struct drm_device * dev) { drm_radeon_private_t *dev_priv = dev->dev_private; DRM_DEBUG("\n"); diff --git a/shared-core/radeon_cp.c b/shared-core/radeon_cp.c index c18289b0..77b7363c 100644 --- a/shared-core/radeon_cp.c +++ b/shared-core/radeon_cp.c @@ -1523,21 +1523,28 @@ void radeon_do_release(struct drm_device * dev) #endif #endif } - radeon_do_cp_stop(dev_priv); - radeon_do_engine_reset(dev); + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) { + r600_do_cp_stop(dev_priv); + r600_engine_reset(dev); + } else { + radeon_do_cp_stop(dev_priv); + radeon_do_engine_reset(dev); + } } - /* Disable *all* interrupts */ - if (dev_priv->mmio) /* remove this after permanent addmaps */ - RADEON_WRITE(RADEON_GEN_INT_CNTL, 0); + if ((dev_priv->flags & RADEON_FAMILY_MASK) < CHIP_R600) { + /* Disable *all* interrupts */ + if (dev_priv->mmio) /* remove this after permanent addmaps */ + RADEON_WRITE(RADEON_GEN_INT_CNTL, 0); - if (dev_priv->mmio) { /* remove all surfaces */ - for (i = 0; i < RADEON_MAX_SURFACES; i++) { - RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, 0); - RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND + - 16 * i, 0); - RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND + - 16 * i, 0); + if (dev_priv->mmio) { /* remove all surfaces */ + for (i = 0; i < RADEON_MAX_SURFACES; i++) { + RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, 0); + RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND + + 16 * i, 0); + RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND + + 16 * i, 0); + } } } @@ -1546,7 +1553,10 @@ void radeon_do_release(struct drm_device * dev) radeon_mem_takedown(&(dev_priv->fb_heap)); /* deallocate kernel resources */ - radeon_do_cleanup_cp(dev); + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) + r600_do_cleanup_cp(dev); + else + radeon_do_cleanup_cp(dev); } } diff --git a/shared-core/radeon_drv.h b/shared-core/radeon_drv.h index 95919522..477f0d79 100644 --- a/shared-core/radeon_drv.h +++ b/shared-core/radeon_drv.h @@ -456,6 +456,7 @@ int r600_cp_indirect(struct drm_device *dev, struct drm_buf *buf, drm_radeon_ind void r600_do_cp_stop(drm_radeon_private_t * dev_priv); int r600_engine_reset(struct drm_device * dev); void r600_do_cp_reset(drm_radeon_private_t * dev_priv); +int r600_do_cleanup_cp(struct drm_device * dev); /* Flags for stats.boxes */