diff options
| -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, |
