drm/radeon/kms: don't fail if we fail to init GPU acceleration
authorJerome Glisse <jglisse@redhat.com>
Wed, 16 Sep 2009 13:24:21 +0000 (15:24 +0200)
committerDave Airlie <airlied@redhat.com>
Fri, 18 Sep 2009 06:01:57 +0000 (16:01 +1000)
Userspace can query if acceleration is working or not true get
info ioctl and could fallback to software if for some reason
kernel failed to initialize KMS. This should allow to give a
working KMS setup in all case (even with non functionning accel).

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/r420.c
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_kms.c
drivers/gpu/drm/radeon/rv770.c
include/drm/radeon_drm.h

index 33a25a4377b8773a99d17714f5f5bca6cd537faf..2142a47819700c6761a161a9695e60637bb8ed87 100644 (file)
@@ -329,6 +329,7 @@ int r420_init(struct radeon_device *rdev)
                        return r;
        }
        r300_set_reg_safe(rdev);
+       rdev->accel_working = true;
        r = r420_resume(rdev);
        if (r) {
                /* Somethings want wront with the accel init stop accel */
@@ -343,6 +344,7 @@ int r420_init(struct radeon_device *rdev)
                        r100_pci_gart_fini(rdev);
                radeon_agp_fini(rdev);
                radeon_irq_kms_fini(rdev);
+               rdev->accel_working = false;
        }
        return 0;
 }
index 65699e9f20252ef70c11a8ac1b4dc14c5ccde5d1..af430d719e7f8000c8798ef7c8bdd820ff4780d6 100644 (file)
@@ -1573,6 +1573,7 @@ int r600_init(struct radeon_device *rdev)
        if (r)
                return r;
 
+       rdev->accel_working = true;
        r = r600_resume(rdev);
        if (r) {
                if (rdev->flags & RADEON_IS_AGP) {
@@ -1581,22 +1582,24 @@ int r600_init(struct radeon_device *rdev)
                        rdev->flags &= ~RADEON_IS_AGP;
                        return r600_init(rdev);
                }
-               return r;
-       }
-       r = radeon_ib_pool_init(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
-               return r;
+               rdev->accel_working = false;
        }
-       r = r600_blit_init(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled blitter (%d).\n", r);
-               return r;
-       }
-       r = radeon_ib_test(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
-                       return r;
+       if (rdev->accel_working) {
+               r = radeon_ib_pool_init(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
+                       rdev->accel_working = false;
+               }
+               r = r600_blit_init(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled blitter (%d).\n", r);
+                       rdev->accel_working = false;
+               }
+               r = radeon_ib_test(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled testing IB (%d).\n", r);
+                       rdev->accel_working = false;
+               }
        }
        return 0;
 }
index 5bfc05612ac2b9b8124a9acf67351d516882d7f1..d7c4efd08928fd3d61da0db0da7d3431fe18bda0 100644 (file)
@@ -793,6 +793,7 @@ struct radeon_device {
        bool                            suspend;
        bool                            need_dma32;
        bool                            new_init_path;
+       bool                            accel_working;
        struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES];
        const struct firmware *me_fw;   /* all family ME firmware */
        const struct firmware *pfp_fw;  /* r6/700 PFP firmware */
index db5ae73d6289d6ba621be68ec406b86669cc8134..0b5014c2ae7f37b9ee871b341157745fbf62354d 100644 (file)
@@ -504,6 +504,7 @@ int radeon_device_init(struct radeon_device *rdev,
        rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT;
        rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
        rdev->gpu_lockup = false;
+       rdev->accel_working = false;
        /* mutex initialization are all done here so we
         * can recall function without having locking issues */
        mutex_init(&rdev->cs_mutex);
@@ -649,35 +650,26 @@ int radeon_device_init(struct radeon_device *rdev,
                /* Initialize GART (initialize after TTM so we can allocate
                 * memory through TTM but finalize after TTM) */
                r = radeon_gart_enable(rdev);
-               if (!r) {
+               if (r)
+                       return 0;
                        r = radeon_gem_init(rdev);
-               }
+               if (r)
+                       return 0;
 
                /* 1M ring buffer */
-               if (!r) {
-                       r = radeon_cp_init(rdev, 1024 * 1024);
-               }
-               if (!r) {
-                       r = radeon_wb_init(rdev);
-                       if (r) {
-                               DRM_ERROR("radeon: failled initializing WB (%d).\n", r);
-                               return r;
-                       }
-               }
-               if (!r) {
-                       r = radeon_ib_pool_init(rdev);
-                       if (r) {
-                               DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
-                               return r;
-                       }
-               }
-               if (!r) {
-                       r = radeon_ib_test(rdev);
-                       if (r) {
-                               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
-                               return r;
-                       }
-               }
+               r = radeon_cp_init(rdev, 1024 * 1024);
+               if (r)
+                       return 0;
+               r = radeon_wb_init(rdev);
+               if (r)
+                       DRM_ERROR("radeon: failled initializing WB (%d).\n", r);
+               r = radeon_ib_pool_init(rdev);
+               if (r)
+                       return 0;
+               r = radeon_ib_test(rdev);
+               if (r)
+                       return 0;
+               rdev->accel_working = true;
        }
        DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
        if (radeon_testing) {
index ac8505fe2ca77bde46d70811f936eb7cb54796b2..709bd892b3a9ec316de781e22d03016611eb4773 100644 (file)
@@ -112,6 +112,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
        case RADEON_INFO_NUM_Z_PIPES:
                value = rdev->num_z_pipes;
                break;
+       case RADEON_INFO_ACCEL_WORKING:
+               value = rdev->accel_working;
+               break;
        default:
                DRM_DEBUG("Invalid request %d\n", info->request);
                return -EINVAL;
index 4f2098bc79741d9b6c11da47f76501bb6df5e73f..be2f86539ebcaba80552e08e68b36ceb250fba64 100644 (file)
@@ -953,6 +953,7 @@ int rv770_init(struct radeon_device *rdev)
        if (r)
                return r;
 
+       rdev->accel_working = true;
        r = rv770_resume(rdev);
        if (r) {
                if (rdev->flags & RADEON_IS_AGP) {
@@ -961,22 +962,24 @@ int rv770_init(struct radeon_device *rdev)
                        rdev->flags &= ~RADEON_IS_AGP;
                        return rv770_init(rdev);
                }
-               return r;
-       }
-       r = r600_blit_init(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled blitter (%d).\n", r);
-               return r;
+               rdev->accel_working = false;
        }
-       r = radeon_ib_pool_init(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
-               return r;
-       }
-       r = radeon_ib_test(rdev);
-       if (r) {
-               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
-                       return r;
+       if (rdev->accel_working) {
+               r = r600_blit_init(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled blitter (%d).\n", r);
+                       rdev->accel_working = false;
+               }
+               r = radeon_ib_pool_init(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
+                       rdev->accel_working = false;
+               }
+               r = radeon_ib_test(rdev);
+               if (r) {
+                       DRM_ERROR("radeon: failled testing IB (%d).\n", r);
+                       rdev->accel_working = false;
+               }
        }
        return 0;
 }
index 2ba61e18fc8bc9abd78d56e7d9bdfbe6688d274e..b67bbd75bd20ebe6da3e40af8ca140e1e755a0b0 100644 (file)
@@ -899,6 +899,7 @@ struct drm_radeon_cs {
 #define RADEON_INFO_DEVICE_ID          0x00
 #define RADEON_INFO_NUM_GB_PIPES       0x01
 #define RADEON_INFO_NUM_Z_PIPES        0x02
+#define RADEON_INFO_ACCEL_WORKING      0x03
 
 struct drm_radeon_info {
        uint32_t                request;