video: tegra: host: Syncpoints deliver waitbases
[linux-3.10.git] / drivers / video / tegra / host / nvhost_job.h
1 /*
2  * drivers/video/tegra/host/nvhost_job.h
3  *
4  * Tegra Graphics Host Interrupt Management
5  *
6  * Copyright (c) 2011-2013, NVIDIA Corporation.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifndef __NVHOST_JOB_H
22 #define __NVHOST_JOB_H
23
24 #include <linux/nvhost_ioctl.h>
25 #include <linux/kref.h>
26
27 struct nvhost_channel;
28 struct nvhost_hwctx;
29 struct nvhost_waitchk;
30 struct nvhost_syncpt;
31 struct sg_table;
32
33 struct nvhost_job_gather {
34         u32 words;
35         struct sg_table *mem_sgt;
36         dma_addr_t mem_base;
37         u32 mem_id;
38         int offset;
39         struct mem_handle *ref;
40 };
41
42 struct nvhost_job_syncpt {
43         u32 id;
44         u32 incrs;
45         u32 fence;
46         u32 waitbase;
47 };
48
49 /*
50  * Each submit is tracked as a nvhost_job.
51  */
52 struct nvhost_job {
53         /* When refcount goes to zero, job can be freed */
54         struct kref ref;
55
56         /* List entry */
57         struct list_head list;
58
59         /* Channel where job is submitted to */
60         struct nvhost_channel *ch;
61
62         /* Hardware context valid for this client */
63         struct nvhost_hwctx *hwctx;
64         int clientid;
65
66         /* Nvmap to be used for pinning & unpinning memory */
67         struct mem_mgr *memmgr;
68
69         /* Gathers and their memory */
70         struct nvhost_job_gather *gathers;
71         int num_gathers;
72
73         /* Wait checks to be processed at submit time */
74         struct nvhost_waitchk *waitchk;
75         int num_waitchk;
76
77         /* Array of handles to be pinned & unpinned */
78         struct nvhost_reloc *relocarray;
79         struct nvhost_reloc_shift *relocshiftarray;
80         int num_relocs;
81         struct nvhost_job_unpin *unpins;
82         int num_unpins;
83
84         u32 *pin_ids;
85         dma_addr_t *addr_phys;
86         dma_addr_t *gather_addr_phys;
87         dma_addr_t *reloc_addr_phys;
88
89         /* Sync point id, number of increments and end related to the submit */
90         struct nvhost_job_syncpt *sp;
91         int num_syncpts;
92
93         /* Hold number to the "stream syncpoint" index */
94         int hwctx_syncpt_idx;
95
96         /* Priority of this submit. */
97         int priority;
98
99         /* Maximum time to wait for this job */
100         int timeout;
101
102         /* Do debug dump after timeout */
103         bool timeout_debug_dump;
104
105         /* Null kickoff prevents submit from being sent to hardware */
106         bool null_kickoff;
107
108         /* Index and number of slots used in the push buffer */
109         int first_get;
110         int num_slots;
111
112         /* Context to be freed */
113         struct nvhost_hwctx *hwctxref;
114
115         /* Set to true to force an added wait-for-idle before the job */
116         int serialize;
117 };
118
119 /*
120  * Allocate memory for a job. Just enough memory will be allocated to
121  * accomodate the submit announced in submit header.
122  */
123 struct nvhost_job *nvhost_job_alloc(struct nvhost_channel *ch,
124                 struct nvhost_hwctx *hwctx,
125                 int num_cmdbufs, int num_relocs, int num_waitchks,
126                 int num_syncpts, struct mem_mgr *memmgr);
127
128 /*
129  * Add a gather to a job.
130  */
131 void nvhost_job_add_gather(struct nvhost_job *job,
132                 u32 mem_id, u32 words, u32 offset);
133
134 /*
135  * Increment reference going to nvhost_job.
136  */
137 void nvhost_job_get(struct nvhost_job *job);
138
139 /*
140  * Increment reference for a hardware context.
141  */
142 void nvhost_job_get_hwctx(struct nvhost_job *job, struct nvhost_hwctx *hwctx);
143
144 /*
145  * Decrement reference job, free if goes to zero.
146  */
147 void nvhost_job_put(struct nvhost_job *job);
148
149 /*
150  * Pin memory related to job. This handles relocation of addresses to the
151  * host1x address space. Handles both the gather memory and any other memory
152  * referred to from the gather buffers.
153  *
154  * Handles also patching out host waits that would wait for an expired sync
155  * point value.
156  */
157 int nvhost_job_pin(struct nvhost_job *job, struct nvhost_syncpt *sp);
158
159 /*
160  * Unpin memory related to job.
161  */
162 void nvhost_job_unpin(struct nvhost_job *job);
163
164 /*
165  * Dump contents of job to debug output.
166  */
167 void nvhost_job_dump(struct device *dev, struct nvhost_job *job);
168
169 #endif