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 43235783Skibstruct drm_crtc_helper_funcs { 44235783Skib /* 45235783Skib * Control power levels on the CRTC. If the mode passed in is 46235783Skib * unsupported, the provider must use the next lowest power level. 47235783Skib */ 48235783Skib void (*dpms)(struct drm_crtc *crtc, int mode); 49235783Skib void (*prepare)(struct drm_crtc *crtc); 50235783Skib void (*commit)(struct drm_crtc *crtc); 51235783Skib 52235783Skib /* Provider can fixup or change mode timings before modeset occurs */ 53235783Skib bool (*mode_fixup)(struct drm_crtc *crtc, 54254797Sdumbbell const struct drm_display_mode *mode, 55235783Skib struct drm_display_mode *adjusted_mode); 56235783Skib /* Actually set the mode */ 57235783Skib int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, 58235783Skib struct drm_display_mode *adjusted_mode, int x, int y, 59235783Skib struct drm_framebuffer *old_fb); 60235783Skib 61235783Skib /* Move the crtc on the current fb to the given position *optional* */ 62235783Skib int (*mode_set_base)(struct drm_crtc *crtc, int x, int y, 63235783Skib struct drm_framebuffer *old_fb); 64235783Skib int (*mode_set_base_atomic)(struct drm_crtc *crtc, 65235783Skib struct drm_framebuffer *fb, int x, int y, 66235783Skib enum mode_set_atomic); 67235783Skib 68235783Skib /* reload the current crtc LUT */ 69235783Skib void (*load_lut)(struct drm_crtc *crtc); 70235783Skib 71235783Skib /* disable crtc when not in use - more explicit than dpms off */ 72235783Skib void (*disable)(struct drm_crtc *crtc); 73235783Skib}; 74235783Skib 75235783Skibstruct drm_encoder_helper_funcs { 76235783Skib void (*dpms)(struct drm_encoder *encoder, int mode); 77235783Skib void (*save)(struct drm_encoder *encoder); 78235783Skib void (*restore)(struct drm_encoder *encoder); 79235783Skib 80235783Skib bool (*mode_fixup)(struct drm_encoder *encoder, 81254797Sdumbbell const struct drm_display_mode *mode, 82235783Skib struct drm_display_mode *adjusted_mode); 83235783Skib void (*prepare)(struct drm_encoder *encoder); 84235783Skib void (*commit)(struct drm_encoder *encoder); 85235783Skib void (*mode_set)(struct drm_encoder *encoder, 86235783Skib struct drm_display_mode *mode, 87235783Skib struct drm_display_mode *adjusted_mode); 88235783Skib struct drm_crtc *(*get_crtc)(struct drm_encoder *encoder); 89235783Skib /* detect for DAC style encoders */ 90235783Skib enum drm_connector_status (*detect)(struct drm_encoder *encoder, 91235783Skib struct drm_connector *connector); 92235783Skib /* disable encoder when not in use - more explicit than dpms off */ 93235783Skib void (*disable)(struct drm_encoder *encoder); 94235783Skib}; 95235783Skib 96235783Skibstruct drm_connector_helper_funcs { 97235783Skib int (*get_modes)(struct drm_connector *connector); 98235783Skib int (*mode_valid)(struct drm_connector *connector, 99235783Skib struct drm_display_mode *mode); 100235783Skib struct drm_encoder *(*best_encoder)(struct drm_connector *connector); 101235783Skib}; 102235783Skib 103235783Skibextern int drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY); 104235783Skibextern void drm_helper_disable_unused_functions(struct drm_device *dev); 105235783Skibextern int drm_crtc_helper_set_config(struct drm_mode_set *set); 106235783Skibextern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, 107235783Skib struct drm_display_mode *mode, 108235783Skib int x, int y, 109235783Skib struct drm_framebuffer *old_fb); 110235783Skibextern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); 111235783Skibextern bool drm_helper_encoder_in_use(struct drm_encoder *encoder); 112235783Skib 113235783Skibextern void drm_helper_connector_dpms(struct drm_connector *connector, int mode); 114235783Skib 115235783Skibextern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, 116235783Skib struct drm_mode_fb_cmd2 *mode_cmd); 117235783Skib 118235783Skibstatic inline void drm_crtc_helper_add(struct drm_crtc *crtc, 119235783Skib const struct drm_crtc_helper_funcs *funcs) 120235783Skib{ 121235783Skib crtc->helper_private = __DECONST(void *, funcs); 122235783Skib} 123235783Skib 124235783Skibstatic inline void drm_encoder_helper_add(struct drm_encoder *encoder, 125235783Skib const struct drm_encoder_helper_funcs *funcs) 126235783Skib{ 127235783Skib encoder->helper_private = __DECONST(void *, funcs); 128235783Skib} 129235783Skib 130235783Skibstatic inline void drm_connector_helper_add(struct drm_connector *connector, 131235783Skib const struct drm_connector_helper_funcs *funcs) 132235783Skib{ 133235783Skib connector->helper_private = __DECONST(void *, funcs); 134235783Skib} 135235783Skib 136235783Skibextern int drm_helper_resume_force_mode(struct drm_device *dev); 137235783Skibextern void drm_kms_helper_poll_init(struct drm_device *dev); 138235783Skibextern void drm_kms_helper_poll_fini(struct drm_device *dev); 139235783Skibextern void drm_helper_hpd_irq_event(struct drm_device *dev); 140235783Skib 141235783Skibextern void drm_kms_helper_poll_disable(struct drm_device *dev); 142235783Skibextern void drm_kms_helper_poll_enable(struct drm_device *dev); 143235783Skib 144235783Skibextern bool drm_fetch_cmdline_mode_from_kenv(struct drm_connector *connector, 145235783Skib struct drm_cmdline_mode *cmdline_mode); 146235783Skib#endif 147