Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / char / drm / sis_mm.c
index 6610c55..5e9936b 100644 (file)
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
  * Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
- * 
+ *
  * Authors:
  *    Sung-Ching Lin <sclin@sis.com.tw>
- * 
+ *
  */
 
 #include "drmP.h"
 #endif
 
 #define MAX_CONTEXT 100
-#define VIDEO_TYPE 0 
+#define VIDEO_TYPE 0
 #define AGP_TYPE 1
 
 typedef struct {
        int used;
        int context;
-       set_t *sets[2]; /* 0 for video, 1 for AGP */
+       set_t *sets[2];         /* 0 for video, 1 for AGP */
 } sis_context_t;
 
 static sis_context_t global_ppriv[MAX_CONTEXT];
 
-
 static int add_alloc_set(int context, int type, unsigned int val)
 {
        int i, retval = 0;
-       
+
        for (i = 0; i < MAX_CONTEXT; i++) {
-               if (global_ppriv[i].used && global_ppriv[i].context == context)
-               {
+               if (global_ppriv[i].used && global_ppriv[i].context == context) {
                        retval = setAdd(global_ppriv[i].sets[type], val);
                        break;
                }
@@ -64,12 +62,11 @@ static int add_alloc_set(int context, int type, unsigned int val)
 }
 
 static int del_alloc_set(int context, int type, unsigned int val)
-{  
+{
        int i, retval = 0;
 
        for (i = 0; i < MAX_CONTEXT; i++) {
-               if (global_ppriv[i].used && global_ppriv[i].context == context)
-               {
+               if (global_ppriv[i].used && global_ppriv[i].context == context) {
                        retval = setDel(global_ppriv[i].sets[type], val);
                        break;
                }
@@ -77,19 +74,19 @@ static int del_alloc_set(int context, int type, unsigned int val)
        return retval;
 }
 
-/* fb management via fb device */ 
+/* fb management via fb device */
 #if defined(__linux__) && defined(CONFIG_FB_SIS)
 
-static int sis_fb_init( DRM_IOCTL_ARGS )
+static int sis_fb_init(DRM_IOCTL_ARGS)
 {
        return 0;
 }
 
-static int sis_fb_alloc( DRM_IOCTL_ARGS )
+static int sis_fb_alloc(DRM_IOCTL_ARGS)
 {
        drm_sis_mem_t fb;
        struct sis_memreq req;
-       drm_sis_mem_t __user *argp = (void __user *)data;
+       drm_sis_mem_t __user *argp = (drm_sis_mem_t __user *)data;
        int retval = 0;
 
        DRM_COPY_FROM_USER_IOCTL(fb, argp, sizeof(fb));
@@ -105,7 +102,7 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
                        sis_free(req.offset);
                        retval = DRM_ERR(EINVAL);
                }
-       } else {  
+       } else {
                fb.offset = 0;
                fb.size = 0;
                fb.free = 0;
@@ -118,21 +115,21 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
        return retval;
 }
 
-static int sis_fb_free( DRM_IOCTL_ARGS )
+static int sis_fb_free(DRM_IOCTL_ARGS)
 {
        drm_sis_mem_t fb;
        int retval = 0;
 
-       DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *)data, sizeof(fb));
+       DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *) data, sizeof(fb));
 
        if (!fb.free)
                return DRM_ERR(EINVAL);
 
        if (!del_alloc_set(fb.context, VIDEO_TYPE, fb.free))
                retval = DRM_ERR(EINVAL);
-       sis_free((u32)fb.free);
+       sis_free(fb.free);
 
-       DRM_DEBUG("free fb, offset = %lu\n", fb.free);
+       DRM_DEBUG("free fb, offset = 0x%lx\n", fb.free);
 
        return retval;
 }
@@ -149,17 +146,17 @@ static int sis_fb_free( DRM_IOCTL_ARGS )
  *    X driver/sisfb                                  HW-   Command-
  *  framebuffer memory           DRI heap           Cursor   queue
  */
-static int sis_fb_init( DRM_IOCTL_ARGS )
+static int sis_fb_init(DRM_IOCTL_ARGS)
 {
        DRM_DEVICE;
        drm_sis_private_t *dev_priv = dev->dev_private;
        drm_sis_fb_t fb;
 
-       DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_fb_t __user *)data, sizeof(fb));
+       DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_fb_t __user *) data, sizeof(fb));
 
        if (dev_priv == NULL) {
                dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t),
-                   DRM_MEM_DRIVER);
+                                             DRM_MEM_DRIVER);
                dev_priv = dev->dev_private;
                if (dev_priv == NULL)
                        return ENOMEM;
@@ -175,20 +172,20 @@ static int sis_fb_init( DRM_IOCTL_ARGS )
        return 0;
 }
 
-static int sis_fb_alloc( DRM_IOCTL_ARGS )
+static int sis_fb_alloc(DRM_IOCTL_ARGS)
 {
        DRM_DEVICE;
        drm_sis_private_t *dev_priv = dev->dev_private;
-       drm_sis_mem_t __user *argp = (void __user *)data;
+       drm_sis_mem_t __user *argp = (drm_sis_mem_t __user *)data;
        drm_sis_mem_t fb;
        PMemBlock block;
        int retval = 0;
 
        if (dev_priv == NULL || dev_priv->FBHeap == NULL)
                return DRM_ERR(EINVAL);
-  
+
        DRM_COPY_FROM_USER_IOCTL(fb, argp, sizeof(fb));
-  
+
        block = mmAllocMem(dev_priv->FBHeap, fb.size, 0, 0);
        if (block) {
                /* TODO */
@@ -196,7 +193,7 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
                fb.free = (unsigned long)block;
                if (!add_alloc_set(fb.context, VIDEO_TYPE, fb.free)) {
                        DRM_DEBUG("adding to allocation set fails\n");
-                       mmFreeMem((PMemBlock)fb.free);
+                       mmFreeMem((PMemBlock) fb.free);
                        retval = DRM_ERR(EINVAL);
                }
        } else {
@@ -212,7 +209,7 @@ static int sis_fb_alloc( DRM_IOCTL_ARGS )
        return retval;
 }
 
-static int sis_fb_free( DRM_IOCTL_ARGS )
+static int sis_fb_free(DRM_IOCTL_ARGS)
 {
        DRM_DEVICE;
        drm_sis_private_t *dev_priv = dev->dev_private;
@@ -221,14 +218,14 @@ static int sis_fb_free( DRM_IOCTL_ARGS )
        if (dev_priv == NULL || dev_priv->FBHeap == NULL)
                return DRM_ERR(EINVAL);
 
-       DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *)data, sizeof(fb));
+       DRM_COPY_FROM_USER_IOCTL(fb, (drm_sis_mem_t __user *) data, sizeof(fb));
 
-       if (!mmBlockInHeap(dev_priv->FBHeap, (PMemBlock)fb.free))
+       if (!mmBlockInHeap(dev_priv->FBHeap, (PMemBlock) fb.free))
                return DRM_ERR(EINVAL);
 
        if (!del_alloc_set(fb.context, VIDEO_TYPE, fb.free))
                return DRM_ERR(EINVAL);
-       mmFreeMem((PMemBlock)fb.free);
+       mmFreeMem((PMemBlock) fb.free);
 
        DRM_DEBUG("free fb, free = 0x%lx\n", fb.free);
 
@@ -237,9 +234,9 @@ static int sis_fb_free( DRM_IOCTL_ARGS )
 
 #endif
 
-/* agp memory management */ 
+/* agp memory management */
 
-static int sis_ioctl_agp_init( DRM_IOCTL_ARGS )
+static int sis_ioctl_agp_init(DRM_IOCTL_ARGS)
 {
        DRM_DEVICE;
        drm_sis_private_t *dev_priv = dev->dev_private;
@@ -247,7 +244,7 @@ static int sis_ioctl_agp_init( DRM_IOCTL_ARGS )
 
        if (dev_priv == NULL) {
                dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t),
-                   DRM_MEM_DRIVER);
+                                             DRM_MEM_DRIVER);
                dev_priv = dev->dev_private;
                if (dev_priv == NULL)
                        return ENOMEM;
@@ -256,29 +253,30 @@ static int sis_ioctl_agp_init( DRM_IOCTL_ARGS )
        if (dev_priv->AGPHeap != NULL)
                return DRM_ERR(EINVAL);
 
-       DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_agp_t __user *)data, sizeof(agp));
+       DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_agp_t __user *) data,
+                                sizeof(agp));
 
        dev_priv->AGPHeap = mmInit(agp.offset, agp.size);
 
        DRM_DEBUG("offset = %u, size = %u", agp.offset, agp.size);
-  
+
        return 0;
 }
 
-static int sis_ioctl_agp_alloc( DRM_IOCTL_ARGS )
+static int sis_ioctl_agp_alloc(DRM_IOCTL_ARGS)
 {
        DRM_DEVICE;
        drm_sis_private_t *dev_priv = dev->dev_private;
-       drm_sis_mem_t __user *argp = (void __user *)data;
+       drm_sis_mem_t __user *argp = (drm_sis_mem_t __user *)data;
        drm_sis_mem_t agp;
        PMemBlock block;
        int retval = 0;
-   
+
        if (dev_priv == NULL || dev_priv->AGPHeap == NULL)
                return DRM_ERR(EINVAL);
-  
+
        DRM_COPY_FROM_USER_IOCTL(agp, argp, sizeof(agp));
-  
+
        block = mmAllocMem(dev_priv->AGPHeap, agp.size, 0, 0);
        if (block) {
                /* TODO */
@@ -286,10 +284,10 @@ static int sis_ioctl_agp_alloc( DRM_IOCTL_ARGS )
                agp.free = (unsigned long)block;
                if (!add_alloc_set(agp.context, AGP_TYPE, agp.free)) {
                        DRM_DEBUG("adding to allocation set fails\n");
-                       mmFreeMem((PMemBlock)agp.free);
+                       mmFreeMem((PMemBlock) agp.free);
                        retval = -1;
                }
-       } else {  
+       } else {
                agp.offset = 0;
                agp.size = 0;
                agp.free = 0;
@@ -302,7 +300,7 @@ static int sis_ioctl_agp_alloc( DRM_IOCTL_ARGS )
        return retval;
 }
 
-static int sis_ioctl_agp_free( DRM_IOCTL_ARGS )
+static int sis_ioctl_agp_free(DRM_IOCTL_ARGS)
 {
        DRM_DEVICE;
        drm_sis_private_t *dev_priv = dev->dev_private;
@@ -311,12 +309,13 @@ static int sis_ioctl_agp_free( DRM_IOCTL_ARGS )
        if (dev_priv == NULL || dev_priv->AGPHeap == NULL)
                return DRM_ERR(EINVAL);
 
-       DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_mem_t __user *)data, sizeof(agp));
+       DRM_COPY_FROM_USER_IOCTL(agp, (drm_sis_mem_t __user *) data,
+                                sizeof(agp));
 
-       if (!mmBlockInHeap(dev_priv->AGPHeap, (PMemBlock)agp.free))
+       if (!mmBlockInHeap(dev_priv->AGPHeap, (PMemBlock) agp.free))
                return DRM_ERR(EINVAL);
 
-       mmFreeMem((PMemBlock)agp.free);
+       mmFreeMem((PMemBlock) agp.free);
        if (!del_alloc_set(agp.context, AGP_TYPE, agp.free))
                return DRM_ERR(EINVAL);
 
@@ -329,31 +328,30 @@ int sis_init_context(struct drm_device *dev, int context)
 {
        int i;
 
-       for (i = 0; i < MAX_CONTEXT ; i++) {
+       for (i = 0; i < MAX_CONTEXT; i++) {
                if (global_ppriv[i].used &&
                    (global_ppriv[i].context == context))
                        break;
        }
 
        if (i >= MAX_CONTEXT) {
-               for (i = 0; i < MAX_CONTEXT ; i++) {
+               for (i = 0; i < MAX_CONTEXT; i++) {
                        if (!global_ppriv[i].used) {
                                global_ppriv[i].context = context;
                                global_ppriv[i].used = 1;
                                global_ppriv[i].sets[0] = setInit();
                                global_ppriv[i].sets[1] = setInit();
                                DRM_DEBUG("init allocation set, socket=%d, "
-                                   "context = %d\n", i, context);
+                                         "context = %d\n", i, context);
                                break;
                        }
                }
                if ((i >= MAX_CONTEXT) || (global_ppriv[i].sets[0] == NULL) ||
-                   (global_ppriv[i].sets[1] == NULL))
-               {
+                   (global_ppriv[i].sets[1] == NULL)) {
                        return 0;
                }
        }
-       
+
        return 1;
 }
 
@@ -361,7 +359,7 @@ int sis_final_context(struct drm_device *dev, int context)
 {
        int i;
 
-       for (i=0; i<MAX_CONTEXT; i++) {
+       for (i = 0; i < MAX_CONTEXT; i++) {
                if (global_ppriv[i].used &&
                    (global_ppriv[i].context == context))
                        break;
@@ -369,7 +367,7 @@ int sis_final_context(struct drm_device *dev, int context)
 
        if (i < MAX_CONTEXT) {
                set_t *set;
-               unsigned int item;
+               ITEM_TYPE item;
                int retval;
 
                DRM_DEBUG("find socket %d, context = %d\n", i, context);
@@ -378,11 +376,11 @@ int sis_final_context(struct drm_device *dev, int context)
                set = global_ppriv[i].sets[0];
                retval = setFirst(set, &item);
                while (retval) {
-                       DRM_DEBUG("free video memory 0x%x\n", item);
+                       DRM_DEBUG("free video memory 0x%lx\n", item);
 #if defined(__linux__) && defined(CONFIG_FB_SIS)
                        sis_free(item);
 #else
-                       mmFreeMem((PMemBlock)item);
+                       mmFreeMem((PMemBlock) item);
 #endif
                        retval = setNext(set, &item);
                }
@@ -392,26 +390,25 @@ int sis_final_context(struct drm_device *dev, int context)
                set = global_ppriv[i].sets[1];
                retval = setFirst(set, &item);
                while (retval) {
-                       DRM_DEBUG("free agp memory 0x%x\n", item);
-                       mmFreeMem((PMemBlock)item);
+                       DRM_DEBUG("free agp memory 0x%lx\n", item);
+                       mmFreeMem((PMemBlock) item);
                        retval = setNext(set, &item);
                }
                setDestroy(set);
 
-               global_ppriv[i].used = 0;         
-        }
-       
+               global_ppriv[i].used = 0;
+       }
+
        return 1;
 }
 
 drm_ioctl_desc_t sis_ioctls[] = {
-       [DRM_IOCTL_NR(DRM_SIS_FB_ALLOC)]  = { sis_fb_alloc,        1, 0 },
-       [DRM_IOCTL_NR(DRM_SIS_FB_FREE)]   = { sis_fb_free,         1, 0 },
-       [DRM_IOCTL_NR(DRM_SIS_AGP_INIT)]  = { sis_ioctl_agp_init,  1, 1 },
-       [DRM_IOCTL_NR(DRM_SIS_AGP_ALLOC)] = { sis_ioctl_agp_alloc, 1, 0 },
-       [DRM_IOCTL_NR(DRM_SIS_AGP_FREE)]  = { sis_ioctl_agp_free,  1, 0 },
-       [DRM_IOCTL_NR(DRM_SIS_FB_INIT)]   = { sis_fb_init,         1, 1 }
+       [DRM_IOCTL_NR(DRM_SIS_FB_ALLOC)] = {sis_fb_alloc, DRM_AUTH},
+       [DRM_IOCTL_NR(DRM_SIS_FB_FREE)] = {sis_fb_free, DRM_AUTH},
+       [DRM_IOCTL_NR(DRM_SIS_AGP_INIT)] = {sis_ioctl_agp_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
+       [DRM_IOCTL_NR(DRM_SIS_AGP_ALLOC)] = {sis_ioctl_agp_alloc, DRM_AUTH},
+       [DRM_IOCTL_NR(DRM_SIS_AGP_FREE)] = {sis_ioctl_agp_free, DRM_AUTH},
+       [DRM_IOCTL_NR(DRM_SIS_FB_INIT)] = {sis_fb_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}
 };
 
 int sis_max_ioctl = DRM_ARRAY_SIZE(sis_ioctls);
-