drm/kms-helpers: Extract drm_modeset_helper.[hc]
While reviewing docs I spotted that we have a few functions that really just don't fit into their containing helper library section. Extract them and shovel them all into a new library for random one-off aux stuff. v2: Remove wrongly added files for real. Cc: Sean Paul <seanpaul@chromium.org> Reviewed-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1471034937-651-3-git-send-email-daniel.vetter@ffwll.ch
This commit is contained in:
		
							parent
							
								
									bcb32b691c
								
							
						
					
					
						commit
						1de72faf10
					
				| @ -258,3 +258,12 @@ Tile group | ||||
| 
 | ||||
| .. kernel-doc:: drivers/gpu/drm/drm_crtc.c | ||||
|    :doc: Tile group | ||||
| 
 | ||||
| Auxiliary Modeset Helpers | ||||
| ========================= | ||||
| 
 | ||||
| .. kernel-doc:: drivers/gpu/drm/drm_modeset_helper.c | ||||
|    :doc: aux kms helpers | ||||
| 
 | ||||
| .. kernel-doc:: drivers/gpu/drm/drm_modeset_helper.c | ||||
|    :export: | ||||
|  | ||||
| @ -24,7 +24,7 @@ drm-$(CONFIG_AGP) += drm_agpsupport.o | ||||
| drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_probe_helper.o \
 | ||||
| 		drm_plane_helper.o drm_dp_mst_topology.o drm_atomic_helper.o \
 | ||||
| 		drm_kms_helper_common.o drm_dp_dual_mode_helper.o \
 | ||||
| 		drm_simple_kms_helper.o drm_blend.o | ||||
| 		drm_simple_kms_helper.o drm_blend.o drm_modeset_helper.o | ||||
| 
 | ||||
| drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o | ||||
| drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o | ||||
|  | ||||
| @ -74,35 +74,6 @@ | ||||
|  * &drm_connector_helper_funcs. | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_helper_move_panel_connectors_to_head() - move panels to the front in the | ||||
|  * 						connector list | ||||
|  * @dev: drm device to operate on | ||||
|  * | ||||
|  * Some userspace presumes that the first connected connector is the main | ||||
|  * display, where it's supposed to display e.g. the login screen. For | ||||
|  * laptops, this should be the main panel. Use this function to sort all | ||||
|  * (eDP/LVDS) panels to the front of the connector list, instead of | ||||
|  * painstakingly trying to initialize them in the right order. | ||||
|  */ | ||||
| void drm_helper_move_panel_connectors_to_head(struct drm_device *dev) | ||||
| { | ||||
| 	struct drm_connector *connector, *tmp; | ||||
| 	struct list_head panel_list; | ||||
| 
 | ||||
| 	INIT_LIST_HEAD(&panel_list); | ||||
| 
 | ||||
| 	list_for_each_entry_safe(connector, tmp, | ||||
| 				 &dev->mode_config.connector_list, head) { | ||||
| 		if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS || | ||||
| 		    connector->connector_type == DRM_MODE_CONNECTOR_eDP) | ||||
| 			list_move_tail(&connector->head, &panel_list); | ||||
| 	} | ||||
| 
 | ||||
| 	list_splice(&panel_list, &dev->mode_config.connector_list); | ||||
| } | ||||
| EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head); | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_helper_encoder_in_use - check if a given encoder is in use | ||||
|  * @encoder: encoder to check | ||||
| @ -912,33 +883,6 @@ int drm_helper_connector_dpms(struct drm_connector *connector, int mode) | ||||
| } | ||||
| EXPORT_SYMBOL(drm_helper_connector_dpms); | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_helper_mode_fill_fb_struct - fill out framebuffer metadata | ||||
|  * @fb: drm_framebuffer object to fill out | ||||
|  * @mode_cmd: metadata from the userspace fb creation request | ||||
|  * | ||||
|  * This helper can be used in a drivers fb_create callback to pre-fill the fb's | ||||
|  * metadata fields. | ||||
|  */ | ||||
| void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | ||||
| 				    const struct drm_mode_fb_cmd2 *mode_cmd) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	fb->width = mode_cmd->width; | ||||
| 	fb->height = mode_cmd->height; | ||||
| 	for (i = 0; i < 4; i++) { | ||||
| 		fb->pitches[i] = mode_cmd->pitches[i]; | ||||
| 		fb->offsets[i] = mode_cmd->offsets[i]; | ||||
| 		fb->modifier[i] = mode_cmd->modifier[i]; | ||||
| 	} | ||||
| 	drm_fb_get_bpp_depth(mode_cmd->pixel_format, &fb->depth, | ||||
| 				    &fb->bits_per_pixel); | ||||
| 	fb->pixel_format = mode_cmd->pixel_format; | ||||
| 	fb->flags = mode_cmd->flags; | ||||
| } | ||||
| EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct); | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_helper_resume_force_mode - force-restore mode setting configuration | ||||
|  * @dev: drm_device which should be restored | ||||
|  | ||||
							
								
								
									
										153
									
								
								drivers/gpu/drm/drm_modeset_helper.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								drivers/gpu/drm/drm_modeset_helper.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,153 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2016 Intel Corporation | ||||
|  * | ||||
|  * Permission to use, copy, modify, distribute, and sell this software and its | ||||
|  * documentation for any purpose is hereby granted without fee, provided that | ||||
|  * the above copyright notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting documentation, and | ||||
|  * that the name of the copyright holders not be used in advertising or | ||||
|  * publicity pertaining to distribution of the software without specific, | ||||
|  * written prior permission.  The copyright holders make no representations | ||||
|  * about the suitability of this software for any purpose.  It is provided "as | ||||
|  * is" without express or implied warranty. | ||||
|  * | ||||
|  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | ||||
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO | ||||
|  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR | ||||
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, | ||||
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | ||||
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||||
|  * OF THIS SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #include <drm/drm_modeset_helper.h> | ||||
| #include <drm/drm_plane_helper.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * DOC: aux kms helpers | ||||
|  * | ||||
|  * This helper library contains various one-off functions which don't really fit | ||||
|  * anywhere else in the DRM modeset helper library. | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_helper_move_panel_connectors_to_head() - move panels to the front in the | ||||
|  * 						connector list | ||||
|  * @dev: drm device to operate on | ||||
|  * | ||||
|  * Some userspace presumes that the first connected connector is the main | ||||
|  * display, where it's supposed to display e.g. the login screen. For | ||||
|  * laptops, this should be the main panel. Use this function to sort all | ||||
|  * (eDP/LVDS) panels to the front of the connector list, instead of | ||||
|  * painstakingly trying to initialize them in the right order. | ||||
|  */ | ||||
| void drm_helper_move_panel_connectors_to_head(struct drm_device *dev) | ||||
| { | ||||
| 	struct drm_connector *connector, *tmp; | ||||
| 	struct list_head panel_list; | ||||
| 
 | ||||
| 	INIT_LIST_HEAD(&panel_list); | ||||
| 
 | ||||
| 	list_for_each_entry_safe(connector, tmp, | ||||
| 				 &dev->mode_config.connector_list, head) { | ||||
| 		if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS || | ||||
| 		    connector->connector_type == DRM_MODE_CONNECTOR_eDP) | ||||
| 			list_move_tail(&connector->head, &panel_list); | ||||
| 	} | ||||
| 
 | ||||
| 	list_splice(&panel_list, &dev->mode_config.connector_list); | ||||
| } | ||||
| EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head); | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_helper_mode_fill_fb_struct - fill out framebuffer metadata | ||||
|  * @fb: drm_framebuffer object to fill out | ||||
|  * @mode_cmd: metadata from the userspace fb creation request | ||||
|  * | ||||
|  * This helper can be used in a drivers fb_create callback to pre-fill the fb's | ||||
|  * metadata fields. | ||||
|  */ | ||||
| void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | ||||
| 				    const struct drm_mode_fb_cmd2 *mode_cmd) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	fb->width = mode_cmd->width; | ||||
| 	fb->height = mode_cmd->height; | ||||
| 	for (i = 0; i < 4; i++) { | ||||
| 		fb->pitches[i] = mode_cmd->pitches[i]; | ||||
| 		fb->offsets[i] = mode_cmd->offsets[i]; | ||||
| 		fb->modifier[i] = mode_cmd->modifier[i]; | ||||
| 	} | ||||
| 	drm_fb_get_bpp_depth(mode_cmd->pixel_format, &fb->depth, | ||||
| 				    &fb->bits_per_pixel); | ||||
| 	fb->pixel_format = mode_cmd->pixel_format; | ||||
| 	fb->flags = mode_cmd->flags; | ||||
| } | ||||
| EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct); | ||||
| 
 | ||||
| /*
 | ||||
|  * This is the minimal list of formats that seem to be safe for modeset use | ||||
|  * with all current DRM drivers.  Most hardware can actually support more | ||||
|  * formats than this and drivers may specify a more accurate list when | ||||
|  * creating the primary plane.  However drivers that still call | ||||
|  * drm_plane_init() will use this minimal format list as the default. | ||||
|  */ | ||||
| static const uint32_t safe_modeset_formats[] = { | ||||
| 	DRM_FORMAT_XRGB8888, | ||||
| 	DRM_FORMAT_ARGB8888, | ||||
| }; | ||||
| 
 | ||||
| static struct drm_plane *create_primary_plane(struct drm_device *dev) | ||||
| { | ||||
| 	struct drm_plane *primary; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	primary = kzalloc(sizeof(*primary), GFP_KERNEL); | ||||
| 	if (primary == NULL) { | ||||
| 		DRM_DEBUG_KMS("Failed to allocate primary plane\n"); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Remove the format_default field from drm_plane when dropping | ||||
| 	 * this helper. | ||||
| 	 */ | ||||
| 	primary->format_default = true; | ||||
| 
 | ||||
| 	/* possible_crtc's will be filled in later by crtc_init */ | ||||
| 	ret = drm_universal_plane_init(dev, primary, 0, | ||||
| 				       &drm_primary_helper_funcs, | ||||
| 				       safe_modeset_formats, | ||||
| 				       ARRAY_SIZE(safe_modeset_formats), | ||||
| 				       DRM_PLANE_TYPE_PRIMARY, NULL); | ||||
| 	if (ret) { | ||||
| 		kfree(primary); | ||||
| 		primary = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	return primary; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_crtc_init - Legacy CRTC initialization function | ||||
|  * @dev: DRM device | ||||
|  * @crtc: CRTC object to init | ||||
|  * @funcs: callbacks for the new CRTC | ||||
|  * | ||||
|  * Initialize a CRTC object with a default helper-provided primary plane and no | ||||
|  * cursor plane. | ||||
|  * | ||||
|  * Returns: | ||||
|  * Zero on success, error code on failure. | ||||
|  */ | ||||
| int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, | ||||
| 		  const struct drm_crtc_funcs *funcs) | ||||
| { | ||||
| 	struct drm_plane *primary; | ||||
| 
 | ||||
| 	primary = create_primary_plane(dev); | ||||
| 	return drm_crtc_init_with_planes(dev, crtc, primary, NULL, funcs, | ||||
| 					 NULL); | ||||
| } | ||||
| EXPORT_SYMBOL(drm_crtc_init); | ||||
| @ -63,18 +63,6 @@ | ||||
|  * the details. | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
|  * This is the minimal list of formats that seem to be safe for modeset use | ||||
|  * with all current DRM drivers.  Most hardware can actually support more | ||||
|  * formats than this and drivers may specify a more accurate list when | ||||
|  * creating the primary plane.  However drivers that still call | ||||
|  * drm_plane_init() will use this minimal format list as the default. | ||||
|  */ | ||||
| static const uint32_t safe_modeset_formats[] = { | ||||
| 	DRM_FORMAT_XRGB8888, | ||||
| 	DRM_FORMAT_ARGB8888, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Returns the connectors currently associated with a CRTC.  This function | ||||
|  * should be called twice:  once with a NULL connector list to retrieve | ||||
| @ -438,60 +426,6 @@ const struct drm_plane_funcs drm_primary_helper_funcs = { | ||||
| }; | ||||
| EXPORT_SYMBOL(drm_primary_helper_funcs); | ||||
| 
 | ||||
| static struct drm_plane *create_primary_plane(struct drm_device *dev) | ||||
| { | ||||
| 	struct drm_plane *primary; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	primary = kzalloc(sizeof(*primary), GFP_KERNEL); | ||||
| 	if (primary == NULL) { | ||||
| 		DRM_DEBUG_KMS("Failed to allocate primary plane\n"); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Remove the format_default field from drm_plane when dropping | ||||
| 	 * this helper. | ||||
| 	 */ | ||||
| 	primary->format_default = true; | ||||
| 
 | ||||
| 	/* possible_crtc's will be filled in later by crtc_init */ | ||||
| 	ret = drm_universal_plane_init(dev, primary, 0, | ||||
| 				       &drm_primary_helper_funcs, | ||||
| 				       safe_modeset_formats, | ||||
| 				       ARRAY_SIZE(safe_modeset_formats), | ||||
| 				       DRM_PLANE_TYPE_PRIMARY, NULL); | ||||
| 	if (ret) { | ||||
| 		kfree(primary); | ||||
| 		primary = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	return primary; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_crtc_init - Legacy CRTC initialization function | ||||
|  * @dev: DRM device | ||||
|  * @crtc: CRTC object to init | ||||
|  * @funcs: callbacks for the new CRTC | ||||
|  * | ||||
|  * Initialize a CRTC object with a default helper-provided primary plane and no | ||||
|  * cursor plane. | ||||
|  * | ||||
|  * Returns: | ||||
|  * Zero on success, error code on failure. | ||||
|  */ | ||||
| int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, | ||||
| 		  const struct drm_crtc_funcs *funcs) | ||||
| { | ||||
| 	struct drm_plane *primary; | ||||
| 
 | ||||
| 	primary = create_primary_plane(dev); | ||||
| 	return drm_crtc_init_with_planes(dev, crtc, primary, NULL, funcs, | ||||
| 					 NULL); | ||||
| } | ||||
| EXPORT_SYMBOL(drm_crtc_init); | ||||
| 
 | ||||
| int drm_plane_helper_commit(struct drm_plane *plane, | ||||
| 			    struct drm_plane_state *plane_state, | ||||
| 			    struct drm_framebuffer *old_fb) | ||||
|  | ||||
| @ -29,6 +29,8 @@ | ||||
| #define DRM_ATOMIC_HELPER_H_ | ||||
| 
 | ||||
| #include <drm/drm_crtc.h> | ||||
| #include <drm/drm_modeset_helper_vtables.h> | ||||
| #include <drm/drm_modeset_helper.h> | ||||
| 
 | ||||
| struct drm_atomic_state; | ||||
| 
 | ||||
|  | ||||
| @ -41,6 +41,7 @@ | ||||
| 
 | ||||
| #include <drm/drm_crtc.h> | ||||
| #include <drm/drm_modeset_helper_vtables.h> | ||||
| #include <drm/drm_modeset_helper.h> | ||||
| 
 | ||||
| extern void drm_helper_disable_unused_functions(struct drm_device *dev); | ||||
| extern int drm_crtc_helper_set_config(struct drm_mode_set *set); | ||||
| @ -53,11 +54,6 @@ extern bool drm_helper_encoder_in_use(struct drm_encoder *encoder); | ||||
| 
 | ||||
| extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode); | ||||
| 
 | ||||
| extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); | ||||
| 
 | ||||
| extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | ||||
| 					   const struct drm_mode_fb_cmd2 *mode_cmd); | ||||
| 
 | ||||
| extern void drm_helper_resume_force_mode(struct drm_device *dev); | ||||
| 
 | ||||
| int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, | ||||
|  | ||||
							
								
								
									
										36
									
								
								include/drm/drm_modeset_helper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								include/drm/drm_modeset_helper.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| /*
 | ||||
|  * Copyright (c) 2016 Intel Corporation | ||||
|  * | ||||
|  * Permission to use, copy, modify, distribute, and sell this software and its | ||||
|  * documentation for any purpose is hereby granted without fee, provided that | ||||
|  * the above copyright notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting documentation, and | ||||
|  * that the name of the copyright holders not be used in advertising or | ||||
|  * publicity pertaining to distribution of the software without specific, | ||||
|  * written prior permission.  The copyright holders make no representations | ||||
|  * about the suitability of this software for any purpose.  It is provided "as | ||||
|  * is" without express or implied warranty. | ||||
|  * | ||||
|  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | ||||
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO | ||||
|  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR | ||||
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, | ||||
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | ||||
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||||
|  * OF THIS SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __DRM_KMS_HELPER_H__ | ||||
| #define __DRM_KMS_HELPER_H__ | ||||
| 
 | ||||
| #include <drm/drmP.h> | ||||
| 
 | ||||
| void drm_helper_move_panel_connectors_to_head(struct drm_device *); | ||||
| 
 | ||||
| void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | ||||
| 				    const struct drm_mode_fb_cmd2 *mode_cmd); | ||||
| 
 | ||||
| int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, | ||||
| 		  const struct drm_crtc_funcs *funcs); | ||||
| 
 | ||||
| #endif | ||||
| @ -27,6 +27,7 @@ | ||||
| #include <drm/drm_rect.h> | ||||
| #include <drm/drm_crtc.h> | ||||
| #include <drm/drm_modeset_helper_vtables.h> | ||||
| #include <drm/drm_modeset_helper.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * Drivers that don't allow primary plane scaling may pass this macro in place | ||||
| @ -37,9 +38,6 @@ | ||||
|  */ | ||||
| #define DRM_PLANE_HELPER_NO_SCALING (1<<16) | ||||
| 
 | ||||
| int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, | ||||
| 		  const struct drm_crtc_funcs *funcs); | ||||
| 
 | ||||
| int drm_plane_helper_check_state(struct drm_plane_state *state, | ||||
| 				 const struct drm_rect *clip, | ||||
| 				 int min_scale, int max_scale, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user