mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-20 07:00:03 +01:00
xserver fails to generate useable resolutions with 90Hz framerate panels(encounter the same issue with 3 different 2.5k resolution panels). All the resolutions shown by xrandr lead to blank screen except the one written in EDID. Ville Syrjälä from Intel provides a method to calculate the preferred clock and refresh rate from the existing resolution table and this works for the issue. v2. xf86ModeVRefresh might return 0, need to check it before use it. v3. reported by Markus on launchpad that the issue is not devided by 0, it's the "preferred" being accessed unconditionally. BugLink: https://launchpad.net/bugs/1999852 Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1388 Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com>
103 lines
4 KiB
C
103 lines
4 KiB
C
#ifdef HAVE_DIX_CONFIG_H
|
|
#include <dix-config.h>
|
|
#endif
|
|
|
|
#ifndef _DISMODEPROC_H_
|
|
#define _DISMODEPROC_H_
|
|
|
|
#include "scrnintstr.h"
|
|
|
|
#define MAXCLOCKS 128
|
|
|
|
/* These are possible return values for xf86CheckMode() and ValidMode() */
|
|
typedef enum {
|
|
MODE_OK = 0, /* Mode OK */
|
|
MODE_HSYNC, /* hsync out of range */
|
|
MODE_VSYNC, /* vsync out of range */
|
|
MODE_H_ILLEGAL, /* mode has illegal horizontal timings */
|
|
MODE_V_ILLEGAL, /* mode has illegal horizontal timings */
|
|
MODE_BAD_WIDTH, /* requires an unsupported linepitch */
|
|
MODE_NOMODE, /* no mode with a matching name */
|
|
MODE_NO_INTERLACE, /* interlaced mode not supported */
|
|
MODE_NO_DBLESCAN, /* doublescan mode not supported */
|
|
MODE_NO_VSCAN, /* multiscan mode not supported */
|
|
MODE_MEM, /* insufficient video memory */
|
|
MODE_VIRTUAL_X, /* mode width too large for specified virtual size */
|
|
MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */
|
|
MODE_MEM_VIRT, /* insufficient video memory given virtual size */
|
|
MODE_NOCLOCK, /* no fixed clock available */
|
|
MODE_CLOCK_HIGH, /* clock required is too high */
|
|
MODE_CLOCK_LOW, /* clock required is too low */
|
|
MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */
|
|
MODE_BAD_HVALUE, /* horizontal timing was out of range */
|
|
MODE_BAD_VVALUE, /* vertical timing was out of range */
|
|
MODE_BAD_VSCAN, /* VScan value out of range */
|
|
MODE_HSYNC_NARROW, /* horizontal sync too narrow */
|
|
MODE_HSYNC_WIDE, /* horizontal sync too wide */
|
|
MODE_HBLANK_NARROW, /* horizontal blanking too narrow */
|
|
MODE_HBLANK_WIDE, /* horizontal blanking too wide */
|
|
MODE_VSYNC_NARROW, /* vertical sync too narrow */
|
|
MODE_VSYNC_WIDE, /* vertical sync too wide */
|
|
MODE_VBLANK_NARROW, /* vertical blanking too narrow */
|
|
MODE_VBLANK_WIDE, /* vertical blanking too wide */
|
|
MODE_PANEL, /* exceeds panel dimensions */
|
|
MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */
|
|
MODE_ONE_WIDTH, /* only one width is supported */
|
|
MODE_ONE_HEIGHT, /* only one height is supported */
|
|
MODE_ONE_SIZE, /* only one resolution is supported */
|
|
MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */
|
|
MODE_BANDWIDTH, /* mode requires too much memory bandwidth */
|
|
MODE_DUPLICATE, /* mode is duplicated */
|
|
MODE_BAD = -2, /* unspecified reason */
|
|
MODE_ERROR = -1 /* error condition */
|
|
} ModeStatus;
|
|
|
|
/* Video mode */
|
|
typedef struct _DisplayModeRec {
|
|
struct _DisplayModeRec *prev;
|
|
struct _DisplayModeRec *next;
|
|
const char *name; /* identifier for the mode */
|
|
ModeStatus status;
|
|
int type;
|
|
|
|
/* These are the values that the user sees/provides */
|
|
int Clock; /* pixel clock freq (kHz) */
|
|
int HDisplay; /* horizontal timing */
|
|
int HSyncStart;
|
|
int HSyncEnd;
|
|
int HTotal;
|
|
int HSkew;
|
|
int VDisplay; /* vertical timing */
|
|
int VSyncStart;
|
|
int VSyncEnd;
|
|
int VTotal;
|
|
int VScan;
|
|
int Flags;
|
|
|
|
/* These are the values the hardware uses */
|
|
int ClockIndex;
|
|
int SynthClock; /* Actual clock freq to
|
|
* be programmed (kHz) */
|
|
int CrtcHDisplay;
|
|
int CrtcHBlankStart;
|
|
int CrtcHSyncStart;
|
|
int CrtcHSyncEnd;
|
|
int CrtcHBlankEnd;
|
|
int CrtcHTotal;
|
|
int CrtcHSkew;
|
|
int CrtcVDisplay;
|
|
int CrtcVBlankStart;
|
|
int CrtcVSyncStart;
|
|
int CrtcVSyncEnd;
|
|
int CrtcVBlankEnd;
|
|
int CrtcVTotal;
|
|
Bool CrtcHAdjusted;
|
|
Bool CrtcVAdjusted;
|
|
int PrivSize;
|
|
INT32 *Private;
|
|
int PrivFlags;
|
|
|
|
float HSync, VRefresh;
|
|
} DisplayModeRec, *DisplayModePtr;
|
|
|
|
#endif
|