/*
* drivers/video/tegra/host/nvhost_job.h
*
* Tegra Graphics Host Interrupt Management
*
* Copyright (c) 2011-2019, 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_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;
};
struct nvhost_pinid {
u32 id;
u32 index;
enum dma_data_direction direction;
};
struct nvhost_job_unpin {
struct sg_table *sgt;
struct dma_buf *buf;
struct dma_buf_attachment *attach;
enum dma_data_direction direction;
};
/*
* Each submit is tracked as a nvhost_job.
*/
struct nvhost_job {
/* Total size of job */
size_t size;
/* 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 */
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;
struct nvhost_reloc_type *reloctypearray;
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 */
u32 client_managed_syncpt;
struct nvhost_job_syncpt *sp;
int num_syncpts;
/* Maximum time to wait for this job */
int timeout;
/* Do debug dump after timeout */
bool timeout_debug_dump;
/* Index and number of slots used in the push buffer */
int first_get;
int num_slots;
/* Set to true to force an added wait-for-idle before the job */
int serialize;
/* error notifiers used channel submit timeout */
struct dma_buf *error_notifier_ref;
u64 error_notifier_offset;
/* engine job timestamps */
struct {
dma_addr_t dma;
u64 *ptr;
} engine_timestamps;
};
/*
* 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);
/*
* 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);
/*
* Set error notifier for the job owner to informa userspace about
* an error.
*/
void nvhost_job_set_notifier(struct nvhost_job *job, u32 error);
#endif