DRM_BO_FLAG_MAPPABLE | DRM_BO_FLAG_NO_EVICT,
0, 1, 0, &dev_priv->mm.ring.bo);
if (ret) {
- DRM_ERROR("failed to allocate ring\n");
+ if (dev_priv->flags & RADEON_IS_AGP)
+ DRM_ERROR("failed to allocate ring - most likely an AGP driver bug\n");
+ else
+ DRM_ERROR("failed to allocate ring\n");
return -EINVAL;
}
/* need to allocate some objects in the GART */
/* ring + ring read ptr */
ret = radeon_alloc_gart_objects(dev);
- if (ret)
+ if (ret) {
+ radeon_gem_mm_fini(dev);
return -EINVAL;
+ }
dev_priv->mm_enabled = true;
return 0;
struct drm_radeon_private *dev_priv = dev->dev_private;
drm_dma_takedown(dev);
- drm_bo_kunmap(&dev_priv->mm.dma_bufs.kmap);
- drm_bo_usage_deref_unlocked(&dev_priv->mm.dma_bufs.bo);
+ if (dev_priv->mm.dma_bufs.bo) {
+ drm_bo_kunmap(&dev_priv->mm.dma_bufs.kmap);
+ drm_bo_usage_deref_unlocked(&dev_priv->mm.dma_bufs.bo);
+ }
}
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
- radeon_gem_mm_init(dev);
+ ret = radeon_gem_mm_init(dev);
+ if (ret)
+ goto modeset_fail;
radeon_modeset_init(dev);
radeon_modeset_cp_init(dev);
return ret;
+modeset_fail:
+ dev->driver->driver_features &= ~DRIVER_MODESET;
+ drm_put_minor(&dev->control);
+ return ret;
}