diff options
Diffstat (limited to 'drivers/gpu/drm/drm_atomic_uapi.c')
| -rw-r--r-- | drivers/gpu/drm/drm_atomic_uapi.c | 144 | 
1 files changed, 92 insertions, 52 deletions
| diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 25c269bc4681..268bb69c2e2f 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -85,13 +85,15 @@ int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,  		drm_mode_copy(&state->mode, mode);  		state->enable = true; -		DRM_DEBUG_ATOMIC("Set [MODE:%s] for [CRTC:%d:%s] state %p\n", -				 mode->name, crtc->base.id, crtc->name, state); +		drm_dbg_atomic(crtc->dev, +			       "Set [MODE:%s] for [CRTC:%d:%s] state %p\n", +			       mode->name, crtc->base.id, crtc->name, state);  	} else {  		memset(&state->mode, 0, sizeof(state->mode));  		state->enable = false; -		DRM_DEBUG_ATOMIC("Set [NOMODE] for [CRTC:%d:%s] state %p\n", -				 crtc->base.id, crtc->name, state); +		drm_dbg_atomic(crtc->dev, +			       "Set [NOMODE] for [CRTC:%d:%s] state %p\n", +			       crtc->base.id, crtc->name, state);  	}  	return 0; @@ -128,31 +130,35 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,  		int ret;  		if (blob->length != sizeof(struct drm_mode_modeinfo)) { -			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] bad mode blob length: %zu\n", -					 crtc->base.id, crtc->name, -					 blob->length); +			drm_dbg_atomic(crtc->dev, +				       "[CRTC:%d:%s] bad mode blob length: %zu\n", +				       crtc->base.id, crtc->name, +				       blob->length);  			return -EINVAL;  		}  		ret = drm_mode_convert_umode(crtc->dev,  					     &state->mode, blob->data);  		if (ret) { -			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] invalid mode (ret=%d, status=%s):\n", -					 crtc->base.id, crtc->name, -					 ret, drm_get_mode_status_name(state->mode.status)); +			drm_dbg_atomic(crtc->dev, +				       "[CRTC:%d:%s] invalid mode (ret=%d, status=%s):\n", +				       crtc->base.id, crtc->name, +				       ret, drm_get_mode_status_name(state->mode.status));  			drm_mode_debug_printmodeline(&state->mode);  			return -EINVAL;  		}  		state->mode_blob = drm_property_blob_get(blob);  		state->enable = true; -		DRM_DEBUG_ATOMIC("Set [MODE:%s] for [CRTC:%d:%s] state %p\n", -				 state->mode.name, crtc->base.id, crtc->name, -				 state); +		drm_dbg_atomic(crtc->dev, +			       "Set [MODE:%s] for [CRTC:%d:%s] state %p\n", +			       state->mode.name, crtc->base.id, crtc->name, +			       state);  	} else {  		state->enable = false; -		DRM_DEBUG_ATOMIC("Set [NOMODE] for [CRTC:%d:%s] state %p\n", -				 crtc->base.id, crtc->name, state); +		drm_dbg_atomic(crtc->dev, +			       "Set [NOMODE] for [CRTC:%d:%s] state %p\n", +			       crtc->base.id, crtc->name, state);  	}  	return 0; @@ -202,12 +208,14 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,  	}  	if (crtc) -		DRM_DEBUG_ATOMIC("Link [PLANE:%d:%s] state %p to [CRTC:%d:%s]\n", -				 plane->base.id, plane->name, plane_state, -				 crtc->base.id, crtc->name); +		drm_dbg_atomic(plane->dev, +			       "Link [PLANE:%d:%s] state %p to [CRTC:%d:%s]\n", +			       plane->base.id, plane->name, plane_state, +			       crtc->base.id, crtc->name);  	else -		DRM_DEBUG_ATOMIC("Link [PLANE:%d:%s] state %p to [NOCRTC]\n", -				 plane->base.id, plane->name, plane_state); +		drm_dbg_atomic(plane->dev, +			       "Link [PLANE:%d:%s] state %p to [NOCRTC]\n", +			       plane->base.id, plane->name, plane_state);  	return 0;  } @@ -230,12 +238,14 @@ drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,  	struct drm_plane *plane = plane_state->plane;  	if (fb) -		DRM_DEBUG_ATOMIC("Set [FB:%d] for [PLANE:%d:%s] state %p\n", -				 fb->base.id, plane->base.id, plane->name, -				 plane_state); +		drm_dbg_atomic(plane->dev, +			       "Set [FB:%d] for [PLANE:%d:%s] state %p\n", +			       fb->base.id, plane->base.id, plane->name, +			       plane_state);  	else -		DRM_DEBUG_ATOMIC("Set [NOFB] for [PLANE:%d:%s] state %p\n", -				 plane->base.id, plane->name, plane_state); +		drm_dbg_atomic(plane->dev, +			       "Set [NOFB] for [PLANE:%d:%s] state %p\n", +			       plane->base.id, plane->name, plane_state);  	drm_framebuffer_assign(&plane_state->fb, fb);  } @@ -324,13 +334,15 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,  		drm_connector_get(conn_state->connector);  		conn_state->crtc = crtc; -		DRM_DEBUG_ATOMIC("Link [CONNECTOR:%d:%s] state %p to [CRTC:%d:%s]\n", -				 connector->base.id, connector->name, -				 conn_state, crtc->base.id, crtc->name); +		drm_dbg_atomic(connector->dev, +			       "Link [CONNECTOR:%d:%s] state %p to [CRTC:%d:%s]\n", +			       connector->base.id, connector->name, +			       conn_state, crtc->base.id, crtc->name);  	} else { -		DRM_DEBUG_ATOMIC("Link [CONNECTOR:%d:%s] state %p to [NOCRTC]\n", -				 connector->base.id, connector->name, -				 conn_state); +		drm_dbg_atomic(connector->dev, +			       "Link [CONNECTOR:%d:%s] state %p to [NOCRTC]\n", +			       connector->base.id, connector->name, +			       conn_state);  	}  	return 0; @@ -469,12 +481,15 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,  			return -EFAULT;  		set_out_fence_for_crtc(state->state, crtc, fence_ptr); +	} else if (property == crtc->scaling_filter_property) { +		state->scaling_filter = val;  	} else if (crtc->funcs->atomic_set_property) {  		return crtc->funcs->atomic_set_property(crtc, state, property, val);  	} else { -		DRM_DEBUG_ATOMIC("[CRTC:%d:%s] unknown property [PROP:%d:%s]]\n", -				 crtc->base.id, crtc->name, -				 property->base.id, property->name); +		drm_dbg_atomic(crtc->dev, +			       "[CRTC:%d:%s] unknown property [PROP:%d:%s]]\n", +			       crtc->base.id, crtc->name, +			       property->base.id, property->name);  		return -EINVAL;  	} @@ -503,6 +518,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,  		*val = (state->gamma_lut) ? state->gamma_lut->base.id : 0;  	else if (property == config->prop_out_fence_ptr)  		*val = 0; +	else if (property == crtc->scaling_filter_property) +		*val = state->scaling_filter;  	else if (crtc->funcs->atomic_get_property)  		return crtc->funcs->atomic_get_property(crtc, state, property, val);  	else @@ -566,8 +583,9 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,  		state->pixel_blend_mode = val;  	} else if (property == plane->rotation_property) {  		if (!is_power_of_2(val & DRM_MODE_ROTATE_MASK)) { -			DRM_DEBUG_ATOMIC("[PLANE:%d:%s] bad rotation bitmask: 0x%llx\n", -					 plane->base.id, plane->name, val); +			drm_dbg_atomic(plane->dev, +				       "[PLANE:%d:%s] bad rotation bitmask: 0x%llx\n", +				       plane->base.id, plane->name, val);  			return -EINVAL;  		}  		state->rotation = val; @@ -585,13 +603,16 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,  					sizeof(struct drm_rect),  					&replaced);  		return ret; +	} else if (property == plane->scaling_filter_property) { +		state->scaling_filter = val;  	} else if (plane->funcs->atomic_set_property) {  		return plane->funcs->atomic_set_property(plane, state,  				property, val);  	} else { -		DRM_DEBUG_ATOMIC("[PLANE:%d:%s] unknown property [PROP:%d:%s]]\n", -				 plane->base.id, plane->name, -				 property->base.id, property->name); +		drm_dbg_atomic(plane->dev, +			       "[PLANE:%d:%s] unknown property [PROP:%d:%s]]\n", +			       plane->base.id, plane->name, +			       property->base.id, property->name);  		return -EINVAL;  	} @@ -643,6 +664,8 @@ drm_atomic_plane_get_property(struct drm_plane *plane,  	} else if (property == config->prop_fb_damage_clips) {  		*val = (state->fb_damage_clips) ?  			state->fb_damage_clips->base.id : 0; +	} else if (property == plane->scaling_filter_property) { +		*val = state->scaling_filter;  	} else if (plane->funcs->atomic_get_property) {  		return plane->funcs->atomic_get_property(plane, state, property, val);  	} else { @@ -657,17 +680,20 @@ static int drm_atomic_set_writeback_fb_for_connector(  		struct drm_framebuffer *fb)  {  	int ret; +	struct drm_connector *conn = conn_state->connector;  	ret = drm_writeback_set_fb(conn_state, fb);  	if (ret < 0)  		return ret;  	if (fb) -		DRM_DEBUG_ATOMIC("Set [FB:%d] for connector state %p\n", -				 fb->base.id, conn_state); +		drm_dbg_atomic(conn->dev, +			       "Set [FB:%d] for connector state %p\n", +			       fb->base.id, conn_state);  	else -		DRM_DEBUG_ATOMIC("Set [NOFB] for connector state %p\n", -				 conn_state); +		drm_dbg_atomic(conn->dev, +			       "Set [NOFB] for connector state %p\n", +			       conn_state);  	return 0;  } @@ -774,9 +800,10 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,  		return connector->funcs->atomic_set_property(connector,  				state, property, val);  	} else { -		DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] unknown property [PROP:%d:%s]]\n", -				 connector->base.id, connector->name, -				 property->base.id, property->name); +		drm_dbg_atomic(connector->dev, +			       "[CONNECTOR:%d:%s] unknown property [PROP:%d:%s]]\n", +			       connector->base.id, connector->name, +			       property->base.id, property->name);  		return -EINVAL;  	} @@ -1274,7 +1301,7 @@ static void complete_signaling(struct drm_device *dev,  		/* If this fails log error to the user */  		if (fence_state[i].out_fence_ptr &&  		    put_user(-1, fence_state[i].out_fence_ptr)) -			DRM_DEBUG_ATOMIC("Couldn't clear out_fence_ptr\n"); +			drm_dbg_atomic(dev, "Couldn't clear out_fence_ptr\n");  	}  	kfree(fence_state); @@ -1303,22 +1330,35 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,  	 * though this may be a bit overkill, since legacy userspace  	 * wouldn't know how to call this ioctl)  	 */ -	if (!file_priv->atomic) +	if (!file_priv->atomic) { +		drm_dbg_atomic(dev, +			       "commit failed: atomic cap not enabled\n");  		return -EINVAL; +	} -	if (arg->flags & ~DRM_MODE_ATOMIC_FLAGS) +	if (arg->flags & ~DRM_MODE_ATOMIC_FLAGS) { +		drm_dbg_atomic(dev, "commit failed: invalid flag\n");  		return -EINVAL; +	} -	if (arg->reserved) +	if (arg->reserved) { +		drm_dbg_atomic(dev, "commit failed: reserved field set\n");  		return -EINVAL; +	} -	if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) +	if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) { +		drm_dbg_atomic(dev, +			       "commit failed: invalid flag DRM_MODE_PAGE_FLIP_ASYNC\n");  		return -EINVAL; +	}  	/* can't test and expect an event at the same time. */  	if ((arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) && -			(arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) +			(arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) { +		drm_dbg_atomic(dev, +			       "commit failed: page-flip event requested with test-only commit\n");  		return -EINVAL; +	}  	state = drm_atomic_state_alloc(dev);  	if (!state) | 
