Merge commit 'main-jb-2012.08.03-B4' into t114-0806
[linux-2.6.git] / include / linux / nvhost.h
1 /*
2  * include/linux/nvhost.h
3  *
4  * Tegra graphics host driver
5  *
6  * Copyright (c) 2009-2012, 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/device.h>
27 #include <linux/types.h>
28
29 struct nvhost_master;
30
31 struct nvhost_device_power_attr;
32
33 #define NVHOST_MODULE_MAX_CLOCKS                3
34 #define NVHOST_MODULE_MAX_POWERGATE_IDS         2
35 #define NVHOST_MODULE_NO_POWERGATE_IDS          .powergate_ids = {-1, -1}
36 #define NVHOST_DEFAULT_CLOCKGATE_DELAY          .clockgate_delay = 25
37 #define NVHOST_NAME_SIZE                        24
38 #define NVSYNCPT_INVALID                        (-1)
39
40 /* FIXME:
41  * Sync point ids are now split into 2 files.
42  * 1 if this one and other is in
43  * drivers/video/tegra/host/host1x/host1x_syncpt.h
44  * So if someone decides to add new sync point in future
45  * please check both the header files
46  */
47 #define NVSYNCPT_DISP0_A                (8)
48 #define NVSYNCPT_DISP1_A                (9)
49 #define NVSYNCPT_AVP_0                  (10)
50 #define NVSYNCPT_DISP0_B                (20)
51 #define NVSYNCPT_DISP1_B                (21)
52 #define NVSYNCPT_DISP0_C                (24)
53 #define NVSYNCPT_DISP1_C                (25)
54 #define NVSYNCPT_VBLANK0                (26)
55 #define NVSYNCPT_VBLANK1                (27)
56 #define NVSYNCPT_DSI                    (31)
57
58 enum nvhost_power_sysfs_attributes {
59         NVHOST_POWER_SYSFS_ATTRIB_CLOCKGATE_DELAY = 0,
60         NVHOST_POWER_SYSFS_ATTRIB_POWERGATE_DELAY,
61         NVHOST_POWER_SYSFS_ATTRIB_REFCOUNT,
62         NVHOST_POWER_SYSFS_ATTRIB_MAX
63 };
64
65 struct nvhost_device_id {
66         char name[NVHOST_NAME_SIZE];
67         unsigned long version;
68 };
69
70 struct nvhost_clock {
71         char *name;
72         long default_rate;
73 };
74
75 enum nvhost_device_powerstate_t {
76         NVHOST_POWER_STATE_DEINIT,
77         NVHOST_POWER_STATE_RUNNING,
78         NVHOST_POWER_STATE_CLOCKGATED,
79         NVHOST_POWER_STATE_POWERGATED
80 };
81
82 struct nvhost_device {
83         const char      *name;          /* device name */
84         int             version;        /* ip version number of device */
85         struct device   dev;            /* Linux device struct */
86         int             id;             /* Separates clients of same hw */
87         int             index;          /* Hardware channel number */
88         u32             num_resources;  /* Number of resources following */
89         struct resource *resource;      /* Resources (IOMEM in particular) */
90         struct resource *reg_mem;
91         void __iomem    *aperture;      /* Iomem mapped to kernel */
92
93         u32             syncpts;        /* Bitfield of sync points used */
94         u32             waitbases;      /* Bit field of wait bases */
95         u32             modulemutexes;  /* Bit field of module mutexes */
96         u32             moduleid;       /* Module id for user space API */
97
98         u32             class;          /* Device class */
99         bool            exclusive;      /* True if only one user at a time */
100         bool            keepalive;      /* Do not power gate when opened */
101         bool            waitbasesync;   /* Force sync of wait bases */
102         bool            powerup_reset;  /* Do a reset after power un-gating */
103         bool            serialize;      /* Serialize submits in the channel */
104
105         int             powergate_ids[NVHOST_MODULE_MAX_POWERGATE_IDS];
106         bool            can_powergate;  /* True if module can be power gated */
107         int             clockgate_delay;/* Delay before clock gated */
108         int             powergate_delay;/* Delay before power gated */
109         struct nvhost_clock clocks[NVHOST_MODULE_MAX_CLOCKS];/* Clock names */
110
111         struct delayed_work powerstate_down;/* Power state management */
112         int             num_clks;       /* Number of clocks opened for dev */
113         struct clk      *clk[NVHOST_MODULE_MAX_CLOCKS];
114         struct mutex    lock;           /* Power management lock */
115         int             powerstate;     /* Current power state */
116         int             refcount;       /* Number of tasks active */
117         wait_queue_head_t idle_wq;      /* Work queue for idle */
118         struct list_head client_list;   /* List of clients and rate requests */
119
120         struct nvhost_channel *channel; /* Channel assigned for the module */
121         struct kobject *power_kobj;     /* kobject to hold power sysfs entries */
122         struct nvhost_device_power_attr *power_attrib;  /* sysfs attributes */
123 };
124
125 struct nvhost_device_power_attr {
126         struct nvhost_device *ndev;
127         struct kobj_attribute power_attr[NVHOST_POWER_SYSFS_ATTRIB_MAX];
128 };
129
130 /* Register devices to nvhost bus */
131 extern int nvhost_add_devices(struct nvhost_device **, int num);
132
133 /* Register device to nvhost bus */
134 extern int nvhost_device_register(struct nvhost_device *);
135
136 /* Deregister device from nvhost bus */
137 extern void nvhost_device_unregister(struct nvhost_device *);
138
139 extern struct bus_type nvhost_bus_type;
140
141 struct nvhost_driver {
142         int (*probe)(struct nvhost_device *, struct nvhost_device_id *);
143         int (*remove)(struct nvhost_device *);
144         void (*shutdown)(struct nvhost_device *);
145         int (*suspend)(struct nvhost_device *, pm_message_t state);
146         int (*resume)(struct nvhost_device *);
147         struct device_driver driver;
148
149         struct nvhost_device_id *id_table;
150
151         /* Finalize power on. Can be used for context restore. */
152         void (*finalize_poweron)(struct nvhost_device *dev);
153
154         /* Device is busy. */
155         void (*busy)(struct nvhost_device *);
156
157         /* Device is idle. */
158         void (*idle)(struct nvhost_device *);
159
160         /* Device is going to be suspended */
161         void (*suspend_ndev)(struct nvhost_device *);
162
163         /* Device is initialized */
164         void (*init)(struct nvhost_device *dev);
165
166         /* Device is de-initialized. */
167         void (*deinit)(struct nvhost_device *dev);
168
169         /* Preparing for power off. Used for context save. */
170         int (*prepare_poweroff)(struct nvhost_device *dev);
171
172         /* Allocates a context handler for the device */
173         struct nvhost_hwctx_handler *(*alloc_hwctx_handler)(u32 syncpt,
174                         u32 waitbase, struct nvhost_channel *ch);
175 };
176
177 extern int nvhost_driver_register(struct nvhost_driver *);
178 extern void nvhost_driver_unregister(struct nvhost_driver *);
179 extern struct resource *nvhost_get_resource(struct nvhost_device *,
180                 unsigned int, unsigned int);
181 extern int nvhost_get_irq(struct nvhost_device *, unsigned int);
182 extern struct resource *nvhost_get_resource_byname(struct nvhost_device *,
183                 unsigned int, const char *);
184 extern int nvhost_get_irq_byname(struct nvhost_device *, const char *);
185 extern void nvhost_device_writel(struct nvhost_device *, u32 r, u32 v);
186 extern u32 nvhost_device_readl(struct nvhost_device *, u32 r);
187
188 #define to_nvhost_device(x)     container_of((x), struct nvhost_device, dev)
189 #define to_nvhost_driver(drv)   (container_of((drv), struct nvhost_driver, \
190                                  driver))
191
192 #define nvhost_get_drvdata(_dev)        dev_get_drvdata(&(_dev)->dev)
193 #define nvhost_set_drvdata(_dev, data)  dev_set_drvdata(&(_dev)->dev, (data))
194
195 int nvhost_bus_add_host(struct nvhost_master *host);
196
197 static inline struct nvhost_device *nvhost_get_parent(struct nvhost_device *_dev)
198 {
199         return _dev->dev.parent ? to_nvhost_device(_dev->dev.parent) : NULL;
200 }
201
202 /* public host1x power management APIs */
203 bool nvhost_module_powered_ext(struct nvhost_device *dev);
204 void nvhost_module_busy_ext(struct nvhost_device *dev);
205 void nvhost_module_idle_ext(struct nvhost_device *dev);
206
207 /* public host1x sync-point management APIs */
208 u32 nvhost_syncpt_incr_max_ext(struct nvhost_device *dev, u32 id, u32 incrs);
209 void nvhost_syncpt_cpu_incr_ext(struct nvhost_device *dev, u32 id);
210 u32 nvhost_syncpt_read_ext(struct nvhost_device *dev, u32 id);
211 int nvhost_syncpt_wait_timeout_ext(struct nvhost_device *dev, u32 id, u32 thresh,
212         u32 timeout, u32 *value);
213
214 void nvhost_scale3d_set_throughput_hint(int hint);
215
216 #endif