diff options
author | Dan Willemsen <dwillemsen@nvidia.com> | 2015-02-17 00:42:47 -0500 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 23:19:07 -0400 |
commit | 6e3d5ac13f2a9740a7dbb21aeb06ba7af4f6bd12 (patch) | |
tree | b1a35e2fa06797f70ff6e4033dae5407ee842d4c /drivers/gpu/nvgpu/gk20a/sync_gk20a.c | |
parent | e6292247ad8abd27c5a9c4f80cdce849ea8bd50b (diff) |
host/gpu: Upgrade to new fence-based sync implementation
Signed-off-by: Dan Willemsen <dwillemsen@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/sync_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/sync_gk20a.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/sync_gk20a.c index 46d0addf..5e15cd5f 100644 --- a/drivers/gpu/nvgpu/gk20a/sync_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/sync_gk20a.c | |||
@@ -141,7 +141,7 @@ static struct gk20a_sync_pt *gk20a_sync_pt_create_shared( | |||
141 | 141 | ||
142 | /* Store the dependency fence for this pt. */ | 142 | /* Store the dependency fence for this pt. */ |
143 | if (dependency) { | 143 | if (dependency) { |
144 | if (dependency->status == 0) { | 144 | if (!atomic_read(&dependency->status)) { |
145 | shared->dep = dependency; | 145 | shared->dep = dependency; |
146 | } else { | 146 | } else { |
147 | shared->dep_timestamp = ktime_get(); | 147 | shared->dep_timestamp = ktime_get(); |
@@ -198,7 +198,6 @@ static int gk20a_sync_pt_has_signaled(struct sync_pt *sync_pt) | |||
198 | { | 198 | { |
199 | struct gk20a_sync_pt *pt = to_gk20a_sync_pt(sync_pt); | 199 | struct gk20a_sync_pt *pt = to_gk20a_sync_pt(sync_pt); |
200 | struct gk20a_sync_timeline *obj = pt->obj; | 200 | struct gk20a_sync_timeline *obj = pt->obj; |
201 | struct sync_pt *pos; | ||
202 | bool signaled; | 201 | bool signaled; |
203 | 202 | ||
204 | if (!pt->sema) | 203 | if (!pt->sema) |
@@ -217,9 +216,12 @@ static int gk20a_sync_pt_has_signaled(struct sync_pt *sync_pt) | |||
217 | * first.*/ | 216 | * first.*/ |
218 | if (pt->dep) { | 217 | if (pt->dep) { |
219 | s64 ns = 0; | 218 | s64 ns = 0; |
220 | struct list_head *dep_pts = &pt->dep->pt_list_head; | 219 | struct fence *fence; |
221 | list_for_each_entry(pos, dep_pts, pt_list) { | 220 | int i; |
222 | ns = max(ns, ktime_to_ns(pos->timestamp)); | 221 | |
222 | for (i = 0; i < pt->dep->num_fences; i++) { | ||
223 | fence = pt->dep->cbs[i].sync_pt; | ||
224 | ns = max(ns, ktime_to_ns(fence->timestamp)); | ||
223 | } | 225 | } |
224 | pt->dep_timestamp = ns_to_ktime(ns); | 226 | pt->dep_timestamp = ns_to_ktime(ns); |
225 | sync_fence_put(pt->dep); | 227 | sync_fence_put(pt->dep); |
@@ -238,7 +240,7 @@ static inline ktime_t gk20a_sync_pt_duration(struct sync_pt *sync_pt) | |||
238 | struct gk20a_sync_pt *pt = to_gk20a_sync_pt(sync_pt); | 240 | struct gk20a_sync_pt *pt = to_gk20a_sync_pt(sync_pt); |
239 | if (!gk20a_sync_pt_has_signaled(sync_pt) || !pt->dep_timestamp.tv64) | 241 | if (!gk20a_sync_pt_has_signaled(sync_pt) || !pt->dep_timestamp.tv64) |
240 | return ns_to_ktime(0); | 242 | return ns_to_ktime(0); |
241 | return ktime_sub(sync_pt->timestamp, pt->dep_timestamp); | 243 | return ktime_sub(sync_pt->base.timestamp, pt->dep_timestamp); |
242 | } | 244 | } |
243 | 245 | ||
244 | static int gk20a_sync_pt_compare(struct sync_pt *a, struct sync_pt *b) | 246 | static int gk20a_sync_pt_compare(struct sync_pt *a, struct sync_pt *b) |