agp/uninorth: Also handle user memory types in u3_remove_memory().
authorMichel Dänzer <daenzer@vmware.com>
Sun, 6 Dec 2009 02:15:55 +0000 (02:15 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 9 Dec 2009 06:09:30 +0000 (17:09 +1100)
Also short-circuit empty updates.

Signed-off-by: Michel Dänzer <daenzer@vmware.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
drivers/char/agp/uninorth-agp.c

index 703959eba45a37d9b914fcf0b19e717f7bd88f2b..4e05021f3f18b04d1096e8babce9e7438ef82ba1 100644 (file)
@@ -151,9 +151,6 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start,
        void *temp;
        int mask_type;
 
-       temp = agp_bridge->current_size;
-       num_entries = A_SIZE_32(temp)->num_entries;
-
        if (type != mem->type)
                return -EINVAL;
 
@@ -163,6 +160,12 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start,
                return -EINVAL;
        }
 
+       if (mem->page_count == 0)
+               return 0;
+
+       temp = agp_bridge->current_size;
+       num_entries = A_SIZE_32(temp)->num_entries;
+
        if ((pg_start + mem->page_count) > num_entries)
                return -EINVAL;
 
@@ -194,9 +197,6 @@ static int u3_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
        u32 *gp;
        int mask_type;
 
-       temp = agp_bridge->current_size;
-       num_entries = A_SIZE_32(temp)->num_entries;
-
        if (type != mem->type)
                return -EINVAL;
 
@@ -206,6 +206,12 @@ static int u3_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
                return -EINVAL;
        }
 
+       if (mem->page_count == 0)
+               return 0;
+
+       temp = agp_bridge->current_size;
+       num_entries = A_SIZE_32(temp)->num_entries;
+
        if ((pg_start + mem->page_count) > num_entries)
                return -EINVAL;
 
@@ -234,10 +240,19 @@ int u3_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
 {
        size_t i;
        u32 *gp;
+       int mask_type;
+
+       if (type != mem->type)
+               return -EINVAL;
 
-       if (type != 0 || mem->type != 0)
+       mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
+       if (mask_type != 0) {
                /* We know nothing of memory types */
                return -EINVAL;
+       }
+
+       if (mem->page_count == 0)
+               return 0;
 
        gp = (u32 *) &agp_bridge->gatt_table[pg_start];
        for (i = 0; i < mem->page_count; ++i)