From ab593b9ccd3132404406ef6340348fdb28c23bf0 Mon Sep 17 00:00:00 2001 From: Sachit Kadle Date: Wed, 14 Sep 2016 11:45:38 -0700 Subject: gpu: nvgpu: make deferred clean-up conditional This change makes the invocation of the deferred job clean-up mechanism conditional. For submissions that require job tracking, deferred clean-up is only required if any of the following conditions are met: 1) Channel's deterministic flag is not set 2) Rail-gating is enabled 3) Channel WDT is enabled 4) Buffer refcounting is enabled 5) Dependency on Sync Framework In case deferred clean-up is not needed, we clean-up a single job tracking resource in the submit path. For deterministic channels, we do not allow deferred clean-up to occur and fail any submits that require it. Bug 1795076 Change-Id: I4021dffe8a71aa58f12db6b58518d3f4021f3313 Signed-off-by: Sachit Kadle Reviewed-on: http://git-master/r/1220920 Reviewed-by: mobile promotions Tested-by: mobile promotions (cherry picked from commit b09f7589d5ad3c496e7350f1ed583a4fe2db574a) Reviewed-on: http://git-master/r/1223941 GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom Tested-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/fence_gk20a.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/fence_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/fence_gk20a.c b/drivers/gpu/nvgpu/gk20a/fence_gk20a.c index 7228f6f7..4673f28c 100644 --- a/drivers/gpu/nvgpu/gk20a/fence_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fence_gk20a.c @@ -272,8 +272,24 @@ static int gk20a_syncpt_fence_wait(struct gk20a_fence *f, long timeout) static bool gk20a_syncpt_fence_is_expired(struct gk20a_fence *f) { - return nvhost_syncpt_is_expired_ext(f->host1x_pdev, f->syncpt_id, - f->syncpt_value); + + /* + * In cases we don't register a notifier, we can't expect the + * syncpt value to be updated. For this case, we force a read + * of the value from HW, and then check for expiration. + */ + if (!nvhost_syncpt_is_expired_ext(f->host1x_pdev, f->syncpt_id, + f->syncpt_value)) { + u32 val; + + if (!nvhost_syncpt_read_ext_check(f->host1x_pdev, + f->syncpt_id, &val)) { + return nvhost_syncpt_is_expired_ext(f->host1x_pdev, + f->syncpt_id, f->syncpt_value); + } + } + + return true; } static const struct gk20a_fence_ops gk20a_syncpt_fence_ops = { -- cgit v1.2.2