diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 6 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | 6 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/platform_gk20a.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c | 5 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/fifo_vgpu.c | 2 |
6 files changed, 12 insertions, 11 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 03163575..de51e83e 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -318,7 +318,6 @@ static void channel_gk20a_bind(struct channel_gk20a *ch_gk20a) | |||
318 | void channel_gk20a_unbind(struct channel_gk20a *ch_gk20a) | 318 | void channel_gk20a_unbind(struct channel_gk20a *ch_gk20a) |
319 | { | 319 | { |
320 | struct gk20a *g = ch_gk20a->g; | 320 | struct gk20a *g = ch_gk20a->g; |
321 | struct gk20a_platform *platform = gk20a_get_platform(g->dev); | ||
322 | 321 | ||
323 | gk20a_dbg_fn(""); | 322 | gk20a_dbg_fn(""); |
324 | 323 | ||
@@ -334,7 +333,7 @@ void channel_gk20a_unbind(struct channel_gk20a *ch_gk20a) | |||
334 | * resource at this point | 333 | * resource at this point |
335 | * if not, then it will be destroyed at channel_free() | 334 | * if not, then it will be destroyed at channel_free() |
336 | */ | 335 | */ |
337 | if (ch_gk20a->sync && platform->sync_aggressive_destroy) { | 336 | if (ch_gk20a->sync && ch_gk20a->sync->aggressive_destroy) { |
338 | ch_gk20a->sync->destroy(ch_gk20a->sync); | 337 | ch_gk20a->sync->destroy(ch_gk20a->sync); |
339 | ch_gk20a->sync = NULL; | 338 | ch_gk20a->sync = NULL; |
340 | } | 339 | } |
@@ -1470,7 +1469,6 @@ void gk20a_channel_update(struct channel_gk20a *c, int nr_completed) | |||
1470 | { | 1469 | { |
1471 | struct vm_gk20a *vm = c->vm; | 1470 | struct vm_gk20a *vm = c->vm; |
1472 | struct channel_gk20a_job *job, *n; | 1471 | struct channel_gk20a_job *job, *n; |
1473 | struct gk20a_platform *platform = gk20a_get_platform(c->g->dev); | ||
1474 | 1472 | ||
1475 | trace_gk20a_channel_update(c); | 1473 | trace_gk20a_channel_update(c); |
1476 | 1474 | ||
@@ -1508,7 +1506,7 @@ void gk20a_channel_update(struct channel_gk20a *c, int nr_completed) | |||
1508 | * the sync resource | 1506 | * the sync resource |
1509 | */ | 1507 | */ |
1510 | if (list_empty(&c->jobs)) { | 1508 | if (list_empty(&c->jobs)) { |
1511 | if (c->sync && platform->sync_aggressive_destroy && | 1509 | if (c->sync && c->sync->aggressive_destroy && |
1512 | gk20a_fence_is_expired(c->last_submit.post_fence)) { | 1510 | gk20a_fence_is_expired(c->last_submit.post_fence)) { |
1513 | c->sync->destroy(c->sync); | 1511 | c->sync->destroy(c->sync); |
1514 | c->sync = NULL; | 1512 | c->sync = NULL; |
diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c index a27f08a4..746a2de3 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | |||
@@ -305,6 +305,8 @@ gk20a_channel_syncpt_create(struct channel_gk20a *c) | |||
305 | sp->ops.signal_timeline = gk20a_channel_syncpt_signal_timeline; | 305 | sp->ops.signal_timeline = gk20a_channel_syncpt_signal_timeline; |
306 | sp->ops.destroy = gk20a_channel_syncpt_destroy; | 306 | sp->ops.destroy = gk20a_channel_syncpt_destroy; |
307 | 307 | ||
308 | sp->ops.aggressive_destroy = true; | ||
309 | |||
308 | return &sp->ops; | 310 | return &sp->ops; |
309 | } | 311 | } |
310 | #endif /* CONFIG_TEGRA_GK20A */ | 312 | #endif /* CONFIG_TEGRA_GK20A */ |
@@ -642,6 +644,10 @@ gk20a_channel_semaphore_create(struct channel_gk20a *c) | |||
642 | sema->ops.signal_timeline = gk20a_channel_semaphore_signal_timeline; | 644 | sema->ops.signal_timeline = gk20a_channel_semaphore_signal_timeline; |
643 | sema->ops.destroy = gk20a_channel_semaphore_destroy; | 645 | sema->ops.destroy = gk20a_channel_semaphore_destroy; |
644 | 646 | ||
647 | /* Aggressively destroying the semaphore sync would cause overhead | ||
648 | * since the pool needs to be mapped to GMMU. */ | ||
649 | sema->ops.aggressive_destroy = false; | ||
650 | |||
645 | return &sema->ops; | 651 | return &sema->ops; |
646 | clean_up: | 652 | clean_up: |
647 | gk20a_channel_semaphore_destroy(&sema->ops); | 653 | gk20a_channel_semaphore_destroy(&sema->ops); |
diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h index b2deaff8..a3cd8208 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h | |||
@@ -86,6 +86,9 @@ struct gk20a_channel_sync { | |||
86 | * expired. */ | 86 | * expired. */ |
87 | void (*signal_timeline)(struct gk20a_channel_sync *s); | 87 | void (*signal_timeline)(struct gk20a_channel_sync *s); |
88 | 88 | ||
89 | /* flag to set sync destroy aggressiveness */ | ||
90 | bool aggressive_destroy; | ||
91 | |||
89 | /* Free the resources allocated by gk20a_channel_sync_create. */ | 92 | /* Free the resources allocated by gk20a_channel_sync_create. */ |
90 | void (*destroy)(struct gk20a_channel_sync *s); | 93 | void (*destroy)(struct gk20a_channel_sync *s); |
91 | }; | 94 | }; |
diff --git a/drivers/gpu/nvgpu/gk20a/platform_gk20a.h b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h index cd68f8e1..f4301dab 100644 --- a/drivers/gpu/nvgpu/gk20a/platform_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h | |||
@@ -46,7 +46,6 @@ struct gk20a_platform { | |||
46 | 46 | ||
47 | /* Should be populated at probe. */ | 47 | /* Should be populated at probe. */ |
48 | bool has_syncpoints; | 48 | bool has_syncpoints; |
49 | bool sync_aggressive_destroy; | ||
50 | 49 | ||
51 | /* Should be populated by probe. */ | 50 | /* Should be populated by probe. */ |
52 | struct dentry *debugfs; | 51 | struct dentry *debugfs; |
diff --git a/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c b/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c index 9d17aa86..dfbc1ae0 100644 --- a/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c +++ b/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c | |||
@@ -584,11 +584,6 @@ struct gk20a_platform gk20a_tegra_platform = { | |||
584 | 584 | ||
585 | struct gk20a_platform gm20b_tegra_platform = { | 585 | struct gk20a_platform gm20b_tegra_platform = { |
586 | .has_syncpoints = true, | 586 | .has_syncpoints = true, |
587 | /* | ||
588 | * Enable aggressive reclaiming of sync point, becuase we have | ||
589 | * fewer sync points than channels | ||
590 | */ | ||
591 | .sync_aggressive_destroy = true, | ||
592 | 587 | ||
593 | /* power management configuration */ | 588 | /* power management configuration */ |
594 | .railgate_delay = 500, | 589 | .railgate_delay = 500, |
diff --git a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c index 5310088f..24b9f4be 100644 --- a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c | |||
@@ -63,7 +63,7 @@ static void vgpu_channel_unbind(struct channel_gk20a *ch) | |||
63 | * resource at this point | 63 | * resource at this point |
64 | * if not, then it will be destroyed at channel_free() | 64 | * if not, then it will be destroyed at channel_free() |
65 | */ | 65 | */ |
66 | if (ch->sync && platform->sync_aggressive_destroy) { | 66 | if (ch->sync && ch->sync->aggressive_destroy) { |
67 | ch->sync->destroy(ch->sync); | 67 | ch->sync->destroy(ch->sync); |
68 | ch->sync = NULL; | 68 | ch->sync = NULL; |
69 | } | 69 | } |