[Xorg-driver-geode] looking at wide mode support for GeodeLX (continued)
bart at jukie.net
Fri Feb 8 09:05:22 PST 2008
So I returned to looking into the missing modes on the GeodeLX. This
work is funded by symbio-technologies.com -- thanks.
At this time I don't have a patch because my code is still a mess with
debug code, but it's eminent. The changes will be restricted to the
amd_lx_driver.c file in the -amd driver.
In order to get wide modes two things need to happen:
1) LXValidMode() currently calls vg_get_display_mode_index() to find a
mode that X wants validated a CimarronDisplayModes table kept in
src/cim/cim_modes.c. The problem here is that this table contains
nothing a wide LCD monitor would display natively.
I fixed this by cutting out the check; that is removed the call to
vg_get_display_mode_index() and just return MODE_OK if it's non-PANEL
output. I'll still call vg_get_display_mode_index(), but only report
if the check fails... and continue on.
I have no idea what implications using non-Cimarron modes has. I
don't even know what Cimarron modes are :) ... so I would like for
someone (Jordan, Martin-Eric) to comment before I make CRTs explode.
2) LXSetVideoMode() is called to switch to a new mode (either the
initial one, or later with xrandr or Ctrl-Alt-+/-).
If the mode is specified from xorg.conf we get a flag indicating
that this is a M_T_USERDEF mode and call lx_set_custom_mode() and
everything works fine (almost, see below).
If the mode is detected by X, then vg_set_display_mode() is called.
This code path checks for a valid mode in the CimarronDisplayModes
table and just fails.
It so happens that while vg_set_display_mode() returns an error, we
never checked for it. I have added this code:
rc = vg_set_display_mode( ... );
lx_set_custom_mode( ... );
// I plan to report if this call fails :)
and I can get X to display any mode upto 1600x1200. It even thinks
that it can do 1920x1200.
It's *almost* perfect...
The native mode on my new monitor is 1920x1200, which the DDC reports
and the LX happily provides. The screen is rendered, and at first I
thought it was working. However it seems that the display is actually
rendering at 1600x1200, while the buffer is 1920x1200.
If X was aware of this, it would pan when I moved the mouse to the edge,
but the cursor just goes off screen. Even xrandr reports that it's set
to 1920x1200, and doesn't even list 1600x1200 as an alternative (BTW, I
can have it display 1600x1200 if I set such a "Modes" line in xorg.conf).
I think it's the Geode that's doing this reduction. Thoughts?
More information about the xorg