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#ifndef __DRM_CRTC_H__
26#define __DRM_CRTC_H__
27
28#include <linux/i2c.h>
29#include <linux/spinlock.h>
30#include <linux/types.h>
31#include <linux/idr.h>
32#include <linux/fb.h>
33#include <drm/drm_mode.h>
34
35#include <drm/drm_fourcc.h>
36
37struct drm_device;
38struct drm_mode_set;
39struct drm_framebuffer;
40struct drm_object_properties;
41struct drm_file;
42struct drm_clip_rect;
43
44#define DRM_MODE_OBJECT_CRTC 0xcccccccc
45#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
46#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
47#define DRM_MODE_OBJECT_MODE 0xdededede
48#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
49#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
50#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
51#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
52#define DRM_MODE_OBJECT_BRIDGE 0xbdbdbdbd
53
54struct drm_mode_object {
55 uint32_t id;
56 uint32_t type;
57 struct drm_object_properties *properties;
58};
59
60#define DRM_OBJECT_MAX_PROPERTY 24
61struct drm_object_properties {
62 int count;
63 uint32_t ids[DRM_OBJECT_MAX_PROPERTY];
64 uint64_t values[DRM_OBJECT_MAX_PROPERTY];
65};
66
67
68
69
70
71
72
73
74
75enum drm_mode_status {
76 MODE_OK = 0,
77 MODE_HSYNC,
78 MODE_VSYNC,
79 MODE_H_ILLEGAL,
80 MODE_V_ILLEGAL,
81 MODE_BAD_WIDTH,
82 MODE_NOMODE,
83 MODE_NO_INTERLACE,
84 MODE_NO_DBLESCAN,
85 MODE_NO_VSCAN,
86 MODE_MEM,
87 MODE_VIRTUAL_X,
88 MODE_VIRTUAL_Y,
89 MODE_MEM_VIRT,
90 MODE_NOCLOCK,
91 MODE_CLOCK_HIGH,
92 MODE_CLOCK_LOW,
93 MODE_CLOCK_RANGE,
94 MODE_BAD_HVALUE,
95 MODE_BAD_VVALUE,
96 MODE_BAD_VSCAN,
97 MODE_HSYNC_NARROW,
98 MODE_HSYNC_WIDE,
99 MODE_HBLANK_NARROW,
100 MODE_HBLANK_WIDE,
101 MODE_VSYNC_NARROW,
102 MODE_VSYNC_WIDE,
103 MODE_VBLANK_NARROW,
104 MODE_VBLANK_WIDE,
105 MODE_PANEL,
106 MODE_INTERLACE_WIDTH,
107 MODE_ONE_WIDTH,
108 MODE_ONE_HEIGHT,
109 MODE_ONE_SIZE,
110 MODE_NO_REDUCED,
111 MODE_NO_STEREO,
112 MODE_UNVERIFIED = -3,
113 MODE_BAD = -2,
114 MODE_ERROR = -1
115};
116
117#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \
118 DRM_MODE_TYPE_CRTC_C)
119
120#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \
121 .name = nm, .status = 0, .type = (t), .clock = (c), \
122 .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \
123 .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \
124 .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \
125 .vscan = (vs), .flags = (f), \
126 .base.type = DRM_MODE_OBJECT_MODE
127
128#define CRTC_INTERLACE_HALVE_V (1 << 0)
129#define CRTC_STEREO_DOUBLE (1 << 1)
130
131#define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF
132
133struct drm_display_mode {
134
135 struct list_head head;
136 struct drm_mode_object base;
137
138 char name[DRM_DISPLAY_MODE_LEN];
139
140 enum drm_mode_status status;
141 unsigned int type;
142
143
144 int clock;
145 int hdisplay;
146 int hsync_start;
147 int hsync_end;
148 int htotal;
149 int hskew;
150 int vdisplay;
151 int vsync_start;
152 int vsync_end;
153 int vtotal;
154 int vscan;
155 unsigned int flags;
156
157
158 int width_mm;
159 int height_mm;
160
161
162 int crtc_clock;
163 int crtc_hdisplay;
164 int crtc_hblank_start;
165 int crtc_hblank_end;
166 int crtc_hsync_start;
167 int crtc_hsync_end;
168 int crtc_htotal;
169 int crtc_hskew;
170 int crtc_vdisplay;
171 int crtc_vblank_start;
172 int crtc_vblank_end;
173 int crtc_vsync_start;
174 int crtc_vsync_end;
175 int crtc_vtotal;
176
177
178 int private_size;
179 int *private;
180 int private_flags;
181
182 int vrefresh;
183 int hsync;
184};
185
186static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode)
187{
188 return mode->flags & DRM_MODE_FLAG_3D_MASK;
189}
190
191enum drm_connector_status {
192 connector_status_connected = 1,
193 connector_status_disconnected = 2,
194 connector_status_unknown = 3,
195};
196
197enum subpixel_order {
198 SubPixelUnknown = 0,
199 SubPixelHorizontalRGB,
200 SubPixelHorizontalBGR,
201 SubPixelVerticalRGB,
202 SubPixelVerticalBGR,
203 SubPixelNone,
204};
205
206#define DRM_COLOR_FORMAT_RGB444 (1<<0)
207#define DRM_COLOR_FORMAT_YCRCB444 (1<<1)
208#define DRM_COLOR_FORMAT_YCRCB422 (1<<2)
209
210
211
212struct drm_display_info {
213 char name[DRM_DISPLAY_INFO_LEN];
214
215
216 unsigned int width_mm;
217 unsigned int height_mm;
218
219
220 unsigned int min_vfreq, max_vfreq;
221 unsigned int min_hfreq, max_hfreq;
222 unsigned int pixel_clock;
223 unsigned int bpc;
224
225 enum subpixel_order subpixel_order;
226 u32 color_formats;
227
228 u8 cea_rev;
229};
230
231struct drm_framebuffer_funcs {
232
233 void (*destroy)(struct drm_framebuffer *framebuffer);
234 int (*create_handle)(struct drm_framebuffer *fb,
235 struct drm_file *file_priv,
236 unsigned int *handle);
237
238
239
240
241
242
243
244
245
246
247
248
249 int (*dirty)(struct drm_framebuffer *framebuffer,
250 struct drm_file *file_priv, unsigned flags,
251 unsigned color, struct drm_clip_rect *clips,
252 unsigned num_clips);
253};
254
255struct drm_framebuffer {
256 struct drm_device *dev;
257
258
259
260
261
262
263
264
265
266 struct kref refcount;
267
268
269
270
271 struct list_head head;
272 struct drm_mode_object base;
273 const struct drm_framebuffer_funcs *funcs;
274 unsigned int pitches[4];
275 unsigned int offsets[4];
276 unsigned int width;
277 unsigned int height;
278
279 unsigned int depth;
280 int bits_per_pixel;
281 int flags;
282 uint32_t pixel_format;
283 struct list_head filp_head;
284
285 void *helper_private;
286};
287
288struct drm_property_blob {
289 struct drm_mode_object base;
290 struct list_head head;
291 unsigned int length;
292 unsigned char data[];
293};
294
295struct drm_property_enum {
296 uint64_t value;
297 struct list_head head;
298 char name[DRM_PROP_NAME_LEN];
299};
300
301struct drm_property {
302 struct list_head head;
303 struct drm_mode_object base;
304 uint32_t flags;
305 char name[DRM_PROP_NAME_LEN];
306 uint32_t num_values;
307 uint64_t *values;
308
309 struct list_head enum_blob_list;
310};
311
312struct drm_crtc;
313struct drm_connector;
314struct drm_encoder;
315struct drm_pending_vblank_event;
316struct drm_plane;
317struct drm_bridge;
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341struct drm_crtc_funcs {
342
343 void (*save)(struct drm_crtc *crtc);
344
345 void (*restore)(struct drm_crtc *crtc);
346
347 void (*reset)(struct drm_crtc *crtc);
348
349
350 int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
351 uint32_t handle, uint32_t width, uint32_t height);
352 int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
353 uint32_t handle, uint32_t width, uint32_t height,
354 int32_t hot_x, int32_t hot_y);
355 int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
356
357
358 void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
359 uint32_t start, uint32_t size);
360
361 void (*destroy)(struct drm_crtc *crtc);
362
363 int (*set_config)(struct drm_mode_set *set);
364
365
366
367
368
369
370
371
372
373
374 int (*page_flip)(struct drm_crtc *crtc,
375 struct drm_framebuffer *fb,
376 struct drm_pending_vblank_event *event,
377 uint32_t flags);
378
379 int (*set_property)(struct drm_crtc *crtc,
380 struct drm_property *property, uint64_t val);
381};
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408struct drm_crtc {
409 struct drm_device *dev;
410 struct list_head head;
411
412
413
414
415
416
417
418
419 struct mutex mutex;
420
421 struct drm_mode_object base;
422
423
424 struct drm_framebuffer *fb;
425
426
427
428 struct drm_framebuffer *old_fb;
429
430 bool enabled;
431
432
433 struct drm_display_mode mode;
434
435
436
437
438 struct drm_display_mode hwmode;
439
440 bool invert_dimensions;
441
442 int x, y;
443 const struct drm_crtc_funcs *funcs;
444
445
446 uint32_t gamma_size;
447 uint16_t *gamma_store;
448
449
450 s64 framedur_ns, linedur_ns, pixeldur_ns;
451
452
453 void *helper_private;
454
455 struct drm_object_properties properties;
456};
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475struct drm_connector_funcs {
476 void (*dpms)(struct drm_connector *connector, int mode);
477 void (*save)(struct drm_connector *connector);
478 void (*restore)(struct drm_connector *connector);
479 void (*reset)(struct drm_connector *connector);
480
481
482
483
484
485
486
487 enum drm_connector_status (*detect)(struct drm_connector *connector,
488 bool force);
489 int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
490 int (*set_property)(struct drm_connector *connector, struct drm_property *property,
491 uint64_t val);
492 void (*destroy)(struct drm_connector *connector);
493 void (*force)(struct drm_connector *connector);
494};
495
496
497
498
499
500
501
502
503struct drm_encoder_funcs {
504 void (*reset)(struct drm_encoder *encoder);
505 void (*destroy)(struct drm_encoder *encoder);
506};
507
508#define DRM_CONNECTOR_MAX_ENCODER 3
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526struct drm_encoder {
527 struct drm_device *dev;
528 struct list_head head;
529
530 struct drm_mode_object base;
531 int encoder_type;
532 uint32_t possible_crtcs;
533 uint32_t possible_clones;
534
535 struct drm_crtc *crtc;
536 struct drm_bridge *bridge;
537 const struct drm_encoder_funcs *funcs;
538 void *helper_private;
539};
540
541enum drm_connector_force {
542 DRM_FORCE_UNSPECIFIED,
543 DRM_FORCE_OFF,
544 DRM_FORCE_ON,
545 DRM_FORCE_ON_DIGITAL,
546};
547
548
549
550#define DRM_CONNECTOR_POLL_HPD (1 << 0)
551
552#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
553
554
555#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
556
557#define MAX_ELD_BYTES 128
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596struct drm_connector {
597 struct drm_device *dev;
598 struct device *kdev;
599 struct device_attribute *attr;
600 struct list_head head;
601
602 struct drm_mode_object base;
603
604 int connector_type;
605 int connector_type_id;
606 bool interlace_allowed;
607 bool doublescan_allowed;
608 bool stereo_allowed;
609 struct list_head modes;
610
611 enum drm_connector_status status;
612
613
614 struct list_head probed_modes;
615
616 struct drm_display_info display_info;
617 const struct drm_connector_funcs *funcs;
618
619 struct drm_property_blob *edid_blob_ptr;
620 struct drm_object_properties properties;
621
622 uint8_t polled;
623
624
625 int dpms;
626
627 void *helper_private;
628
629
630 enum drm_connector_force force;
631 uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
632 struct drm_encoder *encoder;
633
634
635 uint8_t eld[MAX_ELD_BYTES];
636 bool dvi_dual;
637 int max_tmds_clock;
638 bool latency_present[2];
639 int video_latency[2];
640 int audio_latency[2];
641 int null_edid_counter;
642 unsigned bad_edid_counter;
643};
644
645
646
647
648
649
650
651
652struct drm_plane_funcs {
653 int (*update_plane)(struct drm_plane *plane,
654 struct drm_crtc *crtc, struct drm_framebuffer *fb,
655 int crtc_x, int crtc_y,
656 unsigned int crtc_w, unsigned int crtc_h,
657 uint32_t src_x, uint32_t src_y,
658 uint32_t src_w, uint32_t src_h);
659 int (*disable_plane)(struct drm_plane *plane);
660 void (*destroy)(struct drm_plane *plane);
661
662 int (*set_property)(struct drm_plane *plane,
663 struct drm_property *property, uint64_t val);
664};
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679struct drm_plane {
680 struct drm_device *dev;
681 struct list_head head;
682
683 struct drm_mode_object base;
684
685 uint32_t possible_crtcs;
686 uint32_t *format_types;
687 uint32_t format_count;
688
689 struct drm_crtc *crtc;
690 struct drm_framebuffer *fb;
691
692 const struct drm_plane_funcs *funcs;
693
694 struct drm_object_properties properties;
695};
696
697
698
699
700
701
702
703
704
705
706
707struct drm_bridge_funcs {
708 bool (*mode_fixup)(struct drm_bridge *bridge,
709 const struct drm_display_mode *mode,
710 struct drm_display_mode *adjusted_mode);
711 void (*disable)(struct drm_bridge *bridge);
712 void (*post_disable)(struct drm_bridge *bridge);
713 void (*mode_set)(struct drm_bridge *bridge,
714 struct drm_display_mode *mode,
715 struct drm_display_mode *adjusted_mode);
716 void (*pre_enable)(struct drm_bridge *bridge);
717 void (*enable)(struct drm_bridge *bridge);
718 void (*destroy)(struct drm_bridge *bridge);
719};
720
721
722
723
724
725
726
727
728
729struct drm_bridge {
730 struct drm_device *dev;
731 struct list_head head;
732
733 struct drm_mode_object base;
734
735 const struct drm_bridge_funcs *funcs;
736 void *driver_private;
737};
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755struct drm_mode_set {
756 struct drm_framebuffer *fb;
757 struct drm_crtc *crtc;
758 struct drm_display_mode *mode;
759
760 uint32_t x;
761 uint32_t y;
762
763 struct drm_connector **connectors;
764 size_t num_connectors;
765};
766
767
768
769
770
771
772
773
774
775struct drm_mode_config_funcs {
776 struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
777 struct drm_file *file_priv,
778 struct drm_mode_fb_cmd2 *mode_cmd);
779 void (*output_poll_changed)(struct drm_device *dev);
780};
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795struct drm_mode_group {
796 uint32_t num_crtcs;
797 uint32_t num_encoders;
798 uint32_t num_connectors;
799 uint32_t num_bridges;
800
801
802 uint32_t *id_list;
803};
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834struct drm_mode_config {
835 struct mutex mutex;
836 struct mutex idr_mutex;
837 struct idr crtc_idr;
838
839
840
841
842
843
844
845
846
847 struct mutex fb_lock;
848 int num_fb;
849 struct list_head fb_list;
850
851 int num_connector;
852 struct list_head connector_list;
853 int num_bridge;
854 struct list_head bridge_list;
855 int num_encoder;
856 struct list_head encoder_list;
857 int num_plane;
858 struct list_head plane_list;
859
860 int num_crtc;
861 struct list_head crtc_list;
862
863 struct list_head property_list;
864
865 int min_width, min_height;
866 int max_width, max_height;
867 const struct drm_mode_config_funcs *funcs;
868 resource_size_t fb_base;
869
870
871 bool poll_enabled;
872 bool poll_running;
873 struct delayed_work output_poll_work;
874
875
876 struct list_head property_blob_list;
877 struct drm_property *edid_property;
878 struct drm_property *dpms_property;
879
880
881 struct drm_property *dvi_i_subconnector_property;
882 struct drm_property *dvi_i_select_subconnector_property;
883
884
885 struct drm_property *tv_subconnector_property;
886 struct drm_property *tv_select_subconnector_property;
887 struct drm_property *tv_mode_property;
888 struct drm_property *tv_left_margin_property;
889 struct drm_property *tv_right_margin_property;
890 struct drm_property *tv_top_margin_property;
891 struct drm_property *tv_bottom_margin_property;
892 struct drm_property *tv_brightness_property;
893 struct drm_property *tv_contrast_property;
894 struct drm_property *tv_flicker_reduction_property;
895 struct drm_property *tv_overscan_property;
896 struct drm_property *tv_saturation_property;
897 struct drm_property *tv_hue_property;
898
899
900 struct drm_property *scaling_mode_property;
901 struct drm_property *dirty_info_property;
902
903
904 uint32_t preferred_depth, prefer_shadow;
905
906
907 bool async_page_flip;
908};
909
910#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
911#define obj_to_connector(x) container_of(x, struct drm_connector, base)
912#define obj_to_encoder(x) container_of(x, struct drm_encoder, base)
913#define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
914#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
915#define obj_to_property(x) container_of(x, struct drm_property, base)
916#define obj_to_blob(x) container_of(x, struct drm_property_blob, base)
917#define obj_to_plane(x) container_of(x, struct drm_plane, base)
918
919struct drm_prop_enum_list {
920 int type;
921 char *name;
922};
923
924extern void drm_modeset_lock_all(struct drm_device *dev);
925extern void drm_modeset_unlock_all(struct drm_device *dev);
926extern void drm_warn_on_modeset_not_all_locked(struct drm_device *dev);
927
928extern int drm_crtc_init(struct drm_device *dev,
929 struct drm_crtc *crtc,
930 const struct drm_crtc_funcs *funcs);
931extern void drm_crtc_cleanup(struct drm_crtc *crtc);
932
933extern void drm_connector_ida_init(void);
934extern void drm_connector_ida_destroy(void);
935extern int drm_connector_init(struct drm_device *dev,
936 struct drm_connector *connector,
937 const struct drm_connector_funcs *funcs,
938 int connector_type);
939
940extern void drm_connector_cleanup(struct drm_connector *connector);
941
942extern void drm_connector_unplug_all(struct drm_device *dev);
943
944extern int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge,
945 const struct drm_bridge_funcs *funcs);
946extern void drm_bridge_cleanup(struct drm_bridge *bridge);
947
948extern int drm_encoder_init(struct drm_device *dev,
949 struct drm_encoder *encoder,
950 const struct drm_encoder_funcs *funcs,
951 int encoder_type);
952
953extern int drm_plane_init(struct drm_device *dev,
954 struct drm_plane *plane,
955 unsigned long possible_crtcs,
956 const struct drm_plane_funcs *funcs,
957 const uint32_t *formats, uint32_t format_count,
958 bool priv);
959extern void drm_plane_cleanup(struct drm_plane *plane);
960extern void drm_plane_force_disable(struct drm_plane *plane);
961
962extern void drm_encoder_cleanup(struct drm_encoder *encoder);
963
964extern const char *drm_get_connector_name(const struct drm_connector *connector);
965extern const char *drm_get_connector_status_name(enum drm_connector_status status);
966extern const char *drm_get_dpms_name(int val);
967extern const char *drm_get_dvi_i_subconnector_name(int val);
968extern const char *drm_get_dvi_i_select_name(int val);
969extern const char *drm_get_tv_subconnector_name(int val);
970extern const char *drm_get_tv_select_name(int val);
971extern void drm_fb_release(struct drm_file *file_priv);
972extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
973extern bool drm_probe_ddc(struct i2c_adapter *adapter);
974extern struct edid *drm_get_edid(struct drm_connector *connector,
975 struct i2c_adapter *adapter);
976extern struct edid *drm_edid_duplicate(const struct edid *edid);
977extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
978extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
979extern void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src);
980extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
981 const struct drm_display_mode *mode);
982extern void drm_mode_debug_printmodeline(const struct drm_display_mode *mode);
983extern void drm_mode_config_init(struct drm_device *dev);
984extern void drm_mode_config_reset(struct drm_device *dev);
985extern void drm_mode_config_cleanup(struct drm_device *dev);
986extern void drm_mode_set_name(struct drm_display_mode *mode);
987extern bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2);
988extern bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2);
989extern int drm_mode_width(const struct drm_display_mode *mode);
990extern int drm_mode_height(const struct drm_display_mode *mode);
991
992
993extern struct drm_display_mode *drm_mode_create(struct drm_device *dev);
994extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
995extern void drm_mode_validate_size(struct drm_device *dev,
996 struct list_head *mode_list,
997 int maxX, int maxY, int maxPitch);
998extern void drm_mode_prune_invalid(struct drm_device *dev,
999 struct list_head *mode_list, bool verbose);
1000extern void drm_mode_sort(struct list_head *mode_list);
1001extern int drm_mode_hsync(const struct drm_display_mode *mode);
1002extern int drm_mode_vrefresh(const struct drm_display_mode *mode);
1003extern void drm_mode_set_crtcinfo(struct drm_display_mode *p,
1004 int adjust_flags);
1005extern void drm_mode_connector_list_update(struct drm_connector *connector);
1006extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
1007 struct edid *edid);
1008extern int drm_object_property_set_value(struct drm_mode_object *obj,
1009 struct drm_property *property,
1010 uint64_t val);
1011extern int drm_object_property_get_value(struct drm_mode_object *obj,
1012 struct drm_property *property,
1013 uint64_t *value);
1014extern int drm_framebuffer_init(struct drm_device *dev,
1015 struct drm_framebuffer *fb,
1016 const struct drm_framebuffer_funcs *funcs);
1017extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
1018 uint32_t id);
1019extern void drm_framebuffer_unreference(struct drm_framebuffer *fb);
1020extern void drm_framebuffer_reference(struct drm_framebuffer *fb);
1021extern void drm_framebuffer_remove(struct drm_framebuffer *fb);
1022extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
1023extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
1024
1025extern void drm_object_attach_property(struct drm_mode_object *obj,
1026 struct drm_property *property,
1027 uint64_t init_val);
1028extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
1029 const char *name, int num_values);
1030extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
1031 const char *name,
1032 const struct drm_prop_enum_list *props,
1033 int num_values);
1034struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
1035 int flags, const char *name,
1036 const struct drm_prop_enum_list *props,
1037 int num_values);
1038struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
1039 const char *name,
1040 uint64_t min, uint64_t max);
1041extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
1042extern int drm_property_add_enum(struct drm_property *property, int index,
1043 uint64_t value, const char *name);
1044extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
1045extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats,
1046 char *formats[]);
1047extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
1048extern int drm_mode_create_dirty_info_property(struct drm_device *dev);
1049extern const char *drm_get_encoder_name(const struct drm_encoder *encoder);
1050
1051extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
1052 struct drm_encoder *encoder);
1053extern void drm_mode_connector_detach_encoder(struct drm_connector *connector,
1054 struct drm_encoder *encoder);
1055extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
1056 int gamma_size);
1057extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
1058 uint32_t id, uint32_t type);
1059
1060extern int drm_mode_getresources(struct drm_device *dev,
1061 void *data, struct drm_file *file_priv);
1062extern int drm_mode_getplane_res(struct drm_device *dev, void *data,
1063 struct drm_file *file_priv);
1064extern int drm_mode_getcrtc(struct drm_device *dev,
1065 void *data, struct drm_file *file_priv);
1066extern int drm_mode_getconnector(struct drm_device *dev,
1067 void *data, struct drm_file *file_priv);
1068extern int drm_mode_set_config_internal(struct drm_mode_set *set);
1069extern int drm_mode_setcrtc(struct drm_device *dev,
1070 void *data, struct drm_file *file_priv);
1071extern int drm_mode_getplane(struct drm_device *dev,
1072 void *data, struct drm_file *file_priv);
1073extern int drm_mode_setplane(struct drm_device *dev,
1074 void *data, struct drm_file *file_priv);
1075extern int drm_mode_cursor_ioctl(struct drm_device *dev,
1076 void *data, struct drm_file *file_priv);
1077extern int drm_mode_cursor2_ioctl(struct drm_device *dev,
1078 void *data, struct drm_file *file_priv);
1079extern int drm_mode_addfb(struct drm_device *dev,
1080 void *data, struct drm_file *file_priv);
1081extern int drm_mode_addfb2(struct drm_device *dev,
1082 void *data, struct drm_file *file_priv);
1083extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
1084extern int drm_mode_rmfb(struct drm_device *dev,
1085 void *data, struct drm_file *file_priv);
1086extern int drm_mode_getfb(struct drm_device *dev,
1087 void *data, struct drm_file *file_priv);
1088extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
1089 void *data, struct drm_file *file_priv);
1090
1091extern int drm_mode_getproperty_ioctl(struct drm_device *dev,
1092 void *data, struct drm_file *file_priv);
1093extern int drm_mode_getblob_ioctl(struct drm_device *dev,
1094 void *data, struct drm_file *file_priv);
1095extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
1096 void *data, struct drm_file *file_priv);
1097extern int drm_mode_getencoder(struct drm_device *dev,
1098 void *data, struct drm_file *file_priv);
1099extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
1100 void *data, struct drm_file *file_priv);
1101extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
1102 void *data, struct drm_file *file_priv);
1103extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
1104extern bool drm_detect_hdmi_monitor(struct edid *edid);
1105extern bool drm_detect_monitor_audio(struct edid *edid);
1106extern bool drm_rgb_quant_range_selectable(struct edid *edid);
1107extern int drm_mode_page_flip_ioctl(struct drm_device *dev,
1108 void *data, struct drm_file *file_priv);
1109extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev,
1110 int hdisplay, int vdisplay, int vrefresh,
1111 bool reduced, bool interlaced, bool margins);
1112extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev,
1113 int hdisplay, int vdisplay, int vrefresh,
1114 bool interlaced, int margins);
1115extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev,
1116 int hdisplay, int vdisplay, int vrefresh,
1117 bool interlaced, int margins, int GTF_M,
1118 int GTF_2C, int GTF_K, int GTF_2J);
1119extern int drm_add_modes_noedid(struct drm_connector *connector,
1120 int hdisplay, int vdisplay);
1121extern void drm_set_preferred_mode(struct drm_connector *connector,
1122 int hpref, int vpref);
1123
1124extern int drm_edid_header_is_valid(const u8 *raw_edid);
1125extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid);
1126extern bool drm_edid_is_valid(struct edid *edid);
1127struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
1128 int hsize, int vsize, int fresh,
1129 bool rb);
1130
1131extern int drm_mode_create_dumb_ioctl(struct drm_device *dev,
1132 void *data, struct drm_file *file_priv);
1133extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
1134 void *data, struct drm_file *file_priv);
1135extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
1136 void *data, struct drm_file *file_priv);
1137extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
1138 struct drm_file *file_priv);
1139extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
1140 struct drm_file *file_priv);
1141
1142extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
1143 int *bpp);
1144extern int drm_format_num_planes(uint32_t format);
1145extern int drm_format_plane_cpp(uint32_t format, int plane);
1146extern int drm_format_horz_chroma_subsampling(uint32_t format);
1147extern int drm_format_vert_chroma_subsampling(uint32_t format);
1148extern const char *drm_get_format_name(uint32_t format);
1149
1150
1151static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
1152 uint32_t id)
1153{
1154 struct drm_mode_object *mo;
1155 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC);
1156 return mo ? obj_to_crtc(mo) : NULL;
1157}
1158
1159static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
1160 uint32_t id)
1161{
1162 struct drm_mode_object *mo;
1163 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
1164 return mo ? obj_to_encoder(mo) : NULL;
1165}
1166
1167#endif
1168