1235783Skib/* 2235783Skib * Copyright �� 2006 Keith Packard 3235783Skib * Copyright �� 2007-2008 Dave Airlie 4235783Skib * Copyright �� 2007-2008 Intel Corporation 5235783Skib * Jesse Barnes <jesse.barnes@intel.com> 6235783Skib * 7235783Skib * Permission is hereby granted, free of charge, to any person obtaining a 8235783Skib * copy of this software and associated documentation files (the "Software"), 9235783Skib * to deal in the Software without restriction, including without limitation 10235783Skib * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11235783Skib * and/or sell copies of the Software, and to permit persons to whom the 12235783Skib * Software is furnished to do so, subject to the following conditions: 13235783Skib * 14235783Skib * The above copyright notice and this permission notice shall be included in 15235783Skib * all copies or substantial portions of the Software. 16235783Skib * 17235783Skib * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18235783Skib * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19235783Skib * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20235783Skib * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 21235783Skib * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22235783Skib * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23235783Skib * OTHER DEALINGS IN THE SOFTWARE. 24235783Skib * 25235783Skib * $FreeBSD$ 26235783Skib */ 27235783Skib 28235783Skib/* 29235783Skib * The DRM mode setting helper functions are common code for drivers to use if 30235783Skib * they wish. Drivers are not forced to use this code in their 31235783Skib * implementations but it would be useful if they code they do use at least 32235783Skib * provides a consistent interface and operation to userspace 33235783Skib */ 34235783Skib 35235783Skib#ifndef __DRM_CRTC_HELPER_H__ 36235783Skib#define __DRM_CRTC_HELPER_H__ 37235783Skib 38235783Skibenum mode_set_atomic { 39235783Skib LEAVE_ATOMIC_MODE_SET, 40235783Skib ENTER_ATOMIC_MODE_SET, 41235783Skib}; 42235783Skib 43282199Sdumbbell/** 44282199Sdumbbell * drm_crtc_helper_funcs - helper operations for CRTCs 45282199Sdumbbell * @mode_fixup: try to fixup proposed mode for this connector 46282199Sdumbbell * @mode_set: set this mode 47282199Sdumbbell * 48282199Sdumbbell * The helper operations are called by the mid-layer CRTC helper. 49282199Sdumbbell */ 50235783Skibstruct drm_crtc_helper_funcs { 51235783Skib /* 52235783Skib * Control power levels on the CRTC. If the mode passed in is 53235783Skib * unsupported, the provider must use the next lowest power level. 54235783Skib */ 55235783Skib void (*dpms)(struct drm_crtc *crtc, int mode); 56235783Skib void (*prepare)(struct drm_crtc *crtc); 57235783Skib void (*commit)(struct drm_crtc *crtc); 58235783Skib 59235783Skib /* Provider can fixup or change mode timings before modeset occurs */ 60235783Skib bool (*mode_fixup)(struct drm_crtc *crtc, 61254797Sdumbbell const struct drm_display_mode *mode, 62235783Skib struct drm_display_mode *adjusted_mode); 63235783Skib /* Actually set the mode */ 64235783Skib int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, 65235783Skib struct drm_display_mode *adjusted_mode, int x, int y, 66235783Skib struct drm_framebuffer *old_fb); 67235783Skib 68235783Skib /* Move the crtc on the current fb to the given position *optional* */ 69235783Skib int (*mode_set_base)(struct drm_crtc *crtc, int x, int y, 70235783Skib struct drm_framebuffer *old_fb); 71235783Skib int (*mode_set_base_atomic)(struct drm_crtc *crtc, 72235783Skib struct drm_framebuffer *fb, int x, int y, 73235783Skib enum mode_set_atomic); 74235783Skib 75235783Skib /* reload the current crtc LUT */ 76235783Skib void (*load_lut)(struct drm_crtc *crtc); 77235783Skib 78235783Skib /* disable crtc when not in use - more explicit than dpms off */ 79235783Skib void (*disable)(struct drm_crtc *crtc); 80235783Skib}; 81235783Skib 82282199Sdumbbell/** 83282199Sdumbbell * drm_encoder_helper_funcs - helper operations for encoders 84282199Sdumbbell * @mode_fixup: try to fixup proposed mode for this connector 85282199Sdumbbell * @mode_set: set this mode 86282199Sdumbbell * 87282199Sdumbbell * The helper operations are called by the mid-layer CRTC helper. 88282199Sdumbbell */ 89235783Skibstruct drm_encoder_helper_funcs { 90235783Skib void (*dpms)(struct drm_encoder *encoder, int mode); 91235783Skib void (*save)(struct drm_encoder *encoder); 92235783Skib void (*restore)(struct drm_encoder *encoder); 93235783Skib 94235783Skib bool (*mode_fixup)(struct drm_encoder *encoder, 95282199Sdumbbell const struct drm_display_mode *mode, 96235783Skib struct drm_display_mode *adjusted_mode); 97235783Skib void (*prepare)(struct drm_encoder *encoder); 98235783Skib void (*commit)(struct drm_encoder *encoder); 99235783Skib void (*mode_set)(struct drm_encoder *encoder, 100235783Skib struct drm_display_mode *mode, 101235783Skib struct drm_display_mode *adjusted_mode); 102235783Skib struct drm_crtc *(*get_crtc)(struct drm_encoder *encoder); 103235783Skib /* detect for DAC style encoders */ 104235783Skib enum drm_connector_status (*detect)(struct drm_encoder *encoder, 105235783Skib struct drm_connector *connector); 106235783Skib /* disable encoder when not in use - more explicit than dpms off */ 107235783Skib void (*disable)(struct drm_encoder *encoder); 108235783Skib}; 109235783Skib 110282199Sdumbbell/** 111282199Sdumbbell * drm_connector_helper_funcs - helper operations for connectors 112282199Sdumbbell * @get_modes: get mode list for this connector 113282199Sdumbbell * @mode_valid: is this mode valid on the given connector? 114282199Sdumbbell * 115282199Sdumbbell * The helper operations are called by the mid-layer CRTC helper. 116282199Sdumbbell */ 117235783Skibstruct drm_connector_helper_funcs { 118235783Skib int (*get_modes)(struct drm_connector *connector); 119235783Skib int (*mode_valid)(struct drm_connector *connector, 120235783Skib struct drm_display_mode *mode); 121235783Skib struct drm_encoder *(*best_encoder)(struct drm_connector *connector); 122235783Skib}; 123235783Skib 124235783Skibextern int drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY); 125235783Skibextern void drm_helper_disable_unused_functions(struct drm_device *dev); 126235783Skibextern int drm_crtc_helper_set_config(struct drm_mode_set *set); 127235783Skibextern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, 128235783Skib struct drm_display_mode *mode, 129235783Skib int x, int y, 130235783Skib struct drm_framebuffer *old_fb); 131235783Skibextern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); 132235783Skibextern bool drm_helper_encoder_in_use(struct drm_encoder *encoder); 133235783Skib 134235783Skibextern void drm_helper_connector_dpms(struct drm_connector *connector, int mode); 135235783Skib 136282199Sdumbbellextern void drm_helper_move_panel_connectors_to_head(struct drm_device *); 137282199Sdumbbell 138235783Skibextern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, 139235783Skib struct drm_mode_fb_cmd2 *mode_cmd); 140235783Skib 141235783Skibstatic inline void drm_crtc_helper_add(struct drm_crtc *crtc, 142235783Skib const struct drm_crtc_helper_funcs *funcs) 143235783Skib{ 144235783Skib crtc->helper_private = __DECONST(void *, funcs); 145235783Skib} 146235783Skib 147235783Skibstatic inline void drm_encoder_helper_add(struct drm_encoder *encoder, 148235783Skib const struct drm_encoder_helper_funcs *funcs) 149235783Skib{ 150235783Skib encoder->helper_private = __DECONST(void *, funcs); 151235783Skib} 152235783Skib 153235783Skibstatic inline void drm_connector_helper_add(struct drm_connector *connector, 154235783Skib const struct drm_connector_helper_funcs *funcs) 155235783Skib{ 156235783Skib connector->helper_private = __DECONST(void *, funcs); 157235783Skib} 158235783Skib 159235783Skibextern int drm_helper_resume_force_mode(struct drm_device *dev); 160235783Skibextern void drm_kms_helper_poll_init(struct drm_device *dev); 161235783Skibextern void drm_kms_helper_poll_fini(struct drm_device *dev); 162235783Skibextern void drm_helper_hpd_irq_event(struct drm_device *dev); 163282199Sdumbbellextern void drm_kms_helper_hotplug_event(struct drm_device *dev); 164235783Skib 165235783Skibextern void drm_kms_helper_poll_disable(struct drm_device *dev); 166235783Skibextern void drm_kms_helper_poll_enable(struct drm_device *dev); 167235783Skib#endif 168