diff options
| author | Dave Airlie <airlied@redhat.com> | 2011-12-06 10:28:21 +0000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2011-12-06 10:28:25 +0000 | 
| commit | bcdd6b2fd603340fbb0ed9984b32a9a066f1b806 (patch) | |
| tree | b886fd732698c152ac7627caf7f7edee6e0016ea | |
| parent | cee5ec43460351f0ce4617d3ffb34b74ad613a00 (diff) | |
| parent | acb4b992d8a13728044f430b47b9199aa45993e9 (diff) | |
| download | olio-linux-3.10-bcdd6b2fd603340fbb0ed9984b32a9a066f1b806.tar.xz olio-linux-3.10-bcdd6b2fd603340fbb0ed9984b32a9a066f1b806.zip  | |
drm: Merge branch 'drm-cleanups-jbarnes' into drm-core-next
Merge topic branch with some of Jesse's cleanups, the save/restore hooks
were being used by GMA500 so we can't just drop them.
* drm-cleanups-jbarnes:
  drm: remove some potentially dangerous DRM_ERRORs
  drm: document the drm_mode_config structure
  drm: document the drm_mode_group structure
  drm: document and cleanup drm_mode_config_funcs
  drm: document drm_mode_set structure
  drm: remove unused fields in drm_connector and document the rest
  drm: add drm_encoder comments
  drm: add comments for drm_encoder_funcs
  drm: fix comments for drm_crtc struct
  drm: remove unused connector_count field from drm_display_mode
| -rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 19 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 123 | 
2 files changed, 116 insertions, 26 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 1dfc2860075..255658906fc 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -1877,10 +1877,8 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	if (!req->flags) { -		DRM_ERROR("no operation set\n"); +	if (!req->flags)  		return -EINVAL; -	}  	mutex_lock(&dev->mode_config.mutex);  	obj = drm_mode_object_find(dev, req->crtc_id, DRM_MODE_OBJECT_CRTC); @@ -1893,7 +1891,6 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,  	if (req->flags & DRM_MODE_CURSOR_BO) {  		if (!crtc->funcs->cursor_set) { -			DRM_ERROR("crtc does not support cursor\n");  			ret = -ENXIO;  			goto out;  		} @@ -1906,7 +1903,6 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,  		if (crtc->funcs->cursor_move) {  			ret = crtc->funcs->cursor_move(crtc, req->x, req->y);  		} else { -			DRM_ERROR("crtc does not support cursor\n");  			ret = -EFAULT;  			goto out;  		} @@ -1989,14 +1985,11 @@ int drm_mode_addfb(struct drm_device *dev,  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return -EINVAL; -	if ((config->min_width > r.width) || (r.width > config->max_width)) { -		DRM_ERROR("mode new framebuffer width not within limits\n"); +	if ((config->min_width > r.width) || (r.width > config->max_width))  		return -EINVAL; -	} -	if ((config->min_height > r.height) || (r.height > config->max_height)) { -		DRM_ERROR("mode new framebuffer height not within limits\n"); + +	if ((config->min_height > r.height) || (r.height > config->max_height))  		return -EINVAL; -	}  	mutex_lock(&dev->mode_config.mutex); @@ -2110,7 +2103,6 @@ int drm_mode_rmfb(struct drm_device *dev,  	obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB);  	/* TODO check that we really get a framebuffer back. */  	if (!obj) { -		DRM_ERROR("mode invalid framebuffer id\n");  		ret = -EINVAL;  		goto out;  	} @@ -2121,7 +2113,6 @@ int drm_mode_rmfb(struct drm_device *dev,  			found = 1;  	if (!found) { -		DRM_ERROR("tried to remove a fb that we didn't own\n");  		ret = -EINVAL;  		goto out;  	} @@ -2168,7 +2159,6 @@ int drm_mode_getfb(struct drm_device *dev,  	mutex_lock(&dev->mode_config.mutex);  	obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB);  	if (!obj) { -		DRM_ERROR("invalid framebuffer id\n");  		ret = -EINVAL;  		goto out;  	} @@ -2204,7 +2194,6 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,  	mutex_lock(&dev->mode_config.mutex);  	obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB);  	if (!obj) { -		DRM_ERROR("invalid framebuffer id\n");  		ret = -EINVAL;  		goto out_err1;  	} diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 6718b1873df..dd557272eca 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -120,7 +120,6 @@ struct drm_display_mode {  	char name[DRM_DISPLAY_MODE_LEN]; -	int connector_count;  	enum drm_mode_status status;  	int type; @@ -345,10 +344,21 @@ struct drm_crtc_funcs {  /**   * drm_crtc - central CRTC control structure + * @dev: parent DRM device + * @head: list management + * @base: base KMS object for ID tracking etc.   * @enabled: is this CRTC enabled? + * @mode: current mode timings + * @hwmode: mode timings as programmed to hw regs   * @x: x position on screen   * @y: y position on screen   * @funcs: CRTC control functions + * @gamma_size: size of gamma ramp + * @gamma_store: gamma ramp values + * @framedur_ns: precise frame timing + * @framedur_ns: precise line timing + * @pixeldur_ns: precise pixel timing + * @helper_private: mid-layer private data   *   * Each CRTC may have one or more connectors associated with it.  This structure   * allows the CRTC to be controlled. @@ -427,6 +437,13 @@ struct drm_connector_funcs {  	void (*force)(struct drm_connector *connector);  }; +/** + * drm_encoder_funcs - encoder controls + * @reset: reset state (e.g. at init or resume time) + * @destroy: cleanup and free associated data + * + * Encoders sit between CRTCs and connectors. + */  struct drm_encoder_funcs {  	void (*reset)(struct drm_encoder *encoder);  	void (*destroy)(struct drm_encoder *encoder); @@ -439,6 +456,18 @@ struct drm_encoder_funcs {  /**   * drm_encoder - central DRM encoder structure + * @dev: parent DRM device + * @head: list management + * @base: base KMS object + * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h + * @possible_crtcs: bitmask of potential CRTC bindings + * @possible_clones: bitmask of potential sibling encoders for cloning + * @crtc: currently bound CRTC + * @funcs: control functions + * @helper_private: mid-layer private data + * + * CRTCs drive pixels to encoders, which convert them into signals + * appropriate for a given connector or set of connectors.   */  struct drm_encoder {  	struct drm_device *dev; @@ -474,14 +503,37 @@ enum drm_connector_force {  /**   * drm_connector - central DRM connector control structure - * @crtc: CRTC this connector is currently connected to, NULL if none + * @dev: parent DRM device + * @kdev: kernel device for sysfs attributes + * @attr: sysfs attributes + * @head: list management + * @base: base KMS object + * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h + * @connector_type_id: index into connector type enum   * @interlace_allowed: can this connector handle interlaced modes?   * @doublescan_allowed: can this connector handle doublescan? - * @available_modes: modes available on this connector (from get_modes() + user) - * @initial_x: initial x position for this connector - * @initial_y: initial y position for this connector - * @status: connector connected? + * @modes: modes available on this connector (from fill_modes() + user) + * @status: one of the drm_connector_status enums (connected, not, or unknown) + * @probed_modes: list of modes derived directly from the display + * @display_info: information about attached display (e.g. from EDID)   * @funcs: connector control functions + * @user_modes: user added mode list + * @edid_blob_ptr: DRM property containing EDID if present + * @property_ids: property tracking for this connector + * @property_values: value pointers or data for properties + * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling + * @dpms: current dpms state + * @helper_private: mid-layer private data + * @force: a %DRM_FORCE_<foo> state for forced mode sets + * @encoder_ids: valid encoders for this connector + * @encoder: encoder driving this connector, if any + * @eld: EDID-like data, if present + * @dvi_dual: dual link DVI, if found + * @max_tmds_clock: max clock rate, if found + * @latency_present: AV delay info from ELD, if found + * @video_latency: video latency info from ELD, if found + * @audio_latency: audio latency info from ELD, if found + * @null_edid_counter: track sinks that give us all zeros for the EDID   *   * Each connector may be connected to one or more CRTCs, or may be clonable by   * another connector if they can share a CRTC.  Each connector also has a specific @@ -502,7 +554,6 @@ struct drm_connector {  	bool doublescan_allowed;  	struct list_head modes; /* list of modes on this connector */ -	int initial_x, initial_y;  	enum drm_connector_status status;  	/* these are modes added by probing with DDC or the BIOS */ @@ -526,7 +577,6 @@ struct drm_connector {  	/* forced on connector */  	enum drm_connector_force force;  	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER]; -	uint32_t force_encoder_id;  	struct drm_encoder *encoder; /* currently active encoder */  	/* EDID bits */ @@ -596,7 +646,15 @@ struct drm_plane {  };  /** - * struct drm_mode_set + * drm_mode_set - new values for a CRTC config change + * @head: list management + * @fb: framebuffer to use for new config + * @crtc: CRTC whose configuration we're about to change + * @mode: mode timings to use + * @x: position of this CRTC relative to @fb + * @y: position of this CRTC relative to @fb + * @connectors: array of connectors to drive with this CRTC if possible + * @num_connectors: size of @connectors array   *   * Represents a single crtc the connectors that it drives with what mode   * and from which framebuffer it scans out from. @@ -618,13 +676,33 @@ struct drm_mode_set {  };  /** - * struct drm_mode_config_funcs - configure CRTCs for a given screen layout + * struct drm_mode_config_funcs - basic driver provided mode setting functions + * @fb_create: create a new framebuffer object + * @output_poll_changed: function to handle output configuration changes + * + * Some global (i.e. not per-CRTC, connector, etc) mode setting functions that + * involve drivers.   */  struct drm_mode_config_funcs { -	struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd); +	struct drm_framebuffer *(*fb_create)(struct drm_device *dev, +					     struct drm_file *file_priv, +					     struct drm_mode_fb_cmd2 *mode_cmd);  	void (*output_poll_changed)(struct drm_device *dev);  }; +/** + * drm_mode_group - group of mode setting resources for potential sub-grouping + * @num_crtcs: CRTC count + * @num_encoders: encoder count + * @num_connectors: connector count + * @id_list: list of KMS object IDs in this group + * + * Currently this simply tracks the global mode setting state.  But in the + * future it could allow groups of objects to be set aside into independent + * control groups for use by different user level processes (e.g. two X servers + * running simultaneously on different heads, each with their own mode + * configuration and freedom of mode setting). + */  struct drm_mode_group {  	uint32_t num_crtcs;  	uint32_t num_encoders; @@ -636,7 +714,30 @@ struct drm_mode_group {  /**   * drm_mode_config - Mode configuration control structure + * @mutex: mutex protecting KMS related lists and structures + * @idr_mutex: mutex for KMS ID allocation and management + * @crtc_idr: main KMS ID tracking object + * @num_fb: number of fbs available + * @fb_list: list of framebuffers available + * @num_connector: number of connectors on this device + * @connector_list: list of connector objects + * @num_encoder: number of encoders on this device + * @encoder_list: list of encoder objects + * @num_crtc: number of CRTCs on this device + * @crtc_list: list of CRTC objects + * @min_width: minimum pixel width on this device + * @min_height: minimum pixel height on this device + * @max_width: maximum pixel width on this device + * @max_height: maximum pixel height on this device + * @funcs: core driver provided mode setting functions + * @fb_base: base address of the framebuffer + * @poll_enabled: track polling status for this device + * @output_poll_work: delayed work for polling in process context + * @*_property: core property tracking   * + * Core mode resource tracking structure.  All CRTC, encoders, and connectors + * enumerated by the driver are added here, as are global properties.  Some + * global restrictions are also here, e.g. dimension restrictions.   */  struct drm_mode_config {  	struct mutex mutex; /* protects configuration (mode lists etc.) */  |