| 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. |