2 * Copyright 2013 Advanced Micro Devices, Inc.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
16 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
17 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19 * USE OR OTHER DEALINGS IN THE SOFTWARE.
21 * The above copyright notice and this permission notice (including the
22 * next paragraph) shall be included in all copies or substantial portions
28 #include <linux/firmware.h>
31 #include "amdgpu_vce.h"
33 #include "vce/vce_2_0_d.h"
34 #include "vce/vce_2_0_sh_mask.h"
35 #include "smu/smu_7_0_1_d.h"
36 #include "smu/smu_7_0_1_sh_mask.h"
37 #include "oss/oss_2_0_d.h"
38 #include "oss/oss_2_0_sh_mask.h"
40 #define VCE_V2_0_FW_SIZE (256 * 1024)
41 #define VCE_V2_0_STACK_SIZE (64 * 1024)
42 #define VCE_V2_0_DATA_SIZE (23552 * AMDGPU_MAX_VCE_HANDLES)
43 #define VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK 0x02
45 static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev);
46 static void vce_v2_0_set_irq_funcs(struct amdgpu_device *adev);
49 * vce_v2_0_ring_get_rptr - get read pointer
51 * @ring: amdgpu_ring pointer
53 * Returns the current hardware read pointer
55 static uint32_t vce_v2_0_ring_get_rptr(struct amdgpu_ring *ring)
57 struct amdgpu_device *adev = ring->adev;
59 if (ring == &adev->vce.ring[0])
60 return RREG32(mmVCE_RB_RPTR);
62 return RREG32(mmVCE_RB_RPTR2);
66 * vce_v2_0_ring_get_wptr - get write pointer
68 * @ring: amdgpu_ring pointer
70 * Returns the current hardware write pointer
72 static uint32_t vce_v2_0_ring_get_wptr(struct amdgpu_ring *ring)
74 struct amdgpu_device *adev = ring->adev;
76 if (ring == &adev->vce.ring[0])
77 return RREG32(mmVCE_RB_WPTR);
79 return RREG32(mmVCE_RB_WPTR2);
83 * vce_v2_0_ring_set_wptr - set write pointer
85 * @ring: amdgpu_ring pointer
87 * Commits the write pointer to the hardware
89 static void vce_v2_0_ring_set_wptr(struct amdgpu_ring *ring)
91 struct amdgpu_device *adev = ring->adev;
93 if (ring == &adev->vce.ring[0])
94 WREG32(mmVCE_RB_WPTR, ring->wptr);
96 WREG32(mmVCE_RB_WPTR2, ring->wptr);
99 static int vce_v2_0_lmi_clean(struct amdgpu_device *adev)
103 for (i = 0; i < 10; ++i) {
104 for (j = 0; j < 100; ++j) {
105 uint32_t status = RREG32(mmVCE_LMI_STATUS);
116 static int vce_v2_0_firmware_loaded(struct amdgpu_device *adev)
120 for (i = 0; i < 10; ++i) {
121 for (j = 0; j < 100; ++j) {
122 uint32_t status = RREG32(mmVCE_STATUS);
124 if (status & VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK)
129 DRM_ERROR("VCE not responding, trying to reset the ECPU!!!\n");
130 WREG32_P(mmVCE_SOFT_RESET,
131 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
132 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
134 WREG32_P(mmVCE_SOFT_RESET, 0,
135 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
142 static void vce_v2_0_disable_cg(struct amdgpu_device *adev)
144 WREG32(mmVCE_CGTT_CLK_OVERRIDE, 7);
147 static void vce_v2_0_init_cg(struct amdgpu_device *adev)
151 tmp = RREG32(mmVCE_CLOCK_GATING_A);
153 tmp |= ((0 << 0) | (4 << 4));
155 WREG32(mmVCE_CLOCK_GATING_A, tmp);
157 tmp = RREG32(mmVCE_UENC_CLOCK_GATING);
159 tmp |= ((0 << 0) | (4 << 4));
160 WREG32(mmVCE_UENC_CLOCK_GATING, tmp);
162 tmp = RREG32(mmVCE_CLOCK_GATING_B);
165 WREG32(mmVCE_CLOCK_GATING_B, tmp);
168 static void vce_v2_0_mc_resume(struct amdgpu_device *adev)
170 uint64_t addr = adev->vce.gpu_addr;
173 WREG32_P(mmVCE_CLOCK_GATING_A, 0, ~(1 << 16));
174 WREG32_P(mmVCE_UENC_CLOCK_GATING, 0x1FF000, ~0xFF9FF000);
175 WREG32_P(mmVCE_UENC_REG_CLOCK_GATING, 0x3F, ~0x3F);
176 WREG32(mmVCE_CLOCK_GATING_B, 0xf7);
178 WREG32(mmVCE_LMI_CTRL, 0x00398000);
179 WREG32_P(mmVCE_LMI_CACHE_CTRL, 0x0, ~0x1);
180 WREG32(mmVCE_LMI_SWAP_CNTL, 0);
181 WREG32(mmVCE_LMI_SWAP_CNTL1, 0);
182 WREG32(mmVCE_LMI_VM_CTRL, 0);
184 addr += AMDGPU_VCE_FIRMWARE_OFFSET;
185 size = VCE_V2_0_FW_SIZE;
186 WREG32(mmVCE_VCPU_CACHE_OFFSET0, addr & 0x7fffffff);
187 WREG32(mmVCE_VCPU_CACHE_SIZE0, size);
190 size = VCE_V2_0_STACK_SIZE;
191 WREG32(mmVCE_VCPU_CACHE_OFFSET1, addr & 0x7fffffff);
192 WREG32(mmVCE_VCPU_CACHE_SIZE1, size);
195 size = VCE_V2_0_DATA_SIZE;
196 WREG32(mmVCE_VCPU_CACHE_OFFSET2, addr & 0x7fffffff);
197 WREG32(mmVCE_VCPU_CACHE_SIZE2, size);
199 WREG32_P(mmVCE_LMI_CTRL2, 0x0, ~0x100);
200 WREG32_FIELD(VCE_SYS_INT_EN, VCE_SYS_INT_TRAP_INTERRUPT_EN, 1);
203 static bool vce_v2_0_is_idle(void *handle)
205 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
207 return !(RREG32(mmSRBM_STATUS2) & SRBM_STATUS2__VCE_BUSY_MASK);
210 static int vce_v2_0_wait_for_idle(void *handle)
212 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
215 for (i = 0; i < adev->usec_timeout; i++) {
216 if (vce_v2_0_is_idle(handle))
223 * vce_v2_0_start - start VCE block
225 * @adev: amdgpu_device pointer
227 * Setup and start the VCE block
229 static int vce_v2_0_start(struct amdgpu_device *adev)
231 struct amdgpu_ring *ring;
235 WREG32_P(mmVCE_STATUS, 1, ~1);
237 vce_v2_0_init_cg(adev);
238 vce_v2_0_disable_cg(adev);
240 vce_v2_0_mc_resume(adev);
242 ring = &adev->vce.ring[0];
243 WREG32(mmVCE_RB_RPTR, ring->wptr);
244 WREG32(mmVCE_RB_WPTR, ring->wptr);
245 WREG32(mmVCE_RB_BASE_LO, ring->gpu_addr);
246 WREG32(mmVCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
247 WREG32(mmVCE_RB_SIZE, ring->ring_size / 4);
249 ring = &adev->vce.ring[1];
250 WREG32(mmVCE_RB_RPTR2, ring->wptr);
251 WREG32(mmVCE_RB_WPTR2, ring->wptr);
252 WREG32(mmVCE_RB_BASE_LO2, ring->gpu_addr);
253 WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
254 WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4);
256 WREG32_FIELD(VCE_VCPU_CNTL, CLK_EN, 1);
257 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 1);
259 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 0);
261 r = vce_v2_0_firmware_loaded(adev);
263 /* clear BUSY flag */
264 WREG32_P(mmVCE_STATUS, 0, ~1);
267 DRM_ERROR("VCE not responding, giving up!!!\n");
274 static int vce_v2_0_stop(struct amdgpu_device *adev)
279 if (vce_v2_0_lmi_clean(adev)) {
280 DRM_INFO("vce is not idle \n");
284 for (i = 0; i < 10; ++i) {
285 for (j = 0; j < 100; ++j) {
286 status = RREG32(mmVCE_FW_REG_STATUS);
294 if (vce_v2_0_wait_for_idle(adev)) {
295 DRM_INFO("VCE is busy, Can't set clock gateing");
299 /* Stall UMC and register bus before resetting VCPU */
300 WREG32_P(mmVCE_LMI_CTRL2, 1 << 8, ~(1 << 8));
302 for (i = 0; i < 10; ++i) {
303 for (j = 0; j < 100; ++j) {
304 status = RREG32(mmVCE_LMI_STATUS);
312 WREG32_P(mmVCE_VCPU_CNTL, 0, ~0x80001);
314 /* put LMI, VCPU, RBC etc... into reset */
315 WREG32_P(mmVCE_SOFT_RESET, 1, ~0x1);
317 WREG32(mmVCE_STATUS, 0);
322 static void vce_v2_0_set_sw_cg(struct amdgpu_device *adev, bool gated)
327 tmp = RREG32(mmVCE_CLOCK_GATING_B);
329 WREG32(mmVCE_CLOCK_GATING_B, tmp);
331 tmp = RREG32(mmVCE_UENC_CLOCK_GATING);
333 WREG32(mmVCE_UENC_CLOCK_GATING, tmp);
335 tmp = RREG32(mmVCE_UENC_REG_CLOCK_GATING);
337 WREG32(mmVCE_UENC_REG_CLOCK_GATING, tmp);
339 WREG32(mmVCE_CGTT_CLK_OVERRIDE, 0);
341 tmp = RREG32(mmVCE_CLOCK_GATING_B);
344 WREG32(mmVCE_CLOCK_GATING_B, tmp);
346 tmp = RREG32(mmVCE_UENC_CLOCK_GATING);
349 WREG32(mmVCE_UENC_CLOCK_GATING, tmp);
351 tmp = RREG32(mmVCE_UENC_REG_CLOCK_GATING);
353 WREG32(mmVCE_UENC_REG_CLOCK_GATING, tmp);
357 static void vce_v2_0_set_dyn_cg(struct amdgpu_device *adev, bool gated)
361 /* LMI_MC/LMI_UMC always set in dynamic,
362 * set {CGC_*_GATE_MODE, CGC_*_SW_GATE} = {0, 0}
364 tmp = RREG32(mmVCE_CLOCK_GATING_B);
367 /* Exception for ECPU, IH, SEM, SYS blocks needs to be turned on/off by SW */
370 WREG32(mmVCE_CLOCK_GATING_B, tmp);
374 WREG32(mmVCE_CLOCK_GATING_B, tmp);
377 orig = tmp = RREG32(mmVCE_UENC_CLOCK_GATING);
381 WREG32(mmVCE_UENC_CLOCK_GATING, tmp);
383 orig = tmp = RREG32(mmVCE_UENC_REG_CLOCK_GATING);
386 WREG32(mmVCE_UENC_REG_CLOCK_GATING, tmp);
388 /* set VCE_UENC_REG_CLOCK_GATING always in dynamic mode */
389 WREG32(mmVCE_UENC_REG_CLOCK_GATING, 0x00);
392 WREG32(mmVCE_CGTT_CLK_OVERRIDE, 0);
395 static void vce_v2_0_enable_mgcg(struct amdgpu_device *adev, bool enable,
398 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)) {
400 vce_v2_0_set_sw_cg(adev, true);
402 vce_v2_0_set_dyn_cg(adev, true);
404 vce_v2_0_disable_cg(adev);
407 vce_v2_0_set_sw_cg(adev, false);
409 vce_v2_0_set_dyn_cg(adev, false);
413 static int vce_v2_0_early_init(void *handle)
415 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
417 adev->vce.num_rings = 2;
419 vce_v2_0_set_ring_funcs(adev);
420 vce_v2_0_set_irq_funcs(adev);
425 static int vce_v2_0_sw_init(void *handle)
427 struct amdgpu_ring *ring;
429 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
432 r = amdgpu_irq_add_id(adev, 167, &adev->vce.irq);
436 r = amdgpu_vce_sw_init(adev, VCE_V2_0_FW_SIZE +
437 VCE_V2_0_STACK_SIZE + VCE_V2_0_DATA_SIZE);
441 r = amdgpu_vce_resume(adev);
445 for (i = 0; i < adev->vce.num_rings; i++) {
446 ring = &adev->vce.ring[i];
447 sprintf(ring->name, "vce%d", i);
448 r = amdgpu_ring_init(adev, ring, 512,
457 static int vce_v2_0_sw_fini(void *handle)
460 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
462 r = amdgpu_vce_suspend(adev);
466 r = amdgpu_vce_sw_fini(adev);
473 static int vce_v2_0_hw_init(void *handle)
476 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
478 amdgpu_asic_set_vce_clocks(adev, 10000, 10000);
479 vce_v2_0_enable_mgcg(adev, true, false);
480 for (i = 0; i < adev->vce.num_rings; i++)
481 adev->vce.ring[i].ready = false;
483 for (i = 0; i < adev->vce.num_rings; i++) {
484 r = amdgpu_ring_test_ring(&adev->vce.ring[i]);
488 adev->vce.ring[i].ready = true;
491 DRM_INFO("VCE initialized successfully.\n");
496 static int vce_v2_0_hw_fini(void *handle)
501 static int vce_v2_0_suspend(void *handle)
504 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
506 r = vce_v2_0_hw_fini(adev);
510 r = amdgpu_vce_suspend(adev);
517 static int vce_v2_0_resume(void *handle)
520 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
522 r = amdgpu_vce_resume(adev);
526 r = vce_v2_0_hw_init(adev);
533 static int vce_v2_0_soft_reset(void *handle)
535 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
537 WREG32_FIELD(SRBM_SOFT_RESET, SOFT_RESET_VCE, 1);
540 return vce_v2_0_start(adev);
543 static int vce_v2_0_set_interrupt_state(struct amdgpu_device *adev,
544 struct amdgpu_irq_src *source,
546 enum amdgpu_interrupt_state state)
550 if (state == AMDGPU_IRQ_STATE_ENABLE)
551 val |= VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK;
553 WREG32_P(mmVCE_SYS_INT_EN, val, ~VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK);
557 static int vce_v2_0_process_interrupt(struct amdgpu_device *adev,
558 struct amdgpu_irq_src *source,
559 struct amdgpu_iv_entry *entry)
561 DRM_DEBUG("IH: VCE\n");
562 switch (entry->src_data) {
565 amdgpu_fence_process(&adev->vce.ring[entry->src_data]);
568 DRM_ERROR("Unhandled interrupt: %d %d\n",
569 entry->src_id, entry->src_data);
576 static int vce_v2_0_set_clockgating_state(void *handle,
577 enum amd_clockgating_state state)
582 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
584 if (state == AMD_CG_STATE_GATE) {
589 vce_v2_0_enable_mgcg(adev, gate, sw_cg);
594 static int vce_v2_0_set_powergating_state(void *handle,
595 enum amd_powergating_state state)
597 /* This doesn't actually powergate the VCE block.
598 * That's done in the dpm code via the SMC. This
599 * just re-inits the block as necessary. The actual
600 * gating still happens in the dpm code. We should
601 * revisit this when there is a cleaner line between
602 * the smc and the hw blocks
604 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
606 if (state == AMD_PG_STATE_GATE)
607 return vce_v2_0_stop(adev);
609 return vce_v2_0_start(adev);
612 static const struct amd_ip_funcs vce_v2_0_ip_funcs = {
614 .early_init = vce_v2_0_early_init,
616 .sw_init = vce_v2_0_sw_init,
617 .sw_fini = vce_v2_0_sw_fini,
618 .hw_init = vce_v2_0_hw_init,
619 .hw_fini = vce_v2_0_hw_fini,
620 .suspend = vce_v2_0_suspend,
621 .resume = vce_v2_0_resume,
622 .is_idle = vce_v2_0_is_idle,
623 .wait_for_idle = vce_v2_0_wait_for_idle,
624 .soft_reset = vce_v2_0_soft_reset,
625 .set_clockgating_state = vce_v2_0_set_clockgating_state,
626 .set_powergating_state = vce_v2_0_set_powergating_state,
629 static const struct amdgpu_ring_funcs vce_v2_0_ring_funcs = {
630 .type = AMDGPU_RING_TYPE_VCE,
632 .nop = VCE_CMD_NO_OP,
633 .get_rptr = vce_v2_0_ring_get_rptr,
634 .get_wptr = vce_v2_0_ring_get_wptr,
635 .set_wptr = vce_v2_0_ring_set_wptr,
636 .parse_cs = amdgpu_vce_ring_parse_cs,
637 .emit_frame_size = 6, /* amdgpu_vce_ring_emit_fence x1 no user fence */
638 .emit_ib_size = 4, /* amdgpu_vce_ring_emit_ib */
639 .emit_ib = amdgpu_vce_ring_emit_ib,
640 .emit_fence = amdgpu_vce_ring_emit_fence,
641 .test_ring = amdgpu_vce_ring_test_ring,
642 .test_ib = amdgpu_vce_ring_test_ib,
643 .insert_nop = amdgpu_ring_insert_nop,
644 .pad_ib = amdgpu_ring_generic_pad_ib,
645 .begin_use = amdgpu_vce_ring_begin_use,
646 .end_use = amdgpu_vce_ring_end_use,
649 static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev)
653 for (i = 0; i < adev->vce.num_rings; i++)
654 adev->vce.ring[i].funcs = &vce_v2_0_ring_funcs;
657 static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = {
658 .set = vce_v2_0_set_interrupt_state,
659 .process = vce_v2_0_process_interrupt,
662 static void vce_v2_0_set_irq_funcs(struct amdgpu_device *adev)
664 adev->vce.irq.num_types = 1;
665 adev->vce.irq.funcs = &vce_v2_0_irq_funcs;
668 const struct amdgpu_ip_block_version vce_v2_0_ip_block =
670 .type = AMD_IP_BLOCK_TYPE_VCE,
674 .funcs = &vce_v2_0_ip_funcs,