udl: support vmapping imported dma-bufs

This allows udl to get a vmapping of an imported buffer for scanout.

Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2012-03-26 14:36:56 +01:00
parent 9a70cc2a78
commit e8aa1d1ebc
2 changed files with 33 additions and 5 deletions

View File

@ -156,8 +156,17 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
if (!fb->active_16) if (!fb->active_16)
return 0; return 0;
if (!fb->obj->vmapping) if (!fb->obj->vmapping) {
udl_gem_vmap(fb->obj); ret = udl_gem_vmap(fb->obj);
if (ret == -ENOMEM) {
DRM_ERROR("failed to vmap fb\n");
return 0;
}
if (!fb->obj->vmapping) {
DRM_ERROR("failed to vmapping\n");
return 0;
}
}
start_cycles = get_cycles(); start_cycles = get_cycles();

View File

@ -180,6 +180,18 @@ int udl_gem_vmap(struct udl_gem_object *obj)
int page_count = obj->base.size / PAGE_SIZE; int page_count = obj->base.size / PAGE_SIZE;
int ret; int ret;
if (obj->base.import_attach) {
ret = dma_buf_begin_cpu_access(obj->base.import_attach->dmabuf,
0, obj->base.size, DMA_BIDIRECTIONAL);
if (ret)
return -EINVAL;
obj->vmapping = dma_buf_vmap(obj->base.import_attach->dmabuf);
if (!obj->vmapping)
return -ENOMEM;
return 0;
}
ret = udl_gem_get_pages(obj, GFP_KERNEL); ret = udl_gem_get_pages(obj, GFP_KERNEL);
if (ret) if (ret)
return ret; return ret;
@ -192,6 +204,13 @@ int udl_gem_vmap(struct udl_gem_object *obj)
void udl_gem_vunmap(struct udl_gem_object *obj) void udl_gem_vunmap(struct udl_gem_object *obj)
{ {
if (obj->base.import_attach) {
dma_buf_vunmap(obj->base.import_attach->dmabuf, obj->vmapping);
dma_buf_end_cpu_access(obj->base.import_attach->dmabuf, 0,
obj->base.size, DMA_BIDIRECTIONAL);
return;
}
if (obj->vmapping) if (obj->vmapping)
vunmap(obj->vmapping); vunmap(obj->vmapping);
@ -202,12 +221,12 @@ void udl_gem_free_object(struct drm_gem_object *gem_obj)
{ {
struct udl_gem_object *obj = to_udl_bo(gem_obj); struct udl_gem_object *obj = to_udl_bo(gem_obj);
if (gem_obj->import_attach)
drm_prime_gem_destroy(gem_obj, obj->sg);
if (obj->vmapping) if (obj->vmapping)
udl_gem_vunmap(obj); udl_gem_vunmap(obj);
if (gem_obj->import_attach)
drm_prime_gem_destroy(gem_obj, obj->sg);
if (obj->pages) if (obj->pages)
udl_gem_put_pages(obj); udl_gem_put_pages(obj);