aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2016-08-24 17:15:33 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-25 11:21:51 -0400
commit6f0359ff73076483902de0c17f9649bf55651e2a (patch)
tree103da03a21f34ae0c3a70e1e0409dbd2a730b144 /drivers/gpu/drm/amd/amdgpu
parent75c65480ba7d56e2ee164057ce8ab879931a3978 (diff)
drm/amdgpu/vce3: add support for third vce ring
Not of much use at the moment (we don't really use the second ring either), but may be useful later. Reviewed-by: JimQu <Jim.Qu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v3_0.c22
3 files changed, 21 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 0cd1c9316974..4cfcf9c37800 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -108,7 +108,7 @@ extern char *amdgpu_virtual_display;
108#define AMDGPU_MAX_RINGS 16 108#define AMDGPU_MAX_RINGS 16
109#define AMDGPU_MAX_GFX_RINGS 1 109#define AMDGPU_MAX_GFX_RINGS 1
110#define AMDGPU_MAX_COMPUTE_RINGS 8 110#define AMDGPU_MAX_COMPUTE_RINGS 8
111#define AMDGPU_MAX_VCE_RINGS 2 111#define AMDGPU_MAX_VCE_RINGS 3
112 112
113/* max number of IP instances */ 113/* max number of IP instances */
114#define AMDGPU_MAX_SDMA_INSTANCES 2 114#define AMDGPU_MAX_SDMA_INSTANCES 2
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index da52af2a935a..9b71d6c2a968 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -850,8 +850,8 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
850 struct fence *fence = NULL; 850 struct fence *fence = NULL;
851 long r; 851 long r;
852 852
853 /* skip vce ring1 ib test for now, since it's not reliable */ 853 /* skip vce ring1/2 ib test for now, since it's not reliable */
854 if (ring == &ring->adev->vce.ring[1]) 854 if (ring != &ring->adev->vce.ring[0])
855 return 0; 855 return 0;
856 856
857 r = amdgpu_vce_get_create_msg(ring, 1, NULL); 857 r = amdgpu_vce_get_create_msg(ring, 1, NULL);
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index 27acd2862d8a..d734ac9292ca 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -70,8 +70,10 @@ static uint32_t vce_v3_0_ring_get_rptr(struct amdgpu_ring *ring)
70 70
71 if (ring == &adev->vce.ring[0]) 71 if (ring == &adev->vce.ring[0])
72 return RREG32(mmVCE_RB_RPTR); 72 return RREG32(mmVCE_RB_RPTR);
73 else 73 else if (ring == &adev->vce.ring[1])
74 return RREG32(mmVCE_RB_RPTR2); 74 return RREG32(mmVCE_RB_RPTR2);
75 else
76 return RREG32(mmVCE_RB_RPTR3);
75} 77}
76 78
77/** 79/**
@@ -87,8 +89,10 @@ static uint32_t vce_v3_0_ring_get_wptr(struct amdgpu_ring *ring)
87 89
88 if (ring == &adev->vce.ring[0]) 90 if (ring == &adev->vce.ring[0])
89 return RREG32(mmVCE_RB_WPTR); 91 return RREG32(mmVCE_RB_WPTR);
90 else 92 else if (ring == &adev->vce.ring[1])
91 return RREG32(mmVCE_RB_WPTR2); 93 return RREG32(mmVCE_RB_WPTR2);
94 else
95 return RREG32(mmVCE_RB_WPTR3);
92} 96}
93 97
94/** 98/**
@@ -104,8 +108,10 @@ static void vce_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
104 108
105 if (ring == &adev->vce.ring[0]) 109 if (ring == &adev->vce.ring[0])
106 WREG32(mmVCE_RB_WPTR, ring->wptr); 110 WREG32(mmVCE_RB_WPTR, ring->wptr);
107 else 111 else if (ring == &adev->vce.ring[1])
108 WREG32(mmVCE_RB_WPTR2, ring->wptr); 112 WREG32(mmVCE_RB_WPTR2, ring->wptr);
113 else
114 WREG32(mmVCE_RB_WPTR3, ring->wptr);
109} 115}
110 116
111static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override) 117static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override)
@@ -229,6 +235,13 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
229 WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 235 WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
230 WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4); 236 WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4);
231 237
238 ring = &adev->vce.ring[2];
239 WREG32(mmVCE_RB_RPTR3, ring->wptr);
240 WREG32(mmVCE_RB_WPTR3, ring->wptr);
241 WREG32(mmVCE_RB_BASE_LO3, ring->gpu_addr);
242 WREG32(mmVCE_RB_BASE_HI3, upper_32_bits(ring->gpu_addr));
243 WREG32(mmVCE_RB_SIZE3, ring->ring_size / 4);
244
232 mutex_lock(&adev->grbm_idx_mutex); 245 mutex_lock(&adev->grbm_idx_mutex);
233 for (idx = 0; idx < 2; ++idx) { 246 for (idx = 0; idx < 2; ++idx) {
234 if (adev->vce.harvest_config & (1 << idx)) 247 if (adev->vce.harvest_config & (1 << idx))
@@ -345,7 +358,7 @@ static int vce_v3_0_early_init(void *handle)
345 (AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1)) 358 (AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1))
346 return -ENOENT; 359 return -ENOENT;
347 360
348 adev->vce.num_rings = 2; 361 adev->vce.num_rings = 3;
349 362
350 vce_v3_0_set_ring_funcs(adev); 363 vce_v3_0_set_ring_funcs(adev);
351 vce_v3_0_set_irq_funcs(adev); 364 vce_v3_0_set_irq_funcs(adev);
@@ -671,6 +684,7 @@ static int vce_v3_0_process_interrupt(struct amdgpu_device *adev,
671 switch (entry->src_data) { 684 switch (entry->src_data) {
672 case 0: 685 case 0:
673 case 1: 686 case 1:
687 case 2:
674 amdgpu_fence_process(&adev->vce.ring[entry->src_data]); 688 amdgpu_fence_process(&adev->vce.ring[entry->src_data]);
675 break; 689 break;
676 default: 690 default: