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

Commit 7558ab66 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge branch 'drm-vmwgfx-next' of git://people.freedesktop.org/~syeh/repos_linux into drm-next

This series enables atomic mode set for vmwgfx.  A number of features and
larger fixes are also included.

* 'drm-vmwgfx-next' of git://people.freedesktop.org/~syeh/repos_linux: (22 commits)
  drm/vmwgfx: Properly check display/scanout surface size
  drm/vmwgfx: Support topology greater than texture size
  drm/vmwgfx: Define an overlaid handle_close ioctl.
  drm/vmwgfx: Re-implement the stream resource as a simple resource.
  drm/vmwgfx: Introduce a simple resource type
  drm/vmwgfx: Revert "drm/vmwgfx: Replace numeric parameter like 0444 with macro"
  drm/vmwgfx: Fix LDU X blank screen until mode change issue
  drm/vmwgfx: Skipping fbdev fb pinning for ldu
  drm/vmwgfx: Explicityly track screen target width and height
  drm/vmwgfx: Turn on DRIVER_ATOMIC flag
  drm/vmwgfx: Switch over to internal atomic API for SOU and LDU
  drm/vmwgfx: Switch over to internal atomic API for STDU
  drm/vmwgfx: Fixes to vmwgfx_fb
  drm/vmwgfx: Add and connect atomic state object check/commit
  drm/vmwgfx: Add and connect connector helper function
  drm/vmwgfx: Add and connect plane helper functions
  drm/vmwgfx: Add and connect CRTC helper functions
  drm/vmwgfx: Connector atomic state
  drm/vmwgfx: Plane atomic state
  drm/vmwgfx: CRTC atomic state
  ...
parents 8cd3ac52 28c95429
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \
	    vmwgfx_fence.o vmwgfx_dmabuf.o vmwgfx_scrn.o vmwgfx_context.o \
	    vmwgfx_surface.o vmwgfx_prime.o vmwgfx_mob.o vmwgfx_shader.o \
	    vmwgfx_cmdbuf_res.o vmwgfx_cmdbuf.o vmwgfx_stdu.o \
	    vmwgfx_cotable.o vmwgfx_so.o vmwgfx_binding.o vmwgfx_msg.o
	    vmwgfx_cotable.o vmwgfx_so.o vmwgfx_binding.o vmwgfx_msg.o \
	    vmwgfx_simple_resource.o vmwgfx_va.o

obj-$(CONFIG_DRM_VMWGFX) := vmwgfx.o
+8 −5
Original line number Diff line number Diff line
@@ -246,13 +246,13 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
			      void *ptr);

MODULE_PARM_DESC(enable_fbdev, "Enable vmwgfx fbdev");
module_param_named(enable_fbdev, enable_fbdev, int, S_IRUSR | S_IWUSR);
module_param_named(enable_fbdev, enable_fbdev, int, 0600);
MODULE_PARM_DESC(force_dma_api, "Force using the DMA API for TTM pages");
module_param_named(force_dma_api, vmw_force_iommu, int, S_IRUSR | S_IWUSR);
module_param_named(force_dma_api, vmw_force_iommu, int, 0600);
MODULE_PARM_DESC(restrict_iommu, "Try to limit IOMMU usage for TTM pages");
module_param_named(restrict_iommu, vmw_restrict_iommu, int, S_IRUSR | S_IWUSR);
module_param_named(restrict_iommu, vmw_restrict_iommu, int, 0600);
MODULE_PARM_DESC(force_coherent, "Force coherent TTM pages");
module_param_named(force_coherent, vmw_force_coherent, int, S_IRUSR | S_IWUSR);
module_param_named(force_coherent, vmw_force_coherent, int, 0600);
MODULE_PARM_DESC(restrict_dma_mask, "Restrict DMA mask to 44 bits with IOMMU");
module_param_named(restrict_dma_mask, vmw_restrict_dma_mask, int, S_IRUSR | S_IWUSR);
MODULE_PARM_DESC(assume_16bpp, "Assume 16-bpp when filtering modes");
@@ -650,6 +650,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
	spin_lock_init(&dev_priv->waiter_lock);
	spin_lock_init(&dev_priv->cap_lock);
	spin_lock_init(&dev_priv->svga_lock);
	spin_lock_init(&dev_priv->cursor_lock);

	for (i = vmw_res_context; i < vmw_res_max; ++i) {
		idr_init(&dev_priv->res_idr[i]);
@@ -897,6 +898,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
		goto out_no_fifo;

	DRM_INFO("DX: %s\n", dev_priv->has_dx ? "yes." : "no.");
	DRM_INFO("Atomic: %s\n",
		 (dev->driver->driver_features & DRIVER_ATOMIC) ? "yes" : "no");

	snprintf(host_log, sizeof(host_log), "vmwgfx: %s-%s",
		VMWGFX_REPO, VMWGFX_GIT_VERSION);
@@ -1509,7 +1512,7 @@ static const struct file_operations vmwgfx_driver_fops = {

static struct drm_driver driver = {
	.driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
	DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER,
	DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC,
	.load = vmw_driver_load,
	.unload = vmw_driver_unload,
	.lastclose = vmw_lastclose,
+1 −1
Original line number Diff line number Diff line
@@ -153,7 +153,6 @@ enum vmw_cmdbuf_res_type {
struct vmw_cmdbuf_res_manager;

struct vmw_cursor_snooper {
	struct drm_crtc *crtc;
	size_t age;
	uint32_t *image;
};
@@ -415,6 +414,7 @@ struct vmw_private {
	unsigned num_implicit;
	struct vmw_framebuffer *implicit_fb;
	struct mutex global_kms_state_mutex;
	spinlock_t cursor_lock;

	/*
	 * Context and surface management.
+19 −8
Original line number Diff line number Diff line
@@ -434,7 +434,7 @@ static int vmw_fb_kms_detach(struct vmw_fb_par *par,
		set.y = 0;
		set.mode = NULL;
		set.fb = NULL;
		set.num_connectors = 1;
		set.num_connectors = 0;
		set.connectors = &par->con;
		ret = drm_mode_set_config_internal(&set);
		if (ret) {
@@ -451,13 +451,15 @@ static int vmw_fb_kms_detach(struct vmw_fb_par *par,
	}

	if (par->vmw_bo && detach_bo) {
		struct vmw_private *vmw_priv = par->vmw_priv;

		if (par->bo_ptr) {
			ttm_bo_kunmap(&par->map);
			par->bo_ptr = NULL;
		}
		if (unref_bo)
			vmw_dmabuf_unreference(&par->vmw_bo);
		else
		else if (vmw_priv->active_display_unit != vmw_du_legacy)
			vmw_dmabuf_unpin(par->vmw_priv, par->vmw_bo, false);
	}

@@ -585,18 +587,25 @@ static int vmw_fb_set_par(struct fb_info *info)

		/*
		 * Pin before mapping. Since we don't know in what placement
		 * to pin, call into KMS to do it for us.
		 * to pin, call into KMS to do it for us.  LDU doesn't require
		 * additional pinning because set_config() would've pinned
		 * it already
		 */
		if (vmw_priv->active_display_unit != vmw_du_legacy) {
			ret = vfb->pin(vfb);
			if (ret) {
			DRM_ERROR("Could not pin the fbdev framebuffer.\n");
				DRM_ERROR("Could not pin the fbdev "
					  "framebuffer.\n");
				goto out_unlock;
			}
		}

		ret = ttm_bo_kmap(&par->vmw_bo->base, 0,
				  par->vmw_bo->base.num_pages, &par->map);
		if (ret) {
			if (vmw_priv->active_display_unit != vmw_du_legacy)
				vfb->unpin(vfb);

			DRM_ERROR("Could not map the fbdev framebuffer.\n");
			goto out_unlock;
		}
@@ -822,7 +831,9 @@ int vmw_fb_off(struct vmw_private *vmw_priv)
	flush_delayed_work(&par->local_work);

	mutex_lock(&par->bo_mutex);
	drm_modeset_lock_all(vmw_priv->dev);
	(void) vmw_fb_kms_detach(par, true, false);
	drm_modeset_unlock_all(vmw_priv->dev);
	mutex_unlock(&par->bo_mutex);

	return 0;
+921 −190

File changed.

Preview size limit exceeded, changes collapsed.

Loading