39,6 → 39,8 |
|
#include <linux/fb.h> |
|
#include <drm/drm_crtc.h> |
|
enum mode_set_atomic { |
LEAVE_ATOMIC_MODE_SET, |
ENTER_ATOMIC_MODE_SET, |
45,11 → 47,30 |
}; |
|
/** |
* drm_crtc_helper_funcs - helper operations for CRTCs |
* @mode_fixup: try to fixup proposed mode for this connector |
* struct drm_crtc_helper_funcs - helper operations for CRTCs |
* @dpms: set power state |
* @prepare: prepare the CRTC, called before @mode_set |
* @commit: commit changes to CRTC, called after @mode_set |
* @mode_fixup: try to fixup proposed mode for this CRTC |
* @mode_set: set this mode |
* @mode_set_nofb: set mode only (no scanout buffer attached) |
* @mode_set_base: update the scanout buffer |
* @mode_set_base_atomic: non-blocking mode set (used for kgdb support) |
* @load_lut: load color palette |
* @disable: disable CRTC when no longer in use |
* @enable: enable CRTC |
* @atomic_check: check for validity of an atomic state |
* @atomic_begin: begin atomic update |
* @atomic_flush: flush atomic update |
* |
* The helper operations are called by the mid-layer CRTC helper. |
* |
* Note that with atomic helpers @dpms, @prepare and @commit hooks are |
* deprecated. Used @enable and @disable instead exclusively. |
* |
* With legacy crtc helpers there's a big semantic difference between @disable |
* and the other hooks: @disable also needs to release any resources acquired in |
* @mode_set (like shared PLLs). |
*/ |
struct drm_crtc_helper_funcs { |
/* |
68,6 → 89,7 |
int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, |
struct drm_display_mode *adjusted_mode, int x, int y, |
struct drm_framebuffer *old_fb); |
/* Actually set the mode for atomic helpers, optional */ |
void (*mode_set_nofb)(struct drm_crtc *crtc); |
|
/* Move the crtc on the current fb to the given position *optional* */ |
80,22 → 102,41 |
/* reload the current crtc LUT */ |
void (*load_lut)(struct drm_crtc *crtc); |
|
/* disable crtc when not in use - more explicit than dpms off */ |
void (*disable)(struct drm_crtc *crtc); |
void (*enable)(struct drm_crtc *crtc); |
|
/* atomic helpers */ |
int (*atomic_check)(struct drm_crtc *crtc, |
struct drm_crtc_state *state); |
void (*atomic_begin)(struct drm_crtc *crtc); |
void (*atomic_flush)(struct drm_crtc *crtc); |
void (*atomic_begin)(struct drm_crtc *crtc, |
struct drm_crtc_state *old_crtc_state); |
void (*atomic_flush)(struct drm_crtc *crtc, |
struct drm_crtc_state *old_crtc_state); |
}; |
|
/** |
* drm_encoder_helper_funcs - helper operations for encoders |
* struct drm_encoder_helper_funcs - helper operations for encoders |
* @dpms: set power state |
* @save: save connector state |
* @restore: restore connector state |
* @mode_fixup: try to fixup proposed mode for this connector |
* @mode_set: set this mode |
* @prepare: part of the disable sequence, called before the CRTC modeset |
* @commit: called after the CRTC modeset |
* @mode_set: set this mode, optional for atomic helpers |
* @get_crtc: return CRTC that the encoder is currently attached to |
* @detect: connection status detection |
* @disable: disable encoder when not in use (overrides DPMS off) |
* @enable: enable encoder |
* @atomic_check: check for validity of an atomic update |
* |
* The helper operations are called by the mid-layer CRTC helper. |
* |
* Note that with atomic helpers @dpms, @prepare and @commit hooks are |
* deprecated. Used @enable and @disable instead exclusively. |
* |
* With legacy crtc helpers there's a big semantic difference between @disable |
* and the other hooks: @disable also needs to release any resources acquired in |
* @mode_set (like shared PLLs). |
*/ |
struct drm_encoder_helper_funcs { |
void (*dpms)(struct drm_encoder *encoder, int mode); |
114,14 → 155,22 |
/* detect for DAC style encoders */ |
enum drm_connector_status (*detect)(struct drm_encoder *encoder, |
struct drm_connector *connector); |
/* disable encoder when not in use - more explicit than dpms off */ |
void (*disable)(struct drm_encoder *encoder); |
|
void (*enable)(struct drm_encoder *encoder); |
|
/* atomic helpers */ |
int (*atomic_check)(struct drm_encoder *encoder, |
struct drm_crtc_state *crtc_state, |
struct drm_connector_state *conn_state); |
}; |
|
/** |
* drm_connector_helper_funcs - helper operations for connectors |
* struct drm_connector_helper_funcs - helper operations for connectors |
* @get_modes: get mode list for this connector |
* @mode_valid (optional): is this mode valid on the given connector? |
* @mode_valid: is this mode valid on the given connector? (optional) |
* @best_encoder: return the preferred encoder for this connector |
* @atomic_best_encoder: atomic version of @best_encoder |
* |
* The helper operations are called by the mid-layer CRTC helper. |
*/ |
130,6 → 179,8 |
enum drm_mode_status (*mode_valid)(struct drm_connector *connector, |
struct drm_display_mode *mode); |
struct drm_encoder *(*best_encoder)(struct drm_connector *connector); |
struct drm_encoder *(*atomic_best_encoder)(struct drm_connector *connector, |
struct drm_connector_state *connector_state); |
}; |
|
extern void drm_helper_disable_unused_functions(struct drm_device *dev); |
141,7 → 192,7 |
extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); |
extern bool drm_helper_encoder_in_use(struct drm_encoder *encoder); |
|
extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode); |
extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode); |
|
extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); |
|
151,19 → 202,19 |
static inline void drm_crtc_helper_add(struct drm_crtc *crtc, |
const struct drm_crtc_helper_funcs *funcs) |
{ |
crtc->helper_private = (void *)funcs; |
crtc->helper_private = funcs; |
} |
|
static inline void drm_encoder_helper_add(struct drm_encoder *encoder, |
const struct drm_encoder_helper_funcs *funcs) |
{ |
encoder->helper_private = (void *)funcs; |
encoder->helper_private = funcs; |
} |
|
static inline void drm_connector_helper_add(struct drm_connector *connector, |
const struct drm_connector_helper_funcs *funcs) |
{ |
connector->helper_private = (void *)funcs; |
connector->helper_private = funcs; |
} |
|
extern void drm_helper_resume_force_mode(struct drm_device *dev); |
189,5 → 240,6 |
|
extern void drm_kms_helper_poll_disable(struct drm_device *dev); |
extern void drm_kms_helper_poll_enable(struct drm_device *dev); |
extern void drm_kms_helper_poll_enable_locked(struct drm_device *dev); |
|
#endif |