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