diff options
author | Christian König <christian.koenig@amd.com> | 2016-02-10 11:43:00 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-02-12 15:41:01 -0500 |
commit | c594989cc0db05a07a852e1da6f5387d8265a64a (patch) | |
tree | 93b118de83480b023497e2361365eae02f27e187 /drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | |
parent | ead833ecedfad7267966c6b81944c706a85b0736 (diff) |
drm/amdgpu: use separate scheduler entity for VCE submissions
This allows us to remove the kernel context and use a better
priority for the submissions.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index 8a3119379cd8..39c3aa60381a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | |||
@@ -74,6 +74,8 @@ static void amdgpu_vce_idle_work_handler(struct work_struct *work); | |||
74 | */ | 74 | */ |
75 | int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size) | 75 | int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size) |
76 | { | 76 | { |
77 | struct amdgpu_ring *ring; | ||
78 | struct amd_sched_rq *rq; | ||
77 | const char *fw_name; | 79 | const char *fw_name; |
78 | const struct common_firmware_header *hdr; | 80 | const struct common_firmware_header *hdr; |
79 | unsigned ucode_version, version_major, version_minor, binary_id; | 81 | unsigned ucode_version, version_major, version_minor, binary_id; |
@@ -170,6 +172,16 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size) | |||
170 | return r; | 172 | return r; |
171 | } | 173 | } |
172 | 174 | ||
175 | |||
176 | ring = &adev->vce.ring[0]; | ||
177 | rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL]; | ||
178 | r = amd_sched_entity_init(&ring->sched, &adev->vce.entity, | ||
179 | rq, amdgpu_sched_jobs); | ||
180 | if (r != 0) { | ||
181 | DRM_ERROR("Failed setting up VCE run queue.\n"); | ||
182 | return r; | ||
183 | } | ||
184 | |||
173 | for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) { | 185 | for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) { |
174 | atomic_set(&adev->vce.handles[i], 0); | 186 | atomic_set(&adev->vce.handles[i], 0); |
175 | adev->vce.filp[i] = NULL; | 187 | adev->vce.filp[i] = NULL; |
@@ -190,6 +202,8 @@ int amdgpu_vce_sw_fini(struct amdgpu_device *adev) | |||
190 | if (adev->vce.vcpu_bo == NULL) | 202 | if (adev->vce.vcpu_bo == NULL) |
191 | return 0; | 203 | return 0; |
192 | 204 | ||
205 | amd_sched_entity_fini(&adev->vce.ring[0].sched, &adev->vce.entity); | ||
206 | |||
193 | amdgpu_bo_unref(&adev->vce.vcpu_bo); | 207 | amdgpu_bo_unref(&adev->vce.vcpu_bo); |
194 | 208 | ||
195 | amdgpu_ring_fini(&adev->vce.ring[0]); | 209 | amdgpu_ring_fini(&adev->vce.ring[0]); |
@@ -481,7 +495,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, | |||
481 | 495 | ||
482 | amdgpu_job_free(job); | 496 | amdgpu_job_free(job); |
483 | } else { | 497 | } else { |
484 | r = amdgpu_job_submit(job, ring, NULL, | 498 | r = amdgpu_job_submit(job, ring, &ring->adev->vce.entity, |
485 | AMDGPU_FENCE_OWNER_UNDEFINED, &f); | 499 | AMDGPU_FENCE_OWNER_UNDEFINED, &f); |
486 | if (r) | 500 | if (r) |
487 | goto err; | 501 | goto err; |