diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2013-10-24 16:27:38 -0400 |
---|---|---|
committer | Thomas Hellstrom <thellstrom@vmware.com> | 2014-01-17 01:52:38 -0500 |
commit | 0fd53cfb09108c33b924b069fe2c62fa4e7b11a0 (patch) | |
tree | 8999234a13cf37ef4312accec1cc1c1b9679d854 /drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | |
parent | 4b9e45e68ff9ccd241fa61f9eff1cbddabc05ea1 (diff) |
drm/vmwgfx: Use the linux DMA api also for MOBs
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c index e4f5b926b67e..6327cfc36805 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | |||
@@ -272,6 +272,7 @@ void vmw_piter_start(struct vmw_piter *viter, const struct vmw_sg_table *vsgt, | |||
272 | viter->dma_address = &__vmw_piter_dma_addr; | 272 | viter->dma_address = &__vmw_piter_dma_addr; |
273 | viter->page = &__vmw_piter_non_sg_page; | 273 | viter->page = &__vmw_piter_non_sg_page; |
274 | viter->addrs = vsgt->addrs; | 274 | viter->addrs = vsgt->addrs; |
275 | viter->pages = vsgt->pages; | ||
275 | break; | 276 | break; |
276 | case vmw_dma_map_populate: | 277 | case vmw_dma_map_populate: |
277 | case vmw_dma_map_bind: | 278 | case vmw_dma_map_bind: |
@@ -452,6 +453,63 @@ static void vmw_ttm_unmap_dma(struct vmw_ttm_tt *vmw_tt) | |||
452 | vmw_tt->mapped = false; | 453 | vmw_tt->mapped = false; |
453 | } | 454 | } |
454 | 455 | ||
456 | |||
457 | /** | ||
458 | * vmw_bo_map_dma - Make sure buffer object pages are visible to the device | ||
459 | * | ||
460 | * @bo: Pointer to a struct ttm_buffer_object | ||
461 | * | ||
462 | * Wrapper around vmw_ttm_map_dma, that takes a TTM buffer object pointer | ||
463 | * instead of a pointer to a struct vmw_ttm_backend as argument. | ||
464 | * Note that the buffer object must be either pinned or reserved before | ||
465 | * calling this function. | ||
466 | */ | ||
467 | int vmw_bo_map_dma(struct ttm_buffer_object *bo) | ||
468 | { | ||
469 | struct vmw_ttm_tt *vmw_tt = | ||
470 | container_of(bo->ttm, struct vmw_ttm_tt, dma_ttm.ttm); | ||
471 | |||
472 | return vmw_ttm_map_dma(vmw_tt); | ||
473 | } | ||
474 | |||
475 | |||
476 | /** | ||
477 | * vmw_bo_unmap_dma - Make sure buffer object pages are visible to the device | ||
478 | * | ||
479 | * @bo: Pointer to a struct ttm_buffer_object | ||
480 | * | ||
481 | * Wrapper around vmw_ttm_unmap_dma, that takes a TTM buffer object pointer | ||
482 | * instead of a pointer to a struct vmw_ttm_backend as argument. | ||
483 | */ | ||
484 | void vmw_bo_unmap_dma(struct ttm_buffer_object *bo) | ||
485 | { | ||
486 | struct vmw_ttm_tt *vmw_tt = | ||
487 | container_of(bo->ttm, struct vmw_ttm_tt, dma_ttm.ttm); | ||
488 | |||
489 | vmw_ttm_unmap_dma(vmw_tt); | ||
490 | } | ||
491 | |||
492 | |||
493 | /** | ||
494 | * vmw_bo_sg_table - Return a struct vmw_sg_table object for a | ||
495 | * TTM buffer object | ||
496 | * | ||
497 | * @bo: Pointer to a struct ttm_buffer_object | ||
498 | * | ||
499 | * Returns a pointer to a struct vmw_sg_table object. The object should | ||
500 | * not be freed after use. | ||
501 | * Note that for the device addresses to be valid, the buffer object must | ||
502 | * either be reserved or pinned. | ||
503 | */ | ||
504 | const struct vmw_sg_table *vmw_bo_sg_table(struct ttm_buffer_object *bo) | ||
505 | { | ||
506 | struct vmw_ttm_tt *vmw_tt = | ||
507 | container_of(bo->ttm, struct vmw_ttm_tt, dma_ttm.ttm); | ||
508 | |||
509 | return &vmw_tt->vsgt; | ||
510 | } | ||
511 | |||
512 | |||
455 | static int vmw_ttm_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem) | 513 | static int vmw_ttm_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem) |
456 | { | 514 | { |
457 | struct vmw_ttm_tt *vmw_be = | 515 | struct vmw_ttm_tt *vmw_be = |
@@ -478,7 +536,7 @@ static int vmw_ttm_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem) | |||
478 | } | 536 | } |
479 | 537 | ||
480 | return vmw_mob_bind(vmw_be->dev_priv, vmw_be->mob, | 538 | return vmw_mob_bind(vmw_be->dev_priv, vmw_be->mob, |
481 | ttm->pages, ttm->num_pages, | 539 | &vmw_be->vsgt, ttm->num_pages, |
482 | vmw_be->gmr_id); | 540 | vmw_be->gmr_id); |
483 | default: | 541 | default: |
484 | BUG(); | 542 | BUG(); |
@@ -526,6 +584,7 @@ static void vmw_ttm_destroy(struct ttm_tt *ttm) | |||
526 | kfree(vmw_be); | 584 | kfree(vmw_be); |
527 | } | 585 | } |
528 | 586 | ||
587 | |||
529 | static int vmw_ttm_populate(struct ttm_tt *ttm) | 588 | static int vmw_ttm_populate(struct ttm_tt *ttm) |
530 | { | 589 | { |
531 | struct vmw_ttm_tt *vmw_tt = | 590 | struct vmw_ttm_tt *vmw_tt = |