aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp/backend.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/agp/backend.c')
-rw-r--r--drivers/char/agp/backend.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c
index cfa5a649dfe7..a56ca080e108 100644
--- a/drivers/char/agp/backend.c
+++ b/drivers/char/agp/backend.c
@@ -114,9 +114,9 @@ static int agp_find_max(void)
114 long memory, index, result; 114 long memory, index, result;
115 115
116#if PAGE_SHIFT < 20 116#if PAGE_SHIFT < 20
117 memory = num_physpages >> (20 - PAGE_SHIFT); 117 memory = totalram_pages >> (20 - PAGE_SHIFT);
118#else 118#else
119 memory = num_physpages << (PAGE_SHIFT - 20); 119 memory = totalram_pages << (PAGE_SHIFT - 20);
120#endif 120#endif
121 index = 1; 121 index = 1;
122 122
@@ -149,9 +149,21 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
149 return -ENOMEM; 149 return -ENOMEM;
150 } 150 }
151 151
152 bridge->scratch_page_real = phys_to_gart(page_to_phys(page)); 152 bridge->scratch_page_page = page;
153 bridge->scratch_page = 153 if (bridge->driver->agp_map_page) {
154 bridge->driver->mask_memory(bridge, page, 0); 154 if (bridge->driver->agp_map_page(page,
155 &bridge->scratch_page_dma)) {
156 dev_err(&bridge->dev->dev,
157 "unable to dma-map scratch page\n");
158 rc = -ENOMEM;
159 goto err_out_nounmap;
160 }
161 } else {
162 bridge->scratch_page_dma = page_to_phys(page);
163 }
164
165 bridge->scratch_page = bridge->driver->mask_memory(bridge,
166 bridge->scratch_page_dma, 0);
155 } 167 }
156 168
157 size_value = bridge->driver->fetch_size(); 169 size_value = bridge->driver->fetch_size();
@@ -191,8 +203,14 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
191 return 0; 203 return 0;
192 204
193err_out: 205err_out:
206 if (bridge->driver->needs_scratch_page &&
207 bridge->driver->agp_unmap_page) {
208 bridge->driver->agp_unmap_page(bridge->scratch_page_page,
209 bridge->scratch_page_dma);
210 }
211err_out_nounmap:
194 if (bridge->driver->needs_scratch_page) { 212 if (bridge->driver->needs_scratch_page) {
195 void *va = gart_to_virt(bridge->scratch_page_real); 213 void *va = page_address(bridge->scratch_page_page);
196 214
197 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP); 215 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP);
198 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE); 216 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE);
@@ -219,7 +237,11 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
219 237
220 if (bridge->driver->agp_destroy_page && 238 if (bridge->driver->agp_destroy_page &&
221 bridge->driver->needs_scratch_page) { 239 bridge->driver->needs_scratch_page) {
222 void *va = gart_to_virt(bridge->scratch_page_real); 240 void *va = page_address(bridge->scratch_page_page);
241
242 if (bridge->driver->agp_unmap_page)
243 bridge->driver->agp_unmap_page(bridge->scratch_page_page,
244 bridge->scratch_page_dma);
223 245
224 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP); 246 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP);
225 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE); 247 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE);