video: tegra: host: Use host1x_readl/writel
[linux-3.10.git] / include / linux / nvhost.h
1 /*
2  * include/linux/nvhost.h
3  *
4  * Tegra graphics host driver
5  *
6  * Copyright (c) 2009-2013, NVIDIA Corporation. All rights reserved.
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 __LINUX_NVHOST_H
24 #define __LINUX_NVHOST_H
25
26 #include <linux/cdev.h>
27 #include <linux/device.h>
28 #include <linux/types.h>
29 #include <linux/devfreq.h>
30 #include <linux/platform_device.h>
31 #include <linux/pm_domain.h>
32 #include <linux/pm_qos.h>
33 #include <linux/time.h>
34
35 struct nvhost_master;
36 struct nvhost_hwctx;
37 struct nvhost_device_power_attr;
38 struct nvhost_device_profile;
39 struct mem_mgr;
40 struct nvhost_as_moduleops;
41
42 #define NVHOST_MODULE_MAX_CLOCKS                7
43 #define NVHOST_MODULE_MAX_POWERGATE_IDS         2
44 #define NVHOST_MODULE_MAX_SYNCPTS               8
45 #define NVHOST_MODULE_MAX_WAITBASES             3
46 #define NVHOST_MODULE_MAX_MODMUTEXES            5
47 #define NVHOST_MODULE_MAX_IORESOURCE_MEM        3
48 #define NVHOST_MODULE_NO_POWERGATE_IDS          .powergate_ids = {-1, -1}
49 #define NVHOST_DEFAULT_CLOCKGATE_DELAY          .clockgate_delay = 25
50 #define NVHOST_MODULE_MAX_IORESOURCE_MEM 3
51 #define NVHOST_NAME_SIZE                        24
52 #define NVSYNCPT_INVALID                        (-1)
53
54 #define NVSYNCPT_GRAPHICS_HOST          (0)     /* t20, t30, t114, t148 */
55 #define NVSYNCPT_DISP0_D                (5)     /* t20, t30, t114, t148 */
56 #define NVSYNCPT_DISP0_H                (6)     /* t20, t30, t114, t148 */
57 #define NVSYNCPT_DISP1_H                (7)     /* t20, t30, t114, t148 */
58 #define NVSYNCPT_DISP0_A                (8)     /* t20, t30, t114, t148 */
59 #define NVSYNCPT_DISP1_A                (9)     /* t20, t30, t114, t148 */
60 #define NVSYNCPT_AVP_0                  (10)    /* t20, t30, t114, t148 */
61 #define NVSYNCPT_CSI_VI_0               (11)    /* t20, t30, t114, t148 */
62 #define NVSYNCPT_CSI_VI_1               (12)    /* t20, t30, t114, t148 */
63 #define NVSYNCPT_VI_ISP_0               (13)    /* t20, t30, t114, t148 */
64 #define NVSYNCPT_VI_ISP_1               (14)    /* t20, t30, t114, t148 */
65 #define NVSYNCPT_VI_ISP_2               (15)    /* t20, t30, t114, t148 */
66 #define NVSYNCPT_VI_ISP_3               (16)    /* t20, t30, t114, t148 */
67 #define NVSYNCPT_VI_ISP_4               (17)    /* t20, t30, t114, t148 */
68 #define NVSYNCPT_2D_0                   (18)    /* t20, t30, t114, t148 */
69 #define NVSYNCPT_VIC                    (18)    /* t124 */
70 #define NVSYNCPT_2D_1                   (19)    /* t20, t30, t114, t148 */
71 #define NVSYNCPT_MSENC_SLICE            (19)    /* t124 */
72 #define NVSYNCPT_DISP0_B                (20)    /* t20, t30, t114, t148 */
73 #define NVSYNCPT_DISP1_B                (21)    /* t20, t30, t114, t148 */
74 #define NVSYNCPT_3D                     (22)    /* t20, t30, t114, t148 */
75 #define NVSYNCPT_MPE                    (23)    /* t20, t30 */
76 #define NVSYNCPT_MSENC                  (23)    /* t114, t148 */
77 #define NVSYNCPT_DISP0_C                (24)    /* t20, t30, t114, t148 */
78 #define NVSYNCPT_DISP1_C                (25)    /* t20, t30, t114, t148 */
79 #define NVSYNCPT_VBLANK0                (26)    /* t20, t30, t114, t148 */
80 #define NVSYNCPT_VBLANK1                (27)    /* t20, t30, t114, t148 */
81 #define NVSYNCPT_MPE_EBM_EOF            (28)    /* t20, t30 */
82 #define NVSYNCPT_TSEC                   (28)    /* t114, t148 */
83 #define NVSYNCPT_MPE_WR_SAFE            (29)    /* t20, t30 */
84 #define NVSYNCPT_DSI                    (31)    /* t20, t30, t114, t148 */
85 #define NVSYNCPT_ISP_0_0                (32)    /* t124 */
86 #define NVSYNCPT_ISP_0_1                (33)    /* t124 */
87 #define NVSYNCPT_ISP_0_2                (34)    /* t124 */
88 #define NVSYNCPT_ISP_0_3                (35)    /* t124 */
89 #define NVSYNCPT_ISP_1_0                (36)    /* t124 */
90 #define NVSYNCPT_ISP_1_1                (37)    /* t124 */
91 #define NVSYNCPT_ISP_1_2                (38)    /* t124 */
92 #define NVSYNCPT_ISP_1_3                (39)    /* t124 */
93 #define NVSYNCPT_VI_0_0                 (40)    /* t124 */
94 #define NVSYNCPT_VI_0_1                 (41)    /* t124 */
95 #define NVSYNCPT_VI_0_2                 (42)    /* t124 */
96 #define NVSYNCPT_VI_0_3                 (43)    /* t124 */
97 #define NVSYNCPT_VI_0_4                 (44)    /* t124 */
98 #define NVSYNCPT_VI_1_0                 (45)    /* t124 */
99 #define NVSYNCPT_VI_1_1                 (46)    /* t124 */
100 #define NVSYNCPT_VI_1_2                 (47)    /* t124 */
101 #define NVSYNCPT_VI_1_3                 (48)    /* t124 */
102 #define NVSYNCPT_VI_1_4                 (49)    /* t124 */
103
104 #define NVWAITBASE_2D_0                 (1)     /* t20, t30, t114 */
105 #define NVWAITBASE_2D_1                 (2)     /* t20, t30, t114 */
106 #define NVWAITBASE_3D                   (3)     /* t20, t30, t114 */
107 #define NVWAITBASE_MPE                  (4)     /* t20, t30 */
108 #define NVWAITBASE_MSENC                (4)     /* t114, t148 */
109 #define NVWAITBASE_TSEC                 (5)     /* t114, t148 */
110
111 #define NVMODMUTEX_2D_FULL              (1)     /* t20, t30, t114, t148 */
112 #define NVMODMUTEX_ISP_0                (1)     /* t124 */
113 #define NVMODMUTEX_2D_SIMPLE            (2)     /* t20, t30, t114, t148 */
114 #define NVMODMUTEX_ISP_1                (2)     /* t124 */
115 #define NVMODMUTEX_2D_SB_A              (3)     /* t20, t30, t114, t148 */
116 #define NVMODMUTEX_2D_SB_B              (4)     /* t20, t30, t114, t148 */
117 #define NVMODMUTEX_3D                   (5)     /* t20, t30, t114, t148 */
118 #define NVMODMUTEX_DISPLAYA             (6)     /* t20, t30, t114, t148 */
119 #define NVMODMUTEX_DISPLAYB             (7)     /* t20, t30, t114, t148 */
120 #define NVMODMUTEX_VI                   (8)     /* t20, t30, t114 */
121 #define NVMODMUTEX_VI_0                 (8)     /* t148 */
122 #define NVMODMUTEX_DSI                  (9)     /* t20, t30, t114, t148 */
123 #define NVMODMUTEX_VIC                  (10)    /* t124 */
124 #define NVMODMUTEX_VI_1                 (11)    /* t124 */
125
126 /* sync points that are wholly managed by the client */
127 #define NVSYNCPTS_CLIENT_MANAGED ( \
128         BIT(NVSYNCPT_DISP0_A) | BIT(NVSYNCPT_DISP1_A) | \
129         BIT(NVSYNCPT_DISP0_B) | BIT(NVSYNCPT_DISP1_B) | \
130         BIT(NVSYNCPT_DISP0_C) | BIT(NVSYNCPT_DISP1_C) | \
131         BIT(NVSYNCPT_DISP0_D) | \
132         BIT(NVSYNCPT_DISP0_H) | BIT(NVSYNCPT_DISP1_H) | \
133         BIT(NVSYNCPT_DSI) | \
134         BIT(NVSYNCPT_VBLANK0) | BIT(NVSYNCPT_VBLANK1) | \
135         BIT(NVSYNCPT_CSI_VI_0) | BIT(NVSYNCPT_CSI_VI_1) | \
136         BIT(NVSYNCPT_VI_ISP_1) | BIT(NVSYNCPT_VI_ISP_2) | \
137         BIT(NVSYNCPT_VI_ISP_3) | BIT(NVSYNCPT_VI_ISP_4) | \
138         BIT(NVSYNCPT_MPE_EBM_EOF) | BIT(NVSYNCPT_MPE_WR_SAFE) | \
139         BIT(NVSYNCPT_2D_1) | BIT(NVSYNCPT_AVP_0))
140
141 enum nvhost_power_sysfs_attributes {
142         NVHOST_POWER_SYSFS_ATTRIB_CLOCKGATE_DELAY = 0,
143         NVHOST_POWER_SYSFS_ATTRIB_POWERGATE_DELAY,
144         NVHOST_POWER_SYSFS_ATTRIB_MAX
145 };
146
147 struct nvhost_notification {
148         struct {                        /* 0000- */
149                 __u32 nanoseconds[2];   /* nanoseconds since Jan. 1, 1970 */
150         } time_stamp;                   /* -0007 */
151         __u32 info32;   /* info returned depends on method 0008-000b */
152 #define NVHOST_CHANNEL_FIFO_ERROR_IDLE_TIMEOUT  8
153 #define NVHOST_CHANNEL_GR_ERROR_SW_NOTIFY       13
154 #define NVHOST_CHANNEL_GR_SEMAPHORE_TIMEOUT     24
155 #define NVHOST_CHANNEL_GR_ILLEGAL_NOTIFY        25
156 #define NVHOST_CHANNEL_FIFO_ERROR_MMU_ERR_FLT   31
157         __u16 info16;   /* info returned depends on method 000c-000d */
158         __u16 status;   /* user sets bit 15, NV sets status 000e-000f */
159 };
160
161 struct nvhost_clock {
162         char *name;
163         unsigned long default_rate;
164         u32 moduleid;
165         int reset;
166         unsigned long devfreq_rate;
167 };
168
169 struct nvhost_device_data {
170         int             version;        /* ip version number of device */
171         int             id;             /* Separates clients of same hw */
172         int             index;          /* Hardware channel number */
173         void __iomem    *aperture[NVHOST_MODULE_MAX_IORESOURCE_MEM];
174         struct device_dma_parameters dma_parms;
175
176         u32             syncpts[NVHOST_MODULE_MAX_SYNCPTS];
177         u32             syncpt_base;    /* Device sync point base */
178         u32             waitbases[NVHOST_MODULE_MAX_WAITBASES];
179         u32             modulemutexes[NVHOST_MODULE_MAX_MODMUTEXES];
180         u32             moduleid;       /* Module id for user space API */
181
182         u32             class;          /* Device class */
183         bool            exclusive;      /* True if only one user at a time */
184         bool            keepalive;      /* Do not power gate when opened */
185         bool            waitbasesync;   /* Force sync of wait bases */
186         bool            powerup_reset;  /* Do a reset after power un-gating */
187         bool            serialize;      /* Serialize submits in the channel */
188
189         int             powergate_ids[NVHOST_MODULE_MAX_POWERGATE_IDS];
190         bool            can_powergate;  /* True if module can be power gated */
191         int             clockgate_delay;/* Delay before clock gated */
192         int             powergate_delay;/* Delay before power gated */
193         struct nvhost_clock clocks[NVHOST_MODULE_MAX_CLOCKS];/* Clock names */
194
195         struct platform_device *master; /* Master of a slave device */
196         struct platform_device *slave;  /* Slave device to create in probe */
197         int             slave_initialized;
198
199         int             num_clks;       /* Number of clocks opened for dev */
200         struct clk      *clk[NVHOST_MODULE_MAX_CLOCKS];
201         struct mutex    lock;           /* Power management lock */
202         struct list_head client_list;   /* List of clients and rate requests */
203
204         struct nvhost_channel *channel; /* Channel assigned for the module */
205
206         /* device node for ctrl block */
207         struct device *ctrl_node;
208         struct cdev ctrl_cdev;
209         const struct file_operations *ctrl_ops;    /* ctrl ops for the module */
210
211         /* address space operations */
212         const struct nvhost_as_moduleops *as_ops;
213
214         /* module debugger */
215         struct device *dbg_node;
216         struct cdev dbg_cdev;
217         const struct file_operations *dbg_ops;
218
219         /* module profiler */
220         struct device *prof_node;
221         struct cdev prof_cdev;
222         const struct file_operations *prof_ops;
223
224         struct kobject *power_kobj;     /* kobject to hold power sysfs entries */
225         struct nvhost_device_power_attr *power_attrib;  /* sysfs attributes */
226         struct dentry *debugfs;         /* debugfs directory */
227
228         u32 nvhost_timeout_default;
229
230         /* Data for devfreq usage */
231         struct devfreq                  *power_manager;
232         /* Private device profile data */
233         struct nvhost_device_profile    *power_profile;
234         /* Should we read load estimate from hardware? */
235         bool                            actmon_enabled;
236         /* Should we do linear emc scaling? */
237         bool                            linear_emc;
238         /* Should the load value be delivered forward to edp? */
239         bool                            gpu_edp_device;
240         /* Offset to actmon registers */
241         u32                             actmon_regs;
242         /* Devfreq governor name */
243         const char                      *devfreq_governor;
244
245         void *private_data;             /* private platform data */
246         struct platform_device *pdev;   /* owner platform_device */
247
248         struct dev_pm_qos_request no_poweroff_req;
249
250 #ifdef CONFIG_PM_GENERIC_DOMAINS
251         struct generic_pm_domain pd;    /* power domain representing power partition */
252 #endif
253         /* forces the context restore gather for each submit */
254         bool            force_context_restore;
255
256         /* Finalize power on. Can be used for context restore. */
257         int (*finalize_poweron)(struct platform_device *dev);
258
259         /*
260          * Reset the unit. Used for timeout recovery, resetting the unit on
261          * probe and when un-powergating.
262          */
263         void (*reset)(struct platform_device *dev);
264
265         /* Device is busy. */
266         void (*busy)(struct platform_device *);
267
268         /* Device is idle. */
269         void (*idle)(struct platform_device *);
270
271         /* Device is going to be suspended */
272         void (*suspend_ndev)(struct device *);
273
274         /* Scaling init is run on device registration */
275         void (*scaling_init)(struct platform_device *dev);
276
277         /* Scaling deinit is called on device unregistration */
278         void (*scaling_deinit)(struct platform_device *dev);
279
280         /* Postscale callback is called after frequency change */
281         void (*scaling_post_cb)(struct nvhost_device_profile *profile,
282                                 unsigned long freq);
283
284         /* Device is initialized */
285         int (*init)(struct platform_device *dev);
286
287         /* Device is de-initialized. */
288         void (*deinit)(struct platform_device *dev);
289
290         /* Preparing for power off. Used for context save. */
291         int (*prepare_poweroff)(struct platform_device *dev);
292
293         /* Allocates a context handler for the device */
294         struct nvhost_hwctx_handler *(*alloc_hwctx_handler)(u32 syncpt,
295                         u32 waitbase, struct nvhost_channel *ch);
296
297         /* Read module register into memory */
298         int (*read_reg)(struct platform_device *dev,
299                         struct nvhost_channel *ch,
300                         struct nvhost_hwctx *hwctx,
301                         u32 offset,
302                         u32 *value);
303
304         /* Callback when a clock is changed */
305         void (*update_clk)(struct platform_device *dev);
306 };
307
308
309 static inline
310 struct nvhost_device_data *nvhost_get_devdata(struct platform_device *pdev)
311 {
312         return (struct nvhost_device_data *)platform_get_drvdata(pdev);
313 }
314
315 enum nvhost_devfreq_busy {
316         DEVICE_IDLE = 0,
317         DEVICE_BUSY = 1
318 };
319
320 struct nvhost_devfreq_ext_stat {
321         enum nvhost_devfreq_busy        busy;
322         unsigned long                   max_freq;
323         unsigned long                   min_freq;
324 };
325
326 struct nvhost_device_power_attr {
327         struct platform_device *ndev;
328         struct kobj_attribute power_attr[NVHOST_POWER_SYSFS_ATTRIB_MAX];
329 };
330
331 void host1x_writel(struct platform_device *dev, u32 r, u32 v);
332 u32 host1x_readl(struct platform_device *dev, u32 r);
333
334 /* public host1x power management APIs */
335 bool nvhost_module_powered_ext(struct platform_device *dev);
336 void nvhost_module_busy_ext(struct platform_device *dev);
337 void nvhost_module_idle_ext(struct platform_device *dev);
338
339 /* public host1x sync-point management APIs */
340 u32 nvhost_syncpt_incr_max_ext(struct platform_device *dev, u32 id, u32 incrs);
341 void nvhost_syncpt_cpu_incr_ext(struct platform_device *dev, u32 id);
342 u32 nvhost_syncpt_read_ext(struct platform_device *dev, u32 id);
343 int nvhost_syncpt_wait_timeout_ext(struct platform_device *dev, u32 id, u32 thresh,
344         u32 timeout, u32 *value, struct timespec *ts);
345 int nvhost_syncpt_create_fence_single_ext(struct platform_device *dev,
346         u32 id, u32 thresh, const char *name, int *fence_fd);
347
348 /* Hacky way to get access to struct nvhost_device_data for VI device. */
349 extern struct nvhost_device_data t20_vi_info;
350 extern struct nvhost_device_data t30_vi_info;
351 extern struct nvhost_device_data t11_vi_info;
352 extern struct nvhost_device_data t14_vi_info;
353
354 #endif