Age | Commit message (Collapse) | Author |
|
The code was inherited from first import of latest smi sources, but
the driver actually programs a mode, so there is no need to check if
there will be a table entry with register contents matching the requested
mode.
|
|
Restoring the registers "without need" caused some instability, with
random locks.
|
|
The code is under "<hash>ifdef USE_PANEL_CENTER", as it is buggy, and
regardless of value set to right and bottom, it will crop from 0 to
mode-width/mode-height, and then display a lot of screen artifacts, due
to improper programming. Either way, the CRT in clone mode will display
correctly.
|
|
|
|
This significantly simplify the function SMI_DisplayVideo0501_CSC(),
but the real cause of the problem that this patch corrects is that
whenever MMIO 0x1000fc bit 24 (Vertical Linear Filter Control) is
set, the last line of the rendered video will display only noisy,
regardless of video being rendered 1x1, or scaled up or down.
|
|
As described by siliconmotion, it does not work on the smi 502.
Does it work on older revisions? Keeping <hash>ifdef'ed out for now
as it hopefully will be corrected in a newer hardware revision.
|
|
The code is <hash>ifdef'ed out by <hash>if SMI_CURSOR_ALPHA_PLANE
because the smi 502 hardware is buggy, but it appears to have worked
for some older hardware revisions (by looking at code available at
ftp.siliconmotion.com.tw).
Keeping it at least for now, as it serves as a simple way to reproduce
the problems described in smi.h.
|
|
|
|
Hardware cursor is still disabled in dual head mode due to some problems,
usually when having both panel and crt mapped to the same address, what
appears to confuse the "modes" code.
|
|
|
|
ZoomOnLCD controlled if Ctrl/Alt/+ or Ctrl/Alt/- could be used to
reprogram the mode on the panel. The option was not used, and now, if
different resolutions could be used, it should be advertised by randr.
PCIBurst and PCIRetry options are now enabled by default.
The fifo_xxx options need a review, as they appear to be associated
with the older WaitQueue macro, that did ignore its argument. But these
options are not used, and may be removed or reimplemented at some time.
|
|
Reflect changes in the configuration options, additional supported
chipsets and RandR1.2 interface.
|
|
|
|
Probably I misunderstood the usage of this register, as it will always
show the same value, regardless of having a crt connected to the "vga"
port or not. Only difference is that while the detect bit is set,
the crt will be blank. This patch should be more of a placeholder for
a possible correction, but it should not cause any side effects, unless
the data field can be zero on a valid situation.
In my test computer, this field, in base 2 is always 1000000010000100,
what doesn't really look like data in rgb 8:8:8...
|
|
Sample usage on sm502:
$ DISPLAY=:0 xrandr --output VGA --newmode 1280x1024 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
$ DISPLAY=:0 xrandr --addmode VGA 1280x1024
$ DISPLAY=:0 xrandr --output VGA --mode 1280x1024 --pos 768x176
Last command assuming using XAA (with ``Virtual 2048 1024''), so that it
will have panel in top-left, and crt in bottom-right.
|
|
This code is an adaptation of SMI sample implementation.
CSCVideo is an alternate way to render video, that should reduce memory
bandwidth usage, and uses the color space conversion hardware to render
video directly to the framebuffer memory.
When using randr dual head mode, currently only XAA is supported. As it
has a fixed format framebuffer (when using the Virtual xorg.conf option).
This patch also ensures that pScrn->displayWidth, pScrn->virtualX and
pScrn->virtualY are only changed by the driver when using EXA.
|
|
|
|
Use "local memory" field of mmio 0x010 and not "system memory", as
it uses system memory values whenever there is a choice (just sets
bits to zero).
|
|
Other chipsets are doing the same. But this apparently is to circumvent
a problem in randr/cursor implementation, that appears to not work very
well with hardware that supports two hw cursors, but not argb cursors.
|
|
Use separate buffers for crt and panel hw cursors.
Describe, and workaround a problem with Dualhead and hw cursor enabled.
It still has the inconvenient of having a blinking X when exiting the server
or switching to a VT; maybe should also save the image currently configured
also (and restore on exit), or just disable hw cursor on dual head mode.
Also revert change to not initialize video on dualhead. Better to have
fully functional video only on panel, that can be resized, then non
resizable video..
|
|
pSmi->IsSecondary was not used, and there should not exist two
instances of the driver managing the same card.
Macro CHECK_SECONDARY() was dependant on a second instance of the driver
for the same card, and also removed.
Some rework should still be done in the cursor code, as it sometimes,
when displaying different data, will leave the hw cursor visible, while
using an argb cursor.
|
|
Also done some clean up, like removing unused/redundant members of the
screen private structure, and removing now unused configuration file
options.
|
|
|
|
Clip the video to the CRTC viewport by using
xf86_crtc_clip_video_helper, and allow XV in
dual head mode.
|
|
* Implementation of the PictOpSrc render operation with a
source coordinate transformation through 2D engine rotate-BITBLTs.
* Fix EXA Copy and Solid in 24 bpp packed color mode.
|
|
* Make screen resizing behave better with XAA.
* Move some local variable declarations to the top of
the function definition to conform ANSI C.
* Make the Lynx panel modesetting code to actually
program the panel sync pulse width in dualhead mode.
* Also, fix a crash when using libpciaccess
(the memory wasn't being unmapped).
|
|
Slightly change clock selection code to start using 501 compatible values,
before checking 502 values, if it is a 502.
DPMS for the VGA/second output was being set with bits inverted, that is
dpms-on was programmed as dpms-off and vice versa. This was one of the
reasons of dual head not working.
Corrected wrong vsync programming for the crt. Cut&paste/typo caused
programming vsync with hsync values, and thus, never getting the crt
to accept the mode being programmed.
If adding:
Option "Dualhead" "True"
to xorg.conf, now you should be able to do things like:
$ DISPLAY=:0.0 xrandr --output VGA --right-of LVDS
$ DISPLAY=:0.0 xrandr --output VGA --below LVDS
and so on.
*Iff* there is some way to not have any limitations for video playback,
this option should be made default or automatically configured.
|
|
It is mean't to be a fallback option, that as long as kernel boots
in framebuffer mode, the X Server should also work.
Correct incorrect value being checked when printing state of Dualhead
option.
The M value when programming PLL3 is actually an 8 bits integer,
so correct it and comments about it.
|
|
If Dualhead is set, it will attempt to use setups that allow different
outputs with different contents, instead of crt always cloning panel.
Still not fully functional.
|
|
Correct wrong clock calculation for the 501 clock setting, that is used
for pre 502 panel interface and crt.
Adds a few new programmable fields to MSOCRegRec:crt_display_ctl.
Call SMI501_CrtcAdjustFrame() after adjusting a mode, instead of
before changing registers.
|
|
Also add more complete description of programmable clocks.
|
|
Also print the value of sm502 registers (should be a noop on sm501).
Added the frequency field to the MSOCRegRec's misc_ctl, as it is
a read/write registers, and changing bit 24 may change the logic
of pll3 programming (needs clarification with SMI).
|
|
XAA was not initialized anymore in RandR patch, but it is still the
default accel method. Also reenable offscreen fb manager.
At least on the MSOC OEM sample (using X Server 1.4), needs some more
work as EXA is crashing in a call to exaPrepareAccess() when switching
to a terminal; this seems to be related to disabling exa offscreen
pixmaps on the smi501.
|
|
Double value must be truncated when calculating the difference from the
possible clock and requested clock.
|
|
The "prototype" computer no longer locks, and only "missing feature"
from before the patch is that video and Xaa don't work (only with Exa).
For the moment, just force crt as not connected, and set the proper
registers to make the secondary output clone the panel.
|
|
It actually was not added in a previous commit (due to using git reset
to remake a commit, and not readding it), but now, changed only call
xf86CVTMode if it is available in the X Server, otherwise, for older
X Servers, a modeline should be specified in xorg.conf.
|
|
Also correct printing information about MCLK in the smi501/502, it
should print M2CLK (aka M1CLK o the 502) as it is the clock that
controls video engine/memory.
|
|
Moved most of the Lynx-specific code out of the main
functions at smi_driver.c to some new files: smilynx_hw.c
(With CRTC-independent code like global hardware initialization and
mode saving/restoring), smilynx_crtc.c (With the CRTC-local
procedures) and smilynx_output.c (Output power management, DDC and
monitor detection, currently).
Done something similar with the SMI501 code: split
SMI501_ModeInit in three separate functions: SMI501_HWInit that does
the global initialization, and the CRTC mode_set callbacks
SMI501_ModeSet_crt and SMI501_ModeSet_lcd at smi501_crtc.c.
The SMI501_ModeSet code is divided into SMI501_WriteMode_common,
SMI501_WriteMode_lcd and SMI501_WriteMode_crt, each one updates a
different register set in the hardware.
Inside smi_crtc.c, there is mainly hardware independent
code... Initial CRT controller allocation, shadows, rotation and
framebuffer resizing code.
The shadow code currently relies on EXA... I'm not sure what are the
problems of the EXA implementation in MSOC. Does it work?
I think it would be a good thing to get rid of XAA soon: The next
thing I'll be working on will be EXA Composite... I hope it's possible
to get EXA acceleration working at least as fast as the current
XAA. (Although Teddy Wang confirmed me that the SMI720 DMA engine is
broken...)
So, the patch adds some features like new Lynx dualhead modesetting
code, but it probably breaks some other things:
* Video Overlay: I suppose it does work with EXA activated. It seems
it is also possible to have simultaneous overlays in both CRTCs with the
Lynx hardware (I have some code for this, but still work in progress).
* Hardware Cursor (It needs more integration in the CRTC interfaces).
* The old Shadow FB / rotation code, which we should probably drop.
These are in my TODO list... Along with some more cleaning and other
minor issues in the modesetting code.
About the SMI501 RandR1.2 implementation... I suppose it's specially
lacking per-output DPMS (The DPMS field in the System Control register
only affects the CRT, doesn't it?).
|
|
This driver is expected to be used with XServer 1.4 or newer, but a
(probably temporary) copy of xf86cvt.c was also added to the build.
This modeline automatically added implies it would not be required
to specify one in xorg.conf, as it should not be uncommon "non standard"
modes, like 800x480 or 1024x600.
|
|
Instead of using a fixed 24Mhz input frequency, as "unofficially"
specified by SMI, a guess of using a 12 multiplier was used, and it
corrects the screen flicker problem as well as make a secondary output
work again.
|
|
WaitQueue() did receive an unused parameter, that was removed. The
parameter was unused since version 1.0 in XFree86 CVS, so probably
nobody knows for what it was used.
WaitIdle() now also replaces WaitIdleEmpty(), as an idle engine
should also have an empty fifo.
SMI_SubsequentScreenToScreenCopy() was changed to use WaitIdle()
instead of WaitQueue() before submitting the commands to the engine.
This fixes a nasty lockup when using XaaOffscreenPixmaps (what is
desired/wanted to help improve performance), and the lockup in the
MSOC was clearly due to an engine overrun, when sending commands
faster then the engine could process.
|
|
It is not in the specs, so don't use it on chipsets older then the 502.
Some review should be done in SMI501_FindPLLClock() as when hardcoding it
to use the clock selection code for older chips, it appears to choose a
better refresh rate (no flicking at 1024x600).
|
|
The values that should be used, should also have a more meaningful name,
as something like:
doesn't help much, and the fact that these "ports" can be accessed from
several "bases" may be confusing also, as there is SCRBase, DCRBase,
FPRBase, DPRBase, CPRBase (and IOBase). The 501 code should probably be
changed to just use IOBase, as currently it uses SCRBase, that happens
to be at pSmi->MapBase + 0x0000.
This patch also completely transforms the WaitQueue macro in a noop
for the MSOC. In SMI sample code it is almost the current code, just
that the macro body is commented out. Hopefully this will be addressed
soon.
|
|
|
|
These macros access vga registers, but don't make it clear in their name.
|
|
|
|
Also remove extra includes that were not used.
|
|
The new code is based on the file SM502Clock.pdf provide by SMI engineers
(many thanks). And now it is expected to work correctly. The few remaining
details that are unclear (for the extended 502 modesetting mode) should be
resolved soon, and those are:
* MMIO:0x74:bit15 (PLL Output Divided by 2)
0: Disable.
1: Enable.
(does this mean it can use a 12MHz clock instead of 24? or anything else?)
* Should bit 31 of "current clock" always be set when using the alternate
mode setting for the 502? The alternate modesetting allows a very closer
pixel clock programming option, usually with 0 difference from the
xf86 mode.
I will ask SMI to make SM502Clock.pdf also available in the ftp site, it
is just 3 pages, or possibly even better, an update for the existing
documentation.
|
|
Now access to bitfields looks like:
record->register.f.field
instead of:
field(record->register, field)
what should be easier to read and understand.
|
|
The 502 is a superset of the 501, also recognized as PCI_CHIP_SMI501.
The driver is only known to work with smi_501 chipset
"SM501 VoyagerGX Rev. AA (rev c0)".
|