aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorMonk Liu <Monk.Liu@amd.com>2016-03-04 05:51:02 -0500
committerAlex Deucher <alexander.deucher@amd.com>2016-05-02 15:19:57 -0400
commit0de2479c953ae07fd11e7b1bc8d4fc831e6842bb (patch)
treeceb625203d34fe6920545e2e08839c7e3e535d03 /drivers/gpu/drm/amd/amdgpu
parentcccd9bce978a6644bae75304a05db4faa36faec7 (diff)
drm/amdgpu: rework TDR in scheduler (v2)
Add two callbacks to scheduler to maintain jobs, and invoked for job timeout calculations. Now TDR measures time gap from job is processed by hw. v2: fix typo Signed-off-by: Monk Liu <Monk.Liu@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@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.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c16
3 files changed, 17 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 9bf72b24495c..ccb28468ece8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -754,6 +754,7 @@ void amdgpu_job_free(struct amdgpu_job *job);
754int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring, 754int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
755 struct amd_sched_entity *entity, void *owner, 755 struct amd_sched_entity *entity, void *owner,
756 struct fence **f); 756 struct fence **f);
757void amdgpu_job_timeout_func(struct work_struct *work);
757 758
758struct amdgpu_ring { 759struct amdgpu_ring {
759 struct amdgpu_device *adev; 760 struct amdgpu_device *adev;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 23266b454aec..9025671d21c3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -871,6 +871,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
871 871
872 r = amd_sched_job_init(&job->base, &ring->sched, 872 r = amd_sched_job_init(&job->base, &ring->sched,
873 &p->ctx->rings[ring->idx].entity, 873 &p->ctx->rings[ring->idx].entity,
874 amdgpu_job_timeout_func,
874 p->filp, &fence); 875 p->filp, &fence);
875 if (r) { 876 if (r) {
876 amdgpu_job_free(job); 877 amdgpu_job_free(job);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 23468088a995..961cae4a1955 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -34,6 +34,15 @@ static void amdgpu_job_free_handler(struct work_struct *ws)
34 kfree(job); 34 kfree(job);
35} 35}
36 36
37void amdgpu_job_timeout_func(struct work_struct *work)
38{
39 struct amdgpu_job *job = container_of(work, struct amdgpu_job, base.work_tdr.work);
40 DRM_ERROR("ring %s timeout, last signaled seq=%u, last emitted seq=%u\n",
41 job->base.sched->name,
42 (uint32_t)atomic_read(&job->ring->fence_drv.last_seq),
43 job->ring->fence_drv.sync_seq);
44}
45
37int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, 46int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
38 struct amdgpu_job **job) 47 struct amdgpu_job **job)
39{ 48{
@@ -103,7 +112,10 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
103 if (!f) 112 if (!f)
104 return -EINVAL; 113 return -EINVAL;
105 114
106 r = amd_sched_job_init(&job->base, &ring->sched, entity, owner, &fence); 115 r = amd_sched_job_init(&job->base, &ring->sched,
116 entity, owner,
117 amdgpu_job_timeout_func,
118 &fence);
107 if (r) 119 if (r)
108 return r; 120 return r;
109 121
@@ -180,4 +192,6 @@ err:
180struct amd_sched_backend_ops amdgpu_sched_ops = { 192struct amd_sched_backend_ops amdgpu_sched_ops = {
181 .dependency = amdgpu_job_dependency, 193 .dependency = amdgpu_job_dependency,
182 .run_job = amdgpu_job_run, 194 .run_job = amdgpu_job_run,
195 .begin_job = amd_sched_job_begin,
196 .finish_job = amd_sched_job_finish,
183}; 197};