Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8aa1d1e authored by Dave Airlie's avatar Dave Airlie
Browse files

udl: support vmapping imported dma-bufs



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

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 9a70cc2a
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -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();


+22 −3
Original line number Original line Diff line number Diff line
@@ -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);