]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/char/agp/frontend.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6-omap-h63xx.git] / drivers / char / agp / frontend.c
index d9c5a9142ad1daa4a5e5de83e11175e7e0863e28..c7ed617aa7ff436ea8c359f66bdafa097b4641de 100644 (file)
 #include <linux/agpgart.h>
 #include <linux/slab.h>
 #include <linux/mm.h>
+#include <linux/sched.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include "agp.h"
 
-static struct agp_front_data agp_fe;
+struct agp_front_data agp_fe;
 
-static struct agp_memory *agp_find_mem_by_key(int key)
+struct agp_memory *agp_find_mem_by_key(int key)
 {
        struct agp_memory *curr;
 
@@ -151,38 +152,15 @@ static void agp_add_seg_to_client(struct agp_client *client,
        client->segments = seg;
 }
 
-/* Originally taken from linux/mm/mmap.c from the array
- * protection_map.
- * The original really should be exported to modules, or
- * some routine which does the conversion for you
- */
-
-static const pgprot_t my_protect_map[16] =
-{
-       __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
-       __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
-};
-
 static pgprot_t agp_convert_mmap_flags(int prot)
 {
-#define _trans(x,bit1,bit2) \
-((bit1==bit2)?(x&bit1):(x&bit1)?bit2:0)
-
        unsigned long prot_bits;
-       pgprot_t temp;
 
-       prot_bits = _trans(prot, PROT_READ, VM_READ) |
-           _trans(prot, PROT_WRITE, VM_WRITE) |
-           _trans(prot, PROT_EXEC, VM_EXEC);
-
-       prot_bits |= VM_SHARED;
-
-       temp = my_protect_map[prot_bits & 0x0000000f];
-
-       return temp;
+       prot_bits = calc_vm_prot_bits(prot) | VM_SHARED;
+       return vm_get_page_prot(prot_bits);
 }
 
-static int agp_create_segment(struct agp_client *client, struct agp_region *region)
+int agp_create_segment(struct agp_client *client, struct agp_region *region)
 {
        struct agp_segment_priv **ret_seg;
        struct agp_segment_priv *seg;
@@ -234,7 +212,7 @@ static void agp_insert_into_pool(struct agp_memory * temp)
 
 /* File private list routines */
 
-static struct agp_file_private *agp_find_private(pid_t pid)
+struct agp_file_private *agp_find_private(pid_t pid)
 {
        struct agp_file_private *curr;
 
@@ -289,13 +267,13 @@ static void agp_remove_file_private(struct agp_file_private * priv)
  * Wrappers for agp_free_memory & agp_allocate_memory
  * These make sure that internal lists are kept updated.
  */
-static void agp_free_memory_wrap(struct agp_memory *memory)
+void agp_free_memory_wrap(struct agp_memory *memory)
 {
        agp_remove_from_pool(memory);
        agp_free_memory(memory);
 }
 
-static struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type)
+struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type)
 {
        struct agp_memory *memory;
 
@@ -507,7 +485,7 @@ static struct agp_controller *agp_find_controller_for_client(pid_t id)
        return NULL;
 }
 
-static struct agp_client *agp_find_client_by_pid(pid_t id)
+struct agp_client *agp_find_client_by_pid(pid_t id)
 {
        struct agp_client *temp;
 
@@ -532,7 +510,7 @@ static void agp_insert_client(struct agp_client *client)
        agp_fe.current_controller->num_clients++;
 }
 
-static struct agp_client *agp_create_client(pid_t id)
+struct agp_client *agp_create_client(pid_t id)
 {
        struct agp_client *new_client;
 
@@ -545,7 +523,7 @@ static struct agp_client *agp_create_client(pid_t id)
        return new_client;
 }
 
-static int agp_remove_client(pid_t id)
+int agp_remove_client(pid_t id)
 {
        struct agp_client *client;
        struct agp_client *prev_client;
@@ -769,7 +747,7 @@ static int agpioc_info_wrap(struct agp_file_private *priv, void __user *arg)
        return 0;
 }
 
-static int agpioc_acquire_wrap(struct agp_file_private *priv)
+int agpioc_acquire_wrap(struct agp_file_private *priv)
 {
        struct agp_controller *controller;
 
@@ -812,14 +790,14 @@ static int agpioc_acquire_wrap(struct agp_file_private *priv)
        return 0;
 }
 
-static int agpioc_release_wrap(struct agp_file_private *priv)
+int agpioc_release_wrap(struct agp_file_private *priv)
 {
        DBG("");
        agp_controller_release_current(agp_fe.current_controller, priv);
        return 0;
 }
 
-static int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg)
+int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg)
 {
        struct agp_setup mode;
 
@@ -899,7 +877,7 @@ static int agpioc_reserve_wrap(struct agp_file_private *priv, void __user *arg)
        return -EINVAL;
 }
 
-static int agpioc_protect_wrap(struct agp_file_private *priv)
+int agpioc_protect_wrap(struct agp_file_private *priv)
 {
        DBG("");
        /* This function is not currently implemented */
@@ -915,6 +893,9 @@ static int agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
        if (copy_from_user(&alloc, arg, sizeof(struct agp_allocate)))
                return -EFAULT;
 
+       if (alloc.type >= AGP_USER_TYPES)
+               return -EINVAL;
+
        memory = agp_allocate_memory_wrap(alloc.pg_count, alloc.type);
 
        if (memory == NULL)
@@ -930,7 +911,7 @@ static int agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
        return 0;
 }
 
-static int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg)
+int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg)
 {
        struct agp_memory *memory;
 
@@ -1066,6 +1047,9 @@ static const struct file_operations agp_fops =
        .read           = agp_read,
        .write          = agp_write,
        .ioctl          = agp_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = compat_agp_ioctl,
+#endif
        .mmap           = agp_mmap,
        .open           = agp_open,
        .release        = agp_release,