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

Commit 5ffdb658 authored by Jakob Bornecrantz's avatar Jakob Bornecrantz Committed by Dave Airlie
Browse files

drm/vmwgfx: Don't send bad flags to the host

parent c188660f
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -96,6 +96,8 @@ struct vmw_surface {
	struct drm_vmw_size *sizes;
	struct drm_vmw_size *sizes;
	uint32_t num_sizes;
	uint32_t num_sizes;


	bool scanout;

	/* TODO so far just a extra pointer */
	/* TODO so far just a extra pointer */
	struct vmw_cursor_snooper snooper;
	struct vmw_cursor_snooper snooper;
};
};
+10 −0
Original line number Original line Diff line number Diff line
@@ -707,6 +707,9 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
	if (ret)
	if (ret)
		goto try_dmabuf;
		goto try_dmabuf;


	if (!surface->scanout)
		goto err_not_scanout;

	ret = vmw_kms_new_framebuffer_surface(dev_priv, surface, &vfb,
	ret = vmw_kms_new_framebuffer_surface(dev_priv, surface, &vfb,
					      mode_cmd->width, mode_cmd->height);
					      mode_cmd->width, mode_cmd->height);


@@ -740,6 +743,13 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
	}
	}


	return &vfb->base;
	return &vfb->base;

err_not_scanout:
	DRM_ERROR("surface not marked as scanout\n");
	/* vmw_user_surface_lookup takes one ref */
	vmw_surface_unreference(&surface);

	return NULL;
}
}


static int vmw_kms_fb_changed(struct drm_device *dev)
static int vmw_kms_fb_changed(struct drm_device *dev)
+15 −1
Original line number Original line Diff line number Diff line
@@ -35,6 +35,11 @@
#define VMW_RES_SURFACE ttm_driver_type1
#define VMW_RES_SURFACE ttm_driver_type1
#define VMW_RES_STREAM ttm_driver_type2
#define VMW_RES_STREAM ttm_driver_type2


/* XXX: This isn't a real hardware flag, but just a hack for kernel to
 * know about primary surfaces. Find a better way to accomplish this.
 */
#define SVGA3D_SURFACE_HINT_SCANOUT (1 << 9)

struct vmw_user_context {
struct vmw_user_context {
	struct ttm_base_object base;
	struct ttm_base_object base;
	struct vmw_resource res;
	struct vmw_resource res;
@@ -599,8 +604,17 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
	if (unlikely(ret != 0))
	if (unlikely(ret != 0))
		goto out_err1;
		goto out_err1;


	if (srf->flags & SVGA3D_SURFACE_HINT_SCANOUT) {
		/* we should not send this flag down to hardware since
		 * its not a official one
		 */
		srf->flags &= ~SVGA3D_SURFACE_HINT_SCANOUT;
		srf->scanout = true;
	} else {
		srf->scanout = false;
	}


	if (srf->flags & (1 << 9) &&
	if (srf->scanout &&
	    srf->num_sizes == 1 &&
	    srf->num_sizes == 1 &&
	    srf->sizes[0].width == 64 &&
	    srf->sizes[0].width == 64 &&
	    srf->sizes[0].height == 64 &&
	    srf->sizes[0].height == 64 &&