diff options
Diffstat (limited to 'drivers/char')
| -rw-r--r-- | drivers/char/agp/agp.h | 12 | ||||
| -rw-r--r-- | drivers/char/agp/ali-agp.c | 28 | ||||
| -rw-r--r-- | drivers/char/agp/amd-k7-agp.c | 2 | ||||
| -rw-r--r-- | drivers/char/agp/amd64-agp.c | 2 | ||||
| -rw-r--r-- | drivers/char/agp/ati-agp.c | 23 | ||||
| -rw-r--r-- | drivers/char/agp/backend.c | 8 | ||||
| -rw-r--r-- | drivers/char/agp/efficeon-agp.c | 5 | ||||
| -rw-r--r-- | drivers/char/agp/generic.c | 69 | ||||
| -rw-r--r-- | drivers/char/agp/hp-agp.c | 9 | ||||
| -rw-r--r-- | drivers/char/agp/i460-agp.c | 47 | ||||
| -rw-r--r-- | drivers/char/agp/intel-agp.c | 49 | ||||
| -rw-r--r-- | drivers/char/agp/nvidia-agp.c | 2 | ||||
| -rw-r--r-- | drivers/char/agp/parisc-agp.c | 20 | ||||
| -rw-r--r-- | drivers/char/agp/sgi-agp.c | 9 | ||||
| -rw-r--r-- | drivers/char/agp/sworks-agp.c | 2 | ||||
| -rw-r--r-- | drivers/char/agp/uninorth-agp.c | 30 | ||||
| -rw-r--r-- | drivers/char/keyboard.c | 2 |
17 files changed, 174 insertions, 145 deletions
diff --git a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h index 46f507531177..178e2e9e9f09 100644 --- a/drivers/char/agp/agp.h +++ b/drivers/char/agp/agp.h | |||
| @@ -107,7 +107,7 @@ struct agp_bridge_driver { | |||
| 107 | void (*agp_enable)(struct agp_bridge_data *, u32); | 107 | void (*agp_enable)(struct agp_bridge_data *, u32); |
| 108 | void (*cleanup)(void); | 108 | void (*cleanup)(void); |
| 109 | void (*tlb_flush)(struct agp_memory *); | 109 | void (*tlb_flush)(struct agp_memory *); |
| 110 | unsigned long (*mask_memory)(struct agp_bridge_data *, unsigned long, int); | 110 | unsigned long (*mask_memory)(struct agp_bridge_data *, struct page *, int); |
| 111 | void (*cache_flush)(void); | 111 | void (*cache_flush)(void); |
| 112 | int (*create_gatt_table)(struct agp_bridge_data *); | 112 | int (*create_gatt_table)(struct agp_bridge_data *); |
| 113 | int (*free_gatt_table)(struct agp_bridge_data *); | 113 | int (*free_gatt_table)(struct agp_bridge_data *); |
| @@ -115,9 +115,9 @@ struct agp_bridge_driver { | |||
| 115 | int (*remove_memory)(struct agp_memory *, off_t, int); | 115 | int (*remove_memory)(struct agp_memory *, off_t, int); |
| 116 | struct agp_memory *(*alloc_by_type) (size_t, int); | 116 | struct agp_memory *(*alloc_by_type) (size_t, int); |
| 117 | void (*free_by_type)(struct agp_memory *); | 117 | void (*free_by_type)(struct agp_memory *); |
| 118 | void *(*agp_alloc_page)(struct agp_bridge_data *); | 118 | struct page *(*agp_alloc_page)(struct agp_bridge_data *); |
| 119 | int (*agp_alloc_pages)(struct agp_bridge_data *, struct agp_memory *, size_t); | 119 | int (*agp_alloc_pages)(struct agp_bridge_data *, struct agp_memory *, size_t); |
| 120 | void (*agp_destroy_page)(void *, int flags); | 120 | void (*agp_destroy_page)(struct page *, int flags); |
| 121 | void (*agp_destroy_pages)(struct agp_memory *); | 121 | void (*agp_destroy_pages)(struct agp_memory *); |
| 122 | int (*agp_type_to_mask_type) (struct agp_bridge_data *, int); | 122 | int (*agp_type_to_mask_type) (struct agp_bridge_data *, int); |
| 123 | void (*chipset_flush)(struct agp_bridge_data *); | 123 | void (*chipset_flush)(struct agp_bridge_data *); |
| @@ -278,10 +278,10 @@ int agp_generic_insert_memory(struct agp_memory *mem, off_t pg_start, int type); | |||
| 278 | int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type); | 278 | int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type); |
| 279 | struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type); | 279 | struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type); |
| 280 | void agp_generic_free_by_type(struct agp_memory *curr); | 280 | void agp_generic_free_by_type(struct agp_memory *curr); |
| 281 | void *agp_generic_alloc_page(struct agp_bridge_data *bridge); | 281 | struct page *agp_generic_alloc_page(struct agp_bridge_data *bridge); |
| 282 | int agp_generic_alloc_pages(struct agp_bridge_data *agp_bridge, | 282 | int agp_generic_alloc_pages(struct agp_bridge_data *agp_bridge, |
| 283 | struct agp_memory *memory, size_t page_count); | 283 | struct agp_memory *memory, size_t page_count); |
| 284 | void agp_generic_destroy_page(void *addr, int flags); | 284 | void agp_generic_destroy_page(struct page *page, int flags); |
| 285 | void agp_generic_destroy_pages(struct agp_memory *memory); | 285 | void agp_generic_destroy_pages(struct agp_memory *memory); |
| 286 | void agp_free_key(int key); | 286 | void agp_free_key(int key); |
| 287 | int agp_num_entries(void); | 287 | int agp_num_entries(void); |
| @@ -291,7 +291,7 @@ int agp_3_5_enable(struct agp_bridge_data *bridge); | |||
| 291 | void global_cache_flush(void); | 291 | void global_cache_flush(void); |
| 292 | void get_agp_version(struct agp_bridge_data *bridge); | 292 | void get_agp_version(struct agp_bridge_data *bridge); |
| 293 | unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge, | 293 | unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge, |
| 294 | unsigned long addr, int type); | 294 | struct page *page, int type); |
| 295 | int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge, | 295 | int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge, |
| 296 | int type); | 296 | int type); |
| 297 | struct agp_bridge_data *agp_generic_find_bridge(struct pci_dev *pdev); | 297 | struct agp_bridge_data *agp_generic_find_bridge(struct pci_dev *pdev); |
diff --git a/drivers/char/agp/ali-agp.c b/drivers/char/agp/ali-agp.c index dc8d1a90971f..201ef3ffd484 100644 --- a/drivers/char/agp/ali-agp.c +++ b/drivers/char/agp/ali-agp.c | |||
| @@ -141,37 +141,37 @@ static void m1541_cache_flush(void) | |||
| 141 | } | 141 | } |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | static void *m1541_alloc_page(struct agp_bridge_data *bridge) | 144 | static struct page *m1541_alloc_page(struct agp_bridge_data *bridge) |
| 145 | { | 145 | { |
| 146 | void *addr = agp_generic_alloc_page(agp_bridge); | 146 | struct page *page = agp_generic_alloc_page(agp_bridge); |
| 147 | u32 temp; | 147 | u32 temp; |
| 148 | 148 | ||
| 149 | if (!addr) | 149 | if (!page) |
| 150 | return NULL; | 150 | return NULL; |
| 151 | 151 | ||
| 152 | pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); | 152 | pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); |
| 153 | pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, | 153 | pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, |
| 154 | (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | | 154 | (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | |
| 155 | virt_to_gart(addr)) | ALI_CACHE_FLUSH_EN )); | 155 | phys_to_gart(page_to_phys(page))) | ALI_CACHE_FLUSH_EN )); |
| 156 | return addr; | 156 | return page; |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static void ali_destroy_page(void * addr, int flags) | 159 | static void ali_destroy_page(struct page *page, int flags) |
| 160 | { | 160 | { |
| 161 | if (addr) { | 161 | if (page) { |
| 162 | if (flags & AGP_PAGE_DESTROY_UNMAP) { | 162 | if (flags & AGP_PAGE_DESTROY_UNMAP) { |
| 163 | global_cache_flush(); /* is this really needed? --hch */ | 163 | global_cache_flush(); /* is this really needed? --hch */ |
| 164 | agp_generic_destroy_page(addr, flags); | 164 | agp_generic_destroy_page(page, flags); |
| 165 | } else | 165 | } else |
| 166 | agp_generic_destroy_page(addr, flags); | 166 | agp_generic_destroy_page(page, flags); |
| 167 | } | 167 | } |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | static void m1541_destroy_page(void * addr, int flags) | 170 | static void m1541_destroy_page(struct page *page, int flags) |
| 171 | { | 171 | { |
| 172 | u32 temp; | 172 | u32 temp; |
| 173 | 173 | ||
| 174 | if (addr == NULL) | 174 | if (page == NULL) |
| 175 | return; | 175 | return; |
| 176 | 176 | ||
| 177 | if (flags & AGP_PAGE_DESTROY_UNMAP) { | 177 | if (flags & AGP_PAGE_DESTROY_UNMAP) { |
| @@ -180,9 +180,9 @@ static void m1541_destroy_page(void * addr, int flags) | |||
| 180 | pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); | 180 | pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); |
| 181 | pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, | 181 | pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, |
| 182 | (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | | 182 | (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | |
| 183 | virt_to_gart(addr)) | ALI_CACHE_FLUSH_EN)); | 183 | phys_to_gart(page_to_phys(page))) | ALI_CACHE_FLUSH_EN)); |
| 184 | } | 184 | } |
| 185 | agp_generic_destroy_page(addr, flags); | 185 | agp_generic_destroy_page(page, flags); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | 188 | ||
| @@ -346,7 +346,7 @@ found: | |||
| 346 | devs[j].chipset_name = "M1641"; | 346 | devs[j].chipset_name = "M1641"; |
| 347 | break; | 347 | break; |
| 348 | case 0x43: | 348 | case 0x43: |
| 349 | devs[j].chipset_name = "M????"; | 349 | devs[j].chipset_name = "M1621"; |
| 350 | break; | 350 | break; |
| 351 | case 0x47: | 351 | case 0x47: |
| 352 | devs[j].chipset_name = "M1647"; | 352 | devs[j].chipset_name = "M1647"; |
diff --git a/drivers/char/agp/amd-k7-agp.c b/drivers/char/agp/amd-k7-agp.c index 3f98254b911f..ba9bde71eaaf 100644 --- a/drivers/char/agp/amd-k7-agp.c +++ b/drivers/char/agp/amd-k7-agp.c | |||
| @@ -325,7 +325,7 @@ static int amd_insert_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 325 | addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr; | 325 | addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr; |
| 326 | cur_gatt = GET_GATT(addr); | 326 | cur_gatt = GET_GATT(addr); |
| 327 | writel(agp_generic_mask_memory(agp_bridge, | 327 | writel(agp_generic_mask_memory(agp_bridge, |
| 328 | mem->memory[i], mem->type), cur_gatt+GET_GATT_OFF(addr)); | 328 | mem->pages[i], mem->type), cur_gatt+GET_GATT_OFF(addr)); |
| 329 | readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */ | 329 | readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */ |
| 330 | } | 330 | } |
| 331 | amd_irongate_tlbflush(mem); | 331 | amd_irongate_tlbflush(mem); |
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index d765afda9c2a..3bf5dda90f4a 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
| @@ -79,7 +79,7 @@ static int amd64_insert_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 79 | 79 | ||
| 80 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 80 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 81 | tmp = agp_bridge->driver->mask_memory(agp_bridge, | 81 | tmp = agp_bridge->driver->mask_memory(agp_bridge, |
| 82 | mem->memory[i], mask_type); | 82 | mem->pages[i], mask_type); |
| 83 | 83 | ||
| 84 | BUG_ON(tmp & 0xffffff0000000ffcULL); | 84 | BUG_ON(tmp & 0xffffff0000000ffcULL); |
| 85 | pte = (tmp & 0x000000ff00000000ULL) >> 28; | 85 | pte = (tmp & 0x000000ff00000000ULL) >> 28; |
diff --git a/drivers/char/agp/ati-agp.c b/drivers/char/agp/ati-agp.c index f1537eece07f..33656e144cc5 100644 --- a/drivers/char/agp/ati-agp.c +++ b/drivers/char/agp/ati-agp.c | |||
| @@ -269,12 +269,17 @@ static int ati_insert_memory(struct agp_memory * mem, | |||
| 269 | int i, j, num_entries; | 269 | int i, j, num_entries; |
| 270 | unsigned long __iomem *cur_gatt; | 270 | unsigned long __iomem *cur_gatt; |
| 271 | unsigned long addr; | 271 | unsigned long addr; |
| 272 | int mask_type; | ||
| 272 | 273 | ||
| 273 | num_entries = A_SIZE_LVL2(agp_bridge->current_size)->num_entries; | 274 | num_entries = A_SIZE_LVL2(agp_bridge->current_size)->num_entries; |
| 274 | 275 | ||
| 275 | if (type != 0 || mem->type != 0) | 276 | mask_type = agp_generic_type_to_mask_type(mem->bridge, type); |
| 277 | if (mask_type != 0 || type != mem->type) | ||
| 276 | return -EINVAL; | 278 | return -EINVAL; |
| 277 | 279 | ||
| 280 | if (mem->page_count == 0) | ||
| 281 | return 0; | ||
| 282 | |||
| 278 | if ((pg_start + mem->page_count) > num_entries) | 283 | if ((pg_start + mem->page_count) > num_entries) |
| 279 | return -EINVAL; | 284 | return -EINVAL; |
| 280 | 285 | ||
| @@ -296,10 +301,11 @@ static int ati_insert_memory(struct agp_memory * mem, | |||
| 296 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 301 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 297 | addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr; | 302 | addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr; |
| 298 | cur_gatt = GET_GATT(addr); | 303 | cur_gatt = GET_GATT(addr); |
| 299 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 304 | writel(agp_bridge->driver->mask_memory(agp_bridge, |
| 300 | mem->memory[i], mem->type), cur_gatt+GET_GATT_OFF(addr)); | 305 | mem->pages[i], mem->type), |
| 301 | readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */ | 306 | cur_gatt+GET_GATT_OFF(addr)); |
| 302 | } | 307 | } |
| 308 | readl(GET_GATT(agp_bridge->gart_bus_addr)); /* PCI posting */ | ||
| 303 | agp_bridge->driver->tlb_flush(mem); | 309 | agp_bridge->driver->tlb_flush(mem); |
| 304 | return 0; | 310 | return 0; |
| 305 | } | 311 | } |
| @@ -310,17 +316,22 @@ static int ati_remove_memory(struct agp_memory * mem, off_t pg_start, | |||
| 310 | int i; | 316 | int i; |
| 311 | unsigned long __iomem *cur_gatt; | 317 | unsigned long __iomem *cur_gatt; |
| 312 | unsigned long addr; | 318 | unsigned long addr; |
| 319 | int mask_type; | ||
| 313 | 320 | ||
| 314 | if (type != 0 || mem->type != 0) | 321 | mask_type = agp_generic_type_to_mask_type(mem->bridge, type); |
| 322 | if (mask_type != 0 || type != mem->type) | ||
| 315 | return -EINVAL; | 323 | return -EINVAL; |
| 316 | 324 | ||
| 325 | if (mem->page_count == 0) | ||
| 326 | return 0; | ||
| 327 | |||
| 317 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { | 328 | for (i = pg_start; i < (mem->page_count + pg_start); i++) { |
| 318 | addr = (i * PAGE_SIZE) + agp_bridge->gart_bus_addr; | 329 | addr = (i * PAGE_SIZE) + agp_bridge->gart_bus_addr; |
| 319 | cur_gatt = GET_GATT(addr); | 330 | cur_gatt = GET_GATT(addr); |
| 320 | writel(agp_bridge->scratch_page, cur_gatt+GET_GATT_OFF(addr)); | 331 | writel(agp_bridge->scratch_page, cur_gatt+GET_GATT_OFF(addr)); |
| 321 | readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */ | ||
| 322 | } | 332 | } |
| 323 | 333 | ||
| 334 | readl(GET_GATT(agp_bridge->gart_bus_addr)); /* PCI posting */ | ||
| 324 | agp_bridge->driver->tlb_flush(mem); | 335 | agp_bridge->driver->tlb_flush(mem); |
| 325 | return 0; | 336 | return 0; |
| 326 | } | 337 | } |
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index 8c617ad7497f..cfa5a649dfe7 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c | |||
| @@ -141,17 +141,17 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge) | |||
| 141 | bridge->version = &agp_current_version; | 141 | bridge->version = &agp_current_version; |
| 142 | 142 | ||
| 143 | if (bridge->driver->needs_scratch_page) { | 143 | if (bridge->driver->needs_scratch_page) { |
| 144 | void *addr = bridge->driver->agp_alloc_page(bridge); | 144 | struct page *page = bridge->driver->agp_alloc_page(bridge); |
| 145 | 145 | ||
| 146 | if (!addr) { | 146 | if (!page) { |
| 147 | dev_err(&bridge->dev->dev, | 147 | dev_err(&bridge->dev->dev, |
| 148 | "can't get memory for scratch page\n"); | 148 | "can't get memory for scratch page\n"); |
| 149 | return -ENOMEM; | 149 | return -ENOMEM; |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | bridge->scratch_page_real = virt_to_gart(addr); | 152 | bridge->scratch_page_real = phys_to_gart(page_to_phys(page)); |
| 153 | bridge->scratch_page = | 153 | bridge->scratch_page = |
| 154 | bridge->driver->mask_memory(bridge, bridge->scratch_page_real, 0); | 154 | bridge->driver->mask_memory(bridge, page, 0); |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | size_value = bridge->driver->fetch_size(); | 157 | size_value = bridge->driver->fetch_size(); |
diff --git a/drivers/char/agp/efficeon-agp.c b/drivers/char/agp/efficeon-agp.c index 453543a1f293..35d50f2861b6 100644 --- a/drivers/char/agp/efficeon-agp.c +++ b/drivers/char/agp/efficeon-agp.c | |||
| @@ -65,8 +65,9 @@ static const struct gatt_mask efficeon_generic_masks[] = | |||
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | /* This function does the same thing as mask_memory() for this chipset... */ | 67 | /* This function does the same thing as mask_memory() for this chipset... */ |
| 68 | static inline unsigned long efficeon_mask_memory(unsigned long addr) | 68 | static inline unsigned long efficeon_mask_memory(struct page *page) |
| 69 | { | 69 | { |
| 70 | unsigned long addr = phys_to_gart(page_to_phys(page)); | ||
| 70 | return addr | 0x00000001; | 71 | return addr | 0x00000001; |
| 71 | } | 72 | } |
| 72 | 73 | ||
| @@ -257,7 +258,7 @@ static int efficeon_insert_memory(struct agp_memory * mem, off_t pg_start, int t | |||
| 257 | last_page = NULL; | 258 | last_page = NULL; |
| 258 | for (i = 0; i < count; i++) { | 259 | for (i = 0; i < count; i++) { |
| 259 | int index = pg_start + i; | 260 | int index = pg_start + i; |
| 260 | unsigned long insert = efficeon_mask_memory(mem->memory[i]); | 261 | unsigned long insert = efficeon_mask_memory(mem->pages[i]); |
| 261 | 262 | ||
| 262 | page = (unsigned int *) efficeon_private.l1_table[index >> 10]; | 263 | page = (unsigned int *) efficeon_private.l1_table[index >> 10]; |
| 263 | 264 | ||
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index 2224b762b7fb..1e8b461b91f1 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
| @@ -95,13 +95,13 @@ EXPORT_SYMBOL(agp_flush_chipset); | |||
| 95 | 95 | ||
| 96 | void agp_alloc_page_array(size_t size, struct agp_memory *mem) | 96 | void agp_alloc_page_array(size_t size, struct agp_memory *mem) |
| 97 | { | 97 | { |
| 98 | mem->memory = NULL; | 98 | mem->pages = NULL; |
| 99 | mem->vmalloc_flag = false; | 99 | mem->vmalloc_flag = false; |
| 100 | 100 | ||
| 101 | if (size <= 2*PAGE_SIZE) | 101 | if (size <= 2*PAGE_SIZE) |
| 102 | mem->memory = kmalloc(size, GFP_KERNEL | __GFP_NORETRY); | 102 | mem->pages = kmalloc(size, GFP_KERNEL | __GFP_NORETRY); |
| 103 | if (mem->memory == NULL) { | 103 | if (mem->pages == NULL) { |
| 104 | mem->memory = vmalloc(size); | 104 | mem->pages = vmalloc(size); |
| 105 | mem->vmalloc_flag = true; | 105 | mem->vmalloc_flag = true; |
| 106 | } | 106 | } |
| 107 | } | 107 | } |
| @@ -110,9 +110,9 @@ EXPORT_SYMBOL(agp_alloc_page_array); | |||
| 110 | void agp_free_page_array(struct agp_memory *mem) | 110 | void agp_free_page_array(struct agp_memory *mem) |
| 111 | { | 111 | { |
| 112 | if (mem->vmalloc_flag) { | 112 | if (mem->vmalloc_flag) { |
| 113 | vfree(mem->memory); | 113 | vfree(mem->pages); |
| 114 | } else { | 114 | } else { |
| 115 | kfree(mem->memory); | 115 | kfree(mem->pages); |
| 116 | } | 116 | } |
| 117 | } | 117 | } |
| 118 | EXPORT_SYMBOL(agp_free_page_array); | 118 | EXPORT_SYMBOL(agp_free_page_array); |
| @@ -136,7 +136,7 @@ static struct agp_memory *agp_create_user_memory(unsigned long num_agp_pages) | |||
| 136 | 136 | ||
| 137 | agp_alloc_page_array(alloc_size, new); | 137 | agp_alloc_page_array(alloc_size, new); |
| 138 | 138 | ||
| 139 | if (new->memory == NULL) { | 139 | if (new->pages == NULL) { |
| 140 | agp_free_key(new->key); | 140 | agp_free_key(new->key); |
| 141 | kfree(new); | 141 | kfree(new); |
| 142 | return NULL; | 142 | return NULL; |
| @@ -162,7 +162,7 @@ struct agp_memory *agp_create_memory(int scratch_pages) | |||
| 162 | 162 | ||
| 163 | agp_alloc_page_array(PAGE_SIZE * scratch_pages, new); | 163 | agp_alloc_page_array(PAGE_SIZE * scratch_pages, new); |
| 164 | 164 | ||
| 165 | if (new->memory == NULL) { | 165 | if (new->pages == NULL) { |
| 166 | agp_free_key(new->key); | 166 | agp_free_key(new->key); |
| 167 | kfree(new); | 167 | kfree(new); |
| 168 | return NULL; | 168 | return NULL; |
| @@ -206,15 +206,13 @@ void agp_free_memory(struct agp_memory *curr) | |||
| 206 | } else { | 206 | } else { |
| 207 | 207 | ||
| 208 | for (i = 0; i < curr->page_count; i++) { | 208 | for (i = 0; i < curr->page_count; i++) { |
| 209 | curr->memory[i] = (unsigned long)gart_to_virt( | ||
| 210 | curr->memory[i]); | ||
| 211 | curr->bridge->driver->agp_destroy_page( | 209 | curr->bridge->driver->agp_destroy_page( |
| 212 | (void *)curr->memory[i], | 210 | curr->pages[i], |
| 213 | AGP_PAGE_DESTROY_UNMAP); | 211 | AGP_PAGE_DESTROY_UNMAP); |
| 214 | } | 212 | } |
| 215 | for (i = 0; i < curr->page_count; i++) { | 213 | for (i = 0; i < curr->page_count; i++) { |
| 216 | curr->bridge->driver->agp_destroy_page( | 214 | curr->bridge->driver->agp_destroy_page( |
| 217 | (void *)curr->memory[i], | 215 | curr->pages[i], |
| 218 | AGP_PAGE_DESTROY_FREE); | 216 | AGP_PAGE_DESTROY_FREE); |
| 219 | } | 217 | } |
| 220 | } | 218 | } |
| @@ -282,13 +280,13 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge, | |||
| 282 | } | 280 | } |
| 283 | 281 | ||
| 284 | for (i = 0; i < page_count; i++) { | 282 | for (i = 0; i < page_count; i++) { |
| 285 | void *addr = bridge->driver->agp_alloc_page(bridge); | 283 | struct page *page = bridge->driver->agp_alloc_page(bridge); |
| 286 | 284 | ||
| 287 | if (addr == NULL) { | 285 | if (page == NULL) { |
| 288 | agp_free_memory(new); | 286 | agp_free_memory(new); |
| 289 | return NULL; | 287 | return NULL; |
| 290 | } | 288 | } |
| 291 | new->memory[i] = virt_to_gart(addr); | 289 | new->pages[i] = page; |
| 292 | new->page_count++; | 290 | new->page_count++; |
| 293 | } | 291 | } |
| 294 | new->bridge = bridge; | 292 | new->bridge = bridge; |
| @@ -1134,7 +1132,7 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type) | |||
| 1134 | } | 1132 | } |
| 1135 | 1133 | ||
| 1136 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 1134 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 1137 | writel(bridge->driver->mask_memory(bridge, mem->memory[i], mask_type), | 1135 | writel(bridge->driver->mask_memory(bridge, mem->pages[i], mask_type), |
| 1138 | bridge->gatt_table+j); | 1136 | bridge->gatt_table+j); |
| 1139 | } | 1137 | } |
| 1140 | readl(bridge->gatt_table+j-1); /* PCI Posting. */ | 1138 | readl(bridge->gatt_table+j-1); /* PCI Posting. */ |
| @@ -1204,7 +1202,7 @@ struct agp_memory *agp_generic_alloc_user(size_t page_count, int type) | |||
| 1204 | return NULL; | 1202 | return NULL; |
| 1205 | 1203 | ||
| 1206 | for (i = 0; i < page_count; i++) | 1204 | for (i = 0; i < page_count; i++) |
| 1207 | new->memory[i] = 0; | 1205 | new->pages[i] = 0; |
| 1208 | new->page_count = 0; | 1206 | new->page_count = 0; |
| 1209 | new->type = type; | 1207 | new->type = type; |
| 1210 | new->num_scratch_pages = pages; | 1208 | new->num_scratch_pages = pages; |
| @@ -1237,23 +1235,20 @@ int agp_generic_alloc_pages(struct agp_bridge_data *bridge, struct agp_memory *m | |||
| 1237 | get_page(page); | 1235 | get_page(page); |
| 1238 | atomic_inc(&agp_bridge->current_memory_agp); | 1236 | atomic_inc(&agp_bridge->current_memory_agp); |
| 1239 | 1237 | ||
| 1240 | /* set_memory_array_uc() needs virtual address */ | 1238 | mem->pages[i] = page; |
| 1241 | mem->memory[i] = (unsigned long)page_address(page); | ||
| 1242 | mem->page_count++; | 1239 | mem->page_count++; |
| 1243 | } | 1240 | } |
| 1244 | 1241 | ||
| 1245 | #ifdef CONFIG_X86 | 1242 | #ifdef CONFIG_X86 |
| 1246 | set_memory_array_uc(mem->memory, num_pages); | 1243 | set_pages_array_uc(mem->pages, num_pages); |
| 1247 | #endif | 1244 | #endif |
| 1248 | ret = 0; | 1245 | ret = 0; |
| 1249 | out: | 1246 | out: |
| 1250 | for (i = 0; i < mem->page_count; i++) | ||
| 1251 | mem->memory[i] = virt_to_gart((void *)mem->memory[i]); | ||
| 1252 | return ret; | 1247 | return ret; |
| 1253 | } | 1248 | } |
| 1254 | EXPORT_SYMBOL(agp_generic_alloc_pages); | 1249 | EXPORT_SYMBOL(agp_generic_alloc_pages); |
| 1255 | 1250 | ||
| 1256 | void *agp_generic_alloc_page(struct agp_bridge_data *bridge) | 1251 | struct page *agp_generic_alloc_page(struct agp_bridge_data *bridge) |
| 1257 | { | 1252 | { |
| 1258 | struct page * page; | 1253 | struct page * page; |
| 1259 | 1254 | ||
| @@ -1265,56 +1260,47 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge) | |||
| 1265 | 1260 | ||
| 1266 | get_page(page); | 1261 | get_page(page); |
| 1267 | atomic_inc(&agp_bridge->current_memory_agp); | 1262 | atomic_inc(&agp_bridge->current_memory_agp); |
| 1268 | return page_address(page); | 1263 | return page; |
| 1269 | } | 1264 | } |
| 1270 | EXPORT_SYMBOL(agp_generic_alloc_page); | 1265 | EXPORT_SYMBOL(agp_generic_alloc_page); |
| 1271 | 1266 | ||
| 1272 | void agp_generic_destroy_pages(struct agp_memory *mem) | 1267 | void agp_generic_destroy_pages(struct agp_memory *mem) |
| 1273 | { | 1268 | { |
| 1274 | int i; | 1269 | int i; |
| 1275 | void *addr; | ||
| 1276 | struct page *page; | 1270 | struct page *page; |
| 1277 | 1271 | ||
| 1278 | if (!mem) | 1272 | if (!mem) |
| 1279 | return; | 1273 | return; |
| 1280 | 1274 | ||
| 1281 | for (i = 0; i < mem->page_count; i++) | ||
| 1282 | mem->memory[i] = (unsigned long)gart_to_virt(mem->memory[i]); | ||
| 1283 | |||
| 1284 | #ifdef CONFIG_X86 | 1275 | #ifdef CONFIG_X86 |
| 1285 | set_memory_array_wb(mem->memory, mem->page_count); | 1276 | set_pages_array_wb(mem->pages, mem->page_count); |
| 1286 | #endif | 1277 | #endif |
| 1287 | 1278 | ||
| 1288 | for (i = 0; i < mem->page_count; i++) { | 1279 | for (i = 0; i < mem->page_count; i++) { |
| 1289 | addr = (void *)mem->memory[i]; | 1280 | page = mem->pages[i]; |
| 1290 | page = virt_to_page(addr); | ||
| 1291 | 1281 | ||
| 1292 | #ifndef CONFIG_X86 | 1282 | #ifndef CONFIG_X86 |
| 1293 | unmap_page_from_agp(page); | 1283 | unmap_page_from_agp(page); |
| 1294 | #endif | 1284 | #endif |
| 1295 | |||
| 1296 | put_page(page); | 1285 | put_page(page); |
| 1297 | free_page((unsigned long)addr); | 1286 | __free_page(page); |
| 1298 | atomic_dec(&agp_bridge->current_memory_agp); | 1287 | atomic_dec(&agp_bridge->current_memory_agp); |
| 1299 | mem->memory[i] = 0; | 1288 | mem->pages[i] = NULL; |
| 1300 | } | 1289 | } |
| 1301 | } | 1290 | } |
| 1302 | EXPORT_SYMBOL(agp_generic_destroy_pages); | 1291 | EXPORT_SYMBOL(agp_generic_destroy_pages); |
| 1303 | 1292 | ||
| 1304 | void agp_generic_destroy_page(void *addr, int flags) | 1293 | void agp_generic_destroy_page(struct page *page, int flags) |
| 1305 | { | 1294 | { |
| 1306 | struct page *page; | 1295 | if (page == NULL) |
| 1307 | |||
| 1308 | if (addr == NULL) | ||
| 1309 | return; | 1296 | return; |
| 1310 | 1297 | ||
| 1311 | page = virt_to_page(addr); | ||
| 1312 | if (flags & AGP_PAGE_DESTROY_UNMAP) | 1298 | if (flags & AGP_PAGE_DESTROY_UNMAP) |
| 1313 | unmap_page_from_agp(page); | 1299 | unmap_page_from_agp(page); |
| 1314 | 1300 | ||
| 1315 | if (flags & AGP_PAGE_DESTROY_FREE) { | 1301 | if (flags & AGP_PAGE_DESTROY_FREE) { |
| 1316 | put_page(page); | 1302 | put_page(page); |
| 1317 | free_page((unsigned long)addr); | 1303 | __free_page(page); |
| 1318 | atomic_dec(&agp_bridge->current_memory_agp); | 1304 | atomic_dec(&agp_bridge->current_memory_agp); |
| 1319 | } | 1305 | } |
| 1320 | } | 1306 | } |
| @@ -1361,8 +1347,9 @@ void global_cache_flush(void) | |||
| 1361 | EXPORT_SYMBOL(global_cache_flush); | 1347 | EXPORT_SYMBOL(global_cache_flush); |
| 1362 | 1348 | ||
| 1363 | unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge, | 1349 | unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge, |
| 1364 | unsigned long addr, int type) | 1350 | struct page *page, int type) |
| 1365 | { | 1351 | { |
| 1352 | unsigned long addr = phys_to_gart(page_to_phys(page)); | ||
| 1366 | /* memory type is ignored in the generic routine */ | 1353 | /* memory type is ignored in the generic routine */ |
| 1367 | if (bridge->driver->masks) | 1354 | if (bridge->driver->masks) |
| 1368 | return addr | bridge->driver->masks[0].mask; | 1355 | return addr | bridge->driver->masks[0].mask; |
diff --git a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c index 9c7e2343c399..8f3d4c184914 100644 --- a/drivers/char/agp/hp-agp.c +++ b/drivers/char/agp/hp-agp.c | |||
| @@ -361,13 +361,11 @@ hp_zx1_insert_memory (struct agp_memory *mem, off_t pg_start, int type) | |||
| 361 | for (i = 0, j = io_pg_start; i < mem->page_count; i++) { | 361 | for (i = 0, j = io_pg_start; i < mem->page_count; i++) { |
| 362 | unsigned long paddr; | 362 | unsigned long paddr; |
| 363 | 363 | ||
| 364 | paddr = mem->memory[i]; | 364 | paddr = page_to_phys(mem->pages[i]); |
| 365 | for (k = 0; | 365 | for (k = 0; |
| 366 | k < hp->io_pages_per_kpage; | 366 | k < hp->io_pages_per_kpage; |
| 367 | k++, j++, paddr += hp->io_page_size) { | 367 | k++, j++, paddr += hp->io_page_size) { |
| 368 | hp->gatt[j] = | 368 | hp->gatt[j] = HP_ZX1_PDIR_VALID_BIT | paddr; |
| 369 | agp_bridge->driver->mask_memory(agp_bridge, | ||
| 370 | paddr, type); | ||
| 371 | } | 369 | } |
| 372 | } | 370 | } |
| 373 | 371 | ||
| @@ -397,8 +395,9 @@ hp_zx1_remove_memory (struct agp_memory *mem, off_t pg_start, int type) | |||
| 397 | 395 | ||
| 398 | static unsigned long | 396 | static unsigned long |
| 399 | hp_zx1_mask_memory (struct agp_bridge_data *bridge, | 397 | hp_zx1_mask_memory (struct agp_bridge_data *bridge, |
| 400 | unsigned long addr, int type) | 398 | struct page *page, int type) |
| 401 | { | 399 | { |
| 400 | unsigned long addr = phys_to_gart(page_to_phys(page)); | ||
| 402 | return HP_ZX1_PDIR_VALID_BIT | addr; | 401 | return HP_ZX1_PDIR_VALID_BIT | addr; |
| 403 | } | 402 | } |
| 404 | 403 | ||
diff --git a/drivers/char/agp/i460-agp.c b/drivers/char/agp/i460-agp.c index 10da687d131a..60cc35bb5db7 100644 --- a/drivers/char/agp/i460-agp.c +++ b/drivers/char/agp/i460-agp.c | |||
| @@ -60,6 +60,9 @@ | |||
| 60 | */ | 60 | */ |
| 61 | #define WR_FLUSH_GATT(index) RD_GATT(index) | 61 | #define WR_FLUSH_GATT(index) RD_GATT(index) |
| 62 | 62 | ||
| 63 | static unsigned long i460_mask_memory (struct agp_bridge_data *bridge, | ||
| 64 | unsigned long addr, int type); | ||
| 65 | |||
| 63 | static struct { | 66 | static struct { |
| 64 | void *gatt; /* ioremap'd GATT area */ | 67 | void *gatt; /* ioremap'd GATT area */ |
| 65 | 68 | ||
| @@ -74,6 +77,7 @@ static struct { | |||
| 74 | unsigned long *alloced_map; /* bitmap of kernel-pages in use */ | 77 | unsigned long *alloced_map; /* bitmap of kernel-pages in use */ |
| 75 | int refcount; /* number of kernel pages using the large page */ | 78 | int refcount; /* number of kernel pages using the large page */ |
| 76 | u64 paddr; /* physical address of large page */ | 79 | u64 paddr; /* physical address of large page */ |
| 80 | struct page *page; /* page pointer */ | ||
| 77 | } *lp_desc; | 81 | } *lp_desc; |
| 78 | } i460; | 82 | } i460; |
| 79 | 83 | ||
| @@ -294,7 +298,7 @@ static int i460_insert_memory_small_io_page (struct agp_memory *mem, | |||
| 294 | void *temp; | 298 | void *temp; |
| 295 | 299 | ||
| 296 | pr_debug("i460_insert_memory_small_io_page(mem=%p, pg_start=%ld, type=%d, paddr0=0x%lx)\n", | 300 | pr_debug("i460_insert_memory_small_io_page(mem=%p, pg_start=%ld, type=%d, paddr0=0x%lx)\n", |
| 297 | mem, pg_start, type, mem->memory[0]); | 301 | mem, pg_start, type, page_to_phys(mem->pages[0])); |
| 298 | 302 | ||
| 299 | if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES) | 303 | if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES) |
| 300 | return -EINVAL; | 304 | return -EINVAL; |
| @@ -321,10 +325,9 @@ static int i460_insert_memory_small_io_page (struct agp_memory *mem, | |||
| 321 | 325 | ||
| 322 | io_page_size = 1UL << I460_IO_PAGE_SHIFT; | 326 | io_page_size = 1UL << I460_IO_PAGE_SHIFT; |
| 323 | for (i = 0, j = io_pg_start; i < mem->page_count; i++) { | 327 | for (i = 0, j = io_pg_start; i < mem->page_count; i++) { |
| 324 | paddr = mem->memory[i]; | 328 | paddr = phys_to_gart(page_to_phys(mem->pages[i])); |
| 325 | for (k = 0; k < I460_IOPAGES_PER_KPAGE; k++, j++, paddr += io_page_size) | 329 | for (k = 0; k < I460_IOPAGES_PER_KPAGE; k++, j++, paddr += io_page_size) |
| 326 | WR_GATT(j, agp_bridge->driver->mask_memory(agp_bridge, | 330 | WR_GATT(j, i460_mask_memory(agp_bridge, paddr, mem->type)); |
| 327 | paddr, mem->type)); | ||
| 328 | } | 331 | } |
| 329 | WR_FLUSH_GATT(j - 1); | 332 | WR_FLUSH_GATT(j - 1); |
| 330 | return 0; | 333 | return 0; |
| @@ -364,10 +367,9 @@ static int i460_alloc_large_page (struct lp_desc *lp) | |||
| 364 | { | 367 | { |
| 365 | unsigned long order = I460_IO_PAGE_SHIFT - PAGE_SHIFT; | 368 | unsigned long order = I460_IO_PAGE_SHIFT - PAGE_SHIFT; |
| 366 | size_t map_size; | 369 | size_t map_size; |
| 367 | void *lpage; | ||
| 368 | 370 | ||
| 369 | lpage = (void *) __get_free_pages(GFP_KERNEL, order); | 371 | lp->page = alloc_pages(GFP_KERNEL, order); |
| 370 | if (!lpage) { | 372 | if (!lp->page) { |
| 371 | printk(KERN_ERR PFX "Couldn't alloc 4M GART page...\n"); | 373 | printk(KERN_ERR PFX "Couldn't alloc 4M GART page...\n"); |
| 372 | return -ENOMEM; | 374 | return -ENOMEM; |
| 373 | } | 375 | } |
| @@ -375,12 +377,12 @@ static int i460_alloc_large_page (struct lp_desc *lp) | |||
| 375 | map_size = ((I460_KPAGES_PER_IOPAGE + BITS_PER_LONG - 1) & -BITS_PER_LONG)/8; | 377 | map_size = ((I460_KPAGES_PER_IOPAGE + BITS_PER_LONG - 1) & -BITS_PER_LONG)/8; |
| 376 | lp->alloced_map = kzalloc(map_size, GFP_KERNEL); | 378 | lp->alloced_map = kzalloc(map_size, GFP_KERNEL); |
| 377 | if (!lp->alloced_map) { | 379 | if (!lp->alloced_map) { |
| 378 | free_pages((unsigned long) lpage, order); | 380 | __free_pages(lp->page, order); |
| 379 | printk(KERN_ERR PFX "Out of memory, we're in trouble...\n"); | 381 | printk(KERN_ERR PFX "Out of memory, we're in trouble...\n"); |
| 380 | return -ENOMEM; | 382 | return -ENOMEM; |
| 381 | } | 383 | } |
| 382 | 384 | ||
| 383 | lp->paddr = virt_to_gart(lpage); | 385 | lp->paddr = phys_to_gart(page_to_phys(lp->page)); |
| 384 | lp->refcount = 0; | 386 | lp->refcount = 0; |
| 385 | atomic_add(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); | 387 | atomic_add(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); |
| 386 | return 0; | 388 | return 0; |
| @@ -391,7 +393,7 @@ static void i460_free_large_page (struct lp_desc *lp) | |||
| 391 | kfree(lp->alloced_map); | 393 | kfree(lp->alloced_map); |
| 392 | lp->alloced_map = NULL; | 394 | lp->alloced_map = NULL; |
| 393 | 395 | ||
| 394 | free_pages((unsigned long) gart_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT); | 396 | __free_pages(lp->page, I460_IO_PAGE_SHIFT - PAGE_SHIFT); |
| 395 | atomic_sub(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); | 397 | atomic_sub(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); |
| 396 | } | 398 | } |
| 397 | 399 | ||
| @@ -439,8 +441,8 @@ static int i460_insert_memory_large_io_page (struct agp_memory *mem, | |||
| 439 | if (i460_alloc_large_page(lp) < 0) | 441 | if (i460_alloc_large_page(lp) < 0) |
| 440 | return -ENOMEM; | 442 | return -ENOMEM; |
| 441 | pg = lp - i460.lp_desc; | 443 | pg = lp - i460.lp_desc; |
| 442 | WR_GATT(pg, agp_bridge->driver->mask_memory(agp_bridge, | 444 | WR_GATT(pg, i460_mask_memory(agp_bridge, |
| 443 | lp->paddr, 0)); | 445 | lp->paddr, 0)); |
| 444 | WR_FLUSH_GATT(pg); | 446 | WR_FLUSH_GATT(pg); |
| 445 | } | 447 | } |
| 446 | 448 | ||
| @@ -448,7 +450,7 @@ static int i460_insert_memory_large_io_page (struct agp_memory *mem, | |||
| 448 | idx < ((lp == end) ? (end_offset + 1) : I460_KPAGES_PER_IOPAGE); | 450 | idx < ((lp == end) ? (end_offset + 1) : I460_KPAGES_PER_IOPAGE); |
| 449 | idx++, i++) | 451 | idx++, i++) |
| 450 | { | 452 | { |
| 451 | mem->memory[i] = lp->paddr + idx*PAGE_SIZE; | 453 | mem->pages[i] = lp->page; |
| 452 | __set_bit(idx, lp->alloced_map); | 454 | __set_bit(idx, lp->alloced_map); |
| 453 | ++lp->refcount; | 455 | ++lp->refcount; |
| 454 | } | 456 | } |
| @@ -463,7 +465,7 @@ static int i460_remove_memory_large_io_page (struct agp_memory *mem, | |||
| 463 | struct lp_desc *start, *end, *lp; | 465 | struct lp_desc *start, *end, *lp; |
| 464 | void *temp; | 466 | void *temp; |
| 465 | 467 | ||
| 466 | temp = agp_bridge->driver->current_size; | 468 | temp = agp_bridge->current_size; |
| 467 | num_entries = A_SIZE_8(temp)->num_entries; | 469 | num_entries = A_SIZE_8(temp)->num_entries; |
| 468 | 470 | ||
| 469 | /* Figure out what pg_start means in terms of our large GART pages */ | 471 | /* Figure out what pg_start means in terms of our large GART pages */ |
| @@ -477,7 +479,7 @@ static int i460_remove_memory_large_io_page (struct agp_memory *mem, | |||
| 477 | idx < ((lp == end) ? (end_offset + 1) : I460_KPAGES_PER_IOPAGE); | 479 | idx < ((lp == end) ? (end_offset + 1) : I460_KPAGES_PER_IOPAGE); |
| 478 | idx++, i++) | 480 | idx++, i++) |
| 479 | { | 481 | { |
| 480 | mem->memory[i] = 0; | 482 | mem->pages[i] = NULL; |
| 481 | __clear_bit(idx, lp->alloced_map); | 483 | __clear_bit(idx, lp->alloced_map); |
| 482 | --lp->refcount; | 484 | --lp->refcount; |
| 483 | } | 485 | } |
| @@ -521,7 +523,7 @@ static int i460_remove_memory (struct agp_memory *mem, | |||
| 521 | * Let's just hope nobody counts on the allocated AGP memory being there before bind time | 523 | * Let's just hope nobody counts on the allocated AGP memory being there before bind time |
| 522 | * (I don't think current drivers do)... | 524 | * (I don't think current drivers do)... |
| 523 | */ | 525 | */ |
| 524 | static void *i460_alloc_page (struct agp_bridge_data *bridge) | 526 | static struct page *i460_alloc_page (struct agp_bridge_data *bridge) |
| 525 | { | 527 | { |
| 526 | void *page; | 528 | void *page; |
| 527 | 529 | ||
| @@ -534,7 +536,7 @@ static void *i460_alloc_page (struct agp_bridge_data *bridge) | |||
| 534 | return page; | 536 | return page; |
| 535 | } | 537 | } |
| 536 | 538 | ||
| 537 | static void i460_destroy_page (void *page, int flags) | 539 | static void i460_destroy_page (struct page *page, int flags) |
| 538 | { | 540 | { |
| 539 | if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) { | 541 | if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) { |
| 540 | agp_generic_destroy_page(page, flags); | 542 | agp_generic_destroy_page(page, flags); |
| @@ -544,13 +546,20 @@ static void i460_destroy_page (void *page, int flags) | |||
| 544 | #endif /* I460_LARGE_IO_PAGES */ | 546 | #endif /* I460_LARGE_IO_PAGES */ |
| 545 | 547 | ||
| 546 | static unsigned long i460_mask_memory (struct agp_bridge_data *bridge, | 548 | static unsigned long i460_mask_memory (struct agp_bridge_data *bridge, |
| 547 | unsigned long addr, int type) | 549 | unsigned long addr, int type) |
| 548 | { | 550 | { |
| 549 | /* Make sure the returned address is a valid GATT entry */ | 551 | /* Make sure the returned address is a valid GATT entry */ |
| 550 | return bridge->driver->masks[0].mask | 552 | return bridge->driver->masks[0].mask |
| 551 | | (((addr & ~((1 << I460_IO_PAGE_SHIFT) - 1)) & 0xfffff000) >> 12); | 553 | | (((addr & ~((1 << I460_IO_PAGE_SHIFT) - 1)) & 0xfffff000) >> 12); |
| 552 | } | 554 | } |
| 553 | 555 | ||
| 556 | static unsigned long i460_page_mask_memory(struct agp_bridge_data *bridge, | ||
| 557 | struct page *page, int type) | ||
| 558 | { | ||
| 559 | unsigned long addr = phys_to_gart(page_to_phys(page)); | ||
| 560 | return i460_mask_memory(bridge, addr, type); | ||
| 561 | } | ||
| 562 | |||
| 554 | const struct agp_bridge_driver intel_i460_driver = { | 563 | const struct agp_bridge_driver intel_i460_driver = { |
| 555 | .owner = THIS_MODULE, | 564 | .owner = THIS_MODULE, |
| 556 | .aperture_sizes = i460_sizes, | 565 | .aperture_sizes = i460_sizes, |
| @@ -560,7 +569,7 @@ const struct agp_bridge_driver intel_i460_driver = { | |||
| 560 | .fetch_size = i460_fetch_size, | 569 | .fetch_size = i460_fetch_size, |
| 561 | .cleanup = i460_cleanup, | 570 | .cleanup = i460_cleanup, |
| 562 | .tlb_flush = i460_tlb_flush, | 571 | .tlb_flush = i460_tlb_flush, |
| 563 | .mask_memory = i460_mask_memory, | 572 | .mask_memory = i460_page_mask_memory, |
| 564 | .masks = i460_masks, | 573 | .masks = i460_masks, |
| 565 | .agp_enable = agp_generic_enable, | 574 | .agp_enable = agp_generic_enable, |
| 566 | .cache_flush = global_cache_flush, | 575 | .cache_flush = global_cache_flush, |
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index 7a748fa0dfce..8c9d50db5c3a 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
| @@ -257,7 +257,7 @@ static void intel_i810_agp_enable(struct agp_bridge_data *bridge, u32 mode) | |||
| 257 | } | 257 | } |
| 258 | 258 | ||
| 259 | /* Exists to support ARGB cursors */ | 259 | /* Exists to support ARGB cursors */ |
| 260 | static void *i8xx_alloc_pages(void) | 260 | static struct page *i8xx_alloc_pages(void) |
| 261 | { | 261 | { |
| 262 | struct page *page; | 262 | struct page *page; |
| 263 | 263 | ||
| @@ -272,17 +272,14 @@ static void *i8xx_alloc_pages(void) | |||
| 272 | } | 272 | } |
| 273 | get_page(page); | 273 | get_page(page); |
| 274 | atomic_inc(&agp_bridge->current_memory_agp); | 274 | atomic_inc(&agp_bridge->current_memory_agp); |
| 275 | return page_address(page); | 275 | return page; |
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | static void i8xx_destroy_pages(void *addr) | 278 | static void i8xx_destroy_pages(struct page *page) |
| 279 | { | 279 | { |
| 280 | struct page *page; | 280 | if (page == NULL) |
| 281 | |||
| 282 | if (addr == NULL) | ||
| 283 | return; | 281 | return; |
| 284 | 282 | ||
| 285 | page = virt_to_page(addr); | ||
| 286 | set_pages_wb(page, 4); | 283 | set_pages_wb(page, 4); |
| 287 | put_page(page); | 284 | put_page(page); |
| 288 | __free_pages(page, 2); | 285 | __free_pages(page, 2); |
| @@ -346,7 +343,7 @@ static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, | |||
| 346 | global_cache_flush(); | 343 | global_cache_flush(); |
| 347 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 344 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 348 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 345 | writel(agp_bridge->driver->mask_memory(agp_bridge, |
| 349 | mem->memory[i], | 346 | mem->pages[i], |
| 350 | mask_type), | 347 | mask_type), |
| 351 | intel_private.registers+I810_PTE_BASE+(j*4)); | 348 | intel_private.registers+I810_PTE_BASE+(j*4)); |
| 352 | } | 349 | } |
| @@ -389,37 +386,37 @@ static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start, | |||
| 389 | static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type) | 386 | static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type) |
| 390 | { | 387 | { |
| 391 | struct agp_memory *new; | 388 | struct agp_memory *new; |
| 392 | void *addr; | 389 | struct page *page; |
| 393 | 390 | ||
| 394 | switch (pg_count) { | 391 | switch (pg_count) { |
| 395 | case 1: addr = agp_bridge->driver->agp_alloc_page(agp_bridge); | 392 | case 1: page = agp_bridge->driver->agp_alloc_page(agp_bridge); |
| 396 | break; | 393 | break; |
| 397 | case 4: | 394 | case 4: |
| 398 | /* kludge to get 4 physical pages for ARGB cursor */ | 395 | /* kludge to get 4 physical pages for ARGB cursor */ |
| 399 | addr = i8xx_alloc_pages(); | 396 | page = i8xx_alloc_pages(); |
| 400 | break; | 397 | break; |
| 401 | default: | 398 | default: |
| 402 | return NULL; | 399 | return NULL; |
| 403 | } | 400 | } |
| 404 | 401 | ||
| 405 | if (addr == NULL) | 402 | if (page == NULL) |
| 406 | return NULL; | 403 | return NULL; |
| 407 | 404 | ||
| 408 | new = agp_create_memory(pg_count); | 405 | new = agp_create_memory(pg_count); |
| 409 | if (new == NULL) | 406 | if (new == NULL) |
| 410 | return NULL; | 407 | return NULL; |
| 411 | 408 | ||
| 412 | new->memory[0] = virt_to_gart(addr); | 409 | new->pages[0] = page; |
| 413 | if (pg_count == 4) { | 410 | if (pg_count == 4) { |
| 414 | /* kludge to get 4 physical pages for ARGB cursor */ | 411 | /* kludge to get 4 physical pages for ARGB cursor */ |
| 415 | new->memory[1] = new->memory[0] + PAGE_SIZE; | 412 | new->pages[1] = new->pages[0] + 1; |
| 416 | new->memory[2] = new->memory[1] + PAGE_SIZE; | 413 | new->pages[2] = new->pages[1] + 1; |
| 417 | new->memory[3] = new->memory[2] + PAGE_SIZE; | 414 | new->pages[3] = new->pages[2] + 1; |
| 418 | } | 415 | } |
| 419 | new->page_count = pg_count; | 416 | new->page_count = pg_count; |
| 420 | new->num_scratch_pages = pg_count; | 417 | new->num_scratch_pages = pg_count; |
| 421 | new->type = AGP_PHYS_MEMORY; | 418 | new->type = AGP_PHYS_MEMORY; |
| 422 | new->physical = new->memory[0]; | 419 | new->physical = page_to_phys(new->pages[0]); |
| 423 | return new; | 420 | return new; |
| 424 | } | 421 | } |
| 425 | 422 | ||
| @@ -451,13 +448,11 @@ static void intel_i810_free_by_type(struct agp_memory *curr) | |||
| 451 | agp_free_key(curr->key); | 448 | agp_free_key(curr->key); |
| 452 | if (curr->type == AGP_PHYS_MEMORY) { | 449 | if (curr->type == AGP_PHYS_MEMORY) { |
| 453 | if (curr->page_count == 4) | 450 | if (curr->page_count == 4) |
| 454 | i8xx_destroy_pages(gart_to_virt(curr->memory[0])); | 451 | i8xx_destroy_pages(curr->pages[0]); |
| 455 | else { | 452 | else { |
| 456 | void *va = gart_to_virt(curr->memory[0]); | 453 | agp_bridge->driver->agp_destroy_page(curr->pages[0], |
| 457 | |||
| 458 | agp_bridge->driver->agp_destroy_page(va, | ||
| 459 | AGP_PAGE_DESTROY_UNMAP); | 454 | AGP_PAGE_DESTROY_UNMAP); |
| 460 | agp_bridge->driver->agp_destroy_page(va, | 455 | agp_bridge->driver->agp_destroy_page(curr->pages[0], |
| 461 | AGP_PAGE_DESTROY_FREE); | 456 | AGP_PAGE_DESTROY_FREE); |
| 462 | } | 457 | } |
| 463 | agp_free_page_array(curr); | 458 | agp_free_page_array(curr); |
| @@ -466,8 +461,9 @@ static void intel_i810_free_by_type(struct agp_memory *curr) | |||
| 466 | } | 461 | } |
| 467 | 462 | ||
| 468 | static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge, | 463 | static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge, |
| 469 | unsigned long addr, int type) | 464 | struct page *page, int type) |
| 470 | { | 465 | { |
| 466 | unsigned long addr = phys_to_gart(page_to_phys(page)); | ||
| 471 | /* Type checking must be done elsewhere */ | 467 | /* Type checking must be done elsewhere */ |
| 472 | return addr | bridge->driver->masks[type].mask; | 468 | return addr | bridge->driver->masks[type].mask; |
| 473 | } | 469 | } |
| @@ -855,7 +851,7 @@ static int intel_i830_insert_entries(struct agp_memory *mem, off_t pg_start, | |||
| 855 | 851 | ||
| 856 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 852 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 857 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 853 | writel(agp_bridge->driver->mask_memory(agp_bridge, |
| 858 | mem->memory[i], mask_type), | 854 | mem->pages[i], mask_type), |
| 859 | intel_private.registers+I810_PTE_BASE+(j*4)); | 855 | intel_private.registers+I810_PTE_BASE+(j*4)); |
| 860 | } | 856 | } |
| 861 | readl(intel_private.registers+I810_PTE_BASE+((j-1)*4)); | 857 | readl(intel_private.registers+I810_PTE_BASE+((j-1)*4)); |
| @@ -1085,7 +1081,7 @@ static int intel_i915_insert_entries(struct agp_memory *mem, off_t pg_start, | |||
| 1085 | 1081 | ||
| 1086 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 1082 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 1087 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 1083 | writel(agp_bridge->driver->mask_memory(agp_bridge, |
| 1088 | mem->memory[i], mask_type), intel_private.gtt+j); | 1084 | mem->pages[i], mask_type), intel_private.gtt+j); |
| 1089 | } | 1085 | } |
| 1090 | 1086 | ||
| 1091 | readl(intel_private.gtt+j-1); | 1087 | readl(intel_private.gtt+j-1); |
| @@ -1200,8 +1196,9 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge) | |||
| 1200 | * this conditional. | 1196 | * this conditional. |
| 1201 | */ | 1197 | */ |
| 1202 | static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge, | 1198 | static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge, |
| 1203 | unsigned long addr, int type) | 1199 | struct page *page, int type) |
| 1204 | { | 1200 | { |
| 1201 | dma_addr_t addr = phys_to_gart(page_to_phys(page)); | ||
| 1205 | /* Shift high bits down */ | 1202 | /* Shift high bits down */ |
| 1206 | addr |= (addr >> 28) & 0xf0; | 1203 | addr |= (addr >> 28) & 0xf0; |
| 1207 | 1204 | ||
diff --git a/drivers/char/agp/nvidia-agp.c b/drivers/char/agp/nvidia-agp.c index 16acee2de117..263d71dd441c 100644 --- a/drivers/char/agp/nvidia-agp.c +++ b/drivers/char/agp/nvidia-agp.c | |||
| @@ -225,7 +225,7 @@ static int nvidia_insert_memory(struct agp_memory *mem, off_t pg_start, int type | |||
| 225 | } | 225 | } |
| 226 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 226 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 227 | writel(agp_bridge->driver->mask_memory(agp_bridge, | 227 | writel(agp_bridge->driver->mask_memory(agp_bridge, |
| 228 | mem->memory[i], mask_type), | 228 | mem->pages[i], mask_type), |
| 229 | agp_bridge->gatt_table+nvidia_private.pg_offset+j); | 229 | agp_bridge->gatt_table+nvidia_private.pg_offset+j); |
| 230 | } | 230 | } |
| 231 | 231 | ||
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c index 699e3422ad93..f4bb43fb8016 100644 --- a/drivers/char/agp/parisc-agp.c +++ b/drivers/char/agp/parisc-agp.c | |||
| @@ -31,6 +31,10 @@ | |||
| 31 | #define AGP8X_MODE_BIT 3 | 31 | #define AGP8X_MODE_BIT 3 |
| 32 | #define AGP8X_MODE (1 << AGP8X_MODE_BIT) | 32 | #define AGP8X_MODE (1 << AGP8X_MODE_BIT) |
| 33 | 33 | ||
| 34 | static unsigned long | ||
| 35 | parisc_agp_mask_memory(struct agp_bridge_data *bridge, unsigned long addr, | ||
| 36 | int type); | ||
| 37 | |||
| 34 | static struct _parisc_agp_info { | 38 | static struct _parisc_agp_info { |
| 35 | void __iomem *ioc_regs; | 39 | void __iomem *ioc_regs; |
| 36 | void __iomem *lba_regs; | 40 | void __iomem *lba_regs; |
| @@ -149,12 +153,12 @@ parisc_agp_insert_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 149 | for (i = 0, j = io_pg_start; i < mem->page_count; i++) { | 153 | for (i = 0, j = io_pg_start; i < mem->page_count; i++) { |
| 150 | unsigned long paddr; | 154 | unsigned long paddr; |
| 151 | 155 | ||
| 152 | paddr = mem->memory[i]; | 156 | paddr = page_to_phys(mem->pages[i]); |
| 153 | for (k = 0; | 157 | for (k = 0; |
| 154 | k < info->io_pages_per_kpage; | 158 | k < info->io_pages_per_kpage; |
| 155 | k++, j++, paddr += info->io_page_size) { | 159 | k++, j++, paddr += info->io_page_size) { |
| 156 | info->gatt[j] = | 160 | info->gatt[j] = |
| 157 | agp_bridge->driver->mask_memory(agp_bridge, | 161 | parisc_agp_mask_memory(agp_bridge, |
| 158 | paddr, type); | 162 | paddr, type); |
| 159 | } | 163 | } |
| 160 | } | 164 | } |
| @@ -185,9 +189,17 @@ parisc_agp_remove_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 185 | } | 189 | } |
| 186 | 190 | ||
| 187 | static unsigned long | 191 | static unsigned long |
| 188 | parisc_agp_mask_memory(struct agp_bridge_data *bridge, | 192 | parisc_agp_mask_memory(struct agp_bridge_data *bridge, unsigned long addr, |
| 189 | unsigned long addr, int type) | 193 | int type) |
| 194 | { | ||
| 195 | return SBA_PDIR_VALID_BIT | addr; | ||
| 196 | } | ||
| 197 | |||
| 198 | static unsigned long | ||
| 199 | parisc_agp_page_mask_memory(struct agp_bridge_data *bridge, struct page *page, | ||
| 200 | int type) | ||
| 190 | { | 201 | { |
| 202 | unsigned long addr = phys_to_gart(page_to_phys(page)); | ||
| 191 | return SBA_PDIR_VALID_BIT | addr; | 203 | return SBA_PDIR_VALID_BIT | addr; |
| 192 | } | 204 | } |
| 193 | 205 | ||
diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c index b972d83bb1b2..d3ea2e4226b5 100644 --- a/drivers/char/agp/sgi-agp.c +++ b/drivers/char/agp/sgi-agp.c | |||
| @@ -38,7 +38,7 @@ static struct aper_size_info_fixed sgi_tioca_sizes[] = { | |||
| 38 | {0, 0, 0}, | 38 | {0, 0, 0}, |
| 39 | }; | 39 | }; |
| 40 | 40 | ||
| 41 | static void *sgi_tioca_alloc_page(struct agp_bridge_data *bridge) | 41 | static struct page *sgi_tioca_alloc_page(struct agp_bridge_data *bridge) |
| 42 | { | 42 | { |
| 43 | struct page *page; | 43 | struct page *page; |
| 44 | int nid; | 44 | int nid; |
| @@ -52,7 +52,7 @@ static void *sgi_tioca_alloc_page(struct agp_bridge_data *bridge) | |||
| 52 | 52 | ||
| 53 | get_page(page); | 53 | get_page(page); |
| 54 | atomic_inc(&agp_bridge->current_memory_agp); | 54 | atomic_inc(&agp_bridge->current_memory_agp); |
| 55 | return page_address(page); | 55 | return page; |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | /* | 58 | /* |
| @@ -71,8 +71,9 @@ static void sgi_tioca_tlbflush(struct agp_memory *mem) | |||
| 71 | */ | 71 | */ |
| 72 | static unsigned long | 72 | static unsigned long |
| 73 | sgi_tioca_mask_memory(struct agp_bridge_data *bridge, | 73 | sgi_tioca_mask_memory(struct agp_bridge_data *bridge, |
| 74 | unsigned long addr, int type) | 74 | struct page *page, int type) |
| 75 | { | 75 | { |
| 76 | unsigned long addr = phys_to_gart(page_to_phys(page)); | ||
| 76 | return tioca_physpage_to_gart(addr); | 77 | return tioca_physpage_to_gart(addr); |
| 77 | } | 78 | } |
| 78 | 79 | ||
| @@ -189,7 +190,7 @@ static int sgi_tioca_insert_memory(struct agp_memory *mem, off_t pg_start, | |||
| 189 | 190 | ||
| 190 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 191 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 191 | table[j] = | 192 | table[j] = |
| 192 | bridge->driver->mask_memory(bridge, mem->memory[i], | 193 | bridge->driver->mask_memory(bridge, mem->pages[i], |
| 193 | mem->type); | 194 | mem->type); |
| 194 | } | 195 | } |
| 195 | 196 | ||
diff --git a/drivers/char/agp/sworks-agp.c b/drivers/char/agp/sworks-agp.c index 6224df8b7f0a..b964a2199329 100644 --- a/drivers/char/agp/sworks-agp.c +++ b/drivers/char/agp/sworks-agp.c | |||
| @@ -349,7 +349,7 @@ static int serverworks_insert_memory(struct agp_memory *mem, | |||
| 349 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 349 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 350 | addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr; | 350 | addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr; |
| 351 | cur_gatt = SVRWRKS_GET_GATT(addr); | 351 | cur_gatt = SVRWRKS_GET_GATT(addr); |
| 352 | writel(agp_bridge->driver->mask_memory(agp_bridge, mem->memory[i], mem->type), cur_gatt+GET_GATT_OFF(addr)); | 352 | writel(agp_bridge->driver->mask_memory(agp_bridge, mem->pages[i], mem->type), cur_gatt+GET_GATT_OFF(addr)); |
| 353 | } | 353 | } |
| 354 | serverworks_tlbflush(mem); | 354 | serverworks_tlbflush(mem); |
| 355 | return 0; | 355 | return 0; |
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c index 03f95ec08f59..f192c3b9ad41 100644 --- a/drivers/char/agp/uninorth-agp.c +++ b/drivers/char/agp/uninorth-agp.c | |||
| @@ -146,13 +146,20 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start, | |||
| 146 | { | 146 | { |
| 147 | int i, j, num_entries; | 147 | int i, j, num_entries; |
| 148 | void *temp; | 148 | void *temp; |
| 149 | int mask_type; | ||
| 149 | 150 | ||
| 150 | temp = agp_bridge->current_size; | 151 | temp = agp_bridge->current_size; |
| 151 | num_entries = A_SIZE_32(temp)->num_entries; | 152 | num_entries = A_SIZE_32(temp)->num_entries; |
| 152 | 153 | ||
| 153 | if (type != 0 || mem->type != 0) | 154 | if (type != mem->type) |
| 155 | return -EINVAL; | ||
| 156 | |||
| 157 | mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type); | ||
| 158 | if (mask_type != 0) { | ||
| 154 | /* We know nothing of memory types */ | 159 | /* We know nothing of memory types */ |
| 155 | return -EINVAL; | 160 | return -EINVAL; |
| 161 | } | ||
| 162 | |||
| 156 | if ((pg_start + mem->page_count) > num_entries) | 163 | if ((pg_start + mem->page_count) > num_entries) |
| 157 | return -EINVAL; | 164 | return -EINVAL; |
| 158 | 165 | ||
| @@ -166,9 +173,9 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start, | |||
| 166 | 173 | ||
| 167 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { | 174 | for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
| 168 | agp_bridge->gatt_table[j] = | 175 | agp_bridge->gatt_table[j] = |
| 169 | cpu_to_le32((mem->memory[i] & 0xFFFFF000UL) | 0x1UL); | 176 | cpu_to_le32((page_to_phys(mem->pages[i]) & 0xFFFFF000UL) | 0x1UL); |
| 170 | flush_dcache_range((unsigned long)__va(mem->memory[i]), | 177 | flush_dcache_range((unsigned long)__va(page_to_phys(mem->pages[i])), |
| 171 | (unsigned long)__va(mem->memory[i])+0x1000); | 178 | (unsigned long)__va(page_to_phys(mem->pages[i]))+0x1000); |
| 172 | } | 179 | } |
| 173 | (void)in_le32((volatile u32*)&agp_bridge->gatt_table[pg_start]); | 180 | (void)in_le32((volatile u32*)&agp_bridge->gatt_table[pg_start]); |
| 174 | mb(); | 181 | mb(); |
| @@ -184,13 +191,20 @@ static int u3_insert_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 184 | int i, num_entries; | 191 | int i, num_entries; |
| 185 | void *temp; | 192 | void *temp; |
| 186 | u32 *gp; | 193 | u32 *gp; |
| 194 | int mask_type; | ||
| 187 | 195 | ||
| 188 | temp = agp_bridge->current_size; | 196 | temp = agp_bridge->current_size; |
| 189 | num_entries = A_SIZE_32(temp)->num_entries; | 197 | num_entries = A_SIZE_32(temp)->num_entries; |
| 190 | 198 | ||
| 191 | if (type != 0 || mem->type != 0) | 199 | if (type != mem->type) |
| 200 | return -EINVAL; | ||
| 201 | |||
| 202 | mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type); | ||
| 203 | if (mask_type != 0) { | ||
| 192 | /* We know nothing of memory types */ | 204 | /* We know nothing of memory types */ |
| 193 | return -EINVAL; | 205 | return -EINVAL; |
| 206 | } | ||
| 207 | |||
| 194 | if ((pg_start + mem->page_count) > num_entries) | 208 | if ((pg_start + mem->page_count) > num_entries) |
| 195 | return -EINVAL; | 209 | return -EINVAL; |
| 196 | 210 | ||
| @@ -205,9 +219,9 @@ static int u3_insert_memory(struct agp_memory *mem, off_t pg_start, int type) | |||
| 205 | } | 219 | } |
| 206 | 220 | ||
| 207 | for (i = 0; i < mem->page_count; i++) { | 221 | for (i = 0; i < mem->page_count; i++) { |
| 208 | gp[i] = (mem->memory[i] >> PAGE_SHIFT) | 0x80000000UL; | 222 | gp[i] = (page_to_phys(mem->pages[i]) >> PAGE_SHIFT) | 0x80000000UL; |
| 209 | flush_dcache_range((unsigned long)__va(mem->memory[i]), | 223 | flush_dcache_range((unsigned long)__va(page_to_phys(mem->pages[i])), |
| 210 | (unsigned long)__va(mem->memory[i])+0x1000); | 224 | (unsigned long)__va(page_to_phys(mem->pages[i]))+0x1000); |
| 211 | } | 225 | } |
| 212 | mb(); | 226 | mb(); |
| 213 | flush_dcache_range((unsigned long)gp, (unsigned long) &gp[i]); | 227 | flush_dcache_range((unsigned long)gp, (unsigned long) &gp[i]); |
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index de26a978fbdd..737be953cc58 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
| @@ -1123,8 +1123,6 @@ static int emulate_raw(struct vc_data *vc, unsigned int keycode, | |||
| 1123 | 1123 | ||
| 1124 | #define HW_RAW(dev) 0 | 1124 | #define HW_RAW(dev) 0 |
| 1125 | 1125 | ||
| 1126 | #warning "Cannot generate rawmode keyboard for your architecture yet." | ||
| 1127 | |||
| 1128 | static int emulate_raw(struct vc_data *vc, unsigned int keycode, unsigned char up_flag) | 1126 | static int emulate_raw(struct vc_data *vc, unsigned int keycode, unsigned char up_flag) |
| 1129 | { | 1127 | { |
| 1130 | if (keycode > 127) | 1128 | if (keycode > 127) |
