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