1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef __DRM_MODES_H__
28#define __DRM_MODES_H__
29
30
31
32
33
34
35
36
37
38enum drm_mode_status {
39 MODE_OK = 0,
40 MODE_HSYNC,
41 MODE_VSYNC,
42 MODE_H_ILLEGAL,
43 MODE_V_ILLEGAL,
44 MODE_BAD_WIDTH,
45 MODE_NOMODE,
46 MODE_NO_INTERLACE,
47 MODE_NO_DBLESCAN,
48 MODE_NO_VSCAN,
49 MODE_MEM,
50 MODE_VIRTUAL_X,
51 MODE_VIRTUAL_Y,
52 MODE_MEM_VIRT,
53 MODE_NOCLOCK,
54 MODE_CLOCK_HIGH,
55 MODE_CLOCK_LOW,
56 MODE_CLOCK_RANGE,
57 MODE_BAD_HVALUE,
58 MODE_BAD_VVALUE,
59 MODE_BAD_VSCAN,
60 MODE_HSYNC_NARROW,
61 MODE_HSYNC_WIDE,
62 MODE_HBLANK_NARROW,
63 MODE_HBLANK_WIDE,
64 MODE_VSYNC_NARROW,
65 MODE_VSYNC_WIDE,
66 MODE_VBLANK_NARROW,
67 MODE_VBLANK_WIDE,
68 MODE_PANEL,
69 MODE_INTERLACE_WIDTH,
70 MODE_ONE_WIDTH,
71 MODE_ONE_HEIGHT,
72 MODE_ONE_SIZE,
73 MODE_NO_REDUCED,
74 MODE_NO_STEREO,
75 MODE_UNVERIFIED = -3,
76 MODE_BAD = -2,
77 MODE_ERROR = -1
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)
92#define CRTC_STEREO_DOUBLE (1 << 1)
93
94#define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF
95
96struct drm_display_mode {
97
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
107 int clock;
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
121 int width_mm;
122 int height_mm;
123
124
125 int crtc_clock;
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
141 int *private;
142 int private_flags;
143
144 int vrefresh;
145 int hsync;
146 enum hdmi_picture_aspect picture_aspect_ratio;
147};
148
149
150struct 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
166
167
168
169
170
171
172static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode)
173{
174 return mode->flags & DRM_MODE_FLAG_3D_MASK;
175}
176
177struct drm_connector;
178struct drm_cmdline_mode;
179
180struct drm_display_mode *drm_mode_create(struct drm_device *dev);
181void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
182void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
183void drm_mode_debug_printmodeline(const struct drm_display_mode *mode);
184
185struct 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);
189struct drm_display_mode *drm_gtf_mode(struct drm_device *dev,
190 int hdisplay, int vdisplay, int vrefresh,
191 bool interlaced, int margins);
192struct 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);
198void drm_display_mode_from_videomode(const struct videomode *vm,
199 struct drm_display_mode *dmode);
200int of_get_drm_display_mode(struct device_node *np,
201 struct drm_display_mode *dmode,
202 int index);
203
204void drm_mode_set_name(struct drm_display_mode *mode);
205int drm_mode_hsync(const struct drm_display_mode *mode);
206int drm_mode_vrefresh(const struct drm_display_mode *mode);
207
208void drm_mode_set_crtcinfo(struct drm_display_mode *p,
209 int adjust_flags);
210void drm_mode_copy(struct drm_display_mode *dst,
211 const struct drm_display_mode *src);
212struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
213 const struct drm_display_mode *mode);
214bool drm_mode_equal(const struct drm_display_mode *mode1,
215 const struct drm_display_mode *mode2);
216bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
217 const struct drm_display_mode *mode2);
218
219
220void drm_mode_validate_size(struct drm_device *dev,
221 struct list_head *mode_list,
222 int maxX, int maxY);
223void drm_mode_prune_invalid(struct drm_device *dev,
224 struct list_head *mode_list, bool verbose);
225void drm_mode_sort(struct list_head *mode_list);
226void drm_mode_connector_list_update(struct drm_connector *connector, bool merge_type_bits);
227
228
229bool
230drm_mode_parse_command_line_for_connector(const char *mode_option,
231 struct drm_connector *connector,
232 struct drm_cmdline_mode *mode);
233struct drm_display_mode *
234drm_mode_create_from_cmdline_mode(struct drm_device *dev,
235 struct drm_cmdline_mode *cmd);
236
237#endif
238