aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0445-drm-amdgpu-use-sched_job_init-to-initialize-sched_jo.patch
blob: 9cc2a2f81c29b49c519107163da94a2027f76842 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
From 8bf3466e1b68d40f331f2a1b2987d5544ccd2e09 Mon Sep 17 00:00:00 2001
From: Monk Liu <Monk.Liu@amd.com>
Date: Mon, 7 Mar 2016 12:49:55 +0800
Subject: [PATCH 0445/1110] drm/amdgpu: use sched_job_init to initialize
 sched_job

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Kalyan Alle <kalyan.alle@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c        | 31 +++++++++++----------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_job.c       | 14 ++++++------
 drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 17 +++++++++++++++
 drivers/gpu/drm/amd/scheduler/gpu_scheduler.h |  5 ++++-
 4 files changed, 42 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 170b8da..ed6d8b3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -914,32 +914,27 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
 			    union drm_amdgpu_cs *cs)
 {
         struct amdgpu_ring *ring = p->job->ring;
-	struct amd_sched_fence *fence;
+        struct fence *fence;
 	struct amdgpu_job *job;
+	int r;
 
         job = p->job;
         p->job = NULL;
 
-
-	job->base.sched = &ring->sched;
-	job->base.s_entity = &p->ctx->rings[ring->idx].entity;
-	job->owner = p->filp;
-	job->free_job = amdgpu_cs_free_job;
-
-	fence = amd_sched_fence_create(job->base.s_entity, p->filp);
-	if (!fence) {
-		amdgpu_cs_free_job(job);
-		kfree(job);
-		return -ENOMEM;
+        r = amd_sched_job_init(&job->base, &ring->sched,
+                                                &p->ctx->rings[ring->idx].entity,
+                                                p->filp, &fence);
+        if (r) {
+	
+ 	         amdgpu_cs_free_job(job);
+		return r;
 	}
 
-	job->base.s_fence = fence;
-	p->fence = fence_get(&fence->base);
-
-	cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring,
-					      &fence->base);
+        job->owner = p->filp;
+        p->fence = fence_get(fence);
+        cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, fence);
 	job->ibs[job->num_ibs - 1].sequence = cs->out.handle;
-
+	
 	trace_amdgpu_cs_ioctl(job);
 	amd_sched_entity_push_job(&job->base);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 8a2d54a..b081671 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -87,16 +87,18 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
                       struct amd_sched_entity *entity, void *owner,
                       struct fence **f)
 {
+       struct fence *fence;
+       int r;
        job->ring = ring;
-       job->base.sched = &ring->sched;
-       job->base.s_entity = entity;
-       job->base.s_fence = amd_sched_fence_create(job->base.s_entity, owner);
-       if (!job->base.s_fence)
-               return -ENOMEM;
+       if (!f)
+               return -EINVAL;
 
-       *f = fence_get(&job->base.s_fence->base);
+       r = amd_sched_job_init(&job->base, &ring->sched, entity, owner, &fence);
+       if (r)
+               return r;
 
        job->owner = owner;
+       *f = fence_get(fence);
        amd_sched_entity_push_job(&job->base);
 
        return 0;
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
index a5ff945..b9d5822 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
@@ -335,6 +335,23 @@ void amd_sched_entity_push_job(struct amd_sched_job *sched_job)
 		   amd_sched_entity_in(sched_job));
 }
 
+/* init a sched_job with basic field */
+int amd_sched_job_init(struct amd_sched_job *job,
+						struct amd_gpu_scheduler *sched,
+						struct amd_sched_entity *entity,
+						void *owner, struct fence **fence)
+{
+	job->sched = sched;
+	job->s_entity = entity;
+	job->s_fence = amd_sched_fence_create(entity, owner);
+	if (!job->s_fence)
+		return -ENOMEM;
+
+	if (fence)
+		*fence = &job->s_fence->base;
+	return 0;
+}
+
 /**
  * Return ture if we can push more jobs to the hw.
  */
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
index 9403145..74bbec8 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
@@ -144,5 +144,8 @@ struct amd_sched_fence *amd_sched_fence_create(
 	struct amd_sched_entity *s_entity, void *owner);
 void amd_sched_fence_scheduled(struct amd_sched_fence *fence);
 void amd_sched_fence_signal(struct amd_sched_fence *fence);
-
+int amd_sched_job_init(struct amd_sched_job *job,
+					struct amd_gpu_scheduler *sched,
+					struct amd_sched_entity *entity,
+					void *owner, struct fence **fence);
 #endif
-- 
2.7.4