Commit 0fddaa85 authored by Mikko Perttunen's avatar Mikko Perttunen Committed by Thierry Reding

gpu: host1x: Add option to skip firewall for a job

The new UAPI will have its own firewall, and we don't want to run
the firewall in the Host1x driver for those jobs. As such, add a
parameter to host1x_job_alloc to specify if we want to skip the
firewall in the Host1x driver.
Signed-off-by: default avatarMikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent e902585f
...@@ -193,7 +193,7 @@ int tegra_drm_submit(struct tegra_drm_context *context, ...@@ -193,7 +193,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
return -EINVAL; return -EINVAL;
job = host1x_job_alloc(context->channel, args->num_cmdbufs, job = host1x_job_alloc(context->channel, args->num_cmdbufs,
args->num_relocs); args->num_relocs, false);
if (!job) if (!job)
return -ENOMEM; return -ENOMEM;
......
...@@ -24,14 +24,18 @@ ...@@ -24,14 +24,18 @@
#define HOST1X_WAIT_SYNCPT_OFFSET 0x8 #define HOST1X_WAIT_SYNCPT_OFFSET 0x8
struct host1x_job *host1x_job_alloc(struct host1x_channel *ch, struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
u32 num_cmdbufs, u32 num_relocs) u32 num_cmdbufs, u32 num_relocs,
bool skip_firewall)
{ {
struct host1x_job *job = NULL; struct host1x_job *job = NULL;
unsigned int num_unpins = num_relocs; unsigned int num_unpins = num_relocs;
bool enable_firewall;
u64 total; u64 total;
void *mem; void *mem;
if (!IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL)) enable_firewall = IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL) && !skip_firewall;
if (!enable_firewall)
num_unpins += num_cmdbufs; num_unpins += num_cmdbufs;
/* Check that we're not going to overflow */ /* Check that we're not going to overflow */
...@@ -48,6 +52,8 @@ struct host1x_job *host1x_job_alloc(struct host1x_channel *ch, ...@@ -48,6 +52,8 @@ struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
if (!job) if (!job)
return NULL; return NULL;
job->enable_firewall = enable_firewall;
kref_init(&job->ref); kref_init(&job->ref);
job->channel = ch; job->channel = ch;
...@@ -214,7 +220,7 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job) ...@@ -214,7 +220,7 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job)
* We will copy gathers BO content later, so there is no need to * We will copy gathers BO content later, so there is no need to
* hold and pin them. * hold and pin them.
*/ */
if (IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL)) if (job->enable_firewall)
return 0; return 0;
for (i = 0; i < job->num_cmds; i++) { for (i = 0; i < job->num_cmds; i++) {
...@@ -321,7 +327,7 @@ static int do_relocs(struct host1x_job *job, struct host1x_job_gather *g) ...@@ -321,7 +327,7 @@ static int do_relocs(struct host1x_job *job, struct host1x_job_gather *g)
if (cmdbuf != reloc->cmdbuf.bo) if (cmdbuf != reloc->cmdbuf.bo)
continue; continue;
if (IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL)) { if (job->enable_firewall) {
target = (u32 *)job->gather_copy_mapped + target = (u32 *)job->gather_copy_mapped +
reloc->cmdbuf.offset / sizeof(u32) + reloc->cmdbuf.offset / sizeof(u32) +
g->offset / sizeof(u32); g->offset / sizeof(u32);
...@@ -634,7 +640,7 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev) ...@@ -634,7 +640,7 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev)
if (err) if (err)
goto out; goto out;
if (IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL)) { if (job->enable_firewall) {
err = copy_gathers(host->dev, job, dev); err = copy_gathers(host->dev, job, dev);
if (err) if (err)
goto out; goto out;
...@@ -653,7 +659,7 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev) ...@@ -653,7 +659,7 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev)
continue; continue;
/* copy_gathers() sets gathers base if firewall is enabled */ /* copy_gathers() sets gathers base if firewall is enabled */
if (!IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL)) if (!job->enable_firewall)
g->base = job->gather_addr_phys[i]; g->base = job->gather_addr_phys[i];
for (j = i + 1; j < job->num_cmds; j++) { for (j = i + 1; j < job->num_cmds; j++) {
...@@ -688,8 +694,7 @@ void host1x_job_unpin(struct host1x_job *job) ...@@ -688,8 +694,7 @@ void host1x_job_unpin(struct host1x_job *job)
struct device *dev = unpin->dev ?: host->dev; struct device *dev = unpin->dev ?: host->dev;
struct sg_table *sgt = unpin->sgt; struct sg_table *sgt = unpin->sgt;
if (!IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL) && if (!job->enable_firewall && unpin->size && host->domain) {
unpin->size && host->domain) {
iommu_unmap(host->domain, job->addr_phys[i], iommu_unmap(host->domain, job->addr_phys[i],
unpin->size); unpin->size);
free_iova(&host->iova, free_iova(&host->iova,
......
...@@ -272,10 +272,14 @@ struct host1x_job { ...@@ -272,10 +272,14 @@ struct host1x_job {
/* Callback called when job is freed */ /* Callback called when job is freed */
void (*release)(struct host1x_job *job); void (*release)(struct host1x_job *job);
void *user_data; void *user_data;
/* Whether host1x-side firewall should be ran for this job or not */
bool enable_firewall;
}; };
struct host1x_job *host1x_job_alloc(struct host1x_channel *ch, struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
u32 num_cmdbufs, u32 num_relocs); u32 num_cmdbufs, u32 num_relocs,
bool skip_firewall);
void host1x_job_add_gather(struct host1x_job *job, struct host1x_bo *bo, void host1x_job_add_gather(struct host1x_job *job, struct host1x_bo *bo,
unsigned int words, unsigned int offset); unsigned int words, unsigned int offset);
void host1x_job_add_wait(struct host1x_job *job, u32 id, u32 thresh, void host1x_job_add_wait(struct host1x_job *job, u32 id, u32 thresh,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment