|
From: Till A. <ti...@ad...> - 2001-11-17 11:37:09
|
Hello folks,
I've been trying to get the atyfb driver to work on my laptop which
sports a card that identifies itself as a ATI Mach64 : ATI|3D Rage LT
Pro AGP-133. I can select atyfb at boot time and pass it a resolution and
it boots up without complaint. The thing is, there isnt a single
resolution/depth combination that works as expected. Some
resolution/depth combinations produce only a flickering screen, some are
readable, but are missing about 1/3 of the right part of the screen,
some appear fine, but only cover an area in the upper left corner of the
screen and dont fill the screen.
Now this card supports something ATI calls ratiometric expansion, which
blows the screen up to the full size of the display. The laptop has a
key combination (Fn-F3) which toggles it. Booting the machine with
expansion off produces much better results than with it enabled,
although the screen does not get expanded (as is to be expected).
Hitting the above-mentioned key combination during operation causes a
hard lock of the machine.
If I'm reading the docs correctly, this feature is controllable via a
bunch of registers, that the atyfb does not apper to touch at all at the
moment. (Bear with me if I'm totally off here, I am no expert at any of
this by a long stretch). The mach64 driver included in the current
XFree86 on the other hand performs some initial setting up and later
disabling of this scaling feature, and the X driver performs beautifully
on this laptop.
So does the atyfb driver need to be extended to set the stretching
registers to a sane state to work properly with this card? If so, is
there someone on this list for whom this would be a three minute job and
who'd be willing to hack this in? I'm willing to help and test, but I'd
appreciate the guidance of someone with more experience in this.
I also noticed that the vertical yres is weird when using atyfb. I found
this around line 950 of atyfb_base.c which I dont understand and which I
think causes this:
if (var.yres == var.yres_virtual) {
32 vram = (fb->total_vram - (PAGE_SIZE << 2));
var.yres_virtual = ((vram * 8) / var.bits_per_pixel) / var.xres_virtual;
if (var.yres_virtual < var.yres)
var.yres_virtual = var.yres;
}
What is the reasoning behind this?
Cheers,
Till
--
mailto: ti...@ad...
http://www.adam-lilienthal.de/till
|