From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261859AbVGaJ4F (ORCPT ); Sun, 31 Jul 2005 05:56:05 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S261861AbVGaJ4F (ORCPT ); Sun, 31 Jul 2005 05:56:05 -0400 Received: from mailout05.sul.t-online.com ([194.25.134.82]:19589 "EHLO mailout05.sul.t-online.com") by vger.kernel.org with ESMTP id S261859AbVGaJzx (ORCPT ); Sun, 31 Jul 2005 05:55:53 -0400 Message-ID: <42ECA05F.40401@t-online.de> Date: Sun, 31 Jul 2005 11:56:47 +0200 From: Knut Petersen User-Agent: Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.7) Gecko/20050414 X-Accept-Language: de, en MIME-Version: 1.0 To: Andrew Morton CC: linux-fbdev-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 1/1 2.6.13-rc4] framebuffer: new driver for cyberblade/i1 core X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-ID: XNxp6MZpZeQfHtqyqRs51TqF1YfOHOdr1eMnVDk+6a+Bndqa96hkUM@t-dialin.net X-TOI-MSGID: 82cfefab-337e-4af3-9bf6-037735d746ab Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Currently tridenfb claims to support the cyberblade/i1 graphics core. This is of very limited truth. There is a great number of bugs, even vesafb is faster and provides more working modes and much better quality of the video signal. Tridentfb seems to be unmaintained,and documentation for most of the supported chips is not available. Fixing cyberblade/i1 support inside of tridentfb was not an option, it would have caused numerous if(CYBERBLADEi1) else ... cases and would have rendered the code to be almost unmaintainable. This code does support the graphics core of a single north bridge and has been tested and developed on a system equipped with that chip. It cannot break anything but the broken cyberblade/i1 support of tridentfb, and even if that would be the case, there is still vesafb as a working alternative. On the other hand it provides significant improvements. Because of this I believe that there is no reason to keep it out of 2.6.13 just because it is presented a bit late in the development cycle. Signed-off-by: Knut Petersen diff -urN linux-2.6.13-rc4/Documentation/fb/cyblafb.txt linux-2.6.13-rc4-tfix/Documentation/fb/cyblafb.txt --- linux-2.6.13-rc4/Documentation/fb/cyblafb.txt 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.13-rc4-tfix/Documentation/fb/cyblafb.txt 2005-07-31 09:38:44.000000000 +0200 @@ -0,0 +1,354 @@ +CyBlaFB is a framebuffer driver for the Cyberblade/i1 graphics core integrated +into the VIA Apollo PLE133 (aka vt8601) south bridge. It is developed and +tested using a VIA EPIA 5000 board. + + +Why CyBlaFB? +============ + +I tried the following framebuffer drivers: + + - TRIDENTFB is full of bugs. Acceleration is broken for Blade3D + graphics cores like the cyberblade/i1. It claims to support a great + number of devices, but documentation for most of these devices is + unfortunately not available. There is _no_ reason to use tridentfb + for cyberblade/i1 + CRT users. VESAFB is faster, and the one + advantage, mode switching, is broken in tridentfb. + + - VESAFB is used by many distributions as a standard. Vesafb does + not support mode switching. VESAFB is a bit faster than the working + configurations of TRIDENTFB, but it is still too slow, even if you + use ypan. + + - EPIAFB (you'll find it on sourceforge) supports the Cyberblade/i1 + graphics core, but it still has serious bugs and developement seems + to have stopped. This is the one driver with TV-out support. If you + do need this feature, use epiafb. + +None of these drivers was a real option for me. + +I believe that is unreasonable to change code that announces to support 20 +devices if I only have more or less sufficient documentation for exactly one +of these. The risk of breaking device foo while fixing device bar is too high. + +So I decided to start CyBlaFB as a stripped down tridentfb. + +All code specific to other Trident chips has been removed. After that there +were a lot of cosmetic changes to increase the readability of the code. All +register names were changed to those mnemonics used in the datasheet. Function +and macro names were changed if they hindered easy understanding of the code. + +After that I debugged the code and implemented some new features. I'll try to +give a little summary of the main changes: + + - calculation of vertical and horizontal timings was fixed + + - video signal quality has been improved dramatically + + - acceleration: + + - fillrect and copyarea were fixed and reenabled + + - color expanding imageblit was newly implemented, color + imageblit (only used to draw the penguine) still uses the + generic code. + + - init of the acceleration engine was improved and moved to a + place where it really works ... + + - sync function has a timeout now and tries to reset and + reinit the accel engine if necessary + + - fewer slow copyarea calls when doing ypan scrolling by using + undocumented bit d21 of screen start address stored in + CR2B[5]. BIOS does use it also, so this should be safe. + + - cyblafb rejects any attempt to set modes that would cause vclk + values above reasonable 230 MHz. 32bit modes use a clock + multiplicator of 2, so fbset does show the correct values for + pixclock but not for vclk in this case. The fbset limit is 115 MHz + for 32 bpp modes. + + - cyblafb rejects modes known to be broken or unimplemented (all + interlaced modes, all doublescan modes for now) + + - cyblafb now works independant of the video mode in effect at startup + time (tridentfb does not init all needed registers to reasonable + values) + + - switching between video modes does work reliably now + + - the first video mode now is the one selected on startup using the + vga=???? mechanism or any of + - 640x480, 800x600, 1024x768, 1280x1024 + - 8, 16, 24 or 32 bpp + - refresh between 50 Hz and 85 Hz, 1 Hz steps (1280x1024-32 + is limited to 63Hz) + + - pci retry and pci burst mode are settable (try to disable if you + experience latency problems) + + - built as a module cyblafb might be unloaded and reloaded using + the vfb module and con2vt or might be used together with vesafb + +Speed +===== + +CyBlaFB is much faster than tridentfb and vesafb. Compare the performance data +for mode 1280x1024-[8,16,32]@61 Hz. + +Test 1: Cat a file with 2000 lines of 0 characters. +Test 2: Cat a file with 2000 lines of 80 characters. +Test 3: Cat a file with 2000 lines of 160 characters. + +All values show system time use in seconds, kernel 2.6.12 was used for +the measurements. 2.6.13-rc4 is much slower, but this problem has been +solved, and 2.6.13 should be actually faster than 2.6.12. + ++-----------+-----------------------------------------------------+ +| | not accelerated | +| TRIDENTFB +-----------------+-----------------+-----------------+ +| of 2.6.12 | 8 bpp | 16 bpp | 32 bpp | +| | noypan | ypan | noypan | ypan | noypan | ypan | ++-----------+--------+--------+--------+--------+--------+--------+ +| Test 1 | 4.31 | 4.33 | 6.05 | 12.81 | ---- | ---- | +| Test 2 | 67.94 | 5.44 | 123.16 | 14.79 | ---- | ---- | +| Test 3 | 131.36 | 6.55 | 240.12 | 16.76 | ---- | ---- | ++-----------+--------+--------+--------+--------+--------+--------+ +| Comments | | | completely bro- | +| | | | ken, monitor | +| | | | switches off | ++-----------+-----------------+-----------------+-----------------+ + + ++-----------+-----------------------------------------------------+ +| | accelerated | +| TRIDENTFB +-----------------+-----------------+-----------------+ +| of 2.6.12 | 8 bpp | 16 bpp | 32 bpp | +| | noypan | ypan | noypan | ypan | noypan | ypan | ++-----------+--------+--------+--------+--------+--------+--------+ +| Test 1 | ---- | ---- | 20.62 | 1.22 | ---- | ---- | +| Test 2 | ---- | ---- | 22.61 | 3.19 | ---- | ---- | +| Test 3 | ---- | ---- | 24.59 | 5.16 | ---- | ---- | ++-----------+--------+--------+--------+--------+--------+--------+ +| Comments | broken, writing | broken, ok only | completely bro- | +| | to wrong places | if bgcolor is | ken, monitor | +| | on screen + bug | black, bug in | switches off | +| | in fillrect() | fillrect() | | ++-----------+-----------------+-----------------+-----------------+ + + ++-----------+-----------------------------------------------------+ +| | not accelerated | +| VESAFB +-----------------+-----------------+-----------------+ +| of 2.6.12 | 8 bpp | 16 bpp | 32 bpp | +| | noypan | ypan | noypan | ypan | noypan | ypan | ++-----------+--------+--------+--------+--------+--------+--------+ +| Test 1 | 4.26 | 3.76 | 5.99 | 7.23 | ---- | ---- | +| Test 2 | 65.65 | 4.89 | 120.88 | 9.08 | ---- | ---- | +| Test 3 | 126.91 | 5.94 | 235.77 | 11.03 | ---- | ---- | ++-----------+--------+--------+--------+--------+--------+--------+ +| Comments | vga=0x307 | vga=0x31a | vga=0x31b not | +| | fh=80kHz | fh=80kHz | supported by | +| | fv=75kHz | fv=75kHz | video BIOS and | +| | | | hardware | ++-----------+-----------------+-----------------+-----------------+ + + ++-----------+-----------------------------------------------------+ +| | accelerated | +| CYBLAFB +-----------------+-----------------+-----------------+ +| | 8 bpp | 16 bpp | 32 bpp | +| | noypan | ypan | noypan | ypan | noypan | ypan | ++-----------+--------+--------+--------+--------+--------+--------+ +| Test 1 | 8.02 | 0.23 | 19.04 | 0.61 | 57.12 | 2.74 | +| Test 2 | 8.38 | 0.55 | 19.39 | 0.92 | 57.54 | 3.13 | +| Test 3 | 8.73 | 0.86 | 19.74 | 1.24 | 57.95 | 3.51 | ++-----------+--------+--------+--------+--------+--------+--------+ +| Comments | | | | +| | | | | +| | | | | +| | | | | ++-----------+-----------------+-----------------+-----------------+ + +Startup Mode +============ + +Tridentfb uses modedb.c to allow the user to specify a startup video mode. +Unfortunately a lot of the video mode specifyed there do not display +correctly, including the default video mode. My first idea was to implement +some code in check_var() to alter these modes to values acceptable for the +graphics core. I wrote some code, but I dumped it completely. If you tweak the +modes, you need to provide at least kernel parameters to disable those +helpers. If you don't want to force the user to reboot in those cases you have +to provide some ioctls and a special control program as fbset etc do not know +about the new ioctls. No, this is not the perfect solution. But we already +have a video mode selection mechanism in the kernel. Why shouldn't we use +vga=xxx to select an initial video mode? This way we get a reasonable +collection of startup modes (every mode the bios supports) and those people +who really need to use fbset are not hindered by some magic in check_var() +that alters the parameters they provide. You might also specify an inital +video mode, see section "parameters" + + +Untested features +================= + +All LCD stuff is untested. If it worked in tridentfb, it should work in +cyblafb. Please test and report the results + + +known BUGS +========== + +I don't know of any bug, but please do send reports to both LKML and +Knut_Petersen@t-online.de. + + +TODO / Missing features +======================= + +Interlaced video modes The reason that interleaved + modes are disabled is that I do not know + the meaning of the vertical interlace + parameter. Also the datasheet mentions a + bit d8 of a horizontal interlace parameter, + but nowhere the lower 8 bits. Please help + if you can. + +low-res double scan modes Who needs it? + +accelerated color blitting Who needs it? The console driver does use color + blitting for nothing but drawing the penguine, + everything else is done using color expanding + blitting of 1bpp character bitmaps. + +xpanning Who needs it? + +ioctls Who needs it? + +TV-out Will be done later + + +Available Documentation +======================= + +Apollo PLE 133 Chipset VT8601A North Bridge Datasheet, Rev. 1.82, October 22, +2001, available from VIA. The datasheet is incomplete, some registers that +need to be programmed are not explained at all or important bits are listed +as "reserved". But you really need the datasheet to understand the code. +"p. xxx comments refer to page numbers of this document." + +XFree/XOrg drivers are available and of good quality, looking at the code +there is a good idea if the documentation does not provide enough information +or if the documentation seems to be wrong. + +Parameters +========== + + +crt don't autodetect, assume monitor connected to + standard VGA connector + +fp don't autodetect, assume flat panel display + connected to flat panel monitor interface + +nativex inform driver about native x resolution of + flat panel monitor connected to special + interface + +stretch stretch image to adapt low resolution modes to + higer resolutions of flat panel monitors + connected to special interface + +center center image to adapt low resolution modes to + higer resolutions of flat panel monitors + connected to special interface + +memsize use if autodetected memsize is wrong ... + should never be necessary + +nopcirr disable PCI read retry +nopciwr disable PCI write retry +nopcirb disable PCI read bursts +nopciwb disable PCI write bursts + +regdumps This will print a listing of the contents of + most registers to syslog immediately after startup + and after a new mode is set. Please do include if + you send a bugreport + +bpp bpp for specified modes + +ref refresh rate for specified mode + +mode 640x480 or 800x600 or 1024x768 or 1280x1024 + if not specified, the startup mode will be detected + and used, so you might also use the vga=??? parameter + described in vesafb.txt. If you do not specify a mode, + bpp and ref parameters are ignored. + +verbosity 0 is the default, increase to at least 2 for every + bug report! + +vesafb allows cyblafb to be loaded after vesafb has been + loaded. See sections "Module unloading ...". + +Module unloading, the vfb method +================================ + +If you want to unload/reload cyblafb, you need to enable vfb support in the +kernel first. After that, load the modules as shown below: + + modprobe vfb vfb_enable=1 + modprobe fbcon + modprobe cyblafb + fbset -fb /dev/fb1 1280x1024-60 -vyres 2662 + con2fb /dev/fb1 /dev/tty1 + ... + +If you now made some changes to cyblafb and want to reload it, you might do it +as show below: + + con2fb /dev/fb0 /dev/tty1 + ... + rmmod cyblafb + modprobe cyblafb + con2fb /dev/fb1 /dev/tty1 + ... + +Of course, you might choose another mode, and most certainly you also want to +map some other /dev/tty* to the real framebuffer device. You might also choose +to compile fbcon as a kernel module or place it permanently in the kernel. + +I do not know of any way to unload fbcon, and fbcon will prevent the +framebuffer device loaded first from unloading. [If there is a way, then +please add a description here!] + +Module unloading, the vesafb method +=================================== + +Configure the kernel: + + <*> Support for frame buffer devices + [*] VESA VGA graphics support + Cyberblade/i1 support + +Add e.g. "video=vesafb:ypan vga=0x307" to the kernel parameters. The ypan +parameter is important, choose any vga parameter you like as long as it is +a graphics mode. + +After booting, load cyblafb without any mode and bpp parameter and assign +cyblafb to individual ttys using con2fb, e.g.: + + modprobe cyblafb vesafb=1 + con2fb /dev/fb1 /dev/tty1 + +Unloading cyblafb works without problems after you assign vesafb to all +ttys again, e.g.: + + con2fb /dev/fb0 /dev/tty1 + rmmod cyblafb + + + diff -urN linux-2.6.13-rc4/MAINTAINERS linux-2.6.13-rc4-tfix/MAINTAINERS --- linux-2.6.13-rc4/MAINTAINERS 2005-07-29 10:00:26.000000000 +0200 +++ linux-2.6.13-rc4-tfix/MAINTAINERS 2005-07-29 10:22:21.000000000 +0200 @@ -627,6 +627,12 @@ W: http://www.arm.linux.org.uk/ S: Maintained +CYBLAFB FRAMEBUFFER DRIVER +P: Knut Petersen +M: Knut_Petersen@t-online.de +L: linux-fbdev-devel@lists.sourceforge.net +S: Maintained + CYCLADES 2X SYNC CARD DRIVER P: Arnaldo Carvalho de Melo M: acme@conectiva.com.br diff -urN linux-2.6.13-rc4/drivers/video/Kconfig linux-2.6.13-rc4-tfix/drivers/video/Kconfig --- linux-2.6.13-rc4/drivers/video/Kconfig 2005-07-29 10:01:01.000000000 +0200 +++ linux-2.6.13-rc4-tfix/drivers/video/Kconfig 2005-07-31 10:21:13.000000000 +0200 @@ -1180,6 +1180,32 @@ Please read the for supported options and other important info support. +config FB_CYBLA + tristate "Cyberblade/i1 support" + depends on FB && PCI + select FB_CFB_IMAGEBLIT + select FB_SOFT_CURSOR + select VIDEO_SELECT + ---help--- + This driver is supposed to support the Trident Cyberblade/i1 + graphics core integrated in the VIA VT8601A North Bridge, + also known als VIA Apollo PLE133. + + Status: + - Developed, tested and working on EPIA 5000 and EPIA 800. + - Does work reliable on all systems with CRT/LCD connected to + normal VGA ports. + - Should work on systems that do use the internal LCD port, but + this is absolutely not tested. + + Character imageblit, copyarea and rectangle fill are hw accelerated, + ypan scrolling is used by default. + + Please do read . + + To compile this driver as a module, choose M here: the + module will be called cyblafb. + config FB_TRIDENT tristate "Trident support" depends on FB && PCI @@ -1193,8 +1219,12 @@ but also on some motherboards. For more information, read + Attention: Cyberblade/i1 support has been removed, choose the + cyblafb driver instead. + Say Y if you have such a graphics board. + To compile this driver as a module, choose M here: the module will be called tridentfb. @@ -1205,7 +1235,6 @@ This will compile the Trident frame buffer device with acceleration functions. - config FB_PM3 tristate "Permedia3 support" depends on FB && PCI && BROKEN diff -urN linux-2.6.13-rc4/drivers/video/Makefile linux-2.6.13-rc4-tfix/drivers/video/Makefile --- linux-2.6.13-rc4/drivers/video/Makefile 2005-07-29 10:01:01.000000000 +0200 +++ linux-2.6.13-rc4-tfix/drivers/video/Makefile 2005-07-29 10:25:58.000000000 +0200 @@ -50,7 +50,8 @@ obj-$(CONFIG_FB_IMSTT) += imsttfb.o obj-$(CONFIG_FB_S3TRIO) += S3triofb.o obj-$(CONFIG_FB_FM2) += fm2fb.o -obj-$(CONFIG_FB_TRIDENT) += tridentfb.o +obj-$(CONFIG_FB_CYBLA) += cyblafb.o +obj-$(CONFIG_FB_TRIDENT) += tridentfb.o obj-$(CONFIG_FB_STI) += stifb.o obj-$(CONFIG_FB_FFB) += ffb.o sbuslib.o obj-$(CONFIG_FB_CG6) += cg6.o sbuslib.o diff -urN linux-2.6.13-rc4/drivers/video/cyblafb.c linux-2.6.13-rc4-tfix/drivers/video/cyblafb.c --- linux-2.6.13-rc4/drivers/video/cyblafb.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.13-rc4-tfix/drivers/video/cyblafb.c 2005-07-31 09:43:42.000000000 +0200 @@ -0,0 +1,1438 @@ +/* + * Frame buffer driver for Trident Cyberblade/i1 graphics core + * + * Copyright 2005 Knut Petersen + * + * CREDITS: + * tridentfb.c by Jani Monoses + * see files above for further credits + * + * TODO: + * + */ + +#define CYBLAFB_DEBUG 0 + +#include +#include +#include +#include +#include +#include +#include +#include