Some IPs only support instance reset.  If there are multiple
rings on the instance, they will all be reset.  Add a flag
to handle note this case.

Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 2 ++
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c    | 2 ++
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c    | 2 ++
 4 files changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 8aab82af2e0e0..63272425a12f6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -388,6 +388,7 @@ struct amdgpu_ring {
        u32                     doorbell_index;
        bool                    use_doorbell;
        bool                    use_pollmem;
+       bool                    all_instance_rings_reset;
        unsigned                wptr_offs;
        u64                     wptr_gpu_addr;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
index 86b800e2b4329..e508703d24d33 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
@@ -1469,6 +1469,7 @@ static int sdma_v4_4_2_sw_init(struct amdgpu_ip_block 
*ip_block)
                ring = &adev->sdma.instance[i].ring;
                ring->ring_obj = NULL;
                ring->use_doorbell = true;
+               ring->all_instance_rings_reset = true;
                aid_id = adev->sdma.instance[i].aid_id;
 
                DRM_DEBUG("SDMA %d use_doorbell being set to: [%s]\n", i,
@@ -1490,6 +1491,7 @@ static int sdma_v4_4_2_sw_init(struct amdgpu_ip_block 
*ip_block)
                        ring = &adev->sdma.instance[i].page;
                        ring->ring_obj = NULL;
                        ring->use_doorbell = true;
+                       ring->all_instance_rings_reset = true;
 
                        /* doorbell index of page queue is assigned right after
                         * gfx queue on the same instance
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
index cebee453871c1..694eaa61c4b6b 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
@@ -334,6 +334,7 @@ static int vcn_v2_5_sw_init(struct amdgpu_ip_block 
*ip_block)
 
                ring = &adev->vcn.inst[j].ring_dec;
                ring->use_doorbell = true;
+               ring->all_instance_rings_reset = true;
 
                ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 
1) +
                                (amdgpu_sriov_vf(adev) ? 2*j : 8*j);
@@ -354,6 +355,7 @@ static int vcn_v2_5_sw_init(struct amdgpu_ip_block 
*ip_block)
 
                        ring = &adev->vcn.inst[j].ring_enc[i];
                        ring->use_doorbell = true;
+                       ring->all_instance_rings_reset = true;
 
                        ring->doorbell_index = 
(adev->doorbell_index.vcn.vcn_ring0_1 << 1) +
                                        (amdgpu_sriov_vf(adev) ? (1 + i + 2*j) 
: (2 + i + 8*j));
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 02d5c5af65f23..cda3154692b35 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -234,6 +234,7 @@ static int vcn_v3_0_sw_init(struct amdgpu_ip_block 
*ip_block)
 
                ring = &adev->vcn.inst[i].ring_dec;
                ring->use_doorbell = true;
+               ring->all_instance_rings_reset = true;
                if (amdgpu_sriov_vf(adev)) {
                        ring->doorbell_index = vcn_doorbell_index + i * 
(adev->vcn.inst[i].num_enc_rings + 1);
                } else {
@@ -258,6 +259,7 @@ static int vcn_v3_0_sw_init(struct amdgpu_ip_block 
*ip_block)
 
                        ring = &adev->vcn.inst[i].ring_enc[j];
                        ring->use_doorbell = true;
+                       ring->all_instance_rings_reset = true;
                        if (amdgpu_sriov_vf(adev)) {
                                ring->doorbell_index = vcn_doorbell_index + i * 
(adev->vcn.inst[i].num_enc_rings + 1) + 1 + j;
                        } else {
-- 
2.52.0

Reply via email to