Re: [PATCH] drm/amdgpu: add JPEG check to VCN idle handler and begin use

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2019-12-12 3:18 a.m., Christian König wrote:
Am 11.12.19 um 20:48 schrieb Leo Liu:
Since it's only needed with VCN1.0 when HW has no its
own JPEG HW IP block

Wouldn't it be simpler/cleaner to just define a vcn_v1_0_ring_begin_use() and vcn_v1_0_idle_work_handler() instead?

Yeah, this way should be cleaner, even though the changes got bigger, the new set will be sent shortly.

Thanks,

Leo




Regards,
Christian.


Signed-off-by: Leo Liu <leo.liu@xxxxxxx>
---
  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 29 +++++++++++++++----------
  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  2 ++
  2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 428cfd58b37d..95ac721f2de0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -186,6 +186,9 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
          }
      }
  +    adev->vcn.has_jpeg_block = (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_JPEG)) ?
+        true : false;
+
      return 0;
  }
  @@ -306,15 +309,17 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
              else
                  new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
  -            if (amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec))
-                new_state.jpeg = VCN_DPG_STATE__PAUSE;
-            else
-                new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
-
+            if (!adev->vcn.has_jpeg_block) {
+                if (amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec))
+                    new_state.jpeg = VCN_DPG_STATE__PAUSE;
+                else
+                    new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
+            }
              adev->vcn.pause_dpg_mode(adev, &new_state);
          }
  -        fence[j] += amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec);
+        if (!adev->vcn.has_jpeg_block)
+            fence[j] += amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec);           fence[j] += amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_dec);
          fences += fence[j];
      }
@@ -358,14 +363,16 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
          else
              new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
  -        if (amdgpu_fence_count_emitted(&adev->jpeg.inst[ring->me].ring_dec))
-            new_state.jpeg = VCN_DPG_STATE__PAUSE;
-        else
-            new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
+        if (!adev->vcn.has_jpeg_block) {
+            if (amdgpu_fence_count_emitted(&adev->jpeg.inst[ring->me].ring_dec))
+                new_state.jpeg = VCN_DPG_STATE__PAUSE;
+            else
+                new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
+        }
            if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC)
              new_state.fw_based = VCN_DPG_STATE__PAUSE;
-        else if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG)
+        else if (!adev->vcn.has_jpeg_block && ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG)
              new_state.jpeg = VCN_DPG_STATE__PAUSE;
            adev->vcn.pause_dpg_mode(adev, &new_state);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index 402a5046b985..9a2381d006c6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -192,6 +192,8 @@ struct amdgpu_vcn {
      unsigned    harvest_config;
      int (*pause_dpg_mode)(struct amdgpu_device *adev,
          struct dpg_pause_state *new_state);
+
+    bool has_jpeg_block;
  };
    int amdgpu_vcn_sw_init(struct amdgpu_device *adev);

_______________________________________________
amd-gfx mailing list
amd-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/amd-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux