6cb3d338ebf6b4c4a2ff620fb28ccf32448cd87b
[linux-3.10.git] / drivers / video / tegra / host / nvhost_channel.h
1 /*
2  * drivers/video/tegra/host/nvhost_channel.h
3  *
4  * Tegra Graphics Host Channel
5  *
6  * Copyright (c) 2010-2014, NVIDIA Corporation.  All rights reserved.
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_CHANNEL_H
22 #define __NVHOST_CHANNEL_H
23
24 #include <linux/cdev.h>
25 #include <linux/io.h>
26 #include "nvhost_cdma.h"
27
28 #define NVHOST_MAX_WAIT_CHECKS          256
29 #define NVHOST_MAX_GATHERS              512
30 #define NVHOST_MAX_HANDLES              1280
31 #define NVHOST_MAX_POWERGATE_IDS        2
32
33 struct nvhost_master;
34 struct platform_device;
35 struct nvhost_channel;
36 struct nvhost_hwctx;
37 struct nvhost_alloc_obj_ctx_args;
38 struct nvhost_free_obj_ctx_args;
39 struct nvhost_alloc_gpfifo_args;
40 struct nvhost_gpfifo;
41 struct nvhost_fence;
42 struct nvhost_wait_args;
43 struct nvhost_cycle_stats_args;
44 struct nvhost_zcull_bind_args;
45 struct nvhost_set_error_notifier;
46 struct nvhost_set_priority_args;
47
48 struct nvhost_zcull_ops {
49         int (*bind)(struct nvhost_hwctx *,
50                     struct nvhost_zcull_bind_args *args);
51 };
52
53 struct nvhost_channel_ops {
54         const char *soc_name;
55         int (*init)(struct nvhost_channel *,
56                     struct nvhost_master *,
57                     int chid);
58         int (*submit)(struct nvhost_job *job);
59         int (*save_context)(struct nvhost_channel *channel);
60         int (*alloc_obj)(struct nvhost_hwctx *,
61                         struct nvhost_alloc_obj_ctx_args *args);
62         int (*free_obj)(struct nvhost_hwctx *,
63                         struct nvhost_free_obj_ctx_args *args);
64         int (*alloc_gpfifo)(struct nvhost_hwctx *,
65                         struct nvhost_alloc_gpfifo_args *args);
66         int (*submit_gpfifo)(struct nvhost_hwctx *,
67                         struct nvhost_gpfifo *gpfifo,
68                         u32 num_entries,
69                         struct nvhost_fence *fence,
70                         u32 flags);
71         int (*set_error_notifier)(struct nvhost_hwctx *hwctx,
72                             struct nvhost_set_error_notifier *args);
73         int (*set_priority)(struct nvhost_hwctx *hwctx,
74                             struct nvhost_set_priority_args *args);
75         int (*wait)(struct nvhost_hwctx *,
76                     struct nvhost_wait_args *args);
77 #if defined(CONFIG_TEGRA_GPU_CYCLE_STATS)
78         int (*cycle_stats)(struct nvhost_hwctx *,
79                         struct nvhost_cycle_stats_args *args);
80 #endif
81         struct nvhost_zcull_ops zcull;
82         int (*init_gather_filter)(struct nvhost_channel *ch);
83 };
84
85 struct nvhost_channel {
86         struct nvhost_channel_ops ops;
87         int refcount;
88         int chid;
89         u32 syncpt_id;
90         struct mutex reflock;
91         struct mutex submitlock;
92         void __iomem *aperture;
93         struct nvhost_hwctx *cur_ctx;
94         struct device *node;
95         struct platform_device *dev;
96         struct cdev cdev;
97         struct nvhost_hwctx_handler *ctxhandler;
98         struct nvhost_cdma cdma;
99
100         /* the address space block here
101          * belongs to the module. but for
102          * now just keep it here */
103         struct device *as_node;
104         struct cdev as_cdev;
105         struct nvhost_as *as;
106 };
107
108 #define channel_op(ch)          (ch->ops)
109 #define channel_zcull_op(ch)    (ch->ops.zcull)
110 #define channel_zbc_op(ch)      (ch->zbc)
111
112 int nvhost_channel_init(struct nvhost_channel *ch,
113         struct nvhost_master *dev, int index);
114
115 int nvhost_channel_submit(struct nvhost_job *job);
116
117 struct nvhost_channel *nvhost_getchannel(struct nvhost_channel *ch,
118                 bool force);
119 void nvhost_putchannel(struct nvhost_channel *ch);
120 int nvhost_channel_suspend(struct nvhost_channel *ch);
121
122 int nvhost_channel_read_reg(struct nvhost_channel *channel,
123         struct nvhost_hwctx *hwctx,
124         u32 offset, u32 *value);
125
126 struct nvhost_channel *nvhost_alloc_channel_internal(int chindex,
127         int max_channels, int *current_channel_count);
128
129 void nvhost_free_channel_internal(struct nvhost_channel *ch,
130         int *current_channel_count);
131
132 int nvhost_channel_save_context(struct nvhost_channel *ch);
133 void nvhost_channel_init_gather_filter(struct nvhost_channel *ch);
134
135 struct nvhost_hwctx *nvhost_channel_get_file_hwctx(int fd);
136
137 struct nvhost_hwctx_handler *nvhost_alloc_hwctx_handler(u32 syncpt,
138         u32 waitbase, struct nvhost_channel *ch);
139
140 #endif