aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/agp/backend.c
diff options
context:
space:
mode:
authorZhenyu Wang <zhenyu.z.wang@intel.com>2009-07-23 12:25:49 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-08-03 04:04:47 -0400
commitff663cf8705bea101d5f73cf471855c85242575e (patch)
tree4b338298e69d2401cab848b4b9082bef07e5d9aa /drivers/char/agp/backend.c
parent2a4ceb6d3e6a566cb4a9dc8f974177f031d27cd7 (diff)
agp: Add generic support for graphics dma remapping
New driver hooks for support graphics memory dma remapping are introduced in this patch. It makes generic code can tell if current device needs dma remapping, then call driver provided interfaces for mapping and unmapping. Change has also been made to handle scratch_page in remapping case. Signed-off-by: Zhenyu Wang <zhenyu.z.wang@intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/char/agp/backend.c')
-rw-r--r--drivers/char/agp/backend.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c
index 3bd7e503de41..19ac3663acdc 100644
--- a/drivers/char/agp/backend.c
+++ b/drivers/char/agp/backend.c
@@ -152,6 +152,15 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
152 bridge->scratch_page_real = phys_to_gart(page_to_phys(page)); 152 bridge->scratch_page_real = phys_to_gart(page_to_phys(page));
153 bridge->scratch_page = bridge->driver->mask_memory(bridge, 153 bridge->scratch_page = bridge->driver->mask_memory(bridge,
154 phys_to_gart(page_to_phys(page)), 0); 154 phys_to_gart(page_to_phys(page)), 0);
155
156 if (bridge->driver->agp_map_page &&
157 bridge->driver->agp_map_page(phys_to_virt(page_to_phys(page)),
158 &bridge->scratch_page_dma)) {
159 dev_err(&bridge->dev->dev,
160 "unable to dma-map scratch page\n");
161 rc = -ENOMEM;
162 goto err_out_nounmap;
163 }
155 } 164 }
156 165
157 size_value = bridge->driver->fetch_size(); 166 size_value = bridge->driver->fetch_size();
@@ -191,6 +200,13 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
191 return 0; 200 return 0;
192 201
193err_out: 202err_out:
203 if (bridge->driver->needs_scratch_page &&
204 bridge->driver->agp_unmap_page) {
205 void *va = gart_to_virt(bridge->scratch_page_real);
206
207 bridge->driver->agp_unmap_page(va, bridge->scratch_page_dma);
208 }
209err_out_nounmap:
194 if (bridge->driver->needs_scratch_page) { 210 if (bridge->driver->needs_scratch_page) {
195 void *va = gart_to_virt(bridge->scratch_page_real); 211 void *va = gart_to_virt(bridge->scratch_page_real);
196 212
@@ -221,6 +237,10 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
221 bridge->driver->needs_scratch_page) { 237 bridge->driver->needs_scratch_page) {
222 void *va = gart_to_virt(bridge->scratch_page_real); 238 void *va = gart_to_virt(bridge->scratch_page_real);
223 239
240 if (bridge->driver->agp_unmap_page)
241 bridge->driver->agp_unmap_page(va,
242 bridge->scratch_page_dma);
243
224 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP); 244 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP);
225 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE); 245 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE);
226 } 246 }