On Fri, Aug 12, 2016 at 4:48 PM, Daniel Vetter <daniel.vetter@xxxxxxxx> wrote: > 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@xxxxxxxxxxxx> > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxxx> Reviewed-by: Sean Paul <seanpaul@xxxxxxxxxxxx> > --- > Documentation/gpu/drm-kms-helpers.rst | 9 ++ > drivers/gpu/drm/Makefile | 2 +- > drivers/gpu/drm/drm_crtc_helper.c | 56 ------------- > drivers/gpu/drm/drm_modeset_helper.c | 153 ++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_plane_helper.c | 66 --------------- > include/drm/drm_atomic_helper.h | 2 + > include/drm/drm_crtc_helper.h | 6 +- > include/drm/drm_modeset_helper.h | 36 ++++++++ > include/drm/drm_plane_helper.h | 4 +- > 9 files changed, 203 insertions(+), 131 deletions(-) > create mode 100644 drivers/gpu/drm/drm_modeset_helper.c > create mode 100644 include/drm/drm_modeset_helper.h > > diff --git a/Documentation/gpu/drm-kms-helpers.rst b/Documentation/gpu/drm-kms-helpers.rst > index 34f755bc9133..59fa3c11efab 100644 > --- a/Documentation/gpu/drm-kms-helpers.rst > +++ b/Documentation/gpu/drm-kms-helpers.rst > @@ -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: > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile > index 0238bf8bc8c3..a5824d926dc9 100644 > --- a/drivers/gpu/drm/Makefile > +++ b/drivers/gpu/drm/Makefile > @@ -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 > diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c > index 604d3ef72ffa..5d2cb138eba6 100644 > --- a/drivers/gpu/drm/drm_crtc_helper.c > +++ b/drivers/gpu/drm/drm_crtc_helper.c > @@ -75,35 +75,6 @@ > */ > > /** > - * 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 > * > @@ -913,33 +884,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 > * > diff --git a/drivers/gpu/drm/drm_modeset_helper.c b/drivers/gpu/drm/drm_modeset_helper.c > new file mode 100644 > index 000000000000..1d45738f8f98 > --- /dev/null > +++ b/drivers/gpu/drm/drm_modeset_helper.c > @@ -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); > diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c > index b522aabd1ab0..50b9c1bfc6f6 100644 > --- a/drivers/gpu/drm/drm_plane_helper.c > +++ b/drivers/gpu/drm/drm_plane_helper.c > @@ -64,18 +64,6 @@ > */ > > /* > - * 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 > * the list size, and once with the properly allocated list to be filled in. > @@ -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) > diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h > index d86ae5dcd7b4..5a02e499f32b 100644 > --- a/include/drm/drm_atomic_helper.h > +++ b/include/drm/drm_atomic_helper.h > @@ -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; > > diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h > index 4b37afa2b73b..982c299e435a 100644 > --- a/include/drm/drm_crtc_helper.h > +++ b/include/drm/drm_crtc_helper.h > @@ -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, > diff --git a/include/drm/drm_modeset_helper.h b/include/drm/drm_modeset_helper.h > new file mode 100644 > index 000000000000..b8051d5abe10 > --- /dev/null > +++ b/include/drm/drm_modeset_helper.h > @@ -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 > diff --git a/include/drm/drm_plane_helper.h b/include/drm/drm_plane_helper.h > index fbc8ecb3e5e8..c18959685c06 100644 > --- a/include/drm/drm_plane_helper.h > +++ b/include/drm/drm_plane_helper.h > @@ -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, > -- > 2.8.1 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel