diff options
Diffstat (limited to 'drivers/gpu/drm/drm_crtc.c')
| -rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 147 | 
1 files changed, 85 insertions, 62 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 7ca2f28348e..a82ec05dee2 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -37,6 +37,29 @@  #include <drm/drm_edid.h>  #include <drm/drm_fourcc.h> +/** + * drm_modeset_lock_all - take all modeset locks + * @dev: drm device + * + * This function takes all modeset locks, suitable where a more fine-grained + * scheme isn't (yet) implemented. + */ +void drm_modeset_lock_all(struct drm_device *dev) +{ +	mutex_lock(&dev->mode_config.mutex); +} +EXPORT_SYMBOL(drm_modeset_lock_all); + +/** + * drm_modeset_unlock_all - drop all modeset locks + * @dev: device + */ +void drm_modeset_unlock_all(struct drm_device *dev) +{ +	mutex_unlock(&dev->mode_config.mutex); +} +EXPORT_SYMBOL(drm_modeset_unlock_all); +  /* Avoid boilerplate.  I'm tired of typing. */  #define DRM_ENUM_NAME_FN(fnname, list)				\  	char *fnname(int val)					\ @@ -425,7 +448,7 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,  	crtc->funcs = funcs;  	crtc->invert_dimensions = false; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC);  	if (ret) @@ -437,7 +460,7 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,  	dev->mode_config.num_crtc++;   out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -512,7 +535,7 @@ int drm_connector_init(struct drm_device *dev,  {  	int ret; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	ret = drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR);  	if (ret) @@ -542,7 +565,7 @@ int drm_connector_init(struct drm_device *dev,  				      dev->mode_config.dpms_property, 0);   out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -592,7 +615,7 @@ int drm_encoder_init(struct drm_device *dev,  {  	int ret; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER);  	if (ret) @@ -606,7 +629,7 @@ int drm_encoder_init(struct drm_device *dev,  	dev->mode_config.num_encoder++;   out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -615,11 +638,11 @@ EXPORT_SYMBOL(drm_encoder_init);  void drm_encoder_cleanup(struct drm_encoder *encoder)  {  	struct drm_device *dev = encoder->dev; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	drm_mode_object_put(dev, &encoder->base);  	list_del(&encoder->head);  	dev->mode_config.num_encoder--; -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  }  EXPORT_SYMBOL(drm_encoder_cleanup); @@ -631,7 +654,7 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,  {  	int ret; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	ret = drm_mode_object_get(dev, &plane->base, DRM_MODE_OBJECT_PLANE);  	if (ret) @@ -665,7 +688,7 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,  	}   out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -675,7 +698,7 @@ void drm_plane_cleanup(struct drm_plane *plane)  {  	struct drm_device *dev = plane->dev; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	kfree(plane->format_types);  	drm_mode_object_put(dev, &plane->base);  	/* if not added to a list, it must be a private plane */ @@ -683,7 +706,7 @@ void drm_plane_cleanup(struct drm_plane *plane)  		list_del(&plane->head);  		dev->mode_config.num_plane--;  	} -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  }  EXPORT_SYMBOL(drm_plane_cleanup); @@ -963,9 +986,9 @@ void drm_mode_config_init(struct drm_device *dev)  	INIT_LIST_HEAD(&dev->mode_config.plane_list);  	idr_init(&dev->mode_config.crtc_idr); -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	drm_mode_create_standard_connector_properties(dev); -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	/* Just to be sure */  	dev->mode_config.num_fb = 0; @@ -1185,7 +1208,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	/*  	 * For the non-control nodes we need to limit the list of resources @@ -1327,7 +1350,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,  		  card_res->count_connectors, card_res->count_encoders);  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -1355,7 +1378,7 @@ int drm_mode_getcrtc(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, crtc_resp->crtc_id,  				   DRM_MODE_OBJECT_CRTC); @@ -1383,7 +1406,7 @@ int drm_mode_getcrtc(struct drm_device *dev,  	}  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -1426,7 +1449,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,  	DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, out_resp->connector_id,  				   DRM_MODE_OBJECT_CONNECTOR); @@ -1523,7 +1546,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,  	out_resp->count_encoders = encoders_count;  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -1538,7 +1561,7 @@ int drm_mode_getencoder(struct drm_device *dev, void *data,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, enc_resp->encoder_id,  				   DRM_MODE_OBJECT_ENCODER);  	if (!obj) { @@ -1557,7 +1580,7 @@ int drm_mode_getencoder(struct drm_device *dev, void *data,  	enc_resp->possible_clones = encoder->possible_clones;  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -1581,7 +1604,7 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	config = &dev->mode_config;  	/* @@ -1603,7 +1626,7 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data,  	plane_resp->count_planes = config->num_plane;  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -1628,7 +1651,7 @@ int drm_mode_getplane(struct drm_device *dev, void *data,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, plane_resp->plane_id,  				   DRM_MODE_OBJECT_PLANE);  	if (!obj) { @@ -1668,7 +1691,7 @@ int drm_mode_getplane(struct drm_device *dev, void *data,  	plane_resp->count_format_types = plane->format_count;  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -1696,7 +1719,7 @@ int drm_mode_setplane(struct drm_device *dev, void *data,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	/*  	 * First, find the plane, crtc, and fb objects.  If not available, @@ -1795,7 +1818,7 @@ int drm_mode_setplane(struct drm_device *dev, void *data,  	}  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -1850,7 +1873,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,  	if (crtc_req->x > INT_MAX || crtc_req->y > INT_MAX)  		return -ERANGE; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, crtc_req->crtc_id,  				   DRM_MODE_OBJECT_CRTC);  	if (!obj) { @@ -1983,7 +2006,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,  out:  	kfree(connector_set);  	drm_mode_destroy(dev, mode); -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2001,7 +2024,7 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,  	if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, req->crtc_id, DRM_MODE_OBJECT_CRTC);  	if (!obj) {  		DRM_DEBUG_KMS("Unknown CRTC ID %d\n", req->crtc_id); @@ -2029,7 +2052,7 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,  		}  	}  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2108,7 +2131,7 @@ int drm_mode_addfb(struct drm_device *dev,  	if ((config->min_height > r.height) || (r.height > config->max_height))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	/* TODO check buffer is sufficiently large */  	/* TODO setup destructor callback */ @@ -2125,7 +2148,7 @@ int drm_mode_addfb(struct drm_device *dev,  	DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id);  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2293,7 +2316,7 @@ int drm_mode_addfb2(struct drm_device *dev,  	if (ret)  		return ret; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);  	if (IS_ERR(fb)) { @@ -2307,7 +2330,7 @@ int drm_mode_addfb2(struct drm_device *dev,  	DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id);  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2337,7 +2360,7 @@ int drm_mode_rmfb(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB);  	/* TODO check that we really get a framebuffer back. */  	if (!obj) { @@ -2358,7 +2381,7 @@ int drm_mode_rmfb(struct drm_device *dev,  	drm_framebuffer_remove(fb);  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2386,7 +2409,7 @@ int drm_mode_getfb(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB);  	if (!obj) {  		ret = -EINVAL; @@ -2405,7 +2428,7 @@ int drm_mode_getfb(struct drm_device *dev,  		ret = -ENODEV;  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2424,7 +2447,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB);  	if (!obj) {  		ret = -EINVAL; @@ -2478,7 +2501,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,  out_err2:  	kfree(clips);  out_err1: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2499,11 +2522,11 @@ void drm_fb_release(struct drm_file *priv)  	struct drm_device *dev = priv->minor->dev;  	struct drm_framebuffer *fb, *tfb; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	list_for_each_entry_safe(fb, tfb, &priv->fbs, filp_head) {  		drm_framebuffer_remove(fb);  	} -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  }  /** @@ -2618,7 +2641,7 @@ int drm_mode_attachmode_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR);  	if (!obj) { @@ -2642,7 +2665,7 @@ int drm_mode_attachmode_ioctl(struct drm_device *dev,  	drm_mode_attachmode(dev, connector, mode);  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2671,7 +2694,7 @@ int drm_mode_detachmode_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR);  	if (!obj) { @@ -2688,7 +2711,7 @@ int drm_mode_detachmode_ioctl(struct drm_device *dev,  	ret = drm_mode_detachmode(dev, connector, &mode);  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -2934,7 +2957,7 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY);  	if (!obj) {  		ret = -EINVAL; @@ -3012,7 +3035,7 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,  		out_resp->count_enum_blobs = blob_count;  	}  done: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -3063,7 +3086,7 @@ int drm_mode_getblob_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB);  	if (!obj) {  		ret = -EINVAL; @@ -3081,7 +3104,7 @@ int drm_mode_getblob_ioctl(struct drm_device *dev,  	out_resp->length = blob->length;  done: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -3223,7 +3246,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type);  	if (!obj) { @@ -3260,7 +3283,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,  	}  	arg->count_props = props_count;  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -3277,7 +3300,7 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	arg_obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type);  	if (!arg_obj) @@ -3315,7 +3338,7 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,  	}  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -3377,7 +3400,7 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC);  	if (!obj) {  		ret = -EINVAL; @@ -3418,7 +3441,7 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,  	crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size);  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -3436,7 +3459,7 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC);  	if (!obj) {  		ret = -EINVAL; @@ -3469,7 +3492,7 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev,  		goto out;  	}  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  } @@ -3489,7 +3512,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,  	    page_flip->reserved != 0)  		return -EINVAL; -	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock_all(dev);  	obj = drm_mode_object_find(dev, page_flip->crtc_id, DRM_MODE_OBJECT_CRTC);  	if (!obj)  		goto out; @@ -3567,7 +3590,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,  	}  out: -	mutex_unlock(&dev->mode_config.mutex); +	drm_modeset_unlock_all(dev);  	return ret;  }  |