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

2019-12-12 Thread Leo Liu


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 
---
  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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


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

2019-12-12 Thread Christian König

Am 12.12.19 um 16:57 schrieb Leo Liu:


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.


Keep in mind that you don't need to fully clone the code.

You probably can still call the common VCN helper code quite a bit.

Christian.



Thanks,

Leo





Regards,
Christian.



Signed-off-by: Leo Liu 
---
  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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


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

2019-12-12 Thread Christian König

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?


Regards,
Christian.



Signed-off-by: Leo Liu 
---
  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 {
unsignedharvest_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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


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

2019-12-11 Thread Zhang, Boyuan
This patch is 
Reviewed-by: Boyuan Zhang 


-Original Message-
From: amd-gfx  On Behalf Of Leo Liu
Sent: December 11, 2019 2:48 PM
To: amd-gfx@lists.freedesktop.org
Cc: Liu, Leo 
Subject: [PATCH] drm/amdgpu: add JPEG check to VCN idle handler and begin use

Since it's only needed with VCN1.0 when HW has no its own JPEG HW IP block

Signed-off-by: Leo Liu 
---
 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 {
unsignedharvest_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);
--
2.17.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&data=02%7C01%7Cboyuan.zhang%40amd.com%7C141d98480bb4442c6dff08d77e733651%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637116905879102653&sdata=6Ce6RR2jvpsESZs1I%2FOsYTX1cmImmftEBqfqpN8cp4s%3D&reserved=0
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


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

2019-12-11 Thread Alex Deucher
On Wed, Dec 11, 2019 at 2:49 PM Leo Liu  wrote:
>
> Since it's only needed with VCN1.0 when HW has no its
> own JPEG HW IP block

typo "HW does not have its own"
With that fixed:
Reviewed-by: Alex Deucher 

>
> Signed-off-by: Leo Liu 
> ---
>  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 {
> unsignedharvest_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);
> --
> 2.17.1
>
> ___
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


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

2019-12-11 Thread Leo Liu
Since it's only needed with VCN1.0 when HW has no its
own JPEG HW IP block

Signed-off-by: Leo Liu 
---
 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 {
unsignedharvest_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);
-- 
2.17.1

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