drm/radeon: consolidate si uvd initialization and startup code.
authorJérome Glisse <jglisse@redhat.com>
Fri, 18 Mar 2016 15:58:30 +0000 (16:58 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 2 May 2016 17:08:49 +0000 (13:08 -0400)
This match the exact same control flow as existing code. It just
use goto instead of multiple levels of if/else. It also clarify
early initialization failures by clearing rdev->has_uvd doing so
does not change end result from hardware point of view, it only
avoids printing more error messages down the line and thus only
the original error is reported.

Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/si.c

index ae21550fe7679c9f2731ee11e4b3a983764fa975..6804e7ea3bb521b9b7f3b5da60080eb06ab2dfe4 100644 (file)
@@ -6821,6 +6821,73 @@ restart_ih:
 /*
  * startup/shutdown callbacks
  */
+static void si_uvd_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
+               /*
+                * At this point rdev->uvd.vcpu_bo is NULL which trickles down
+                * to early fails uvd_v2_2_resume() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable uvd here.
+                */
+               rdev->has_uvd = 0;
+               return;
+       }
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
+}
+
+static void si_uvd_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = uvd_v2_2_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+}
+
+static void si_uvd_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
+               return;
+       }
+       r = uvd_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
+               return;
+       }
+}
+
 static int si_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring;
@@ -6899,17 +6966,7 @@ static int si_startup(struct radeon_device *rdev)
                return r;
        }
 
-       if (rdev->has_uvd) {
-               r = uvd_v2_2_resume(rdev);
-               if (!r) {
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          R600_RING_TYPE_UVD_INDEX);
-                       if (r)
-                               dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
-               }
-               if (r)
-                       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
-       }
+       si_uvd_start(rdev);
 
        r = radeon_vce_resume(rdev);
        if (!r) {
@@ -6983,17 +7040,7 @@ static int si_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
-       if (rdev->has_uvd) {
-               ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-               if (ring->ring_size) {
-                       r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                            RADEON_CP_PACKET2);
-                       if (!r)
-                               r = uvd_v1_0_init(rdev);
-                       if (r)
-                               DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
-               }
-       }
+       si_uvd_resume(rdev);
 
        r = -ENOENT;
 
@@ -7169,14 +7216,7 @@ int si_init(struct radeon_device *rdev)
        ring->ring_obj = NULL;
        r600_ring_init(rdev, ring, 64 * 1024);
 
-       if (rdev->has_uvd) {
-               r = radeon_uvd_init(rdev);
-               if (!r) {
-                       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-                       ring->ring_obj = NULL;
-                       r600_ring_init(rdev, ring, 4096);
-               }
-       }
+       si_uvd_init(rdev);
 
        r = radeon_vce_init(rdev);
        if (!r) {