# --- T2-COPYRIGHT-NOTE-BEGIN --- # T2 SDE: package/*/xorg-server/hotfix-fbdevHWSetMode.patch # Copyright (C) 2024 The T2 SDE Project # # This Copyright note is generated by scripts/Create-CopyPatch, # more information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License version 2 as used by the T2 SDE. # --- T2-COPYRIGHT-NOTE-END --- Some Linux fb drivers, like sgi-o2 gbe update the mode struct to actually constraint sync values. Actually inform the user about what changed, and don't error out for unimportant sync details. --- xorg-server-21.1.10/hw/xfree86/fbdevhw/fbdevhw.c.orig 2023-12-13 02:31:04.000000000 +0100 +++ xorg-server-21.1.10/hw/xfree86/fbdevhw/fbdevhw.c 2024-01-09 13:32:27.895682324 +0100 @@ -200,22 +200,50 @@ } static Bool -fbdev_modes_equal(struct fb_var_screeninfo *set, struct fb_var_screeninfo *req) +fbdev_modes_equal(ScrnInfoPtr pScrn, struct fb_var_screeninfo *set, struct fb_var_screeninfo *req) { - return (set->xres_virtual >= req->xres_virtual && - set->yres_virtual >= req->yres_virtual && - set->bits_per_pixel == req->bits_per_pixel && - set->red.length == req->red.length && - set->green.length == req->green.length && - set->blue.length == req->blue.length && - set->xres == req->xres && set->yres == req->yres && - set->right_margin == req->right_margin && - set->hsync_len == req->hsync_len && - set->left_margin == req->left_margin && - set->lower_margin == req->lower_margin && - set->vsync_len == req->vsync_len && - set->upper_margin == req->upper_margin && - set->sync == req->sync && set->vmode == req->vmode); + if (set->xres != req->xres || set->yres != req->yres) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbdev_modes: res not equal\n"); + return FALSE; + } + + if (set->xres_virtual < req->xres_virtual || set->yres_virtual < req->yres_virtual) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbdev_modes: virtual res not equal\n"); + return FALSE; + } + + if (set->sync != req->sync || set->vmode != req->vmode) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbdev_modes: sync or vmode not equal\n"); + return FALSE; + } + + if (set->bits_per_pixel != req->bits_per_pixel) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbdev_modes: bits per pixel not equal\n"); + return FALSE; + } + + if (set->red.length != req->red.length || + set->green.length != req->green.length || + set->blue.length != req->blue.length) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbdev_modes: RGB lengths not equal\n"); + return FALSE; + } + + if (set->hsync_len != req->hsync_len || + set->vsync_len != req->vsync_len) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbdev_modes: sync not equal\n"); + //return FALSE; + } + + if (set->right_margin != req->right_margin || + set->left_margin != req->left_margin || + set->lower_margin != req->lower_margin || + set->upper_margin != req->upper_margin) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbdev_modes: margins not equal\n"); + //return FALSE; + } + + return TRUE; } static void @@ -526,7 +526,7 @@ return FALSE; } - if (!fbdev_modes_equal(&set_var, &req_var)) { + if (!fbdev_modes_equal(pScrn, &set_var, &req_var)) { if (!check) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "FBIOPUT_VSCREENINFO succeeded but modified " "mode\n");