aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2964-drm-amdgpu-modify-amdgpu_vcn-to-support-multiple-ins.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2964-drm-amdgpu-modify-amdgpu_vcn-to-support-multiple-ins.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2964-drm-amdgpu-modify-amdgpu_vcn-to-support-multiple-ins.patch1382
1 files changed, 1382 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2964-drm-amdgpu-modify-amdgpu_vcn-to-support-multiple-ins.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2964-drm-amdgpu-modify-amdgpu_vcn-to-support-multiple-ins.patch
new file mode 100644
index 00000000..1fb12616
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2964-drm-amdgpu-modify-amdgpu_vcn-to-support-multiple-ins.patch
@@ -0,0 +1,1382 @@
+From 6830e0603ae6d8c0eba876b4c942eb1dc8890726 Mon Sep 17 00:00:00 2001
+From: James Zhu <James.Zhu@amd.com>
+Date: Wed, 10 Jul 2019 10:53:34 -0500
+Subject: [PATCH 2964/4256] drm/amdgpu: modify amdgpu_vcn to support multiple
+ instances
+
+Arcturus has dual-VCN. Need Restruct amdgpu_device::vcn to support
+multiple vcns. There are no any logical changes here
+
+Signed-off-by: James Zhu <James.Zhu@amd.com>
+Reviewed-by: Leo Liu <leo.liu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 6 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 6 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 68 +++++++--------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 24 ++++--
+ drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 110 ++++++++++++------------
+ drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 106 +++++++++++------------
+ drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 87 ++++++++++---------
+ 7 files changed, 210 insertions(+), 197 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+index 871b591cf64a..4f7f8ca1986d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+@@ -157,15 +157,15 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
+ num_rings = 1;
+ break;
+ case AMDGPU_HW_IP_VCN_DEC:
+- rings[0] = &adev->vcn.ring_dec;
++ rings[0] = &adev->vcn.inst[0].ring_dec;
+ num_rings = 1;
+ break;
+ case AMDGPU_HW_IP_VCN_ENC:
+- rings[0] = &adev->vcn.ring_enc[0];
++ rings[0] = &adev->vcn.inst[0].ring_enc[0];
+ num_rings = 1;
+ break;
+ case AMDGPU_HW_IP_VCN_JPEG:
+- rings[0] = &adev->vcn.ring_jpeg;
++ rings[0] = &adev->vcn.inst[0].ring_jpeg;
+ num_rings = 1;
+ break;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+index c21b7d5d9c28..8782a58570e2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+@@ -402,7 +402,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
+ break;
+ case AMDGPU_HW_IP_VCN_DEC:
+ type = AMD_IP_BLOCK_TYPE_VCN;
+- if (adev->vcn.ring_dec.sched.ready)
++ if (adev->vcn.inst[0].ring_dec.sched.ready)
+ ++num_rings;
+ ib_start_alignment = 16;
+ ib_size_alignment = 16;
+@@ -410,14 +410,14 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
+ case AMDGPU_HW_IP_VCN_ENC:
+ type = AMD_IP_BLOCK_TYPE_VCN;
+ for (i = 0; i < adev->vcn.num_enc_rings; i++)
+- if (adev->vcn.ring_enc[i].sched.ready)
++ if (adev->vcn.inst[0].ring_enc[i].sched.ready)
+ ++num_rings;
+ ib_start_alignment = 64;
+ ib_size_alignment = 1;
+ break;
+ case AMDGPU_HW_IP_VCN_JPEG:
+ type = AMD_IP_BLOCK_TYPE_VCN;
+- if (adev->vcn.ring_jpeg.sched.ready)
++ if (adev->vcn.inst[0].ring_jpeg.sched.ready)
+ ++num_rings;
+ ib_start_alignment = 16;
+ ib_size_alignment = 16;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+index bb0d1ef50c9c..330f355b93a9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+@@ -146,8 +146,8 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
+ if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
+ bo_size += AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8);
+ r = amdgpu_bo_create_kernel(adev, bo_size, PAGE_SIZE,
+- AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.vcpu_bo,
+- &adev->vcn.gpu_addr, &adev->vcn.cpu_addr);
++ AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.inst[0].vcpu_bo,
++ &adev->vcn.inst[0].gpu_addr, &adev->vcn.inst[0].cpu_addr);
+ if (r) {
+ dev_err(adev->dev, "(%d) failed to allocate vcn bo\n", r);
+ return r;
+@@ -170,7 +170,7 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)
+ {
+ int i;
+
+- kvfree(adev->vcn.saved_bo);
++ kvfree(adev->vcn.inst[0].saved_bo);
+
+ if (adev->vcn.indirect_sram) {
+ amdgpu_bo_free_kernel(&adev->vcn.dpg_sram_bo,
+@@ -178,16 +178,16 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)
+ (void **)&adev->vcn.dpg_sram_cpu_addr);
+ }
+
+- amdgpu_bo_free_kernel(&adev->vcn.vcpu_bo,
+- &adev->vcn.gpu_addr,
+- (void **)&adev->vcn.cpu_addr);
++ amdgpu_bo_free_kernel(&adev->vcn.inst[0].vcpu_bo,
++ &adev->vcn.inst[0].gpu_addr,
++ (void **)&adev->vcn.inst[0].cpu_addr);
+
+- amdgpu_ring_fini(&adev->vcn.ring_dec);
++ amdgpu_ring_fini(&adev->vcn.inst[0].ring_dec);
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i)
+- amdgpu_ring_fini(&adev->vcn.ring_enc[i]);
++ amdgpu_ring_fini(&adev->vcn.inst[0].ring_enc[i]);
+
+- amdgpu_ring_fini(&adev->vcn.ring_jpeg);
++ amdgpu_ring_fini(&adev->vcn.inst[0].ring_jpeg);
+
+ release_firmware(adev->vcn.fw);
+
+@@ -201,17 +201,17 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)
+
+ cancel_delayed_work_sync(&adev->vcn.idle_work);
+
+- if (adev->vcn.vcpu_bo == NULL)
++ if (adev->vcn.inst[0].vcpu_bo == NULL)
+ return 0;
+
+- size = amdgpu_bo_size(adev->vcn.vcpu_bo);
+- ptr = adev->vcn.cpu_addr;
++ size = amdgpu_bo_size(adev->vcn.inst[0].vcpu_bo);
++ ptr = adev->vcn.inst[0].cpu_addr;
+
+- adev->vcn.saved_bo = kvmalloc(size, GFP_KERNEL);
+- if (!adev->vcn.saved_bo)
++ adev->vcn.inst[0].saved_bo = kvmalloc(size, GFP_KERNEL);
++ if (!adev->vcn.inst[0].saved_bo)
+ return -ENOMEM;
+
+- memcpy_fromio(adev->vcn.saved_bo, ptr, size);
++ memcpy_fromio(adev->vcn.inst[0].saved_bo, ptr, size);
+
+ return 0;
+ }
+@@ -221,16 +221,16 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)
+ unsigned size;
+ void *ptr;
+
+- if (adev->vcn.vcpu_bo == NULL)
++ if (adev->vcn.inst[0].vcpu_bo == NULL)
+ return -EINVAL;
+
+- size = amdgpu_bo_size(adev->vcn.vcpu_bo);
+- ptr = adev->vcn.cpu_addr;
++ size = amdgpu_bo_size(adev->vcn.inst[0].vcpu_bo);
++ ptr = adev->vcn.inst[0].cpu_addr;
+
+- if (adev->vcn.saved_bo != NULL) {
+- memcpy_toio(ptr, adev->vcn.saved_bo, size);
+- kvfree(adev->vcn.saved_bo);
+- adev->vcn.saved_bo = NULL;
++ if (adev->vcn.inst[0].saved_bo != NULL) {
++ memcpy_toio(ptr, adev->vcn.inst[0].saved_bo, size);
++ kvfree(adev->vcn.inst[0].saved_bo);
++ adev->vcn.inst[0].saved_bo = NULL;
+ } else {
+ const struct common_firmware_header *hdr;
+ unsigned offset;
+@@ -238,7 +238,7 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)
+ hdr = (const struct common_firmware_header *)adev->vcn.fw->data;
+ if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
+ offset = le32_to_cpu(hdr->ucode_array_offset_bytes);
+- memcpy_toio(adev->vcn.cpu_addr, adev->vcn.fw->data + offset,
++ memcpy_toio(adev->vcn.inst[0].cpu_addr, adev->vcn.fw->data + offset,
+ le32_to_cpu(hdr->ucode_size_bytes));
+ size -= le32_to_cpu(hdr->ucode_size_bytes);
+ ptr += le32_to_cpu(hdr->ucode_size_bytes);
+@@ -257,7 +257,7 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
+ unsigned int i;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- fences += amdgpu_fence_count_emitted(&adev->vcn.ring_enc[i]);
++ fences += amdgpu_fence_count_emitted(&adev->vcn.inst[0].ring_enc[i]);
+ }
+
+ if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
+@@ -268,7 +268,7 @@ 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->vcn.ring_jpeg))
++ if (amdgpu_fence_count_emitted(&adev->vcn.inst[0].ring_jpeg))
+ new_state.jpeg = VCN_DPG_STATE__PAUSE;
+ else
+ new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
+@@ -276,8 +276,8 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
+ adev->vcn.pause_dpg_mode(adev, &new_state);
+ }
+
+- fences += amdgpu_fence_count_emitted(&adev->vcn.ring_jpeg);
+- fences += amdgpu_fence_count_emitted(&adev->vcn.ring_dec);
++ fences += amdgpu_fence_count_emitted(&adev->vcn.inst[0].ring_jpeg);
++ fences += amdgpu_fence_count_emitted(&adev->vcn.inst[0].ring_dec);
+
+ if (fences == 0) {
+ amdgpu_gfx_off_ctrl(adev, true);
+@@ -311,14 +311,14 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
+ unsigned int i;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- fences += amdgpu_fence_count_emitted(&adev->vcn.ring_enc[i]);
++ fences += amdgpu_fence_count_emitted(&adev->vcn.inst[0].ring_enc[i]);
+ }
+ if (fences)
+ new_state.fw_based = VCN_DPG_STATE__PAUSE;
+ else
+ new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
+
+- if (amdgpu_fence_count_emitted(&adev->vcn.ring_jpeg))
++ if (amdgpu_fence_count_emitted(&adev->vcn.inst[0].ring_jpeg))
+ new_state.jpeg = VCN_DPG_STATE__PAUSE;
+ else
+ new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
+@@ -344,7 +344,7 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)
+ unsigned i;
+ int r;
+
+- WREG32(adev->vcn.external.scratch9, 0xCAFEDEAD);
++ WREG32(adev->vcn.inst[0].external.scratch9, 0xCAFEDEAD);
+ r = amdgpu_ring_alloc(ring, 3);
+ if (r)
+ return r;
+@@ -352,7 +352,7 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)
+ amdgpu_ring_write(ring, 0xDEADBEEF);
+ amdgpu_ring_commit(ring);
+ for (i = 0; i < adev->usec_timeout; i++) {
+- tmp = RREG32(adev->vcn.external.scratch9);
++ tmp = RREG32(adev->vcn.inst[0].external.scratch9);
+ if (tmp == 0xDEADBEEF)
+ break;
+ DRM_UDELAY(1);
+@@ -663,7 +663,7 @@ int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring)
+ unsigned i;
+ int r;
+
+- WREG32(adev->vcn.external.jpeg_pitch, 0xCAFEDEAD);
++ WREG32(adev->vcn.inst[0].external.jpeg_pitch, 0xCAFEDEAD);
+ r = amdgpu_ring_alloc(ring, 3);
+ if (r)
+ return r;
+@@ -673,7 +673,7 @@ int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring)
+ amdgpu_ring_commit(ring);
+
+ for (i = 0; i < adev->usec_timeout; i++) {
+- tmp = RREG32(adev->vcn.external.jpeg_pitch);
++ tmp = RREG32(adev->vcn.inst[0].external.jpeg_pitch);
+ if (tmp == 0xDEADBEEF)
+ break;
+ DRM_UDELAY(1);
+@@ -747,7 +747,7 @@ int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout)
+ }
+
+ for (i = 0; i < adev->usec_timeout; i++) {
+- tmp = RREG32(adev->vcn.external.jpeg_pitch);
++ tmp = RREG32(adev->vcn.inst[0].external.jpeg_pitch);
+ if (tmp == 0xDEADBEEF)
+ break;
+ DRM_UDELAY(1);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+index bfd8c3cea13a..d2fc47a954ab 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+@@ -30,6 +30,8 @@
+ #define AMDGPU_VCN_FIRMWARE_OFFSET 256
+ #define AMDGPU_VCN_MAX_ENC_RINGS 3
+
++#define AMDGPU_MAX_VCN_INSTANCES 2
++
+ #define VCN_DEC_CMD_FENCE 0x00000000
+ #define VCN_DEC_CMD_TRAP 0x00000001
+ #define VCN_DEC_CMD_WRITE_REG 0x00000004
+@@ -155,30 +157,38 @@ struct amdgpu_vcn_reg{
+ unsigned jpeg_pitch;
+ };
+
+-struct amdgpu_vcn {
++struct amdgpu_vcn_inst {
+ struct amdgpu_bo *vcpu_bo;
+ void *cpu_addr;
+ uint64_t gpu_addr;
+- unsigned fw_version;
+ void *saved_bo;
+- struct delayed_work idle_work;
+- const struct firmware *fw; /* VCN firmware */
+ struct amdgpu_ring ring_dec;
+ struct amdgpu_ring ring_enc[AMDGPU_VCN_MAX_ENC_RINGS];
+ struct amdgpu_ring ring_jpeg;
+ struct amdgpu_irq_src irq;
++ struct amdgpu_vcn_reg external;
++};
++
++struct amdgpu_vcn {
++ unsigned fw_version;
++ struct delayed_work idle_work;
++ const struct firmware *fw; /* VCN firmware */
+ unsigned num_enc_rings;
+ enum amd_powergating_state cur_state;
+ struct dpg_pause_state pause_state;
+- struct amdgpu_vcn_reg internal, external;
+- int (*pause_dpg_mode)(struct amdgpu_device *adev,
+- struct dpg_pause_state *new_state);
+
+ bool indirect_sram;
+ struct amdgpu_bo *dpg_sram_bo;
+ void *dpg_sram_cpu_addr;
+ uint64_t dpg_sram_gpu_addr;
+ uint32_t *dpg_sram_curr_addr;
++
++ uint8_t num_vcn_inst;
++ struct amdgpu_vcn_inst inst[AMDGPU_MAX_VCN_INSTANCES];
++ struct amdgpu_vcn_reg internal;
++
++ int (*pause_dpg_mode)(struct amdgpu_device *adev,
++ struct dpg_pause_state *new_state);
+ };
+
+ int amdgpu_vcn_sw_init(struct amdgpu_device *adev);
+diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+index 09dc9c87ebd1..07a2f36ea7ce 100644
+--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+@@ -63,6 +63,7 @@ static int vcn_v1_0_early_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
++ adev->vcn.num_vcn_inst = 1;
+ adev->vcn.num_enc_rings = 2;
+
+ vcn_v1_0_set_dec_ring_funcs(adev);
+@@ -87,20 +88,21 @@ static int vcn_v1_0_sw_init(void *handle)
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+ /* VCN DEC TRAP */
+- r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, VCN_1_0__SRCID__UVD_SYSTEM_MESSAGE_INTERRUPT, &adev->vcn.irq);
++ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
++ VCN_1_0__SRCID__UVD_SYSTEM_MESSAGE_INTERRUPT, &adev->vcn.inst->irq);
+ if (r)
+ return r;
+
+ /* VCN ENC TRAP */
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, i + VCN_1_0__SRCID__UVD_ENC_GENERAL_PURPOSE,
+- &adev->vcn.irq);
++ &adev->vcn.inst->irq);
+ if (r)
+ return r;
+ }
+
+ /* VCN JPEG TRAP */
+- r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, 126, &adev->vcn.irq);
++ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, 126, &adev->vcn.inst->irq);
+ if (r)
+ return r;
+
+@@ -122,39 +124,39 @@ static int vcn_v1_0_sw_init(void *handle)
+ if (r)
+ return r;
+
+- ring = &adev->vcn.ring_dec;
++ ring = &adev->vcn.inst->ring_dec;
+ sprintf(ring->name, "vcn_dec");
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0);
+ if (r)
+ return r;
+
+- adev->vcn.internal.scratch9 = adev->vcn.external.scratch9 =
++ adev->vcn.internal.scratch9 = adev->vcn.inst->external.scratch9 =
+ SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9);
+- adev->vcn.internal.data0 = adev->vcn.external.data0 =
++ adev->vcn.internal.data0 = adev->vcn.inst->external.data0 =
+ SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0);
+- adev->vcn.internal.data1 = adev->vcn.external.data1 =
++ adev->vcn.internal.data1 = adev->vcn.inst->external.data1 =
+ SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1);
+- adev->vcn.internal.cmd = adev->vcn.external.cmd =
++ adev->vcn.internal.cmd = adev->vcn.inst->external.cmd =
+ SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD);
+- adev->vcn.internal.nop = adev->vcn.external.nop =
++ adev->vcn.internal.nop = adev->vcn.inst->external.nop =
+ SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP);
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst->ring_enc[i];
+ sprintf(ring->name, "vcn_enc%d", i);
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0);
+ if (r)
+ return r;
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ sprintf(ring->name, "vcn_jpeg");
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0);
+ if (r)
+ return r;
+
+ adev->vcn.pause_dpg_mode = vcn_v1_0_pause_dpg_mode;
+- adev->vcn.internal.jpeg_pitch = adev->vcn.external.jpeg_pitch =
++ adev->vcn.internal.jpeg_pitch = adev->vcn.inst->external.jpeg_pitch =
+ SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH);
+
+ return 0;
+@@ -191,7 +193,7 @@ static int vcn_v1_0_sw_fini(void *handle)
+ static int vcn_v1_0_hw_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+ int i, r;
+
+ r = amdgpu_ring_test_helper(ring);
+@@ -199,14 +201,14 @@ static int vcn_v1_0_hw_init(void *handle)
+ goto done;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst->ring_enc[i];
+ ring->sched.ready = true;
+ r = amdgpu_ring_test_helper(ring);
+ if (r)
+ goto done;
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ r = amdgpu_ring_test_helper(ring);
+ if (r)
+ goto done;
+@@ -229,7 +231,7 @@ static int vcn_v1_0_hw_init(void *handle)
+ static int vcn_v1_0_hw_fini(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+
+ if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||
+ RREG32_SOC15(VCN, 0, mmUVD_STATUS))
+@@ -304,9 +306,9 @@ static void vcn_v1_0_mc_resume_spg_mode(struct amdgpu_device *adev)
+ offset = 0;
+ } else {
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr));
++ lower_32_bits(adev->vcn.inst->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr));
++ upper_32_bits(adev->vcn.inst->gpu_addr));
+ offset = size;
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
+ AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
+@@ -316,17 +318,17 @@ static void vcn_v1_0_mc_resume_spg_mode(struct amdgpu_device *adev)
+
+ /* cache window 1: stack */
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset));
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset));
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset));
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE);
+
+ /* cache window 2: context */
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE);
+
+@@ -374,9 +376,9 @@ static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev)
+ offset = 0;
+ } else {
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr), 0xFFFFFFFF, 0);
++ lower_32_bits(adev->vcn.inst->gpu_addr), 0xFFFFFFFF, 0);
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr), 0xFFFFFFFF, 0);
++ upper_32_bits(adev->vcn.inst->gpu_addr), 0xFFFFFFFF, 0);
+ offset = size;
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
+ AMDGPU_UVD_FIRMWARE_OFFSET >> 3, 0xFFFFFFFF, 0);
+@@ -386,9 +388,9 @@ static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev)
+
+ /* cache window 1: stack */
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0);
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset), 0xFFFFFFFF, 0);
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0);
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset), 0xFFFFFFFF, 0);
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0,
+ 0xFFFFFFFF, 0);
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE,
+@@ -396,10 +398,10 @@ static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev)
+
+ /* cache window 2: context */
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE),
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE),
+ 0xFFFFFFFF, 0);
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE),
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE),
+ 0xFFFFFFFF, 0);
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0, 0xFFFFFFFF, 0);
+ WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE,
+@@ -779,7 +781,7 @@ static void vcn_1_0_enable_static_power_gating(struct amdgpu_device *adev)
+ */
+ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev)
+ {
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+ uint32_t rb_bufsz, tmp;
+ uint32_t lmi_swap_cntl;
+ int i, j, r;
+@@ -932,21 +934,21 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev)
+ WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0,
+ ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK);
+
+- ring = &adev->vcn.ring_enc[0];
++ ring = &adev->vcn.inst->ring_enc[0];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4);
+
+- ring = &adev->vcn.ring_enc[1];
++ ring = &adev->vcn.inst->ring_enc[1];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4);
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK |
+ UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK);
+@@ -968,7 +970,7 @@ static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev)
+
+ static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev)
+ {
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+ uint32_t rb_bufsz, tmp;
+ uint32_t lmi_swap_cntl;
+
+@@ -1106,7 +1108,7 @@ static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev)
+ ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK);
+
+ /* initialize JPEG wptr */
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
+
+ /* copy patch commands to the jpeg ring */
+@@ -1255,21 +1257,21 @@ static int vcn_v1_0_pause_dpg_mode(struct amdgpu_device *adev,
+ UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, ret_code);
+
+ /* Restore */
+- ring = &adev->vcn.ring_enc[0];
++ ring = &adev->vcn.inst->ring_enc[0];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
+
+- ring = &adev->vcn.ring_enc[1];
++ ring = &adev->vcn.inst->ring_enc[1];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
+
+- ring = &adev->vcn.ring_dec;
++ ring = &adev->vcn.inst->ring_dec;
+ WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
+ RREG32_SOC15(UVD, 0, mmUVD_SCRATCH2) & 0x7FFFFFFF);
+ SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,
+@@ -1315,7 +1317,7 @@ static int vcn_v1_0_pause_dpg_mode(struct amdgpu_device *adev,
+ UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK, ret_code);
+
+ /* Restore */
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL,
+ UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK |
+@@ -1329,7 +1331,7 @@ static int vcn_v1_0_pause_dpg_mode(struct amdgpu_device *adev,
+ WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL,
+ UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK);
+
+- ring = &adev->vcn.ring_dec;
++ ring = &adev->vcn.inst->ring_dec;
+ WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
+ RREG32_SOC15(UVD, 0, mmUVD_SCRATCH2) & 0x7FFFFFFF);
+ SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,
+@@ -1596,7 +1598,7 @@ static uint64_t vcn_v1_0_enc_ring_get_rptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0])
++ if (ring == &adev->vcn.inst->ring_enc[0])
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR);
+ else
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2);
+@@ -1613,7 +1615,7 @@ static uint64_t vcn_v1_0_enc_ring_get_wptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0])
++ if (ring == &adev->vcn.inst->ring_enc[0])
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR);
+ else
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2);
+@@ -1630,7 +1632,7 @@ static void vcn_v1_0_enc_ring_set_wptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0])
++ if (ring == &adev->vcn.inst->ring_enc[0])
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR,
+ lower_32_bits(ring->wptr));
+ else
+@@ -2114,16 +2116,16 @@ static int vcn_v1_0_process_interrupt(struct amdgpu_device *adev,
+
+ switch (entry->src_id) {
+ case 124:
+- amdgpu_fence_process(&adev->vcn.ring_dec);
++ amdgpu_fence_process(&adev->vcn.inst->ring_dec);
+ break;
+ case 119:
+- amdgpu_fence_process(&adev->vcn.ring_enc[0]);
++ amdgpu_fence_process(&adev->vcn.inst->ring_enc[0]);
+ break;
+ case 120:
+- amdgpu_fence_process(&adev->vcn.ring_enc[1]);
++ amdgpu_fence_process(&adev->vcn.inst->ring_enc[1]);
+ break;
+ case 126:
+- amdgpu_fence_process(&adev->vcn.ring_jpeg);
++ amdgpu_fence_process(&adev->vcn.inst->ring_jpeg);
+ break;
+ default:
+ DRM_ERROR("Unhandled interrupt: %d %d\n",
+@@ -2295,7 +2297,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_jpeg_ring_vm_funcs = {
+
+ static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.ring_dec.funcs = &vcn_v1_0_dec_ring_vm_funcs;
++ adev->vcn.inst->ring_dec.funcs = &vcn_v1_0_dec_ring_vm_funcs;
+ DRM_INFO("VCN decode is enabled in VM mode\n");
+ }
+
+@@ -2304,14 +2306,14 @@ static void vcn_v1_0_set_enc_ring_funcs(struct amdgpu_device *adev)
+ int i;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i)
+- adev->vcn.ring_enc[i].funcs = &vcn_v1_0_enc_ring_vm_funcs;
++ adev->vcn.inst->ring_enc[i].funcs = &vcn_v1_0_enc_ring_vm_funcs;
+
+ DRM_INFO("VCN encode is enabled in VM mode\n");
+ }
+
+ static void vcn_v1_0_set_jpeg_ring_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.ring_jpeg.funcs = &vcn_v1_0_jpeg_ring_vm_funcs;
++ adev->vcn.inst->ring_jpeg.funcs = &vcn_v1_0_jpeg_ring_vm_funcs;
+ DRM_INFO("VCN jpeg decode is enabled in VM mode\n");
+ }
+
+@@ -2322,8 +2324,8 @@ static const struct amdgpu_irq_src_funcs vcn_v1_0_irq_funcs = {
+
+ static void vcn_v1_0_set_irq_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.irq.num_types = adev->vcn.num_enc_rings + 2;
+- adev->vcn.irq.funcs = &vcn_v1_0_irq_funcs;
++ adev->vcn.inst->irq.num_types = adev->vcn.num_enc_rings + 2;
++ adev->vcn.inst->irq.funcs = &vcn_v1_0_irq_funcs;
+ }
+
+ const struct amdgpu_ip_block_version vcn_v1_0_ip_block =
+diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+index 2b7bb6364e5a..3cb62e448a37 100644
+--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+@@ -92,6 +92,7 @@ static int vcn_v2_0_early_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
++ adev->vcn.num_vcn_inst = 1;
+ adev->vcn.num_enc_rings = 2;
+
+ vcn_v2_0_set_dec_ring_funcs(adev);
+@@ -118,7 +119,7 @@ static int vcn_v2_0_sw_init(void *handle)
+ /* VCN DEC TRAP */
+ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
+ VCN_2_0__SRCID__UVD_SYSTEM_MESSAGE_INTERRUPT,
+- &adev->vcn.irq);
++ &adev->vcn.inst->irq);
+ if (r)
+ return r;
+
+@@ -126,15 +127,14 @@ static int vcn_v2_0_sw_init(void *handle)
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
+ i + VCN_2_0__SRCID__UVD_ENC_GENERAL_PURPOSE,
+- &adev->vcn.irq);
++ &adev->vcn.inst->irq);
+ if (r)
+ return r;
+ }
+
+ /* VCN JPEG TRAP */
+ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
+- VCN_2_0__SRCID__JPEG_DECODE,
+- &adev->vcn.irq);
++ VCN_2_0__SRCID__JPEG_DECODE, &adev->vcn.inst->irq);
+ if (r)
+ return r;
+
+@@ -156,13 +156,13 @@ static int vcn_v2_0_sw_init(void *handle)
+ if (r)
+ return r;
+
+- ring = &adev->vcn.ring_dec;
++ ring = &adev->vcn.inst->ring_dec;
+
+ ring->use_doorbell = true;
+ ring->doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1 << 1;
+
+ sprintf(ring->name, "vcn_dec");
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0);
+ if (r)
+ return r;
+
+@@ -174,38 +174,38 @@ static int vcn_v2_0_sw_init(void *handle)
+ adev->vcn.internal.gp_scratch8 = mmUVD_GP_SCRATCH8_INTERNAL_OFFSET;
+
+ adev->vcn.internal.scratch9 = mmUVD_SCRATCH9_INTERNAL_OFFSET;
+- adev->vcn.external.scratch9 = SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9);
++ adev->vcn.inst->external.scratch9 = SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9);
+ adev->vcn.internal.data0 = mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET;
+- adev->vcn.external.data0 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0);
++ adev->vcn.inst->external.data0 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0);
+ adev->vcn.internal.data1 = mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET;
+- adev->vcn.external.data1 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1);
++ adev->vcn.inst->external.data1 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1);
+ adev->vcn.internal.cmd = mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET;
+- adev->vcn.external.cmd = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD);
++ adev->vcn.inst->external.cmd = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD);
+ adev->vcn.internal.nop = mmUVD_NO_OP_INTERNAL_OFFSET;
+- adev->vcn.external.nop = SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP);
++ adev->vcn.inst->external.nop = SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP);
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst->ring_enc[i];
+ ring->use_doorbell = true;
+ ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + i;
+ sprintf(ring->name, "vcn_enc%d", i);
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0);
+ if (r)
+ return r;
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ ring->use_doorbell = true;
+ ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1;
+ sprintf(ring->name, "vcn_jpeg");
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0);
+ if (r)
+ return r;
+
+ adev->vcn.pause_dpg_mode = vcn_v2_0_pause_dpg_mode;
+
+ adev->vcn.internal.jpeg_pitch = mmUVD_JPEG_PITCH_INTERNAL_OFFSET;
+- adev->vcn.external.jpeg_pitch = SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH);
++ adev->vcn.inst->external.jpeg_pitch = SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH);
+
+ return 0;
+ }
+@@ -241,7 +241,7 @@ static int vcn_v2_0_sw_fini(void *handle)
+ static int vcn_v2_0_hw_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+ int i, r;
+
+ adev->nbio_funcs->vcn_doorbell_range(adev, ring->use_doorbell,
+@@ -255,7 +255,7 @@ static int vcn_v2_0_hw_init(void *handle)
+ }
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst->ring_enc[i];
+ ring->sched.ready = true;
+ r = amdgpu_ring_test_ring(ring);
+ if (r) {
+@@ -264,7 +264,7 @@ static int vcn_v2_0_hw_init(void *handle)
+ }
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ ring->sched.ready = true;
+ r = amdgpu_ring_test_ring(ring);
+ if (r) {
+@@ -290,7 +290,7 @@ static int vcn_v2_0_hw_init(void *handle)
+ static int vcn_v2_0_hw_fini(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+ int i;
+
+ if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||
+@@ -301,11 +301,11 @@ static int vcn_v2_0_hw_fini(void *handle)
+ ring->sched.ready = false;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst->ring_enc[i];
+ ring->sched.ready = false;
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst->ring_jpeg;
+ ring->sched.ready = false;
+
+ return 0;
+@@ -375,9 +375,9 @@ static void vcn_v2_0_mc_resume(struct amdgpu_device *adev)
+ offset = 0;
+ } else {
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr));
++ lower_32_bits(adev->vcn.inst->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr));
++ upper_32_bits(adev->vcn.inst->gpu_addr));
+ offset = size;
+ /* No signed header for now from firmware
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
+@@ -390,17 +390,17 @@ static void vcn_v2_0_mc_resume(struct amdgpu_device *adev)
+
+ /* cache window 1: stack */
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset));
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset));
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset));
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE);
+
+ /* cache window 2: context */
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE);
+
+@@ -436,10 +436,10 @@ static void vcn_v2_0_mc_resume_dpg_mode(struct amdgpu_device *adev, bool indirec
+ } else {
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
+- lower_32_bits(adev->vcn.gpu_addr), 0, indirect);
++ lower_32_bits(adev->vcn.inst->gpu_addr), 0, indirect);
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
+- upper_32_bits(adev->vcn.gpu_addr), 0, indirect);
++ upper_32_bits(adev->vcn.inst->gpu_addr), 0, indirect);
+ offset = size;
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_VCPU_CACHE_OFFSET0),
+@@ -457,10 +457,10 @@ static void vcn_v2_0_mc_resume_dpg_mode(struct amdgpu_device *adev, bool indirec
+ if (!indirect) {
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
+- lower_32_bits(adev->vcn.gpu_addr + offset), 0, indirect);
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset), 0, indirect);
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
+- upper_32_bits(adev->vcn.gpu_addr + offset), 0, indirect);
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset), 0, indirect);
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect);
+ } else {
+@@ -477,10 +477,10 @@ static void vcn_v2_0_mc_resume_dpg_mode(struct amdgpu_device *adev, bool indirec
+ /* cache window 2: context */
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
+- lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
++ lower_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
+- upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
++ upper_32_bits(adev->vcn.inst->gpu_addr + offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+ UVD, 0, mmUVD_VCPU_CACHE_OFFSET2), 0, 0, indirect);
+ WREG32_SOC15_DPG_MODE_2_0(SOC15_DPG_MODE_OFFSET_2_0(
+@@ -668,7 +668,7 @@ static void vcn_v2_0_clock_gating_dpg_mode(struct amdgpu_device *adev,
+ */
+ static int jpeg_v2_0_start(struct amdgpu_device *adev)
+ {
+- struct amdgpu_ring *ring = &adev->vcn.ring_jpeg;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_jpeg;
+ uint32_t tmp;
+ int r = 0;
+
+@@ -930,7 +930,7 @@ static void vcn_v2_0_enable_static_power_gating(struct amdgpu_device *adev)
+
+ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device *adev, bool indirect)
+ {
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+ uint32_t rb_bufsz, tmp;
+
+ vcn_v2_0_enable_static_power_gating(adev);
+@@ -1056,7 +1056,7 @@ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device *adev, bool indirect)
+
+ static int vcn_v2_0_start(struct amdgpu_device *adev)
+ {
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;
+ uint32_t rb_bufsz, tmp;
+ uint32_t lmi_swap_cntl;
+ int i, j, r;
+@@ -1207,14 +1207,14 @@ static int vcn_v2_0_start(struct amdgpu_device *adev)
+ WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
+ lower_32_bits(ring->wptr));
+
+- ring = &adev->vcn.ring_enc[0];
++ ring = &adev->vcn.inst->ring_enc[0];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4);
+
+- ring = &adev->vcn.ring_enc[1];
++ ring = &adev->vcn.inst->ring_enc[1];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);
+@@ -1361,14 +1361,14 @@ static int vcn_v2_0_pause_dpg_mode(struct amdgpu_device *adev,
+ UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, ret_code);
+
+ /* Restore */
+- ring = &adev->vcn.ring_enc[0];
++ ring = &adev->vcn.inst->ring_enc[0];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
+
+- ring = &adev->vcn.ring_enc[1];
++ ring = &adev->vcn.inst->ring_enc[1];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4);
+@@ -1660,7 +1660,7 @@ static uint64_t vcn_v2_0_enc_ring_get_rptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0])
++ if (ring == &adev->vcn.inst->ring_enc[0])
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR);
+ else
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2);
+@@ -1677,7 +1677,7 @@ static uint64_t vcn_v2_0_enc_ring_get_wptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0]) {
++ if (ring == &adev->vcn.inst->ring_enc[0]) {
+ if (ring->use_doorbell)
+ return adev->wb.wb[ring->wptr_offs];
+ else
+@@ -1701,7 +1701,7 @@ static void vcn_v2_0_enc_ring_set_wptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0]) {
++ if (ring == &adev->vcn.inst->ring_enc[0]) {
+ if (ring->use_doorbell) {
+ adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
+ WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
+@@ -2075,16 +2075,16 @@ static int vcn_v2_0_process_interrupt(struct amdgpu_device *adev,
+
+ switch (entry->src_id) {
+ case VCN_2_0__SRCID__UVD_SYSTEM_MESSAGE_INTERRUPT:
+- amdgpu_fence_process(&adev->vcn.ring_dec);
++ amdgpu_fence_process(&adev->vcn.inst->ring_dec);
+ break;
+ case VCN_2_0__SRCID__UVD_ENC_GENERAL_PURPOSE:
+- amdgpu_fence_process(&adev->vcn.ring_enc[0]);
++ amdgpu_fence_process(&adev->vcn.inst->ring_enc[0]);
+ break;
+ case VCN_2_0__SRCID__UVD_ENC_LOW_LATENCY:
+- amdgpu_fence_process(&adev->vcn.ring_enc[1]);
++ amdgpu_fence_process(&adev->vcn.inst->ring_enc[1]);
+ break;
+ case VCN_2_0__SRCID__JPEG_DECODE:
+- amdgpu_fence_process(&adev->vcn.ring_jpeg);
++ amdgpu_fence_process(&adev->vcn.inst->ring_jpeg);
+ break;
+ default:
+ DRM_ERROR("Unhandled interrupt: %d %d\n",
+@@ -2233,7 +2233,7 @@ static const struct amdgpu_ring_funcs vcn_v2_0_jpeg_ring_vm_funcs = {
+
+ static void vcn_v2_0_set_dec_ring_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.ring_dec.funcs = &vcn_v2_0_dec_ring_vm_funcs;
++ adev->vcn.inst->ring_dec.funcs = &vcn_v2_0_dec_ring_vm_funcs;
+ DRM_INFO("VCN decode is enabled in VM mode\n");
+ }
+
+@@ -2242,14 +2242,14 @@ static void vcn_v2_0_set_enc_ring_funcs(struct amdgpu_device *adev)
+ int i;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i)
+- adev->vcn.ring_enc[i].funcs = &vcn_v2_0_enc_ring_vm_funcs;
++ adev->vcn.inst->ring_enc[i].funcs = &vcn_v2_0_enc_ring_vm_funcs;
+
+ DRM_INFO("VCN encode is enabled in VM mode\n");
+ }
+
+ static void vcn_v2_0_set_jpeg_ring_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.ring_jpeg.funcs = &vcn_v2_0_jpeg_ring_vm_funcs;
++ adev->vcn.inst->ring_jpeg.funcs = &vcn_v2_0_jpeg_ring_vm_funcs;
+ DRM_INFO("VCN jpeg decode is enabled in VM mode\n");
+ }
+
+@@ -2260,8 +2260,8 @@ static const struct amdgpu_irq_src_funcs vcn_v2_0_irq_funcs = {
+
+ static void vcn_v2_0_set_irq_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.irq.num_types = adev->vcn.num_enc_rings + 2;
+- adev->vcn.irq.funcs = &vcn_v2_0_irq_funcs;
++ adev->vcn.inst->irq.num_types = adev->vcn.num_enc_rings + 2;
++ adev->vcn.inst->irq.funcs = &vcn_v2_0_irq_funcs;
+ }
+
+ const struct amdgpu_ip_block_version vcn_v2_0_ip_block =
+diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+index 75fdb6881ac0..e27351267c9e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
++++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+@@ -66,6 +66,7 @@ static int vcn_v2_5_early_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
++ adev->vcn.num_vcn_inst = 1;
+ adev->vcn.num_enc_rings = 2;
+
+ vcn_v2_5_set_dec_ring_funcs(adev);
+@@ -91,21 +92,21 @@ static int vcn_v2_5_sw_init(void *handle)
+
+ /* VCN DEC TRAP */
+ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
+- VCN_2_0__SRCID__UVD_SYSTEM_MESSAGE_INTERRUPT, &adev->vcn.irq);
++ VCN_2_0__SRCID__UVD_SYSTEM_MESSAGE_INTERRUPT, &adev->vcn.inst[0].irq);
+ if (r)
+ return r;
+
+ /* VCN ENC TRAP */
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
+- i + VCN_2_0__SRCID__UVD_ENC_GENERAL_PURPOSE, &adev->vcn.irq);
++ i + VCN_2_0__SRCID__UVD_ENC_GENERAL_PURPOSE, &adev->vcn.inst[0].irq);
+ if (r)
+ return r;
+ }
+
+ /* VCN JPEG TRAP */
+ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
+- VCN_2_0__SRCID__JPEG_DECODE, &adev->vcn.irq);
++ VCN_2_0__SRCID__JPEG_DECODE, &adev->vcn.inst[0].irq);
+ if (r)
+ return r;
+
+@@ -127,11 +128,11 @@ static int vcn_v2_5_sw_init(void *handle)
+ if (r)
+ return r;
+
+- ring = &adev->vcn.ring_dec;
++ ring = &adev->vcn.inst[0].ring_dec;
+ ring->use_doorbell = true;
+ ring->doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1 << 1;
+ sprintf(ring->name, "vcn_dec");
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[0].irq, 0);
+ if (r)
+ return r;
+
+@@ -143,36 +144,36 @@ static int vcn_v2_5_sw_init(void *handle)
+ adev->vcn.internal.gp_scratch8 = mmUVD_GP_SCRATCH8_INTERNAL_OFFSET;
+
+ adev->vcn.internal.scratch9 = mmUVD_SCRATCH9_INTERNAL_OFFSET;
+- adev->vcn.external.scratch9 = SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9);
++ adev->vcn.inst[0].external.scratch9 = SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9);
+ adev->vcn.internal.data0 = mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET;
+- adev->vcn.external.data0 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0);
++ adev->vcn.inst[0].external.data0 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0);
+ adev->vcn.internal.data1 = mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET;
+- adev->vcn.external.data1 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1);
++ adev->vcn.inst[0].external.data1 = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1);
+ adev->vcn.internal.cmd = mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET;
+- adev->vcn.external.cmd = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD);
++ adev->vcn.inst[0].external.cmd = SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD);
+ adev->vcn.internal.nop = mmUVD_NO_OP_INTERNAL_OFFSET;
+- adev->vcn.external.nop = SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP);
++ adev->vcn.inst[0].external.nop = SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP);
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst[0].ring_enc[i];
+ ring->use_doorbell = true;
+ ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + i;
+ sprintf(ring->name, "vcn_enc%d", i);
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[0].irq, 0);
+ if (r)
+ return r;
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst[0].ring_jpeg;
+ ring->use_doorbell = true;
+ ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1;
+ sprintf(ring->name, "vcn_jpeg");
+- r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0);
++ r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[0].irq, 0);
+ if (r)
+ return r;
+
+ adev->vcn.internal.jpeg_pitch = mmUVD_JPEG_PITCH_INTERNAL_OFFSET;
+- adev->vcn.external.jpeg_pitch = SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH);
++ adev->vcn.inst[0].external.jpeg_pitch = SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH);
+
+ return 0;
+ }
+@@ -208,7 +209,7 @@ static int vcn_v2_5_sw_fini(void *handle)
+ static int vcn_v2_5_hw_init(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst[0].ring_dec;
+ int i, r;
+
+ adev->nbio_funcs->vcn_doorbell_range(adev, ring->use_doorbell,
+@@ -221,7 +222,7 @@ static int vcn_v2_5_hw_init(void *handle)
+ }
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst[0].ring_enc[i];
+ ring->sched.ready = false;
+ continue;
+ r = amdgpu_ring_test_ring(ring);
+@@ -231,7 +232,7 @@ static int vcn_v2_5_hw_init(void *handle)
+ }
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst[0].ring_jpeg;
+ r = amdgpu_ring_test_ring(ring);
+ if (r) {
+ ring->sched.ready = false;
+@@ -255,7 +256,7 @@ static int vcn_v2_5_hw_init(void *handle)
+ static int vcn_v2_5_hw_fini(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst[0].ring_dec;
+ int i;
+
+ if (RREG32_SOC15(VCN, 0, mmUVD_STATUS))
+@@ -264,11 +265,11 @@ static int vcn_v2_5_hw_fini(void *handle)
+ ring->sched.ready = false;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
+- ring = &adev->vcn.ring_enc[i];
++ ring = &adev->vcn.inst[0].ring_enc[i];
+ ring->sched.ready = false;
+ }
+
+- ring = &adev->vcn.ring_jpeg;
++ ring = &adev->vcn.inst[0].ring_jpeg;
+ ring->sched.ready = false;
+
+ return 0;
+@@ -338,9 +339,9 @@ static void vcn_v2_5_mc_resume(struct amdgpu_device *adev)
+ offset = 0;
+ } else {
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr));
++ lower_32_bits(adev->vcn.inst[0].gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr));
++ upper_32_bits(adev->vcn.inst[0].gpu_addr));
+ offset = size;
+ /* No signed header for now from firmware
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
+@@ -352,17 +353,17 @@ static void vcn_v2_5_mc_resume(struct amdgpu_device *adev)
+
+ /* cache window 1: stack */
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset));
++ lower_32_bits(adev->vcn.inst[0].gpu_addr + offset));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset));
++ upper_32_bits(adev->vcn.inst[0].gpu_addr + offset));
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE);
+
+ /* cache window 2: context */
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
+- lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
++ lower_32_bits(adev->vcn.inst[0].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
+- upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
++ upper_32_bits(adev->vcn.inst[0].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0);
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE);
+ }
+@@ -548,7 +549,7 @@ static void vcn_v2_5_enable_clock_gating(struct amdgpu_device *adev)
+ */
+ static int jpeg_v2_5_start(struct amdgpu_device *adev)
+ {
+- struct amdgpu_ring *ring = &adev->vcn.ring_jpeg;
++ struct amdgpu_ring *ring = &adev->vcn.inst[0].ring_jpeg;
+ uint32_t tmp;
+
+ /* disable anti hang mechanism */
+@@ -639,7 +640,7 @@ static int jpeg_v2_5_stop(struct amdgpu_device *adev)
+
+ static int vcn_v2_5_start(struct amdgpu_device *adev)
+ {
+- struct amdgpu_ring *ring = &adev->vcn.ring_dec;
++ struct amdgpu_ring *ring = &adev->vcn.inst[0].ring_dec;
+ uint32_t rb_bufsz, tmp;
+ int i, j, r;
+
+@@ -781,14 +782,14 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
+ ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR);
+ WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
+ lower_32_bits(ring->wptr));
+- ring = &adev->vcn.ring_enc[0];
++ ring = &adev->vcn.inst[0].ring_enc[0];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4);
+
+- ring = &adev->vcn.ring_enc[1];
++ ring = &adev->vcn.inst[0].ring_enc[1];
+ WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
+ WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);
+@@ -951,7 +952,7 @@ static uint64_t vcn_v2_5_enc_ring_get_rptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0])
++ if (ring == &adev->vcn.inst[0].ring_enc[0])
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR);
+ else
+ return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2);
+@@ -968,7 +969,7 @@ static uint64_t vcn_v2_5_enc_ring_get_wptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0]) {
++ if (ring == &adev->vcn.inst[0].ring_enc[0]) {
+ if (ring->use_doorbell)
+ return adev->wb.wb[ring->wptr_offs];
+ else
+@@ -992,7 +993,7 @@ static void vcn_v2_5_enc_ring_set_wptr(struct amdgpu_ring *ring)
+ {
+ struct amdgpu_device *adev = ring->adev;
+
+- if (ring == &adev->vcn.ring_enc[0]) {
++ if (ring == &adev->vcn.inst[0].ring_enc[0]) {
+ if (ring->use_doorbell) {
+ adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
+ WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
+@@ -1121,7 +1122,7 @@ static const struct amdgpu_ring_funcs vcn_v2_5_jpeg_ring_vm_funcs = {
+
+ static void vcn_v2_5_set_dec_ring_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.ring_dec.funcs = &vcn_v2_5_dec_ring_vm_funcs;
++ adev->vcn.inst[0].ring_dec.funcs = &vcn_v2_5_dec_ring_vm_funcs;
+ DRM_INFO("VCN decode is enabled in VM mode\n");
+ }
+
+@@ -1130,14 +1131,14 @@ static void vcn_v2_5_set_enc_ring_funcs(struct amdgpu_device *adev)
+ int i;
+
+ for (i = 0; i < adev->vcn.num_enc_rings; ++i)
+- adev->vcn.ring_enc[i].funcs = &vcn_v2_5_enc_ring_vm_funcs;
++ adev->vcn.inst[0].ring_enc[i].funcs = &vcn_v2_5_enc_ring_vm_funcs;
+
+ DRM_INFO("VCN encode is enabled in VM mode\n");
+ }
+
+ static void vcn_v2_5_set_jpeg_ring_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.ring_jpeg.funcs = &vcn_v2_5_jpeg_ring_vm_funcs;
++ adev->vcn.inst[0].ring_jpeg.funcs = &vcn_v2_5_jpeg_ring_vm_funcs;
+ DRM_INFO("VCN jpeg decode is enabled in VM mode\n");
+ }
+
+@@ -1212,16 +1213,16 @@ static int vcn_v2_5_process_interrupt(struct amdgpu_device *adev,
+
+ switch (entry->src_id) {
+ case VCN_2_0__SRCID__UVD_SYSTEM_MESSAGE_INTERRUPT:
+- amdgpu_fence_process(&adev->vcn.ring_dec);
++ amdgpu_fence_process(&adev->vcn.inst[0].ring_dec);
+ break;
+ case VCN_2_0__SRCID__UVD_ENC_GENERAL_PURPOSE:
+- amdgpu_fence_process(&adev->vcn.ring_enc[0]);
++ amdgpu_fence_process(&adev->vcn.inst[0].ring_enc[0]);
+ break;
+ case VCN_2_0__SRCID__UVD_ENC_LOW_LATENCY:
+- amdgpu_fence_process(&adev->vcn.ring_enc[1]);
++ amdgpu_fence_process(&adev->vcn.inst[0].ring_enc[1]);
+ break;
+ case VCN_2_0__SRCID__JPEG_DECODE:
+- amdgpu_fence_process(&adev->vcn.ring_jpeg);
++ amdgpu_fence_process(&adev->vcn.inst[0].ring_jpeg);
+ break;
+ default:
+ DRM_ERROR("Unhandled interrupt: %d %d\n",
+@@ -1239,8 +1240,8 @@ static const struct amdgpu_irq_src_funcs vcn_v2_5_irq_funcs = {
+
+ static void vcn_v2_5_set_irq_funcs(struct amdgpu_device *adev)
+ {
+- adev->vcn.irq.num_types = adev->vcn.num_enc_rings + 2;
+- adev->vcn.irq.funcs = &vcn_v2_5_irq_funcs;
++ adev->vcn.inst[0].irq.num_types = adev->vcn.num_enc_rings + 2;
++ adev->vcn.inst[0].irq.funcs = &vcn_v2_5_irq_funcs;
+ }
+
+ static const struct amd_ip_funcs vcn_v2_5_ip_funcs = {
+--
+2.17.1
+