aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArto Merilainen <amerilainen@nvidia.com>2016-11-08 12:51:32 -0500
committerThierry Reding <treding@nvidia.com>2016-11-11 09:21:07 -0500
commitf08ef2d1a1a9aaa756823e847f9eb74f3658393a (patch)
treeb85bae54e2b042368f6099c1140685c3af1e285c
parentcc09cb6da9b0eefe4b4e47a73170a349c4cf3426 (diff)
gpu: host1x: Store device address to all bufs
Currently job pinning is optimized to handle only the first buffer using a certain host1x_bo object and all subsequent buffers using the same host1x_bo are considered done. In most cases this is correct, however, in case the same host1x_bo is used in multiple gathers inside the same job, we skip also storing the device address (physical or iova) to this buffer. This patch reworks the host1x_job_pin() to store the device address to all gathers. Signed-off-by: Andrew Chew <achew@nvidia.com> Signed-off-by: Arto Merilainen <amerilainen@nvidia.com> Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/gpu/host1x/job.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c
index a91b7c4a6110..92c3df933303 100644
--- a/drivers/gpu/host1x/job.c
+++ b/drivers/gpu/host1x/job.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * Tegra host1x Job 2 * Tegra host1x Job
3 * 3 *
4 * Copyright (c) 2010-2013, NVIDIA Corporation. 4 * Copyright (c) 2010-2015, NVIDIA Corporation.
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify it 6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License, 7 * under the terms and conditions of the GNU General Public License,
@@ -539,9 +539,12 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev)
539 539
540 g->base = job->gather_addr_phys[i]; 540 g->base = job->gather_addr_phys[i];
541 541
542 for (j = i + 1; j < job->num_gathers; j++) 542 for (j = i + 1; j < job->num_gathers; j++) {
543 if (job->gathers[j].bo == g->bo) 543 if (job->gathers[j].bo == g->bo) {
544 job->gathers[j].handled = true; 544 job->gathers[j].handled = true;
545 job->gathers[j].base = g->base;
546 }
547 }
545 548
546 err = do_relocs(job, g->bo); 549 err = do_relocs(job, g->bo);
547 if (err) 550 if (err)