diff options
Diffstat (limited to 'drivers/gpu/drm/qxl')
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_cmd.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_debugfs.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_display.c | 69 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.h | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_fb.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_gem.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_kms.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ttm.c | 1 | 
9 files changed, 86 insertions, 57 deletions
| diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index 04270f5d110c..74fc9362ecf9 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c @@ -578,7 +578,7 @@ int qxl_hw_surface_dealloc(struct qxl_device *qdev,  	return 0;  } -int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf) +static int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf)  {  	struct qxl_rect rect;  	int ret; diff --git a/drivers/gpu/drm/qxl/qxl_debugfs.c b/drivers/gpu/drm/qxl/qxl_debugfs.c index 6911b8c44492..241af9131dc8 100644 --- a/drivers/gpu/drm/qxl/qxl_debugfs.c +++ b/drivers/gpu/drm/qxl/qxl_debugfs.c @@ -123,9 +123,6 @@ int qxl_debugfs_add_files(struct qxl_device *qdev,  	qdev->debugfs_count = i;  #if defined(CONFIG_DEBUG_FS)  	drm_debugfs_create_files(files, nfiles, -				 qdev->ddev->control->debugfs_root, -				 qdev->ddev->control); -	drm_debugfs_create_files(files, nfiles,  				 qdev->ddev->primary->debugfs_root,  				 qdev->ddev->primary);  #endif @@ -140,9 +137,6 @@ void qxl_debugfs_remove_files(struct qxl_device *qdev)  	for (i = 0; i < qdev->debugfs_count; i++) {  		drm_debugfs_remove_files(qdev->debugfs[i].files,  					 qdev->debugfs[i].num_files, -					 qdev->ddev->control); -		drm_debugfs_remove_files(qdev->debugfs[i].files, -					 qdev->debugfs[i].num_files,  					 qdev->ddev->primary);  	}  #endif diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index a61c0d460ec2..4b5eab8a47b3 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c @@ -36,7 +36,7 @@ static bool qxl_head_enabled(struct qxl_head *head)  	return head->width && head->height;  } -void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count) +static void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)  {  	if (qdev->client_monitors_config &&  	    count > qdev->client_monitors_config->count) { @@ -57,11 +57,18 @@ void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)  	qdev->client_monitors_config->count = count;  } +enum { +	MONITORS_CONFIG_MODIFIED, +	MONITORS_CONFIG_UNCHANGED, +	MONITORS_CONFIG_BAD_CRC, +}; +  static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)  {  	int i;  	int num_monitors;  	uint32_t crc; +	int status = MONITORS_CONFIG_UNCHANGED;  	num_monitors = qdev->rom->client_monitors_config.count;  	crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config, @@ -70,7 +77,7 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)  		qxl_io_log(qdev, "crc mismatch: have %X (%zd) != %X\n", crc,  			   sizeof(qdev->rom->client_monitors_config),  			   qdev->rom->client_monitors_config_crc); -		return 1; +		return MONITORS_CONFIG_BAD_CRC;  	}  	if (num_monitors > qdev->monitors_config->max_allowed) {  		DRM_DEBUG_KMS("client monitors list will be truncated: %d < %d\n", @@ -79,6 +86,10 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)  	} else {  		num_monitors = qdev->rom->client_monitors_config.count;  	} +	if (qdev->client_monitors_config +	      && (num_monitors != qdev->client_monitors_config->count)) { +		status = MONITORS_CONFIG_MODIFIED; +	}  	qxl_alloc_client_monitors_config(qdev, num_monitors);  	/* we copy max from the client but it isn't used */  	qdev->client_monitors_config->max_allowed = @@ -88,17 +99,39 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)  			&qdev->rom->client_monitors_config.heads[i];  		struct qxl_head *client_head =  			&qdev->client_monitors_config->heads[i]; -		client_head->x = c_rect->left; -		client_head->y = c_rect->top; -		client_head->width = c_rect->right - c_rect->left; -		client_head->height = c_rect->bottom - c_rect->top; -		client_head->surface_id = 0; -		client_head->id = i; -		client_head->flags = 0; +		if (client_head->x != c_rect->left) { +			client_head->x = c_rect->left; +			status = MONITORS_CONFIG_MODIFIED; +		} +		if (client_head->y != c_rect->top) { +			client_head->y = c_rect->top; +			status = MONITORS_CONFIG_MODIFIED; +		} +		if (client_head->width != c_rect->right - c_rect->left) { +			client_head->width = c_rect->right - c_rect->left; +			status = MONITORS_CONFIG_MODIFIED; +		} +		if (client_head->height != c_rect->bottom - c_rect->top) { +			client_head->height = c_rect->bottom - c_rect->top; +			status = MONITORS_CONFIG_MODIFIED; +		} +		if (client_head->surface_id != 0) { +			client_head->surface_id = 0; +			status = MONITORS_CONFIG_MODIFIED; +		} +		if (client_head->id != i) { +			client_head->id = i; +			status = MONITORS_CONFIG_MODIFIED; +		} +		if (client_head->flags != 0) { +			client_head->flags = 0; +			status = MONITORS_CONFIG_MODIFIED; +		}  		DRM_DEBUG_KMS("read %dx%d+%d+%d\n", client_head->width, client_head->height,  			  client_head->x, client_head->y);  	} -	return 0; + +	return status;  }  static void qxl_update_offset_props(struct qxl_device *qdev) @@ -124,9 +157,18 @@ void qxl_display_read_client_monitors_config(struct qxl_device *qdev)  {  	struct drm_device *dev = qdev->ddev; -	while (qxl_display_copy_rom_client_monitors_config(qdev)) { +	int status; + +	status = qxl_display_copy_rom_client_monitors_config(qdev); +	while (status == MONITORS_CONFIG_BAD_CRC) {  		qxl_io_log(qdev, "failed crc check for client_monitors_config,"  				 " retrying\n"); +		status = qxl_display_copy_rom_client_monitors_config(qdev); +	} +	if (status == MONITORS_CONFIG_UNCHANGED) { +		qxl_io_log(qdev, "config unchanged\n"); +		DRM_DEBUG("ignoring unchanged client monitors config"); +		return;  	}  	drm_modeset_lock_all(dev); @@ -157,6 +199,9 @@ 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; +	mode->hdisplay = head->width; +	mode->vdisplay = head->height; +	drm_mode_set_name(mode);  	*pwidth = head->width;  	*pheight = head->height;  	drm_mode_probed_add(connector, mode); @@ -607,7 +652,7 @@ static bool qxl_crtc_mode_fixup(struct drm_crtc *crtc,  	return true;  } -void +static void  qxl_send_monitors_config(struct qxl_device *qdev)  {  	int i; diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index 5f3e5ad99de7..785aad42e9bb 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h @@ -31,7 +31,7 @@   * Definitions taken from spice-protocol, plus kernel driver specific bits.   */ -#include <linux/fence.h> +#include <linux/dma-fence.h>  #include <linux/workqueue.h>  #include <linux/firmware.h>  #include <linux/platform_device.h> @@ -190,7 +190,7 @@ enum {   * spice-protocol/qxl_dev.h */  #define QXL_MAX_RES 96  struct qxl_release { -	struct fence base; +	struct dma_fence base;  	int id;  	int type; @@ -395,16 +395,11 @@ qxl_framebuffer_init(struct drm_device *dev,  		     struct drm_gem_object *obj,  		     const struct drm_framebuffer_funcs *funcs);  void qxl_display_read_client_monitors_config(struct qxl_device *qdev); -void qxl_send_monitors_config(struct qxl_device *qdev);  int qxl_create_monitors_object(struct qxl_device *qdev);  int qxl_destroy_monitors_object(struct qxl_device *qdev); -/* used by qxl_debugfs only */ -void qxl_crtc_set_from_monitors_config(struct qxl_device *qdev); -void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count); -  /* qxl_gem.c */ -int qxl_gem_init(struct qxl_device *qdev); +void qxl_gem_init(struct qxl_device *qdev);  void qxl_gem_fini(struct qxl_device *qdev);  int qxl_gem_object_create(struct qxl_device *qdev, int size,  			  int alignment, int initial_domain, @@ -574,6 +569,5 @@ int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo);  struct qxl_drv_surface *  qxl_surface_lookup(struct drm_device *dev, int surface_id);  void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing); -int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf);  #endif diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c index 2cd879a4ae15..fd7e5e94be5b 100644 --- a/drivers/gpu/drm/qxl/qxl_fb.c +++ b/drivers/gpu/drm/qxl/qxl_fb.c @@ -81,16 +81,10 @@ static struct fb_deferred_io qxl_defio = {  static struct fb_ops qxlfb_ops = {  	.owner = THIS_MODULE, -	.fb_check_var = drm_fb_helper_check_var, -	.fb_set_par = drm_fb_helper_set_par, /* TODO: copy vmwgfx */ +	DRM_FB_HELPER_DEFAULT_OPS,  	.fb_fillrect = drm_fb_helper_sys_fillrect,  	.fb_copyarea = drm_fb_helper_sys_copyarea,  	.fb_imageblit = drm_fb_helper_sys_imageblit, -	.fb_pan_display = drm_fb_helper_pan_display, -	.fb_blank = drm_fb_helper_blank, -	.fb_setcmap = drm_fb_helper_setcmap, -	.fb_debug_enter = drm_fb_helper_debug_enter, -	.fb_debug_leave = drm_fb_helper_debug_leave,  };  static void qxlfb_destroy_pinned_object(struct drm_gem_object *gobj) @@ -197,7 +191,7 @@ static int qxlfb_framebuffer_dirty(struct drm_framebuffer *fb,  	/*  	 * we are using a shadow draw buffer, at qdev->surface0_shadow  	 */ -	qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]", clips->x1, clips->x2, +	qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]\n", clips->x1, clips->x2,  		   clips->y1, clips->y2);  	image->dx = clips->x1;  	image->dy = clips->y1; diff --git a/drivers/gpu/drm/qxl/qxl_gem.c b/drivers/gpu/drm/qxl/qxl_gem.c index d9746e904ef1..3f185c4da5b7 100644 --- a/drivers/gpu/drm/qxl/qxl_gem.c +++ b/drivers/gpu/drm/qxl/qxl_gem.c @@ -111,10 +111,9 @@ void qxl_gem_object_close(struct drm_gem_object *obj,  {  } -int qxl_gem_init(struct qxl_device *qdev) +void qxl_gem_init(struct qxl_device *qdev)  {  	INIT_LIST_HEAD(&qdev->gem.objects); -	return 0;  }  void qxl_gem_fini(struct qxl_device *qdev) diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c index e642242728c0..af685f1d91f8 100644 --- a/drivers/gpu/drm/qxl/qxl_kms.c +++ b/drivers/gpu/drm/qxl/qxl_kms.c @@ -131,7 +131,7 @@ static int qxl_device_init(struct qxl_device *qdev,  	mutex_init(&qdev->update_area_mutex);  	mutex_init(&qdev->release_mutex);  	mutex_init(&qdev->surf_evict_mutex); -	INIT_LIST_HEAD(&qdev->gem.objects); +	qxl_gem_init(qdev);  	qdev->rom_base = pci_resource_start(pdev, 2);  	qdev->rom_size = pci_resource_len(pdev, 2); @@ -273,6 +273,7 @@ static void qxl_device_fini(struct qxl_device *qdev)  	qxl_ring_free(qdev->command_ring);  	qxl_ring_free(qdev->cursor_ring);  	qxl_ring_free(qdev->release_ring); +	qxl_gem_fini(qdev);  	qxl_bo_fini(qdev);  	io_mapping_free(qdev->surface_mapping);  	io_mapping_free(qdev->vram_mapping); diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index cd83f050cf3e..e6ec845b5be0 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c @@ -21,7 +21,7 @@   */  #include "qxl_drv.h"  #include "qxl_object.h" -#include <trace/events/fence.h> +#include <trace/events/dma_fence.h>  /*   * drawable cmd cache - allocate a bunch of VRAM pages, suballocate @@ -40,23 +40,24 @@  static const int release_size_per_bo[] = { RELEASE_SIZE, SURFACE_RELEASE_SIZE, RELEASE_SIZE };  static const int releases_per_bo[] = { RELEASES_PER_BO, SURFACE_RELEASES_PER_BO, RELEASES_PER_BO }; -static const char *qxl_get_driver_name(struct fence *fence) +static const char *qxl_get_driver_name(struct dma_fence *fence)  {  	return "qxl";  } -static const char *qxl_get_timeline_name(struct fence *fence) +static const char *qxl_get_timeline_name(struct dma_fence *fence)  {  	return "release";  } -static bool qxl_nop_signaling(struct fence *fence) +static bool qxl_nop_signaling(struct dma_fence *fence)  {  	/* fences are always automatically signaled, so just pretend we did this.. */  	return true;  } -static long qxl_fence_wait(struct fence *fence, bool intr, signed long timeout) +static long qxl_fence_wait(struct dma_fence *fence, bool intr, +			   signed long timeout)  {  	struct qxl_device *qdev;  	struct qxl_release *release; @@ -71,7 +72,7 @@ static long qxl_fence_wait(struct fence *fence, bool intr, signed long timeout)  retry:  	sc++; -	if (fence_is_signaled(fence)) +	if (dma_fence_is_signaled(fence))  		goto signaled;  	qxl_io_notify_oom(qdev); @@ -80,11 +81,11 @@ retry:  		if (!qxl_queue_garbage_collect(qdev, true))  			break; -		if (fence_is_signaled(fence)) +		if (dma_fence_is_signaled(fence))  			goto signaled;  	} -	if (fence_is_signaled(fence)) +	if (dma_fence_is_signaled(fence))  		goto signaled;  	if (have_drawable_releases || sc < 4) { @@ -96,9 +97,9 @@ retry:  			return 0;  		if (have_drawable_releases && sc > 300) { -			FENCE_WARN(fence, "failed to wait on release %llu " -					  "after spincount %d\n", -					  fence->context & ~0xf0000000, sc); +			DMA_FENCE_WARN(fence, "failed to wait on release %llu " +				       "after spincount %d\n", +				       fence->context & ~0xf0000000, sc);  			goto signaled;  		}  		goto retry; @@ -115,7 +116,7 @@ signaled:  	return end - cur;  } -static const struct fence_ops qxl_fence_ops = { +static const struct dma_fence_ops qxl_fence_ops = {  	.get_driver_name = qxl_get_driver_name,  	.get_timeline_name = qxl_get_timeline_name,  	.enable_signaling = qxl_nop_signaling, @@ -133,7 +134,7 @@ qxl_release_alloc(struct qxl_device *qdev, int type,  	release = kmalloc(size, GFP_KERNEL);  	if (!release) {  		DRM_ERROR("Out of memory\n"); -		return 0; +		return -ENOMEM;  	}  	release->base.ops = NULL;  	release->type = type; @@ -192,8 +193,8 @@ qxl_release_free(struct qxl_device *qdev,  		WARN_ON(list_empty(&release->bos));  		qxl_release_free_list(release); -		fence_signal(&release->base); -		fence_put(&release->base); +		dma_fence_signal(&release->base); +		dma_fence_put(&release->base);  	} else {  		qxl_release_free_list(release);  		kfree(release); @@ -453,9 +454,9 @@ void qxl_release_fence_buffer_objects(struct qxl_release *release)  	 * Since we never really allocated a context and we don't want to conflict,  	 * set the highest bits. This will break if we really allow exporting of dma-bufs.  	 */ -	fence_init(&release->base, &qxl_fence_ops, &qdev->release_lock, -		   release->id | 0xf0000000, release->base.seqno); -	trace_fence_emit(&release->base); +	dma_fence_init(&release->base, &qxl_fence_ops, &qdev->release_lock, +		       release->id | 0xf0000000, release->base.seqno); +	trace_dma_fence_emit(&release->base);  	driver = bdev->driver;  	glob = bo->glob; diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index e26c82db948b..11761330a6b8 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c @@ -387,6 +387,7 @@ static struct ttm_bo_driver qxl_bo_driver = {  	.ttm_tt_unpopulate = &qxl_ttm_tt_unpopulate,  	.invalidate_caches = &qxl_invalidate_caches,  	.init_mem_type = &qxl_init_mem_type, +	.eviction_valuable = ttm_bo_eviction_valuable,  	.evict_flags = &qxl_evict_flags,  	.move = &qxl_bo_move,  	.verify_access = &qxl_verify_access, |