7a5f4ceb2cb65c882f694d7cdff6e83973100dc2
[linux-2.6.git] / drivers / video / tegra / host / nvhost_hardware.h
1 /*
2  * drivers/video/tegra/host/nvhost_hardware.h
3  *
4  * Tegra Graphics Host Register Offsets
5  *
6  * Copyright (c) 2010, NVIDIA Corporation.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  */
22
23 #ifndef __NVHOST_HARDWARE_H
24 #define __NVHOST_HARDWARE_H
25
26 #include <linux/types.h>
27 #include <linux/bitops.h>
28
29 /* class ids */
30 enum {
31         NV_HOST1X_CLASS_ID = 0x1,
32         NV_VIDEO_ENCODE_MPEG_CLASS_ID = 0x20,
33         NV_GRAPHICS_3D_CLASS_ID = 0x60
34 };
35
36
37 /* channel registers */
38 #define NV_HOST1X_CHANNELS 8
39 #define NV_HOST1X_CHANNEL0_BASE 0
40 #define NV_HOST1X_CHANNEL_MAP_SIZE_BYTES 16384
41 #define NV_HOST1X_SYNC_MLOCK_NUM 16
42
43 #define HOST1X_CHANNEL_FIFOSTAT         0x00
44 #define HOST1X_CHANNEL_INDDATA          0x0c
45 #define HOST1X_CHANNEL_DMASTART         0x14
46 #define HOST1X_CHANNEL_DMAPUT           0x18
47 #define HOST1X_CHANNEL_DMAGET           0x1c
48 #define HOST1X_CHANNEL_DMAEND           0x20
49 #define HOST1X_CHANNEL_DMACTRL          0x24
50
51 #define HOST1X_SYNC_CF_SETUP(x)         (0x3080 + (4 * (x)))
52
53 #define HOST1X_SYNC_SYNCPT_BASE(x)      (0x3600 + (4 * (x)))
54
55 #define HOST1X_SYNC_CBREAD(x)           (0x3720 + (4 * (x)))
56 #define HOST1X_SYNC_CFPEEK_CTRL         0x374c
57 #define HOST1X_SYNC_CFPEEK_READ         0x3750
58 #define HOST1X_SYNC_CFPEEK_PTRS         0x3754
59 #define HOST1X_SYNC_CBSTAT(x)           (0x3758 + (4 * (x)))
60
61 static inline unsigned nvhost_channel_fifostat_outfentries(u32 reg)
62 {
63         return (reg >> 24) & 0x1f;
64 }
65
66 static inline u32 nvhost_channel_dmactrl(bool stop, bool get_rst, bool init_get)
67 {
68         u32 v = stop ? 1 : 0;
69         if (get_rst)
70                 v |= 2;
71         if (init_get)
72                 v |= 4;
73         return v;
74 }
75
76
77 /* sync registers */
78 #define NV_HOST1X_SYNCPT_NB_PTS 32
79 #define NV_HOST1X_SYNCPT_NB_BASES 8
80 #define NV_HOST1X_NB_MLOCKS 16
81 #define HOST1X_CHANNEL_SYNC_REG_BASE 12288
82
83 enum {
84         HOST1X_SYNC_INTMASK = 0x4,
85         HOST1X_SYNC_INTC0MASK = 0x8,
86         HOST1X_SYNC_HINTSTATUS = 0x20,
87         HOST1X_SYNC_HINTMASK = 0x24,
88         HOST1X_SYNC_HINTSTATUS_EXT = 0x28,
89         HOST1X_SYNC_HINTMASK_EXT = 0x2c,
90         HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS = 0x40,
91         HOST1X_SYNC_SYNCPT_THRESH_CPU1_INT_STATUS = 0x48,
92         HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE = 0x60,
93         HOST1X_SYNC_SYNCPT_THRESH_INT_ENABLE_CPU0 = 0x68,
94         HOST1X_SYNC_USEC_CLK = 0x1a4,
95         HOST1X_SYNC_CTXSW_TIMEOUT_CFG = 0x1a8,
96         HOST1X_SYNC_IP_BUSY_TIMEOUT = 0x1bc,
97         HOST1X_SYNC_IP_READ_TIMEOUT_ADDR = 0x1c0,
98         HOST1X_SYNC_IP_WRITE_TIMEOUT_ADDR = 0x1c4,
99         HOST1X_SYNC_MLOCK_0 = 0x2c0,
100         HOST1X_SYNC_MLOCK_OWNER_0 = 0x340,
101         HOST1X_SYNC_SYNCPT_0 = 0x400,
102         HOST1X_SYNC_SYNCPT_INT_THRESH_0 = 0x500,
103         HOST1X_SYNC_SYNCPT_BASE_0 = 0x600,
104         HOST1X_SYNC_SYNCPT_CPU_INCR = 0x700
105 };
106
107 static inline bool nvhost_sync_hintstatus_ext_ip_read_int(u32 reg)
108 {
109         return (reg & BIT(30)) != 0;
110 }
111
112 static inline bool nvhost_sync_hintstatus_ext_ip_write_int(u32 reg)
113 {
114         return (reg & BIT(31)) != 0;
115 }
116
117 static inline bool nvhost_sync_mlock_owner_ch_owns(u32 reg)
118 {
119         return (reg & BIT(0)) != 0;
120 }
121
122 static inline bool nvhost_sync_mlock_owner_cpu_owns(u32 reg)
123 {
124         return (reg & BIT(1)) != 0;
125 }
126
127 static inline unsigned int nvhost_sync_mlock_owner_owner_chid(u32 reg)
128 {
129         return (reg >> 8) & 0xf;
130 }
131
132
133 /* host class */
134 enum {
135         NV_CLASS_HOST_INCR_SYNCPT = 0x0,
136         NV_CLASS_HOST_WAIT_SYNCPT = 0x8,
137         NV_CLASS_HOST_WAIT_SYNCPT_BASE = 0x9,
138         NV_CLASS_HOST_INCR_SYNCPT_BASE = 0xc,
139         NV_CLASS_HOST_INDOFF = 0x2d,
140         NV_CLASS_HOST_INDDATA = 0x2e
141 };
142
143 static inline u32 nvhost_class_host_wait_syncpt_base(
144         unsigned indx, unsigned base_indx, unsigned offset)
145 {
146         return (indx << 24) | (base_indx << 16) | offset;
147 }
148
149 static inline u32 nvhost_class_host_incr_syncpt_base(
150         unsigned base_indx, unsigned offset)
151 {
152         return (base_indx << 24) | offset;
153 }
154
155 enum {
156         NV_HOST_MODULE_HOST1X = 0,
157         NV_HOST_MODULE_MPE = 1,
158         NV_HOST_MODULE_GR3D = 6
159 };
160
161 static inline u32 nvhost_class_host_indoff_reg_write(
162         unsigned mod_id, unsigned offset, bool auto_inc)
163 {
164         u32 v = (0xf << 28) | (mod_id << 18) | (offset << 2);
165         if (auto_inc)
166                 v |= BIT(27);
167         return v;
168 }
169
170 static inline u32 nvhost_class_host_indoff_reg_read(
171         unsigned mod_id, unsigned offset, bool auto_inc)
172 {
173         u32 v = (mod_id << 18) | (offset << 2) | 1;
174         if (auto_inc)
175                 v |= BIT(27);
176         return v;
177 }
178
179
180 /* cdma opcodes */
181 static inline u32 nvhost_opcode_setclass(
182         unsigned class_id, unsigned offset, unsigned mask)
183 {
184         return (0 << 28) | (offset << 16) | (class_id << 6) | mask;
185 }
186
187 static inline u32 nvhost_opcode_incr(unsigned offset, unsigned count)
188 {
189         return (1 << 28) | (offset << 16) | count;
190 }
191
192 static inline u32 nvhost_opcode_nonincr(unsigned offset, unsigned count)
193 {
194         return (2 << 28) | (offset << 16) | count;
195 }
196
197 static inline u32 nvhost_opcode_mask(unsigned offset, unsigned mask)
198 {
199         return (3 << 28) | (offset << 16) | mask;
200 }
201
202 static inline u32 nvhost_opcode_imm(unsigned offset, unsigned value)
203 {
204         return (4 << 28) | (offset << 16) | value;
205 }
206
207 static inline u32 nvhost_opcode_restart(unsigned address)
208 {
209         return (5 << 28) | (address >> 4);
210 }
211
212 static inline u32 nvhost_opcode_gather(unsigned offset, unsigned count)
213 {
214         return (6 << 28) | (offset << 16) | count;
215 }
216
217 static inline u32 nvhost_opcode_gather_nonincr(unsigned offset, unsigned count)
218 {
219         return (6 << 28) | (offset << 16) | BIT(15) | count;
220 }
221
222 static inline u32 nvhost_opcode_gather_incr(unsigned offset, unsigned count)
223 {
224         return (6 << 28) | (offset << 16) | BIT(15) | BIT(14) | count;
225 }
226
227 #define NVHOST_OPCODE_NOOP nvhost_opcode_nonincr(0, 0)
228
229 #endif /* __NVHOST_HARDWARE_H */
230