Message ID | 1471034937-651-3-git-send-email-daniel.vetter@ffwll.ch (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Aug 12, 2016 at 4:48 PM, Daniel Vetter <daniel.vetter@ffwll.ch> 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@chromium.org> > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Reviewed-by: Sean Paul <seanpaul@chromium.org> > --- > 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 >
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,
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> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> --- 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