diff options
Diffstat (limited to 'drivers/gpu/drm/qxl')
| -rw-r--r-- | drivers/gpu/drm/qxl/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_display.c | 78 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_fb.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_gem.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ioctl.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_irq.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_kms.c | 44 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_object.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ttm.c | 15 | 
12 files changed, 120 insertions, 60 deletions
diff --git a/drivers/gpu/drm/qxl/Kconfig b/drivers/gpu/drm/qxl/Kconfig index d6c12796023..38c2bb72e45 100644 --- a/drivers/gpu/drm/qxl/Kconfig +++ b/drivers/gpu/drm/qxl/Kconfig @@ -5,7 +5,11 @@ config DRM_QXL  	select FB_SYS_COPYAREA  	select FB_SYS_IMAGEBLIT  	select FB_DEFERRED_IO -        select DRM_KMS_HELPER -        select DRM_TTM +	select DRM_KMS_HELPER +	select DRM_KMS_FB_HELPER +	select DRM_TTM +	select CRC32  	help -		QXL virtual GPU for Spice virtualization desktop integration. Do not enable this driver unless your distro ships a corresponding X.org QXL driver that can handle kernel modesetting. +	  QXL virtual GPU for Spice virtualization desktop integration. +	  Do not enable this driver unless your distro ships a corresponding +	  X.org QXL driver that can handle kernel modesetting. diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index 835caba026d..5d7ea246185 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c @@ -24,7 +24,7 @@   */ -#include "linux/crc32.h" +#include <linux/crc32.h>  #include "qxl_drv.h"  #include "qxl_object.h" @@ -107,10 +107,17 @@ void qxl_display_read_client_monitors_config(struct qxl_device *qdev)  		qxl_io_log(qdev, "failed crc check for client_monitors_config,"  				 " retrying\n");  	} -	drm_helper_hpd_irq_event(qdev->ddev); + +	if (!drm_helper_hpd_irq_event(qdev->ddev)) { +		/* notify that the monitor configuration changed, to +		   adjust at the arbitrary resolution */ +		drm_kms_helper_hotplug_event(qdev->ddev); +	}  } -static int qxl_add_monitors_config_modes(struct drm_connector *connector) +static int qxl_add_monitors_config_modes(struct drm_connector *connector, +                                         unsigned *pwidth, +                                         unsigned *pheight)  {  	struct drm_device *dev = connector->dev;  	struct qxl_device *qdev = dev->dev_private; @@ -126,11 +133,15 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector)  	mode = drm_cvt_mode(dev, head->width, head->height, 60, false, false,  			    false);  	mode->type |= DRM_MODE_TYPE_PREFERRED; +	*pwidth = head->width; +	*pheight = head->height;  	drm_mode_probed_add(connector, mode);  	return 1;  } -static int qxl_add_common_modes(struct drm_connector *connector) +static int qxl_add_common_modes(struct drm_connector *connector, +                                unsigned pwidth, +                                unsigned pheight)  {  	struct drm_device *dev = connector->dev;  	struct drm_display_mode *mode = NULL; @@ -159,12 +170,9 @@ static int qxl_add_common_modes(struct drm_connector *connector)  	};  	for (i = 0; i < ARRAY_SIZE(common_modes); i++) { -		if (common_modes[i].w < 320 || common_modes[i].h < 200) -			continue; -  		mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h,  				    60, false, false, false); -		if (common_modes[i].w == 1024 && common_modes[i].h == 768) +		if (common_modes[i].w == pwidth && common_modes[i].h == pheight)  			mode->type |= DRM_MODE_TYPE_PREFERRED;  		drm_mode_probed_add(connector, mode);  	} @@ -391,10 +399,14 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,  	struct qxl_bo *qobj;  	int inc = 1; +	drm_modeset_lock_all(fb->dev); +  	qobj = gem_to_qxl_bo(qxl_fb->obj);  	/* if we aren't primary surface ignore this */ -	if (!qobj->is_primary) +	if (!qobj->is_primary) { +		drm_modeset_unlock_all(fb->dev);  		return 0; +	}  	if (!num_clips) {  		num_clips = 1; @@ -409,6 +421,9 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,  	qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color,  			  clips, num_clips, inc); + +	drm_modeset_unlock_all(fb->dev); +  	return 0;  } @@ -512,7 +527,7 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,  	bool recreate_primary = false;  	int ret;  	int surf_id; -	if (!crtc->fb) { +	if (!crtc->primary->fb) {  		DRM_DEBUG_KMS("No FB bound\n");  		return 0;  	} @@ -521,7 +536,7 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,  		qfb = to_qxl_framebuffer(old_fb);  		old_bo = gem_to_qxl_bo(qfb->obj);  	} -	qfb = to_qxl_framebuffer(crtc->fb); +	qfb = to_qxl_framebuffer(crtc->primary->fb);  	bo = gem_to_qxl_bo(qfb->obj);  	if (!m)  		/* and do we care? */ @@ -559,6 +574,10 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc,  			   bo->surf.height, bo->surf.stride, bo->surf.format);  		qxl_io_create_primary(qdev, base_offset, bo);  		bo->is_primary = true; +	} + +	if (bo->is_primary) { +		DRM_DEBUG_KMS("setting surface_id to 0 for primary surface %d on crtc %d\n", bo->surface_id, qcrtc->index);  		surf_id = 0;  	} else {  		surf_id = bo->surface_id; @@ -594,14 +613,14 @@ static void qxl_crtc_disable(struct drm_crtc *crtc)  	struct qxl_crtc *qcrtc = to_qxl_crtc(crtc);  	struct drm_device *dev = crtc->dev;  	struct qxl_device *qdev = dev->dev_private; -	if (crtc->fb) { -		struct qxl_framebuffer *qfb = to_qxl_framebuffer(crtc->fb); +	if (crtc->primary->fb) { +		struct qxl_framebuffer *qfb = to_qxl_framebuffer(crtc->primary->fb);  		struct qxl_bo *bo = gem_to_qxl_bo(qfb->obj);  		int ret;  		ret = qxl_bo_reserve(bo, false);  		qxl_bo_unpin(bo);  		qxl_bo_unreserve(bo); -		crtc->fb = NULL; +		crtc->primary->fb = NULL;  	}  	qxl_monitors_config_set(qdev, qcrtc->index, 0, 0, 0, 0, 0); @@ -720,16 +739,18 @@ static int qxl_conn_get_modes(struct drm_connector *connector)  {  	int ret = 0;  	struct qxl_device *qdev = connector->dev->dev_private; +	unsigned pwidth = 1024; +	unsigned pheight = 768;  	DRM_DEBUG_KMS("monitors_config=%p\n", qdev->monitors_config);  	/* TODO: what should we do here? only show the configured modes for the  	 * device, or allow the full list, or both? */  	if (qdev->monitors_config && qdev->monitors_config->count) { -		ret = qxl_add_monitors_config_modes(connector); +		ret = qxl_add_monitors_config_modes(connector, &pwidth, &pheight);  		if (ret < 0)  			return ret;  	} -	ret += qxl_add_common_modes(connector); +	ret += qxl_add_common_modes(connector, pwidth, pheight);  	return ret;  } @@ -793,7 +814,10 @@ static enum drm_connector_status qxl_conn_detect(  		     qdev->client_monitors_config->count > output->index &&  		     qxl_head_enabled(&qdev->client_monitors_config->heads[output->index])); -	DRM_DEBUG("\n"); +	DRM_DEBUG("#%d connected: %d\n", output->index, connected); +	if (!connected) +		qxl_monitors_config_set(qdev, output->index, 0, 0, 0, 0, 0); +  	return connected ? connector_status_connected  			 : connector_status_disconnected;  } @@ -821,7 +845,7 @@ static const struct drm_connector_funcs qxl_connector_funcs = {  	.save = qxl_conn_save,  	.restore = qxl_conn_restore,  	.detect = qxl_conn_detect, -	.fill_modes = drm_helper_probe_single_connector_modes, +	.fill_modes = drm_helper_probe_single_connector_modes_nomerge,  	.set_property = qxl_conn_set_property,  	.destroy = qxl_conn_destroy,  }; @@ -835,8 +859,21 @@ static const struct drm_encoder_funcs qxl_enc_funcs = {  	.destroy = qxl_enc_destroy,  }; +static int qxl_mode_create_hotplug_mode_update_property(struct qxl_device *qdev) +{ +	if (qdev->hotplug_mode_update_property) +		return 0; + +	qdev->hotplug_mode_update_property = +		drm_property_create_range(qdev->ddev, DRM_MODE_PROP_IMMUTABLE, +					  "hotplug_mode_update", 0, 1); + +	return 0; +} +  static int qdev_output_init(struct drm_device *dev, int num_output)  { +	struct qxl_device *qdev = dev->dev_private;  	struct qxl_output *qxl_output;  	struct drm_connector *connector;  	struct drm_encoder *encoder; @@ -863,6 +900,8 @@ static int qdev_output_init(struct drm_device *dev, int num_output)  	drm_encoder_helper_add(encoder, &qxl_enc_helper_funcs);  	drm_connector_helper_add(connector, &qxl_connector_helper_funcs); +	drm_object_attach_property(&connector->base, +				   qdev->hotplug_mode_update_property, 0);  	drm_sysfs_connector_add(connector);  	return 0;  } @@ -975,6 +1014,9 @@ int qxl_modeset_init(struct qxl_device *qdev)  	qdev->ddev->mode_config.max_height = 8192;  	qdev->ddev->mode_config.fb_base = qdev->vram_base; + +	qxl_mode_create_hotplug_mode_update_property(qdev); +  	for (i = 0 ; i < qxl_num_crtc; ++i) {  		qdev_crtc_init(qdev->ddev, i);  		qdev_output_init(qdev->ddev, i); diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c index 514118ae72d..6e936634d65 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.c +++ b/drivers/gpu/drm/qxl/qxl_drv.c @@ -214,7 +214,6 @@ static struct pci_driver qxl_pci_driver = {  static struct drm_driver qxl_driver = {  	.driver_features = DRIVER_GEM | DRIVER_MODESET |  			   DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, -	.dev_priv_size = 0,  	.load = qxl_driver_load,  	.unload = qxl_driver_unload, @@ -225,7 +224,6 @@ static struct drm_driver qxl_driver = {  	.debugfs_init = qxl_debugfs_init,  	.debugfs_cleanup = qxl_debugfs_takedown,  #endif -	.gem_init_object = qxl_gem_object_init,  	.gem_free_object = qxl_gem_object_free,  	.gem_open_object = qxl_gem_object_open,  	.gem_close_object = qxl_gem_object_close, diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index f7c9adde46a..36ed40ba773 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h @@ -323,6 +323,8 @@ struct qxl_device {  	struct work_struct gc_work;  	struct work_struct fb_work; + +	struct drm_property *hotplug_mode_update_property;  };  /* forward declaration for QXL_INFO_IO */ @@ -412,7 +414,6 @@ int qxl_gem_object_create_with_handle(struct qxl_device *qdev,  				      struct qxl_surface *surf,  				      struct qxl_bo **qobj,  				      uint32_t *handle); -int qxl_gem_object_init(struct drm_gem_object *obj);  void qxl_gem_object_free(struct drm_gem_object *gobj);  int qxl_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv);  void qxl_gem_object_close(struct drm_gem_object *obj, @@ -533,7 +534,7 @@ void qxl_debugfs_takedown(struct drm_minor *minor);  /* qxl_irq.c */  int qxl_irq_init(struct qxl_device *qdev); -irqreturn_t qxl_irq_handler(DRM_IRQ_ARGS); +irqreturn_t qxl_irq_handler(int irq, void *arg);  /* qxl_fb.c */  int qxl_fb_init(struct qxl_device *qdev); diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c index 88722f23343..f437b30ce68 100644 --- a/drivers/gpu/drm/qxl/qxl_fb.c +++ b/drivers/gpu/drm/qxl/qxl_fb.c @@ -108,7 +108,7 @@ static void qxl_fb_dirty_flush(struct fb_info *info)  	u32 x1, x2, y1, y2;  	/* TODO: hard coding 32 bpp */ -	int stride = qfbdev->qfb.base.pitches[0] * 4; +	int stride = qfbdev->qfb.base.pitches[0];  	x1 = qfbdev->dirty.x1;  	x2 = qfbdev->dirty.x2; diff --git a/drivers/gpu/drm/qxl/qxl_gem.c b/drivers/gpu/drm/qxl/qxl_gem.c index 1648e4125af..b96f0c9d89b 100644 --- a/drivers/gpu/drm/qxl/qxl_gem.c +++ b/drivers/gpu/drm/qxl/qxl_gem.c @@ -28,12 +28,6 @@  #include "qxl_drv.h"  #include "qxl_object.h" -int qxl_gem_object_init(struct drm_gem_object *obj) -{ -	/* we do nothings here */ -	return 0; -} -  void qxl_gem_object_free(struct drm_gem_object *gobj)  {  	struct qxl_bo *qobj = gem_to_qxl_bo(gobj); diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index 7b95c75e962..b110883f825 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c @@ -200,7 +200,7 @@ static int qxl_process_single_command(struct qxl_device *qdev,  	for (i = 0; i < cmd->relocs_num; ++i) {  		struct drm_qxl_reloc reloc; -		if (DRM_COPY_FROM_USER(&reloc, +		if (copy_from_user(&reloc,  				       &((struct drm_qxl_reloc *)(uintptr_t)cmd->relocs)[i],  				       sizeof(reloc))) {  			ret = -EFAULT; @@ -297,7 +297,7 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,  		struct drm_qxl_command *commands =  			(struct drm_qxl_command *)(uintptr_t)execbuffer->commands; -		if (DRM_COPY_FROM_USER(&user_cmd, &commands[cmd_num], +		if (copy_from_user(&user_cmd, &commands[cmd_num],  				       sizeof(user_cmd)))  			return -EFAULT; @@ -451,4 +451,4 @@ const struct drm_ioctl_desc qxl_ioctls[] = {  			  DRM_AUTH|DRM_UNLOCKED),  }; -int qxl_max_ioctls = DRM_ARRAY_SIZE(qxl_ioctls); +int qxl_max_ioctls = ARRAY_SIZE(qxl_ioctls); diff --git a/drivers/gpu/drm/qxl/qxl_irq.c b/drivers/gpu/drm/qxl/qxl_irq.c index 21393dc4700..0bf1e20c6e4 100644 --- a/drivers/gpu/drm/qxl/qxl_irq.c +++ b/drivers/gpu/drm/qxl/qxl_irq.c @@ -25,7 +25,7 @@  #include "qxl_drv.h" -irqreturn_t qxl_irq_handler(DRM_IRQ_ARGS) +irqreturn_t qxl_irq_handler(int irq, void *arg)  {  	struct drm_device *dev = (struct drm_device *) arg;  	struct qxl_device *qdev = (struct qxl_device *)dev->dev_private; @@ -33,6 +33,9 @@ irqreturn_t qxl_irq_handler(DRM_IRQ_ARGS)  	pending = xchg(&qdev->ram_header->int_pending, 0); +	if (!pending) +		return IRQ_NONE; +  	atomic_inc(&qdev->irq_received);  	if (pending & QXL_INTERRUPT_DISPLAY) { @@ -87,7 +90,7 @@ int qxl_irq_init(struct qxl_device *qdev)  	atomic_set(&qdev->irq_received_cursor, 0);  	atomic_set(&qdev->irq_received_io_cmd, 0);  	qdev->irq_received_error = 0; -	ret = drm_irq_install(qdev->ddev); +	ret = drm_irq_install(qdev->ddev, qdev->ddev->pdev->irq);  	qdev->ram_header->int_mask = QXL_INTERRUPT_MASK;  	if (unlikely(ret != 0)) {  		DRM_ERROR("Failed installing irq: %d\n", ret); diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c index 9e8da9ee973..fd88eb4a3f7 100644 --- a/drivers/gpu/drm/qxl/qxl_kms.c +++ b/drivers/gpu/drm/qxl/qxl_kms.c @@ -115,12 +115,12 @@ static void qxl_gc_work(struct work_struct *work)  	qxl_garbage_collect(qdev);  } -int qxl_device_init(struct qxl_device *qdev, +static int qxl_device_init(struct qxl_device *qdev,  		    struct drm_device *ddev,  		    struct pci_dev *pdev,  		    unsigned long flags)  { -	int r; +	int r, sb;  	qdev->dev = &pdev->dev;  	qdev->ddev = ddev; @@ -136,21 +136,39 @@ int qxl_device_init(struct qxl_device *qdev,  	qdev->rom_base = pci_resource_start(pdev, 2);  	qdev->rom_size = pci_resource_len(pdev, 2);  	qdev->vram_base = pci_resource_start(pdev, 0); -	qdev->surfaceram_base = pci_resource_start(pdev, 1); -	qdev->surfaceram_size = pci_resource_len(pdev, 1);  	qdev->io_base = pci_resource_start(pdev, 3);  	qdev->vram_mapping = io_mapping_create_wc(qdev->vram_base, pci_resource_len(pdev, 0)); -	qdev->surface_mapping = io_mapping_create_wc(qdev->surfaceram_base, qdev->surfaceram_size); -	DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk)\n", + +	if (pci_resource_len(pdev, 4) > 0) { +		/* 64bit surface bar present */ +		sb = 4; +		qdev->surfaceram_base = pci_resource_start(pdev, sb); +		qdev->surfaceram_size = pci_resource_len(pdev, sb); +		qdev->surface_mapping = +			io_mapping_create_wc(qdev->surfaceram_base, +					     qdev->surfaceram_size); +	} +	if (qdev->surface_mapping == NULL) { +		/* 64bit surface bar not present (or mapping failed) */ +		sb = 1; +		qdev->surfaceram_base = pci_resource_start(pdev, sb); +		qdev->surfaceram_size = pci_resource_len(pdev, sb); +		qdev->surface_mapping = +			io_mapping_create_wc(qdev->surfaceram_base, +					     qdev->surfaceram_size); +	} + +	DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk, %s)\n",  		 (unsigned long long)qdev->vram_base,  		 (unsigned long long)pci_resource_end(pdev, 0),  		 (int)pci_resource_len(pdev, 0) / 1024 / 1024,  		 (int)pci_resource_len(pdev, 0) / 1024,  		 (unsigned long long)qdev->surfaceram_base, -		 (unsigned long long)pci_resource_end(pdev, 1), +		 (unsigned long long)pci_resource_end(pdev, sb),  		 (int)qdev->surfaceram_size / 1024 / 1024, -		 (int)qdev->surfaceram_size / 1024); +		 (int)qdev->surfaceram_size / 1024, +		 (sb == 4) ? "64bit" : "32bit");  	qdev->rom = ioremap(qdev->rom_base, qdev->rom_size);  	if (!qdev->rom) { @@ -230,9 +248,13 @@ int qxl_device_init(struct qxl_device *qdev,  	qdev->surfaces_mem_slot = setup_slot(qdev, 1,  		(unsigned long)qdev->surfaceram_base,  		(unsigned long)qdev->surfaceram_base + qdev->surfaceram_size); -	DRM_INFO("main mem slot %d [%lx,%x)\n", -		qdev->main_mem_slot, -		(unsigned long)qdev->vram_base, qdev->rom->ram_header_offset); +	DRM_INFO("main mem slot %d [%lx,%x]\n", +		 qdev->main_mem_slot, +		 (unsigned long)qdev->vram_base, qdev->rom->ram_header_offset); +	DRM_INFO("surface mem slot %d [%lx,%lx]\n", +		 qdev->surfaces_mem_slot, +		 (unsigned long)qdev->surfaceram_base, +		 (unsigned long)qdev->surfaceram_size);  	qdev->gc_queue = create_singlethread_workqueue("qxl_gc"); diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c index 8691c76c5ef..b95f144f0b4 100644 --- a/drivers/gpu/drm/qxl/qxl_object.c +++ b/drivers/gpu/drm/qxl/qxl_object.c @@ -82,8 +82,6 @@ int qxl_bo_create(struct qxl_device *qdev,  	enum ttm_bo_type type;  	int r; -	if (unlikely(qdev->mman.bdev.dev_mapping == NULL)) -		qdev->mman.bdev.dev_mapping = qdev->ddev->dev_mapping;  	if (kernel)  		type = ttm_bo_type_kernel;  	else diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index 0109a9644cb..14e776f1d14 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c @@ -92,6 +92,7 @@ qxl_release_free(struct qxl_device *qdev,  						- DRM_FILE_OFFSET);  		qxl_fence_remove_release(&bo->fence, release->id);  		qxl_bo_unref(&bo); +		kfree(entry);  	}  	spin_lock(&qdev->release_idr_lock);  	idr_remove(&qdev->release_idr, release->id); @@ -348,7 +349,7 @@ void qxl_release_fence_buffer_objects(struct qxl_release *release)  		qxl_fence_add_release_locked(&qbo->fence, release->id);  		ttm_bo_add_to_lru(bo); -		ww_mutex_unlock(&bo->resv->lock); +		__ttm_bo_unreserve(bo);  		entry->reserved = false;  	}  	spin_unlock(&bdev->fence_lock); diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index 037786d7c1d..71a1baeac14 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c @@ -109,13 +109,11 @@ static const struct vm_operations_struct *ttm_vm_ops;  static int qxl_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)  {  	struct ttm_buffer_object *bo; -	struct qxl_device *qdev;  	int r;  	bo = (struct ttm_buffer_object *)vma->vm_private_data;  	if (bo == NULL)  		return VM_FAULT_NOPAGE; -	qdev = qxl_get_qdev(bo->bdev);  	r = ttm_vm_ops->fault(vma, vmf);  	return r;  } @@ -162,10 +160,6 @@ static int qxl_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)  static int qxl_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,  			     struct ttm_mem_type_manager *man)  { -	struct qxl_device *qdev; - -	qdev = qxl_get_qdev(bdev); -  	switch (type) {  	case TTM_PL_SYSTEM:  		/* System memory */ @@ -433,6 +427,7 @@ static int qxl_sync_obj_flush(void *sync_obj)  static void qxl_sync_obj_unref(void **sync_obj)  { +	*sync_obj = NULL;  }  static void *qxl_sync_obj_ref(void *sync_obj) @@ -493,7 +488,9 @@ int qxl_ttm_init(struct qxl_device *qdev)  	/* No others user of address space so set it to 0 */  	r = ttm_bo_device_init(&qdev->mman.bdev,  			       qdev->mman.bo_global_ref.ref.object, -			       &qxl_bo_driver, DRM_FILE_PAGE_OFFSET, 0); +			       &qxl_bo_driver, +			       qdev->ddev->anon_inode->i_mapping, +			       DRM_FILE_PAGE_OFFSET, 0);  	if (r) {  		DRM_ERROR("failed initializing buffer object driver(%d).\n", r);  		return r; @@ -516,8 +513,8 @@ int qxl_ttm_init(struct qxl_device *qdev)  		 (unsigned)qdev->vram_size / (1024 * 1024));  	DRM_INFO("qxl: %luM of IO pages memory ready (VRAM domain)\n",  		 ((unsigned)num_io_pages * PAGE_SIZE) / (1024 * 1024)); -	if (unlikely(qdev->mman.bdev.dev_mapping == NULL)) -		qdev->mman.bdev.dev_mapping = qdev->ddev->dev_mapping; +	DRM_INFO("qxl: %uM of Surface memory size\n", +		 (unsigned)qdev->surfaceram_size / (1024 * 1024));  	r = qxl_ttm_debugfs_init(qdev);  	if (r) {  		DRM_ERROR("Failed to init debugfs\n");  | 
