Lines Matching +full:mode +full:-
2 * Copyright © 1997-2003 by The XFree86 Project, Inc.
4 * Copyright © 2007-2008 Intel Corporation
6 * Copyright 2005-2006 Luc Verhaegen
49 * drm_mode_debug_printmodeline - print a mode to dmesg
50 * @mode: mode to print
52 * Describe @mode using DRM_DEBUG.
54 void drm_mode_debug_printmodeline(const struct drm_display_mode *mode) in drm_mode_debug_printmodeline() argument
56 DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); in drm_mode_debug_printmodeline()
61 * drm_mode_create - create a new display mode
68 * Pointer to new mode on success, NULL on error.
83 * drm_mode_destroy - remove a mode
85 * @mode: mode to remove
87 * Release @mode's unique ID, then free it @mode structure itself using kfree.
89 void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode) in drm_mode_destroy() argument
91 if (!mode) in drm_mode_destroy()
94 kfree(mode); in drm_mode_destroy()
99 * drm_mode_probed_add - add a mode to a connector's probed_mode list
100 * @connector: connector the new mode
101 * @mode: mode data
103 * Add @mode to @connector's probed_mode list for later use. This list should
108 struct drm_display_mode *mode) in drm_mode_probed_add() argument
110 WARN_ON(!mutex_is_locked(&connector->dev->mode_config.mutex)); in drm_mode_probed_add()
112 list_add_tail(&mode->head, &connector->probed_modes); in drm_mode_probed_add()
117 * drm_cvt_mode -create a modeline based on the CVT algorithm
123 * @interlaced: whether to compute an interlaced mode
137 * The display mode object is allocated with drm_mode_create(). Returns NULL
138 * when no mode could be allocated.
145 /* 1) top/bottom margin size (% of height) - default: 1.8, */ in drm_cvt_mode()
147 /* 2) character cell horizontal granularity (pixels) - default 8 */ in drm_cvt_mode()
149 /* 3) Minimum vertical porch (lines) - default 3 */ in drm_cvt_mode()
151 /* 4) Minimum number of vertical back porch lines - default 6 */ in drm_cvt_mode()
182 hdisplay_rnd = hdisplay - (hdisplay % CVT_H_GRANULARITY); in drm_cvt_mode()
188 hmargin -= hmargin % CVT_H_GRANULARITY; in drm_cvt_mode()
191 drm_mode->hdisplay = hdisplay_rnd + 2 * hmargin; in drm_cvt_mode()
204 drm_mode->vdisplay = vdisplay + 2 * vmargin; in drm_cvt_mode()
233 /* 3) Nominal HSync width (% of line period) - default 8 */ in drm_cvt_mode()
239 tmp1 = HV_FACTOR * 1000000 - in drm_cvt_mode()
252 vback_porch = vsyncandback_porch - vsync; in drm_cvt_mode()
253 drm_mode->vtotal = vdisplay_rnd + 2 * vmargin + in drm_cvt_mode()
256 /* Gradient (%/kHz) - default 600 */ in drm_cvt_mode()
258 /* Offset (%) - default 40 */ in drm_cvt_mode()
260 /* Blanking time scaling factor - default 128 */ in drm_cvt_mode()
262 /* Scaling factor weighting - default 20 */ in drm_cvt_mode()
265 #define CVT_C_PRIME ((CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256 + \ in drm_cvt_mode()
268 hblank_percentage = CVT_C_PRIME * HV_FACTOR - CVT_M_PRIME * in drm_cvt_mode()
273 hblank = drm_mode->hdisplay * hblank_percentage / in drm_cvt_mode()
274 (100 * HV_FACTOR - hblank_percentage); in drm_cvt_mode()
275 hblank -= hblank % (2 * CVT_H_GRANULARITY); in drm_cvt_mode()
277 drm_mode->htotal = drm_mode->hdisplay + hblank; in drm_cvt_mode()
278 drm_mode->hsync_end = drm_mode->hdisplay + hblank / 2; in drm_cvt_mode()
279 drm_mode->hsync_start = drm_mode->hsync_end - in drm_cvt_mode()
280 (drm_mode->htotal * CVT_HSYNC_PERCENTAGE) / 100; in drm_cvt_mode()
281 drm_mode->hsync_start += CVT_H_GRANULARITY - in drm_cvt_mode()
282 drm_mode->hsync_start % CVT_H_GRANULARITY; in drm_cvt_mode()
284 drm_mode->vsync_start = drm_mode->vdisplay + CVT_MIN_V_PORCH; in drm_cvt_mode()
285 drm_mode->vsync_end = drm_mode->vsync_start + vsync; in drm_cvt_mode()
288 /* Minimum vertical blanking interval time (µs)- default 460 */ in drm_cvt_mode()
294 /* Fixed number of lines for vertical front porch - default 3*/ in drm_cvt_mode()
299 tmp1 = HV_FACTOR * 1000000 - in drm_cvt_mode()
309 drm_mode->vtotal = vdisplay_rnd + 2 * vmargin + vbilines; in drm_cvt_mode()
311 drm_mode->htotal = drm_mode->hdisplay + CVT_RB_H_BLANK; in drm_cvt_mode()
313 drm_mode->hsync_end = drm_mode->hdisplay + CVT_RB_H_BLANK / 2; in drm_cvt_mode()
314 drm_mode->hsync_start = drm_mode->hsync_end - CVT_RB_H_SYNC; in drm_cvt_mode()
316 drm_mode->vsync_start = drm_mode->vdisplay + CVT_RB_VFPORCH; in drm_cvt_mode()
317 drm_mode->vsync_end = drm_mode->vsync_start + vsync; in drm_cvt_mode()
320 tmp = drm_mode->htotal; /* perform intermediate calcs in u64 */ in drm_cvt_mode()
323 tmp -= drm_mode->clock % CVT_CLOCK_STEP; in drm_cvt_mode()
324 drm_mode->clock = tmp; in drm_cvt_mode()
326 /* ignore - just set the mode flag for interlaced */ in drm_cvt_mode()
328 drm_mode->vtotal *= 2; in drm_cvt_mode()
329 drm_mode->flags |= DRM_MODE_FLAG_INTERLACE; in drm_cvt_mode()
331 /* Fill the mode line name */ in drm_cvt_mode()
334 drm_mode->flags |= (DRM_MODE_FLAG_PHSYNC | in drm_cvt_mode()
337 drm_mode->flags |= (DRM_MODE_FLAG_PVSYNC | in drm_cvt_mode()
345 * drm_gtf_mode_complex - create the modeline based on the full GTF algorithm
350 * @interlaced: whether to compute an interlaced mode
362 * The display mode object is allocated with drm_mode_create(). Returns NULL
363 * when no mode could be allocated.
369 { /* 1) top/bottom margin size (% of height) - default: 1.8, */ in drm_gtf_mode_complex()
371 /* 2) character cell horizontal granularity (pixels) - default 8 */ in drm_gtf_mode_complex()
373 /* 3) Minimum vertical porch (lines) - default 3 */ in drm_gtf_mode_complex()
382 #define GTF_C_PRIME ((((GTF_2C - GTF_2J) * GTF_K / 256) + GTF_2J) / 2) in drm_gtf_mode_complex()
445 tmp1 = (1000000 - MIN_VSYNC_PLUS_BP * vfieldrate_rqd) / 500; in drm_gtf_mode_complex()
456 vback_porch = vsync_plus_bp - V_SYNC_RQD; in drm_gtf_mode_complex()
484 ideal_duty_cycle = GTF_C_PRIME * 1000 - in drm_gtf_mode_complex()
489 (100000 - ideal_duty_cycle); in drm_gtf_mode_complex()
505 hfront_porch = hblank / 2 - hsync; in drm_gtf_mode_complex()
509 /* finally, pack the results in the mode struct */ in drm_gtf_mode_complex()
510 drm_mode->hdisplay = hdisplay_rnd; in drm_gtf_mode_complex()
511 drm_mode->hsync_start = hdisplay_rnd + hfront_porch; in drm_gtf_mode_complex()
512 drm_mode->hsync_end = drm_mode->hsync_start + hsync; in drm_gtf_mode_complex()
513 drm_mode->htotal = total_pixels; in drm_gtf_mode_complex()
514 drm_mode->vdisplay = vdisplay_rnd; in drm_gtf_mode_complex()
515 drm_mode->vsync_start = vdisplay_rnd + vodd_front_porch_lines; in drm_gtf_mode_complex()
516 drm_mode->vsync_end = drm_mode->vsync_start + V_SYNC_RQD; in drm_gtf_mode_complex()
517 drm_mode->vtotal = vtotal_lines; in drm_gtf_mode_complex()
519 drm_mode->clock = pixel_freq; in drm_gtf_mode_complex()
522 drm_mode->vtotal *= 2; in drm_gtf_mode_complex()
523 drm_mode->flags |= DRM_MODE_FLAG_INTERLACE; in drm_gtf_mode_complex()
528 drm_mode->flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC; in drm_gtf_mode_complex()
530 drm_mode->flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC; in drm_gtf_mode_complex()
537 * drm_gtf_mode - create the modeline based on the GTF algorithm
542 * @interlaced: whether to compute an interlaced mode
567 * The display mode object is allocated with drm_mode_create(). Returns NULL
568 * when no mode could be allocated.
582 * drm_display_mode_from_videomode - fill in @dmode using @vm,
586 * Fills out @dmode using the display mode specified in @vm.
591 dmode->hdisplay = vm->hactive; in drm_display_mode_from_videomode()
592 dmode->hsync_start = dmode->hdisplay + vm->hfront_porch; in drm_display_mode_from_videomode()
593 dmode->hsync_end = dmode->hsync_start + vm->hsync_len; in drm_display_mode_from_videomode()
594 dmode->htotal = dmode->hsync_end + vm->hback_porch; in drm_display_mode_from_videomode()
596 dmode->vdisplay = vm->vactive; in drm_display_mode_from_videomode()
597 dmode->vsync_start = dmode->vdisplay + vm->vfront_porch; in drm_display_mode_from_videomode()
598 dmode->vsync_end = dmode->vsync_start + vm->vsync_len; in drm_display_mode_from_videomode()
599 dmode->vtotal = dmode->vsync_end + vm->vback_porch; in drm_display_mode_from_videomode()
601 dmode->clock = vm->pixelclock / 1000; in drm_display_mode_from_videomode()
603 dmode->flags = 0; in drm_display_mode_from_videomode()
604 if (vm->flags & DISPLAY_FLAGS_HSYNC_HIGH) in drm_display_mode_from_videomode()
605 dmode->flags |= DRM_MODE_FLAG_PHSYNC; in drm_display_mode_from_videomode()
606 else if (vm->flags & DISPLAY_FLAGS_HSYNC_LOW) in drm_display_mode_from_videomode()
607 dmode->flags |= DRM_MODE_FLAG_NHSYNC; in drm_display_mode_from_videomode()
608 if (vm->flags & DISPLAY_FLAGS_VSYNC_HIGH) in drm_display_mode_from_videomode()
609 dmode->flags |= DRM_MODE_FLAG_PVSYNC; in drm_display_mode_from_videomode()
610 else if (vm->flags & DISPLAY_FLAGS_VSYNC_LOW) in drm_display_mode_from_videomode()
611 dmode->flags |= DRM_MODE_FLAG_NVSYNC; in drm_display_mode_from_videomode()
612 if (vm->flags & DISPLAY_FLAGS_INTERLACED) in drm_display_mode_from_videomode()
613 dmode->flags |= DRM_MODE_FLAG_INTERLACE; in drm_display_mode_from_videomode()
614 if (vm->flags & DISPLAY_FLAGS_DOUBLESCAN) in drm_display_mode_from_videomode()
615 dmode->flags |= DRM_MODE_FLAG_DBLSCAN; in drm_display_mode_from_videomode()
616 if (vm->flags & DISPLAY_FLAGS_DOUBLECLK) in drm_display_mode_from_videomode()
617 dmode->flags |= DRM_MODE_FLAG_DBLCLK; in drm_display_mode_from_videomode()
623 * drm_display_mode_to_videomode - fill in @vm using @dmode,
627 * Fills out @vm using the display mode specified in @dmode.
632 vm->hactive = dmode->hdisplay; in drm_display_mode_to_videomode()
633 vm->hfront_porch = dmode->hsync_start - dmode->hdisplay; in drm_display_mode_to_videomode()
634 vm->hsync_len = dmode->hsync_end - dmode->hsync_start; in drm_display_mode_to_videomode()
635 vm->hback_porch = dmode->htotal - dmode->hsync_end; in drm_display_mode_to_videomode()
637 vm->vactive = dmode->vdisplay; in drm_display_mode_to_videomode()
638 vm->vfront_porch = dmode->vsync_start - dmode->vdisplay; in drm_display_mode_to_videomode()
639 vm->vsync_len = dmode->vsync_end - dmode->vsync_start; in drm_display_mode_to_videomode()
640 vm->vback_porch = dmode->vtotal - dmode->vsync_end; in drm_display_mode_to_videomode()
642 vm->pixelclock = dmode->clock * 1000; in drm_display_mode_to_videomode()
644 vm->flags = 0; in drm_display_mode_to_videomode()
645 if (dmode->flags & DRM_MODE_FLAG_PHSYNC) in drm_display_mode_to_videomode()
646 vm->flags |= DISPLAY_FLAGS_HSYNC_HIGH; in drm_display_mode_to_videomode()
647 else if (dmode->flags & DRM_MODE_FLAG_NHSYNC) in drm_display_mode_to_videomode()
648 vm->flags |= DISPLAY_FLAGS_HSYNC_LOW; in drm_display_mode_to_videomode()
649 if (dmode->flags & DRM_MODE_FLAG_PVSYNC) in drm_display_mode_to_videomode()
650 vm->flags |= DISPLAY_FLAGS_VSYNC_HIGH; in drm_display_mode_to_videomode()
651 else if (dmode->flags & DRM_MODE_FLAG_NVSYNC) in drm_display_mode_to_videomode()
652 vm->flags |= DISPLAY_FLAGS_VSYNC_LOW; in drm_display_mode_to_videomode()
653 if (dmode->flags & DRM_MODE_FLAG_INTERLACE) in drm_display_mode_to_videomode()
654 vm->flags |= DISPLAY_FLAGS_INTERLACED; in drm_display_mode_to_videomode()
655 if (dmode->flags & DRM_MODE_FLAG_DBLSCAN) in drm_display_mode_to_videomode()
656 vm->flags |= DISPLAY_FLAGS_DOUBLESCAN; in drm_display_mode_to_videomode()
657 if (dmode->flags & DRM_MODE_FLAG_DBLCLK) in drm_display_mode_to_videomode()
658 vm->flags |= DISPLAY_FLAGS_DOUBLECLK; in drm_display_mode_to_videomode()
663 * drm_bus_flags_from_videomode - extract information about pixelclk and
676 if (vm->flags & DISPLAY_FLAGS_PIXDATA_POSEDGE) in drm_bus_flags_from_videomode()
678 if (vm->flags & DISPLAY_FLAGS_PIXDATA_NEGEDGE) in drm_bus_flags_from_videomode()
681 if (vm->flags & DISPLAY_FLAGS_SYNC_POSEDGE) in drm_bus_flags_from_videomode()
683 if (vm->flags & DISPLAY_FLAGS_SYNC_NEGEDGE) in drm_bus_flags_from_videomode()
686 if (vm->flags & DISPLAY_FLAGS_DE_LOW) in drm_bus_flags_from_videomode()
688 if (vm->flags & DISPLAY_FLAGS_DE_HIGH) in drm_bus_flags_from_videomode()
695 * of_get_drm_display_mode - get a drm_display_mode from devicetree
701 * This function is expensive and should only be used, if only one mode is to be
723 pr_debug("%pOF: got %dx%d display mode\n", in of_get_drm_display_mode()
734 * drm_mode_set_name - set the name on a mode
735 * @mode: name will be set in this mode
737 * Set the name of @mode to a standard format which is <hdisplay>x<vdisplay>
740 void drm_mode_set_name(struct drm_display_mode *mode) in drm_mode_set_name() argument
742 bool interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); in drm_mode_set_name()
744 snprintf(mode->name, DRM_DISPLAY_MODE_LEN, "%dx%d%s", in drm_mode_set_name()
745 mode->hdisplay, mode->vdisplay, in drm_mode_set_name()
751 * drm_mode_vrefresh - get the vrefresh of a mode
752 * @mode: mode
758 int drm_mode_vrefresh(const struct drm_display_mode *mode) in drm_mode_vrefresh() argument
762 if (mode->htotal == 0 || mode->vtotal == 0) in drm_mode_vrefresh()
765 num = mode->clock * 1000; in drm_mode_vrefresh()
766 den = mode->htotal * mode->vtotal; in drm_mode_vrefresh()
768 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in drm_mode_vrefresh()
770 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) in drm_mode_vrefresh()
772 if (mode->vscan > 1) in drm_mode_vrefresh()
773 den *= mode->vscan; in drm_mode_vrefresh()
780 * drm_mode_get_hv_timing - Fetches hdisplay/vdisplay for given mode
781 * @mode: mode to query
785 * The vdisplay value will be doubled if the specified mode is a stereo mode of
788 void drm_mode_get_hv_timing(const struct drm_display_mode *mode, in drm_mode_get_hv_timing() argument
791 struct drm_display_mode adjusted = *mode; in drm_mode_get_hv_timing()
800 * drm_mode_set_crtcinfo - set CRTC modesetting timing parameters
801 * @p: mode
806 * - The CRTC_INTERLACE_HALVE_V flag can be used to halve vertical timings of
808 * - The CRTC_STEREO_DOUBLE flag can be used to compute the timings for
811 * - The CRTC_NO_DBLSCAN and CRTC_NO_VSCAN flags request that adjustment *not*
819 p->crtc_clock = p->clock; in drm_mode_set_crtcinfo()
820 p->crtc_hdisplay = p->hdisplay; in drm_mode_set_crtcinfo()
821 p->crtc_hsync_start = p->hsync_start; in drm_mode_set_crtcinfo()
822 p->crtc_hsync_end = p->hsync_end; in drm_mode_set_crtcinfo()
823 p->crtc_htotal = p->htotal; in drm_mode_set_crtcinfo()
824 p->crtc_hskew = p->hskew; in drm_mode_set_crtcinfo()
825 p->crtc_vdisplay = p->vdisplay; in drm_mode_set_crtcinfo()
826 p->crtc_vsync_start = p->vsync_start; in drm_mode_set_crtcinfo()
827 p->crtc_vsync_end = p->vsync_end; in drm_mode_set_crtcinfo()
828 p->crtc_vtotal = p->vtotal; in drm_mode_set_crtcinfo()
830 if (p->flags & DRM_MODE_FLAG_INTERLACE) { in drm_mode_set_crtcinfo()
832 p->crtc_vdisplay /= 2; in drm_mode_set_crtcinfo()
833 p->crtc_vsync_start /= 2; in drm_mode_set_crtcinfo()
834 p->crtc_vsync_end /= 2; in drm_mode_set_crtcinfo()
835 p->crtc_vtotal /= 2; in drm_mode_set_crtcinfo()
840 if (p->flags & DRM_MODE_FLAG_DBLSCAN) { in drm_mode_set_crtcinfo()
841 p->crtc_vdisplay *= 2; in drm_mode_set_crtcinfo()
842 p->crtc_vsync_start *= 2; in drm_mode_set_crtcinfo()
843 p->crtc_vsync_end *= 2; in drm_mode_set_crtcinfo()
844 p->crtc_vtotal *= 2; in drm_mode_set_crtcinfo()
849 if (p->vscan > 1) { in drm_mode_set_crtcinfo()
850 p->crtc_vdisplay *= p->vscan; in drm_mode_set_crtcinfo()
851 p->crtc_vsync_start *= p->vscan; in drm_mode_set_crtcinfo()
852 p->crtc_vsync_end *= p->vscan; in drm_mode_set_crtcinfo()
853 p->crtc_vtotal *= p->vscan; in drm_mode_set_crtcinfo()
858 unsigned int layout = p->flags & DRM_MODE_FLAG_3D_MASK; in drm_mode_set_crtcinfo()
862 p->crtc_clock *= 2; in drm_mode_set_crtcinfo()
863 p->crtc_vdisplay += p->crtc_vtotal; in drm_mode_set_crtcinfo()
864 p->crtc_vsync_start += p->crtc_vtotal; in drm_mode_set_crtcinfo()
865 p->crtc_vsync_end += p->crtc_vtotal; in drm_mode_set_crtcinfo()
866 p->crtc_vtotal += p->crtc_vtotal; in drm_mode_set_crtcinfo()
871 p->crtc_vblank_start = min(p->crtc_vsync_start, p->crtc_vdisplay); in drm_mode_set_crtcinfo()
872 p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal); in drm_mode_set_crtcinfo()
873 p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay); in drm_mode_set_crtcinfo()
874 p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal); in drm_mode_set_crtcinfo()
879 * drm_mode_copy - copy the mode
880 * @dst: mode to overwrite
881 * @src: mode to copy
883 * Copy an existing mode into another mode, preserving the object id and
884 * list head of the destination mode.
888 struct list_head head = dst->head; in drm_mode_copy()
891 dst->head = head; in drm_mode_copy()
896 * drm_mode_duplicate - allocate and duplicate an existing mode
897 * @dev: drm_device to allocate the duplicated mode for
898 * @mode: mode to duplicate
900 * Just allocate a new mode, copy the existing mode into it, and return
904 * Pointer to duplicated mode on success, NULL on error.
907 const struct drm_display_mode *mode) in drm_mode_duplicate() argument
915 drm_mode_copy(nmode, mode); in drm_mode_duplicate()
924 return mode1->hdisplay == mode2->hdisplay && in drm_mode_match_timings()
925 mode1->hsync_start == mode2->hsync_start && in drm_mode_match_timings()
926 mode1->hsync_end == mode2->hsync_end && in drm_mode_match_timings()
927 mode1->htotal == mode2->htotal && in drm_mode_match_timings()
928 mode1->hskew == mode2->hskew && in drm_mode_match_timings()
929 mode1->vdisplay == mode2->vdisplay && in drm_mode_match_timings()
930 mode1->vsync_start == mode2->vsync_start && in drm_mode_match_timings()
931 mode1->vsync_end == mode2->vsync_end && in drm_mode_match_timings()
932 mode1->vtotal == mode2->vtotal && in drm_mode_match_timings()
933 mode1->vscan == mode2->vscan; in drm_mode_match_timings()
943 if (mode1->clock && mode2->clock) in drm_mode_match_clock()
944 return KHZ2PICOS(mode1->clock) == KHZ2PICOS(mode2->clock); in drm_mode_match_clock()
946 return mode1->clock == mode2->clock; in drm_mode_match_clock()
952 return (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) == in drm_mode_match_flags()
953 (mode2->flags & ~DRM_MODE_FLAG_3D_MASK); in drm_mode_match_flags()
959 return (mode1->flags & DRM_MODE_FLAG_3D_MASK) == in drm_mode_match_3d_flags()
960 (mode2->flags & DRM_MODE_FLAG_3D_MASK); in drm_mode_match_3d_flags()
966 return mode1->picture_aspect_ratio == mode2->picture_aspect_ratio; in drm_mode_match_aspect_ratio()
970 * drm_mode_match - test modes for (partial) equality
971 * @mode1: first mode
972 * @mode2: second mode
1015 * drm_mode_equal - test modes for equality
1016 * @mode1: first mode
1017 * @mode2: second mode
1037 * drm_mode_equal_no_clocks - test modes for equality
1038 * @mode1: first mode
1039 * @mode2: second mode
1058 * drm_mode_equal_no_clocks_no_stereo - test modes for equality
1059 * @mode1: first mode
1060 * @mode2: second mode
1078 drm_mode_validate_basic(const struct drm_display_mode *mode) in drm_mode_validate_basic() argument
1080 if (mode->type & ~DRM_MODE_TYPE_ALL) in drm_mode_validate_basic()
1083 if (mode->flags & ~DRM_MODE_FLAG_ALL) in drm_mode_validate_basic()
1086 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) > DRM_MODE_FLAG_3D_MAX) in drm_mode_validate_basic()
1089 if (mode->clock == 0) in drm_mode_validate_basic()
1092 if (mode->hdisplay == 0 || in drm_mode_validate_basic()
1093 mode->hsync_start < mode->hdisplay || in drm_mode_validate_basic()
1094 mode->hsync_end < mode->hsync_start || in drm_mode_validate_basic()
1095 mode->htotal < mode->hsync_end) in drm_mode_validate_basic()
1098 if (mode->vdisplay == 0 || in drm_mode_validate_basic()
1099 mode->vsync_start < mode->vdisplay || in drm_mode_validate_basic()
1100 mode->vsync_end < mode->vsync_start || in drm_mode_validate_basic()
1101 mode->vtotal < mode->vsync_end) in drm_mode_validate_basic()
1108 * drm_mode_validate_driver - make sure the mode is somewhat sane
1110 * @mode: mode to check
1112 * First do basic validation on the mode, and then allow the driver
1117 * The mode status
1121 const struct drm_display_mode *mode) in drm_mode_validate_driver() argument
1125 status = drm_mode_validate_basic(mode); in drm_mode_validate_driver()
1129 if (dev->mode_config.funcs->mode_valid) in drm_mode_validate_driver()
1130 return dev->mode_config.funcs->mode_valid(dev, mode); in drm_mode_validate_driver()
1137 * drm_mode_validate_size - make sure modes adhere to size constraints
1138 * @mode: mode to check
1143 * limitations of the DRM device/connector. If a mode is too big its status
1148 * The mode status
1151 drm_mode_validate_size(const struct drm_display_mode *mode, in drm_mode_validate_size() argument
1154 if (maxX > 0 && mode->hdisplay > maxX) in drm_mode_validate_size()
1157 if (maxY > 0 && mode->vdisplay > maxY) in drm_mode_validate_size()
1165 * drm_mode_validate_ycbcr420 - add 'ycbcr420-only' modes only when allowed
1166 * @mode: mode to check
1170 * only mode, when the source doesn't support it.
1173 * The mode status
1176 drm_mode_validate_ycbcr420(const struct drm_display_mode *mode, in drm_mode_validate_ycbcr420() argument
1179 u8 vic = drm_match_cea_mode(mode); in drm_mode_validate_ycbcr420()
1181 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in drm_mode_validate_ycbcr420()
1183 if (test_bit(vic, hdmi->y420_vdb_modes)) { in drm_mode_validate_ycbcr420()
1184 if (!connector->ycbcr_420_allowed) in drm_mode_validate_ycbcr420()
1250 * drm_mode_prune_invalid - remove invalid modes from mode list
1255 * This helper function can be used to prune a display mode list after
1257 * removed from the list, and if @verbose the status code and mode name is also
1263 struct drm_display_mode *mode, *t; in drm_mode_prune_invalid() local
1265 list_for_each_entry_safe(mode, t, mode_list, head) { in drm_mode_prune_invalid()
1266 if (mode->status != MODE_OK) { in drm_mode_prune_invalid()
1267 list_del(&mode->head); in drm_mode_prune_invalid()
1269 drm_mode_debug_printmodeline(mode); in drm_mode_prune_invalid()
1270 DRM_DEBUG_KMS("Not using %s mode: %s\n", in drm_mode_prune_invalid()
1271 mode->name, in drm_mode_prune_invalid()
1272 drm_get_mode_status_name(mode->status)); in drm_mode_prune_invalid()
1274 drm_mode_destroy(dev, mode); in drm_mode_prune_invalid()
1281 * drm_mode_compare - compare modes for favorability
1283 * @lh_a: list_head for first mode
1284 * @lh_b: list_head for second mode
1299 diff = ((b->type & DRM_MODE_TYPE_PREFERRED) != 0) - in drm_mode_compare()
1300 ((a->type & DRM_MODE_TYPE_PREFERRED) != 0); in drm_mode_compare()
1303 diff = b->hdisplay * b->vdisplay - a->hdisplay * a->vdisplay; in drm_mode_compare()
1307 diff = drm_mode_vrefresh(b) - drm_mode_vrefresh(a); in drm_mode_compare()
1311 diff = b->clock - a->clock; in drm_mode_compare()
1316 * drm_mode_sort - sort mode list
1328 * drm_connector_list_update - update the mode list for the connector
1332 * to the actual mode list. It compares the probed mode against the current
1342 WARN_ON(!mutex_is_locked(&connector->dev->mode_config.mutex)); in drm_connector_list_update()
1344 list_for_each_entry_safe(pmode, pt, &connector->probed_modes, head) { in drm_connector_list_update()
1345 struct drm_display_mode *mode; in drm_connector_list_update() local
1348 /* go through current modes checking for the new probed mode */ in drm_connector_list_update()
1349 list_for_each_entry(mode, &connector->modes, head) { in drm_connector_list_update()
1350 if (!drm_mode_equal(pmode, mode)) in drm_connector_list_update()
1356 * If the old matching mode is stale (ie. left over in drm_connector_list_update()
1365 * the mode added to the probed_modes list first. in drm_connector_list_update()
1367 if (mode->status == MODE_STALE) { in drm_connector_list_update()
1368 drm_mode_copy(mode, pmode); in drm_connector_list_update()
1369 } else if ((mode->type & DRM_MODE_TYPE_PREFERRED) == 0 && in drm_connector_list_update()
1370 (pmode->type & DRM_MODE_TYPE_PREFERRED) != 0) { in drm_connector_list_update()
1371 pmode->type |= mode->type; in drm_connector_list_update()
1372 drm_mode_copy(mode, pmode); in drm_connector_list_update()
1374 mode->type |= pmode->type; in drm_connector_list_update()
1377 list_del(&pmode->head); in drm_connector_list_update()
1378 drm_mode_destroy(connector->dev, pmode); in drm_connector_list_update()
1383 list_move_tail(&pmode->head, &connector->modes); in drm_connector_list_update()
1390 struct drm_cmdline_mode *mode) in drm_mode_parse_cmdline_bpp() argument
1394 if (str[0] != '-') in drm_mode_parse_cmdline_bpp()
1395 return -EINVAL; in drm_mode_parse_cmdline_bpp()
1400 return -EINVAL; in drm_mode_parse_cmdline_bpp()
1402 mode->bpp = bpp; in drm_mode_parse_cmdline_bpp()
1403 mode->bpp_specified = true; in drm_mode_parse_cmdline_bpp()
1409 struct drm_cmdline_mode *mode) in drm_mode_parse_cmdline_refresh() argument
1414 return -EINVAL; in drm_mode_parse_cmdline_refresh()
1419 return -EINVAL; in drm_mode_parse_cmdline_refresh()
1421 mode->refresh = refresh; in drm_mode_parse_cmdline_refresh()
1422 mode->refresh_specified = true; in drm_mode_parse_cmdline_refresh()
1430 struct drm_cmdline_mode *mode) in drm_mode_parse_cmdline_extra() argument
1438 return -EINVAL; in drm_mode_parse_cmdline_extra()
1440 mode->interlace = true; in drm_mode_parse_cmdline_extra()
1444 return -EINVAL; in drm_mode_parse_cmdline_extra()
1446 mode->margins = true; in drm_mode_parse_cmdline_extra()
1449 if (mode->force != DRM_FORCE_UNSPECIFIED) in drm_mode_parse_cmdline_extra()
1450 return -EINVAL; in drm_mode_parse_cmdline_extra()
1452 if ((connector->connector_type != DRM_MODE_CONNECTOR_DVII) && in drm_mode_parse_cmdline_extra()
1453 (connector->connector_type != DRM_MODE_CONNECTOR_HDMIB)) in drm_mode_parse_cmdline_extra()
1454 mode->force = DRM_FORCE_ON; in drm_mode_parse_cmdline_extra()
1456 mode->force = DRM_FORCE_ON_DIGITAL; in drm_mode_parse_cmdline_extra()
1459 if (mode->force != DRM_FORCE_UNSPECIFIED) in drm_mode_parse_cmdline_extra()
1460 return -EINVAL; in drm_mode_parse_cmdline_extra()
1462 mode->force = DRM_FORCE_OFF; in drm_mode_parse_cmdline_extra()
1465 if (mode->force != DRM_FORCE_UNSPECIFIED) in drm_mode_parse_cmdline_extra()
1466 return -EINVAL; in drm_mode_parse_cmdline_extra()
1468 mode->force = DRM_FORCE_ON; in drm_mode_parse_cmdline_extra()
1471 return -EINVAL; in drm_mode_parse_cmdline_extra()
1481 struct drm_cmdline_mode *mode) in drm_mode_parse_cmdline_res_mode() argument
1491 return -EINVAL; in drm_mode_parse_cmdline_res_mode()
1494 return -EINVAL; in drm_mode_parse_cmdline_res_mode()
1500 return -EINVAL; in drm_mode_parse_cmdline_res_mode()
1502 remaining = length - (end_ptr - str_start); in drm_mode_parse_cmdline_res_mode()
1504 return -EINVAL; in drm_mode_parse_cmdline_res_mode()
1525 mode); in drm_mode_parse_cmdline_res_mode()
1529 return -EINVAL; in drm_mode_parse_cmdline_res_mode()
1534 mode->xres = xres; in drm_mode_parse_cmdline_res_mode()
1535 mode->yres = yres; in drm_mode_parse_cmdline_res_mode()
1536 mode->cvt = cvt; in drm_mode_parse_cmdline_res_mode()
1537 mode->rb = rb; in drm_mode_parse_cmdline_res_mode()
1553 return -EINVAL; in drm_mode_parse_cmdline_int()
1560 return -EINVAL; in drm_mode_parse_cmdline_int()
1566 struct drm_cmdline_mode *mode) in drm_mode_parse_panel_orientation() argument
1571 return -EINVAL; in drm_mode_parse_panel_orientation()
1578 if (!strncmp(value, "normal", delim - value)) in drm_mode_parse_panel_orientation()
1579 mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL; in drm_mode_parse_panel_orientation()
1580 else if (!strncmp(value, "upside_down", delim - value)) in drm_mode_parse_panel_orientation()
1581 mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; in drm_mode_parse_panel_orientation()
1582 else if (!strncmp(value, "left_side_up", delim - value)) in drm_mode_parse_panel_orientation()
1583 mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP; in drm_mode_parse_panel_orientation()
1584 else if (!strncmp(value, "right_side_up", delim - value)) in drm_mode_parse_panel_orientation()
1585 mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP; in drm_mode_parse_panel_orientation()
1587 return -EINVAL; in drm_mode_parse_panel_orientation()
1595 struct drm_cmdline_mode *mode) in drm_mode_parse_cmdline_options() argument
1610 if (!strncmp(option, "rotate", delim - option)) { in drm_mode_parse_cmdline_options()
1612 return -EINVAL; in drm_mode_parse_cmdline_options()
1632 return -EINVAL; in drm_mode_parse_cmdline_options()
1634 } else if (!strncmp(option, "reflect_x", delim - option)) { in drm_mode_parse_cmdline_options()
1636 } else if (!strncmp(option, "reflect_y", delim - option)) { in drm_mode_parse_cmdline_options()
1638 } else if (!strncmp(option, "margin_right", delim - option)) { in drm_mode_parse_cmdline_options()
1640 return -EINVAL; in drm_mode_parse_cmdline_options()
1642 mode->tv_margins.right = margin; in drm_mode_parse_cmdline_options()
1643 } else if (!strncmp(option, "margin_left", delim - option)) { in drm_mode_parse_cmdline_options()
1645 return -EINVAL; in drm_mode_parse_cmdline_options()
1647 mode->tv_margins.left = margin; in drm_mode_parse_cmdline_options()
1648 } else if (!strncmp(option, "margin_top", delim - option)) { in drm_mode_parse_cmdline_options()
1650 return -EINVAL; in drm_mode_parse_cmdline_options()
1652 mode->tv_margins.top = margin; in drm_mode_parse_cmdline_options()
1653 } else if (!strncmp(option, "margin_bottom", delim - option)) { in drm_mode_parse_cmdline_options()
1655 return -EINVAL; in drm_mode_parse_cmdline_options()
1657 mode->tv_margins.bottom = margin; in drm_mode_parse_cmdline_options()
1658 } else if (!strncmp(option, "panel_orientation", delim - option)) { in drm_mode_parse_cmdline_options()
1659 if (drm_mode_parse_panel_orientation(delim, mode)) in drm_mode_parse_cmdline_options()
1660 return -EINVAL; in drm_mode_parse_cmdline_options()
1662 return -EINVAL; in drm_mode_parse_cmdline_options()
1669 return -EINVAL; in drm_mode_parse_cmdline_options()
1676 return -EINVAL; in drm_mode_parse_cmdline_options()
1678 mode->rotation_reflection = rotation; in drm_mode_parse_cmdline_options()
1689 * drm_mode_parse_command_line_for_connector - parse command line modeline for connector
1690 * @mode_option: optional per connector mode option
1692 * @mode: preallocated drm_cmdline_mode structure to fill out
1699 * force-enable, force-enable-digital and force-disable bit at the end::
1701 * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
1703 * Additionals options can be provided following the mode, using a comma to
1708 * options from the command line modline like the force-enable/disable flag.
1715 struct drm_cmdline_mode *mode) in drm_mode_parse_command_line_for_connector() argument
1726 memset(mode, 0, sizeof(*mode)); in drm_mode_parse_command_line_for_connector()
1727 mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; in drm_mode_parse_command_line_for_connector()
1735 bpp_ptr = strchr(name, '-'); in drm_mode_parse_command_line_for_connector()
1737 bpp_off = bpp_ptr - name; in drm_mode_parse_command_line_for_connector()
1741 refresh_off = refresh_ptr - name; in drm_mode_parse_command_line_for_connector()
1746 options_off = options_ptr - name; in drm_mode_parse_command_line_for_connector()
1761 /* First check for a named mode */ in drm_mode_parse_command_line_for_connector()
1768 strcpy(mode->name, drm_named_modes_whitelist[i]); in drm_mode_parse_command_line_for_connector()
1769 mode->specified = true; in drm_mode_parse_command_line_for_connector()
1774 /* No named mode? Check for a normal mode argument, e.g. 1024x768 */ in drm_mode_parse_command_line_for_connector()
1775 if (!mode->specified && isdigit(name[0])) { in drm_mode_parse_command_line_for_connector()
1779 mode); in drm_mode_parse_command_line_for_connector()
1783 mode->specified = true; in drm_mode_parse_command_line_for_connector()
1786 /* No mode? Check for freestanding extras and/or options */ in drm_mode_parse_command_line_for_connector()
1787 if (!mode->specified) { in drm_mode_parse_command_line_for_connector()
1796 options_ptr = mode_option - 1; in drm_mode_parse_command_line_for_connector()
1802 ret = drm_mode_parse_cmdline_bpp(bpp_ptr, &bpp_end_ptr, mode); in drm_mode_parse_command_line_for_connector()
1806 mode->bpp_specified = true; in drm_mode_parse_command_line_for_connector()
1811 &refresh_end_ptr, mode); in drm_mode_parse_command_line_for_connector()
1815 mode->refresh_specified = true; in drm_mode_parse_command_line_for_connector()
1831 len = options_ptr - extra_ptr; in drm_mode_parse_command_line_for_connector()
1836 connector, mode); in drm_mode_parse_command_line_for_connector()
1844 connector, mode); in drm_mode_parse_command_line_for_connector()
1854 * drm_mode_create_from_cmdline_mode - convert a command line modeline into a DRM display mode
1855 * @dev: DRM device to create the new mode for
1859 * Pointer to converted mode on success, NULL on error.
1865 struct drm_display_mode *mode; in drm_mode_create_from_cmdline_mode() local
1867 if (cmd->cvt) in drm_mode_create_from_cmdline_mode()
1868 mode = drm_cvt_mode(dev, in drm_mode_create_from_cmdline_mode()
1869 cmd->xres, cmd->yres, in drm_mode_create_from_cmdline_mode()
1870 cmd->refresh_specified ? cmd->refresh : 60, in drm_mode_create_from_cmdline_mode()
1871 cmd->rb, cmd->interlace, in drm_mode_create_from_cmdline_mode()
1872 cmd->margins); in drm_mode_create_from_cmdline_mode()
1874 mode = drm_gtf_mode(dev, in drm_mode_create_from_cmdline_mode()
1875 cmd->xres, cmd->yres, in drm_mode_create_from_cmdline_mode()
1876 cmd->refresh_specified ? cmd->refresh : 60, in drm_mode_create_from_cmdline_mode()
1877 cmd->interlace, in drm_mode_create_from_cmdline_mode()
1878 cmd->margins); in drm_mode_create_from_cmdline_mode()
1879 if (!mode) in drm_mode_create_from_cmdline_mode()
1882 mode->type |= DRM_MODE_TYPE_USERDEF; in drm_mode_create_from_cmdline_mode()
1884 if (cmd->xres == 1366) in drm_mode_create_from_cmdline_mode()
1885 drm_mode_fixup_1366x768(mode); in drm_mode_create_from_cmdline_mode()
1886 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); in drm_mode_create_from_cmdline_mode()
1887 return mode; in drm_mode_create_from_cmdline_mode()
1892 * drm_crtc_convert_to_umode - convert a drm_display_mode into a modeinfo
1902 out->clock = in->clock; in drm_mode_convert_to_umode()
1903 out->hdisplay = in->hdisplay; in drm_mode_convert_to_umode()
1904 out->hsync_start = in->hsync_start; in drm_mode_convert_to_umode()
1905 out->hsync_end = in->hsync_end; in drm_mode_convert_to_umode()
1906 out->htotal = in->htotal; in drm_mode_convert_to_umode()
1907 out->hskew = in->hskew; in drm_mode_convert_to_umode()
1908 out->vdisplay = in->vdisplay; in drm_mode_convert_to_umode()
1909 out->vsync_start = in->vsync_start; in drm_mode_convert_to_umode()
1910 out->vsync_end = in->vsync_end; in drm_mode_convert_to_umode()
1911 out->vtotal = in->vtotal; in drm_mode_convert_to_umode()
1912 out->vscan = in->vscan; in drm_mode_convert_to_umode()
1913 out->vrefresh = drm_mode_vrefresh(in); in drm_mode_convert_to_umode()
1914 out->flags = in->flags; in drm_mode_convert_to_umode()
1915 out->type = in->type; in drm_mode_convert_to_umode()
1917 switch (in->picture_aspect_ratio) { in drm_mode_convert_to_umode()
1919 out->flags |= DRM_MODE_FLAG_PIC_AR_4_3; in drm_mode_convert_to_umode()
1922 out->flags |= DRM_MODE_FLAG_PIC_AR_16_9; in drm_mode_convert_to_umode()
1925 out->flags |= DRM_MODE_FLAG_PIC_AR_64_27; in drm_mode_convert_to_umode()
1928 out->flags |= DRM_MODE_FLAG_PIC_AR_256_135; in drm_mode_convert_to_umode()
1931 WARN(1, "Invalid aspect ratio (0%x) on mode\n", in drm_mode_convert_to_umode()
1932 in->picture_aspect_ratio); in drm_mode_convert_to_umode()
1935 out->flags |= DRM_MODE_FLAG_PIC_AR_NONE; in drm_mode_convert_to_umode()
1939 strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN); in drm_mode_convert_to_umode()
1940 out->name[DRM_DISPLAY_MODE_LEN-1] = 0; in drm_mode_convert_to_umode()
1944 * drm_crtc_convert_umode - convert a modeinfo into a drm_display_mode
1959 if (in->clock > INT_MAX || in->vrefresh > INT_MAX) in drm_mode_convert_umode()
1960 return -ERANGE; in drm_mode_convert_umode()
1962 out->clock = in->clock; in drm_mode_convert_umode()
1963 out->hdisplay = in->hdisplay; in drm_mode_convert_umode()
1964 out->hsync_start = in->hsync_start; in drm_mode_convert_umode()
1965 out->hsync_end = in->hsync_end; in drm_mode_convert_umode()
1966 out->htotal = in->htotal; in drm_mode_convert_umode()
1967 out->hskew = in->hskew; in drm_mode_convert_umode()
1968 out->vdisplay = in->vdisplay; in drm_mode_convert_umode()
1969 out->vsync_start = in->vsync_start; in drm_mode_convert_umode()
1970 out->vsync_end = in->vsync_end; in drm_mode_convert_umode()
1971 out->vtotal = in->vtotal; in drm_mode_convert_umode()
1972 out->vscan = in->vscan; in drm_mode_convert_umode()
1973 out->flags = in->flags; in drm_mode_convert_umode()
1975 * Old xf86-video-vmware (possibly others too) used to in drm_mode_convert_umode()
1978 * useful for the kernel->userspace direction anyway. in drm_mode_convert_umode()
1980 out->type = in->type & DRM_MODE_TYPE_ALL; in drm_mode_convert_umode()
1981 strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN); in drm_mode_convert_umode()
1982 out->name[DRM_DISPLAY_MODE_LEN-1] = 0; in drm_mode_convert_umode()
1985 * as the aspect-ratio information is not stored in in drm_mode_convert_umode()
1986 * flags for kernel-mode, but in picture_aspect_ratio. in drm_mode_convert_umode()
1988 out->flags &= ~DRM_MODE_FLAG_PIC_AR_MASK; in drm_mode_convert_umode()
1990 switch (in->flags & DRM_MODE_FLAG_PIC_AR_MASK) { in drm_mode_convert_umode()
1992 out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3; in drm_mode_convert_umode()
1995 out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9; in drm_mode_convert_umode()
1998 out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27; in drm_mode_convert_umode()
2001 out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135; in drm_mode_convert_umode()
2004 out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE; in drm_mode_convert_umode()
2007 return -EINVAL; in drm_mode_convert_umode()
2010 out->status = drm_mode_validate_driver(dev, out); in drm_mode_convert_umode()
2011 if (out->status != MODE_OK) in drm_mode_convert_umode()
2012 return -EINVAL; in drm_mode_convert_umode()
2020 * drm_mode_is_420_only - if a given videomode can be only supported in YCBCR420
2024 * @mode: video mode to be tested.
2027 * true if the mode can be supported in YCBCR420 format
2031 const struct drm_display_mode *mode) in drm_mode_is_420_only() argument
2033 u8 vic = drm_match_cea_mode(mode); in drm_mode_is_420_only()
2035 return test_bit(vic, display->hdmi.y420_vdb_modes); in drm_mode_is_420_only()
2040 * drm_mode_is_420_also - if a given videomode can be supported in YCBCR420
2044 * @mode: video mode to be tested.
2047 * true if the mode can be support YCBCR420 format
2051 const struct drm_display_mode *mode) in drm_mode_is_420_also() argument
2053 u8 vic = drm_match_cea_mode(mode); in drm_mode_is_420_also()
2055 return test_bit(vic, display->hdmi.y420_cmdb_modes); in drm_mode_is_420_also()
2059 * drm_mode_is_420 - if a given videomode can be supported in YCBCR420
2063 * @mode: video mode to be tested.
2066 * true if the mode can be supported in YCBCR420 format
2070 const struct drm_display_mode *mode) in drm_mode_is_420() argument
2072 return drm_mode_is_420_only(display, mode) || in drm_mode_is_420()
2073 drm_mode_is_420_also(display, mode); in drm_mode_is_420()