diff options
| author | Dave Airlie <airlied@redhat.com> | 2014-03-18 05:09:10 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-03-18 05:09:10 -0400 |
| commit | 978c6050165bba52eab7ef3581d447eb215def77 (patch) | |
| tree | f34ccf67a789fe7e8ec88b054b33a6c2e688fdf7 /include | |
| parent | 8ad2bc9796994ecba9f4ba2fc9abca27ee9d193d (diff) | |
| parent | fc1645ac826c82ebad4402aabbf65595b671ecca (diff) | |
Merge branch 'drm-docs' of ssh://people.freedesktop.org/~danvet/drm into drm-next
Here's my drm documentation update and driver api polish pull request.
Alex reviewed the entire pile, I've applied a little bit of spelling
polish in a few places since then and otherwise the Usual Suspects (David,
Rob, ...) don't seem up to have another look at it (I've poked them on
irc). So I think it's as good as it gets ;-)
Note that I've dropped the final imx breaker patch since that's blocked on
imx getting sane. Once that's landed I'll ping you to pick up that
straggler.
* 'drm-docs' of ssh://people.freedesktop.org/~danvet/drm: (34 commits)
drm/imx: remove drm_mode_connector_detach_encoder harder
drm: kerneldoc polish for drm_crtc.c
drm: kerneldoc polish for drm_crtc_helper.c
drm: drop error code for drm_helper_resume_force_mode
drm/crtc-helper: remove LOCKING from kerneldoc
drm: remove return value from drm_helper_mode_fill_fb_struct
drm/doc: Fix misplaced </para>
drm: remove drm_display_mode->private_size
drm: polish function kerneldoc for drm_modes.[hc]
drm/modes: drop maxPitch from drm_mode_validate_size
drm/modes: drop return value from drm_display_mode_from_videomode
drm/modes: remove drm_mode_height/width
drm: extract drm_modes.h for drm_crtc.h functions
drm: move drm_mode related functions into drm_modes.c
drm/doc: Repleace LOCKING kerneldoc sections in drm_modes.c
drm/doc: Integrate drm_modes.c kerneldoc
drm/kms: rip out drm_mode_connector_detach_encoder
drm/doc: Add function reference documentation for drm_mm.c
drm/doc: Overview documentation for drm_mm.c
drm/mm: Remove MM_UNUSED_TARGET
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/drm/drmP.h | 29 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 174 | ||||
| -rw-r--r-- | include/drm/drm_crtc_helper.h | 6 | ||||
| -rw-r--r-- | include/drm/drm_mm.h | 154 | ||||
| -rw-r--r-- | include/drm/drm_modes.h | 237 | ||||
| -rw-r--r-- | include/linux/hdmi.h | 12 |
6 files changed, 384 insertions, 228 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 538079030be0..319ec1eb0372 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
| @@ -1056,21 +1056,6 @@ struct drm_minor { | |||
| 1056 | struct drm_mode_group mode_group; | 1056 | struct drm_mode_group mode_group; |
| 1057 | }; | 1057 | }; |
| 1058 | 1058 | ||
| 1059 | /* mode specified on the command line */ | ||
| 1060 | struct drm_cmdline_mode { | ||
| 1061 | bool specified; | ||
| 1062 | bool refresh_specified; | ||
| 1063 | bool bpp_specified; | ||
| 1064 | int xres, yres; | ||
| 1065 | int bpp; | ||
| 1066 | int refresh; | ||
| 1067 | bool rb; | ||
| 1068 | bool interlace; | ||
| 1069 | bool cvt; | ||
| 1070 | bool margins; | ||
| 1071 | enum drm_connector_force force; | ||
| 1072 | }; | ||
| 1073 | |||
| 1074 | 1059 | ||
| 1075 | struct drm_pending_vblank_event { | 1060 | struct drm_pending_vblank_event { |
| 1076 | struct drm_pending_event base; | 1061 | struct drm_pending_event base; |
| @@ -1417,20 +1402,6 @@ extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, | |||
| 1417 | extern void drm_calc_timestamping_constants(struct drm_crtc *crtc, | 1402 | extern void drm_calc_timestamping_constants(struct drm_crtc *crtc, |
| 1418 | const struct drm_display_mode *mode); | 1403 | const struct drm_display_mode *mode); |
| 1419 | 1404 | ||
| 1420 | extern bool | ||
| 1421 | drm_mode_parse_command_line_for_connector(const char *mode_option, | ||
| 1422 | struct drm_connector *connector, | ||
| 1423 | struct drm_cmdline_mode *mode); | ||
| 1424 | |||
| 1425 | extern struct drm_display_mode * | ||
| 1426 | drm_mode_create_from_cmdline_mode(struct drm_device *dev, | ||
| 1427 | struct drm_cmdline_mode *cmd); | ||
| 1428 | |||
| 1429 | extern int drm_display_mode_from_videomode(const struct videomode *vm, | ||
| 1430 | struct drm_display_mode *dmode); | ||
| 1431 | extern int of_get_drm_display_mode(struct device_node *np, | ||
| 1432 | struct drm_display_mode *dmode, | ||
| 1433 | int index); | ||
| 1434 | 1405 | ||
| 1435 | /* Modesetting support */ | 1406 | /* Modesetting support */ |
| 1436 | extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); | 1407 | extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index f7646548660d..27f828c9d7f2 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | #include <linux/fb.h> | 32 | #include <linux/fb.h> |
| 33 | #include <linux/hdmi.h> | 33 | #include <linux/hdmi.h> |
| 34 | #include <drm/drm_mode.h> | 34 | #include <drm/drm_mode.h> |
| 35 | |||
| 36 | #include <drm/drm_fourcc.h> | 35 | #include <drm/drm_fourcc.h> |
| 37 | 36 | ||
| 38 | struct drm_device; | 37 | struct drm_device; |
| @@ -65,130 +64,14 @@ struct drm_object_properties { | |||
| 65 | uint64_t values[DRM_OBJECT_MAX_PROPERTY]; | 64 | uint64_t values[DRM_OBJECT_MAX_PROPERTY]; |
| 66 | }; | 65 | }; |
| 67 | 66 | ||
| 68 | /* | 67 | enum drm_connector_force { |
| 69 | * Note on terminology: here, for brevity and convenience, we refer to connector | 68 | DRM_FORCE_UNSPECIFIED, |
| 70 | * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS, | 69 | DRM_FORCE_OFF, |
| 71 | * DVI, etc. And 'screen' refers to the whole of the visible display, which | 70 | DRM_FORCE_ON, /* force on analog part normally */ |
| 72 | * may span multiple monitors (and therefore multiple CRTC and connector | 71 | DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ |
| 73 | * structures). | ||
| 74 | */ | ||
| 75 | |||
| 76 | enum drm_mode_status { | ||
| 77 | MODE_OK = 0, /* Mode OK */ | ||
| 78 | MODE_HSYNC, /* hsync out of range */ | ||
| 79 | MODE_VSYNC, /* vsync out of range */ | ||
| 80 | MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 81 | MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 82 | MODE_BAD_WIDTH, /* requires an unsupported linepitch */ | ||
| 83 | MODE_NOMODE, /* no mode with a matching name */ | ||
| 84 | MODE_NO_INTERLACE, /* interlaced mode not supported */ | ||
| 85 | MODE_NO_DBLESCAN, /* doublescan mode not supported */ | ||
| 86 | MODE_NO_VSCAN, /* multiscan mode not supported */ | ||
| 87 | MODE_MEM, /* insufficient video memory */ | ||
| 88 | MODE_VIRTUAL_X, /* mode width too large for specified virtual size */ | ||
| 89 | MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */ | ||
| 90 | MODE_MEM_VIRT, /* insufficient video memory given virtual size */ | ||
| 91 | MODE_NOCLOCK, /* no fixed clock available */ | ||
| 92 | MODE_CLOCK_HIGH, /* clock required is too high */ | ||
| 93 | MODE_CLOCK_LOW, /* clock required is too low */ | ||
| 94 | MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */ | ||
| 95 | MODE_BAD_HVALUE, /* horizontal timing was out of range */ | ||
| 96 | MODE_BAD_VVALUE, /* vertical timing was out of range */ | ||
| 97 | MODE_BAD_VSCAN, /* VScan value out of range */ | ||
| 98 | MODE_HSYNC_NARROW, /* horizontal sync too narrow */ | ||
| 99 | MODE_HSYNC_WIDE, /* horizontal sync too wide */ | ||
| 100 | MODE_HBLANK_NARROW, /* horizontal blanking too narrow */ | ||
| 101 | MODE_HBLANK_WIDE, /* horizontal blanking too wide */ | ||
| 102 | MODE_VSYNC_NARROW, /* vertical sync too narrow */ | ||
| 103 | MODE_VSYNC_WIDE, /* vertical sync too wide */ | ||
| 104 | MODE_VBLANK_NARROW, /* vertical blanking too narrow */ | ||
| 105 | MODE_VBLANK_WIDE, /* vertical blanking too wide */ | ||
| 106 | MODE_PANEL, /* exceeds panel dimensions */ | ||
| 107 | MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ | ||
| 108 | MODE_ONE_WIDTH, /* only one width is supported */ | ||
| 109 | MODE_ONE_HEIGHT, /* only one height is supported */ | ||
| 110 | MODE_ONE_SIZE, /* only one resolution is supported */ | ||
| 111 | MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */ | ||
| 112 | MODE_NO_STEREO, /* stereo modes not supported */ | ||
| 113 | MODE_UNVERIFIED = -3, /* mode needs to reverified */ | ||
| 114 | MODE_BAD = -2, /* unspecified reason */ | ||
| 115 | MODE_ERROR = -1 /* error condition */ | ||
| 116 | }; | ||
| 117 | |||
| 118 | #define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ | ||
| 119 | DRM_MODE_TYPE_CRTC_C) | ||
| 120 | |||
| 121 | #define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ | ||
| 122 | .name = nm, .status = 0, .type = (t), .clock = (c), \ | ||
| 123 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ | ||
| 124 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ | ||
| 125 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ | ||
| 126 | .vscan = (vs), .flags = (f), \ | ||
| 127 | .base.type = DRM_MODE_OBJECT_MODE | ||
| 128 | |||
| 129 | #define CRTC_INTERLACE_HALVE_V (1 << 0) /* halve V values for interlacing */ | ||
| 130 | #define CRTC_STEREO_DOUBLE (1 << 1) /* adjust timings for stereo modes */ | ||
| 131 | |||
| 132 | #define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF | ||
| 133 | |||
| 134 | struct drm_display_mode { | ||
| 135 | /* Header */ | ||
| 136 | struct list_head head; | ||
| 137 | struct drm_mode_object base; | ||
| 138 | |||
| 139 | char name[DRM_DISPLAY_MODE_LEN]; | ||
| 140 | |||
| 141 | enum drm_mode_status status; | ||
| 142 | unsigned int type; | ||
| 143 | |||
| 144 | /* Proposed mode values */ | ||
| 145 | int clock; /* in kHz */ | ||
| 146 | int hdisplay; | ||
| 147 | int hsync_start; | ||
| 148 | int hsync_end; | ||
| 149 | int htotal; | ||
| 150 | int hskew; | ||
| 151 | int vdisplay; | ||
| 152 | int vsync_start; | ||
| 153 | int vsync_end; | ||
| 154 | int vtotal; | ||
| 155 | int vscan; | ||
| 156 | unsigned int flags; | ||
| 157 | |||
| 158 | /* Addressable image size (may be 0 for projectors, etc.) */ | ||
| 159 | int width_mm; | ||
| 160 | int height_mm; | ||
| 161 | |||
| 162 | /* Actual mode we give to hw */ | ||
| 163 | int crtc_clock; /* in KHz */ | ||
| 164 | int crtc_hdisplay; | ||
| 165 | int crtc_hblank_start; | ||
| 166 | int crtc_hblank_end; | ||
| 167 | int crtc_hsync_start; | ||
| 168 | int crtc_hsync_end; | ||
| 169 | int crtc_htotal; | ||
| 170 | int crtc_hskew; | ||
| 171 | int crtc_vdisplay; | ||
| 172 | int crtc_vblank_start; | ||
| 173 | int crtc_vblank_end; | ||
| 174 | int crtc_vsync_start; | ||
| 175 | int crtc_vsync_end; | ||
| 176 | int crtc_vtotal; | ||
| 177 | |||
| 178 | /* Driver private mode info */ | ||
| 179 | int private_size; | ||
| 180 | int *private; | ||
| 181 | int private_flags; | ||
| 182 | |||
| 183 | int vrefresh; /* in Hz */ | ||
| 184 | int hsync; /* in kHz */ | ||
| 185 | enum hdmi_picture_aspect picture_aspect_ratio; | ||
| 186 | }; | 72 | }; |
| 187 | 73 | ||
| 188 | static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode) | 74 | #include <drm/drm_modes.h> |
| 189 | { | ||
| 190 | return mode->flags & DRM_MODE_FLAG_3D_MASK; | ||
| 191 | } | ||
| 192 | 75 | ||
| 193 | enum drm_connector_status { | 76 | enum drm_connector_status { |
| 194 | connector_status_connected = 1, | 77 | connector_status_connected = 1, |
| @@ -540,13 +423,6 @@ struct drm_encoder { | |||
| 540 | void *helper_private; | 423 | void *helper_private; |
| 541 | }; | 424 | }; |
| 542 | 425 | ||
| 543 | enum drm_connector_force { | ||
| 544 | DRM_FORCE_UNSPECIFIED, | ||
| 545 | DRM_FORCE_OFF, | ||
| 546 | DRM_FORCE_ON, /* force on analog part normally */ | ||
| 547 | DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ | ||
| 548 | }; | ||
| 549 | |||
| 550 | /* should we poll this connector for connects and disconnects */ | 426 | /* should we poll this connector for connects and disconnects */ |
| 551 | /* hot plug detectable */ | 427 | /* hot plug detectable */ |
| 552 | #define DRM_CONNECTOR_POLL_HPD (1 << 0) | 428 | #define DRM_CONNECTOR_POLL_HPD (1 << 0) |
| @@ -1007,34 +883,10 @@ extern struct edid *drm_get_edid(struct drm_connector *connector, | |||
| 1007 | struct i2c_adapter *adapter); | 883 | struct i2c_adapter *adapter); |
| 1008 | extern struct edid *drm_edid_duplicate(const struct edid *edid); | 884 | extern struct edid *drm_edid_duplicate(const struct edid *edid); |
| 1009 | extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); | 885 | extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); |
| 1010 | extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); | ||
| 1011 | extern void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src); | ||
| 1012 | extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | ||
| 1013 | const struct drm_display_mode *mode); | ||
| 1014 | extern void drm_mode_debug_printmodeline(const struct drm_display_mode *mode); | ||
| 1015 | extern void drm_mode_config_init(struct drm_device *dev); | 886 | extern void drm_mode_config_init(struct drm_device *dev); |
| 1016 | extern void drm_mode_config_reset(struct drm_device *dev); | 887 | extern void drm_mode_config_reset(struct drm_device *dev); |
| 1017 | extern void drm_mode_config_cleanup(struct drm_device *dev); | 888 | extern void drm_mode_config_cleanup(struct drm_device *dev); |
| 1018 | extern void drm_mode_set_name(struct drm_display_mode *mode); | 889 | |
| 1019 | extern bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2); | ||
| 1020 | extern bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2); | ||
| 1021 | extern int drm_mode_width(const struct drm_display_mode *mode); | ||
| 1022 | extern int drm_mode_height(const struct drm_display_mode *mode); | ||
| 1023 | |||
| 1024 | /* for us by fb module */ | ||
| 1025 | extern struct drm_display_mode *drm_mode_create(struct drm_device *dev); | ||
| 1026 | extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); | ||
| 1027 | extern void drm_mode_validate_size(struct drm_device *dev, | ||
| 1028 | struct list_head *mode_list, | ||
| 1029 | int maxX, int maxY, int maxPitch); | ||
| 1030 | extern void drm_mode_prune_invalid(struct drm_device *dev, | ||
| 1031 | struct list_head *mode_list, bool verbose); | ||
| 1032 | extern void drm_mode_sort(struct list_head *mode_list); | ||
| 1033 | extern int drm_mode_hsync(const struct drm_display_mode *mode); | ||
| 1034 | extern int drm_mode_vrefresh(const struct drm_display_mode *mode); | ||
| 1035 | extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, | ||
| 1036 | int adjust_flags); | ||
| 1037 | extern void drm_mode_connector_list_update(struct drm_connector *connector); | ||
| 1038 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, | 890 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, |
| 1039 | struct edid *edid); | 891 | struct edid *edid); |
| 1040 | extern int drm_object_property_set_value(struct drm_mode_object *obj, | 892 | extern int drm_object_property_set_value(struct drm_mode_object *obj, |
| @@ -1082,8 +934,6 @@ extern const char *drm_get_encoder_name(const struct drm_encoder *encoder); | |||
| 1082 | 934 | ||
| 1083 | extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, | 935 | extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, |
| 1084 | struct drm_encoder *encoder); | 936 | struct drm_encoder *encoder); |
| 1085 | extern void drm_mode_connector_detach_encoder(struct drm_connector *connector, | ||
| 1086 | struct drm_encoder *encoder); | ||
| 1087 | extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, | 937 | extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, |
| 1088 | int gamma_size); | 938 | int gamma_size); |
| 1089 | extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev, | 939 | extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev, |
| @@ -1138,16 +988,6 @@ extern bool drm_detect_monitor_audio(struct edid *edid); | |||
| 1138 | extern bool drm_rgb_quant_range_selectable(struct edid *edid); | 988 | extern bool drm_rgb_quant_range_selectable(struct edid *edid); |
| 1139 | extern int drm_mode_page_flip_ioctl(struct drm_device *dev, | 989 | extern int drm_mode_page_flip_ioctl(struct drm_device *dev, |
| 1140 | void *data, struct drm_file *file_priv); | 990 | void *data, struct drm_file *file_priv); |
| 1141 | extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, | ||
| 1142 | int hdisplay, int vdisplay, int vrefresh, | ||
| 1143 | bool reduced, bool interlaced, bool margins); | ||
| 1144 | extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, | ||
| 1145 | int hdisplay, int vdisplay, int vrefresh, | ||
| 1146 | bool interlaced, int margins); | ||
| 1147 | extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, | ||
| 1148 | int hdisplay, int vdisplay, int vrefresh, | ||
| 1149 | bool interlaced, int margins, int GTF_M, | ||
| 1150 | int GTF_2C, int GTF_K, int GTF_2J); | ||
| 1151 | extern int drm_add_modes_noedid(struct drm_connector *connector, | 991 | extern int drm_add_modes_noedid(struct drm_connector *connector, |
| 1152 | int hdisplay, int vdisplay); | 992 | int hdisplay, int vdisplay); |
| 1153 | extern void drm_set_preferred_mode(struct drm_connector *connector, | 993 | extern void drm_set_preferred_mode(struct drm_connector *connector, |
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index b1388b5fe7ac..0bb34ca2ad2b 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h | |||
| @@ -139,8 +139,8 @@ extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode) | |||
| 139 | 139 | ||
| 140 | extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); | 140 | extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); |
| 141 | 141 | ||
| 142 | extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | 142 | extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, |
| 143 | struct drm_mode_fb_cmd2 *mode_cmd); | 143 | struct drm_mode_fb_cmd2 *mode_cmd); |
| 144 | 144 | ||
| 145 | static inline void drm_crtc_helper_add(struct drm_crtc *crtc, | 145 | static inline void drm_crtc_helper_add(struct drm_crtc *crtc, |
| 146 | const struct drm_crtc_helper_funcs *funcs) | 146 | const struct drm_crtc_helper_funcs *funcs) |
| @@ -160,7 +160,7 @@ static inline void drm_connector_helper_add(struct drm_connector *connector, | |||
| 160 | connector->helper_private = (void *)funcs; | 160 | connector->helper_private = (void *)funcs; |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | extern int drm_helper_resume_force_mode(struct drm_device *dev); | 163 | extern void drm_helper_resume_force_mode(struct drm_device *dev); |
| 164 | extern void drm_kms_helper_poll_init(struct drm_device *dev); | 164 | extern void drm_kms_helper_poll_init(struct drm_device *dev); |
| 165 | extern void drm_kms_helper_poll_fini(struct drm_device *dev); | 165 | extern void drm_kms_helper_poll_fini(struct drm_device *dev); |
| 166 | extern bool drm_helper_hpd_irq_event(struct drm_device *dev); | 166 | extern bool drm_helper_hpd_irq_event(struct drm_device *dev); |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index cba67865d18f..8b6981ab3fcf 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
| @@ -85,11 +85,31 @@ struct drm_mm { | |||
| 85 | unsigned long *start, unsigned long *end); | 85 | unsigned long *start, unsigned long *end); |
| 86 | }; | 86 | }; |
| 87 | 87 | ||
| 88 | /** | ||
| 89 | * drm_mm_node_allocated - checks whether a node is allocated | ||
| 90 | * @node: drm_mm_node to check | ||
| 91 | * | ||
| 92 | * Drivers should use this helpers for proper encapusulation of drm_mm | ||
| 93 | * internals. | ||
| 94 | * | ||
| 95 | * Returns: | ||
| 96 | * True if the @node is allocated. | ||
| 97 | */ | ||
| 88 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) | 98 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) |
| 89 | { | 99 | { |
| 90 | return node->allocated; | 100 | return node->allocated; |
| 91 | } | 101 | } |
| 92 | 102 | ||
| 103 | /** | ||
| 104 | * drm_mm_initialized - checks whether an allocator is initialized | ||
| 105 | * @mm: drm_mm to check | ||
| 106 | * | ||
| 107 | * Drivers should use this helpers for proper encapusulation of drm_mm | ||
| 108 | * internals. | ||
| 109 | * | ||
| 110 | * Returns: | ||
| 111 | * True if the @mm is initialized. | ||
| 112 | */ | ||
| 93 | static inline bool drm_mm_initialized(struct drm_mm *mm) | 113 | static inline bool drm_mm_initialized(struct drm_mm *mm) |
| 94 | { | 114 | { |
| 95 | return mm->hole_stack.next; | 115 | return mm->hole_stack.next; |
| @@ -100,6 +120,17 @@ static inline unsigned long __drm_mm_hole_node_start(struct drm_mm_node *hole_no | |||
| 100 | return hole_node->start + hole_node->size; | 120 | return hole_node->start + hole_node->size; |
| 101 | } | 121 | } |
| 102 | 122 | ||
| 123 | /** | ||
| 124 | * drm_mm_hole_node_start - computes the start of the hole following @node | ||
| 125 | * @hole_node: drm_mm_node which implicitly tracks the following hole | ||
| 126 | * | ||
| 127 | * This is useful for driver-sepific debug dumpers. Otherwise drivers should not | ||
| 128 | * inspect holes themselves. Drivers must check first whether a hole indeed | ||
| 129 | * follows by looking at node->hole_follows. | ||
| 130 | * | ||
| 131 | * Returns: | ||
| 132 | * Start of the subsequent hole. | ||
| 133 | */ | ||
| 103 | static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node) | 134 | static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node) |
| 104 | { | 135 | { |
| 105 | BUG_ON(!hole_node->hole_follows); | 136 | BUG_ON(!hole_node->hole_follows); |
| @@ -112,18 +143,49 @@ static inline unsigned long __drm_mm_hole_node_end(struct drm_mm_node *hole_node | |||
| 112 | struct drm_mm_node, node_list)->start; | 143 | struct drm_mm_node, node_list)->start; |
| 113 | } | 144 | } |
| 114 | 145 | ||
| 146 | /** | ||
| 147 | * drm_mm_hole_node_end - computes the end of the hole following @node | ||
| 148 | * @hole_node: drm_mm_node which implicitly tracks the following hole | ||
| 149 | * | ||
| 150 | * This is useful for driver-sepific debug dumpers. Otherwise drivers should not | ||
| 151 | * inspect holes themselves. Drivers must check first whether a hole indeed | ||
| 152 | * follows by looking at node->hole_follows. | ||
| 153 | * | ||
| 154 | * Returns: | ||
| 155 | * End of the subsequent hole. | ||
| 156 | */ | ||
| 115 | static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) | 157 | static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) |
| 116 | { | 158 | { |
| 117 | return __drm_mm_hole_node_end(hole_node); | 159 | return __drm_mm_hole_node_end(hole_node); |
| 118 | } | 160 | } |
| 119 | 161 | ||
| 162 | /** | ||
| 163 | * drm_mm_for_each_node - iterator to walk over all allocated nodes | ||
| 164 | * @entry: drm_mm_node structure to assign to in each iteration step | ||
| 165 | * @mm: drm_mm allocator to walk | ||
| 166 | * | ||
| 167 | * This iterator walks over all nodes in the range allocator. It is implemented | ||
| 168 | * with list_for_each, so not save against removal of elements. | ||
| 169 | */ | ||
| 120 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ | 170 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ |
| 121 | &(mm)->head_node.node_list, \ | 171 | &(mm)->head_node.node_list, \ |
| 122 | node_list) | 172 | node_list) |
| 123 | 173 | ||
| 124 | /* Note that we need to unroll list_for_each_entry in order to inline | 174 | /** |
| 125 | * setting hole_start and hole_end on each iteration and keep the | 175 | * drm_mm_for_each_hole - iterator to walk over all holes |
| 126 | * macro sane. | 176 | * @entry: drm_mm_node used internally to track progress |
| 177 | * @mm: drm_mm allocator to walk | ||
| 178 | * @hole_start: ulong variable to assign the hole start to on each iteration | ||
| 179 | * @hole_end: ulong variable to assign the hole end to on each iteration | ||
| 180 | * | ||
| 181 | * This iterator walks over all holes in the range allocator. It is implemented | ||
| 182 | * with list_for_each, so not save against removal of elements. @entry is used | ||
| 183 | * internally and will not reflect a real drm_mm_node for the very first hole. | ||
| 184 | * Hence users of this iterator may not access it. | ||
| 185 | * | ||
| 186 | * Implementation Note: | ||
| 187 | * We need to inline list_for_each_entry in order to be able to set hole_start | ||
| 188 | * and hole_end on each iteration while keeping the macro sane. | ||
| 127 | */ | 189 | */ |
| 128 | #define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ | 190 | #define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ |
| 129 | for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ | 191 | for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ |
| @@ -136,14 +198,30 @@ static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) | |||
| 136 | /* | 198 | /* |
| 137 | * Basic range manager support (drm_mm.c) | 199 | * Basic range manager support (drm_mm.c) |
| 138 | */ | 200 | */ |
| 139 | extern int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); | 201 | int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); |
| 140 | 202 | ||
| 141 | extern int drm_mm_insert_node_generic(struct drm_mm *mm, | 203 | int drm_mm_insert_node_generic(struct drm_mm *mm, |
| 142 | struct drm_mm_node *node, | 204 | struct drm_mm_node *node, |
| 143 | unsigned long size, | 205 | unsigned long size, |
| 144 | unsigned alignment, | 206 | unsigned alignment, |
| 145 | unsigned long color, | 207 | unsigned long color, |
| 146 | enum drm_mm_search_flags flags); | 208 | enum drm_mm_search_flags flags); |
| 209 | /** | ||
| 210 | * drm_mm_insert_node - search for space and insert @node | ||
| 211 | * @mm: drm_mm to allocate from | ||
| 212 | * @node: preallocate node to insert | ||
| 213 | * @size: size of the allocation | ||
| 214 | * @alignment: alignment of the allocation | ||
| 215 | * @flags: flags to fine-tune the allocation | ||
| 216 | * | ||
| 217 | * This is a simplified version of drm_mm_insert_node_generic() with @color set | ||
| 218 | * to 0. | ||
| 219 | * | ||
| 220 | * The preallocated node must be cleared to 0. | ||
| 221 | * | ||
| 222 | * Returns: | ||
| 223 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
| 224 | */ | ||
| 147 | static inline int drm_mm_insert_node(struct drm_mm *mm, | 225 | static inline int drm_mm_insert_node(struct drm_mm *mm, |
| 148 | struct drm_mm_node *node, | 226 | struct drm_mm_node *node, |
| 149 | unsigned long size, | 227 | unsigned long size, |
| @@ -153,14 +231,32 @@ static inline int drm_mm_insert_node(struct drm_mm *mm, | |||
| 153 | return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags); | 231 | return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags); |
| 154 | } | 232 | } |
| 155 | 233 | ||
| 156 | extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, | 234 | int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, |
| 157 | struct drm_mm_node *node, | 235 | struct drm_mm_node *node, |
| 158 | unsigned long size, | 236 | unsigned long size, |
| 159 | unsigned alignment, | 237 | unsigned alignment, |
| 160 | unsigned long color, | 238 | unsigned long color, |
| 161 | unsigned long start, | 239 | unsigned long start, |
| 162 | unsigned long end, | 240 | unsigned long end, |
| 163 | enum drm_mm_search_flags flags); | 241 | enum drm_mm_search_flags flags); |
| 242 | /** | ||
| 243 | * drm_mm_insert_node_in_range - ranged search for space and insert @node | ||
| 244 | * @mm: drm_mm to allocate from | ||
| 245 | * @node: preallocate node to insert | ||
| 246 | * @size: size of the allocation | ||
| 247 | * @alignment: alignment of the allocation | ||
| 248 | * @start: start of the allowed range for this node | ||
| 249 | * @end: end of the allowed range for this node | ||
| 250 | * @flags: flags to fine-tune the allocation | ||
| 251 | * | ||
| 252 | * This is a simplified version of drm_mm_insert_node_in_range_generic() with | ||
| 253 | * @color set to 0. | ||
| 254 | * | ||
| 255 | * The preallocated node must be cleared to 0. | ||
| 256 | * | ||
| 257 | * Returns: | ||
| 258 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
| 259 | */ | ||
| 164 | static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, | 260 | static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, |
| 165 | struct drm_mm_node *node, | 261 | struct drm_mm_node *node, |
| 166 | unsigned long size, | 262 | unsigned long size, |
| @@ -173,13 +269,13 @@ static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, | |||
| 173 | 0, start, end, flags); | 269 | 0, start, end, flags); |
| 174 | } | 270 | } |
| 175 | 271 | ||
| 176 | extern void drm_mm_remove_node(struct drm_mm_node *node); | 272 | void drm_mm_remove_node(struct drm_mm_node *node); |
| 177 | extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); | 273 | void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); |
| 178 | extern void drm_mm_init(struct drm_mm *mm, | 274 | void drm_mm_init(struct drm_mm *mm, |
| 179 | unsigned long start, | 275 | unsigned long start, |
| 180 | unsigned long size); | 276 | unsigned long size); |
| 181 | extern void drm_mm_takedown(struct drm_mm *mm); | 277 | void drm_mm_takedown(struct drm_mm *mm); |
| 182 | extern int drm_mm_clean(struct drm_mm *mm); | 278 | bool drm_mm_clean(struct drm_mm *mm); |
| 183 | 279 | ||
| 184 | void drm_mm_init_scan(struct drm_mm *mm, | 280 | void drm_mm_init_scan(struct drm_mm *mm, |
| 185 | unsigned long size, | 281 | unsigned long size, |
| @@ -191,10 +287,10 @@ void drm_mm_init_scan_with_range(struct drm_mm *mm, | |||
| 191 | unsigned long color, | 287 | unsigned long color, |
| 192 | unsigned long start, | 288 | unsigned long start, |
| 193 | unsigned long end); | 289 | unsigned long end); |
| 194 | int drm_mm_scan_add_block(struct drm_mm_node *node); | 290 | bool drm_mm_scan_add_block(struct drm_mm_node *node); |
| 195 | int drm_mm_scan_remove_block(struct drm_mm_node *node); | 291 | bool drm_mm_scan_remove_block(struct drm_mm_node *node); |
| 196 | 292 | ||
| 197 | extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); | 293 | void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); |
| 198 | #ifdef CONFIG_DEBUG_FS | 294 | #ifdef CONFIG_DEBUG_FS |
| 199 | int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); | 295 | int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); |
| 200 | #endif | 296 | #endif |
diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h new file mode 100644 index 000000000000..2dbbf9976669 --- /dev/null +++ b/include/drm/drm_modes.h | |||
| @@ -0,0 +1,237 @@ | |||
| 1 | /* | ||
| 2 | * Copyright © 2006 Keith Packard | ||
| 3 | * Copyright © 2007-2008 Dave Airlie | ||
| 4 | * Copyright © 2007-2008 Intel Corporation | ||
| 5 | * Jesse Barnes <jesse.barnes@intel.com> | ||
| 6 | * Copyright © 2014 Intel Corporation | ||
| 7 | * Daniel Vetter <daniel.vetter@ffwll.ch> | ||
| 8 | * | ||
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 10 | * copy of this software and associated documentation files (the "Software"), | ||
| 11 | * to deal in the Software without restriction, including without limitation | ||
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice shall be included in | ||
| 17 | * all copies or substantial portions of the Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | ||
| 27 | #ifndef __DRM_MODES_H__ | ||
| 28 | #define __DRM_MODES_H__ | ||
| 29 | |||
| 30 | /* | ||
| 31 | * Note on terminology: here, for brevity and convenience, we refer to connector | ||
| 32 | * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS, | ||
| 33 | * DVI, etc. And 'screen' refers to the whole of the visible display, which | ||
| 34 | * may span multiple monitors (and therefore multiple CRTC and connector | ||
| 35 | * structures). | ||
| 36 | */ | ||
| 37 | |||
| 38 | enum drm_mode_status { | ||
| 39 | MODE_OK = 0, /* Mode OK */ | ||
| 40 | MODE_HSYNC, /* hsync out of range */ | ||
| 41 | MODE_VSYNC, /* vsync out of range */ | ||
| 42 | MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 43 | MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 44 | MODE_BAD_WIDTH, /* requires an unsupported linepitch */ | ||
| 45 | MODE_NOMODE, /* no mode with a matching name */ | ||
| 46 | MODE_NO_INTERLACE, /* interlaced mode not supported */ | ||
| 47 | MODE_NO_DBLESCAN, /* doublescan mode not supported */ | ||
| 48 | MODE_NO_VSCAN, /* multiscan mode not supported */ | ||
| 49 | MODE_MEM, /* insufficient video memory */ | ||
| 50 | MODE_VIRTUAL_X, /* mode width too large for specified virtual size */ | ||
| 51 | MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */ | ||
| 52 | MODE_MEM_VIRT, /* insufficient video memory given virtual size */ | ||
| 53 | MODE_NOCLOCK, /* no fixed clock available */ | ||
| 54 | MODE_CLOCK_HIGH, /* clock required is too high */ | ||
| 55 | MODE_CLOCK_LOW, /* clock required is too low */ | ||
| 56 | MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */ | ||
| 57 | MODE_BAD_HVALUE, /* horizontal timing was out of range */ | ||
| 58 | MODE_BAD_VVALUE, /* vertical timing was out of range */ | ||
| 59 | MODE_BAD_VSCAN, /* VScan value out of range */ | ||
| 60 | MODE_HSYNC_NARROW, /* horizontal sync too narrow */ | ||
| 61 | MODE_HSYNC_WIDE, /* horizontal sync too wide */ | ||
| 62 | MODE_HBLANK_NARROW, /* horizontal blanking too narrow */ | ||
| 63 | MODE_HBLANK_WIDE, /* horizontal blanking too wide */ | ||
| 64 | MODE_VSYNC_NARROW, /* vertical sync too narrow */ | ||
| 65 | MODE_VSYNC_WIDE, /* vertical sync too wide */ | ||
| 66 | MODE_VBLANK_NARROW, /* vertical blanking too narrow */ | ||
| 67 | MODE_VBLANK_WIDE, /* vertical blanking too wide */ | ||
| 68 | MODE_PANEL, /* exceeds panel dimensions */ | ||
| 69 | MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ | ||
| 70 | MODE_ONE_WIDTH, /* only one width is supported */ | ||
| 71 | MODE_ONE_HEIGHT, /* only one height is supported */ | ||
| 72 | MODE_ONE_SIZE, /* only one resolution is supported */ | ||
| 73 | MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */ | ||
| 74 | MODE_NO_STEREO, /* stereo modes not supported */ | ||
| 75 | MODE_UNVERIFIED = -3, /* mode needs to reverified */ | ||
| 76 | MODE_BAD = -2, /* unspecified reason */ | ||
| 77 | MODE_ERROR = -1 /* error condition */ | ||
| 78 | }; | ||
| 79 | |||
| 80 | #define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ | ||
| 81 | DRM_MODE_TYPE_CRTC_C) | ||
| 82 | |||
| 83 | #define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ | ||
| 84 | .name = nm, .status = 0, .type = (t), .clock = (c), \ | ||
| 85 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ | ||
| 86 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ | ||
| 87 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ | ||
| 88 | .vscan = (vs), .flags = (f), \ | ||
| 89 | .base.type = DRM_MODE_OBJECT_MODE | ||
| 90 | |||
| 91 | #define CRTC_INTERLACE_HALVE_V (1 << 0) /* halve V values for interlacing */ | ||
| 92 | #define CRTC_STEREO_DOUBLE (1 << 1) /* adjust timings for stereo modes */ | ||
| 93 | |||
| 94 | #define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF | ||
| 95 | |||
| 96 | struct drm_display_mode { | ||
| 97 | /* Header */ | ||
| 98 | struct list_head head; | ||
| 99 | struct drm_mode_object base; | ||
| 100 | |||
| 101 | char name[DRM_DISPLAY_MODE_LEN]; | ||
| 102 | |||
| 103 | enum drm_mode_status status; | ||
| 104 | unsigned int type; | ||
| 105 | |||
| 106 | /* Proposed mode values */ | ||
| 107 | int clock; /* in kHz */ | ||
| 108 | int hdisplay; | ||
| 109 | int hsync_start; | ||
| 110 | int hsync_end; | ||
| 111 | int htotal; | ||
| 112 | int hskew; | ||
| 113 | int vdisplay; | ||
| 114 | int vsync_start; | ||
| 115 | int vsync_end; | ||
| 116 | int vtotal; | ||
| 117 | int vscan; | ||
| 118 | unsigned int flags; | ||
| 119 | |||
| 120 | /* Addressable image size (may be 0 for projectors, etc.) */ | ||
| 121 | int width_mm; | ||
| 122 | int height_mm; | ||
| 123 | |||
| 124 | /* Actual mode we give to hw */ | ||
| 125 | int crtc_clock; /* in KHz */ | ||
| 126 | int crtc_hdisplay; | ||
| 127 | int crtc_hblank_start; | ||
| 128 | int crtc_hblank_end; | ||
| 129 | int crtc_hsync_start; | ||
| 130 | int crtc_hsync_end; | ||
| 131 | int crtc_htotal; | ||
| 132 | int crtc_hskew; | ||
| 133 | int crtc_vdisplay; | ||
| 134 | int crtc_vblank_start; | ||
| 135 | int crtc_vblank_end; | ||
| 136 | int crtc_vsync_start; | ||
| 137 | int crtc_vsync_end; | ||
| 138 | int crtc_vtotal; | ||
| 139 | |||
| 140 | /* Driver private mode info */ | ||
| 141 | int *private; | ||
| 142 | int private_flags; | ||
| 143 | |||
| 144 | int vrefresh; /* in Hz */ | ||
| 145 | int hsync; /* in kHz */ | ||
| 146 | enum hdmi_picture_aspect picture_aspect_ratio; | ||
| 147 | }; | ||
| 148 | |||
| 149 | /* mode specified on the command line */ | ||
| 150 | struct drm_cmdline_mode { | ||
| 151 | bool specified; | ||
| 152 | bool refresh_specified; | ||
| 153 | bool bpp_specified; | ||
| 154 | int xres, yres; | ||
| 155 | int bpp; | ||
| 156 | int refresh; | ||
| 157 | bool rb; | ||
| 158 | bool interlace; | ||
| 159 | bool cvt; | ||
| 160 | bool margins; | ||
| 161 | enum drm_connector_force force; | ||
| 162 | }; | ||
| 163 | |||
| 164 | /** | ||
| 165 | * drm_mode_is_stereo - check for stereo mode flags | ||
| 166 | * @mode: drm_display_mode to check | ||
| 167 | * | ||
| 168 | * Returns: | ||
| 169 | * True if the mode is one of the stereo modes (like side-by-side), false if | ||
| 170 | * not. | ||
| 171 | */ | ||
| 172 | static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode) | ||
| 173 | { | ||
| 174 | return mode->flags & DRM_MODE_FLAG_3D_MASK; | ||
| 175 | } | ||
| 176 | |||
| 177 | struct drm_connector; | ||
| 178 | struct drm_cmdline_mode; | ||
| 179 | |||
| 180 | struct drm_display_mode *drm_mode_create(struct drm_device *dev); | ||
| 181 | void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); | ||
| 182 | void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); | ||
| 183 | void drm_mode_debug_printmodeline(const struct drm_display_mode *mode); | ||
| 184 | |||
| 185 | struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, | ||
| 186 | int hdisplay, int vdisplay, int vrefresh, | ||
| 187 | bool reduced, bool interlaced, | ||
| 188 | bool margins); | ||
| 189 | struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, | ||
| 190 | int hdisplay, int vdisplay, int vrefresh, | ||
| 191 | bool interlaced, int margins); | ||
| 192 | struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, | ||
| 193 | int hdisplay, int vdisplay, | ||
| 194 | int vrefresh, bool interlaced, | ||
| 195 | int margins, | ||
| 196 | int GTF_M, int GTF_2C, | ||
| 197 | int GTF_K, int GTF_2J); | ||
| 198 | void drm_display_mode_from_videomode(const struct videomode *vm, | ||
| 199 | struct drm_display_mode *dmode); | ||
| 200 | int of_get_drm_display_mode(struct device_node *np, | ||
| 201 | struct drm_display_mode *dmode, | ||
| 202 | int index); | ||
| 203 | |||
| 204 | void drm_mode_set_name(struct drm_display_mode *mode); | ||
| 205 | int drm_mode_hsync(const struct drm_display_mode *mode); | ||
| 206 | int drm_mode_vrefresh(const struct drm_display_mode *mode); | ||
| 207 | |||
| 208 | void drm_mode_set_crtcinfo(struct drm_display_mode *p, | ||
| 209 | int adjust_flags); | ||
| 210 | void drm_mode_copy(struct drm_display_mode *dst, | ||
| 211 | const struct drm_display_mode *src); | ||
| 212 | struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | ||
| 213 | const struct drm_display_mode *mode); | ||
| 214 | bool drm_mode_equal(const struct drm_display_mode *mode1, | ||
| 215 | const struct drm_display_mode *mode2); | ||
| 216 | bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, | ||
| 217 | const struct drm_display_mode *mode2); | ||
| 218 | |||
| 219 | /* for use by the crtc helper probe functions */ | ||
| 220 | void drm_mode_validate_size(struct drm_device *dev, | ||
| 221 | struct list_head *mode_list, | ||
| 222 | int maxX, int maxY); | ||
| 223 | void drm_mode_prune_invalid(struct drm_device *dev, | ||
| 224 | struct list_head *mode_list, bool verbose); | ||
| 225 | void drm_mode_sort(struct list_head *mode_list); | ||
| 226 | void drm_mode_connector_list_update(struct drm_connector *connector); | ||
| 227 | |||
| 228 | /* parsing cmdline modes */ | ||
| 229 | bool | ||
| 230 | drm_mode_parse_command_line_for_connector(const char *mode_option, | ||
| 231 | struct drm_connector *connector, | ||
| 232 | struct drm_cmdline_mode *mode); | ||
| 233 | struct drm_display_mode * | ||
| 234 | drm_mode_create_from_cmdline_mode(struct drm_device *dev, | ||
| 235 | struct drm_cmdline_mode *cmd); | ||
| 236 | |||
| 237 | #endif /* __DRM_MODES_H__ */ | ||
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h index 9231be9e90a2..11c0182a153b 100644 --- a/include/linux/hdmi.h +++ b/include/linux/hdmi.h | |||
| @@ -262,6 +262,18 @@ union hdmi_vendor_any_infoframe { | |||
| 262 | struct hdmi_vendor_infoframe hdmi; | 262 | struct hdmi_vendor_infoframe hdmi; |
| 263 | }; | 263 | }; |
| 264 | 264 | ||
| 265 | /** | ||
| 266 | * union hdmi_infoframe - overall union of all abstract infoframe representations | ||
| 267 | * @any: generic infoframe | ||
| 268 | * @avi: avi infoframe | ||
| 269 | * @spd: spd infoframe | ||
| 270 | * @vendor: union of all vendor infoframes | ||
| 271 | * @audio: audio infoframe | ||
| 272 | * | ||
| 273 | * This is used by the generic pack function. This works since all infoframes | ||
| 274 | * have the same header which also indicates which type of infoframe should be | ||
| 275 | * packed. | ||
| 276 | */ | ||
| 265 | union hdmi_infoframe { | 277 | union hdmi_infoframe { |
| 266 | struct hdmi_any_infoframe any; | 278 | struct hdmi_any_infoframe any; |
| 267 | struct hdmi_avi_infoframe avi; | 279 | struct hdmi_avi_infoframe avi; |
