65,7 → 65,7 |
MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ |
MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ |
MODE_BAD_WIDTH, /* requires an unsupported linepitch */ |
MODE_NOMODE, /* no mode with a maching name */ |
MODE_NOMODE, /* no mode with a matching name */ |
MODE_NO_INTERLACE, /* interlaced mode not supported */ |
MODE_NO_DBLESCAN, /* doublescan mode not supported */ |
MODE_NO_VSCAN, /* multiscan mode not supported */ |
183,56 → 183,27 |
SubPixelNone, |
}; |
|
|
#define DRM_COLOR_FORMAT_RGB444 (1<<0) |
#define DRM_COLOR_FORMAT_YCRCB444 (1<<1) |
#define DRM_COLOR_FORMAT_YCRCB422 (1<<2) |
/* |
* Describes a given display (e.g. CRT or flat panel) and its limitations. |
*/ |
struct drm_display_info { |
char name[DRM_DISPLAY_INFO_LEN]; |
/* Input info */ |
bool serration_vsync; |
bool sync_on_green; |
bool composite_sync; |
bool separate_syncs; |
bool blank_to_black; |
unsigned char video_level; |
bool digital; |
|
/* Physical size */ |
unsigned int width_mm; |
unsigned int height_mm; |
|
/* Display parameters */ |
unsigned char gamma; /* FIXME: storage format */ |
bool gtf_supported; |
bool standard_color; |
enum { |
monochrome = 0, |
rgb, |
other, |
unknown, |
} display_type; |
bool active_off_supported; |
bool suspend_supported; |
bool standby_supported; |
|
/* Color info FIXME: storage format */ |
unsigned short redx, redy; |
unsigned short greenx, greeny; |
unsigned short bluex, bluey; |
unsigned short whitex, whitey; |
|
/* Clock limits FIXME: storage format */ |
unsigned int min_vfreq, max_vfreq; |
unsigned int min_hfreq, max_hfreq; |
unsigned int pixel_clock; |
unsigned int bpc; |
|
/* White point indices FIXME: storage format */ |
unsigned int wpx1, wpy1; |
unsigned int wpgamma1; |
unsigned int wpx2, wpy2; |
unsigned int wpgamma2; |
|
enum subpixel_order subpixel_order; |
u32 color_formats; |
|
char *raw_edid; /* if any */ |
}; |
254,7 → 225,8 |
* the semantics and arguments have a one to one mapping |
* on this function. |
*/ |
int (*dirty)(struct drm_framebuffer *framebuffer, unsigned flags, |
int (*dirty)(struct drm_framebuffer *framebuffer, |
struct drm_file *file_priv, unsigned flags, |
unsigned color, struct drm_clip_rect *clips, |
unsigned num_clips); |
}; |
271,8 → 243,6 |
unsigned int depth; |
int bits_per_pixel; |
int flags; |
struct fb_info *fbdev; |
u32 pseudo_palette[17]; |
struct list_head filp_head; |
/* if you are using the helper */ |
void *helper_private; |
309,6 → 279,7 |
|
/** |
* drm_crtc_funcs - control CRTCs for a given device |
* @reset: reset CRTC after state has been invalidate (e.g. resume) |
* @dpms: control display power levels |
* @save: save CRTC state |
* @resore: restore CRTC state |
336,6 → 307,8 |
void (*save)(struct drm_crtc *crtc); /* suspend? */ |
/* Restore CRTC state */ |
void (*restore)(struct drm_crtc *crtc); /* resume? */ |
/* Reset CRTC state */ |
void (*reset)(struct drm_crtc *crtc); |
|
/* cursor controls */ |
int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv, |
344,7 → 317,7 |
|
/* Set gamma on the CRTC */ |
void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, |
uint32_t size); |
uint32_t start, uint32_t size); |
/* Object destroy routine */ |
void (*destroy)(struct drm_crtc *crtc); |
|
352,7 → 325,7 |
|
/* |
* Flip to the given framebuffer. This implements the page |
* flip ioctl descibed in drm_mode.h, specifically, the |
* flip ioctl described in drm_mode.h, specifically, the |
* implementation must return immediately and block all |
* rendering to the current fb until the flip has completed. |
* If userspace set the event flag in the ioctl, the event |
369,9 → 342,6 |
* @enabled: is this CRTC enabled? |
* @x: x position on screen |
* @y: y position on screen |
* @desired_mode: new desired mode |
* @desired_x: desired x for desired_mode |
* @desired_y: desired y for desired_mode |
* @funcs: CRTC control functions |
* |
* Each CRTC may have one or more connectors associated with it. This structure |
388,11 → 358,15 |
|
bool enabled; |
|
/* Requested mode from modesetting. */ |
struct drm_display_mode mode; |
|
/* Programmed mode in hw, after adjustments for encoders, |
* crtc, panel scaling etc. Needed for timestamping etc. |
*/ |
struct drm_display_mode hwmode; |
|
int x, y; |
struct drm_display_mode *desired_mode; |
int desired_x, desired_y; |
const struct drm_crtc_funcs *funcs; |
|
/* CRTC gamma size for reporting to userspace */ |
399,6 → 373,9 |
uint32_t gamma_size; |
uint16_t *gamma_store; |
|
/* Constants needed for precise vblank and swap timestamping. */ |
s64 framedur_ns, linedur_ns, pixeldur_ns; |
|
/* if you are using the helper */ |
void *helper_private; |
}; |
409,6 → 386,7 |
* @dpms: set power state (see drm_crtc_funcs above) |
* @save: save connector state |
* @restore: restore connector state |
* @reset: reset connector after state has been invalidate (e.g. resume) |
* @mode_valid: is this mode valid on the given connector? |
* @mode_fixup: try to fixup proposed mode for this connector |
* @mode_set: set this mode |
426,7 → 404,16 |
void (*dpms)(struct drm_connector *connector, int mode); |
void (*save)(struct drm_connector *connector); |
void (*restore)(struct drm_connector *connector); |
enum drm_connector_status (*detect)(struct drm_connector *connector); |
void (*reset)(struct drm_connector *connector); |
|
/* Check to see if anything is attached to the connector. |
* @force is set to false whilst polling, true when checking the |
* connector due to user request. @force can be used by the driver |
* to avoid expensive, destructive operations during automated |
* probing. |
*/ |
enum drm_connector_status (*detect)(struct drm_connector *connector, |
bool force); |
int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height); |
int (*set_property)(struct drm_connector *connector, struct drm_property *property, |
uint64_t val); |
435,6 → 422,7 |
}; |
|
struct drm_encoder_funcs { |
void (*reset)(struct drm_encoder *encoder); |
void (*destroy)(struct drm_encoder *encoder); |
}; |
|
467,6 → 455,15 |
DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ |
}; |
|
/* should we poll this connector for connects and disconnects */ |
/* hot plug detectable */ |
#define DRM_CONNECTOR_POLL_HPD (1 << 0) |
/* poll for connections */ |
#define DRM_CONNECTOR_POLL_CONNECT (1 << 1) |
/* can cleanly poll for disconnections without flickering the screen */ |
/* DACs should rarely do this without a lot of testing */ |
#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) |
|
/** |
* drm_connector - central DRM connector control structure |
* @crtc: CRTC this connector is currently connected to, NULL if none |
485,7 → 482,7 |
*/ |
struct drm_connector { |
struct drm_device *dev; |
// struct device kdev; |
struct device kdev; |
struct device_attribute *attr; |
struct list_head head; |
|
511,6 → 508,8 |
u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY]; |
uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY]; |
|
uint8_t polled; /* DRM_CONNECTOR_POLL_* */ |
|
/* requested DPMS state */ |
int dpms; |
|
521,7 → 520,6 |
uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER]; |
uint32_t force_encoder_id; |
struct drm_encoder *encoder; /* currently active encoder */ |
void *fb_helper_private; |
}; |
|
/** |
548,16 → 546,10 |
|
/** |
* struct drm_mode_config_funcs - configure CRTCs for a given screen layout |
* @resize: adjust CRTCs as necessary for the proposed layout |
* |
* Currently only a resize hook is available. DRM will call back into the |
* driver with a new screen width and height. If the driver can't support |
* the proposed size, it can return false. Otherwise it should adjust |
* the CRTC<->connector mappings as needed and update its view of the screen. |
*/ |
struct drm_mode_config_funcs { |
struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd); |
int (*fb_changed)(struct drm_device *dev); |
void (*output_poll_changed)(struct drm_device *dev); |
}; |
|
struct drm_mode_group { |
590,14 → 582,15 |
|
struct list_head property_list; |
|
/* in-kernel framebuffers - hung of filp_head in drm_framebuffer */ |
struct list_head fb_kernel_list; |
|
int min_width, min_height; |
int max_width, max_height; |
struct drm_mode_config_funcs *funcs; |
resource_size_t fb_base; |
|
/* output poll support */ |
bool poll_enabled; |
// struct delayed_work output_poll_work; |
|
/* pointers to standard properties */ |
struct list_head property_blob_list; |
struct drm_property *edid_property; |
666,15 → 659,14 |
extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); |
extern struct edid *drm_get_edid(struct drm_connector *connector, |
struct i2c_adapter *adapter); |
//extern int drm_do_probe_ddc_edid(struct i2c_adapter *adapter, |
// unsigned char *buf, int len); |
extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); |
extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); |
extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode); |
extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, |
struct drm_display_mode *mode); |
const struct drm_display_mode *mode); |
extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode); |
extern void drm_mode_config_init(struct drm_device *dev); |
extern void drm_mode_config_reset(struct drm_device *dev); |
extern void drm_mode_config_cleanup(struct drm_device *dev); |
extern void drm_mode_set_name(struct drm_display_mode *mode); |
extern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2); |
697,8 → 689,8 |
extern void drm_mode_prune_invalid(struct drm_device *dev, |
struct list_head *mode_list, bool verbose); |
extern void drm_mode_sort(struct list_head *mode_list); |
extern int drm_mode_hsync(struct drm_display_mode *mode); |
extern int drm_mode_vrefresh(struct drm_display_mode *mode); |
extern int drm_mode_hsync(const struct drm_display_mode *mode); |
extern int drm_mode_vrefresh(const struct drm_display_mode *mode); |
extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, |
int adjust_flags); |
extern void drm_mode_connector_list_update(struct drm_connector *connector); |
790,7 → 782,9 |
void *data, struct drm_file *file_priv); |
extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, |
void *data, struct drm_file *file_priv); |
extern u8 *drm_find_cea_extension(struct edid *edid); |
extern bool drm_detect_hdmi_monitor(struct edid *edid); |
extern bool drm_detect_monitor_audio(struct edid *edid); |
extern int drm_mode_page_flip_ioctl(struct drm_device *dev, |
void *data, struct drm_file *file_priv); |
extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, |
799,8 → 793,14 |
extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, |
int hdisplay, int vdisplay, int vrefresh, |
bool interlaced, int margins); |
extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, |
int hdisplay, int vdisplay, int vrefresh, |
bool interlaced, int margins, int GTF_M, |
int GTF_2C, int GTF_K, int GTF_2J); |
extern int drm_add_modes_noedid(struct drm_connector *connector, |
int hdisplay, int vdisplay); |
|
extern bool drm_edid_is_valid(struct edid *edid); |
struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, |
int hsize, int vsize, int fresh); |
#endif /* __DRM_CRTC_H__ */ |