forked from luck/tmp_suning_uos_patched
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:
parent
9a70cc2a78
commit
e8aa1d1ebc
@ -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();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user