152 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
 | 
						|
 | 
						|
			modedb default video mode support
 | 
						|
 | 
						|
 | 
						|
Currently all frame buffer device drivers have their own video mode databases,
 | 
						|
which is a mess and a waste of resources. The main idea of modedb is to have
 | 
						|
 | 
						|
  - one routine to probe for video modes, which can be used by all frame buffer
 | 
						|
    devices
 | 
						|
  - one generic video mode database with a fair amount of standard videomodes
 | 
						|
    (taken from XFree86)
 | 
						|
  - the possibility to supply your own mode database for graphics hardware that
 | 
						|
    needs non-standard modes, like amifb and Mac frame buffer drivers (which
 | 
						|
    use macmodes.c)
 | 
						|
 | 
						|
When a frame buffer device receives a video= option it doesn't know, it should
 | 
						|
consider that to be a video mode option. If no frame buffer device is specified
 | 
						|
in a video= option, fbmem considers that to be a global video mode option.
 | 
						|
 | 
						|
Valid mode specifiers (mode_option argument):
 | 
						|
 | 
						|
    <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
 | 
						|
    <name>[-<bpp>][@<refresh>]
 | 
						|
 | 
						|
with <xres>, <yres>, <bpp> and <refresh> decimal numbers and <name> a string.
 | 
						|
Things between square brackets are optional.
 | 
						|
 | 
						|
If 'M' is specified in the mode_option argument (after <yres> and before
 | 
						|
<bpp> and <refresh>, if specified) the timings will be calculated using
 | 
						|
VESA(TM) Coordinated Video Timings instead of looking up the mode from a table.
 | 
						|
If 'R' is specified, do a 'reduced blanking' calculation for digital displays.
 | 
						|
If 'i' is specified, calculate for an interlaced mode.  And if 'm' is
 | 
						|
specified, add margins to the calculation (1.8% of xres rounded down to 8
 | 
						|
pixels and 1.8% of yres).
 | 
						|
 | 
						|
       Sample usage: 1024x768M@60m - CVT timing with margins
 | 
						|
 | 
						|
DRM drivers also add options to enable or disable outputs:
 | 
						|
 | 
						|
'e' will force the display to be enabled, i.e. it will override the detection
 | 
						|
if a display is connected. 'D' will force the display to be enabled and use
 | 
						|
digital output. This is useful for outputs that have both analog and digital
 | 
						|
signals (e.g. HDMI and DVI-I). For other outputs it behaves like 'e'. If 'd'
 | 
						|
is specified the output is disabled.
 | 
						|
 | 
						|
You can additionally specify which output the options matches to.
 | 
						|
To force the VGA output to be enabled and drive a specific mode say:
 | 
						|
    video=VGA-1:1280x1024@60me
 | 
						|
 | 
						|
Specifying the option multiple times for different ports is possible, e.g.:
 | 
						|
    video=LVDS-1:d video=HDMI-1:D
 | 
						|
 | 
						|
***** oOo ***** oOo ***** oOo ***** oOo ***** oOo ***** oOo ***** oOo *****
 | 
						|
 | 
						|
What is the VESA(TM) Coordinated Video Timings (CVT)?
 | 
						|
 | 
						|
From the VESA(TM) Website:
 | 
						|
 | 
						|
     "The purpose of CVT is to provide a method for generating a consistent
 | 
						|
      and coordinated set of standard formats, display refresh rates, and
 | 
						|
      timing specifications for computer display products, both those
 | 
						|
      employing CRTs, and those using other display technologies. The
 | 
						|
      intention of CVT is to give both source and display manufacturers a
 | 
						|
      common set of tools to enable new timings to be developed in a
 | 
						|
      consistent manner that ensures greater compatibility."
 | 
						|
 | 
						|
This is the third standard approved by VESA(TM) concerning video timings.  The
 | 
						|
first was the Discrete Video Timings (DVT) which is  a collection of
 | 
						|
pre-defined modes approved by VESA(TM).  The second is the Generalized Timing
 | 
						|
Formula (GTF) which is an algorithm to calculate the timings, given the
 | 
						|
pixelclock, the horizontal sync frequency, or the vertical refresh rate.
 | 
						|
 | 
						|
The GTF is limited by the fact that it is designed mainly for CRT displays.
 | 
						|
It artificially increases the pixelclock because of its high blanking
 | 
						|
requirement. This is inappropriate for digital display interface with its high
 | 
						|
data rate which requires that it conserves the pixelclock as much as possible.
 | 
						|
Also, GTF does not take into account the aspect ratio of the display.
 | 
						|
 | 
						|
The CVT addresses these limitations.  If used with CRT's, the formula used
 | 
						|
is a derivation of GTF with a few modifications.  If used with digital
 | 
						|
displays, the "reduced blanking" calculation can be used.
 | 
						|
 | 
						|
From the framebuffer subsystem perspective, new formats need not be added
 | 
						|
to the global mode database whenever a new mode is released by display
 | 
						|
manufacturers. Specifying for CVT will work for most, if not all, relatively
 | 
						|
new CRT displays and probably with most flatpanels, if 'reduced blanking'
 | 
						|
calculation is specified.  (The CVT compatibility of the display can be
 | 
						|
determined from its EDID. The version 1.3 of the EDID has extra 128-byte
 | 
						|
blocks where additional timing information is placed.  As of this time, there
 | 
						|
is no support yet in the layer to parse this additional blocks.)
 | 
						|
 | 
						|
CVT also introduced a new naming convention (should be seen from dmesg output):
 | 
						|
 | 
						|
    <pix>M<a>[-R]
 | 
						|
 | 
						|
    where: pix = total amount of pixels in MB (xres x yres)
 | 
						|
           M   = always present
 | 
						|
           a   = aspect ratio (3 - 4:3; 4 - 5:4; 9 - 15:9, 16:9; A - 16:10)
 | 
						|
          -R   = reduced blanking
 | 
						|
 | 
						|
	  example:  .48M3-R - 800x600 with reduced blanking
 | 
						|
 | 
						|
Note: VESA(TM) has restrictions on what is a standard CVT timing:
 | 
						|
 | 
						|
      - aspect ratio can only be one of the above values
 | 
						|
      - acceptable refresh rates are 50, 60, 70 or 85 Hz only
 | 
						|
      - if reduced blanking, the refresh rate must be at 60Hz
 | 
						|
 | 
						|
If one of the above are not satisfied, the kernel will print a warning but the
 | 
						|
timings will still be calculated.
 | 
						|
 | 
						|
***** oOo ***** oOo ***** oOo ***** oOo ***** oOo ***** oOo ***** oOo *****
 | 
						|
 | 
						|
To find a suitable video mode, you just call
 | 
						|
 | 
						|
int __init fb_find_mode(struct fb_var_screeninfo *var,
 | 
						|
                        struct fb_info *info, const char *mode_option,
 | 
						|
                        const struct fb_videomode *db, unsigned int dbsize,
 | 
						|
                        const struct fb_videomode *default_mode,
 | 
						|
                        unsigned int default_bpp)
 | 
						|
 | 
						|
with db/dbsize your non-standard video mode database, or NULL to use the
 | 
						|
standard video mode database.
 | 
						|
 | 
						|
fb_find_mode() first tries the specified video mode (or any mode that matches,
 | 
						|
e.g. there can be multiple 640x480 modes, each of them is tried). If that
 | 
						|
fails, the default mode is tried. If that fails, it walks over all modes.
 | 
						|
 | 
						|
To specify a video mode at bootup, use the following boot options:
 | 
						|
    video=<driver>:<xres>x<yres>[-<bpp>][@refresh]
 | 
						|
 | 
						|
where <driver> is a name from the table below.  Valid default modes can be
 | 
						|
found in linux/drivers/video/modedb.c.  Check your driver's documentation.
 | 
						|
There may be more modes.
 | 
						|
 | 
						|
    Drivers that support modedb boot options
 | 
						|
    Boot Name	  Cards Supported
 | 
						|
 | 
						|
    amifb	- Amiga chipset frame buffer
 | 
						|
    aty128fb	- ATI Rage128 / Pro frame buffer
 | 
						|
    atyfb	- ATI Mach64 frame buffer
 | 
						|
    pm2fb	- Permedia 2/2V frame buffer
 | 
						|
    pm3fb	- Permedia 3 frame buffer
 | 
						|
    sstfb	- Voodoo 1/2 (SST1) chipset frame buffer
 | 
						|
    tdfxfb	- 3D Fx frame buffer
 | 
						|
    tridentfb	- Trident (Cyber)blade chipset frame buffer
 | 
						|
    vt8623fb	- VIA 8623 frame buffer
 | 
						|
 | 
						|
BTW, only a few fb drivers use this at the moment. Others are to follow
 | 
						|
(feel free to send patches). The DRM drivers also support this.
 |