diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-20 13:15:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-20 13:15:30 -0400 |
commit | 43813f399c72aa22e01a680559c1cb5274bf2140 (patch) | |
tree | 933c0e7c445b9c3478b5a0db06a162d0d39f00f2 /drivers/char/agp | |
parent | a552f0af753eb4b5bbbe9eff205fe874b04c4583 (diff) | |
parent | 0b7af262aba912f52bc6ef76f1bc0960b01b8502 (diff) |
Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (24 commits)
agp/intel: Make intel_i965_mask_memory use dma_addr_t for physical addresses
agp: add user mapping support to ATI AGP bridge.
drm/i915: enable GEM on PAE.
drm/radeon: fix unused variables warning
agp: switch AGP to use page array instead of unsigned long array
agpgart: detected ALi M???? chipset with M1621
drm/radeon: command stream checker for r3xx-r5xx hardware
drm/radeon: Fully initialize LVDS info also when we can't get it from the ROM.
radeon: Fix CP byte order on big endian architectures with KMS.
agp/uninorth: Handle user memory types.
drm/ttm: Add some powerpc cache flush code.
radeon: Enable modesetting on non-x86.
drm/radeon: Respect AGP cant_use_aperture flag.
drm: EDID endianness fixes.
drm/radeon: this VRAM vs aperture test is wrong, just remove it.
drm/ttm: fix an error path to exit function correctly
drm: Apply "Memory fragmentation from lost alignment blocks"
ttm: Return -ERESTART when a signal interrupts bo eviction.
drm: Remove memory debugging infrastructure.
drm/i915: Clear fence register on tiling stride change.
...
Diffstat (limited to 'drivers/char/agp')
-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 |
16 files changed, 174 insertions, 143 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]); |