• Home
  • Raw
  • Download

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
45 * drm_mode_debug_printmodeline - print a mode to dmesg
46 * @mode: mode to print
48 * Describe @mode using DRM_DEBUG.
50 void drm_mode_debug_printmodeline(const struct drm_display_mode *mode) in drm_mode_debug_printmodeline() argument
52 DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); in drm_mode_debug_printmodeline()
57 * drm_mode_create - create a new display mode
64 * Pointer to new mode on success, NULL on error.
74 if (drm_mode_object_add(dev, &nmode->base, DRM_MODE_OBJECT_MODE)) { in drm_mode_create()
84 * drm_mode_destroy - remove a mode
86 * @mode: mode to remove
88 * Release @mode's unique ID, then free it @mode structure itself using kfree.
90 void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode) in drm_mode_destroy() argument
92 if (!mode) in drm_mode_destroy()
95 drm_mode_object_unregister(dev, &mode->base); in drm_mode_destroy()
97 kfree(mode); in drm_mode_destroy()
102 * drm_mode_probed_add - add a mode to a connector's probed_mode list
103 * @connector: connector the new mode
104 * @mode: mode data
106 * Add @mode to @connector's probed_mode list for later use. This list should
111 struct drm_display_mode *mode) in drm_mode_probed_add() argument
113 WARN_ON(!mutex_is_locked(&connector->dev->mode_config.mutex)); in drm_mode_probed_add()
115 list_add_tail(&mode->head, &connector->probed_modes); in drm_mode_probed_add()
120 * drm_cvt_mode -create a modeline based on the CVT algorithm
126 * @interlaced: whether to compute an interlaced mode
140 * The display mode object is allocated with drm_mode_create(). Returns NULL
141 * when no mode could be allocated.
148 /* 1) top/bottom margin size (% of height) - default: 1.8, */ in drm_cvt_mode()
150 /* 2) character cell horizontal granularity (pixels) - default 8 */ in drm_cvt_mode()
152 /* 3) Minimum vertical porch (lines) - default 3 */ in drm_cvt_mode()
154 /* 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()
441 tmp1 = (1000000 - MIN_VSYNC_PLUS_BP * vfieldrate_rqd) / 500; in drm_gtf_mode_complex()
452 vback_porch = vsync_plus_bp - V_SYNC_RQD; in drm_gtf_mode_complex()
480 ideal_duty_cycle = GTF_C_PRIME * 1000 - in drm_gtf_mode_complex()
485 (100000 - ideal_duty_cycle); in drm_gtf_mode_complex()
501 hfront_porch = hblank / 2 - hsync; in drm_gtf_mode_complex()
505 /* finally, pack the results in the mode struct */ in drm_gtf_mode_complex()
506 drm_mode->hdisplay = hdisplay_rnd; in drm_gtf_mode_complex()
507 drm_mode->hsync_start = hdisplay_rnd + hfront_porch; in drm_gtf_mode_complex()
508 drm_mode->hsync_end = drm_mode->hsync_start + hsync; in drm_gtf_mode_complex()
509 drm_mode->htotal = total_pixels; in drm_gtf_mode_complex()
510 drm_mode->vdisplay = vdisplay_rnd; in drm_gtf_mode_complex()
511 drm_mode->vsync_start = vdisplay_rnd + vodd_front_porch_lines; in drm_gtf_mode_complex()
512 drm_mode->vsync_end = drm_mode->vsync_start + V_SYNC_RQD; in drm_gtf_mode_complex()
513 drm_mode->vtotal = vtotal_lines; in drm_gtf_mode_complex()
515 drm_mode->clock = pixel_freq; in drm_gtf_mode_complex()
518 drm_mode->vtotal *= 2; in drm_gtf_mode_complex()
519 drm_mode->flags |= DRM_MODE_FLAG_INTERLACE; in drm_gtf_mode_complex()
524 drm_mode->flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC; in drm_gtf_mode_complex()
526 drm_mode->flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC; in drm_gtf_mode_complex()
533 * drm_gtf_mode - create the modeline based on the GTF algorithm
538 * @interlaced: whether to compute an interlaced mode
563 * The display mode object is allocated with drm_mode_create(). Returns NULL
564 * when no mode could be allocated.
578 * drm_display_mode_from_videomode - fill in @dmode using @vm,
582 * Fills out @dmode using the display mode specified in @vm.
587 dmode->hdisplay = vm->hactive; in drm_display_mode_from_videomode()
588 dmode->hsync_start = dmode->hdisplay + vm->hfront_porch; in drm_display_mode_from_videomode()
589 dmode->hsync_end = dmode->hsync_start + vm->hsync_len; in drm_display_mode_from_videomode()
590 dmode->htotal = dmode->hsync_end + vm->hback_porch; in drm_display_mode_from_videomode()
592 dmode->vdisplay = vm->vactive; in drm_display_mode_from_videomode()
593 dmode->vsync_start = dmode->vdisplay + vm->vfront_porch; in drm_display_mode_from_videomode()
594 dmode->vsync_end = dmode->vsync_start + vm->vsync_len; in drm_display_mode_from_videomode()
595 dmode->vtotal = dmode->vsync_end + vm->vback_porch; in drm_display_mode_from_videomode()
597 dmode->clock = vm->pixelclock / 1000; in drm_display_mode_from_videomode()
599 dmode->flags = 0; in drm_display_mode_from_videomode()
600 if (vm->flags & DISPLAY_FLAGS_HSYNC_HIGH) in drm_display_mode_from_videomode()
601 dmode->flags |= DRM_MODE_FLAG_PHSYNC; in drm_display_mode_from_videomode()
602 else if (vm->flags & DISPLAY_FLAGS_HSYNC_LOW) in drm_display_mode_from_videomode()
603 dmode->flags |= DRM_MODE_FLAG_NHSYNC; in drm_display_mode_from_videomode()
604 if (vm->flags & DISPLAY_FLAGS_VSYNC_HIGH) in drm_display_mode_from_videomode()
605 dmode->flags |= DRM_MODE_FLAG_PVSYNC; in drm_display_mode_from_videomode()
606 else if (vm->flags & DISPLAY_FLAGS_VSYNC_LOW) in drm_display_mode_from_videomode()
607 dmode->flags |= DRM_MODE_FLAG_NVSYNC; in drm_display_mode_from_videomode()
608 if (vm->flags & DISPLAY_FLAGS_INTERLACED) in drm_display_mode_from_videomode()
609 dmode->flags |= DRM_MODE_FLAG_INTERLACE; in drm_display_mode_from_videomode()
610 if (vm->flags & DISPLAY_FLAGS_DOUBLESCAN) in drm_display_mode_from_videomode()
611 dmode->flags |= DRM_MODE_FLAG_DBLSCAN; in drm_display_mode_from_videomode()
612 if (vm->flags & DISPLAY_FLAGS_DOUBLECLK) in drm_display_mode_from_videomode()
613 dmode->flags |= DRM_MODE_FLAG_DBLCLK; in drm_display_mode_from_videomode()
619 * drm_display_mode_to_videomode - fill in @vm using @dmode,
623 * Fills out @vm using the display mode specified in @dmode.
628 vm->hactive = dmode->hdisplay; in drm_display_mode_to_videomode()
629 vm->hfront_porch = dmode->hsync_start - dmode->hdisplay; in drm_display_mode_to_videomode()
630 vm->hsync_len = dmode->hsync_end - dmode->hsync_start; in drm_display_mode_to_videomode()
631 vm->hback_porch = dmode->htotal - dmode->hsync_end; in drm_display_mode_to_videomode()
633 vm->vactive = dmode->vdisplay; in drm_display_mode_to_videomode()
634 vm->vfront_porch = dmode->vsync_start - dmode->vdisplay; in drm_display_mode_to_videomode()
635 vm->vsync_len = dmode->vsync_end - dmode->vsync_start; in drm_display_mode_to_videomode()
636 vm->vback_porch = dmode->vtotal - dmode->vsync_end; in drm_display_mode_to_videomode()
638 vm->pixelclock = dmode->clock * 1000; in drm_display_mode_to_videomode()
640 vm->flags = 0; in drm_display_mode_to_videomode()
641 if (dmode->flags & DRM_MODE_FLAG_PHSYNC) in drm_display_mode_to_videomode()
642 vm->flags |= DISPLAY_FLAGS_HSYNC_HIGH; in drm_display_mode_to_videomode()
643 else if (dmode->flags & DRM_MODE_FLAG_NHSYNC) in drm_display_mode_to_videomode()
644 vm->flags |= DISPLAY_FLAGS_HSYNC_LOW; in drm_display_mode_to_videomode()
645 if (dmode->flags & DRM_MODE_FLAG_PVSYNC) in drm_display_mode_to_videomode()
646 vm->flags |= DISPLAY_FLAGS_VSYNC_HIGH; in drm_display_mode_to_videomode()
647 else if (dmode->flags & DRM_MODE_FLAG_NVSYNC) in drm_display_mode_to_videomode()
648 vm->flags |= DISPLAY_FLAGS_VSYNC_LOW; in drm_display_mode_to_videomode()
649 if (dmode->flags & DRM_MODE_FLAG_INTERLACE) in drm_display_mode_to_videomode()
650 vm->flags |= DISPLAY_FLAGS_INTERLACED; in drm_display_mode_to_videomode()
651 if (dmode->flags & DRM_MODE_FLAG_DBLSCAN) in drm_display_mode_to_videomode()
652 vm->flags |= DISPLAY_FLAGS_DOUBLESCAN; in drm_display_mode_to_videomode()
653 if (dmode->flags & DRM_MODE_FLAG_DBLCLK) in drm_display_mode_to_videomode()
654 vm->flags |= DISPLAY_FLAGS_DOUBLECLK; in drm_display_mode_to_videomode()
659 * drm_bus_flags_from_videomode - extract information about pixelclk and
672 if (vm->flags & DISPLAY_FLAGS_PIXDATA_POSEDGE) in drm_bus_flags_from_videomode()
674 if (vm->flags & DISPLAY_FLAGS_PIXDATA_NEGEDGE) in drm_bus_flags_from_videomode()
677 if (vm->flags & DISPLAY_FLAGS_SYNC_POSEDGE) in drm_bus_flags_from_videomode()
679 if (vm->flags & DISPLAY_FLAGS_SYNC_NEGEDGE) in drm_bus_flags_from_videomode()
682 if (vm->flags & DISPLAY_FLAGS_DE_LOW) in drm_bus_flags_from_videomode()
684 if (vm->flags & DISPLAY_FLAGS_DE_HIGH) in drm_bus_flags_from_videomode()
691 * of_get_drm_display_mode - get a drm_display_mode from devicetree
697 * This function is expensive and should only be used, if only one mode is to be
719 pr_debug("%pOF: got %dx%d display mode from %s\n", in of_get_drm_display_mode()
720 np, vm.hactive, vm.vactive, np->name); in of_get_drm_display_mode()
730 * drm_mode_set_name - set the name on a mode
731 * @mode: name will be set in this mode
733 * Set the name of @mode to a standard format which is <hdisplay>x<vdisplay>
736 void drm_mode_set_name(struct drm_display_mode *mode) in drm_mode_set_name() argument
738 bool interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); in drm_mode_set_name()
740 snprintf(mode->name, DRM_DISPLAY_MODE_LEN, "%dx%d%s", in drm_mode_set_name()
741 mode->hdisplay, mode->vdisplay, in drm_mode_set_name()
747 * drm_mode_hsync - get the hsync of a mode
748 * @mode: mode
754 int drm_mode_hsync(const struct drm_display_mode *mode) in drm_mode_hsync() argument
758 if (mode->hsync) in drm_mode_hsync()
759 return mode->hsync; in drm_mode_hsync()
761 if (mode->htotal <= 0) in drm_mode_hsync()
764 calc_val = (mode->clock * 1000) / mode->htotal; /* hsync in Hz */ in drm_mode_hsync()
773 * drm_mode_vrefresh - get the vrefresh of a mode
774 * @mode: mode
780 int drm_mode_vrefresh(const struct drm_display_mode *mode) in drm_mode_vrefresh() argument
784 if (mode->vrefresh > 0) in drm_mode_vrefresh()
785 refresh = mode->vrefresh; in drm_mode_vrefresh()
786 else if (mode->htotal > 0 && mode->vtotal > 0) { in drm_mode_vrefresh()
789 num = mode->clock * 1000; in drm_mode_vrefresh()
790 den = mode->htotal * mode->vtotal; in drm_mode_vrefresh()
792 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in drm_mode_vrefresh()
794 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) in drm_mode_vrefresh()
796 if (mode->vscan > 1) in drm_mode_vrefresh()
797 den *= mode->vscan; in drm_mode_vrefresh()
806 * drm_mode_get_hv_timing - Fetches hdisplay/vdisplay for given mode
807 * @mode: mode to query
811 * The vdisplay value will be doubled if the specified mode is a stereo mode of
814 void drm_mode_get_hv_timing(const struct drm_display_mode *mode, in drm_mode_get_hv_timing() argument
817 struct drm_display_mode adjusted = *mode; in drm_mode_get_hv_timing()
826 * drm_mode_set_crtcinfo - set CRTC modesetting timing parameters
827 * @p: mode
832 * - The CRTC_INTERLACE_HALVE_V flag can be used to halve vertical timings of
834 * - The CRTC_STEREO_DOUBLE flag can be used to compute the timings for
837 * - The CRTC_NO_DBLSCAN and CRTC_NO_VSCAN flags request that adjustment *not*
845 p->crtc_clock = p->clock; in drm_mode_set_crtcinfo()
846 p->crtc_hdisplay = p->hdisplay; in drm_mode_set_crtcinfo()
847 p->crtc_hsync_start = p->hsync_start; in drm_mode_set_crtcinfo()
848 p->crtc_hsync_end = p->hsync_end; in drm_mode_set_crtcinfo()
849 p->crtc_htotal = p->htotal; in drm_mode_set_crtcinfo()
850 p->crtc_hskew = p->hskew; in drm_mode_set_crtcinfo()
851 p->crtc_vdisplay = p->vdisplay; in drm_mode_set_crtcinfo()
852 p->crtc_vsync_start = p->vsync_start; in drm_mode_set_crtcinfo()
853 p->crtc_vsync_end = p->vsync_end; in drm_mode_set_crtcinfo()
854 p->crtc_vtotal = p->vtotal; in drm_mode_set_crtcinfo()
856 if (p->flags & DRM_MODE_FLAG_INTERLACE) { in drm_mode_set_crtcinfo()
858 p->crtc_vdisplay /= 2; in drm_mode_set_crtcinfo()
859 p->crtc_vsync_start /= 2; in drm_mode_set_crtcinfo()
860 p->crtc_vsync_end /= 2; in drm_mode_set_crtcinfo()
861 p->crtc_vtotal /= 2; in drm_mode_set_crtcinfo()
866 if (p->flags & DRM_MODE_FLAG_DBLSCAN) { in drm_mode_set_crtcinfo()
867 p->crtc_vdisplay *= 2; in drm_mode_set_crtcinfo()
868 p->crtc_vsync_start *= 2; in drm_mode_set_crtcinfo()
869 p->crtc_vsync_end *= 2; in drm_mode_set_crtcinfo()
870 p->crtc_vtotal *= 2; in drm_mode_set_crtcinfo()
875 if (p->vscan > 1) { in drm_mode_set_crtcinfo()
876 p->crtc_vdisplay *= p->vscan; in drm_mode_set_crtcinfo()
877 p->crtc_vsync_start *= p->vscan; in drm_mode_set_crtcinfo()
878 p->crtc_vsync_end *= p->vscan; in drm_mode_set_crtcinfo()
879 p->crtc_vtotal *= p->vscan; in drm_mode_set_crtcinfo()
884 unsigned int layout = p->flags & DRM_MODE_FLAG_3D_MASK; in drm_mode_set_crtcinfo()
888 p->crtc_clock *= 2; in drm_mode_set_crtcinfo()
889 p->crtc_vdisplay += p->crtc_vtotal; in drm_mode_set_crtcinfo()
890 p->crtc_vsync_start += p->crtc_vtotal; in drm_mode_set_crtcinfo()
891 p->crtc_vsync_end += p->crtc_vtotal; in drm_mode_set_crtcinfo()
892 p->crtc_vtotal += p->crtc_vtotal; in drm_mode_set_crtcinfo()
897 p->crtc_vblank_start = min(p->crtc_vsync_start, p->crtc_vdisplay); in drm_mode_set_crtcinfo()
898 p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal); in drm_mode_set_crtcinfo()
899 p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay); in drm_mode_set_crtcinfo()
900 p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal); in drm_mode_set_crtcinfo()
905 * drm_mode_copy - copy the mode
906 * @dst: mode to overwrite
907 * @src: mode to copy
909 * Copy an existing mode into another mode, preserving the object id and
910 * list head of the destination mode.
914 int id = dst->base.id; in drm_mode_copy()
915 struct list_head head = dst->head; in drm_mode_copy()
918 dst->base.id = id; in drm_mode_copy()
919 dst->head = head; in drm_mode_copy()
924 * drm_mode_duplicate - allocate and duplicate an existing mode
925 * @dev: drm_device to allocate the duplicated mode for
926 * @mode: mode to duplicate
928 * Just allocate a new mode, copy the existing mode into it, and return
932 * Pointer to duplicated mode on success, NULL on error.
935 const struct drm_display_mode *mode) in drm_mode_duplicate() argument
943 drm_mode_copy(nmode, mode); in drm_mode_duplicate()
952 return mode1->hdisplay == mode2->hdisplay && in drm_mode_match_timings()
953 mode1->hsync_start == mode2->hsync_start && in drm_mode_match_timings()
954 mode1->hsync_end == mode2->hsync_end && in drm_mode_match_timings()
955 mode1->htotal == mode2->htotal && in drm_mode_match_timings()
956 mode1->hskew == mode2->hskew && in drm_mode_match_timings()
957 mode1->vdisplay == mode2->vdisplay && in drm_mode_match_timings()
958 mode1->vsync_start == mode2->vsync_start && in drm_mode_match_timings()
959 mode1->vsync_end == mode2->vsync_end && in drm_mode_match_timings()
960 mode1->vtotal == mode2->vtotal && in drm_mode_match_timings()
961 mode1->vscan == mode2->vscan; in drm_mode_match_timings()
971 if (mode1->clock && mode2->clock) in drm_mode_match_clock()
972 return KHZ2PICOS(mode1->clock) == KHZ2PICOS(mode2->clock); in drm_mode_match_clock()
974 return mode1->clock == mode2->clock; in drm_mode_match_clock()
980 return (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) == in drm_mode_match_flags()
981 (mode2->flags & ~DRM_MODE_FLAG_3D_MASK); in drm_mode_match_flags()
987 return (mode1->flags & DRM_MODE_FLAG_3D_MASK) == in drm_mode_match_3d_flags()
988 (mode2->flags & DRM_MODE_FLAG_3D_MASK); in drm_mode_match_3d_flags()
994 return mode1->picture_aspect_ratio == mode2->picture_aspect_ratio; in drm_mode_match_aspect_ratio()
998 * drm_mode_match - test modes for (partial) equality
999 * @mode1: first mode
1000 * @mode2: second mode
1043 * drm_mode_equal - test modes for equality
1044 * @mode1: first mode
1045 * @mode2: second mode
1065 * drm_mode_equal_no_clocks - test modes for equality
1066 * @mode1: first mode
1067 * @mode2: second mode
1086 * drm_mode_equal_no_clocks_no_stereo - test modes for equality
1087 * @mode1: first mode
1088 * @mode2: second mode
1106 drm_mode_validate_basic(const struct drm_display_mode *mode) in drm_mode_validate_basic() argument
1108 if (mode->type & ~DRM_MODE_TYPE_ALL) in drm_mode_validate_basic()
1111 if (mode->flags & ~DRM_MODE_FLAG_ALL) in drm_mode_validate_basic()
1114 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) > DRM_MODE_FLAG_3D_MAX) in drm_mode_validate_basic()
1117 if (mode->clock == 0) in drm_mode_validate_basic()
1120 if (mode->hdisplay == 0 || in drm_mode_validate_basic()
1121 mode->hsync_start < mode->hdisplay || in drm_mode_validate_basic()
1122 mode->hsync_end < mode->hsync_start || in drm_mode_validate_basic()
1123 mode->htotal < mode->hsync_end) in drm_mode_validate_basic()
1126 if (mode->vdisplay == 0 || in drm_mode_validate_basic()
1127 mode->vsync_start < mode->vdisplay || in drm_mode_validate_basic()
1128 mode->vsync_end < mode->vsync_start || in drm_mode_validate_basic()
1129 mode->vtotal < mode->vsync_end) in drm_mode_validate_basic()
1136 * drm_mode_validate_driver - make sure the mode is somewhat sane
1138 * @mode: mode to check
1140 * First do basic validation on the mode, and then allow the driver
1145 * The mode status
1149 const struct drm_display_mode *mode) in drm_mode_validate_driver() argument
1153 status = drm_mode_validate_basic(mode); in drm_mode_validate_driver()
1157 if (dev->mode_config.funcs->mode_valid) in drm_mode_validate_driver()
1158 return dev->mode_config.funcs->mode_valid(dev, mode); in drm_mode_validate_driver()
1165 * drm_mode_validate_size - make sure modes adhere to size constraints
1166 * @mode: mode to check
1171 * limitations of the DRM device/connector. If a mode is too big its status
1176 * The mode status
1179 drm_mode_validate_size(const struct drm_display_mode *mode, in drm_mode_validate_size() argument
1182 if (maxX > 0 && mode->hdisplay > maxX) in drm_mode_validate_size()
1185 if (maxY > 0 && mode->vdisplay > maxY) in drm_mode_validate_size()
1193 * drm_mode_validate_ycbcr420 - add 'ycbcr420-only' modes only when allowed
1194 * @mode: mode to check
1198 * only mode, when the source doesn't support it.
1201 * The mode status
1204 drm_mode_validate_ycbcr420(const struct drm_display_mode *mode, in drm_mode_validate_ycbcr420() argument
1207 u8 vic = drm_match_cea_mode(mode); in drm_mode_validate_ycbcr420()
1209 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in drm_mode_validate_ycbcr420()
1211 if (test_bit(vic, hdmi->y420_vdb_modes)) { in drm_mode_validate_ycbcr420()
1212 if (!connector->ycbcr_420_allowed) in drm_mode_validate_ycbcr420()
1278 * drm_mode_prune_invalid - remove invalid modes from mode list
1283 * This helper function can be used to prune a display mode list after
1285 * removed from the list, and if @verbose the status code and mode name is also
1291 struct drm_display_mode *mode, *t; in drm_mode_prune_invalid() local
1293 list_for_each_entry_safe(mode, t, mode_list, head) { in drm_mode_prune_invalid()
1294 if (mode->status != MODE_OK) { in drm_mode_prune_invalid()
1295 list_del(&mode->head); in drm_mode_prune_invalid()
1297 drm_mode_debug_printmodeline(mode); in drm_mode_prune_invalid()
1298 DRM_DEBUG_KMS("Not using %s mode: %s\n", in drm_mode_prune_invalid()
1299 mode->name, in drm_mode_prune_invalid()
1300 drm_get_mode_status_name(mode->status)); in drm_mode_prune_invalid()
1302 drm_mode_destroy(dev, mode); in drm_mode_prune_invalid()
1309 * drm_mode_compare - compare modes for favorability
1311 * @lh_a: list_head for first mode
1312 * @lh_b: list_head for second mode
1327 diff = ((b->type & DRM_MODE_TYPE_PREFERRED) != 0) - in drm_mode_compare()
1328 ((a->type & DRM_MODE_TYPE_PREFERRED) != 0); in drm_mode_compare()
1331 diff = b->hdisplay * b->vdisplay - a->hdisplay * a->vdisplay; in drm_mode_compare()
1335 diff = b->vrefresh - a->vrefresh; in drm_mode_compare()
1339 diff = b->clock - a->clock; in drm_mode_compare()
1344 * drm_mode_sort - sort mode list
1356 * drm_connector_list_update - update the mode list for the connector
1360 * to the actual mode list. It compares the probed mode against the current
1370 WARN_ON(!mutex_is_locked(&connector->dev->mode_config.mutex)); in drm_connector_list_update()
1372 list_for_each_entry_safe(pmode, pt, &connector->probed_modes, head) { in drm_connector_list_update()
1373 struct drm_display_mode *mode; in drm_connector_list_update() local
1376 /* go through current modes checking for the new probed mode */ in drm_connector_list_update()
1377 list_for_each_entry(mode, &connector->modes, head) { in drm_connector_list_update()
1378 if (!drm_mode_equal(pmode, mode)) in drm_connector_list_update()
1384 * If the old matching mode is stale (ie. left over in drm_connector_list_update()
1393 * the mode added to the probed_modes list first. in drm_connector_list_update()
1395 if (mode->status == MODE_STALE) { in drm_connector_list_update()
1396 drm_mode_copy(mode, pmode); in drm_connector_list_update()
1397 } else if ((mode->type & DRM_MODE_TYPE_PREFERRED) == 0 && in drm_connector_list_update()
1398 (pmode->type & DRM_MODE_TYPE_PREFERRED) != 0) { in drm_connector_list_update()
1399 pmode->type |= mode->type; in drm_connector_list_update()
1400 drm_mode_copy(mode, pmode); in drm_connector_list_update()
1402 mode->type |= pmode->type; in drm_connector_list_update()
1405 list_del(&pmode->head); in drm_connector_list_update()
1406 drm_mode_destroy(connector->dev, pmode); in drm_connector_list_update()
1411 list_move_tail(&pmode->head, &connector->modes); in drm_connector_list_update()
1418 * drm_mode_parse_command_line_for_connector - parse command line modeline for connector
1419 * @mode_option: optional per connector mode option
1421 * @mode: preallocated drm_cmdline_mode structure to fill out
1428 * force-enable, force-enable-digital and force-disable bit at the end::
1430 * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
1433 * options from the command line modline like the force-enable/disable flag.
1440 struct drm_cmdline_mode *mode) in drm_mode_parse_command_line_for_connector() argument
1457 mode->specified = false; in drm_mode_parse_command_line_for_connector()
1463 for (i = namelen-1; i >= 0; i--) { in drm_mode_parse_command_line_for_connector()
1474 case '-': in drm_mode_parse_command_line_for_connector()
1526 if ((connector->connector_type != DRM_MODE_CONNECTOR_DVII) && in drm_mode_parse_command_line_for_connector()
1527 (connector->connector_type != DRM_MODE_CONNECTOR_HDMIB)) in drm_mode_parse_command_line_for_connector()
1550 i = ch - name; in drm_mode_parse_command_line_for_connector()
1552 /* catch mode that begins with digits but has no 'x' */ in drm_mode_parse_command_line_for_connector()
1557 pr_warn("[drm] parse error at position %i in video mode '%s'\n", in drm_mode_parse_command_line_for_connector()
1559 mode->specified = false; in drm_mode_parse_command_line_for_connector()
1564 mode->specified = true; in drm_mode_parse_command_line_for_connector()
1565 mode->xres = xres; in drm_mode_parse_command_line_for_connector()
1566 mode->yres = yres; in drm_mode_parse_command_line_for_connector()
1570 mode->refresh_specified = true; in drm_mode_parse_command_line_for_connector()
1571 mode->refresh = refresh; in drm_mode_parse_command_line_for_connector()
1575 mode->bpp_specified = true; in drm_mode_parse_command_line_for_connector()
1576 mode->bpp = bpp; in drm_mode_parse_command_line_for_connector()
1578 mode->rb = rb; in drm_mode_parse_command_line_for_connector()
1579 mode->cvt = cvt; in drm_mode_parse_command_line_for_connector()
1580 mode->interlace = interlace; in drm_mode_parse_command_line_for_connector()
1581 mode->margins = margins; in drm_mode_parse_command_line_for_connector()
1582 mode->force = force; in drm_mode_parse_command_line_for_connector()
1589 * drm_mode_create_from_cmdline_mode - convert a command line modeline into a DRM display mode
1590 * @dev: DRM device to create the new mode for
1594 * Pointer to converted mode on success, NULL on error.
1600 struct drm_display_mode *mode; in drm_mode_create_from_cmdline_mode() local
1602 if (cmd->cvt) in drm_mode_create_from_cmdline_mode()
1603 mode = drm_cvt_mode(dev, in drm_mode_create_from_cmdline_mode()
1604 cmd->xres, cmd->yres, in drm_mode_create_from_cmdline_mode()
1605 cmd->refresh_specified ? cmd->refresh : 60, in drm_mode_create_from_cmdline_mode()
1606 cmd->rb, cmd->interlace, in drm_mode_create_from_cmdline_mode()
1607 cmd->margins); in drm_mode_create_from_cmdline_mode()
1609 mode = drm_gtf_mode(dev, in drm_mode_create_from_cmdline_mode()
1610 cmd->xres, cmd->yres, in drm_mode_create_from_cmdline_mode()
1611 cmd->refresh_specified ? cmd->refresh : 60, in drm_mode_create_from_cmdline_mode()
1612 cmd->interlace, in drm_mode_create_from_cmdline_mode()
1613 cmd->margins); in drm_mode_create_from_cmdline_mode()
1614 if (!mode) in drm_mode_create_from_cmdline_mode()
1617 mode->type |= DRM_MODE_TYPE_USERDEF; in drm_mode_create_from_cmdline_mode()
1619 if (cmd->xres == 1366) in drm_mode_create_from_cmdline_mode()
1620 drm_mode_fixup_1366x768(mode); in drm_mode_create_from_cmdline_mode()
1621 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); in drm_mode_create_from_cmdline_mode()
1622 return mode; in drm_mode_create_from_cmdline_mode()
1627 * drm_crtc_convert_to_umode - convert a drm_display_mode into a modeinfo
1637 WARN(in->hdisplay > USHRT_MAX || in->hsync_start > USHRT_MAX || in drm_mode_convert_to_umode()
1638 in->hsync_end > USHRT_MAX || in->htotal > USHRT_MAX || in drm_mode_convert_to_umode()
1639 in->hskew > USHRT_MAX || in->vdisplay > USHRT_MAX || in drm_mode_convert_to_umode()
1640 in->vsync_start > USHRT_MAX || in->vsync_end > USHRT_MAX || in drm_mode_convert_to_umode()
1641 in->vtotal > USHRT_MAX || in->vscan > USHRT_MAX, in drm_mode_convert_to_umode()
1642 "timing values too large for mode info\n"); in drm_mode_convert_to_umode()
1644 out->clock = in->clock; in drm_mode_convert_to_umode()
1645 out->hdisplay = in->hdisplay; in drm_mode_convert_to_umode()
1646 out->hsync_start = in->hsync_start; in drm_mode_convert_to_umode()
1647 out->hsync_end = in->hsync_end; in drm_mode_convert_to_umode()
1648 out->htotal = in->htotal; in drm_mode_convert_to_umode()
1649 out->hskew = in->hskew; in drm_mode_convert_to_umode()
1650 out->vdisplay = in->vdisplay; in drm_mode_convert_to_umode()
1651 out->vsync_start = in->vsync_start; in drm_mode_convert_to_umode()
1652 out->vsync_end = in->vsync_end; in drm_mode_convert_to_umode()
1653 out->vtotal = in->vtotal; in drm_mode_convert_to_umode()
1654 out->vscan = in->vscan; in drm_mode_convert_to_umode()
1655 out->vrefresh = in->vrefresh; in drm_mode_convert_to_umode()
1656 out->flags = in->flags; in drm_mode_convert_to_umode()
1657 out->type = in->type; in drm_mode_convert_to_umode()
1659 switch (in->picture_aspect_ratio) { in drm_mode_convert_to_umode()
1661 out->flags |= DRM_MODE_FLAG_PIC_AR_4_3; in drm_mode_convert_to_umode()
1664 out->flags |= DRM_MODE_FLAG_PIC_AR_16_9; in drm_mode_convert_to_umode()
1667 out->flags |= DRM_MODE_FLAG_PIC_AR_64_27; in drm_mode_convert_to_umode()
1670 out->flags |= DRM_MODE_FLAG_PIC_AR_256_135; in drm_mode_convert_to_umode()
1674 out->flags |= DRM_MODE_FLAG_PIC_AR_NONE; in drm_mode_convert_to_umode()
1678 strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN); in drm_mode_convert_to_umode()
1679 out->name[DRM_DISPLAY_MODE_LEN-1] = 0; in drm_mode_convert_to_umode()
1683 * drm_crtc_convert_umode - convert a modeinfo into a drm_display_mode
1698 if (in->clock > INT_MAX || in->vrefresh > INT_MAX) in drm_mode_convert_umode()
1699 return -ERANGE; in drm_mode_convert_umode()
1701 out->clock = in->clock; in drm_mode_convert_umode()
1702 out->hdisplay = in->hdisplay; in drm_mode_convert_umode()
1703 out->hsync_start = in->hsync_start; in drm_mode_convert_umode()
1704 out->hsync_end = in->hsync_end; in drm_mode_convert_umode()
1705 out->htotal = in->htotal; in drm_mode_convert_umode()
1706 out->hskew = in->hskew; in drm_mode_convert_umode()
1707 out->vdisplay = in->vdisplay; in drm_mode_convert_umode()
1708 out->vsync_start = in->vsync_start; in drm_mode_convert_umode()
1709 out->vsync_end = in->vsync_end; in drm_mode_convert_umode()
1710 out->vtotal = in->vtotal; in drm_mode_convert_umode()
1711 out->vscan = in->vscan; in drm_mode_convert_umode()
1712 out->vrefresh = in->vrefresh; in drm_mode_convert_umode()
1713 out->flags = in->flags; in drm_mode_convert_umode()
1715 * Old xf86-video-vmware (possibly others too) used to in drm_mode_convert_umode()
1718 * useful for the kernel->userspace direction anyway. in drm_mode_convert_umode()
1720 out->type = in->type & DRM_MODE_TYPE_ALL; in drm_mode_convert_umode()
1721 strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN); in drm_mode_convert_umode()
1722 out->name[DRM_DISPLAY_MODE_LEN-1] = 0; in drm_mode_convert_umode()
1725 * as the aspect-ratio information is not stored in in drm_mode_convert_umode()
1726 * flags for kernel-mode, but in picture_aspect_ratio. in drm_mode_convert_umode()
1728 out->flags &= ~DRM_MODE_FLAG_PIC_AR_MASK; in drm_mode_convert_umode()
1730 switch (in->flags & DRM_MODE_FLAG_PIC_AR_MASK) { in drm_mode_convert_umode()
1732 out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_4_3; in drm_mode_convert_umode()
1735 out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_16_9; in drm_mode_convert_umode()
1738 out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_64_27; in drm_mode_convert_umode()
1741 out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_256_135; in drm_mode_convert_umode()
1744 out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE; in drm_mode_convert_umode()
1748 out->status = drm_mode_validate_driver(dev, out); in drm_mode_convert_umode()
1749 if (out->status != MODE_OK) in drm_mode_convert_umode()
1750 return -EINVAL; in drm_mode_convert_umode()
1758 * drm_mode_is_420_only - if a given videomode can be only supported in YCBCR420
1762 * @mode: video mode to be tested.
1765 * true if the mode can be supported in YCBCR420 format
1769 const struct drm_display_mode *mode) in drm_mode_is_420_only() argument
1771 u8 vic = drm_match_cea_mode(mode); in drm_mode_is_420_only()
1773 return test_bit(vic, display->hdmi.y420_vdb_modes); in drm_mode_is_420_only()
1778 * drm_mode_is_420_also - if a given videomode can be supported in YCBCR420
1782 * @mode: video mode to be tested.
1785 * true if the mode can be support YCBCR420 format
1789 const struct drm_display_mode *mode) in drm_mode_is_420_also() argument
1791 u8 vic = drm_match_cea_mode(mode); in drm_mode_is_420_also()
1793 return test_bit(vic, display->hdmi.y420_cmdb_modes); in drm_mode_is_420_also()
1797 * drm_mode_is_420 - if a given videomode can be supported in YCBCR420
1801 * @mode: video mode to be tested.
1804 * true if the mode can be supported in YCBCR420 format
1808 const struct drm_display_mode *mode) in drm_mode_is_420() argument
1810 return drm_mode_is_420_only(display, mode) || in drm_mode_is_420()
1811 drm_mode_is_420_also(display, mode); in drm_mode_is_420()