/*
* drivers/video/tegra/host/nvhost_job.h
*
* Tegra Graphics Host Interrupt Management
*
* Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef __NVHOST_JOB_H
#define __NVHOST_JOB_H
#include
#include
#include
struct nvhost_channel;
struct nvhost_hwctx;
struct nvhost_waitchk;
struct nvhost_syncpt;
struct sg_table;
struct nvhost_job_gather {
u32 words;
struct sg_table *mem_sgt;
dma_addr_t mem_base;
ulong mem_id;
u32 class_id;
int offset;
struct dma_buf *buf;
int pre_fence;
};
struct nvhost_job_syncpt {
u32 id;
u32 incrs;
u32 fence;
u32 waitbase;
};
struct nvhost_pinid {
u32 id;
u32 index;
};
struct nvhost_job_unpin {
struct sg_table *sgt;
struct dma_buf *buf;
struct dma_buf_attachment *attach;
};
/*
* Each submit is tracked as a nvhost_job.
*/
struct nvhost_job {
/* When refcount goes to zero, job can be freed */
struct kref ref;
/* List entry */
struct list_head list;
/* Channel where job is submitted to */
struct nvhost_channel *ch;
/* Hardware context valid for this client */
struct nvhost_hwctx *hwctx;
int clientid;
/* Gathers and their memory */
struct nvhost_job_gather *gathers;
int num_gathers;
/* Wait checks to be processed at submit time */
struct nvhost_waitchk *waitchk;
int num_waitchk;
/* Array of handles to be pinned & unpinned */
struct nvhost_reloc *relocarray;
struct nvhost_reloc_shift *relocshiftarray;
int num_relocs;
struct nvhost_job_unpin *unpins;
int num_unpins;
struct nvhost_pinid *pin_ids;
dma_addr_t *addr_phys;
dma_addr_t *gather_addr_phys;
dma_addr_t *reloc_addr_phys;
/* Sync point id, number of increments and end related to the submit */
struct nvhost_job_syncpt *sp;
int num_syncpts;
/* Hold number to the "stream syncpoint" index */
int hwctx_syncpt_idx;
/* Priority of this submit. */
int priority;
/* Maximum time to wait for this job */
int timeout;
/* Do debug dump after timeout */
bool timeout_debug_dump;
/* Null kickoff prevents submit from being sent to hardware */
bool null_kickoff;
/* Index and number of slots used in the push buffer */
int first_get;
int num_slots;
/* Context to be freed */
struct nvhost_hwctx *hwctxref;
/* Set to true to force an added wait-for-idle before the job */
int serialize;
};
/*
* Allocate memory for a job. Just enough memory will be allocated to
* accomodate the submit announced in submit header.
*/
struct nvhost_job *nvhost_job_alloc(struct nvhost_channel *ch,
struct nvhost_hwctx *hwctx,
int num_cmdbufs, int num_relocs, int num_waitchks,
int num_syncpts);
/*
* Add a gather to a job.
*/
void nvhost_job_add_gather(struct nvhost_job *job,
u32 mem_id, u32 words, u32 offset, u32 class_id, int pre_fence);
/*
* Increment reference going to nvhost_job.
*/
void nvhost_job_get(struct nvhost_job *job);
/*
* Increment reference for a hardware context.
*/
void nvhost_job_get_hwctx(struct nvhost_job *job, struct nvhost_hwctx *hwctx);
/*
* Decrement reference job, free if goes to zero.
*/
void nvhost_job_put(struct nvhost_job *job);
/*
* Pin memory related to job. This handles relocation of addresses to the
* host1x address space. Handles both the gather memory and any other memory
* referred to from the gather buffers.
*
* Handles also patching out host waits that would wait for an expired sync
* point value.
*/
int nvhost_job_pin(struct nvhost_job *job, struct nvhost_syncpt *sp);
/*
* Unpin memory related to job.
*/
void nvhost_job_unpin(struct nvhost_job *job);
/*
* Dump contents of job to debug output.
*/
void nvhost_job_dump(struct device *dev, struct nvhost_job *job);
#endif