Initial XP10 code drop from XGI.
[platform/upstream/libdrm.git] / linux-core / xgi_drv.h
1 \r
2 /****************************************************************************\r
3  * Copyright (C) 2003-2006 by XGI Technology, Taiwan.                   \r
4  *                                                                                                                                                      *\r
5  * All Rights Reserved.                                                                                                         *\r
6  *                                                                                                                                                      *\r
7  * Permission is hereby granted, free of charge, to any person obtaining\r
8  * a copy of this software and associated documentation files (the      \r
9  * "Software"), to deal in the Software without restriction, including  \r
10  * without limitation on the rights to use, copy, modify, merge,        \r
11  * publish, distribute, sublicense, and/or sell copies of the Software, \r
12  * and to permit persons to whom the Software is furnished to do so,    \r
13  * subject to the following conditions:                                 \r
14  *                                                                                                                                                      *\r
15  * The above copyright notice and this permission notice (including the \r
16  * next paragraph) shall be included in all copies or substantial       \r
17  * portions of the Software.                                            \r
18  *                                                                                                                                                      *\r
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,      \r
20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF   \r
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND                \r
22  * NON-INFRINGEMENT.  IN NO EVENT SHALL XGI AND/OR                      \r
23  * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,           \r
24  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,           \r
25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER                        \r
26  * DEALINGS IN THE SOFTWARE.                                                                                            \r
27  ***************************************************************************/\r
28 \r
29 #ifndef _XGI_DRV_H_\r
30 #define _XGI_DRV_H_\r
31 \r
32 #define XGI_MAJOR_VERSION   0\r
33 #define XGI_MINOR_VERSION   7\r
34 #define XGI_PATCHLEVEL      5\r
35 \r
36 #define XGI_DRV_VERSION     "0.7.5"\r
37 \r
38 #ifndef XGI_DRV_NAME\r
39 #define XGI_DRV_NAME        "xgi"\r
40 #endif\r
41 \r
42 /*\r
43  * xgi reserved major device number, Set this to 0 to\r
44  * request dynamic major number allocation.\r
45  */\r
46 #ifndef XGI_DEV_MAJOR\r
47 #define XGI_DEV_MAJOR   0\r
48 #endif\r
49 \r
50 #ifndef XGI_MAX_DEVICES\r
51 #define XGI_MAX_DEVICES 1\r
52 #endif\r
53 \r
54 /* Jong 06/06/2006 */\r
55 /* #define XGI_DEBUG */\r
56 \r
57 #ifndef PCI_VENDOR_ID_XGI\r
58 /*\r
59 #define PCI_VENDOR_ID_XGI       0x1023\r
60 */\r
61 #define PCI_VENDOR_ID_XGI       0x18CA\r
62 \r
63 #endif\r
64 \r
65 #ifndef PCI_DEVICE_ID_XP5\r
66 #define PCI_DEVICE_ID_XP5       0x2200\r
67 #endif\r
68 \r
69 #ifndef PCI_DEVICE_ID_XG47\r
70 #define PCI_DEVICE_ID_XG47      0x0047\r
71 #endif\r
72 \r
73 /* Macros to make printk easier */\r
74 #define XGI_ERROR(fmt, arg...) \\r
75     printk(KERN_ERR "[" XGI_DRV_NAME ":%s] *ERROR* " fmt, __FUNCTION__, ##arg)\r
76 \r
77 #define XGI_MEM_ERROR(area, fmt, arg...) \\r
78     printk(KERN_ERR "[" XGI_DRV_NAME ":%s] *ERROR* " fmt, __FUNCTION__, ##arg)\r
79 \r
80 /* #define XGI_DEBUG */ \r
81 \r
82 #ifdef XGI_DEBUG\r
83 #define XGI_INFO(fmt, arg...) \\r
84     printk(KERN_ALERT "[" XGI_DRV_NAME ":%s] " fmt, __FUNCTION__, ##arg)\r
85 /*    printk(KERN_INFO "[" XGI_DRV_NAME ":%s] " fmt, __FUNCTION__, ##arg) */\r
86 #else\r
87 #define XGI_INFO(fmt, arg...)   do { } while (0)\r
88 #endif\r
89 \r
90 /* device name length; must be atleast 8 */\r
91 #define XGI_DEVICE_NAME_LENGTH      40\r
92 \r
93 /* need a fake device number for control device; just to flag it for msgs */\r
94 #define XGI_CONTROL_DEVICE_NUMBER   100\r
95 \r
96 typedef struct {\r
97     U32 base;   // pcie base is different from fb base\r
98     U32 size;\r
99     U8 *vbase;\r
100 } xgi_aperture_t;\r
101 \r
102 typedef struct xgi_screen_info_s {\r
103     U32     scrn_start;\r
104     U32     scrn_xres;\r
105     U32     scrn_yres;\r
106     U32     scrn_bpp;\r
107     U32     scrn_pitch;\r
108 } xgi_screen_info_t;\r
109 \r
110 typedef struct xgi_sarea_info_s {\r
111     U32                 bus_addr;\r
112     U32                 size;\r
113 } xgi_sarea_info_t;\r
114 \r
115 typedef struct xgi_info_s {\r
116     struct pci_dev  *dev;\r
117     int             flags;\r
118     int             device_number;\r
119     int             bus;    /* PCI config info */\r
120     int             slot;\r
121     int             vendor_id;\r
122     U32             device_id;\r
123     U8              revision_id;\r
124 \r
125     /* physical characteristics */\r
126     xgi_aperture_t  mmio;\r
127     xgi_aperture_t  fb;\r
128     xgi_aperture_t  pcie;\r
129     xgi_screen_info_t scrn_info;\r
130     xgi_sarea_info_t sarea_info;\r
131 \r
132     /* look up table parameters */\r
133     U32             *lut_base;\r
134     U32             lutPageSize;\r
135     U32             lutPageOrder;\r
136     U32             isLUTInLFB;\r
137     U32             sdfbPageSize;\r
138 \r
139     U32             pcie_config;\r
140     U32             pcie_status;\r
141     U32             irq;\r
142 \r
143     atomic_t        use_count;\r
144 \r
145     /* keep track of any pending bottom halfes */\r
146     struct tasklet_struct tasklet;\r
147 \r
148     spinlock_t      info_lock;\r
149 \r
150     struct semaphore info_sem;\r
151     struct semaphore fb_sem;\r
152     struct semaphore pcie_sem;\r
153 } xgi_info_t;\r
154 \r
155 typedef struct xgi_ioctl_post_vbios {\r
156     U32 bus;\r
157     U32 slot;\r
158 } xgi_ioctl_post_vbios_t;\r
159 \r
160 typedef enum xgi_mem_location_s\r
161 {\r
162     NON_LOCAL = 0,\r
163     LOCAL     = 1,\r
164     INVALID   = 0x7fffffff\r
165 } xgi_mem_location_t;\r
166 \r
167 enum PcieOwner\r
168 {\r
169     PCIE_2D = 0,\r
170     /*\r
171     PCIE_3D should not begin with 1,\r
172     2D alloc pcie memory will use owner 1.\r
173     */\r
174     PCIE_3D = 11,/*vetex buf*/\r
175     PCIE_3D_CMDLIST = 12,\r
176     PCIE_3D_SCRATCHPAD = 13,\r
177     PCIE_3D_TEXTURE = 14,\r
178     PCIE_INVALID = 0x7fffffff\r
179 };\r
180 \r
181 typedef struct xgi_mem_req_s {\r
182     xgi_mem_location_t  location;\r
183     unsigned long       size;\r
184     unsigned long       is_front;\r
185     enum PcieOwner      owner;\r
186     unsigned long       pid;\r
187 } xgi_mem_req_t;\r
188 \r
189 typedef struct xgi_mem_alloc_s {\r
190     xgi_mem_location_t  location;\r
191     unsigned long       size;\r
192     unsigned long       bus_addr;\r
193     unsigned long       hw_addr;\r
194     unsigned long       pid;\r
195 } xgi_mem_alloc_t;\r
196 \r
197 typedef struct xgi_chip_info_s {\r
198     U32     device_id;\r
199     char    device_name[32];\r
200     U32     vendor_id;\r
201     U32     curr_display_mode; //Singe, DualView(Contained), MHS\r
202     U32     fb_size;\r
203     U32     sarea_bus_addr;\r
204     U32     sarea_size;\r
205 } xgi_chip_info_t;\r
206 \r
207 typedef struct xgi_opengl_cmd_s {\r
208     U32     cmd;\r
209 } xgi_opengl_cmd_t;\r
210 \r
211 typedef struct xgi_mmio_info_s {\r
212     xgi_opengl_cmd_t    cmd_head;\r
213     void                *mmioBase;\r
214     int                 size;\r
215 } xgi_mmio_info_t;\r
216 \r
217 typedef enum {\r
218     BTYPE_2D = 0,\r
219     BTYPE_3D = 1,\r
220     BTYPE_FLIP = 2,\r
221     BTYPE_CTRL = 3,\r
222     BTYPE_NONE = 0x7fffffff\r
223 }BATCH_TYPE;\r
224 \r
225 typedef struct xgi_cmd_info_s {\r
226     BATCH_TYPE  _firstBeginType;\r
227     U32         _firstBeginAddr;\r
228     U32         _firstSize;\r
229     U32         _curDebugID;\r
230     U32         _lastBeginAddr;\r
231     U32         _beginCount;\r
232 } xgi_cmd_info_t;\r
233 \r
234 typedef struct xgi_state_info_s {\r
235     U32         _fromState;\r
236     U32         _toState;\r
237 } xgi_state_info_t;\r
238 \r
239 typedef struct cpu_info_s {\r
240     U32 _eax;\r
241     U32 _ebx;\r
242     U32 _ecx;\r
243     U32 _edx;\r
244 } cpu_info_t;\r
245 \r
246 typedef struct xgi_mem_pid_s {\r
247     struct list_head    list;\r
248     xgi_mem_location_t  location;\r
249     unsigned long       bus_addr;\r
250     unsigned long       pid;\r
251 } xgi_mem_pid_t;\r
252 \r
253 /*\r
254  * Ioctl definitions\r
255  */\r
256 \r
257 #define XGI_IOCTL_MAGIC             'x'     /* use 'x' as magic number */\r
258 \r
259 #define XGI_IOCTL_BASE              0\r
260 #define XGI_ESC_DEVICE_INFO         (XGI_IOCTL_BASE + 0)\r
261 #define XGI_ESC_POST_VBIOS          (XGI_IOCTL_BASE + 1)\r
262 \r
263 #define XGI_ESC_FB_INIT             (XGI_IOCTL_BASE + 2)\r
264 #define XGI_ESC_FB_ALLOC            (XGI_IOCTL_BASE + 3)\r
265 #define XGI_ESC_FB_FREE             (XGI_IOCTL_BASE + 4)\r
266 #define XGI_ESC_PCIE_INIT           (XGI_IOCTL_BASE + 5)\r
267 #define XGI_ESC_PCIE_ALLOC          (XGI_IOCTL_BASE + 6)\r
268 #define XGI_ESC_PCIE_FREE           (XGI_IOCTL_BASE + 7)\r
269 #define XGI_ESC_SUBMIT_CMDLIST      (XGI_IOCTL_BASE + 8)\r
270 #define XGI_ESC_PUT_SCREEN_INFO     (XGI_IOCTL_BASE + 9)\r
271 #define XGI_ESC_GET_SCREEN_INFO     (XGI_IOCTL_BASE + 10)\r
272 #define XGI_ESC_GE_RESET            (XGI_IOCTL_BASE + 11)\r
273 #define XGI_ESC_SAREA_INFO          (XGI_IOCTL_BASE + 12)\r
274 #define XGI_ESC_DUMP_REGISTER       (XGI_IOCTL_BASE + 13)\r
275 #define XGI_ESC_DEBUG_INFO          (XGI_IOCTL_BASE + 14)\r
276 #define XGI_ESC_TEST_RWINKERNEL     (XGI_IOCTL_BASE + 16)\r
277 #define XGI_ESC_STATE_CHANGE        (XGI_IOCTL_BASE + 17)\r
278 #define XGI_ESC_MMIO_INFO           (XGI_IOCTL_BASE + 18)\r
279 #define XGI_ESC_PCIE_CHECK          (XGI_IOCTL_BASE + 19)\r
280 #define XGI_ESC_CPUID               (XGI_IOCTL_BASE + 20)\r
281 #define XGI_ESC_MEM_COLLECT          (XGI_IOCTL_BASE + 21)\r
282 \r
283 #define XGI_IOCTL_DEVICE_INFO       _IOR(XGI_IOCTL_MAGIC, XGI_ESC_DEVICE_INFO, xgi_chip_info_t)\r
284 #define XGI_IOCTL_POST_VBIOS        _IO(XGI_IOCTL_MAGIC, XGI_ESC_POST_VBIOS)\r
285 \r
286 #define XGI_IOCTL_FB_INIT           _IO(XGI_IOCTL_MAGIC, XGI_ESC_FB_INIT)\r
287 #define XGI_IOCTL_FB_ALLOC          _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_FB_ALLOC, xgi_mem_req_t)\r
288 #define XGI_IOCTL_FB_FREE           _IOW(XGI_IOCTL_MAGIC, XGI_ESC_FB_FREE, unsigned long)\r
289 \r
290 #define XGI_IOCTL_PCIE_INIT         _IO(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_INIT)\r
291 #define XGI_IOCTL_PCIE_ALLOC        _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_ALLOC, xgi_mem_req_t)\r
292 #define XGI_IOCTL_PCIE_FREE         _IOW(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_FREE, unsigned long)\r
293 \r
294 #define XGI_IOCTL_PUT_SCREEN_INFO   _IOW(XGI_IOCTL_MAGIC, XGI_ESC_PUT_SCREEN_INFO, xgi_screen_info_t)\r
295 #define XGI_IOCTL_GET_SCREEN_INFO   _IOR(XGI_IOCTL_MAGIC, XGI_ESC_GET_SCREEN_INFO, xgi_screen_info_t)\r
296 \r
297 #define XGI_IOCTL_GE_RESET          _IO(XGI_IOCTL_MAGIC, XGI_ESC_GE_RESET)\r
298 #define XGI_IOCTL_SAREA_INFO        _IOW(XGI_IOCTL_MAGIC, XGI_ESC_SAREA_INFO, xgi_sarea_info_t)\r
299 #define XGI_IOCTL_DUMP_REGISTER     _IO(XGI_IOCTL_MAGIC, XGI_ESC_DUMP_REGISTER)\r
300 #define XGI_IOCTL_DEBUG_INFO        _IO(XGI_IOCTL_MAGIC, XGI_ESC_DEBUG_INFO)\r
301 #define XGI_IOCTL_MMIO_INFO         _IOR(XGI_IOCTL_MAGIC, XGI_ESC_MMIO_INFO, xgi_mmio_info_t)\r
302 \r
303 #define XGI_IOCTL_SUBMIT_CMDLIST        _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_SUBMIT_CMDLIST, xgi_cmd_info_t)\r
304 #define XGI_IOCTL_TEST_RWINKERNEL       _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_TEST_RWINKERNEL, unsigned long)\r
305 #define XGI_IOCTL_STATE_CHANGE      _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_STATE_CHANGE, xgi_state_info_t)\r
306 \r
307 #define XGI_IOCTL_PCIE_CHECK        _IO(XGI_IOCTL_MAGIC, XGI_ESC_PCIE_CHECK)\r
308 #define XGI_IOCTL_CPUID             _IOWR(XGI_IOCTL_MAGIC, XGI_ESC_CPUID, cpu_info_t)\r
309 #define XGI_IOCTL_MAXNR          30\r
310 \r
311 /*\r
312  * flags\r
313  */\r
314 #define XGI_FLAG_OPEN            0x0001\r
315 #define XGI_FLAG_NEEDS_POSTING   0x0002\r
316 #define XGI_FLAG_WAS_POSTED      0x0004\r
317 #define XGI_FLAG_CONTROL         0x0010\r
318 #define XGI_FLAG_MAP_REGS_EARLY  0x0200\r
319 \r
320 /* mmap(2) offsets */\r
321 \r
322 #define IS_IO_OFFSET(info, offset, length) \\r
323             (((offset) >= (info)->mmio.base) \\r
324             && (((offset) + (length)) <= (info)->mmio.base + (info)->mmio.size))\r
325 \r
326 /* Jong 06/14/2006 */\r
327 /* (info)->fb.base is a base address for physical (bus) address space */\r
328 /* what's the definition of offest? on  physical (bus) address space or HW address space */\r
329 /* Jong 06/15/2006; use HW address space */\r
330 #define IS_FB_OFFSET(info, offset, length) \\r
331             (((offset) >= 0) \\r
332             && (((offset) + (length)) <= (info)->fb.size))\r
333 #if 0\r
334 #define IS_FB_OFFSET(info, offset, length) \\r
335             (((offset) >= (info)->fb.base) \\r
336             && (((offset) + (length)) <= (info)->fb.base + (info)->fb.size))\r
337 #endif\r
338 \r
339 #define IS_PCIE_OFFSET(info, offset, length) \\r
340             (((offset) >= (info)->pcie.base) \\r
341             && (((offset) + (length)) <= (info)->pcie.base + (info)->pcie.size))\r
342 \r
343 extern int  xgi_fb_heap_init(xgi_info_t *info);\r
344 extern void xgi_fb_heap_cleanup(xgi_info_t *info);\r
345 \r
346 extern void xgi_fb_alloc(xgi_info_t *info, xgi_mem_req_t *req, xgi_mem_alloc_t *alloc);\r
347 extern void xgi_fb_free(xgi_info_t *info, unsigned long offset);\r
348 extern void xgi_mem_collect(xgi_info_t *info, unsigned int *pcnt);\r
349 \r
350 extern int  xgi_pcie_heap_init(xgi_info_t *info);\r
351 extern void xgi_pcie_heap_cleanup(xgi_info_t *info);\r
352 \r
353 extern void xgi_pcie_alloc(xgi_info_t *info, unsigned long size, enum PcieOwner owner, xgi_mem_alloc_t *alloc);\r
354 extern void xgi_pcie_free(xgi_info_t *info, unsigned long offset);\r
355 extern void xgi_pcie_heap_check(void);\r
356 extern void *xgi_find_pcie_block(xgi_info_t *info, unsigned long address);\r
357 extern void *xgi_find_pcie_virt(xgi_info_t *info, unsigned long address);\r
358 \r
359 extern void xgi_read_pcie_mem(xgi_info_t *info, xgi_mem_req_t *req);\r
360 extern void xgi_write_pcie_mem(xgi_info_t *info, xgi_mem_req_t *req);\r
361 \r
362 extern void xgi_test_rwinkernel(xgi_info_t *info, unsigned long address);\r
363 \r
364 #endif\r