aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/drm/sis_mm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/drm/sis_mm.c')
-rw-r--r--drivers/char/drm/sis_mm.c127
1 files changed, 62 insertions, 65 deletions
diff --git a/drivers/char/drm/sis_mm.c b/drivers/char/drm/sis_mm.c
index 6610c5576d22..a8529728fa63 100644
--- a/drivers/char/drm/sis_mm.c
+++ b/drivers/char/drm/sis_mm.c
@@ -10,11 +10,11 @@
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the 11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions: 12 * Software is furnished to do so, subject to the following conditions:
13 * 13 *
14 * The above copyright notice and this permission notice (including the next 14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the 15 * paragraph) shall be included in all copies or substantial portions of the
16 * Software. 16 * Software.
17 * 17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
@@ -22,10 +22,10 @@
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE. 24 * DEALINGS IN THE SOFTWARE.
25 * 25 *
26 * Authors: 26 * Authors:
27 * Sung-Ching Lin <sclin@sis.com.tw> 27 * Sung-Ching Lin <sclin@sis.com.tw>
28 * 28 *
29 */ 29 */
30 30
31#include "drmP.h" 31#include "drmP.h"
@@ -37,25 +37,23 @@
37#endif 37#endif
38 38
39#define MAX_CONTEXT 100 39#define MAX_CONTEXT 100
40#define VIDEO_TYPE 0 40#define VIDEO_TYPE 0
41#define AGP_TYPE 1 41#define AGP_TYPE 1
42 42
43typedef struct { 43typedef struct {
44 int used; 44 int used;
45 int context; 45 int context;
46 set_t *sets[2]; /* 0 for video, 1 for AGP */ 46 set_t *sets[2]; /* 0 for video, 1 for AGP */
47} sis_context_t; 47} sis_context_t;
48 48
49static sis_context_t global_ppriv[MAX_CONTEXT]; 49static sis_context_t global_ppriv[MAX_CONTEXT];
50 50
51
52static int add_alloc_set(int context, int type, unsigned int val) 51static int add_alloc_set(int context, int type, unsigned int val)
53{ 52{
54 int i, retval = 0; 53 int i, retval = 0;
55 54
56 for (i = 0; i < MAX_CONTEXT; i++) { 55 for (i = 0; i < MAX_CONTEXT; i++) {
57 if (global_ppriv[i].used && global_ppriv[i].context == context) 56 if (global_ppriv[i].used && global_ppriv[i].context == context) {
58 {
59 retval = setAdd(global_ppriv[i].sets[type], val); 57 retval = setAdd(global_ppriv[i].sets[type], val);
60 break; 58 break;
61 } 59 }
@@ -64,12 +62,11 @@ static int add_alloc_set(int context, int type, unsigned int val)
64} 62}
65 63
66static int del_alloc_set(int context, int type, unsigned int val) 64static int del_alloc_set(int context, int type, unsigned int val)
67{ 65{
68 int i, retval = 0; 66 int i, retval = 0;
69 67
70 for (i = 0; i < MAX_CONTEXT; i++) { 68 for (i = 0; i < MAX_CONTEXT; i++) {
71 if (global_ppriv[i].used && global_ppriv[i].context == context) 69 if (global_ppriv[i].used && global_ppriv[i].context == context) {
72 {
73 retval = setDel(global_ppriv[i].sets[type], val); 70 retval = setDel(global_ppriv[i].sets[type], val);
74 break; 71 break;
75 } 72 }
@@ -77,15 +74,15 @@ static int del_alloc_set(int context, int type, unsigned int val)
77 return retval; 74 return retval;
78} 75}
79 76
80/* fb management via fb device */ 77/* fb management via fb device */
81#if defined(__linux__) && defined(CONFIG_FB_SIS) 78#if defined(__linux__) && defined(CONFIG_FB_SIS)
82 79
83static int sis_fb_init( DRM_IOCTL_ARGS ) 80static int sis_fb_init(DRM_IOCTL_ARGS)
84{ 81{
85 return 0; 82 return 0;
86} 83}
87 84
88static int sis_fb_alloc( DRM_IOCTL_ARGS ) 85static int sis_fb_alloc(DRM_IOCTL_ARGS)
89{ 86{
90 drm_sis_mem_t fb; 87 drm_sis_mem_t fb;
91 struct sis_memreq req; 88 struct sis_memreq req;
@@ -105,7 +102,7 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
105 sis_free(req.offset); 102 sis_free(req.offset);
106 retval = DRM_ERR(EINVAL); 103 retval = DRM_ERR(EINVAL);
107 } 104 }
108 } else { 105 } else {
109 fb.offset = 0; 106 fb.offset = 0;
110 fb.size = 0; 107 fb.size = 0;
111 fb.free = 0; 108 fb.free = 0;
@@ -118,19 +115,19 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
118 return retval; 115 return retval;
119} 116}
120 117
121static int sis_fb_free( DRM_IOCTL_ARGS ) 118static int sis_fb_free(DRM_IOCTL_ARGS)
122{ 119{
123 drm_sis_mem_t fb; 120 drm_sis_mem_t fb;
124 int retval = 0; 121 int retval = 0;
125 122
126 DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *)data, sizeof(fb)); 123 DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *) data, sizeof(fb));
127 124
128 if (!fb.free) 125 if (!fb.free)
129 return DRM_ERR(EINVAL); 126 return DRM_ERR(EINVAL);
130 127
131 if (!del_alloc_set(fb.context, VIDEO_TYPE, fb.free)) 128 if (!del_alloc_set(fb.context, VIDEO_TYPE, fb.free))
132 retval = DRM_ERR(EINVAL); 129 retval = DRM_ERR(EINVAL);
133 sis_free((u32)fb.free); 130 sis_free((u32) fb.free);
134 131
135 DRM_DEBUG("free fb, offset = %lu\n", fb.free); 132 DRM_DEBUG("free fb, offset = %lu\n", fb.free);
136 133
@@ -149,17 +146,17 @@ static int sis_fb_free( DRM_IOCTL_ARGS )
149 * X driver/sisfb HW- Command- 146 * X driver/sisfb HW- Command-
150 * framebuffer memory DRI heap Cursor queue 147 * framebuffer memory DRI heap Cursor queue
151 */ 148 */
152static int sis_fb_init( DRM_IOCTL_ARGS ) 149static int sis_fb_init(DRM_IOCTL_ARGS)
153{ 150{
154 DRM_DEVICE; 151 DRM_DEVICE;
155 drm_sis_private_t *dev_priv = dev->dev_private; 152 drm_sis_private_t *dev_priv = dev->dev_private;
156 drm_sis_fb_t fb; 153 drm_sis_fb_t fb;
157 154
158 DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_fb_t __user *)data, sizeof(fb)); 155 DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_fb_t __user *) data, sizeof(fb));
159 156
160 if (dev_priv == NULL) { 157 if (dev_priv == NULL) {
161 dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t), 158 dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t),
162 DRM_MEM_DRIVER); 159 DRM_MEM_DRIVER);
163 dev_priv = dev->dev_private; 160 dev_priv = dev->dev_private;
164 if (dev_priv == NULL) 161 if (dev_priv == NULL)
165 return ENOMEM; 162 return ENOMEM;
@@ -175,7 +172,7 @@ static int sis_fb_init( DRM_IOCTL_ARGS )
175 return 0; 172 return 0;
176} 173}
177 174
178static int sis_fb_alloc( DRM_IOCTL_ARGS ) 175static int sis_fb_alloc(DRM_IOCTL_ARGS)
179{ 176{
180 DRM_DEVICE; 177 DRM_DEVICE;
181 drm_sis_private_t *dev_priv = dev->dev_private; 178 drm_sis_private_t *dev_priv = dev->dev_private;
@@ -186,9 +183,9 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
186 183
187 if (dev_priv == NULL || dev_priv->FBHeap == NULL) 184 if (dev_priv == NULL || dev_priv->FBHeap == NULL)
188 return DRM_ERR(EINVAL); 185 return DRM_ERR(EINVAL);
189 186
190 DRM_COPY_FROM_USER_IOCTL(fb, argp, sizeof(fb)); 187 DRM_COPY_FROM_USER_IOCTL(fb, argp, sizeof(fb));
191 188
192 block = mmAllocMem(dev_priv->FBHeap, fb.size, 0, 0); 189 block = mmAllocMem(dev_priv->FBHeap, fb.size, 0, 0);
193 if (block) { 190 if (block) {
194 /* TODO */ 191 /* TODO */
@@ -196,7 +193,7 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
196 fb.free = (unsigned long)block; 193 fb.free = (unsigned long)block;
197 if (!add_alloc_set(fb.context, VIDEO_TYPE, fb.free)) { 194 if (!add_alloc_set(fb.context, VIDEO_TYPE, fb.free)) {
198 DRM_DEBUG("adding to allocation set fails\n"); 195 DRM_DEBUG("adding to allocation set fails\n");
199 mmFreeMem((PMemBlock)fb.free); 196 mmFreeMem((PMemBlock) fb.free);
200 retval = DRM_ERR(EINVAL); 197 retval = DRM_ERR(EINVAL);
201 } 198 }
202 } else { 199 } else {
@@ -212,7 +209,7 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
212 return retval; 209 return retval;
213} 210}
214 211
215static int sis_fb_free( DRM_IOCTL_ARGS ) 212static int sis_fb_free(DRM_IOCTL_ARGS)
216{ 213{
217 DRM_DEVICE; 214 DRM_DEVICE;
218 drm_sis_private_t *dev_priv = dev->dev_private; 215 drm_sis_private_t *dev_priv = dev->dev_private;
@@ -221,14 +218,14 @@ static int sis_fb_free( DRM_IOCTL_ARGS )
221 if (dev_priv == NULL || dev_priv->FBHeap == NULL) 218 if (dev_priv == NULL || dev_priv->FBHeap == NULL)
222 return DRM_ERR(EINVAL); 219 return DRM_ERR(EINVAL);
223 220
224 DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *)data, sizeof(fb)); 221 DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *) data, sizeof(fb));
225 222
226 if (!mmBlockInHeap(dev_priv->FBHeap, (PMemBlock)fb.free)) 223 if (!mmBlockInHeap(dev_priv->FBHeap, (PMemBlock) fb.free))
227 return DRM_ERR(EINVAL); 224 return DRM_ERR(EINVAL);
228 225
229 if (!del_alloc_set(fb.context, VIDEO_TYPE, fb.free)) 226 if (!del_alloc_set(fb.context, VIDEO_TYPE, fb.free))
230 return DRM_ERR(EINVAL); 227 return DRM_ERR(EINVAL);
231 mmFreeMem((PMemBlock)fb.free); 228 mmFreeMem((PMemBlock) fb.free);
232 229
233 DRM_DEBUG("free fb, free = 0x%lx\n", fb.free); 230 DRM_DEBUG("free fb, free = 0x%lx\n", fb.free);
234 231
@@ -237,9 +234,9 @@ static int sis_fb_free( DRM_IOCTL_ARGS )
237 234
238#endif 235#endif
239 236
240/* agp memory management */ 237/* agp memory management */
241 238
242static int sis_ioctl_agp_init( DRM_IOCTL_ARGS ) 239static int sis_ioctl_agp_init(DRM_IOCTL_ARGS)
243{ 240{
244 DRM_DEVICE; 241 DRM_DEVICE;
245 drm_sis_private_t *dev_priv = dev->dev_private; 242 drm_sis_private_t *dev_priv = dev->dev_private;
@@ -247,7 +244,7 @@ static int sis_ioctl_agp_init( DRM_IOCTL_ARGS )
247 244
248 if (dev_priv == NULL) { 245 if (dev_priv == NULL) {
249 dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t), 246 dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t),
250 DRM_MEM_DRIVER); 247 DRM_MEM_DRIVER);
251 dev_priv = dev->dev_private; 248 dev_priv = dev->dev_private;
252 if (dev_priv == NULL) 249 if (dev_priv == NULL)
253 return ENOMEM; 250 return ENOMEM;
@@ -256,16 +253,17 @@ static int sis_ioctl_agp_init( DRM_IOCTL_ARGS )
256 if (dev_priv->AGPHeap != NULL) 253 if (dev_priv->AGPHeap != NULL)
257 return DRM_ERR(EINVAL); 254 return DRM_ERR(EINVAL);
258 255
259 DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_agp_t __user *)data, sizeof(agp)); 256 DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_agp_t __user *) data,
257 sizeof(agp));
260 258
261 dev_priv->AGPHeap = mmInit(agp.offset, agp.size); 259 dev_priv->AGPHeap = mmInit(agp.offset, agp.size);
262 260
263 DRM_DEBUG("offset = %u, size = %u", agp.offset, agp.size); 261 DRM_DEBUG("offset = %u, size = %u", agp.offset, agp.size);
264 262
265 return 0; 263 return 0;
266} 264}
267 265
268static int sis_ioctl_agp_alloc( DRM_IOCTL_ARGS ) 266static int sis_ioctl_agp_alloc(DRM_IOCTL_ARGS)
269{ 267{
270 DRM_DEVICE; 268 DRM_DEVICE;
271 drm_sis_private_t *dev_priv = dev->dev_private; 269 drm_sis_private_t *dev_priv = dev->dev_private;
@@ -273,12 +271,12 @@ static int sis_ioctl_agp_alloc( DRM_IOCTL_ARGS )
273 drm_sis_mem_t agp; 271 drm_sis_mem_t agp;
274 PMemBlock block; 272 PMemBlock block;
275 int retval = 0; 273 int retval = 0;
276 274
277 if (dev_priv == NULL || dev_priv->AGPHeap == NULL) 275 if (dev_priv == NULL || dev_priv->AGPHeap == NULL)
278 return DRM_ERR(EINVAL); 276 return DRM_ERR(EINVAL);
279 277
280 DRM_COPY_FROM_USER_IOCTL(agp, argp, sizeof(agp)); 278 DRM_COPY_FROM_USER_IOCTL(agp, argp, sizeof(agp));
281 279
282 block = mmAllocMem(dev_priv->AGPHeap, agp.size, 0, 0); 280 block = mmAllocMem(dev_priv->AGPHeap, agp.size, 0, 0);
283 if (block) { 281 if (block) {
284 /* TODO */ 282 /* TODO */
@@ -286,10 +284,10 @@ static int sis_ioctl_agp_alloc( DRM_IOCTL_ARGS )
286 agp.free = (unsigned long)block; 284 agp.free = (unsigned long)block;
287 if (!add_alloc_set(agp.context, AGP_TYPE, agp.free)) { 285 if (!add_alloc_set(agp.context, AGP_TYPE, agp.free)) {
288 DRM_DEBUG("adding to allocation set fails\n"); 286 DRM_DEBUG("adding to allocation set fails\n");
289 mmFreeMem((PMemBlock)agp.free); 287 mmFreeMem((PMemBlock) agp.free);
290 retval = -1; 288 retval = -1;
291 } 289 }
292 } else { 290 } else {
293 agp.offset = 0; 291 agp.offset = 0;
294 agp.size = 0; 292 agp.size = 0;
295 agp.free = 0; 293 agp.free = 0;
@@ -302,7 +300,7 @@ static int sis_ioctl_agp_alloc( DRM_IOCTL_ARGS )
302 return retval; 300 return retval;
303} 301}
304 302
305static int sis_ioctl_agp_free( DRM_IOCTL_ARGS ) 303static int sis_ioctl_agp_free(DRM_IOCTL_ARGS)
306{ 304{
307 DRM_DEVICE; 305 DRM_DEVICE;
308 drm_sis_private_t *dev_priv = dev->dev_private; 306 drm_sis_private_t *dev_priv = dev->dev_private;
@@ -311,12 +309,13 @@ static int sis_ioctl_agp_free( DRM_IOCTL_ARGS )
311 if (dev_priv == NULL || dev_priv->AGPHeap == NULL) 309 if (dev_priv == NULL || dev_priv->AGPHeap == NULL)
312 return DRM_ERR(EINVAL); 310 return DRM_ERR(EINVAL);
313 311
314 DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_mem_t __user *)data, sizeof(agp)); 312 DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_mem_t __user *) data,
313 sizeof(agp));
315 314
316 if (!mmBlockInHeap(dev_priv->AGPHeap, (PMemBlock)agp.free)) 315 if (!mmBlockInHeap(dev_priv->AGPHeap, (PMemBlock) agp.free))
317 return DRM_ERR(EINVAL); 316 return DRM_ERR(EINVAL);
318 317
319 mmFreeMem((PMemBlock)agp.free); 318 mmFreeMem((PMemBlock) agp.free);
320 if (!del_alloc_set(agp.context, AGP_TYPE, agp.free)) 319 if (!del_alloc_set(agp.context, AGP_TYPE, agp.free))
321 return DRM_ERR(EINVAL); 320 return DRM_ERR(EINVAL);
322 321
@@ -329,31 +328,30 @@ int sis_init_context(struct drm_device *dev, int context)
329{ 328{
330 int i; 329 int i;
331 330
332 for (i = 0; i < MAX_CONTEXT ; i++) { 331 for (i = 0; i < MAX_CONTEXT; i++) {
333 if (global_ppriv[i].used && 332 if (global_ppriv[i].used &&
334 (global_ppriv[i].context == context)) 333 (global_ppriv[i].context == context))
335 break; 334 break;
336 } 335 }
337 336
338 if (i >= MAX_CONTEXT) { 337 if (i >= MAX_CONTEXT) {
339 for (i = 0; i < MAX_CONTEXT ; i++) { 338 for (i = 0; i < MAX_CONTEXT; i++) {
340 if (!global_ppriv[i].used) { 339 if (!global_ppriv[i].used) {
341 global_ppriv[i].context = context; 340 global_ppriv[i].context = context;
342 global_ppriv[i].used = 1; 341 global_ppriv[i].used = 1;
343 global_ppriv[i].sets[0] = setInit(); 342 global_ppriv[i].sets[0] = setInit();
344 global_ppriv[i].sets[1] = setInit(); 343 global_ppriv[i].sets[1] = setInit();
345 DRM_DEBUG("init allocation set, socket=%d, " 344 DRM_DEBUG("init allocation set, socket=%d, "
346 "context = %d\n", i, context); 345 "context = %d\n", i, context);
347 break; 346 break;
348 } 347 }
349 } 348 }
350 if ((i >= MAX_CONTEXT) || (global_ppriv[i].sets[0] == NULL) || 349 if ((i >= MAX_CONTEXT) || (global_ppriv[i].sets[0] == NULL) ||
351 (global_ppriv[i].sets[1] == NULL)) 350 (global_ppriv[i].sets[1] == NULL)) {
352 {
353 return 0; 351 return 0;
354 } 352 }
355 } 353 }
356 354
357 return 1; 355 return 1;
358} 356}
359 357
@@ -361,7 +359,7 @@ int sis_final_context(struct drm_device *dev, int context)
361{ 359{
362 int i; 360 int i;
363 361
364 for (i=0; i<MAX_CONTEXT; i++) { 362 for (i = 0; i < MAX_CONTEXT; i++) {
365 if (global_ppriv[i].used && 363 if (global_ppriv[i].used &&
366 (global_ppriv[i].context == context)) 364 (global_ppriv[i].context == context))
367 break; 365 break;
@@ -382,7 +380,7 @@ int sis_final_context(struct drm_device *dev, int context)
382#if defined(__linux__) && defined(CONFIG_FB_SIS) 380#if defined(__linux__) && defined(CONFIG_FB_SIS)
383 sis_free(item); 381 sis_free(item);
384#else 382#else
385 mmFreeMem((PMemBlock)item); 383 mmFreeMem((PMemBlock) item);
386#endif 384#endif
387 retval = setNext(set, &item); 385 retval = setNext(set, &item);
388 } 386 }
@@ -393,25 +391,24 @@ int sis_final_context(struct drm_device *dev, int context)
393 retval = setFirst(set, &item); 391 retval = setFirst(set, &item);
394 while (retval) { 392 while (retval) {
395 DRM_DEBUG("free agp memory 0x%x\n", item); 393 DRM_DEBUG("free agp memory 0x%x\n", item);
396 mmFreeMem((PMemBlock)item); 394 mmFreeMem((PMemBlock) item);
397 retval = setNext(set, &item); 395 retval = setNext(set, &item);
398 } 396 }
399 setDestroy(set); 397 setDestroy(set);
400 398
401 global_ppriv[i].used = 0; 399 global_ppriv[i].used = 0;
402 } 400 }
403 401
404 return 1; 402 return 1;
405} 403}
406 404
407drm_ioctl_desc_t sis_ioctls[] = { 405drm_ioctl_desc_t sis_ioctls[] = {
408 [DRM_IOCTL_NR(DRM_SIS_FB_ALLOC)] = { sis_fb_alloc, 1, 0 }, 406 [DRM_IOCTL_NR(DRM_SIS_FB_ALLOC)] = {sis_fb_alloc, 1, 0},
409 [DRM_IOCTL_NR(DRM_SIS_FB_FREE)] = { sis_fb_free, 1, 0 }, 407 [DRM_IOCTL_NR(DRM_SIS_FB_FREE)] = {sis_fb_free, 1, 0},
410 [DRM_IOCTL_NR(DRM_SIS_AGP_INIT)] = { sis_ioctl_agp_init, 1, 1 }, 408 [DRM_IOCTL_NR(DRM_SIS_AGP_INIT)] = {sis_ioctl_agp_init, 1, 1},
411 [DRM_IOCTL_NR(DRM_SIS_AGP_ALLOC)] = { sis_ioctl_agp_alloc, 1, 0 }, 409 [DRM_IOCTL_NR(DRM_SIS_AGP_ALLOC)] = {sis_ioctl_agp_alloc, 1, 0},
412 [DRM_IOCTL_NR(DRM_SIS_AGP_FREE)] = { sis_ioctl_agp_free, 1, 0 }, 410 [DRM_IOCTL_NR(DRM_SIS_AGP_FREE)] = {sis_ioctl_agp_free, 1, 0},
413 [DRM_IOCTL_NR(DRM_SIS_FB_INIT)] = { sis_fb_init, 1, 1 } 411 [DRM_IOCTL_NR(DRM_SIS_FB_INIT)] = {sis_fb_init, 1, 1}
414}; 412};
415 413
416int sis_max_ioctl = DRM_ARRAY_SIZE(sis_ioctls); 414int sis_max_ioctl = DRM_ARRAY_SIZE(sis_ioctls);
417