diff options
Diffstat (limited to 'drivers/gpu/drm/drm_agpsupport.c')
-rw-r--r-- | drivers/gpu/drm/drm_agpsupport.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_agpsupport.c b/drivers/gpu/drm/drm_agpsupport.c index aefa5ac4c0b..2639be2db9e 100644 --- a/drivers/gpu/drm/drm_agpsupport.c +++ b/drivers/gpu/drm/drm_agpsupport.c | |||
@@ -33,6 +33,7 @@ | |||
33 | 33 | ||
34 | #include "drmP.h" | 34 | #include "drmP.h" |
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <asm/agp.h> | ||
36 | 37 | ||
37 | #if __OS_HAS_AGP | 38 | #if __OS_HAS_AGP |
38 | 39 | ||
@@ -452,4 +453,52 @@ int drm_agp_unbind_memory(DRM_AGP_MEM * handle) | |||
452 | return agp_unbind_memory(handle); | 453 | return agp_unbind_memory(handle); |
453 | } | 454 | } |
454 | 455 | ||
455 | #endif /* __OS_HAS_AGP */ | 456 | /** |
457 | * Binds a collection of pages into AGP memory at the given offset, returning | ||
458 | * the AGP memory structure containing them. | ||
459 | * | ||
460 | * No reference is held on the pages during this time -- it is up to the | ||
461 | * caller to handle that. | ||
462 | */ | ||
463 | DRM_AGP_MEM * | ||
464 | drm_agp_bind_pages(struct drm_device *dev, | ||
465 | struct page **pages, | ||
466 | unsigned long num_pages, | ||
467 | uint32_t gtt_offset) | ||
468 | { | ||
469 | DRM_AGP_MEM *mem; | ||
470 | int ret, i; | ||
471 | |||
472 | DRM_DEBUG("\n"); | ||
473 | |||
474 | mem = drm_agp_allocate_memory(dev->agp->bridge, num_pages, | ||
475 | AGP_USER_MEMORY); | ||
476 | if (mem == NULL) { | ||
477 | DRM_ERROR("Failed to allocate memory for %ld pages\n", | ||
478 | num_pages); | ||
479 | return NULL; | ||
480 | } | ||
481 | |||
482 | for (i = 0; i < num_pages; i++) | ||
483 | mem->memory[i] = phys_to_gart(page_to_phys(pages[i])); | ||
484 | mem->page_count = num_pages; | ||
485 | |||
486 | mem->is_flushed = true; | ||
487 | ret = drm_agp_bind_memory(mem, gtt_offset / PAGE_SIZE); | ||
488 | if (ret != 0) { | ||
489 | DRM_ERROR("Failed to bind AGP memory: %d\n", ret); | ||
490 | agp_free_memory(mem); | ||
491 | return NULL; | ||
492 | } | ||
493 | |||
494 | return mem; | ||
495 | } | ||
496 | EXPORT_SYMBOL(drm_agp_bind_pages); | ||
497 | |||
498 | void drm_agp_chipset_flush(struct drm_device *dev) | ||
499 | { | ||
500 | agp_flush_chipset(dev->agp->bridge); | ||
501 | } | ||
502 | EXPORT_SYMBOL(drm_agp_chipset_flush); | ||
503 | |||
504 | #endif /* __OS_HAS_AGP */ | ||