diff options
author | Leo Liu <leo.liu@amd.com> | 2016-12-28 12:16:48 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 17:41:24 -0400 |
commit | a4bf608be5df37cff51c8a5feba7708ebad7e6f6 (patch) | |
tree | d3f6475cc4337c651c3633f43d75ba0ae2276d51 /drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |
parent | 88b5af70e29edda095f3d26edcd376cb1688cf70 (diff) |
drm/amdgpu: add vcn decode ring support
Add the decode ring init.
Signed-off-by: Leo Liu <leo.liu@amd.com>
Acked-by: Chunming Zhou <david1.zhou@amd.com>
Acked-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 744268f002d2..47bdc83f7160 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | |||
@@ -59,6 +59,7 @@ static int vcn_v1_0_early_init(void *handle) | |||
59 | */ | 59 | */ |
60 | static int vcn_v1_0_sw_init(void *handle) | 60 | static int vcn_v1_0_sw_init(void *handle) |
61 | { | 61 | { |
62 | struct amdgpu_ring *ring; | ||
62 | int r; | 63 | int r; |
63 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 64 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
64 | 65 | ||
@@ -75,6 +76,10 @@ static int vcn_v1_0_sw_init(void *handle) | |||
75 | if (r) | 76 | if (r) |
76 | return r; | 77 | return r; |
77 | 78 | ||
79 | ring = &adev->vcn.ring_dec; | ||
80 | sprintf(ring->name, "vcn_dec"); | ||
81 | r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.irq, 0); | ||
82 | |||
78 | return r; | 83 | return r; |
79 | } | 84 | } |
80 | 85 | ||
@@ -246,6 +251,8 @@ static void vcn_v1_0_mc_resume(struct amdgpu_device *adev) | |||
246 | */ | 251 | */ |
247 | static int vcn_v1_0_start(struct amdgpu_device *adev) | 252 | static int vcn_v1_0_start(struct amdgpu_device *adev) |
248 | { | 253 | { |
254 | struct amdgpu_ring *ring = &adev->vcn.ring_dec; | ||
255 | uint32_t rb_bufsz, tmp; | ||
249 | uint32_t lmi_swap_cntl; | 256 | uint32_t lmi_swap_cntl; |
250 | int i, j, r; | 257 | int i, j, r; |
251 | 258 | ||
@@ -356,6 +363,39 @@ static int vcn_v1_0_start(struct amdgpu_device *adev) | |||
356 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS), 0, | 363 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS), 0, |
357 | ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT)); | 364 | ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT)); |
358 | 365 | ||
366 | /* force RBC into idle state */ | ||
367 | rb_bufsz = order_base_2(ring->ring_size); | ||
368 | tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz); | ||
369 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1); | ||
370 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1); | ||
371 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0); | ||
372 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1); | ||
373 | tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); | ||
374 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), tmp); | ||
375 | |||
376 | /* set the write pointer delay */ | ||
377 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_WPTR_CNTL), 0); | ||
378 | |||
379 | /* set the wb address */ | ||
380 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_RPTR_ADDR), | ||
381 | (upper_32_bits(ring->gpu_addr) >> 2)); | ||
382 | |||
383 | /* programm the RB_BASE for ring buffer */ | ||
384 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW), | ||
385 | lower_32_bits(ring->gpu_addr)); | ||
386 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH), | ||
387 | upper_32_bits(ring->gpu_addr)); | ||
388 | |||
389 | /* Initialize the ring buffer's read and write pointers */ | ||
390 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_RPTR), 0); | ||
391 | |||
392 | ring->wptr = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_RPTR)); | ||
393 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_WPTR), | ||
394 | lower_32_bits(ring->wptr)); | ||
395 | |||
396 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0, | ||
397 | ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK); | ||
398 | |||
359 | return 0; | 399 | return 0; |
360 | } | 400 | } |
361 | 401 | ||
@@ -368,6 +408,9 @@ static int vcn_v1_0_start(struct amdgpu_device *adev) | |||
368 | */ | 408 | */ |
369 | static int vcn_v1_0_stop(struct amdgpu_device *adev) | 409 | static int vcn_v1_0_stop(struct amdgpu_device *adev) |
370 | { | 410 | { |
411 | /* force RBC into idle state */ | ||
412 | WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0x11010101); | ||
413 | |||
371 | /* Stall UMC and register bus before resetting VCPU */ | 414 | /* Stall UMC and register bus before resetting VCPU */ |
372 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), | 415 | WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), |
373 | UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, | 416 | UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, |