diff options
Diffstat (limited to 'drivers/char/agp/backend.c')
-rw-r--r-- | drivers/char/agp/backend.c | 36 |
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 | ||
193 | err_out: | 205 | err_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 | } | ||
211 | err_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); |