diff options
author | Arto Merilainen <amerilainen@nvidia.com> | 2016-11-08 12:51:32 -0500 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2016-11-11 09:21:07 -0500 |
commit | f08ef2d1a1a9aaa756823e847f9eb74f3658393a (patch) | |
tree | b85bae54e2b042368f6099c1140685c3af1e285c | |
parent | cc09cb6da9b0eefe4b4e47a73170a349c4cf3426 (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.c | 9 |
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) |