aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4450-drm-amdgpu-remove-unnecessary-JPEG2.0-code-from-VCN2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4450-drm-amdgpu-remove-unnecessary-JPEG2.0-code-from-VCN2.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4450-drm-amdgpu-remove-unnecessary-JPEG2.0-code-from-VCN2.patch395
1 files changed, 395 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4450-drm-amdgpu-remove-unnecessary-JPEG2.0-code-from-VCN2.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4450-drm-amdgpu-remove-unnecessary-JPEG2.0-code-from-VCN2.patch
new file mode 100644
index 00000000..d5615b6c
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4450-drm-amdgpu-remove-unnecessary-JPEG2.0-code-from-VCN2.patch
@@ -0,0 +1,395 @@
+From f2e6cb77cc722e76f1d89851d55c6eb4fd84b288 Mon Sep 17 00:00:00 2001
+From: Leo Liu <leo.liu@amd.com>
+Date: Fri, 8 Nov 2019 13:30:15 -0500
+Subject: [PATCH 4450/4736] drm/amdgpu: remove unnecessary JPEG2.0 code from
+ VCN2.0
+
+They are no longer needed, using from JPEG2.0 instead.
+
+Signed-off-by: Leo Liu <leo.liu@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 260 +-------------------------
+ 1 file changed, 3 insertions(+), 257 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+index 16f192f6c967..4e0c3467deb2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+@@ -74,7 +74,6 @@
+
+ static void vcn_v2_0_set_dec_ring_funcs(struct amdgpu_device *adev);
+ static void vcn_v2_0_set_enc_ring_funcs(struct amdgpu_device *adev);
+-static void vcn_v2_0_set_jpeg_ring_funcs(struct amdgpu_device *adev);
+ static void vcn_v2_0_set_irq_funcs(struct amdgpu_device *adev);
+ static int vcn_v2_0_set_powergating_state(void *handle,
+ enum amd_powergating_state state);
+@@ -97,7 +96,6 @@ static int vcn_v2_0_early_init(void *handle)
+
+ vcn_v2_0_set_dec_ring_funcs(adev);
+ vcn_v2_0_set_enc_ring_funcs(adev);
+- vcn_v2_0_set_jpeg_ring_funcs(adev);
+ vcn_v2_0_set_irq_funcs(adev);
+
+ return 0;
+@@ -132,12 +130,6 @@ static int vcn_v2_0_sw_init(void *handle)
+ return r;
+ }
+
+- /* VCN JPEG TRAP */
+- r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN,
+- VCN_2_0__SRCID__JPEG_DECODE, &adev->vcn.inst->irq);
+- if (r)
+- return r;
+-
+ r = amdgpu_vcn_sw_init(adev);
+ if (r)
+ return r;
+@@ -194,19 +186,8 @@ static int vcn_v2_0_sw_init(void *handle)
+ return r;
+ }
+
+- 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.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.inst->external.jpeg_pitch = SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH);
+-
+ return 0;
+ }
+
+@@ -258,11 +239,6 @@ static int vcn_v2_0_hw_init(void *handle)
+ goto done;
+ }
+
+- ring = &adev->vcn.inst->ring_jpeg;
+- r = amdgpu_ring_test_helper(ring);
+- if (r)
+- goto done;
+-
+ done:
+ if (!r)
+ DRM_INFO("VCN decode and encode initialized successfully(under %s).\n",
+@@ -296,9 +272,6 @@ static int vcn_v2_0_hw_fini(void *handle)
+ ring->sched.ready = false;
+ }
+
+- ring = &adev->vcn.inst->ring_jpeg;
+- ring->sched.ready = false;
+-
+ return 0;
+ }
+
+@@ -393,7 +366,6 @@ static void vcn_v2_0_mc_resume(struct amdgpu_device *adev)
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE);
+
+ WREG32_SOC15(UVD, 0, mmUVD_GFX10_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
+- WREG32_SOC15(UVD, 0, mmJPEG_DEC_GFX10_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
+ }
+
+ static void vcn_v2_0_mc_resume_dpg_mode(struct amdgpu_device *adev, bool indirect)
+@@ -647,129 +619,6 @@ static void vcn_v2_0_clock_gating_dpg_mode(struct amdgpu_device *adev,
+ UVD, 0, mmUVD_SUVD_CGC_CTRL), 0, sram_sel, indirect);
+ }
+
+-/**
+- * jpeg_v2_0_start - start JPEG block
+- *
+- * @adev: amdgpu_device pointer
+- *
+- * Setup and start the JPEG block
+- */
+-static int jpeg_v2_0_start(struct amdgpu_device *adev)
+-{
+- struct amdgpu_ring *ring = &adev->vcn.inst->ring_jpeg;
+- uint32_t tmp;
+- int r = 0;
+-
+- /* disable power gating */
+- tmp = 1 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT;
+- WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_PGFSM_CONFIG), tmp);
+-
+- SOC15_WAIT_ON_RREG(VCN, 0,
+- mmUVD_PGFSM_STATUS, UVD_PGFSM_STATUS_UVDJ_PWR_ON,
+- UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK, r);
+-
+- if (r) {
+- DRM_ERROR("amdgpu: JPEG disable power gating failed\n");
+- return r;
+- }
+-
+- /* Removing the anti hang mechanism to indicate the UVDJ tile is ON */
+- tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_POWER_STATUS)) & ~0x1;
+- WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_POWER_STATUS), tmp);
+-
+- /* JPEG disable CGC */
+- tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
+- tmp |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
+- tmp |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
+- tmp |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
+- WREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL, tmp);
+-
+- tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE);
+- tmp &= ~(JPEG_CGC_GATE__JPEG_DEC_MASK
+- | JPEG_CGC_GATE__JPEG2_DEC_MASK
+- | JPEG_CGC_GATE__JPEG_ENC_MASK
+- | JPEG_CGC_GATE__JMCIF_MASK
+- | JPEG_CGC_GATE__JRBBM_MASK);
+- WREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE, tmp);
+-
+- /* enable JMI channel */
+- WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_JMI_CNTL), 0,
+- ~UVD_JMI_CNTL__SOFT_RESET_MASK);
+-
+- /* enable System Interrupt for JRBC */
+- WREG32_P(SOC15_REG_OFFSET(VCN, 0, mmJPEG_SYS_INT_EN),
+- JPEG_SYS_INT_EN__DJRBC_MASK,
+- ~JPEG_SYS_INT_EN__DJRBC_MASK);
+-
+- WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0);
+- WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, (0x00000001L | 0x00000002L));
+- WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW,
+- lower_32_bits(ring->gpu_addr));
+- WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH,
+- upper_32_bits(ring->gpu_addr));
+- WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR, 0);
+- WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, 0);
+- WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, 0x00000002L);
+- WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_SIZE, ring->ring_size / 4);
+- ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
+-
+- return 0;
+-}
+-
+-/**
+- * jpeg_v2_0_stop - stop JPEG block
+- *
+- * @adev: amdgpu_device pointer
+- *
+- * stop the JPEG block
+- */
+-static int jpeg_v2_0_stop(struct amdgpu_device *adev)
+-{
+- uint32_t tmp;
+- int r = 0;
+-
+- /* reset JMI */
+- WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_JMI_CNTL),
+- UVD_JMI_CNTL__SOFT_RESET_MASK,
+- ~UVD_JMI_CNTL__SOFT_RESET_MASK);
+-
+- /* enable JPEG CGC */
+- tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL);
+- tmp |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT;
+- tmp |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT;
+- tmp |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT;
+- WREG32_SOC15(VCN, 0, mmJPEG_CGC_CTRL, tmp);
+-
+-
+- tmp = RREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE);
+- tmp |= (JPEG_CGC_GATE__JPEG_DEC_MASK
+- |JPEG_CGC_GATE__JPEG2_DEC_MASK
+- |JPEG_CGC_GATE__JPEG_ENC_MASK
+- |JPEG_CGC_GATE__JMCIF_MASK
+- |JPEG_CGC_GATE__JRBBM_MASK);
+- WREG32_SOC15(VCN, 0, mmJPEG_CGC_GATE, tmp);
+-
+- /* enable power gating */
+- tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_POWER_STATUS));
+- tmp &= ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK;
+- tmp |= 0x1; //UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_TILES_OFF;
+- WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_POWER_STATUS), tmp);
+-
+- tmp = 2 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT;
+- WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_PGFSM_CONFIG), tmp);
+-
+- SOC15_WAIT_ON_RREG(VCN, 0, mmUVD_PGFSM_STATUS,
+- (2 << UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT),
+- UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK, r);
+-
+- if (r) {
+- DRM_ERROR("amdgpu: JPEG enable power gating failed\n");
+- return r;
+- }
+-
+- return r;
+-}
+-
+ /**
+ * vcn_v2_0_enable_clock_gating - enable VCN clock gating
+ *
+@@ -1052,12 +901,8 @@ static int vcn_v2_0_start(struct amdgpu_device *adev)
+ if (adev->pm.dpm_enabled)
+ amdgpu_dpm_enable_uvd(adev, true);
+
+- if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
+- r = vcn_v2_0_start_dpg_mode(adev, adev->vcn.indirect_sram);
+- if (r)
+- return r;
+- goto jpeg;
+- }
++ if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)
++ return vcn_v2_0_start_dpg_mode(adev, adev->vcn.indirect_sram);
+
+ vcn_v2_0_disable_static_power_gating(adev);
+
+@@ -1209,10 +1054,7 @@ static int vcn_v2_0_start(struct amdgpu_device *adev)
+ 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);
+
+-jpeg:
+- r = jpeg_v2_0_start(adev);
+-
+- return r;
++ return 0;
+ }
+
+ static int vcn_v2_0_stop_dpg_mode(struct amdgpu_device *adev)
+@@ -1231,9 +1073,6 @@ static int vcn_v2_0_stop_dpg_mode(struct amdgpu_device *adev)
+ tmp = RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2);
+ SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_RB_RPTR2, tmp, 0xFFFFFFFF, ret_code);
+
+- tmp = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
+- SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_JRBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
+-
+ tmp = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF;
+ SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
+
+@@ -1252,10 +1091,6 @@ static int vcn_v2_0_stop(struct amdgpu_device *adev)
+ uint32_t tmp;
+ int r;
+
+- r = jpeg_v2_0_stop(adev);
+- if (r)
+- return r;
+-
+ if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
+ r = vcn_v2_0_stop_dpg_mode(adev);
+ if (r)
+@@ -1781,56 +1616,6 @@ void vcn_v2_0_enc_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_
+ amdgpu_ring_write(ring, val);
+ }
+
+-/**
+- * vcn_v2_0_jpeg_ring_get_rptr - get read pointer
+- *
+- * @ring: amdgpu_ring pointer
+- *
+- * Returns the current hardware read pointer
+- */
+-static uint64_t vcn_v2_0_jpeg_ring_get_rptr(struct amdgpu_ring *ring)
+-{
+- struct amdgpu_device *adev = ring->adev;
+-
+- return RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR);
+-}
+-
+-/**
+- * vcn_v2_0_jpeg_ring_get_wptr - get write pointer
+- *
+- * @ring: amdgpu_ring pointer
+- *
+- * Returns the current hardware write pointer
+- */
+-static uint64_t vcn_v2_0_jpeg_ring_get_wptr(struct amdgpu_ring *ring)
+-{
+- struct amdgpu_device *adev = ring->adev;
+-
+- if (ring->use_doorbell)
+- return adev->wb.wb[ring->wptr_offs];
+- else
+- return RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR);
+-}
+-
+-/**
+- * vcn_v2_0_jpeg_ring_set_wptr - set write pointer
+- *
+- * @ring: amdgpu_ring pointer
+- *
+- * Commits the write pointer to the hardware
+- */
+-static void vcn_v2_0_jpeg_ring_set_wptr(struct amdgpu_ring *ring)
+-{
+- struct amdgpu_device *adev = ring->adev;
+-
+- if (ring->use_doorbell) {
+- adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
+- WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
+- } else {
+- WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr));
+- }
+-}
+-
+ /**
+ * vcn_v2_0_jpeg_ring_insert_start - insert a start command
+ *
+@@ -2071,9 +1856,6 @@ static int vcn_v2_0_process_interrupt(struct amdgpu_device *adev,
+ case VCN_2_0__SRCID__UVD_ENC_LOW_LATENCY:
+ amdgpu_fence_process(&adev->vcn.inst->ring_enc[1]);
+ break;
+- case VCN_2_0__SRCID__JPEG_DECODE:
+- amdgpu_fence_process(&adev->vcn.inst->ring_jpeg);
+- break;
+ default:
+ DRM_ERROR("Unhandled interrupt: %d %d\n",
+ entry->src_id, entry->src_data[0]);
+@@ -2219,36 +2001,6 @@ static const struct amdgpu_ring_funcs vcn_v2_0_enc_ring_vm_funcs = {
+ .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
+ };
+
+-static const struct amdgpu_ring_funcs vcn_v2_0_jpeg_ring_vm_funcs = {
+- .type = AMDGPU_RING_TYPE_VCN_JPEG,
+- .align_mask = 0xf,
+- .vmhub = AMDGPU_MMHUB_0,
+- .get_rptr = vcn_v2_0_jpeg_ring_get_rptr,
+- .get_wptr = vcn_v2_0_jpeg_ring_get_wptr,
+- .set_wptr = vcn_v2_0_jpeg_ring_set_wptr,
+- .emit_frame_size =
+- SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
+- SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
+- 8 + /* vcn_v2_0_jpeg_ring_emit_vm_flush */
+- 18 + 18 + /* vcn_v2_0_jpeg_ring_emit_fence x2 vm fence */
+- 8 + 16,
+- .emit_ib_size = 22, /* vcn_v2_0_jpeg_ring_emit_ib */
+- .emit_ib = vcn_v2_0_jpeg_ring_emit_ib,
+- .emit_fence = vcn_v2_0_jpeg_ring_emit_fence,
+- .emit_vm_flush = vcn_v2_0_jpeg_ring_emit_vm_flush,
+- .test_ring = amdgpu_vcn_jpeg_ring_test_ring,
+- .test_ib = amdgpu_vcn_jpeg_ring_test_ib,
+- .insert_nop = vcn_v2_0_jpeg_ring_nop,
+- .insert_start = vcn_v2_0_jpeg_ring_insert_start,
+- .insert_end = vcn_v2_0_jpeg_ring_insert_end,
+- .pad_ib = amdgpu_ring_generic_pad_ib,
+- .begin_use = amdgpu_vcn_ring_begin_use,
+- .end_use = amdgpu_vcn_ring_end_use,
+- .emit_wreg = vcn_v2_0_jpeg_ring_emit_wreg,
+- .emit_reg_wait = vcn_v2_0_jpeg_ring_emit_reg_wait,
+- .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
+-};
+-
+ static void vcn_v2_0_set_dec_ring_funcs(struct amdgpu_device *adev)
+ {
+ adev->vcn.inst->ring_dec.funcs = &vcn_v2_0_dec_ring_vm_funcs;
+@@ -2265,12 +2017,6 @@ static void vcn_v2_0_set_enc_ring_funcs(struct amdgpu_device *adev)
+ 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.inst->ring_jpeg.funcs = &vcn_v2_0_jpeg_ring_vm_funcs;
+- DRM_INFO("VCN jpeg decode is enabled in VM mode\n");
+-}
+-
+ static const struct amdgpu_irq_src_funcs vcn_v2_0_irq_funcs = {
+ .set = vcn_v2_0_set_interrupt_state,
+ .process = vcn_v2_0_process_interrupt,
+--
+2.17.1
+